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
193
194
|
/* Memory layout and register descriptions for the TSUNAMI/TYPHOON chipset.
Copyright (C) 2011 Richard Henderson
This file is part of QEMU PALcode.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the text
of the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not see
<http://www.gnu.org/licenses/>. */
#ifndef TYPHOON_H
#define TYPHOON_H 1
/* Assume a 43-bit KSEG for now. */
#define PIO_PHYS_ADDR 0x80000000000
#define PIO_KSEG_ADDR (0xfffffc0000000000 + 0x10000000000)
/* CCHIP REGISTERS */
#define TYPHOON_CCHIP 0x1a0000000
#define TYPHOON_CCHIP_CSC 0x0000
#define TYPHOON_CCHIP_MTR 0x0040
#define TYPHOON_CCHIP_MISC 0x0080
#define TYPHOON_CCHIP_MPD 0x00c0
#define TYPHOON_CCHIP_AAR0 0x0100
#define TYPHOON_CCHIP_AAR1 0x0140
#define TYPHOON_CCHIP_AAR2 0x0180
#define TYPHOON_CCHIP_AAR3 0x01c0
#define TYPHOON_CCHIP_DIM0 0x0200
#define TYPHOON_CCHIP_DIM1 0x0240
#define TYPHOON_CCHIP_DIR0 0x0280
#define TYPHOON_CCHIP_DIR1 0x02c0
#define TYPHOON_CCHIP_DRIR 0x0300
#define TYPHOON_CCHIP_PRBEN 0x0340
#define TYPHOON_CCHIP_IIC0 0x0380
#define TYPHOON_CCHIP_IIC1 0x03c0
#define TYPHOON_CCHIP_MPR0 0x0400
#define TYPHOON_CCHIP_MPR1 0x0440
#define TYPHOON_CCHIP_MPR2 0x0480
#define TYPHOON_CCHIP_MPR3 0x04c0
#define TYPHOON_CCHIP_TTR 0x0580
#define TYPHOON_CCHIP_TDR 0x05c0
#define TYPHOON_CCHIP_DIM2 0x0600
#define TYPHOON_CCHIP_DIM3 0x0640
#define TYPHOON_CCHIP_DIR2 0x0680
#define TYPHOON_CCHIP_DIR3 0x06c0
#define TYPHOON_CCHIP_IIC2 0x0700
#define TYPHOON_CCHIP_IIC3 0x0740
#define TYPHOON_CCHIP_PWR 0x0780
#define TYPHOON_CCHIP_CMONCTLA 0x0c00
#define TYPHOON_CCHIP_CMONCTLB 0x0c40
#define TYPHOON_CCHIP_CMONCNT01 0x0c80
#define TYPHOON_CCHIP_CMONCNT23 0x0cc0
/* DCHIP REGISTERS */
#define TYPHOON_DCHIP 0x1b0000000
#define TYPHOON_DCHIP_DSC 0x0800
#define TYPHOON_DCHIP_STR 0x0840
#define TYPHOON_DCHIP_DREV 0x0880
#define TYPHOON_DCHIP_DSC2 0x08c0
/* PCHIP REGISTERS */
#define TYPHOON_PCHIP0 0x180000000
#define TYPHOON_PCHIP1 0x380000000
#define TYPHOON_PCHIP_WSBA0 0x0000
#define TYPHOON_PCHIP_WSBA1 0x0040
#define TYPHOON_PCHIP_WSBA2 0x0080
#define TYPHOON_PCHIP_WSBA3 0x00c0
#define TYPHOON_PCHIP_WSM0 0x0100
#define TYPHOON_PCHIP_WSM1 0x0140
#define TYPHOON_PCHIP_WSM2 0x0180
#define TYPHOON_PCHIP_WSM3 0x01c0
#define TYPHOON_PCHIP_TBA0 0x0200
#define TYPHOON_PCHIP_TBA1 0x0240
#define TYPHOON_PCHIP_TBA2 0x0280
#define TYPHOON_PCHIP_TBA3 0x02c0
#define TYPHOON_PCHIP_PCTL 0x0300
#define TYPHOON_PCHIP_PLAT 0x0340
#define TYPHOON_PCHIP_PERROR 0x03c0
#define TYPHOON_PCHIP_PERRMASK 0x0400
#define TYPHOON_PCHIP_PERRSET 0x0440
#define TYPHOON_PCHIP_TLBIV 0x0480
#define TYPHOON_PCHIP_TLBIA 0x04c0
#define TYPHOON_PCHIP_PMONCTL 0x0500
#define TYPHOON_PCHIP_PMONCNT 0x0540
#define TYPHOON_PCHIP_SPRST 0x0800
/* PCI ADDRESSES */
#define TYPHOON_PCHIP0_PCI_MEM 0
#define TYPHOON_PCHIP0_PCI_IO 0x1fc000000
#define TYPHOON_PCHIP0_PCI_CONF 0x1fe000000
#define TYPHOON_PCHIP0_PCI_IACK 0x1f8000000
#ifdef __ASSEMBLER__
#include "pal.h"
#define ptCpuDIR ptSys0
#define ptCpuIIC ptSys1
/* Unfortunately, GAS doesn't attempt any interesting constructions of
64-bit constants, dropping them all into the .lit8 section. It is
better for us to build these by hand. */
.macro LOAD_PHYS_CCHIP ret
lda \ret, (PIO_PHYS_ADDR + TYPHOON_CCHIP) >> 29
sll \ret, 29, \ret
.endm
.macro LOAD_PHYS_PCHIP0 ret
lda \ret, (PIO_PHYS_ADDR + TYPHOON_PCHIP0) >> 29
sll \ret, 29, \ret
.endm
.macro LOAD_PHYS_PCHIP0_IACK ret
.set macro
lda \ret, (PIO_PHYS_ADDR + TYPHOON_PCHIP0_PCI_IACK) >> 24
.set nomacro
sll \ret, 24, \ret
.endm
.macro LOAD_KSEG_PCI_IO ret
.set macro
// Note that GAS shifts are logical. Force arithmetic shift style
// results by negating before and after the shift.
lda \ret, -(-(PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_IO) >> 20)
.set nomacro
sll \ret, 20, \ret
.endm
.macro LOAD_KSEG_PCI_CONF ret
.set macro
// Note that GAS shifts are logical. Force arithmetic shift style
// results by negating before and after the shift.
lda \ret, -(-(PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_CONF) >> 20)
.set nomacro
sll \ret, 20, \ret
.endm
.macro SYS_WHAMI ret
LOAD_PHYS_CCHIP \ret
ldq_p \ret, TYPHOON_CCHIP_MISC(\ret)
and \ret, 3, \ret
.endm
/* ACK the Interprocessor Interrupt. */
.macro SYS_ACK_SMP t0, t1, t2
LOAD_PHYS_CCHIP \t0
ldq_p \t1, TYPHOON_CCHIP_MISC(\t0)
and \t1, 3, \t1
addq \t1, 8, \t1
lda \t2, 1
sll \t2, \t1, \t2
stq_p \t2, TYPHOON_CCHIP_MISC(\t0)
.endm
/* ACK the Clock Interrupt. */
.macro SYS_ACK_CLK t0, t1, t2
LOAD_PHYS_CCHIP \t0
ldq_p \t1, TYPHOON_CCHIP_MISC(\t0)
and \t1, 3, \t1
addq \t1, 4, \t1
lda \t2, 1
sll \t2, \t1, \t2
stq_p \t2, TYPHOON_CCHIP_MISC(\t0)
.endm
/* Interrupt another CPU. */
.macro SYS_WRIPIR target, t0, t1, t2
LOAD_PHYS_CCHIP \t0
mov 1, \t1
and \target, 3, \t2
addq \t2, 12, \t2
sll \t1, \t2, \t1
stq_p \t1, TYPHOON_CCHIP_MISC(\t0)
.endm
#endif /* ASSEMBLER */
#endif /* TYPHOON_H */
|