1 /* 2 * bonito north bridge support 3 * 4 * Copyright (c) 2008 yajin (yajin@vm-kernel.org) 5 * Copyright (c) 2010 Huacai Chen (zltjiangshi@gmail.com) 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_device.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 "hw/misc/unimp.h" 53 #include "hw/registerfields.h" 54 #include "qom/object.h" 55 #include "trace.h" 56 57 /* #define DEBUG_BONITO */ 58 59 #ifdef DEBUG_BONITO 60 #define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__) 61 #else 62 #define DPRINTF(fmt, ...) 63 #endif 64 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) 98 99 100 #define BONITO_PCICONFIGBASE 0x00 101 #define BONITO_REGBASE 0x100 102 103 #define BONITO_PCICONFIG_BASE (BONITO_PCICONFIGBASE + BONITO_REG_BASE) 104 #define BONITO_PCICONFIG_SIZE (0x100) 105 106 #define BONITO_INTERNAL_REG_BASE (BONITO_REGBASE + BONITO_REG_BASE) 107 #define BONITO_INTERNAL_REG_SIZE (0x70) 108 109 #define BONITO_SPCICONFIG_BASE (BONITO_PCICFG_BASE) 110 #define BONITO_SPCICONFIG_SIZE (BONITO_PCICFG_SIZE) 111 112 113 114 /* 1. Bonito h/w Configuration */ 115 /* Power on register */ 116 117 #define BONITO_BONPONCFG (0x00 >> 2) /* 0x100 */ 118 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) 131 132 /* 2. IO & IDE configuration */ 133 #define BONITO_IODEVCFG (0x08 >> 2) /* 0x108 */ 134 135 /* 3. IO & IDE configuration */ 136 #define BONITO_SDCFG (0x0c >> 2) /* 0x10c */ 137 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 */ 142 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 */ 148 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 */ 153 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 */ 159 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 */ 169 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 */ 175 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 */ 181 182 #define BONITO_REGS (0x70 >> 2) 183 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_DS (~3) /* Per datasheet */ 190 #define BONITO_PCICONF_REG_MASK_HW 0xff /* As seen running PMON */ 191 #define BONITO_PCICONF_REG_OFFSET 0 192 193 194 /* idsel BIT = pci slot number +12 */ 195 #define PCI_SLOT_BASE 12 196 #define PCI_IDSEL_VIA686B_BIT (17) 197 #define PCI_IDSEL_VIA686B (1 << PCI_IDSEL_VIA686B_BIT) 198 199 #define PCI_ADDR(busno , devno , funno , regno) \ 200 ((PCI_BUILD_BDF(busno, PCI_DEVFN(devno , funno)) << 8) + (regno)) 201 202 typedef struct BonitoState BonitoState; 203 204 struct PCIBonitoState { 205 PCIDevice dev; 206 207 BonitoState *pcihost; 208 uint32_t regs[BONITO_REGS]; 209 210 struct bonldma { 211 uint32_t ldmactrl; 212 uint32_t ldmastat; 213 uint32_t ldmaaddr; 214 uint32_t ldmago; 215 } bonldma; 216 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; 224 225 /* Bonito registers */ 226 MemoryRegion iomem; 227 MemoryRegion iomem_ldma; 228 MemoryRegion iomem_cop; 229 MemoryRegion bonito_pciio; 230 MemoryRegion bonito_localio; 231 232 }; 233 typedef struct PCIBonitoState PCIBonitoState; 234 235 struct BonitoState { 236 PCIHostState parent_obj; 237 qemu_irq *pic; 238 PCIBonitoState *pci_dev; 239 MemoryRegion pci_mem; 240 }; 241 242 #define TYPE_BONITO_PCI_HOST_BRIDGE "Bonito-pcihost" 243 OBJECT_DECLARE_SIMPLE_TYPE(BonitoState, BONITO_PCI_HOST_BRIDGE) 244 245 #define TYPE_PCI_BONITO "Bonito" 246 OBJECT_DECLARE_SIMPLE_TYPE(PCIBonitoState, 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_HW) >> BONITO_PCICONF_REG_OFFSET; 470 471 if (idsel == 0) { 472 error_report("error in bonito pci config address 0x" TARGET_FMT_plx 473 ",pcimap_cfg=0x%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 if (addr & ~BONITO_PCICONF_REG_MASK_DS) { 501 trace_bonito_spciconf_small_access(addr, size); 502 } 503 504 /* set the pci address in s->config_reg */ 505 phb->config_reg = (pciaddr) | (1u << 31); 506 pci_data_write(phb->bus, phb->config_reg, val, size); 507 508 /* clear PCI_STATUS_REC_MASTER_ABORT and PCI_STATUS_REC_TARGET_ABORT */ 509 status = pci_get_word(d->config + PCI_STATUS); 510 status &= ~(PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT); 511 pci_set_word(d->config + PCI_STATUS, status); 512 } 513 514 static uint64_t bonito_spciconf_read(void *opaque, hwaddr addr, unsigned size) 515 { 516 PCIBonitoState *s = opaque; 517 PCIDevice *d = PCI_DEVICE(s); 518 PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost); 519 uint32_t pciaddr; 520 uint16_t status; 521 522 DPRINTF("bonito_spciconf_read "TARGET_FMT_plx" size %d\n", addr, size); 523 524 pciaddr = bonito_sbridge_pciaddr(s, addr); 525 526 if (pciaddr == 0xffffffff) { 527 return MAKE_64BIT_MASK(0, size * 8); 528 } 529 if (addr & ~BONITO_PCICONF_REG_MASK_DS) { 530 trace_bonito_spciconf_small_access(addr, size); 531 } 532 533 /* set the pci address in s->config_reg */ 534 phb->config_reg = (pciaddr) | (1u << 31); 535 536 /* clear PCI_STATUS_REC_MASTER_ABORT and PCI_STATUS_REC_TARGET_ABORT */ 537 status = pci_get_word(d->config + PCI_STATUS); 538 status &= ~(PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT); 539 pci_set_word(d->config + PCI_STATUS, status); 540 541 return pci_data_read(phb->bus, phb->config_reg, size); 542 } 543 544 /* south bridge PCI configure space. 0x1fe8 0000 - 0x1fef ffff */ 545 static const MemoryRegionOps bonito_spciconf_ops = { 546 .read = bonito_spciconf_read, 547 .write = bonito_spciconf_write, 548 .valid.min_access_size = 1, 549 .valid.max_access_size = 4, 550 .impl.min_access_size = 1, 551 .impl.max_access_size = 4, 552 .endianness = DEVICE_NATIVE_ENDIAN, 553 }; 554 555 #define BONITO_IRQ_BASE 32 556 557 static void pci_bonito_set_irq(void *opaque, int irq_num, int level) 558 { 559 BonitoState *s = opaque; 560 qemu_irq *pic = s->pic; 561 PCIBonitoState *bonito_state = s->pci_dev; 562 int internal_irq = irq_num - BONITO_IRQ_BASE; 563 564 if (bonito_state->regs[BONITO_INTEDGE] & (1 << internal_irq)) { 565 qemu_irq_pulse(*pic); 566 } else { /* level triggered */ 567 if (bonito_state->regs[BONITO_INTPOL] & (1 << internal_irq)) { 568 qemu_irq_raise(*pic); 569 } else { 570 qemu_irq_lower(*pic); 571 } 572 } 573 } 574 575 /* map the original irq (0~3) to bonito irq (16~47, but 16~31 are unused) */ 576 static int pci_bonito_map_irq(PCIDevice *pci_dev, int irq_num) 577 { 578 int slot; 579 580 slot = PCI_SLOT(pci_dev->devfn); 581 582 switch (slot) { 583 case 5: /* FULOONG2E_VIA_SLOT, SouthBridge, IDE, USB, ACPI, AC97, MC97 */ 584 return irq_num % 4 + BONITO_IRQ_BASE; 585 case 6: /* FULOONG2E_ATI_SLOT, VGA */ 586 return 4 + BONITO_IRQ_BASE; 587 case 7: /* FULOONG2E_RTL_SLOT, RTL8139 */ 588 return 5 + BONITO_IRQ_BASE; 589 case 8 ... 12: /* PCI slot 1 to 4 */ 590 return (slot - 8 + irq_num) + 6 + BONITO_IRQ_BASE; 591 default: /* Unknown device, don't do any translation */ 592 return irq_num; 593 } 594 } 595 596 static void bonito_reset(void *opaque) 597 { 598 PCIBonitoState *s = opaque; 599 uint32_t val = 0; 600 601 /* set the default value of north bridge registers */ 602 603 s->regs[BONITO_BONPONCFG] = 0xc40; 604 val = FIELD_DP32(val, BONGENCFG, PCIQUEUE, 1); 605 val = FIELD_DP32(val, BONGENCFG, WRITEBEHIND, 1); 606 val = FIELD_DP32(val, BONGENCFG, PREFETCH, 1); 607 val = FIELD_DP32(val, BONGENCFG, UNCACHED, 1); 608 val = FIELD_DP32(val, BONGENCFG, CPUSELFRESET, 1); 609 s->regs[BONITO_BONGENCFG] = val; 610 611 s->regs[BONITO_IODEVCFG] = 0x2bff8010; 612 s->regs[BONITO_SDCFG] = 0x255e0091; 613 614 s->regs[BONITO_GPIODATA] = 0x1ff; 615 s->regs[BONITO_GPIOIE] = 0x1ff; 616 s->regs[BONITO_DQCFG] = 0x8; 617 s->regs[BONITO_MEMSIZE] = 0x10000000; 618 s->regs[BONITO_PCIMAP] = 0x6140; 619 } 620 621 static const VMStateDescription vmstate_bonito = { 622 .name = "Bonito", 623 .version_id = 1, 624 .minimum_version_id = 1, 625 .fields = (VMStateField[]) { 626 VMSTATE_PCI_DEVICE(dev, PCIBonitoState), 627 VMSTATE_END_OF_LIST() 628 } 629 }; 630 631 static void bonito_pcihost_realize(DeviceState *dev, Error **errp) 632 { 633 PCIHostState *phb = PCI_HOST_BRIDGE(dev); 634 BonitoState *bs = BONITO_PCI_HOST_BRIDGE(dev); 635 MemoryRegion *pcimem_lo_alias = g_new(MemoryRegion, 3); 636 637 memory_region_init(&bs->pci_mem, OBJECT(dev), "pci.mem", BONITO_PCIHI_SIZE); 638 phb->bus = pci_register_root_bus(dev, "pci", 639 pci_bonito_set_irq, pci_bonito_map_irq, 640 dev, &bs->pci_mem, get_system_io(), 641 PCI_DEVFN(5, 0), 32, TYPE_PCI_BUS); 642 643 for (size_t i = 0; i < 3; i++) { 644 char *name = g_strdup_printf("pci.lomem%zu", i); 645 646 memory_region_init_alias(&pcimem_lo_alias[i], NULL, name, 647 &bs->pci_mem, i * 64 * MiB, 64 * MiB); 648 memory_region_add_subregion(get_system_memory(), 649 BONITO_PCILO_BASE + i * 64 * MiB, 650 &pcimem_lo_alias[i]); 651 g_free(name); 652 } 653 654 create_unimplemented_device("pci.io", BONITO_PCIIO_BASE, 1 * MiB); 655 } 656 657 static void bonito_realize(PCIDevice *dev, Error **errp) 658 { 659 PCIBonitoState *s = PCI_BONITO(dev); 660 SysBusDevice *sysbus = SYS_BUS_DEVICE(s->pcihost); 661 PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost); 662 BonitoState *bs = BONITO_PCI_HOST_BRIDGE(s->pcihost); 663 MemoryRegion *pcimem_alias = g_new(MemoryRegion, 1); 664 665 /* 666 * Bonito North Bridge, built on FPGA, 667 * VENDOR_ID/DEVICE_ID are "undefined" 668 */ 669 pci_config_set_prog_interface(dev->config, 0x00); 670 671 /* set the north bridge register mapping */ 672 memory_region_init_io(&s->iomem, OBJECT(s), &bonito_ops, s, 673 "north-bridge-register", BONITO_INTERNAL_REG_SIZE); 674 sysbus_init_mmio(sysbus, &s->iomem); 675 sysbus_mmio_map(sysbus, 0, BONITO_INTERNAL_REG_BASE); 676 677 /* set the north bridge pci configure mapping */ 678 memory_region_init_io(&phb->conf_mem, OBJECT(s), &bonito_pciconf_ops, s, 679 "north-bridge-pci-config", BONITO_PCICONFIG_SIZE); 680 sysbus_init_mmio(sysbus, &phb->conf_mem); 681 sysbus_mmio_map(sysbus, 1, BONITO_PCICONFIG_BASE); 682 683 /* set the south bridge pci configure mapping */ 684 memory_region_init_io(&phb->data_mem, OBJECT(s), &bonito_spciconf_ops, s, 685 "south-bridge-pci-config", BONITO_SPCICONFIG_SIZE); 686 sysbus_init_mmio(sysbus, &phb->data_mem); 687 sysbus_mmio_map(sysbus, 2, BONITO_SPCICONFIG_BASE); 688 689 create_unimplemented_device("bonito", BONITO_REG_BASE, BONITO_REG_SIZE); 690 691 memory_region_init_io(&s->iomem_ldma, OBJECT(s), &bonito_ldma_ops, s, 692 "ldma", 0x100); 693 sysbus_init_mmio(sysbus, &s->iomem_ldma); 694 sysbus_mmio_map(sysbus, 3, 0x1fe00200); 695 696 /* PCI copier */ 697 memory_region_init_io(&s->iomem_cop, OBJECT(s), &bonito_cop_ops, s, 698 "cop", 0x100); 699 sysbus_init_mmio(sysbus, &s->iomem_cop); 700 sysbus_mmio_map(sysbus, 4, 0x1fe00300); 701 702 create_unimplemented_device("ROMCS", BONITO_FLASH_BASE, 60 * MiB); 703 704 /* Map PCI IO Space 0x1fd0 0000 - 0x1fd1 0000 */ 705 memory_region_init_alias(&s->bonito_pciio, OBJECT(s), "isa_mmio", 706 get_system_io(), 0, BONITO_PCIIO_SIZE); 707 sysbus_init_mmio(sysbus, &s->bonito_pciio); 708 sysbus_mmio_map(sysbus, 5, BONITO_PCIIO_BASE); 709 710 /* add pci local io mapping */ 711 712 memory_region_init_alias(&s->bonito_localio, OBJECT(s), "IOCS[0]", 713 get_system_io(), 0, 256 * KiB); 714 sysbus_init_mmio(sysbus, &s->bonito_localio); 715 sysbus_mmio_map(sysbus, 6, BONITO_DEV_BASE); 716 create_unimplemented_device("IOCS[1]", BONITO_DEV_BASE + 1 * 256 * KiB, 717 256 * KiB); 718 create_unimplemented_device("IOCS[2]", BONITO_DEV_BASE + 2 * 256 * KiB, 719 256 * KiB); 720 create_unimplemented_device("IOCS[3]", BONITO_DEV_BASE + 3 * 256 * KiB, 721 256 * KiB); 722 723 memory_region_init_alias(pcimem_alias, NULL, "pci.mem.alias", 724 &bs->pci_mem, 0, BONITO_PCIHI_SIZE); 725 memory_region_add_subregion(get_system_memory(), 726 BONITO_PCIHI_BASE, pcimem_alias); 727 create_unimplemented_device("PCI_2", 728 (hwaddr)BONITO_PCIHI_BASE + BONITO_PCIHI_SIZE, 729 2 * GiB); 730 731 /* set the default value of north bridge pci config */ 732 pci_set_word(dev->config + PCI_COMMAND, 0x0000); 733 pci_set_word(dev->config + PCI_STATUS, 0x0000); 734 pci_set_word(dev->config + PCI_SUBSYSTEM_VENDOR_ID, 0x0000); 735 pci_set_word(dev->config + PCI_SUBSYSTEM_ID, 0x0000); 736 737 pci_set_byte(dev->config + PCI_INTERRUPT_LINE, 0x00); 738 pci_config_set_interrupt_pin(dev->config, 0x01); /* interrupt pin A */ 739 740 pci_set_byte(dev->config + PCI_MIN_GNT, 0x3c); 741 pci_set_byte(dev->config + PCI_MAX_LAT, 0x00); 742 743 qemu_register_reset(bonito_reset, s); 744 } 745 746 PCIBus *bonito_init(qemu_irq *pic) 747 { 748 DeviceState *dev; 749 BonitoState *pcihost; 750 PCIHostState *phb; 751 PCIBonitoState *s; 752 PCIDevice *d; 753 754 dev = qdev_new(TYPE_BONITO_PCI_HOST_BRIDGE); 755 phb = PCI_HOST_BRIDGE(dev); 756 pcihost = BONITO_PCI_HOST_BRIDGE(dev); 757 pcihost->pic = pic; 758 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); 759 760 d = pci_new(PCI_DEVFN(0, 0), TYPE_PCI_BONITO); 761 s = PCI_BONITO(d); 762 s->pcihost = pcihost; 763 pcihost->pci_dev = s; 764 pci_realize_and_unref(d, phb->bus, &error_fatal); 765 766 return phb->bus; 767 } 768 769 static void bonito_class_init(ObjectClass *klass, void *data) 770 { 771 DeviceClass *dc = DEVICE_CLASS(klass); 772 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); 773 774 k->realize = bonito_realize; 775 k->vendor_id = 0xdf53; 776 k->device_id = 0x00d5; 777 k->revision = 0x01; 778 k->class_id = PCI_CLASS_BRIDGE_HOST; 779 dc->desc = "Host bridge"; 780 dc->vmsd = &vmstate_bonito; 781 /* 782 * PCI-facing part of the host bridge, not usable without the 783 * host-facing part, which can't be device_add'ed, yet. 784 */ 785 dc->user_creatable = false; 786 } 787 788 static const TypeInfo bonito_info = { 789 .name = TYPE_PCI_BONITO, 790 .parent = TYPE_PCI_DEVICE, 791 .instance_size = sizeof(PCIBonitoState), 792 .class_init = bonito_class_init, 793 .interfaces = (InterfaceInfo[]) { 794 { INTERFACE_CONVENTIONAL_PCI_DEVICE }, 795 { }, 796 }, 797 }; 798 799 static void bonito_pcihost_class_init(ObjectClass *klass, void *data) 800 { 801 DeviceClass *dc = DEVICE_CLASS(klass); 802 803 dc->realize = bonito_pcihost_realize; 804 } 805 806 static const TypeInfo bonito_pcihost_info = { 807 .name = TYPE_BONITO_PCI_HOST_BRIDGE, 808 .parent = TYPE_PCI_HOST_BRIDGE, 809 .instance_size = sizeof(BonitoState), 810 .class_init = bonito_pcihost_class_init, 811 }; 812 813 static void bonito_register_types(void) 814 { 815 type_register_static(&bonito_pcihost_info); 816 type_register_static(&bonito_info); 817 } 818 819 type_init(bonito_register_types) 820