cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

time.c (2075B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *  linux/arch/m68k/sun3x/time.c
      4 *
      5 *  Sun3x-specific time handling
      6 */
      7
      8#include <linux/types.h>
      9#include <linux/kd.h>
     10#include <linux/init.h>
     11#include <linux/sched.h>
     12#include <linux/kernel_stat.h>
     13#include <linux/interrupt.h>
     14#include <linux/rtc.h>
     15#include <linux/bcd.h>
     16
     17#include <asm/irq.h>
     18#include <asm/io.h>
     19#include <asm/machdep.h>
     20#include <asm/traps.h>
     21#include <asm/sun3x.h>
     22#include <asm/sun3ints.h>
     23
     24#include "time.h"
     25
     26#define M_CONTROL 0xf8
     27#define M_SEC     0xf9
     28#define M_MIN     0xfa
     29#define M_HOUR    0xfb
     30#define M_DAY     0xfc
     31#define M_DATE    0xfd
     32#define M_MONTH   0xfe
     33#define M_YEAR    0xff
     34
     35#define C_WRITE   0x80
     36#define C_READ    0x40
     37#define C_SIGN    0x20
     38#define C_CALIB   0x1f
     39
     40int sun3x_hwclk(int set, struct rtc_time *t)
     41{
     42	volatile struct mostek_dt *h =
     43		(struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL);
     44	unsigned long flags;
     45
     46	local_irq_save(flags);
     47
     48	if(set) {
     49		h->csr |= C_WRITE;
     50		h->sec = bin2bcd(t->tm_sec);
     51		h->min = bin2bcd(t->tm_min);
     52		h->hour = bin2bcd(t->tm_hour);
     53		h->wday = bin2bcd(t->tm_wday);
     54		h->mday = bin2bcd(t->tm_mday);
     55		h->month = bin2bcd(t->tm_mon + 1);
     56		h->year = bin2bcd(t->tm_year % 100);
     57		h->csr &= ~C_WRITE;
     58	} else {
     59		h->csr |= C_READ;
     60		t->tm_sec = bcd2bin(h->sec);
     61		t->tm_min = bcd2bin(h->min);
     62		t->tm_hour = bcd2bin(h->hour);
     63		t->tm_wday = bcd2bin(h->wday);
     64		t->tm_mday = bcd2bin(h->mday);
     65		t->tm_mon = bcd2bin(h->month) - 1;
     66		t->tm_year = bcd2bin(h->year);
     67		h->csr &= ~C_READ;
     68		if (t->tm_year < 70)
     69			t->tm_year += 100;
     70	}
     71
     72	local_irq_restore(flags);
     73
     74	return 0;
     75}
     76
     77#if 0
     78static irqreturn_t sun3x_timer_tick(int irq, void *dev_id)
     79{
     80	unsigned long flags;
     81
     82	local_irq_save(flags);
     83	/* Clear the pending interrupt - pulse the enable line low */
     84	disable_irq(5);
     85	enable_irq(5);
     86	legacy_timer_tick(1);
     87	local_irq_restore(flags);
     88
     89	return IRQ_HANDLED;
     90}
     91#endif
     92
     93void __init sun3x_sched_init(void)
     94{
     95
     96	sun3_disable_interrupts();
     97
     98
     99    /* Pulse enable low to get the clock started */
    100	sun3_disable_irq(5);
    101	sun3_enable_irq(5);
    102	sun3_enable_interrupts();
    103}