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