Statistics
| Branch: | Revision:

root / hw / gt64xxx.c @ 2850ca9e

History | View | Annotate | Download (33.9 kB)

1 fde7d5bd ths
/*
2 fde7d5bd ths
 * QEMU GT64120 PCI host
3 fde7d5bd ths
 *
4 4de9b249 ths
 * Copyright (c) 2006,2007 Aurelien Jarno
5 5fafdf24 ths
 *
6 fde7d5bd ths
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 fde7d5bd ths
 * of this software and associated documentation files (the "Software"), to deal
8 fde7d5bd ths
 * in the Software without restriction, including without limitation the rights
9 fde7d5bd ths
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 fde7d5bd ths
 * copies of the Software, and to permit persons to whom the Software is
11 fde7d5bd ths
 * furnished to do so, subject to the following conditions:
12 fde7d5bd ths
 *
13 fde7d5bd ths
 * The above copyright notice and this permission notice shall be included in
14 fde7d5bd ths
 * all copies or substantial portions of the Software.
15 fde7d5bd ths
 *
16 fde7d5bd ths
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 fde7d5bd ths
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 fde7d5bd ths
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 fde7d5bd ths
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 fde7d5bd ths
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 fde7d5bd ths
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 fde7d5bd ths
 * THE SOFTWARE.
23 fde7d5bd ths
 */
24 fde7d5bd ths
25 87ecb68b pbrook
#include "hw.h"
26 87ecb68b pbrook
#include "mips.h"
27 87ecb68b pbrook
#include "pci.h"
28 fde7d5bd ths
#include "pci_host.h"
29 4f5e19e6 Isaku Yamahata
#include "pc.h"
30 1e39101c Avi Kivity
#include "exec-memory.h"
31 fde7d5bd ths
32 05b4ff43 ths
//#define DEBUG
33 05b4ff43 ths
34 05b4ff43 ths
#ifdef DEBUG
35 d0f2c4c6 malc
#define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __FUNCTION__, ##__VA_ARGS__)
36 05b4ff43 ths
#else
37 d0f2c4c6 malc
#define DPRINTF(fmt, ...)
38 05b4ff43 ths
#endif
39 05b4ff43 ths
40 fde7d5bd ths
#define GT_REGS                        (0x1000 >> 2)
41 fde7d5bd ths
42 fde7d5bd ths
/* CPU Configuration */
43 fde7d5bd ths
#define GT_CPU                    (0x000 >> 2)
44 fde7d5bd ths
#define GT_MULTI                    (0x120 >> 2)
45 fde7d5bd ths
46 fde7d5bd ths
/* CPU Address Decode */
47 fde7d5bd ths
#define GT_SCS10LD                    (0x008 >> 2)
48 fde7d5bd ths
#define GT_SCS10HD                    (0x010 >> 2)
49 fde7d5bd ths
#define GT_SCS32LD                    (0x018 >> 2)
50 fde7d5bd ths
#define GT_SCS32HD                    (0x020 >> 2)
51 fde7d5bd ths
#define GT_CS20LD                    (0x028 >> 2)
52 fde7d5bd ths
#define GT_CS20HD                    (0x030 >> 2)
53 fde7d5bd ths
#define GT_CS3BOOTLD            (0x038 >> 2)
54 fde7d5bd ths
#define GT_CS3BOOTHD            (0x040 >> 2)
55 fde7d5bd ths
#define GT_PCI0IOLD                    (0x048 >> 2)
56 fde7d5bd ths
#define GT_PCI0IOHD                    (0x050 >> 2)
57 fde7d5bd ths
#define GT_PCI0M0LD                    (0x058 >> 2)
58 fde7d5bd ths
#define GT_PCI0M0HD                    (0x060 >> 2)
59 fde7d5bd ths
#define GT_PCI0M1LD                    (0x080 >> 2)
60 fde7d5bd ths
#define GT_PCI0M1HD                    (0x088 >> 2)
61 fde7d5bd ths
#define GT_PCI1IOLD                    (0x090 >> 2)
62 fde7d5bd ths
#define GT_PCI1IOHD                    (0x098 >> 2)
63 fde7d5bd ths
#define GT_PCI1M0LD                    (0x0a0 >> 2)
64 fde7d5bd ths
#define GT_PCI1M0HD                    (0x0a8 >> 2)
65 fde7d5bd ths
#define GT_PCI1M1LD                    (0x0b0 >> 2)
66 fde7d5bd ths
#define GT_PCI1M1HD                    (0x0b8 >> 2)
67 05b4ff43 ths
#define GT_ISD                    (0x068 >> 2)
68 fde7d5bd ths
69 fde7d5bd ths
#define GT_SCS10AR                    (0x0d0 >> 2)
70 fde7d5bd ths
#define GT_SCS32AR                    (0x0d8 >> 2)
71 fde7d5bd ths
#define GT_CS20R                    (0x0e0 >> 2)
72 fde7d5bd ths
#define GT_CS3BOOTR                    (0x0e8 >> 2)
73 fde7d5bd ths
74 fde7d5bd ths
#define GT_PCI0IOREMAP            (0x0f0 >> 2)
75 fde7d5bd ths
#define GT_PCI0M0REMAP            (0x0f8 >> 2)
76 fde7d5bd ths
#define GT_PCI0M1REMAP            (0x100 >> 2)
77 fde7d5bd ths
#define GT_PCI1IOREMAP            (0x108 >> 2)
78 fde7d5bd ths
#define GT_PCI1M0REMAP            (0x110 >> 2)
79 fde7d5bd ths
#define GT_PCI1M1REMAP            (0x118 >> 2)
80 fde7d5bd ths
81 fde7d5bd ths
/* CPU Error Report */
82 fde7d5bd ths
#define GT_CPUERR_ADDRLO            (0x070 >> 2)
83 fde7d5bd ths
#define GT_CPUERR_ADDRHI            (0x078 >> 2)
84 fde7d5bd ths
#define GT_CPUERR_DATALO            (0x128 >> 2)                /* GT-64120A only  */
85 fde7d5bd ths
#define GT_CPUERR_DATAHI            (0x130 >> 2)                /* GT-64120A only  */
86 fde7d5bd ths
#define GT_CPUERR_PARITY            (0x138 >> 2)                /* GT-64120A only  */
87 fde7d5bd ths
88 fde7d5bd ths
/* CPU Sync Barrier */
89 fde7d5bd ths
#define GT_PCI0SYNC                    (0x0c0 >> 2)
90 fde7d5bd ths
#define GT_PCI1SYNC                    (0x0c8 >> 2)
91 fde7d5bd ths
92 fde7d5bd ths
/* SDRAM and Device Address Decode */
93 fde7d5bd ths
#define GT_SCS0LD                    (0x400 >> 2)
94 fde7d5bd ths
#define GT_SCS0HD                    (0x404 >> 2)
95 fde7d5bd ths
#define GT_SCS1LD                    (0x408 >> 2)
96 fde7d5bd ths
#define GT_SCS1HD                    (0x40c >> 2)
97 fde7d5bd ths
#define GT_SCS2LD                    (0x410 >> 2)
98 fde7d5bd ths
#define GT_SCS2HD                    (0x414 >> 2)
99 fde7d5bd ths
#define GT_SCS3LD                    (0x418 >> 2)
100 fde7d5bd ths
#define GT_SCS3HD                    (0x41c >> 2)
101 fde7d5bd ths
#define GT_CS0LD                    (0x420 >> 2)
102 fde7d5bd ths
#define GT_CS0HD                    (0x424 >> 2)
103 fde7d5bd ths
#define GT_CS1LD                    (0x428 >> 2)
104 fde7d5bd ths
#define GT_CS1HD                    (0x42c >> 2)
105 fde7d5bd ths
#define GT_CS2LD                    (0x430 >> 2)
106 fde7d5bd ths
#define GT_CS2HD                    (0x434 >> 2)
107 fde7d5bd ths
#define GT_CS3LD                    (0x438 >> 2)
108 fde7d5bd ths
#define GT_CS3HD                    (0x43c >> 2)
109 fde7d5bd ths
#define GT_BOOTLD                    (0x440 >> 2)
110 fde7d5bd ths
#define GT_BOOTHD                    (0x444 >> 2)
111 fde7d5bd ths
#define GT_ADERR                    (0x470 >> 2)
112 fde7d5bd ths
113 fde7d5bd ths
/* SDRAM Configuration */
114 fde7d5bd ths
#define GT_SDRAM_CFG            (0x448 >> 2)
115 fde7d5bd ths
#define GT_SDRAM_OPMODE            (0x474 >> 2)
116 fde7d5bd ths
#define GT_SDRAM_BM                    (0x478 >> 2)
117 fde7d5bd ths
#define GT_SDRAM_ADDRDECODE            (0x47c >> 2)
118 fde7d5bd ths
119 fde7d5bd ths
/* SDRAM Parameters */
120 fde7d5bd ths
#define GT_SDRAM_B0                    (0x44c >> 2)
121 fde7d5bd ths
#define GT_SDRAM_B1                    (0x450 >> 2)
122 fde7d5bd ths
#define GT_SDRAM_B2                    (0x454 >> 2)
123 fde7d5bd ths
#define GT_SDRAM_B3                    (0x458 >> 2)
124 fde7d5bd ths
125 fde7d5bd ths
/* Device Parameters */
126 fde7d5bd ths
#define GT_DEV_B0                    (0x45c >> 2)
127 fde7d5bd ths
#define GT_DEV_B1                    (0x460 >> 2)
128 fde7d5bd ths
#define GT_DEV_B2                    (0x464 >> 2)
129 fde7d5bd ths
#define GT_DEV_B3                    (0x468 >> 2)
130 fde7d5bd ths
#define GT_DEV_BOOT                    (0x46c >> 2)
131 fde7d5bd ths
132 fde7d5bd ths
/* ECC */
133 fde7d5bd ths
#define GT_ECC_ERRDATALO        (0x480 >> 2)                /* GT-64120A only  */
134 fde7d5bd ths
#define GT_ECC_ERRDATAHI        (0x484 >> 2)                /* GT-64120A only  */
135 fde7d5bd ths
#define GT_ECC_MEM                (0x488 >> 2)                /* GT-64120A only  */
136 fde7d5bd ths
#define GT_ECC_CALC                (0x48c >> 2)                /* GT-64120A only  */
137 fde7d5bd ths
#define GT_ECC_ERRADDR                (0x490 >> 2)                /* GT-64120A only  */
138 fde7d5bd ths
139 fde7d5bd ths
/* DMA Record */
140 fde7d5bd ths
#define GT_DMA0_CNT                    (0x800 >> 2)
141 fde7d5bd ths
#define GT_DMA1_CNT                    (0x804 >> 2)
142 fde7d5bd ths
#define GT_DMA2_CNT                    (0x808 >> 2)
143 fde7d5bd ths
#define GT_DMA3_CNT                    (0x80c >> 2)
144 fde7d5bd ths
#define GT_DMA0_SA                    (0x810 >> 2)
145 fde7d5bd ths
#define GT_DMA1_SA                    (0x814 >> 2)
146 fde7d5bd ths
#define GT_DMA2_SA                    (0x818 >> 2)
147 fde7d5bd ths
#define GT_DMA3_SA                    (0x81c >> 2)
148 fde7d5bd ths
#define GT_DMA0_DA                    (0x820 >> 2)
149 fde7d5bd ths
#define GT_DMA1_DA                    (0x824 >> 2)
150 fde7d5bd ths
#define GT_DMA2_DA                    (0x828 >> 2)
151 fde7d5bd ths
#define GT_DMA3_DA                    (0x82c >> 2)
152 fde7d5bd ths
#define GT_DMA0_NEXT            (0x830 >> 2)
153 fde7d5bd ths
#define GT_DMA1_NEXT            (0x834 >> 2)
154 fde7d5bd ths
#define GT_DMA2_NEXT            (0x838 >> 2)
155 fde7d5bd ths
#define GT_DMA3_NEXT            (0x83c >> 2)
156 fde7d5bd ths
#define GT_DMA0_CUR                    (0x870 >> 2)
157 fde7d5bd ths
#define GT_DMA1_CUR                    (0x874 >> 2)
158 fde7d5bd ths
#define GT_DMA2_CUR                    (0x878 >> 2)
159 fde7d5bd ths
#define GT_DMA3_CUR                    (0x87c >> 2)
160 fde7d5bd ths
161 fde7d5bd ths
/* DMA Channel Control */
162 fde7d5bd ths
#define GT_DMA0_CTRL            (0x840 >> 2)
163 fde7d5bd ths
#define GT_DMA1_CTRL            (0x844 >> 2)
164 fde7d5bd ths
#define GT_DMA2_CTRL            (0x848 >> 2)
165 fde7d5bd ths
#define GT_DMA3_CTRL            (0x84c >> 2)
166 fde7d5bd ths
167 fde7d5bd ths
/* DMA Arbiter */
168 fde7d5bd ths
#define GT_DMA_ARB                    (0x860 >> 2)
169 fde7d5bd ths
170 fde7d5bd ths
/* Timer/Counter */
171 fde7d5bd ths
#define GT_TC0                    (0x850 >> 2)
172 fde7d5bd ths
#define GT_TC1                    (0x854 >> 2)
173 fde7d5bd ths
#define GT_TC2                    (0x858 >> 2)
174 fde7d5bd ths
#define GT_TC3                    (0x85c >> 2)
175 fde7d5bd ths
#define GT_TC_CONTROL            (0x864 >> 2)
176 fde7d5bd ths
177 fde7d5bd ths
/* PCI Internal */
178 fde7d5bd ths
#define GT_PCI0_CMD                    (0xc00 >> 2)
179 fde7d5bd ths
#define GT_PCI0_TOR                    (0xc04 >> 2)
180 fde7d5bd ths
#define GT_PCI0_BS_SCS10            (0xc08 >> 2)
181 fde7d5bd ths
#define GT_PCI0_BS_SCS32            (0xc0c >> 2)
182 fde7d5bd ths
#define GT_PCI0_BS_CS20            (0xc10 >> 2)
183 fde7d5bd ths
#define GT_PCI0_BS_CS3BT            (0xc14 >> 2)
184 fde7d5bd ths
#define GT_PCI1_IACK            (0xc30 >> 2)
185 fde7d5bd ths
#define GT_PCI0_IACK            (0xc34 >> 2)
186 fde7d5bd ths
#define GT_PCI0_BARE            (0xc3c >> 2)
187 fde7d5bd ths
#define GT_PCI0_PREFMBR            (0xc40 >> 2)
188 fde7d5bd ths
#define GT_PCI0_SCS10_BAR            (0xc48 >> 2)
189 fde7d5bd ths
#define GT_PCI0_SCS32_BAR            (0xc4c >> 2)
190 fde7d5bd ths
#define GT_PCI0_CS20_BAR            (0xc50 >> 2)
191 fde7d5bd ths
#define GT_PCI0_CS3BT_BAR            (0xc54 >> 2)
192 fde7d5bd ths
#define GT_PCI0_SSCS10_BAR            (0xc58 >> 2)
193 fde7d5bd ths
#define GT_PCI0_SSCS32_BAR            (0xc5c >> 2)
194 fde7d5bd ths
#define GT_PCI0_SCS3BT_BAR            (0xc64 >> 2)
195 fde7d5bd ths
#define GT_PCI1_CMD                    (0xc80 >> 2)
196 fde7d5bd ths
#define GT_PCI1_TOR                    (0xc84 >> 2)
197 fde7d5bd ths
#define GT_PCI1_BS_SCS10            (0xc88 >> 2)
198 fde7d5bd ths
#define GT_PCI1_BS_SCS32            (0xc8c >> 2)
199 fde7d5bd ths
#define GT_PCI1_BS_CS20            (0xc90 >> 2)
200 fde7d5bd ths
#define GT_PCI1_BS_CS3BT            (0xc94 >> 2)
201 fde7d5bd ths
#define GT_PCI1_BARE            (0xcbc >> 2)
202 fde7d5bd ths
#define GT_PCI1_PREFMBR            (0xcc0 >> 2)
203 fde7d5bd ths
#define GT_PCI1_SCS10_BAR            (0xcc8 >> 2)
204 fde7d5bd ths
#define GT_PCI1_SCS32_BAR            (0xccc >> 2)
205 fde7d5bd ths
#define GT_PCI1_CS20_BAR            (0xcd0 >> 2)
206 fde7d5bd ths
#define GT_PCI1_CS3BT_BAR            (0xcd4 >> 2)
207 fde7d5bd ths
#define GT_PCI1_SSCS10_BAR            (0xcd8 >> 2)
208 fde7d5bd ths
#define GT_PCI1_SSCS32_BAR            (0xcdc >> 2)
209 fde7d5bd ths
#define GT_PCI1_SCS3BT_BAR            (0xce4 >> 2)
210 fde7d5bd ths
#define GT_PCI1_CFGADDR            (0xcf0 >> 2)
211 fde7d5bd ths
#define GT_PCI1_CFGDATA            (0xcf4 >> 2)
212 fde7d5bd ths
#define GT_PCI0_CFGADDR            (0xcf8 >> 2)
213 fde7d5bd ths
#define GT_PCI0_CFGDATA            (0xcfc >> 2)
214 fde7d5bd ths
215 fde7d5bd ths
/* Interrupts */
216 fde7d5bd ths
#define GT_INTRCAUSE            (0xc18 >> 2)
217 fde7d5bd ths
#define GT_INTRMASK                    (0xc1c >> 2)
218 fde7d5bd ths
#define GT_PCI0_ICMASK            (0xc24 >> 2)
219 fde7d5bd ths
#define GT_PCI0_SERR0MASK            (0xc28 >> 2)
220 fde7d5bd ths
#define GT_CPU_INTSEL            (0xc70 >> 2)
221 fde7d5bd ths
#define GT_PCI0_INTSEL            (0xc74 >> 2)
222 fde7d5bd ths
#define GT_HINTRCAUSE            (0xc98 >> 2)
223 fde7d5bd ths
#define GT_HINTRMASK            (0xc9c >> 2)
224 fde7d5bd ths
#define GT_PCI0_HICMASK            (0xca4 >> 2)
225 fde7d5bd ths
#define GT_PCI1_SERR1MASK            (0xca8 >> 2)
226 fde7d5bd ths
227 a0a8793e ths
#define PCI_MAPPING_ENTRY(regname)            \
228 c227f099 Anthony Liguori
    target_phys_addr_t regname ##_start;      \
