iotests: Drop readlink -f
[qemu/ar7.git] / hw / pci-host / bonito.c
blobd10fbd39d35a21dfa06b2db1d4da616bdff9b80d
1 /*
2 * bonito north bridge support
4 * Copyright (c) 2008 yajin (yajin@vm-kernel.org)
5 * Copyright (c) 2010 Huacai Chen (zltjiangshi@gmail.com)
7 * This code is licensed under the GNU GPL v2.
9 * Contributions after 2012-01-13 are licensed under the terms of the
10 * GNU GPL, version 2 or (at your option) any later version.
14 * fuloong 2e mini pc has a bonito north bridge.
18 * what is the meaning of devfn in qemu and IDSEL in bonito northbridge?
20 * devfn pci_slot<<3 + funno
21 * one pci bus can have 32 devices and each device can have 8 functions.
23 * In bonito north bridge, pci slot = IDSEL bit - 12.
24 * For example, PCI_IDSEL_VIA686B = 17,
25 * pci slot = 17-12=5
27 * so
28 * VT686B_FUN0's devfn = (5<<3)+0
29 * VT686B_FUN1's devfn = (5<<3)+1
31 * qemu also uses pci address for north bridge to access pci config register.
32 * bus_no [23:16]
33 * dev_no [15:11]
34 * fun_no [10:8]
35 * reg_no [7:2]
37 * so function bonito_sbridge_pciaddr for the translation from
38 * north bridge address to pci address.
41 #include "qemu/osdep.h"
42 #include "qemu/units.h"
43 #include "qapi/error.h"
44 #include "qemu/error-report.h"
45 #include "hw/pci/pci.h"
46 #include "hw/irq.h"
47 #include "hw/mips/mips.h"
48 #include "hw/pci/pci_host.h"
49 #include "migration/vmstate.h"
50 #include "sysemu/reset.h"
51 #include "sysemu/runstate.h"
52 #include "exec/address-spaces.h"
53 #include "hw/misc/unimp.h"
54 #include "hw/registerfields.h"
55 #include "qom/object.h"
57 /* #define DEBUG_BONITO */
59 #ifdef DEBUG_BONITO
60 #define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__)
61 #else
62 #define DPRINTF(fmt, ...)
63 #endif
65 /* from linux soure code. include/asm-mips/mips-boards/bonito64.h*/
66 #define BONITO_BOOT_BASE 0x1fc00000
67 #define BONITO_BOOT_SIZE 0x00100000
68 #define BONITO_BOOT_TOP (BONITO_BOOT_BASE + BONITO_BOOT_SIZE - 1)
69 #define BONITO_FLASH_BASE 0x1c000000
70 #define BONITO_FLASH_SIZE 0x03000000
71 #define BONITO_FLASH_TOP (BONITO_FLASH_BASE + BONITO_FLASH_SIZE - 1)
72 #define BONITO_SOCKET_BASE 0x1f800000
73 #define BONITO_SOCKET_SIZE 0x00400000
74 #define BONITO_SOCKET_TOP (BONITO_SOCKET_BASE + BONITO_SOCKET_SIZE - 1)
75 #define BONITO_REG_BASE 0x1fe00000
76 #define BONITO_REG_SIZE 0x00040000
77 #define BONITO_REG_TOP (BONITO_REG_BASE + BONITO_REG_SIZE - 1)
78 #define BONITO_DEV_BASE 0x1ff00000
79 #define BONITO_DEV_SIZE 0x00100000
80 #define BONITO_DEV_TOP (BONITO_DEV_BASE + BONITO_DEV_SIZE - 1)
81 #define BONITO_PCILO_BASE 0x10000000
82 #define BONITO_PCILO_BASE_VA 0xb0000000
83 #define BONITO_PCILO_SIZE 0x0c000000
84 #define BONITO_PCILO_TOP (BONITO_PCILO_BASE + BONITO_PCILO_SIZE - 1)
85 #define BONITO_PCILO0_BASE 0x10000000
86 #define BONITO_PCILO1_BASE 0x14000000
87 #define BONITO_PCILO2_BASE 0x18000000
88 #define BONITO_PCIHI_BASE 0x20000000
89 #define BONITO_PCIHI_SIZE 0x60000000
90 #define BONITO_PCIHI_TOP (BONITO_PCIHI_BASE + BONITO_PCIHI_SIZE - 1)
91 #define BONITO_PCIIO_BASE 0x1fd00000
92 #define BONITO_PCIIO_BASE_VA 0xbfd00000
93 #define BONITO_PCIIO_SIZE 0x00010000
94 #define BONITO_PCIIO_TOP (BONITO_PCIIO_BASE + BONITO_PCIIO_SIZE - 1)
95 #define BONITO_PCICFG_BASE 0x1fe80000
96 #define BONITO_PCICFG_SIZE 0x00080000
97 #define BONITO_PCICFG_TOP (BONITO_PCICFG_BASE + BONITO_PCICFG_SIZE - 1)
100 #define BONITO_PCICONFIGBASE 0x00
101 #define BONITO_REGBASE 0x100
103 #define BONITO_PCICONFIG_BASE (BONITO_PCICONFIGBASE + BONITO_REG_BASE)
104 #define BONITO_PCICONFIG_SIZE (0x100)
106 #define BONITO_INTERNAL_REG_BASE (BONITO_REGBASE + BONITO_REG_BASE)
107 #define BONITO_INTERNAL_REG_SIZE (0x70)
109 #define BONITO_SPCICONFIG_BASE (BONITO_PCICFG_BASE)
110 #define BONITO_SPCICONFIG_SIZE (BONITO_PCICFG_SIZE)
114 /* 1. Bonito h/w Configuration */
115 /* Power on register */
117 #define BONITO_BONPONCFG (0x00 >> 2) /* 0x100 */
119 /* PCI configuration register */
120 #define BONITO_BONGENCFG_OFFSET 0x4
121 #define BONITO_BONGENCFG (BONITO_BONGENCFG_OFFSET >> 2) /*0x104 */
122 REG32(BONGENCFG, 0x104)
123 FIELD(BONGENCFG, DEBUGMODE, 0, 1)
124 FIELD(BONGENCFG, SNOOP, 1, 1)
125 FIELD(BONGENCFG, CPUSELFRESET, 2, 1)
126 FIELD(BONGENCFG, BYTESWAP, 6, 1)
127 FIELD(BONGENCFG, UNCACHED, 7, 1)
128 FIELD(BONGENCFG, PREFETCH, 8, 1)
129 FIELD(BONGENCFG, WRITEBEHIND, 9, 1)
130 FIELD(BONGENCFG, PCIQUEUE, 12, 1)
132 /* 2. IO & IDE configuration */
133 #define BONITO_IODEVCFG (0x08 >> 2) /* 0x108 */
135 /* 3. IO & IDE configuration */
136 #define BONITO_SDCFG (0x0c >> 2) /* 0x10c */
138 /* 4. PCI address map control */
139 #define BONITO_PCIMAP (0x10 >> 2) /* 0x110 */
140 #define BONITO_PCIMEMBASECFG (0x14 >> 2) /* 0x114 */
141 #define BONITO_PCIMAP_CFG (0x18 >> 2) /* 0x118 */
143 /* 5. ICU & GPIO regs */
144 /* GPIO Regs - r/w */
145 #define BONITO_GPIODATA_OFFSET 0x1c
146 #define BONITO_GPIODATA (BONITO_GPIODATA_OFFSET >> 2) /* 0x11c */
147 #define BONITO_GPIOIE (0x20 >> 2) /* 0x120 */
149 /* ICU Configuration Regs - r/w */
150 #define BONITO_INTEDGE (0x24 >> 2) /* 0x124 */
151 #define BONITO_INTSTEER (0x28 >> 2) /* 0x128 */
152 #define BONITO_INTPOL (0x2c >> 2) /* 0x12c */
154 /* ICU Enable Regs - IntEn & IntISR are r/o. */
155 #define BONITO_INTENSET (0x30 >> 2) /* 0x130 */
156 #define BONITO_INTENCLR (0x34 >> 2) /* 0x134 */
157 #define BONITO_INTEN (0x38 >> 2) /* 0x138 */
158 #define BONITO_INTISR (0x3c >> 2) /* 0x13c */
160 /* PCI mail boxes */
161 #define BONITO_PCIMAIL0_OFFSET 0x40
162 #define BONITO_PCIMAIL1_OFFSET 0x44
163 #define BONITO_PCIMAIL2_OFFSET 0x48
164 #define BONITO_PCIMAIL3_OFFSET 0x4c
165 #define BONITO_PCIMAIL0 (0x40 >> 2) /* 0x140 */
166 #define BONITO_PCIMAIL1 (0x44 >> 2) /* 0x144 */
167 #define BONITO_PCIMAIL2 (0x48 >> 2) /* 0x148 */
168 #define BONITO_PCIMAIL3 (0x4c >> 2) /* 0x14c */
170 /* 6. PCI cache */
171 #define BONITO_PCICACHECTRL (0x50 >> 2) /* 0x150 */
172 #define BONITO_PCICACHETAG (0x54 >> 2) /* 0x154 */
173 #define BONITO_PCIBADADDR (0x58 >> 2) /* 0x158 */
174 #define BONITO_PCIMSTAT (0x5c >> 2) /* 0x15c */
176 /* 7. other*/
177 #define BONITO_TIMECFG (0x60 >> 2) /* 0x160 */
178 #define BONITO_CPUCFG (0x64 >> 2) /* 0x164 */
179 #define BONITO_DQCFG (0x68 >> 2) /* 0x168 */
180 #define BONITO_MEMSIZE (0x6C >> 2) /* 0x16c */
182 #define BONITO_REGS (0x70 >> 2)
184 /* PCI config for south bridge. type 0 */
185 #define BONITO_PCICONF_IDSEL_MASK 0xfffff800 /* [31:11] */
186 #define BONITO_PCICONF_IDSEL_OFFSET 11
187 #define BONITO_PCICONF_FUN_MASK 0x700 /* [10:8] */
188 #define BONITO_PCICONF_FUN_OFFSET 8
189 #define BONITO_PCICONF_REG_MASK 0xFC
190 #define BONITO_PCICONF_REG_OFFSET 0
193 /* idsel BIT = pci slot number +12 */
194 #define PCI_SLOT_BASE 12
195 #define PCI_IDSEL_VIA686B_BIT (17)
196 #define PCI_IDSEL_VIA686B (1 << PCI_IDSEL_VIA686B_BIT)
198 #define PCI_ADDR(busno , devno , funno , regno) \
199 ((((busno) << 16) & 0xff0000) + (((devno) << 11) & 0xf800) + \
200 (((funno) << 8) & 0x700) + (regno))
202 typedef struct BonitoState BonitoState;
204 struct PCIBonitoState {
205 PCIDevice dev;
207 BonitoState *pcihost;
208 uint32_t regs[BONITO_REGS];
210 struct bonldma {
211 uint32_t ldmactrl;
212 uint32_t ldmastat;
213 uint32_t ldmaaddr;
214 uint32_t ldmago;
215 } bonldma;
217 /* Based at 1fe00300, bonito Copier */
218 struct boncop {
219 uint32_t copctrl;
220 uint32_t copstat;
221 uint32_t coppaddr;
222 uint32_t copgo;
223 } boncop;
225 /* Bonito registers */
226 MemoryRegion iomem;
227 MemoryRegion iomem_ldma;
228 MemoryRegion iomem_cop;
229 MemoryRegion bonito_pciio;
230 MemoryRegion bonito_localio;
233 typedef struct PCIBonitoState PCIBonitoState;
235 struct BonitoState {
236 PCIHostState parent_obj;
237 qemu_irq *pic;
238 PCIBonitoState *pci_dev;
239 MemoryRegion pci_mem;
242 #define TYPE_BONITO_PCI_HOST_BRIDGE "Bonito-pcihost"
243 DECLARE_INSTANCE_CHECKER(BonitoState, BONITO_PCI_HOST_BRIDGE,
244 TYPE_BONITO_PCI_HOST_BRIDGE)
246 #define TYPE_PCI_BONITO "Bonito"
247 DECLARE_INSTANCE_CHECKER(PCIBonitoState, PCI_BONITO,
248 TYPE_PCI_BONITO)
250 static void bonito_writel(void *opaque, hwaddr addr,
251 uint64_t val, unsigned size)
253 PCIBonitoState *s = opaque;
254 uint32_t saddr;
255 int reset = 0;
257 saddr = addr >> 2;
259 DPRINTF("bonito_writel "TARGET_FMT_plx" val %lx saddr %x\n",
260 addr, val, saddr);
261 switch (saddr) {
262 case BONITO_BONPONCFG:
263 case BONITO_IODEVCFG:
264 case BONITO_SDCFG:
265 case BONITO_PCIMAP:
266 case BONITO_PCIMEMBASECFG:
267 case BONITO_PCIMAP_CFG:
268 case BONITO_GPIODATA:
269 case BONITO_GPIOIE:
270 case BONITO_INTEDGE:
271 case BONITO_INTSTEER:
272 case BONITO_INTPOL:
273 case BONITO_PCIMAIL0:
274 case BONITO_PCIMAIL1:
275 case BONITO_PCIMAIL2:
276 case BONITO_PCIMAIL3:
277 case BONITO_PCICACHECTRL:
278 case BONITO_PCICACHETAG:
279 case BONITO_PCIBADADDR:
280 case BONITO_PCIMSTAT:
281 case BONITO_TIMECFG:
282 case BONITO_CPUCFG:
283 case BONITO_DQCFG:
284 case BONITO_MEMSIZE:
285 s->regs[saddr] = val;
286 break;
287 case BONITO_BONGENCFG:
288 if (!(s->regs[saddr] & 0x04) && (val & 0x04)) {
289 reset = 1; /* bit 2 jump from 0 to 1 cause reset */
291 s->regs[saddr] = val;
292 if (reset) {
293 qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
295 break;
296 case BONITO_INTENSET:
297 s->regs[BONITO_INTENSET] = val;
298 s->regs[BONITO_INTEN] |= val;
299 break;
300 case BONITO_INTENCLR:
301 s->regs[BONITO_INTENCLR] = val;
302 s->regs[BONITO_INTEN] &= ~val;
303 break;
304 case BONITO_INTEN:
305 case BONITO_INTISR:
306 DPRINTF("write to readonly bonito register %x\n", saddr);
307 break;
308 default:
309 DPRINTF("write to unknown bonito register %x\n", saddr);
310 break;
314 static uint64_t bonito_readl(void *opaque, hwaddr addr,
315 unsigned size)
317 PCIBonitoState *s = opaque;
318 uint32_t saddr;
320 saddr = addr >> 2;
322 DPRINTF("bonito_readl "TARGET_FMT_plx"\n", addr);
323 switch (saddr) {
324 case BONITO_INTISR:
325 return s->regs[saddr];
326 default:
327 return s->regs[saddr];
331 static const MemoryRegionOps bonito_ops = {
332 .read = bonito_readl,
333 .write = bonito_writel,
334 .endianness = DEVICE_NATIVE_ENDIAN,
335 .valid = {
336 .min_access_size = 4,
337 .max_access_size = 4,
341 static void bonito_pciconf_writel(void *opaque, hwaddr addr,
342 uint64_t val, unsigned size)
344 PCIBonitoState *s = opaque;
345 PCIDevice *d = PCI_DEVICE(s);
347 DPRINTF("bonito_pciconf_writel "TARGET_FMT_plx" val %lx\n", addr, val);
348 d->config_write(d, addr, val, 4);
351 static uint64_t bonito_pciconf_readl(void *opaque, hwaddr addr,
352 unsigned size)
355 PCIBonitoState *s = opaque;
356 PCIDevice *d = PCI_DEVICE(s);
358 DPRINTF("bonito_pciconf_readl "TARGET_FMT_plx"\n", addr);
359 return d->config_read(d, addr, 4);
362 /* north bridge PCI configure space. 0x1fe0 0000 - 0x1fe0 00ff */
364 static const MemoryRegionOps bonito_pciconf_ops = {
365 .read = bonito_pciconf_readl,
366 .write = bonito_pciconf_writel,
367 .endianness = DEVICE_NATIVE_ENDIAN,
368 .valid = {
369 .min_access_size = 4,
370 .max_access_size = 4,
374 static uint64_t bonito_ldma_readl(void *opaque, hwaddr addr,
375 unsigned size)
377 uint32_t val;
378 PCIBonitoState *s = opaque;
380 if (addr >= sizeof(s->bonldma)) {
381 return 0;
384 val = ((uint32_t *)(&s->bonldma))[addr / sizeof(uint32_t)];
386 return val;
389 static void bonito_ldma_writel(void *opaque, hwaddr addr,
390 uint64_t val, unsigned size)
392 PCIBonitoState *s = opaque;
394 if (addr >= sizeof(s->bonldma)) {
395 return;
398 ((uint32_t *)(&s->bonldma))[addr / sizeof(uint32_t)] = val & 0xffffffff;
401 static const MemoryRegionOps bonito_ldma_ops = {
402 .read = bonito_ldma_readl,
403 .write = bonito_ldma_writel,
404 .endianness = DEVICE_NATIVE_ENDIAN,
405 .valid = {
406 .min_access_size = 4,
407 .max_access_size = 4,
411 static uint64_t bonito_cop_readl(void *opaque, hwaddr addr,
412 unsigned size)
414 uint32_t val;
415 PCIBonitoState *s = opaque;
417 if (addr >= sizeof(s->boncop)) {
418 return 0;
421 val = ((uint32_t *)(&s->boncop))[addr / sizeof(uint32_t)];
423 return val;
426 static void bonito_cop_writel(void *opaque, hwaddr addr,
427 uint64_t val, unsigned size)
429 PCIBonitoState *s = opaque;
431 if (addr >= sizeof(s->boncop)) {
432 return;
435 ((uint32_t *)(&s->boncop))[addr / sizeof(uint32_t)] = val & 0xffffffff;
438 static const MemoryRegionOps bonito_cop_ops = {
439 .read = bonito_cop_readl,
440 .write = bonito_cop_writel,
441 .endianness = DEVICE_NATIVE_ENDIAN,
442 .valid = {
443 .min_access_size = 4,
444 .max_access_size = 4,
448 static uint32_t bonito_sbridge_pciaddr(void *opaque, hwaddr addr)
450 PCIBonitoState *s = opaque;
451 PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
452 uint32_t cfgaddr;
453 uint32_t idsel;
454 uint32_t devno;
455 uint32_t funno;
456 uint32_t regno;
457 uint32_t pciaddr;
459 /* support type0 pci config */
460 if ((s->regs[BONITO_PCIMAP_CFG] & 0x10000) != 0x0) {
461 return 0xffffffff;
464 cfgaddr = addr & 0xffff;
465 cfgaddr |= (s->regs[BONITO_PCIMAP_CFG] & 0xffff) << 16;
467 idsel = (cfgaddr & BONITO_PCICONF_IDSEL_MASK) >>
468 BONITO_PCICONF_IDSEL_OFFSET;
469 devno = ctz32(idsel);
470 funno = (cfgaddr & BONITO_PCICONF_FUN_MASK) >> BONITO_PCICONF_FUN_OFFSET;
471 regno = (cfgaddr & BONITO_PCICONF_REG_MASK) >> BONITO_PCICONF_REG_OFFSET;
473 if (idsel == 0) {
474 error_report("error in bonito pci config address " TARGET_FMT_plx
475 ",pcimap_cfg=%x", addr, s->regs[BONITO_PCIMAP_CFG]);
476 exit(1);
478 pciaddr = PCI_ADDR(pci_bus_num(phb->bus), devno, funno, regno);
479 DPRINTF("cfgaddr %x pciaddr %x busno %x devno %d funno %d regno %d\n",
480 cfgaddr, pciaddr, pci_bus_num(phb->bus), devno, funno, regno);
482 return pciaddr;
485 static void bonito_spciconf_write(void *opaque, hwaddr addr, uint64_t val,
486 unsigned size)
488 PCIBonitoState *s = opaque;
489 PCIDevice *d = PCI_DEVICE(s);
490 PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
491 uint32_t pciaddr;
492 uint16_t status;
494 DPRINTF("bonito_spciconf_write "TARGET_FMT_plx" size %d val %lx\n",
495 addr, size, val);
497 pciaddr = bonito_sbridge_pciaddr(s, addr);
499 if (pciaddr == 0xffffffff) {
500 return;
503 /* set the pci address in s->config_reg */
504 phb->config_reg = (pciaddr) | (1u << 31);
505 pci_data_write(phb->bus, phb->config_reg, val, size);
507 /* clear PCI_STATUS_REC_MASTER_ABORT and PCI_STATUS_REC_TARGET_ABORT */
508 status = pci_get_word(d->config + PCI_STATUS);
509 status &= ~(PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT);
510 pci_set_word(d->config + PCI_STATUS, status);
513 static uint64_t bonito_spciconf_read(void *opaque, hwaddr addr, unsigned size)
515 PCIBonitoState *s = opaque;
516 PCIDevice *d = PCI_DEVICE(s);
517 PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
518 uint32_t pciaddr;
519 uint16_t status;
521 DPRINTF("bonito_spciconf_read "TARGET_FMT_plx" size %d\n", addr, size);
523 pciaddr = bonito_sbridge_pciaddr(s, addr);
525 if (pciaddr == 0xffffffff) {
526 return MAKE_64BIT_MASK(0, size * 8);
529 /* set the pci address in s->config_reg */
530 phb->config_reg = (pciaddr) | (1u << 31);
532 /* clear PCI_STATUS_REC_MASTER_ABORT and PCI_STATUS_REC_TARGET_ABORT */
533 status = pci_get_word(d->config + PCI_STATUS);
534 status &= ~(PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT);
535 pci_set_word(d->config + PCI_STATUS, status);
537 return pci_data_read(phb->bus, phb->config_reg, size);
540 /* south bridge PCI configure space. 0x1fe8 0000 - 0x1fef ffff */
541 static const MemoryRegionOps bonito_spciconf_ops = {
542 .read = bonito_spciconf_read,
543 .write = bonito_spciconf_write,
544 .valid.min_access_size = 1,
545 .valid.max_access_size = 4,
546 .impl.min_access_size = 1,
547 .impl.max_access_size = 4,
548 .endianness = DEVICE_NATIVE_ENDIAN,
551 #define BONITO_IRQ_BASE 32
553 static void pci_bonito_set_irq(void *opaque, int irq_num, int level)
555 BonitoState *s = opaque;
556 qemu_irq *pic = s->pic;
557 PCIBonitoState *bonito_state = s->pci_dev;
558 int internal_irq = irq_num - BONITO_IRQ_BASE;
560 if (bonito_state->regs[BONITO_INTEDGE] & (1 << internal_irq)) {
561 qemu_irq_pulse(*pic);
562 } else { /* level triggered */
563 if (bonito_state->regs[BONITO_INTPOL] & (1 << internal_irq)) {
564 qemu_irq_raise(*pic);
565 } else {
566 qemu_irq_lower(*pic);
571 /* map the original irq (0~3) to bonito irq (16~47, but 16~31 are unused) */
572 static int pci_bonito_map_irq(PCIDevice *pci_dev, int irq_num)
574 int slot;
576 slot = (pci_dev->devfn >> 3);
578 switch (slot) {
579 case 5: /* FULOONG2E_VIA_SLOT, SouthBridge, IDE, USB, ACPI, AC97, MC97 */
580 return irq_num % 4 + BONITO_IRQ_BASE;
581 case 6: /* FULOONG2E_ATI_SLOT, VGA */
582 return 4 + BONITO_IRQ_BASE;
583 case 7: /* FULOONG2E_RTL_SLOT, RTL8139 */
584 return 5 + BONITO_IRQ_BASE;
585 case 8 ... 12: /* PCI slot 1 to 4 */
586 return (slot - 8 + irq_num) + 6 + BONITO_IRQ_BASE;
587 default: /* Unknown device, don't do any translation */
588 return irq_num;
592 static void bonito_reset(void *opaque)
594 PCIBonitoState *s = opaque;
595 uint32_t val = 0;
597 /* set the default value of north bridge registers */
599 s->regs[BONITO_BONPONCFG] = 0xc40;
600 val = FIELD_DP32(val, BONGENCFG, PCIQUEUE, 1);
601 val = FIELD_DP32(val, BONGENCFG, WRITEBEHIND, 1);
602 val = FIELD_DP32(val, BONGENCFG, PREFETCH, 1);
603 val = FIELD_DP32(val, BONGENCFG, UNCACHED, 1);
604 val = FIELD_DP32(val, BONGENCFG, CPUSELFRESET, 1);
605 s->regs[BONITO_BONGENCFG] = val;
607 s->regs[BONITO_IODEVCFG] = 0x2bff8010;
608 s->regs[BONITO_SDCFG] = 0x255e0091;
610 s->regs[BONITO_GPIODATA] = 0x1ff;
611 s->regs[BONITO_GPIOIE] = 0x1ff;
612 s->regs[BONITO_DQCFG] = 0x8;
613 s->regs[BONITO_MEMSIZE] = 0x10000000;
614 s->regs[BONITO_PCIMAP] = 0x6140;
617 static const VMStateDescription vmstate_bonito = {
618 .name = "Bonito",
619 .version_id = 1,
620 .minimum_version_id = 1,
621 .fields = (VMStateField[]) {
622 VMSTATE_PCI_DEVICE(dev, PCIBonitoState),
623 VMSTATE_END_OF_LIST()
627 static void bonito_pcihost_realize(DeviceState *dev, Error **errp)
629 PCIHostState *phb = PCI_HOST_BRIDGE(dev);
630 BonitoState *bs = BONITO_PCI_HOST_BRIDGE(dev);
631 MemoryRegion *pcimem_lo_alias = g_new(MemoryRegion, 3);
633 memory_region_init(&bs->pci_mem, OBJECT(dev), "pci.mem", BONITO_PCIHI_SIZE);
634 phb->bus = pci_register_root_bus(dev, "pci",
635 pci_bonito_set_irq, pci_bonito_map_irq,
636 dev, &bs->pci_mem, get_system_io(),
637 0x28, 32, TYPE_PCI_BUS);
639 for (size_t i = 0; i < 3; i++) {
640 char *name = g_strdup_printf("pci.lomem%zu", i);
642 memory_region_init_alias(&pcimem_lo_alias[i], NULL, name,
643 &bs->pci_mem, i * 64 * MiB, 64 * MiB);
644 memory_region_add_subregion(get_system_memory(),
645 BONITO_PCILO_BASE + i * 64 * MiB,
646 &pcimem_lo_alias[i]);
647 g_free(name);
650 create_unimplemented_device("pci.io", BONITO_PCIIO_BASE, 1 * MiB);
653 static void bonito_realize(PCIDevice *dev, Error **errp)
655 PCIBonitoState *s = PCI_BONITO(dev);
656 SysBusDevice *sysbus = SYS_BUS_DEVICE(s->pcihost);
657 PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
658 BonitoState *bs = BONITO_PCI_HOST_BRIDGE(s->pcihost);
659 MemoryRegion *pcimem_alias = g_new(MemoryRegion, 1);
662 * Bonito North Bridge, built on FPGA,
663 * VENDOR_ID/DEVICE_ID are "undefined"
665 pci_config_set_prog_interface(dev->config, 0x00);
667 /* set the north bridge register mapping */
668 memory_region_init_io(&s->iomem, OBJECT(s), &bonito_ops, s,
669 "north-bridge-register", BONITO_INTERNAL_REG_SIZE);
670 sysbus_init_mmio(sysbus, &s->iomem);
671 sysbus_mmio_map(sysbus, 0, BONITO_INTERNAL_REG_BASE);
673 /* set the north bridge pci configure mapping */
674 memory_region_init_io(&phb->conf_mem, OBJECT(s), &bonito_pciconf_ops, s,
675 "north-bridge-pci-config", BONITO_PCICONFIG_SIZE);
676 sysbus_init_mmio(sysbus, &phb->conf_mem);
677 sysbus_mmio_map(sysbus, 1, BONITO_PCICONFIG_BASE);
679 /* set the south bridge pci configure mapping */
680 memory_region_init_io(&phb->data_mem, OBJECT(s), &bonito_spciconf_ops, s,
681 "south-bridge-pci-config", BONITO_SPCICONFIG_SIZE);
682 sysbus_init_mmio(sysbus, &phb->data_mem);
683 sysbus_mmio_map(sysbus, 2, BONITO_SPCICONFIG_BASE);
685 create_unimplemented_device("bonito", BONITO_REG_BASE, BONITO_REG_SIZE);
687 memory_region_init_io(&s->iomem_ldma, OBJECT(s), &bonito_ldma_ops, s,
688 "ldma", 0x100);
689 sysbus_init_mmio(sysbus, &s->iomem_ldma);
690 sysbus_mmio_map(sysbus, 3, 0x1fe00200);
692 /* PCI copier */
693 memory_region_init_io(&s->iomem_cop, OBJECT(s), &bonito_cop_ops, s,
694 "cop", 0x100);
695 sysbus_init_mmio(sysbus, &s->iomem_cop);
696 sysbus_mmio_map(sysbus, 4, 0x1fe00300);
698 create_unimplemented_device("ROMCS", BONITO_FLASH_BASE, 60 * MiB);
700 /* Map PCI IO Space 0x1fd0 0000 - 0x1fd1 0000 */
701 memory_region_init_alias(&s->bonito_pciio, OBJECT(s), "isa_mmio",
702 get_system_io(), 0, BONITO_PCIIO_SIZE);
703 sysbus_init_mmio(sysbus, &s->bonito_pciio);
704 sysbus_mmio_map(sysbus, 5, BONITO_PCIIO_BASE);
706 /* add pci local io mapping */
708 memory_region_init_alias(&s->bonito_localio, OBJECT(s), "IOCS[0]",
709 get_system_io(), 0, 256 * KiB);
710 sysbus_init_mmio(sysbus, &s->bonito_localio);
711 sysbus_mmio_map(sysbus, 6, BONITO_DEV_BASE);
712 create_unimplemented_device("IOCS[1]", BONITO_DEV_BASE + 1 * 256 * KiB,
713 256 * KiB);
714 create_unimplemented_device("IOCS[2]", BONITO_DEV_BASE + 2 * 256 * KiB,
715 256 * KiB);
716 create_unimplemented_device("IOCS[3]", BONITO_DEV_BASE + 3 * 256 * KiB,
717 256 * KiB);
719 memory_region_init_alias(pcimem_alias, NULL, "pci.mem.alias",
720 &bs->pci_mem, 0, BONITO_PCIHI_SIZE);
721 memory_region_add_subregion(get_system_memory(),
722 BONITO_PCIHI_BASE, pcimem_alias);
723 create_unimplemented_device("PCI_2",
724 (hwaddr)BONITO_PCIHI_BASE + BONITO_PCIHI_SIZE,
725 2 * GiB);
727 /* set the default value of north bridge pci config */
728 pci_set_word(dev->config + PCI_COMMAND, 0x0000);
729 pci_set_word(dev->config + PCI_STATUS, 0x0000);
730 pci_set_word(dev->config + PCI_SUBSYSTEM_VENDOR_ID, 0x0000);
731 pci_set_word(dev->config + PCI_SUBSYSTEM_ID, 0x0000);
733 pci_set_byte(dev->config + PCI_INTERRUPT_LINE, 0x00);
734 pci_set_byte(dev->config + PCI_INTERRUPT_PIN, 0x01);
735 pci_set_byte(dev->config + PCI_MIN_GNT, 0x3c);
736 pci_set_byte(dev->config + PCI_MAX_LAT, 0x00);
738 qemu_register_reset(bonito_reset, s);
741 PCIBus *bonito_init(qemu_irq *pic)
743 DeviceState *dev;
744 BonitoState *pcihost;
745 PCIHostState *phb;
746 PCIBonitoState *s;
747 PCIDevice *d;
749 dev = qdev_new(TYPE_BONITO_PCI_HOST_BRIDGE);
750 phb = PCI_HOST_BRIDGE(dev);
751 pcihost = BONITO_PCI_HOST_BRIDGE(dev);
752 pcihost->pic = pic;
753 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
755 d = pci_new(PCI_DEVFN(0, 0), TYPE_PCI_BONITO);
756 s = PCI_BONITO(d);
757 s->pcihost = pcihost;
758 pcihost->pci_dev = s;
759 pci_realize_and_unref(d, phb->bus, &error_fatal);
761 return phb->bus;
764 static void bonito_class_init(ObjectClass *klass, void *data)
766 DeviceClass *dc = DEVICE_CLASS(klass);
767 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
769 k->realize = bonito_realize;
770 k->vendor_id = 0xdf53;
771 k->device_id = 0x00d5;
772 k->revision = 0x01;
773 k->class_id = PCI_CLASS_BRIDGE_HOST;
774 dc->desc = "Host bridge";
775 dc->vmsd = &vmstate_bonito;
777 * PCI-facing part of the host bridge, not usable without the
778 * host-facing part, which can't be device_add'ed, yet.
780 dc->user_creatable = false;
783 static const TypeInfo bonito_info = {
784 .name = TYPE_PCI_BONITO,
785 .parent = TYPE_PCI_DEVICE,
786 .instance_size = sizeof(PCIBonitoState),
787 .class_init = bonito_class_init,
788 .interfaces = (InterfaceInfo[]) {
789 { INTERFACE_CONVENTIONAL_PCI_DEVICE },
790 { },
794 static void bonito_pcihost_class_init(ObjectClass *klass, void *data)
796 DeviceClass *dc = DEVICE_CLASS(klass);
798 dc->realize = bonito_pcihost_realize;
801 static const TypeInfo bonito_pcihost_info = {
802 .name = TYPE_BONITO_PCI_HOST_BRIDGE,
803 .parent = TYPE_PCI_HOST_BRIDGE,
804 .instance_size = sizeof(BonitoState),
805 .class_init = bonito_pcihost_class_init,
808 static void bonito_register_types(void)
810 type_register_static(&bonito_pcihost_info);
811 type_register_static(&bonito_info);
814 type_init(bonito_register_types)