summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/drivers/obio.h
blob: 49c3040c4712f671f69009362373994ec1d50195 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/* Addresses, interrupt numbers, register sizes */

#define SLAVIO_ZS        0x00000000ULL
#define SLAVIO_ZS1       0x00100000ULL
#define ZS_INTR          0x2c

#define SLAVIO_NVRAM     0x00200000ULL
#define NVRAM_SIZE       0x2000
#define NVRAM_IDPROM     0x1fd8

#define SLAVIO_FD        0x00400000ULL
#define FD_REGS          15
#define FD_INTR          0x2b

#define SLAVIO_SCONFIG   0x00800000ULL
#define SCONFIG_REGS     1

#define AUXIO_REGS       1

#define AUXIO2_REGS      1
#define AUXIO2_INTR      0x22

#define SLAVIO_COUNTER   0x00d00000ULL
#define COUNTER_REGS     0x10

#define SLAVIO_INTERRUPT 0x00e00000ULL
#define INTERRUPT_REGS   0x10

#define SLAVIO_RESET     0x00f00000ULL
#define RESET_REGS       1

#define ECC_BASE         0xf00000000ULL
#define ECC_SIZE         0x20

#define SLAVIO_SIZE      0x01000000

#define SUN4M_NCPUS      16

#define CFG_ADDR         0xd00000510ULL
#define CFG_SIZE         3

/* linux/include/asm-sparc/timer.h */

/* A sun4m has two blocks of registers which are probably of the same
 * structure. LSI Logic's L64851 is told to _decrement_ from the limit
 * value. Aurora behaves similarly but its limit value is compacted in
 * other fashion (it's wider). Documented fields are defined here.
 */

/* As with the interrupt register, we have two classes of timer registers
 * which are per-cpu and master.  Per-cpu timers only hit that cpu and are
 * only level 14 ticks, master timer hits all cpus and is level 10.
 */

#define SUN4M_PRM_CNT_L       0x80000000
#define SUN4M_PRM_CNT_LVALUE  0x7FFFFC00

struct sun4m_timer_percpu_info {
  __volatile__ unsigned int l14_timer_limit;    /* Initial value is 0x009c4000 */
  __volatile__ unsigned int l14_cur_count;

  /* This register appears to be write only and/or inaccessible
   * on Uni-Processor sun4m machines.
   */
  __volatile__ unsigned int l14_limit_noclear;  /* Data access error is here */

  __volatile__ unsigned int cntrl;            /* =1 after POST on Aurora */
  __volatile__ unsigned char space[PAGE_SIZE - 16];
};

struct sun4m_timer_regs {
	struct sun4m_timer_percpu_info cpu_timers[SUN4M_NCPUS];
	volatile unsigned int l10_timer_limit;
	volatile unsigned int l10_cur_count;

	/* Again, this appears to be write only and/or inaccessible
	 * on uni-processor sun4m machines.
	 */
	volatile unsigned int l10_limit_noclear;

	/* This register too, it must be magic. */
	volatile unsigned int foobar;

	volatile unsigned int cfg;     /* equals zero at boot time... */
};

/*
 * Registers of hardware timer in sun4m.
 */
struct sun4m_timer_percpu {
    volatile unsigned int l14_timer_limit; /* Initial value is 0x009c4000 = 10ms period*/
    volatile unsigned int l14_cur_count;
};

struct sun4m_timer_global {
    volatile unsigned int l10_timer_limit;
    volatile unsigned int l10_cur_count;
};

/* linux/include/asm-sparc/irq.h */

/* These registers are used for sending/receiving irqs from/to
 * different cpu's.
 */
struct sun4m_intreg_percpu {
    unsigned int tbt;        /* Interrupts still pending for this cpu. */

    /* These next two registers are WRITE-ONLY and are only
     * "on bit" sensitive, "off bits" written have NO affect.
     */
    unsigned int clear;  /* Clear this cpus irqs here. */
    unsigned int set;    /* Set this cpus irqs here. */
    unsigned char space[PAGE_SIZE - 12];
};

/*
 * djhr
 * Actually the clear and set fields in this struct are misleading..
 * according to the SLAVIO manual (and the same applies for the SEC)
 * the clear field clears bits in the mask which will ENABLE that IRQ
 * the set field sets bits in the mask to DISABLE the IRQ.
 *
 * Also the undirected_xx address in the SLAVIO is defined as
 * RESERVED and write only..
 *
 * DAVEM_NOTE: The SLAVIO only specifies behavior on uniprocessor
 *             sun4m machines, for MP the layout makes more sense.
 */
struct sun4m_intregs {
    struct sun4m_intreg_percpu cpu_intregs[SUN4M_NCPUS];
    unsigned int tbt;                /* IRQ's that are still pending. */
    unsigned int irqs;               /* Master IRQ bits. */

    /* Again, like the above, two these registers are WRITE-ONLY. */
    unsigned int clear;              /* Clear master IRQ's by setting bits here. */
    unsigned int set;                /* Set master IRQ's by setting bits here. */

    /* This register is both READ and WRITE. */
    unsigned int undirected_target;  /* Which cpu gets undirected irqs. */
};

/* Dave Redman (djhr@tadpole.co.uk)
 * The sun4m interrupt registers.
 */
#define SUN4M_INT_ENABLE  	0x80000000
#define SUN4M_INT_E14     	0x00000080
#define SUN4M_INT_E10     	0x00080000

#define SUN4M_HARD_INT(x)	(0x000000001 << (x))
#define SUN4M_SOFT_INT(x)	(0x000010000 << (x))

#define	SUN4M_INT_MASKALL	0x80000000	  /* mask all interrupts */
#define	SUN4M_INT_MODULE_ERR	0x40000000	  /* module error */
#define	SUN4M_INT_M2S_WRITE	0x20000000	  /* write buffer error */
#define	SUN4M_INT_ECC		0x10000000	  /* ecc memory error */
#define	SUN4M_INT_FLOPPY	0x00400000	  /* floppy disk */
#define	SUN4M_INT_MODULE	0x00200000	  /* module interrupt */
#define	SUN4M_INT_VIDEO		0x00100000	  /* onboard video */
#define	SUN4M_INT_REALTIME	0x00080000	  /* system timer */
#define	SUN4M_INT_SCSI		0x00040000	  /* onboard scsi */
#define	SUN4M_INT_AUDIO		0x00020000	  /* audio/isdn */
#define	SUN4M_INT_ETHERNET	0x00010000	  /* onboard ethernet */
#define	SUN4M_INT_SERIAL	0x00008000	  /* serial ports */
#define	SUN4M_INT_KBDMS		0x00004000	  /* keyboard/mouse */
#define	SUN4M_INT_SBUSBITS	0x00003F80	  /* sbus int bits */