229 c227f099 Anthony Liguori
    target_phys_addr_t regname ##_length;     \
230 fc2bf449 Avi Kivity
    MemoryRegion regname ##_mem
231 a0a8793e ths
232 fde7d5bd ths
typedef struct GT64120State {
233 c2dd2a23 Aurelien Jarno
    SysBusDevice busdev;
234 c2dd2a23 Aurelien Jarno
    PCIHostState pci;
235 fde7d5bd ths
    uint32_t regs[GT_REGS];
236 a0a8793e ths
    PCI_MAPPING_ENTRY(PCI0IO);
237 a0a8793e ths
    PCI_MAPPING_ENTRY(ISD);
238 fde7d5bd ths
} GT64120State;
239 fde7d5bd ths
240 a0a8793e ths
/* Adjust range to avoid touching space which isn't mappable via PCI */
241 a0a8793e ths
/* XXX: Hardcoded values for Malta: 0x1e000000 - 0x1f100000
242 a0a8793e ths
                                    0x1fc00000 - 0x1fd00000  */
243 c227f099 Anthony Liguori
static void check_reserved_space (target_phys_addr_t *start,
244 c227f099 Anthony Liguori
                                  target_phys_addr_t *length)
245 a0a8793e ths
{
246 c227f099 Anthony Liguori
    target_phys_addr_t begin = *start;
247 c227f099 Anthony Liguori
    target_phys_addr_t end = *start + *length;
248 a0a8793e ths
249 a0a8793e ths
    if (end >= 0x1e000000LL && end < 0x1f100000LL)
250 a0a8793e ths
        end = 0x1e000000LL;
251 a0a8793e ths
    if (begin >= 0x1e000000LL && begin < 0x1f100000LL)
252 a0a8793e ths
        begin = 0x1f100000LL;
253 a0a8793e ths
    if (end >= 0x1fc00000LL && end < 0x1fd00000LL)
254 a0a8793e ths
        end = 0x1fc00000LL;
255 a0a8793e ths
    if (begin >= 0x1fc00000LL && begin < 0x1fd00000LL)
256 a0a8793e ths
        begin = 0x1fd00000LL;
257 a0a8793e ths
    /* XXX: This is broken when a reserved range splits the requested range */
258 a0a8793e ths
    if (end >= 0x1f100000LL && begin < 0x1e000000LL)
259 a0a8793e ths
        end = 0x1e000000LL;
260 a0a8793e ths
    if (end >= 0x1fd00000LL && begin < 0x1fc00000LL)
261 a0a8793e ths
        end = 0x1fc00000LL;
262 a0a8793e ths
263 a0a8793e ths
    *start = begin;
264 a0a8793e ths
    *length = end - begin;
265 a0a8793e ths
}
266 a0a8793e ths
267 a0a8793e ths
static void gt64120_isd_mapping(GT64120State *s)
268 a0a8793e ths
{
269 c227f099 Anthony Liguori
    target_phys_addr_t start = s->regs[GT_ISD] << 21;
270 c227f099 Anthony Liguori
    target_phys_addr_t length = 0x1000;
271 a0a8793e ths
272 fc2bf449 Avi Kivity
    if (s->ISD_length) {
273 fc2bf449 Avi Kivity
        memory_region_del_subregion(get_system_memory(), &s->ISD_mem);
274 fc2bf449 Avi Kivity
    }
275 a0a8793e ths
    check_reserved_space(&start, &length);
276 a0a8793e ths
    length = 0x1000;
277 a0a8793e ths
    /* Map new address */
278 f6c61065 Antony Pavlov
    DPRINTF("ISD: "TARGET_FMT_plx"@"TARGET_FMT_plx
279 f6c61065 Antony Pavlov
        " -> "TARGET_FMT_plx"@"TARGET_FMT_plx"\n",
280 f6c61065 Antony Pavlov
        s->ISD_length, s->ISD_start, length, start);
281 a0a8793e ths
    s->ISD_start = start;
282 a0a8793e ths
    s->ISD_length = length;
283 fc2bf449 Avi Kivity
    memory_region_add_subregion(get_system_memory(), s->ISD_start, &s->ISD_mem);
284 a0a8793e ths
}
285 a0a8793e ths
286 9414cc6f ths
static void gt64120_pci_mapping(GT64120State *s)
287 2a1086d9 ths
{
288 9414cc6f ths
    /* Update IO mapping */
289 9414cc6f ths
    if ((s->regs[GT_PCI0IOLD] & 0x7f) <= s->regs[GT_PCI0IOHD])
290 9414cc6f ths
    {
291 3b46e624 ths
      /* Unmap old IO address */
292 9414cc6f ths
      if (s->PCI0IO_length)
293 9414cc6f ths
      {
294 fc2bf449 Avi Kivity
          memory_region_del_subregion(get_system_memory(), &s->PCI0IO_mem);
295 fc2bf449 Avi Kivity
          memory_region_destroy(&s->PCI0IO_mem);
296 9414cc6f ths
      }
297 9414cc6f ths
      /* Map new IO address */
298 9414cc6f ths
      s->PCI0IO_start = s->regs[GT_PCI0IOLD] << 21;
299 9414cc6f ths
      s->PCI0IO_length = ((s->regs[GT_PCI0IOHD] + 1) - (s->regs[GT_PCI0IOLD] & 0x7f)) << 21;
300 9414cc6f ths
      isa_mem_base = s->PCI0IO_start;
301 89da90b1 Avi Kivity
      if (s->PCI0IO_length) {
302 89da90b1 Avi Kivity
          isa_mmio_setup(&s->PCI0IO_mem, s->PCI0IO_length);
303 89da90b1 Avi Kivity
          memory_region_add_subregion(get_system_memory(), s->PCI0IO_start,
304 89da90b1 Avi Kivity
                                      &s->PCI0IO_mem);
305 89da90b1 Avi Kivity
      }
306 9414cc6f ths
    }
307 2a1086d9 ths
}
308 2a1086d9 ths
309 c227f099 Anthony Liguori
static void gt64120_writel (void *opaque, target_phys_addr_t addr,
310 fc2bf449 Avi Kivity
                            uint64_t val, unsigned size)
