summaryrefslogtreecommitdiff
path: root/sys/arch/sparc64/dev/sbusreg.h
blob: 807a023a44178438f1afc498f70bb2578a37afee (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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*	$NetBSD: sbusreg.h,v 1.10 2011/03/16 05:49:43 mrg Exp $ */

/*
 * Copyright (c) 1996-1999 Eduardo Horvath
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */


/*
 * Sbus device addresses are obtained from the FORTH PROMs.  They come
 * in `absolute' and `relative' address flavors, so we have to handle both.
 * Relative addresses do *not* include the slot number.
 */
#define	SBUS_BASE		0xf8000000
#define	SBUS_ADDR(slot, off)	(SBUS_BASE + ((slot) << 25) + (off))
#define	SBUS_ABS(a)		((unsigned)(a) >= SBUS_BASE)
#define	SBUS_ABS_TO_SLOT(a)	(((a) - SBUS_BASE) >> 25)
#define	SBUS_ABS_TO_OFFSET(a)	(((a) - SBUS_BASE) & 0x1ffffff)

/*
 * Sun4u S-bus definitions.  Here's where we deal w/the machine
 * dependencies of sysio.
 *
 * SYSIO implements or is the interface to several things:  
 *
 * o The SBUS interface itself
 * o The IOMMU
 * o The DVMA units
 * o The interrupt controller
 * o The counter/timers
 *
 * Since it has registers to control lots of different things
 * as well as several on-board SBUS devices and external SBUS
 * slots scattered throughout its address space, it's a pain.
 *
 * One good point, however, is that all registers are 64-bit.
 */

struct sysioreg {
	struct upareg {
		uint64_t	upa_portid;		/* UPA port ID register */		/* 1fe.0000.0000 */
		uint64_t	upa_config;		/* UPA config register */		/* 1fe.0000.0008 */
	} sys_upa;

	uint64_t	sys_csr;		/* SYSIO control/status register */	/* 1fe.0000.0010 */
	uint64_t	pad0;
	uint64_t	sys_ecccr;		/* ECC control register */		/* 1fe.0000.0020 */
	uint64_t	reserved;							/* 1fe.0000.0028 */
	uint64_t	sys_ue_afsr;		/* Uncorrectable Error AFSR */		/* 1fe.0000.0030 */
	uint64_t	sys_ue_afar;		/* Uncorrectable Error AFAR */		/* 1fe.0000.0038 */
	uint64_t	sys_ce_afsr;		/* Correctable Error AFSR */		/* 1fe.0000.0040 */
	uint64_t	sys_ce_afar;		/* Correctable Error AFAR */		/* 1fe.0000.0048 */

	uint64_t	pad1[22];

	struct perfmon {
		uint64_t	pm_cr;			/* Performance monitor control reg */	/* 1fe.0000.0100 */
		uint64_t	pm_count;		/* Performance monitor counter reg */	/* 1fe.0000.0108 */
	} sys_pm;

	uint64_t	pad2[990];

	struct sbusreg {
		uint64_t	sbus_cr;		/* SBUS Control Register */		/* 1fe.0000.2000 */
		uint64_t	reserved;							/* 1fe.0000.2008 */
		uint64_t	sbus_afsr;		/* SBUS AFSR */				/* 1fe.0000.2010 */
		uint64_t	sbus_afar;		/* SBUS AFAR */				/* 1fe.0000.2018 */
		uint64_t	sbus_config0;	/* SBUS Slot 0 config register */	/* 1fe.0000.2020 */
		uint64_t	sbus_config1;	/* SBUS Slot 1 config register */	/* 1fe.0000.2028 */
		uint64_t	sbus_config2;	/* SBUS Slot 2 config register */	/* 1fe.0000.2030 */
		uint64_t	sbus_config3;	/* SBUS Slot 3 config register */	/* 1fe.0000.2038 */
		uint64_t	sbus_config13;	/* Slot 13 config register <audio> */	/* 1fe.0000.2040 */
		uint64_t	sbus_config14;	/* Slot 14 config register <macio> */	/* 1fe.0000.2048 */
		uint64_t	sbus_config15;	/* Slot 15 config register <slavio> */	/* 1fe.0000.2050 */
	} sys_sbus;

	uint64_t	pad3[117];

	struct iommureg sys_iommu;							/* 1fe.0000.2400,2410 */

	uint64_t	pad4[125];

	struct iommu_strbuf	sys_strbuf;						/* 1fe.0000.2800-2810 */

	uint64_t	pad5[125];

	uint64_t	sbus_slot0_int;		/* SBUS slot 0 interrupt map reg */	/* 1fe.0000.2c00 */
	uint64_t	sbus_slot1_int;		/* SBUS slot 1 interrupt map reg */	/* 1fe.0000.2c08 */
	uint64_t	sbus_slot2_int;		/* SBUS slot 2 interrupt map reg */	/* 1fe.0000.2c10 */
	uint64_t	sbus_slot3_int;		/* SBUS slot 3 interrupt map reg */	/* 1fe.0000.2c18 */
	uint64_t	intr_retry;		/* interrupt retry timer reg */		/* 1fe.0000.2c20 */

	uint64_t	pad6[123];

	uint64_t	scsi_int_map;		/* SCSI interrupt map reg */		/* 1fe.0000.3000 */
	uint64_t	ether_int_map;		/* ethernet interrupt map reg */	/* 1fe.0000.3008 */
	uint64_t	bpp_int_map;		/* parallel interrupt map reg */	/* 1fe.0000.3010 */
	uint64_t	audio_int_map;		/* audio interrupt map reg */		/* 1fe.0000.3018 */
	uint64_t	power_int_map;		/* power fail interrupt map reg */	/* 1fe.0000.3020 */
	uint64_t	ser_kbd_ms_int_map;	/* serial/kbd/mouse interrupt map reg *//* 1fe.0000.3028 */
	uint64_t	fd_int_map;		/* floppy interrupt map reg */		/* 1fe.0000.3030 */
	uint64_t	therm_int_map;		/* thermal warn interrupt map reg */	/* 1fe.0000.3038 */
	uint64_t	kbd_int_map;		/* kbd [unused] interrupt map reg */	/* 1fe.0000.3040 */
	uint64_t	mouse_int_map;		/* mouse [unused] interrupt map reg */	/* 1fe.0000.3048 */
	uint64_t	serial_int_map;		/* second serial interrupt map reg */	/* 1fe.0000.3050 */
	uint64_t	pad7;
	uint64_t	timer0_int_map;		/* timer 0 interrupt map reg */		/* 1fe.0000.3060 */
	uint64_t	timer1_int_map;		/* timer 1 interrupt map reg */		/* 1fe.0000.3068 */
	uint64_t	ue_int_map;		/* UE interrupt map reg */		/* 1fe.0000.3070 */
	uint64_t	ce_int_map;		/* CE interrupt map reg */		/* 1fe.0000.3078 */
	uint64_t	sbus_async_int_map;	/* SBUS error interrupt map reg */	/* 1fe.0000.3080 */
	uint64_t	pwrmgt_int_map;		/* power mgmt wake interrupt map reg */	/* 1fe.0000.3088 */
	uint64_t	upagr_int_map;		/* UPA graphics interrupt map reg */	/* 1fe.0000.3090 */
	uint64_t	reserved_int_map;	/* reserved interrupt map reg */	/* 1fe.0000.3098 */

	uint64_t	pad8[108];

	/* Note: clear interrupt 0 registers are not really used */
	uint64_t	sbus0_clr_int[8];	/* SBUS slot 0 clear int regs 0..7 */	/* 1fe.0000.3400-3438 */
	uint64_t	sbus1_clr_int[8];	/* SBUS slot 1 clear int regs 0..7 */	/* 1fe.0000.3440-3478 */
	uint64_t	sbus2_clr_int[8];	/* SBUS slot 2 clear int regs 0..7 */	/* 1fe.0000.3480-34b8 */
	uint64_t	sbus3_clr_int[8];	/* SBUS slot 3 clear int regs 0..7 */	/* 1fe.0000.34c0-34f8 */

	uint64_t	pad9[96];

	uint64_t	scsi_clr_int;		/* SCSI clear int reg */		/* 1fe.0000.3800 */
	uint64_t	ether_clr_int;		/* ethernet clear int reg */		/* 1fe.0000.3808 */
	uint64_t	bpp_clr_int;		/* parallel clear int reg */		/* 1fe.0000.3810 */
	uint64_t	audio_clr_int;		/* audio clear int reg */		/* 1fe.0000.3818 */
	uint64_t	power_clr_int;		/* power fail clear int reg */		/* 1fe.0000.3820 */
	uint64_t	ser_kb_ms_clr_int;	/* serial/kbd/mouse clear int reg */	/* 1fe.0000.3828 */
	uint64_t	fd_clr_int;		/* floppy clear int reg */		/* 1fe.0000.3830 */
	uint64_t	therm_clr_int;		/* thermal warn clear int reg */	/* 1fe.0000.3838 */
	uint64_t	kbd_clr_int;		/* kbd [unused] clear int reg */	/* 1fe.0000.3840 */
	uint64_t	mouse_clr_int;		/* mouse [unused] clear int reg */	/* 1fe.0000.3848 */
	uint64_t	serial_clr_int;		/* second serial clear int reg */	/* 1fe.0000.3850 */
	uint64_t	pad10;
	uint64_t	timer0_clr_int;		/* timer 0 clear int reg */		/* 1fe.0000.3860 */
	uint64_t	timer1_clr_int;		/* timer 1 clear int reg */		/* 1fe.0000.3868 */
	uint64_t	ue_clr_int;		/* UE clear int reg */			/* 1fe.0000.3870 */
	uint64_t	ce_clr_int;		/* CE clear int reg */			/* 1fe.0000.3878 */
	uint64_t	sbus_clr_async_int;	/* SBUS error clr interrupt reg */	/* 1fe.0000.3880 */
	uint64_t	pwrmgt_clr_int;		/* power mgmt wake clr interrupt reg */	/* 1fe.0000.3888 */

	uint64_t	pad11[110];

	struct timer_counter {
		uint64_t	tc_count;	/* timer/counter 0/1 count register */	/* ife.0000.3c00,3c10 */
		uint64_t	tc_limit;	/* timer/counter 0/1 limit register */	/* ife.0000.3c08,3c18 */
	} tc[2];

	uint64_t	pad12[252];

	uint64_t	sys_svadiag;		/* SBUS virtual addr diag reg */	/* 1fe.0000.4400 */
	
	uint64_t	pad13[31];

	uint64_t	iommu_queue_diag[16];	/* IOMMU LRU queue diag */		/* 1fe.0000.4500-457f */
	uint64_t	tlb_tag_diag[16];	/* TLB tag diag */			/* 1fe.0000.4580-45ff */
	uint64_t	tlb_data_diag[32];	/* TLB data RAM diag */			/* 1fe.0000.4600-46ff */

	uint64_t	pad14[32];

	uint64_t	sbus_int_diag;		/* SBUS int state diag reg */		/* 1fe.0000.4800 */
	uint64_t	obio_int_diag;		/* OBIO and misc int state diag reg */	/* 1fe.0000.4808 */

	uint64_t	pad15[254];

	uint64_t	strbuf_data_diag[128];	/* streaming buffer data RAM diag */	/* 1fe.0000.5000-53f8 */
	uint64_t	strbuf_error_diag[128];	/* streaming buffer error status diag *//* 1fe.0000.5400-57f8 */
	uint64_t	strbuf_pg_tag_diag[16];	/* streaming buffer page tag diag */	/* 1fe.0000.5800-5878 */
	uint64_t	pad16[16];
	uint64_t	strbuf_ln_tag_diag[16];	/* streaming buffer line tag diag */	/* 1fe.0000.5900-5978 */
};