311 fde7d5bd ths
{
312 fde7d5bd ths
    GT64120State *s = opaque;
313 fde7d5bd ths
    uint32_t saddr;
314 fde7d5bd ths
315 c6c99c3f aurel32
    if (!(s->regs[GT_CPU] & 0x00001000))
316 1931e260 ths
        val = bswap32(val);
317 0da75eb1 ths
318 fde7d5bd ths
    saddr = (addr & 0xfff) >> 2;
319 fde7d5bd ths
    switch (saddr) {
320 0da75eb1 ths
321 0da75eb1 ths
    /* CPU Configuration */
322 fde7d5bd ths
    case GT_CPU:
323 fde7d5bd ths
        s->regs[GT_CPU] = val;
324 fde7d5bd ths
        break;
325 fde7d5bd ths
    case GT_MULTI:
326 0da75eb1 ths
        /* Read-only register as only one GT64xxx is present on the CPU bus */
327 fde7d5bd ths
        break;
328 fde7d5bd ths
329 fde7d5bd ths
    /* CPU Address Decode */
330 fde7d5bd ths
    case GT_PCI0IOLD:
331 fde7d5bd ths
        s->regs[GT_PCI0IOLD]    = val & 0x00007fff;
332 fde7d5bd ths
        s->regs[GT_PCI0IOREMAP] = val & 0x000007ff;
333 9414cc6f ths
        gt64120_pci_mapping(s);
334 fde7d5bd ths
        break;
335 fde7d5bd ths
    case GT_PCI0M0LD:
336 fde7d5bd ths
        s->regs[GT_PCI0M0LD]    = val & 0x00007fff;
337 fde7d5bd ths
        s->regs[GT_PCI0M0REMAP] = val & 0x000007ff;
338 fde7d5bd ths
        break;
339 fde7d5bd ths
    case GT_PCI0M1LD:
340 fde7d5bd ths
        s->regs[GT_PCI0M1LD]    = val & 0x00007fff;
341 fde7d5bd ths
        s->regs[GT_PCI0M1REMAP] = val & 0x000007ff;
342 fde7d5bd ths
        break;
343 fde7d5bd ths
    case GT_PCI1IOLD:
344 fde7d5bd ths
        s->regs[GT_PCI1IOLD]    = val & 0x00007fff;
345 fde7d5bd ths
        s->regs[GT_PCI1IOREMAP] = val & 0x000007ff;
346 fde7d5bd ths
        break;
347 fde7d5bd ths
    case GT_PCI1M0LD:
348 fde7d5bd ths
        s->regs[GT_PCI1M0LD]    = val & 0x00007fff;
349 fde7d5bd ths
        s->regs[GT_PCI1M0REMAP] = val & 0x000007ff;
350 fde7d5bd ths
        break;
351 fde7d5bd ths
    case GT_PCI1M1LD:
352 fde7d5bd ths
        s->regs[GT_PCI1M1LD]    = val & 0x00007fff;
353 fde7d5bd ths
        s->regs[GT_PCI1M1REMAP] = val & 0x000007ff;
354 fde7d5bd ths
        break;
355 fde7d5bd ths
    case GT_PCI0IOHD:
356 bb433bef ths
        s->regs[saddr] = val & 0x0000007f;
357 bb433bef ths
        gt64120_pci_mapping(s);
358 bb433bef ths
        break;
359 fde7d5bd ths
    case GT_PCI0M0HD:
360 fde7d5bd ths
    case GT_PCI0M1HD:
361 fde7d5bd ths
    case GT_PCI1IOHD:
362 fde7d5bd ths
    case GT_PCI1M0HD:
363 fde7d5bd ths
    case GT_PCI1M1HD:
364 fde7d5bd ths
        s->regs[saddr] = val & 0x0000007f;
365 fde7d5bd ths
        break;
366 a0a8793e ths
    case GT_ISD:
367 a0a8793e ths
        s->regs[saddr] = val & 0x00007fff;
368 a0a8793e ths
        gt64120_isd_mapping(s);
369 a0a8793e ths
        break;
370 a0a8793e ths
371 fde7d5bd ths
    case GT_PCI0IOREMAP:
372 fde7d5bd ths
    case GT_PCI0M0REMAP:
373 fde7d5bd ths
    case GT_PCI0M1REMAP:
374 fde7d5bd ths
    case GT_PCI1IOREMAP:
375 fde7d5bd ths
    case GT_PCI1M0REMAP:
376 fde7d5bd ths
    case GT_PCI1M1REMAP:
377 fde7d5bd ths
        s->regs[saddr] = val & 0x000007ff;
378 fde7d5bd ths
        break;
379 fde7d5bd ths
380 fde7d5bd ths
    /* CPU Error Report */
381 fde7d5bd ths
    case GT_CPUERR_ADDRLO:
382 fde7d5bd ths
    case GT_CPUERR_ADDRHI:
383 fde7d5bd ths
    case GT_CPUERR_DATALO:
384 fde7d5bd ths
    case GT_CPUERR_DATAHI:
385 fde7d5bd ths
    case GT_CPUERR_PARITY:
386 0da75eb1 ths
        /* Read-only registers, do nothing */
387 0da75eb1 ths
        break;
388 0da75eb1 ths
389 0da75eb1 ths
    /* CPU Sync Barrier */
390 0da75eb1 ths
    case GT_PCI0SYNC:
391 0da75eb1 ths
    case GT_PCI1SYNC:
392 0da75eb1 ths
        /* Read-only registers, do nothing */
393 fde7d5bd ths
        break;
394 fde7d5bd ths
395 05b4ff43 ths
    /* SDRAM and Device Address Decode */
396 05b4ff43 ths
    case GT_SCS0LD:
397 05b4ff43 ths
    case GT_SCS0HD:
398 05b4ff43 ths
    case GT_SCS1LD:
399 05b4ff43 ths
    case GT_SCS1HD:
400 05b4ff43 ths
    case GT_SCS2LD:
401 05b4ff43 ths
    case GT_SCS2HD:
402 05b4ff43 ths
    case GT_SCS3LD:
403 05b4ff43 ths
    case GT_SCS3HD:
404 05b4ff43 ths
    case GT_CS0LD:
405 05b4ff43 ths
    case GT_CS0HD:
406 05b4ff43 ths
    case GT_CS1LD:
407 05b4ff43 ths
    case GT_CS1HD:
408 05b4ff43 ths
    case GT_CS2LD:
409 05b4ff43 ths
    case GT_CS2HD:
410 05b4ff43 ths
    case GT_CS3LD:
411 05b4ff43 ths
    case GT_CS3HD:
412 05b4ff43 ths
    case GT_BOOTLD:
413 05b4ff43 ths
    case GT_BOOTHD:
414 05b4ff43 ths
    case GT_ADERR:
415 05b4ff43 ths
    /* SDRAM Configuration */
416 05b4ff43 ths
    case GT_SDRAM_CFG:
417 05b4ff43 ths
    case GT_SDRAM_OPMODE:
418 05b4ff43 ths
    case GT_SDRAM_BM:
419 05b4ff43 ths
    case GT_SDRAM_ADDRDECODE:
420 05b4ff43 ths
        /* Accept and ignore SDRAM interleave configuration */
421 05b4ff43 ths
        s->regs[saddr] = val;
422 05b4ff43 ths
        break;
423 05b4ff43 ths
424 05b4ff43 ths
    /* Device Parameters */
425 05b4ff43 ths
    case GT_DEV_B0:
426 05b4ff43 ths
    case GT_DEV_B1:
427 05b4ff43 ths
    case GT_DEV_B2:
428 05b4ff43 ths
    case GT_DEV_B3:
429 05b4ff43 ths
    case GT_DEV_BOOT:
430 05b4ff43 ths
        /* Not implemented */
431 d0f2c4c6 malc
        DPRINTF ("Unimplemented device register offset 0x%x\n", saddr << 2);
432 05b4ff43 ths
        break;
433 05b4ff43 ths
434 fde7d5bd ths
    /* ECC */
435 fde7d5bd ths
    case GT_ECC_ERRDATALO:
436 fde7d5bd ths
    case GT_ECC_ERRDATAHI:
437 fde7d5bd ths
    case GT_ECC_MEM:
438 fde7d5bd ths
    case GT_ECC_CALC:
439 fde7d5bd ths
    case GT_ECC_ERRADDR:
440 0da75eb1 ths
        /* Read-only registers, do nothing */
441 fde7d5bd ths
        break;
442 fde7d5bd ths
443 05b4ff43 ths
    /* DMA Record */
444 05b4ff43 ths
    case GT_DMA0_CNT:
445 05b4ff43 ths
    case GT_DMA1_CNT:
446 05b4ff43 ths
    case GT_DMA2_CNT:
447 05b4ff43 ths
    case GT_DMA3_CNT:
448 05b4ff43 ths
    case GT_DMA0_SA:
449 05b4ff43 ths
    case GT_DMA1_SA:
450 05b4ff43 ths
    case GT_DMA2_SA:
451 05b4ff43 ths
    case GT_DMA3_SA:
452 05b4ff43 ths
    case GT_DMA0_DA:
453 05b4ff43 ths
    case GT_DMA1_DA:
454 05b4ff43 ths
    case GT_DMA2_DA:
455 05b4ff43 ths
    case GT_DMA3_DA:
456 05b4ff43 ths
    case GT_DMA0_NEXT:
457 05b4ff43 ths
    case GT_DMA1_NEXT:
458 05b4ff43 ths
    case GT_DMA2_NEXT:
459 05b4ff43 ths
    case GT_DMA3_NEXT:
460 05b4ff43 ths
    case GT_DMA0_CUR:
461 05b4ff43 ths
    case GT_DMA1_CUR:
462 05b4ff43 ths
    case GT_DMA2_CUR:
463 05b4ff43 ths
    case GT_DMA3_CUR:
464 05b4ff43 ths
        /* Not implemented */
465 d0f2c4c6 malc
        DPRINTF ("Unimplemented DMA register offset 0x%x\n", saddr << 2);
466 05b4ff43 ths
        break;
467 05b4ff43 ths
468 05b4ff43 ths
    /* DMA Channel Control */
469 05b4ff43 ths
    case GT_DMA0_CTRL:
470 05b4ff43 ths
    case GT_DMA1_CTRL:
471 05b4ff43 ths
    case GT_DMA2_CTRL:
472 05b4ff43 ths
    case GT_DMA3_CTRL:
473 05b4ff43 ths
        /* Not implemented */
474 d0f2c4c6 malc
        DPRINTF ("Unimplemented DMA register offset 0x%x\n", saddr << 2);
475 05b4ff43 ths
        break;
476 05b4ff43 ths
477 05b4ff43 ths
    /* DMA Arbiter */
478 05b4ff43 ths
    case GT_DMA_ARB:
479 05b4ff43 ths
        /* Not implemented */
480 d0f2c4c6 malc
        DPRINTF ("Unimplemented DMA register offset 0x%x\n", saddr << 2);
481 05b4ff43 ths
        break;
482 05b4ff43 ths
483 05b4ff43 ths
    /* Timer/Counter */
484 05b4ff43 ths
    case GT_TC0:
485 05b4ff43 ths
    case GT_TC1:
486 05b4ff43 ths
    case GT_TC2:
487 05b4ff43 ths
    case GT_TC3:
488 05b4ff43 ths
    case GT_TC_CONTROL:
489 05b4ff43 ths
        /* Not implemented */
490 d0f2c4c6 malc
        DPRINTF ("Unimplemented timer register offset 0x%x\n", saddr << 2);
491 05b4ff43 ths
        break;
492 05b4ff43 ths
493 fde7d5bd ths
    /* PCI Internal */
494 fde7d5bd ths
    case GT_PCI0_CMD:
495 fde7d5bd ths
    case GT_PCI1_CMD:
496 fde7d5bd ths
        s->regs[saddr] = val & 0x0401fc0f;
497 fde7d5bd ths
        break;
498 05b4ff43 ths
    case GT_PCI0_TOR:
499 05b4ff43 ths
    case GT_PCI0_BS_SCS10:
500 05b4ff43 ths
    case GT_PCI0_BS_SCS32:
501 05b4ff43 ths
    case GT_PCI0_BS_CS20:
502 05b4ff43 ths
    case GT_PCI0_BS_CS3BT:
503 05b4ff43 ths
    case GT_PCI1_IACK:
504 05b4ff43 ths
    case GT_PCI0_IACK:
505 05b4ff43 ths
    case GT_PCI0_BARE:
506 05b4ff43 ths
    case GT_PCI0_PREFMBR:
507 05b4ff43 ths
    case GT_PCI0_SCS10_BAR:
508 05b4ff43 ths
    case GT_PCI0_SCS32_BAR:
509 05b4ff43 ths
    case GT_PCI0_CS20_BAR:
510 05b4ff43 ths
    case GT_PCI0_CS3BT_BAR:
511 05b4ff43 ths
    case GT_PCI0_SSCS10_BAR:
512 05b4ff43 ths
    case GT_PCI0_SSCS32_BAR:
513 05b4ff43 ths
    case GT_PCI0_SCS3BT_BAR:
514 05b4ff43 ths
    case GT_PCI1_TOR:
515 05b4ff43 ths
    case GT_PCI1_BS_SCS10:
516 05b4ff43 ths
    case GT_PCI1_BS_SCS32:
517 05b4ff43 ths
    case GT_PCI1_BS_CS20:
518 05b4ff43 ths
    case GT_PCI1_BS_CS3BT:
519 05b4ff43 ths
    case GT_PCI1_BARE:
520 05b4ff43 ths
    case GT_PCI1_PREFMBR:
521 05b4ff43 ths
    case GT_PCI1_SCS10_BAR:
522 05b4ff43 ths
    case GT_PCI1_SCS32_BAR:
523 05b4ff43 ths
    case GT_PCI1_CS20_BAR:
524 05b4ff43 ths
    case GT_PCI1_CS3BT_BAR:
525 05b4ff43 ths
    case GT_PCI1_SSCS10_BAR:
526 05b4ff43 ths
    case GT_PCI1_SSCS32_BAR:
527 05b4ff43 ths
    case GT_PCI1_SCS3BT_BAR:
528 05b4ff43 ths
    case GT_PCI1_CFGADDR:
529 05b4ff43 ths
    case GT_PCI1_CFGDATA:
530 05b4ff43 ths
        /* not implemented */
531 05b4ff43 ths
        break;
532 fde7d5bd ths
    case GT_PCI0_CFGADDR:
533 c2dd2a23 Aurelien Jarno
        s->pci.config_reg = val & 0x80fffffc;
534 fde7d5bd ths
        break;
535 fde7d5bd ths
    case GT_PCI0_CFGDATA:
536 c2dd2a23 Aurelien Jarno
        if (!(s->regs[GT_PCI0_CMD] & 1) && (s->pci.config_reg & 0x00fff800))
537 c6c99c3f aurel32
            val = bswap32(val);
538 c2dd2a23 Aurelien Jarno
        if (s->pci.config_reg & (1u << 31))
539 c2dd2a23 Aurelien Jarno
            pci_data_write(s->pci.bus, s->pci.config_reg, val, 4);
540 05b4ff43 ths
        break;
541 05b4ff43 ths
542 05b4ff43 ths
    /* Interrupts */
543 05b4ff43 ths
    case GT_INTRCAUSE:
544 05b4ff43 ths
        /* not really implemented */
545 05b4ff43 ths
        s->regs[saddr] = ~(~(s->regs[saddr]) | ~(val & 0xfffffffe));
546 05b4ff43 ths
        s->regs[saddr] |= !!(s->regs[saddr] & 0xfffffffe);
547 ce8d2800 Antony Pavlov
        DPRINTF("INTRCAUSE %" PRIx64 "\n", val);
548 05b4ff43 ths
        break;
549 05b4ff43 ths
    case GT_INTRMASK:
550 05b4ff43 ths
        s->regs[saddr] = val & 0x3c3ffffe;
551 ce8d2800 Antony Pavlov
        DPRINTF("INTRMASK %" PRIx64 "\n", val);
552 05b4ff43 ths
        break;
553 05b4ff43 ths
    case GT_PCI0_ICMASK:
554 05b4ff43 ths
        s->regs[saddr] = val & 0x03fffffe;
555 ce8d2800 Antony Pavlov
        DPRINTF("ICMASK %" PRIx64 "\n", val);
556 05b4ff43 ths
        break;
557 05b4ff43 ths
    case GT_PCI0_SERR0MASK:
558 05b4ff43 ths
        s->regs[saddr] = val & 0x0000003f;
559 ce8d2800 Antony Pavlov
        DPRINTF("SERR0MASK %" PRIx64 "\n", val);
560 05b4ff43 ths
        break;
561 05b4ff43 ths
562 05b4ff43 ths
    /* Reserved when only PCI_0 is configured. */
563 05b4ff43 ths
    case GT_HINTRCAUSE:
564 05b4ff43 ths
    case GT_CPU_INTSEL:
565 05b4ff43 ths
    case GT_PCI0_INTSEL:
566 05b4ff43 ths
    case GT_HINTRMASK:
567 05b4ff43 ths
    case GT_PCI0_HICMASK:
568 05b4ff43 ths
    case GT_PCI1_SERR1MASK:
569 05b4ff43 ths
        /* not implemented */
570 fde7d5bd ths
        break;
571 fde7d5bd ths
572 0da75eb1 ths
    /* SDRAM Parameters */
573 0da75eb1 ths
    case GT_SDRAM_B0:
574 0da75eb1 ths
    case GT_SDRAM_B1:
575 0da75eb1 ths
    case GT_SDRAM_B2:
576 0da75eb1 ths
    case GT_SDRAM_B3:
577 0da75eb1 ths
        /* We don't simulate electrical parameters of the SDRAM.
578 0da75eb1 ths
           Accept, but ignore the values. */
579 0da75eb1 ths
        s->regs[saddr] = val;
580 0da75eb1 ths
        break;
581 0da75eb1 ths
582 fde7d5bd ths
    default:
583 d0f2c4c6 malc
        DPRINTF ("Bad register offset 0x%x\n", (int)addr);
584 fde7d5bd ths
        break;
585 fde7d5bd ths
    }
586 fde7d5bd ths
}
587 fde7d5bd ths
588 fc2bf449 Avi Kivity
static uint64_t gt64120_readl (void *opaque,
589 fc2bf449 Avi Kivity
                               target_phys_addr_t addr, unsigned size)
590 fde7d5bd ths
{
591 fde7d5bd ths
    GT64120State *s = opaque;
592 fde7d5bd ths
    uint32_t val;
593 fde7d5bd ths
    uint32_t saddr;
594 fde7d5bd ths
595 fde7d5bd ths
    saddr = (addr & 0xfff) >> 2;
596 fde7d5bd ths
    switch (saddr) {
597 fde7d5bd ths
598 0da75eb1 ths
    /* CPU Configuration */
599 0da75eb1 ths
    case GT_MULTI:
600 0da75eb1 ths
        /* Only one GT64xxx is present on the CPU bus, return
601 0da75eb1 ths
           the initial value */
602 0da75eb1 ths
        val = s->regs[saddr];
603 0da75eb1 ths
        break;
604 0da75eb1 ths
605 fde7d5bd ths
    /* CPU Error Report */
606 fde7d5bd ths
    case GT_CPUERR_ADDRLO:
607 fde7d5bd ths
    case GT_CPUERR_ADDRHI:
608 fde7d5bd ths
    case GT_CPUERR_DATALO:
609 fde7d5bd ths
    case GT_CPUERR_DATAHI:
610 fde7d5bd ths
    case GT_CPUERR_PARITY:
611 0da75eb1 ths
        /* Emulated memory has no error, always return the initial
612 5fafdf24 ths
           values */
613 0da75eb1 ths
        val = s->regs[saddr];
614 0da75eb1 ths
        break;
615 0da75eb1 ths
616 0da75eb1 ths
    /* CPU Sync Barrier */
617 0da75eb1 ths
    case GT_PCI0SYNC:
618 0da75eb1 ths
    case GT_PCI1SYNC:
619 0da75eb1 ths
        /* Reading those register should empty all FIFO on the PCI
620 0da75eb1 ths
           bus, which are not emulated. The return value should be
621 0da75eb1 ths
           a random value that should be ignored. */
622 5fafdf24 ths
        val = 0xc000ffee;
623 fde7d5bd ths
        break;
624 fde7d5bd ths
625 fde7d5bd ths
    /* ECC */
626 fde7d5bd ths
    case GT_ECC_ERRDATALO:
627 fde7d5bd ths
    case GT_ECC_ERRDATAHI:
628 fde7d5bd ths
    case GT_ECC_MEM:
629 fde7d5bd ths
    case GT_ECC_CALC:
630 fde7d5bd ths
    case GT_ECC_ERRADDR:
631 0da75eb1 ths
        /* Emulated memory has no error, always return the initial
632 5fafdf24 ths
           values */
633 0da75eb1 ths
        val = s->regs[saddr];
634 fde7d5bd ths
        break;
635 fde7d5bd ths
636 fde7d5bd ths
    case GT_CPU:
637 05b4ff43 ths
    case GT_SCS10LD:
638 05b4ff43 ths
    case GT_SCS10HD:
639 05b4ff43 ths
    case GT_SCS32LD:
640 05b4ff43 ths
    case GT_SCS32HD:
641 05b4ff43 ths
    case GT_CS20LD:
642 05b4ff43 ths
    case GT_CS20HD:
643 05b4ff43 ths
    case GT_CS3BOOTLD:
644 05b4ff43 ths
    case GT_CS3BOOTHD:
645 05b4ff43 ths
    case GT_SCS10AR:
646 05b4ff43 ths
    case GT_SCS32AR:
647 05b4ff43 ths
    case GT_CS20R:
648 05b4ff43 ths
    case GT_CS3BOOTR:
649 fde7d5bd ths
    case GT_PCI0IOLD:
650 fde7d5bd ths
    case GT_PCI0M0LD:
651 fde7d5bd ths
    case GT_PCI0M1LD:
652 fde7d5bd ths
    case GT_PCI1IOLD:
653 fde7d5bd ths
    case GT_PCI1M0LD:
654 fde7d5bd ths
    case GT_PCI1M1LD:
655 fde7d5bd ths
    case GT_PCI0IOHD:
656 fde7d5bd ths
    case GT_PCI0M0HD:
657 fde7d5bd ths
    case GT_PCI0M1HD:
658 fde7d5bd ths
    case GT_PCI1IOHD:
659 fde7d5bd ths
    case GT_PCI1M0HD:
660 fde7d5bd ths
    case GT_PCI1M1HD:
661 fde7d5bd ths
    case GT_PCI0IOREMAP:
662 fde7d5bd ths
    case GT_PCI0M0REMAP:
663 fde7d5bd ths
    case GT_PCI0M1REMAP:
664 fde7d5bd ths
    case GT_PCI1IOREMAP:
665 fde7d5bd ths
    case GT_PCI1M0REMAP:
666 fde7d5bd ths
    case GT_PCI1M1REMAP:
667 05b4ff43 ths
    case GT_ISD:
668 fde7d5bd ths
        val = s->regs[saddr];
669 fde7d5bd ths
        break;
670 fde7d5bd ths
    case GT_PCI0_IACK:
671 5fafdf24 ths
        /* Read the IRQ number */
672 4de9b249 ths
        val = pic_read_irq(isa_pic);
673 fde7d5bd ths
        break;
674 fde7d5bd ths
675 05b4ff43 ths
    /* SDRAM and Device Address Decode */
676 05b4ff43 ths
    case GT_SCS0LD:
677 05b4ff43 ths
    case GT_SCS0HD:
678 05b4ff43 ths
    case GT_SCS1LD:
679 05b4ff43 ths
    case GT_SCS1HD:
680 05b4ff43 ths
    case GT_SCS2LD:
681 05b4ff43 ths
    case GT_SCS2HD:
682 05b4ff43 ths
    case GT_SCS3LD:
683 05b4ff43 ths
    case GT_SCS3HD:
684 05b4ff43 ths
    case GT_CS0LD:
685 05b4ff43 ths
    case GT_CS0HD:
686 05b4ff43 ths
    case GT_CS1LD:
687 05b4ff43 ths
    case GT_CS1HD:
688 05b4ff43 ths
    case GT_CS2LD:
689 05b4ff43 ths
    case GT_CS2HD:
690 05b4ff43 ths
    case GT_CS3LD:
691 05b4ff43 ths
    case GT_CS3HD:
692 05b4ff43 ths
    case GT_BOOTLD:
693 05b4ff43 ths
    case GT_BOOTHD:
694 05b4ff43 ths
    case GT_ADERR:
695 05b4ff43 ths
        val = s->regs[saddr];
696 05b4ff43 ths
        break;
697 05b4ff43 ths
698 05b4ff43 ths
    /* SDRAM Configuration */
699 05b4ff43 ths
    case GT_SDRAM_CFG:
700 05b4ff43 ths
    case GT_SDRAM_OPMODE:
701 05b4ff43 ths
    case GT_SDRAM_BM:
702 05b4ff43 ths
    case GT_SDRAM_ADDRDECODE:
703 05b4ff43 ths
        val = s->regs[saddr];
704 05b4ff43 ths
        break;
705 05b4ff43 ths
706 0da75eb1 ths
    /* SDRAM Parameters */
707 0da75eb1 ths
    case GT_SDRAM_B0:
708 0da75eb1 ths
    case GT_SDRAM_B1:
709 0da75eb1 ths
    case GT_SDRAM_B2:
710 0da75eb1 ths
    case GT_SDRAM_B3:
711 0da75eb1 ths
        /* We don't simulate electrical parameters of the SDRAM.
712 0da75eb1 ths
           Just return the last written value. */
713 0da75eb1 ths
        val = s->regs[saddr];
714 0da75eb1 ths
        break;
715 0da75eb1 ths
716 05b4ff43 ths
    /* Device Parameters */
717 05b4ff43 ths
    case GT_DEV_B0:
718 05b4ff43 ths
    case GT_DEV_B1:
719 05b4ff43 ths
    case GT_DEV_B2:
720 05b4ff43 ths
    case GT_DEV_B3:
721 05b4ff43 ths
    case GT_DEV_BOOT:
722 05b4ff43 ths
        val = s->regs[saddr];
723 05b4ff43 ths
        break;
724 05b4ff43 ths
725 05b4ff43 ths
    /* DMA Record */
726 05b4ff43 ths
    case GT_DMA0_CNT:
727 05b4ff43 ths
    case GT_DMA1_CNT:
728 05b4ff43 ths
    case GT_DMA2_CNT:
729 05b4ff43 ths
    case GT_DMA3_CNT:
730 05b4ff43 ths
    case GT_DMA0_SA:
731 05b4ff43 ths
    case GT_DMA1_SA:
732 05b4ff43 ths
    case GT_DMA2_SA:
733 05b4ff43 ths
    case GT_DMA3_SA:
734 05b4ff43 ths
    case GT_DMA0_DA:
735 05b4ff43 ths
    case GT_DMA1_DA:
736 05b4ff43 ths
    case GT_DMA2_DA:
737 05b4ff43 ths
    case GT_DMA3_DA:
738 05b4ff43 ths
    case GT_DMA0_NEXT:
739 05b4ff43 ths
    case GT_DMA1_NEXT:
740 05b4ff43 ths
    case GT_DMA2_NEXT:
741 05b4ff43 ths
    case GT_DMA3_NEXT:
742 05b4ff43 ths
    case GT_DMA0_CUR:
743 05b4ff43 ths
    case GT_DMA1_CUR:
744 05b4ff43 ths
    case GT_DMA2_CUR:
745 05b4ff43 ths
    case GT_DMA3_CUR:
746 05b4ff43 ths
        val = s->regs[saddr];
747 05b4ff43 ths
        break;
748 05b4ff43 ths
749 05b4ff43 ths
    /* DMA Channel Control */
750 05b4ff43 ths
    case GT_DMA0_CTRL:
751 05b4ff43 ths
    case GT_DMA1_CTRL:
752 05b4ff43 ths
    case GT_DMA2_CTRL:
753 05b4ff43 ths
    case GT_DMA3_CTRL:
754 05b4ff43 ths
        val = s->regs[saddr];
755 05b4ff43 ths
        break;
756 05b4ff43 ths
757 05b4ff43 ths
    /* DMA Arbiter */
758 05b4ff43 ths
    case GT_DMA_ARB:
759 05b4ff43 ths
        val = s->regs[saddr];
760 05b4ff43 ths
        break;
761 05b4ff43 ths
762 05b4ff43 ths
    /* Timer/Counter */
763 05b4ff43 ths
    case GT_TC0:
764 05b4ff43 ths
    case GT_TC1:
765 05b4ff43 ths
    case GT_TC2:
766 05b4ff43 ths
    case GT_TC3:
767 05b4ff43 ths
    case GT_TC_CONTROL:
768 05b4ff43 ths
        val = s->regs[saddr];
769 05b4ff43 ths
        break;
770 05b4ff43 ths
771 fde7d5bd ths
    /* PCI Internal */
772 fde7d5bd ths
    case GT_PCI0_CFGADDR:
773 c2dd2a23 Aurelien Jarno
        val = s->pci.config_reg;
774 fde7d5bd ths
        break;
775 fde7d5bd ths
    case GT_PCI0_CFGDATA:
776 c2dd2a23 Aurelien Jarno
        if (!(s->pci.config_reg & (1 << 31)))
777 c6c99c3f aurel32
            val = 0xffffffff;
778 c6c99c3f aurel32
        else
779 c2dd2a23 Aurelien Jarno
            val = pci_data_read(s->pci.bus, s->pci.config_reg, 4);
780 c2dd2a23 Aurelien Jarno
        if (!(s->regs[GT_PCI0_CMD] & 1) && (s->pci.config_reg & 0x00fff800))
781 c6c99c3f aurel32
            val = bswap32(val);
782 05b4ff43 ths
        break;
783 05b4ff43 ths
784 05b4ff43 ths
    case GT_PCI0_CMD:
785 05b4ff43 ths
    case GT_PCI0_TOR:
786 05b4ff43 ths
    case GT_PCI0_BS_SCS10:
787 05b4ff43 ths
    case GT_PCI0_BS_SCS32:
788 05b4ff43 ths
    case GT_PCI0_BS_CS20:
789 05b4ff43 ths
    case GT_PCI0_BS_CS3BT:
790 05b4ff43 ths
    case GT_PCI1_IACK:
791 05b4ff43 ths
    case GT_PCI0_BARE:
792 05b4ff43 ths
    case GT_PCI0_PREFMBR:
793 05b4ff43 ths
    case GT_PCI0_SCS10_BAR:
794 05b4ff43 ths
    case GT_PCI0_SCS32_BAR:
795 05b4ff43 ths
    case GT_PCI0_CS20_BAR:
796 05b4ff43 ths
    case GT_PCI0_CS3BT_BAR:
797 05b4ff43 ths
    case GT_PCI0_SSCS10_BAR:
798 05b4ff43 ths
    case GT_PCI0_SSCS32_BAR:
799 05b4ff43 ths
    case GT_PCI0_SCS3BT_BAR:
800 05b4ff43 ths
    case GT_PCI1_CMD:
801 05b4ff43 ths
    case GT_PCI1_TOR:
802 05b4ff43 ths
    case GT_PCI1_BS_SCS10:
803 05b4ff43 ths
    case GT_PCI1_BS_SCS32:
804 05b4ff43 ths
    case GT_PCI1_BS_CS20:
805 05b4ff43 ths
    case GT_PCI1_BS_CS3BT:
806 05b4ff43 ths
    case GT_PCI1_BARE:
807 05b4ff43 ths
    case GT_PCI1_PREFMBR:
808 05b4ff43 ths
    case GT_PCI1_SCS10_BAR:
809 05b4ff43 ths
    case GT_PCI1_SCS32_BAR:
810 05b4ff43 ths
    case GT_PCI1_CS20_BAR:
811 05b4ff43 ths
    case GT_PCI1_CS3BT_BAR:
812 05b4ff43 ths
    case GT_PCI1_SSCS10_BAR:
813 05b4ff43 ths
    case GT_PCI1_SSCS32_BAR:
814 05b4ff43 ths
    case GT_PCI1_SCS3BT_BAR:
815 05b4ff43 ths
    case GT_PCI1_CFGADDR:
816 05b4ff43 ths
    case GT_PCI1_CFGDATA:
817 05b4ff43 ths
        val = s->regs[saddr];
818 05b4ff43 ths
        break;
819 05b4ff43 ths
820 05b4ff43 ths
    /* Interrupts */
821 05b4ff43 ths
    case GT_INTRCAUSE:
822 05b4ff43 ths
        val = s->regs[saddr];
823 d0f2c4c6 malc
        DPRINTF("INTRCAUSE %x\n", val);
824 05b4ff43 ths
        break;
825 05b4ff43 ths
    case GT_INTRMASK:
826 05b4ff43 ths
        val = s->regs[saddr];
827 d0f2c4c6 malc
        DPRINTF("INTRMASK %x\n", val);
828 05b4ff43 ths
        break;
829 05b4ff43 ths
    case GT_PCI0_ICMASK:
830 05b4ff43 ths
        val = s->regs[saddr];
831 d0f2c4c6 malc
        DPRINTF("ICMASK %x\n", val);
832 05b4ff43 ths
        break;
833 05b4ff43 ths
    case GT_PCI0_SERR0MASK:
834 05b4ff43 ths
        val = s->regs[saddr];
835 d0f2c4c6 malc
        DPRINTF("SERR0MASK %x\n", val);
836 05b4ff43 ths
        break;
837 05b4ff43 ths
838 05b4ff43 ths
    /* Reserved when only PCI_0 is configured. */
839 05b4ff43 ths
    case GT_HINTRCAUSE:
840 05b4ff43 ths
    case GT_CPU_INTSEL:
841 05b4ff43 ths
    case GT_PCI0_INTSEL:
842 05b4ff43 ths
    case GT_HINTRMASK:
843 05b4ff43 ths
    case GT_PCI0_HICMASK:
844 05b4ff43 ths
    case GT_PCI1_SERR1MASK:
845 05b4ff43 ths
        val = s->regs[saddr];
846 fde7d5bd ths
        break;
847 fde7d5bd ths
848 fde7d5bd ths
    default:
849 fde7d5bd ths
        val = s->regs[saddr];
850 d0f2c4c6 malc
        DPRINTF ("Bad register offset 0x%x\n", (int)addr);
851 fde7d5bd ths
        break;
852 fde7d5bd ths
    }
853 fde7d5bd ths
854 c6c99c3f aurel32
    if (!(s->regs[GT_CPU] & 0x00001000))
855 1931e260 ths
        val = bswap32(val);
856 1931e260 ths
857 05b4ff43 ths
    return val;
858 fde7d5bd ths
}
859 fde7d5bd ths
860 fc2bf449 Avi Kivity
static const MemoryRegionOps isd_mem_ops = {
861 fc2bf449 Avi Kivity
    .read = gt64120_readl,
862 fc2bf449 Avi Kivity
    .write = gt64120_writel,
863 fc2bf449 Avi Kivity
    .endianness = DEVICE_NATIVE_ENDIAN,
864 fde7d5bd ths
};
865 fde7d5bd ths
866 c2dd2a23 Aurelien Jarno
static int gt64120_pci_map_irq(PCIDevice *pci_dev, int irq_num)
867 fde7d5bd ths
{
868 fde7d5bd ths
    int slot;
869 fde7d5bd ths
870 fde7d5bd ths
    slot = (pci_dev->devfn >> 3);
871 fde7d5bd ths
872 fde7d5bd ths
    switch (slot) {
873 fde7d5bd ths
      /* PIIX4 USB */
874 fde7d5bd ths
      case 10:
875 fde7d5bd ths
        return 3;
876 fde7d5bd ths
      /* AMD 79C973 Ethernet */
877 fde7d5bd ths
      case 11:
878 d4a4d056 ths
        return 1;
879 fde7d5bd ths
      /* Crystal 4281 Sound */
880 fde7d5bd ths
      case 12:
881 d4a4d056 ths
        return 2;
882 fde7d5bd ths
      /* PCI slot 1 to 4 */
883 fde7d5bd ths
      case 18 ... 21:
884 fde7d5bd ths
        return ((slot - 18) + irq_num) & 0x03;
885 fde7d5bd ths
      /* Unknown device, don't do any translation */
886 fde7d5bd ths
      default:
887 fde7d5bd ths
        return irq_num;
888 fde7d5bd ths
    }
889 fde7d5bd ths
}
890 fde7d5bd ths
891 fde7d5bd ths
static int pci_irq_levels[4];
892 fde7d5bd ths
893 c2dd2a23 Aurelien Jarno
static void gt64120_pci_set_irq(void *opaque, int irq_num, int level)
894 fde7d5bd ths
{
895 fde7d5bd ths
    int i, pic_irq, pic_level;
896 5d4e84c8 Juan Quintela
    qemu_irq *pic = opaque;
897 fde7d5bd ths
898 fde7d5bd ths
    pci_irq_levels[irq_num] = level;
899 fde7d5bd ths
900 fde7d5bd ths
    /* now we change the pic irq level according to the piix irq mappings */
901 fde7d5bd ths
    /* XXX: optimize */
902 fde7d5bd ths
    pic_irq = piix4_dev->config[0x60 + irq_num];
903 fde7d5bd ths
    if (pic_irq < 16) {
904 fde7d5bd ths
        /* The pic level is the logical OR of all the PCI irqs mapped
905 fde7d5bd ths
           to it */
906 fde7d5bd ths
        pic_level = 0;
907 fde7d5bd ths
        for (i = 0; i < 4; i++) {
908 fde7d5bd ths
            if (pic_irq == piix4_dev->config[0x60 + i])
909 fde7d5bd ths
                pic_level |= pci_irq_levels[i];
910 fde7d5bd ths
        }
911 d537cf6c pbrook
        qemu_set_irq(pic[pic_irq], pic_level);
912 fde7d5bd ths
    }
913 fde7d5bd ths
}
914 fde7d5bd ths
915 fde7d5bd ths
916 9596ebb7 pbrook
static void gt64120_reset(void *opaque)
917 fde7d5bd ths
{
918 fde7d5bd ths
    GT64120State *s = opaque;
919 fde7d5bd ths
920 30b6f3a8 ths
    /* FIXME: Malta specific hw assumptions ahead */
921 30b6f3a8 ths
922 fde7d5bd ths
    /* CPU Configuration */
923 fde7d5bd ths
#ifdef TARGET_WORDS_BIGENDIAN
924 fde7d5bd ths
    s->regs[GT_CPU]           = 0x00000000;
925 fde7d5bd ths
#else
926 bc687ec9 ths
    s->regs[GT_CPU]           = 0x00001000;
927 fde7d5bd ths
#endif
928 30b6f3a8 ths
    s->regs[GT_MULTI]         = 0x00000003;
929 30b6f3a8 ths
930 30b6f3a8 ths
    /* CPU Address decode */
931 30b6f3a8 ths
    s->regs[GT_SCS10LD]       = 0x00000000;
932 30b6f3a8 ths
    s->regs[GT_SCS10HD]       = 0x00000007;
933 30b6f3a8 ths
    s->regs[GT_SCS32LD]       = 0x00000008;
934 30b6f3a8 ths
    s->regs[GT_SCS32HD]       = 0x0000000f;
935 30b6f3a8 ths
    s->regs[GT_CS20LD]        = 0x000000e0;
936 30b6f3a8 ths
    s->regs[GT_CS20HD]        = 0x00000070;
937 30b6f3a8 ths
    s->regs[GT_CS3BOOTLD]     = 0x000000f8;
938 30b6f3a8 ths
    s->regs[GT_CS3BOOTHD]     = 0x0000007f;
939 fde7d5bd ths
940 fde7d5bd ths
    s->regs[GT_PCI0IOLD]      = 0x00000080;
941 fde7d5bd ths
    s->regs[GT_PCI0IOHD]      = 0x0000000f;
942 fde7d5bd ths
    s->regs[GT_PCI0M0LD]      = 0x00000090;
943 fde7d5bd ths
    s->regs[GT_PCI0M0HD]      = 0x0000001f;
944 30b6f3a8 ths
    s->regs[GT_ISD]           = 0x000000a0;
945 fde7d5bd ths
    s->regs[GT_PCI0M1LD]      = 0x00000790;
946 fde7d5bd ths
    s->regs[GT_PCI0M1HD]      = 0x0000001f;
947 fde7d5bd ths
    s->regs[GT_PCI1IOLD]      = 0x00000100;
948 fde7d5bd ths
    s->regs[GT_PCI1IOHD]      = 0x0000000f;
949 fde7d5bd ths
    s->regs[GT_PCI1M0LD]      = 0x00000110;
950 fde7d5bd ths
    s->regs[GT_PCI1M0HD]      = 0x0000001f;
951 fde7d5bd ths
    s->regs[GT_PCI1M1LD]      = 0x00000120;
952 fde7d5bd ths
    s->regs[GT_PCI1M1HD]      = 0x0000002f;
953 30b6f3a8 ths
954 30b6f3a8 ths
    s->regs[GT_SCS10AR]       = 0x00000000;
955 30b6f3a8 ths
    s->regs[GT_SCS32AR]       = 0x00000008;
956 30b6f3a8 ths
    s->regs[GT_CS20R]         = 0x000000e0;
957 30b6f3a8 ths
    s->regs[GT_CS3BOOTR]      = 0x000000f8;
958 30b6f3a8 ths
959 fde7d5bd ths
    s->regs[GT_PCI0IOREMAP]   = 0x00000080;
960 fde7d5bd ths
    s->regs[GT_PCI0M0REMAP]   = 0x00000090;
961 fde7d5bd ths
    s->regs[GT_PCI0M1REMAP]   = 0x00000790;
962 fde7d5bd ths
    s->regs[GT_PCI1IOREMAP]   = 0x00000100;
963 fde7d5bd ths
    s->regs[GT_PCI1M0REMAP]   = 0x00000110;
964 fde7d5bd ths
    s->regs[GT_PCI1M1REMAP]   = 0x00000120;
965 fde7d5bd ths
966 fde7d5bd ths
    /* CPU Error Report */
967 fde7d5bd ths
    s->regs[GT_CPUERR_ADDRLO] = 0x00000000;
968 fde7d5bd ths
    s->regs[GT_CPUERR_ADDRHI] = 0x00000000;
969 fde7d5bd ths
    s->regs[GT_CPUERR_DATALO] = 0xffffffff;
970 fde7d5bd ths
    s->regs[GT_CPUERR_DATAHI] = 0xffffffff;
971 fde7d5bd ths
    s->regs[GT_CPUERR_PARITY] = 0x000000ff;
972 fde7d5bd ths
973 30b6f3a8 ths
    /* CPU Sync Barrier */
974 30b6f3a8 ths
    s->regs[GT_PCI0SYNC]      = 0x00000000;
975 30b6f3a8 ths
    s->regs[GT_PCI1SYNC]      = 0x00000000;
976 30b6f3a8 ths
977 30b6f3a8 ths
    /* SDRAM and Device Address Decode */
978 30b6f3a8 ths
    s->regs[GT_SCS0LD]        = 0x00000000;
979 30b6f3a8 ths
    s->regs[GT_SCS0HD]        = 0x00000007;
980 30b6f3a8 ths
    s->regs[GT_SCS1LD]        = 0x00000008;
981 30b6f3a8 ths
    s->regs[GT_SCS1HD]        = 0x0000000f;
982 30b6f3a8 ths
    s->regs[GT_SCS2LD]        = 0x00000010;
983 30b6f3a8 ths
    s->regs[GT_SCS2HD]        = 0x00000017;
984 30b6f3a8 ths
    s->regs[GT_SCS3LD]        = 0x00000018;
985 30b6f3a8 ths
    s->regs[GT_SCS3HD]        = 0x0000001f;
986 30b6f3a8 ths
    s->regs[GT_CS0LD]         = 0x000000c0;
987 30b6f3a8 ths
    s->regs[GT_CS0HD]         = 0x000000c7;
988 30b6f3a8 ths
    s->regs[GT_CS1LD]         = 0x000000c8;
989 30b6f3a8 ths
    s->regs[GT_CS1HD]         = 0x000000cf;
990 30b6f3a8 ths
    s->regs[GT_CS2LD]         = 0x000000d0;
991 30b6f3a8 ths
    s->regs[GT_CS2HD]         = 0x000000df;
992 30b6f3a8 ths
    s->regs[GT_CS3LD]         = 0x000000f0;
993 30b6f3a8 ths
    s->regs[GT_CS3HD]         = 0x000000fb;
994 30b6f3a8 ths
    s->regs[GT_BOOTLD]        = 0x000000fc;
995 30b6f3a8 ths
    s->regs[GT_BOOTHD]        = 0x000000ff;
996 30b6f3a8 ths
    s->regs[GT_ADERR]         = 0xffffffff;
997 30b6f3a8 ths
998 30b6f3a8 ths
    /* SDRAM Configuration */
999 30b6f3a8 ths
    s->regs[GT_SDRAM_CFG]     = 0x00000200;
1000 30b6f3a8 ths
    s->regs[GT_SDRAM_OPMODE]  = 0x00000000;
1001 30b6f3a8 ths
    s->regs[GT_SDRAM_BM]      = 0x00000007;
1002 30b6f3a8 ths
    s->regs[GT_SDRAM_ADDRDECODE] = 0x00000002;
1003 30b6f3a8 ths
1004 30b6f3a8 ths
    /* SDRAM Parameters */
1005 30b6f3a8 ths
    s->regs[GT_SDRAM_B0]      = 0x00000005;
1006 30b6f3a8 ths
    s->regs[GT_SDRAM_B1]      = 0x00000005;
1007 30b6f3a8 ths
    s->regs[GT_SDRAM_B2]      = 0x00000005;
1008 30b6f3a8 ths
    s->regs[GT_SDRAM_B3]      = 0x00000005;
1009 30b6f3a8 ths
1010 fde7d5bd ths
    /* ECC */
1011 fde7d5bd ths
    s->regs[GT_ECC_ERRDATALO] = 0x00000000;
1012 fde7d5bd ths
    s->regs[GT_ECC_ERRDATAHI] = 0x00000000;
1013 fde7d5bd ths
    s->regs[GT_ECC_MEM]       = 0x00000000;
1014 fde7d5bd ths
    s->regs[GT_ECC_CALC]      = 0x00000000;
1015 fde7d5bd ths
    s->regs[GT_ECC_ERRADDR]   = 0x00000000;
1016 fde7d5bd ths
1017 30b6f3a8 ths
    /* Device Parameters */
1018 30b6f3a8 ths
    s->regs[GT_DEV_B0]        = 0x386fffff;
1019 30b6f3a8 ths
    s->regs[GT_DEV_B1]        = 0x386fffff;
1020 30b6f3a8 ths
    s->regs[GT_DEV_B2]        = 0x386fffff;
1021 30b6f3a8 ths
    s->regs[GT_DEV_B3]        = 0x386fffff;
1022 30b6f3a8 ths
    s->regs[GT_DEV_BOOT]      = 0x146fffff;
1023 0da75eb1 ths
1024 30b6f3a8 ths
    /* DMA registers are all zeroed at reset */
1025 30b6f3a8 ths
1026 30b6f3a8 ths
    /* Timer/Counter */
1027 30b6f3a8 ths
    s->regs[GT_TC0]           = 0xffffffff;
1028 30b6f3a8 ths
    s->regs[GT_TC1]           = 0x00ffffff;
1029 30b6f3a8 ths
    s->regs[GT_TC2]           = 0x00ffffff;
1030 30b6f3a8 ths
    s->regs[GT_TC3]           = 0x00ffffff;
1031 30b6f3a8 ths
    s->regs[GT_TC_CONTROL]    = 0x00000000;
1032 30b6f3a8 ths
1033 30b6f3a8 ths
    /* PCI Internal */
1034 fde7d5bd ths
#ifdef TARGET_WORDS_BIGENDIAN
1035 fde7d5bd ths
    s->regs[GT_PCI0_CMD]      = 0x00000000;
1036 fde7d5bd ths
#else
1037 fde7d5bd ths
    s->regs[GT_PCI0_CMD]      = 0x00010001;
1038 fde7d5bd ths
#endif
1039 30b6f3a8 ths
    s->regs[GT_PCI0_TOR]      = 0x0000070f;
1040 30b6f3a8 ths
    s->regs[GT_PCI0_BS_SCS10] = 0x00fff000;
1041 30b6f3a8 ths
    s->regs[GT_PCI0_BS_SCS32] = 0x00fff000;
1042 30b6f3a8 ths
    s->regs[GT_PCI0_BS_CS20]  = 0x01fff000;
1043 30b6f3a8 ths
    s->regs[GT_PCI0_BS_CS3BT] = 0x00fff000;
1044 fde7d5bd ths
    s->regs[GT_PCI1_IACK]     = 0x00000000;
1045 30b6f3a8 ths
    s->regs[GT_PCI0_IACK]     = 0x00000000;
1046 30b6f3a8 ths
    s->regs[GT_PCI0_BARE]     = 0x0000000f;
1047 30b6f3a8 ths
    s->regs[GT_PCI0_PREFMBR]  = 0x00000040;
1048 30b6f3a8 ths
    s->regs[GT_PCI0_SCS10_BAR] = 0x00000000;
1049 30b6f3a8 ths
    s->regs[GT_PCI0_SCS32_BAR] = 0x01000000;
1050 30b6f3a8 ths
    s->regs[GT_PCI0_CS20_BAR] = 0x1c000000;
1051 30b6f3a8 ths
    s->regs[GT_PCI0_CS3BT_BAR] = 0x1f000000;
1052 30b6f3a8 ths
    s->regs[GT_PCI0_SSCS10_BAR] = 0x00000000;
1053 30b6f3a8 ths
    s->regs[GT_PCI0_SSCS32_BAR] = 0x01000000;
1054 30b6f3a8 ths
    s->regs[GT_PCI0_SCS3BT_BAR] = 0x1f000000;
1055 30b6f3a8 ths
#ifdef TARGET_WORDS_BIGENDIAN
1056 30b6f3a8 ths
    s->regs[GT_PCI1_CMD]      = 0x00000000;
1057 30b6f3a8 ths
#else
1058 30b6f3a8 ths
    s->regs[GT_PCI1_CMD]      = 0x00010001;
1059 30b6f3a8 ths
#endif
1060 30b6f3a8 ths
    s->regs[GT_PCI1_TOR]      = 0x0000070f;
1061 30b6f3a8 ths
    s->regs[GT_PCI1_BS_SCS10] = 0x00fff000;
1062 30b6f3a8 ths
    s->regs[GT_PCI1_BS_SCS32] = 0x00fff000;
1063 30b6f3a8 ths
    s->regs[GT_PCI1_BS_CS20]  = 0x01fff000;
1064 30b6f3a8 ths
    s->regs[GT_PCI1_BS_CS3BT] = 0x00fff000;
1065 30b6f3a8 ths
    s->regs[GT_PCI1_BARE]     = 0x0000000f;
1066 30b6f3a8 ths
    s->regs[GT_PCI1_PREFMBR]  = 0x00000040;
1067 30b6f3a8 ths
    s->regs[GT_PCI1_SCS10_BAR] = 0x00000000;
1068 30b6f3a8 ths
    s->regs[GT_PCI1_SCS32_BAR] = 0x01000000;
1069 30b6f3a8 ths
    s->regs[GT_PCI1_CS20_BAR] = 0x1c000000;
1070 30b6f3a8 ths
    s->regs[GT_PCI1_CS3BT_BAR] = 0x1f000000;
1071 30b6f3a8 ths
    s->regs[GT_PCI1_SSCS10_BAR] = 0x00000000;
1072 30b6f3a8 ths
    s->regs[GT_PCI1_SSCS32_BAR] = 0x01000000;
1073 30b6f3a8 ths
    s->regs[GT_PCI1_SCS3BT_BAR] = 0x1f000000;
1074 30b6f3a8 ths
    s->regs[GT_PCI1_CFGADDR]  = 0x00000000;
1075 30b6f3a8 ths
    s->regs[GT_PCI1_CFGDATA]  = 0x00000000;
1076 30b6f3a8 ths
    s->regs[GT_PCI0_CFGADDR]  = 0x00000000;
1077 30b6f3a8 ths
1078 30b6f3a8 ths
    /* Interrupt registers are all zeroed at reset */
1079 fde7d5bd ths
1080 a0a8793e ths
    gt64120_isd_mapping(s);
1081 9414cc6f ths
    gt64120_pci_mapping(s);
1082 fde7d5bd ths
}
1083 fde7d5bd ths
1084 c2dd2a23 Aurelien Jarno
PCIBus *gt64120_register(qemu_irq *pic)
1085 c2dd2a23 Aurelien Jarno
{
1086 c2dd2a23 Aurelien Jarno
    SysBusDevice *s;
1087 c2dd2a23 Aurelien Jarno
    GT64120State *d;
1088 c2dd2a23 Aurelien Jarno
    DeviceState *dev;
1089 c2dd2a23 Aurelien Jarno
1090 c2dd2a23 Aurelien Jarno
    dev = qdev_create(NULL, "gt64120");
1091 c2dd2a23 Aurelien Jarno
    qdev_init_nofail(dev);
1092 c2dd2a23 Aurelien Jarno
    s = sysbus_from_qdev(dev);
1093 c2dd2a23 Aurelien Jarno
    d = FROM_SYSBUS(GT64120State, s);
1094 c2dd2a23 Aurelien Jarno
    d->pci.bus = pci_register_bus(&d->busdev.qdev, "pci",
1095 c2dd2a23 Aurelien Jarno
                                  gt64120_pci_set_irq, gt64120_pci_map_irq,
1096 aee97b84 Avi Kivity
                                  pic,
1097 aee97b84 Avi Kivity
                                  get_system_memory(),
1098 aee97b84 Avi Kivity
                                  get_system_io(),
1099 1e39101c Avi Kivity
                                  PCI_DEVFN(18, 0), 4);
1100 fc2bf449 Avi Kivity
    memory_region_init_io(&d->ISD_mem, &isd_mem_ops, d, "isd-mem", 0x1000);
1101 c2dd2a23 Aurelien Jarno
1102 c2dd2a23 Aurelien Jarno
    pci_create_simple(d->pci.bus, PCI_DEVFN(0, 0), "gt64120_pci");
1103 c2dd2a23 Aurelien Jarno
    return d->pci.bus;
1104 c2dd2a23 Aurelien Jarno
}
1105 c2dd2a23 Aurelien Jarno
1106 c2dd2a23 Aurelien Jarno
static int gt64120_init(SysBusDevice *dev)
1107 fde7d5bd ths
{
1108 fde7d5bd ths
    GT64120State *s;
1109 fde7d5bd ths
1110 c2dd2a23 Aurelien Jarno
    s = FROM_SYSBUS(GT64120State, dev);
1111 9414cc6f ths
1112 8e5977e5 Aurelien Jarno
    /* FIXME: This value is computed from registers during reset, but some
1113 8e5977e5 Aurelien Jarno
       devices (e.g. VGA card) need to know it when they are registered.
1114 8e5977e5 Aurelien Jarno
       This also mean that changing the register to change the mapping
1115 8e5977e5 Aurelien Jarno
       does not fully work. */
1116 8e5977e5 Aurelien Jarno
    isa_mem_base = 0x10000000;
1117 c2dd2a23 Aurelien Jarno
    qemu_register_reset(gt64120_reset, s);
1118 c2dd2a23 Aurelien Jarno
    return 0;
1119 c2dd2a23 Aurelien Jarno
}
1120 fde7d5bd ths
1121 c2dd2a23 Aurelien Jarno
static int gt64120_pci_init(PCIDevice *d)
1122 c2dd2a23 Aurelien Jarno
{
1123 0f78cf0c ths
    /* FIXME: Malta specific hw assumptions ahead */
1124 c2dd2a23 Aurelien Jarno
    pci_set_word(d->config + PCI_COMMAND, 0);
1125 c2dd2a23 Aurelien Jarno
    pci_set_word(d->config + PCI_STATUS,
1126 c2dd2a23 Aurelien Jarno
                 PCI_STATUS_FAST_BACK | PCI_STATUS_DEVSEL_MEDIUM);
1127 c2dd2a23 Aurelien Jarno
    pci_config_set_prog_interface(d->config, 0);
1128 c2dd2a23 Aurelien Jarno
    pci_set_long(d->config + PCI_BASE_ADDRESS_0, 0x00000008);
1129 c2dd2a23 Aurelien Jarno
    pci_set_long(d->config + PCI_BASE_ADDRESS_1, 0x01000008);
1130 c2dd2a23 Aurelien Jarno
    pci_set_long(d->config + PCI_BASE_ADDRESS_2, 0x1c000000);
1131 c2dd2a23 Aurelien Jarno
    pci_set_long(d->config + PCI_BASE_ADDRESS_3, 0x1f000000);
1132 c2dd2a23 Aurelien Jarno
    pci_set_long(d->config + PCI_BASE_ADDRESS_4, 0x14000000);
1133 c2dd2a23 Aurelien Jarno
    pci_set_long(d->config + PCI_BASE_ADDRESS_5, 0x14000001);
1134 c2dd2a23 Aurelien Jarno
    pci_set_byte(d->config + 0x3d, 0x01);
1135 0f78cf0c ths
1136 c2dd2a23 Aurelien Jarno
    return 0;
1137 c2dd2a23 Aurelien Jarno
}
1138 a0a8793e ths
1139 40021f08 Anthony Liguori
static void gt64120_pci_class_init(ObjectClass *klass, void *data)
1140 40021f08 Anthony Liguori
{
1141 40021f08 Anthony Liguori
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1142 40021f08 Anthony Liguori
1143 40021f08 Anthony Liguori
    k->init = gt64120_pci_init;
1144 40021f08 Anthony Liguori
    k->vendor_id = PCI_VENDOR_ID_MARVELL;
1145 40021f08 Anthony Liguori
    k->device_id = PCI_DEVICE_ID_MARVELL_GT6412X;
1146 40021f08 Anthony Liguori
    k->revision = 0x10;
1147 40021f08 Anthony Liguori
    k->class_id = PCI_CLASS_BRIDGE_HOST;
1148 40021f08 Anthony Liguori
}
1149 40021f08 Anthony Liguori
1150 39bffca2 Anthony Liguori
static TypeInfo gt64120_pci_info = {
1151 39bffca2 Anthony Liguori
    .name          = "gt64120_pci",
1152 39bffca2 Anthony Liguori
    .parent        = TYPE_PCI_DEVICE,
1153 39bffca2 Anthony Liguori
    .instance_size = sizeof(PCIDevice),
1154 39bffca2 Anthony Liguori
    .class_init    = gt64120_pci_class_init,
1155 c2dd2a23 Aurelien Jarno
};
1156 1823082c ths
1157 999e12bb Anthony Liguori
static void gt64120_class_init(ObjectClass *klass, void *data)
1158 999e12bb Anthony Liguori
{
1159 999e12bb Anthony Liguori
    SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
1160 999e12bb Anthony Liguori
1161 999e12bb Anthony Liguori
    sdc->init = gt64120_init;
1162 999e12bb Anthony Liguori
}
1163 999e12bb Anthony Liguori
1164 39bffca2 Anthony Liguori
static TypeInfo gt64120_info = {
1165 39bffca2 Anthony Liguori
    .name          = "gt64120",
1166 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
1167 39bffca2 Anthony Liguori
    .instance_size = sizeof(GT64120State),
1168 39bffca2 Anthony Liguori
    .class_init    = gt64120_class_init,
1169 999e12bb Anthony Liguori
};
1170 999e12bb Anthony Liguori
1171 83f7d43a Andreas Färber
static void gt64120_pci_register_types(void)
1172 c2dd2a23 Aurelien Jarno
{
1173 39bffca2 Anthony Liguori
    type_register_static(&gt64120_info);
1174 39bffca2 Anthony Liguori
    type_register_static(&gt64120_pci_info);
1175 fde7d5bd ths
}
1176 c2dd2a23 Aurelien Jarno
1177 83f7d43a Andreas Färber
type_init(gt64120_pci_register_types)