1 /* 2 * QEMU PowerPC 440 embedded processors emulation 3 * 4 * Copyright (c) 2012 François Revol 5 * Copyright (c) 2016-2019 BALATON Zoltan 6 * 7 * This work is licensed under the GNU GPL license version 2 or later. 8 * 9 */ 10 11 #include "qemu/osdep.h" 12 #include "qemu/units.h" 13 #include "qapi/error.h" 14 #include "qemu/log.h" 15 #include "hw/irq.h" 16 #include "hw/ppc/ppc4xx.h" 17 #include "hw/qdev-properties.h" 18 #include "hw/pci/pci.h" 19 #include "sysemu/reset.h" 20 #include "ppc440.h" 21 22 /*****************************************************************************/ 23 /* L2 Cache as SRAM */ 24 /* FIXME:fix names */ 25 enum { 26 DCR_L2CACHE_BASE = 0x30, 27 DCR_L2CACHE_CFG = DCR_L2CACHE_BASE, 28 DCR_L2CACHE_CMD, 29 DCR_L2CACHE_ADDR, 30 DCR_L2CACHE_DATA, 31 DCR_L2CACHE_STAT, 32 DCR_L2CACHE_CVER, 33 DCR_L2CACHE_SNP0, 34 DCR_L2CACHE_SNP1, 35 DCR_L2CACHE_END = DCR_L2CACHE_SNP1, 36 }; 37 38 /* base is 460ex-specific, cf. U-Boot, ppc4xx-isram.h */ 39 enum { 40 DCR_ISRAM0_BASE = 0x20, 41 DCR_ISRAM0_SB0CR = DCR_ISRAM0_BASE, 42 DCR_ISRAM0_SB1CR, 43 DCR_ISRAM0_SB2CR, 44 DCR_ISRAM0_SB3CR, 45 DCR_ISRAM0_BEAR, 46 DCR_ISRAM0_BESR0, 47 DCR_ISRAM0_BESR1, 48 DCR_ISRAM0_PMEG, 49 DCR_ISRAM0_CID, 50 DCR_ISRAM0_REVID, 51 DCR_ISRAM0_DPC, 52 DCR_ISRAM0_END = DCR_ISRAM0_DPC 53 }; 54 55 enum { 56 DCR_ISRAM1_BASE = 0xb0, 57 DCR_ISRAM1_SB0CR = DCR_ISRAM1_BASE, 58 /* single bank */ 59 DCR_ISRAM1_BEAR = DCR_ISRAM1_BASE + 0x04, 60 DCR_ISRAM1_BESR0, 61 DCR_ISRAM1_BESR1, 62 DCR_ISRAM1_PMEG, 63 DCR_ISRAM1_CID, 64 DCR_ISRAM1_REVID, 65 DCR_ISRAM1_DPC, 66 DCR_ISRAM1_END = DCR_ISRAM1_DPC 67 }; 68 69 typedef struct ppc4xx_l2sram_t { 70 MemoryRegion bank[4]; 71 uint32_t l2cache[8]; 72 uint32_t isram0[11]; 73 } ppc4xx_l2sram_t; 74 75 #ifdef MAP_L2SRAM 76 static void l2sram_update_mappings(ppc4xx_l2sram_t *l2sram, 77 uint32_t isarc, uint32_t isacntl, 78 uint32_t dsarc, uint32_t dsacntl) 79 { 80 if (l2sram->isarc != isarc || 81 (l2sram->isacntl & 0x80000000) != (isacntl & 0x80000000)) { 82 if (l2sram->isacntl & 0x80000000) { 83 /* Unmap previously assigned memory region */ 84 memory_region_del_subregion(get_system_memory(), 85 &l2sram->isarc_ram); 86 } 87 if (isacntl & 0x80000000) { 88 /* Map new instruction memory region */ 89 memory_region_add_subregion(get_system_memory(), isarc, 90 &l2sram->isarc_ram); 91 } 92 } 93 if (l2sram->dsarc != dsarc || 94 (l2sram->dsacntl & 0x80000000) != (dsacntl & 0x80000000)) { 95 if (l2sram->dsacntl & 0x80000000) { 96 /* Beware not to unmap the region we just mapped */ 97 if (!(isacntl & 0x80000000) || l2sram->dsarc != isarc) { 98 /* Unmap previously assigned memory region */ 99 memory_region_del_subregion(get_system_memory(), 100 &l2sram->dsarc_ram); 101 } 102 } 103 if (dsacntl & 0x80000000) { 104 /* Beware not to remap the region we just mapped */ 105 if (!(isacntl & 0x80000000) || dsarc != isarc) { 106 /* Map new data memory region */ 107 memory_region_add_subregion(get_system_memory(), dsarc, 108 &l2sram->dsarc_ram); 109 } 110 } 111 } 112 } 113 #endif 114 115 static uint32_t dcr_read_l2sram(void *opaque, int dcrn) 116 { 117 ppc4xx_l2sram_t *l2sram = opaque; 118 uint32_t ret = 0; 119 120 switch (dcrn) { 121 case DCR_L2CACHE_CFG: 122 case DCR_L2CACHE_CMD: 123 case DCR_L2CACHE_ADDR: 124 case DCR_L2CACHE_DATA: 125 case DCR_L2CACHE_STAT: 126 case DCR_L2CACHE_CVER: 127 case DCR_L2CACHE_SNP0: 128 case DCR_L2CACHE_SNP1: 129 ret = l2sram->l2cache[dcrn - DCR_L2CACHE_BASE]; 130 break; 131 132 case DCR_ISRAM0_SB0CR: 133 case DCR_ISRAM0_SB1CR: 134 case DCR_ISRAM0_SB2CR: 135 case DCR_ISRAM0_SB3CR: 136 case DCR_ISRAM0_BEAR: 137 case DCR_ISRAM0_BESR0: 138 case DCR_ISRAM0_BESR1: 139 case DCR_ISRAM0_PMEG: 140 case DCR_ISRAM0_CID: 141 case DCR_ISRAM0_REVID: 142 case DCR_ISRAM0_DPC: 143 ret = l2sram->isram0[dcrn - DCR_ISRAM0_BASE]; 144 break; 145 146 default: 147 break; 148 } 149 150 return ret; 151 } 152 153 static void dcr_write_l2sram(void *opaque, int dcrn, uint32_t val) 154 { 155 /*ppc4xx_l2sram_t *l2sram = opaque;*/ 156 /* FIXME: Actually handle L2 cache mapping */ 157 158 switch (dcrn) { 159 case DCR_L2CACHE_CFG: 160 case DCR_L2CACHE_CMD: 161 case DCR_L2CACHE_ADDR: 162 case DCR_L2CACHE_DATA: 163 case DCR_L2CACHE_STAT: 164 case DCR_L2CACHE_CVER: 165 case DCR_L2CACHE_SNP0: 166 case DCR_L2CACHE_SNP1: 167 /*l2sram->l2cache[dcrn - DCR_L2CACHE_BASE] = val;*/ 168 break; 169 170 case DCR_ISRAM0_SB0CR: 171 case DCR_ISRAM0_SB1CR: 172 case DCR_ISRAM0_SB2CR: 173 case DCR_ISRAM0_SB3CR: 174 case DCR_ISRAM0_BEAR: 175 case DCR_ISRAM0_BESR0: 176 case DCR_ISRAM0_BESR1: 177 case DCR_ISRAM0_PMEG: 178 case DCR_ISRAM0_CID: 179 case DCR_ISRAM0_REVID: 180 case DCR_ISRAM0_DPC: 181 /*l2sram->isram0[dcrn - DCR_L2CACHE_BASE] = val;*/ 182 break; 183 184 case DCR_ISRAM1_SB0CR: 185 case DCR_ISRAM1_BEAR: 186 case DCR_ISRAM1_BESR0: 187 case DCR_ISRAM1_BESR1: 188 case DCR_ISRAM1_PMEG: 189 case DCR_ISRAM1_CID: 190 case DCR_ISRAM1_REVID: 191 case DCR_ISRAM1_DPC: 192 /*l2sram->isram1[dcrn - DCR_L2CACHE_BASE] = val;*/ 193 break; 194 } 195 /*l2sram_update_mappings(l2sram, isarc, isacntl, dsarc, dsacntl);*/ 196 } 197 198 static void l2sram_reset(void *opaque) 199 { 200 ppc4xx_l2sram_t *l2sram = opaque; 201 202 memset(l2sram->l2cache, 0, sizeof(l2sram->l2cache)); 203 l2sram->l2cache[DCR_L2CACHE_STAT - DCR_L2CACHE_BASE] = 0x80000000; 204 memset(l2sram->isram0, 0, sizeof(l2sram->isram0)); 205 /*l2sram_update_mappings(l2sram, isarc, isacntl, dsarc, dsacntl);*/ 206 } 207 208 void ppc4xx_l2sram_init(CPUPPCState *env) 209 { 210 ppc4xx_l2sram_t *l2sram; 211 212 l2sram = g_malloc0(sizeof(*l2sram)); 213 /* XXX: Size is 4*64kB for 460ex, cf. U-Boot, ppc4xx-isram.h */ 214 memory_region_init_ram(&l2sram->bank[0], NULL, "ppc4xx.l2sram_bank0", 215 64 * KiB, &error_abort); 216 memory_region_init_ram(&l2sram->bank[1], NULL, "ppc4xx.l2sram_bank1", 217 64 * KiB, &error_abort); 218 memory_region_init_ram(&l2sram->bank[2], NULL, "ppc4xx.l2sram_bank2", 219 64 * KiB, &error_abort); 220 memory_region_init_ram(&l2sram->bank[3], NULL, "ppc4xx.l2sram_bank3", 221 64 * KiB, &error_abort); 222 qemu_register_reset(&l2sram_reset, l2sram); 223 ppc_dcr_register(env, DCR_L2CACHE_CFG, 224 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 225 ppc_dcr_register(env, DCR_L2CACHE_CMD, 226 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 227 ppc_dcr_register(env, DCR_L2CACHE_ADDR, 228 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 229 ppc_dcr_register(env, DCR_L2CACHE_DATA, 230 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 231 ppc_dcr_register(env, DCR_L2CACHE_STAT, 232 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 233 ppc_dcr_register(env, DCR_L2CACHE_CVER, 234 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 235 ppc_dcr_register(env, DCR_L2CACHE_SNP0, 236 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 237 ppc_dcr_register(env, DCR_L2CACHE_SNP1, 238 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 239 240 ppc_dcr_register(env, DCR_ISRAM0_SB0CR, 241 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 242 ppc_dcr_register(env, DCR_ISRAM0_SB1CR, 243 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 244 ppc_dcr_register(env, DCR_ISRAM0_SB2CR, 245 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 246 ppc_dcr_register(env, DCR_ISRAM0_SB3CR, 247 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 248 ppc_dcr_register(env, DCR_ISRAM0_PMEG, 249 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 250 ppc_dcr_register(env, DCR_ISRAM0_DPC, 251 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 252 253 ppc_dcr_register(env, DCR_ISRAM1_SB0CR, 254 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 255 ppc_dcr_register(env, DCR_ISRAM1_PMEG, 256 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 257 ppc_dcr_register(env, DCR_ISRAM1_DPC, 258 l2sram, &dcr_read_l2sram, &dcr_write_l2sram); 259 } 260 261 /*****************************************************************************/ 262 /* Clocking Power on Reset */ 263 enum { 264 CPR0_CFGADDR = 0xC, 265 CPR0_CFGDATA = 0xD, 266 267 CPR0_PLLD = 0x060, 268 CPR0_PLBED = 0x080, 269 CPR0_OPBD = 0x0C0, 270 CPR0_PERD = 0x0E0, 271 CPR0_AHBD = 0x100, 272 }; 273 274 typedef struct ppc4xx_cpr_t { 275 uint32_t addr; 276 } ppc4xx_cpr_t; 277 278 static uint32_t dcr_read_cpr(void *opaque, int dcrn) 279 { 280 ppc4xx_cpr_t *cpr = opaque; 281 uint32_t ret = 0; 282 283 switch (dcrn) { 284 case CPR0_CFGADDR: 285 ret = cpr->addr; 286 break; 287 case CPR0_CFGDATA: 288 switch (cpr->addr) { 289 case CPR0_PLLD: 290 ret = (0xb5 << 24) | (1 << 16) | (9 << 8); 291 break; 292 case CPR0_PLBED: 293 ret = (5 << 24); 294 break; 295 case CPR0_OPBD: 296 ret = (2 << 24); 297 break; 298 case CPR0_PERD: 299 case CPR0_AHBD: 300 ret = (1 << 24); 301 break; 302 default: 303 break; 304 } 305 break; 306 default: 307 break; 308 } 309 310 return ret; 311 } 312 313 static void dcr_write_cpr(void *opaque, int dcrn, uint32_t val) 314 { 315 ppc4xx_cpr_t *cpr = opaque; 316 317 switch (dcrn) { 318 case CPR0_CFGADDR: 319 cpr->addr = val; 320 break; 321 case CPR0_CFGDATA: 322 break; 323 default: 324 break; 325 } 326 } 327 328 static void ppc4xx_cpr_reset(void *opaque) 329 { 330 ppc4xx_cpr_t *cpr = opaque; 331 332 cpr->addr = 0; 333 } 334 335 void ppc4xx_cpr_init(CPUPPCState *env) 336 { 337 ppc4xx_cpr_t *cpr; 338 339 cpr = g_malloc0(sizeof(*cpr)); 340 ppc_dcr_register(env, CPR0_CFGADDR, cpr, &dcr_read_cpr, &dcr_write_cpr); 341 ppc_dcr_register(env, CPR0_CFGDATA, cpr, &dcr_read_cpr, &dcr_write_cpr); 342 qemu_register_reset(ppc4xx_cpr_reset, cpr); 343 } 344 345 /*****************************************************************************/ 346 /* System DCRs */ 347 typedef struct ppc4xx_sdr_t ppc4xx_sdr_t; 348 struct ppc4xx_sdr_t { 349 uint32_t addr; 350 }; 351 352 enum { 353 SDR0_CFGADDR = 0x00e, 354 SDR0_CFGDATA, 355 SDR0_STRP0 = 0x020, 356 SDR0_STRP1, 357 SDR0_102 = 0x66, 358 SDR0_103, 359 SDR0_128 = 0x80, 360 SDR0_ECID3 = 0x083, 361 SDR0_DDR0 = 0x0e1, 362 SDR0_USB0 = 0x320, 363 }; 364 365 enum { 366 PESDR0_LOOP = 0x303, 367 PESDR0_RCSSET, 368 PESDR0_RCSSTS, 369 PESDR0_RSTSTA = 0x310, 370 PESDR1_LOOP = 0x343, 371 PESDR1_RCSSET, 372 PESDR1_RCSSTS, 373 PESDR1_RSTSTA = 0x365, 374 }; 375 376 static uint32_t dcr_read_sdr(void *opaque, int dcrn) 377 { 378 ppc4xx_sdr_t *sdr = opaque; 379 uint32_t ret = 0; 380 381 switch (dcrn) { 382 case SDR0_CFGADDR: 383 ret = sdr->addr; 384 break; 385 case SDR0_CFGDATA: 386 switch (sdr->addr) { 387 case SDR0_STRP0: 388 ret = (0xb5 << 8) | (1 << 4) | 9; 389 break; 390 case SDR0_STRP1: 391 ret = (5 << 29) | (2 << 26) | (1 << 24); 392 break; 393 case SDR0_ECID3: 394 ret = 1 << 20; /* No Security/Kasumi support */ 395 break; 396 case SDR0_DDR0: 397 ret = SDR0_DDR0_DDRM_ENCODE(1) | SDR0_DDR0_DDRM_DDR1; 398 break; 399 case PESDR0_RCSSET: 400 case PESDR1_RCSSET: 401 ret = (1 << 24) | (1 << 16); 402 break; 403 case PESDR0_RCSSTS: 404 case PESDR1_RCSSTS: 405 ret = (1 << 16) | (1 << 12); 406 break; 407 case PESDR0_RSTSTA: 408 case PESDR1_RSTSTA: 409 ret = 1; 410 break; 411 case PESDR0_LOOP: 412 case PESDR1_LOOP: 413 ret = 1 << 12; 414 break; 415 default: 416 break; 417 } 418 break; 419 default: 420 break; 421 } 422 423 return ret; 424 } 425 426 static void dcr_write_sdr(void *opaque, int dcrn, uint32_t val) 427 { 428 ppc4xx_sdr_t *sdr = opaque; 429 430 switch (dcrn) { 431 case SDR0_CFGADDR: 432 sdr->addr = val; 433 break; 434 case SDR0_CFGDATA: 435 switch (sdr->addr) { 436 case 0x00: /* B0CR */ 437 break; 438 default: 439 break; 440 } 441 break; 442 default: 443 break; 444 } 445 } 446 447 static void sdr_reset(void *opaque) 448 { 449 ppc4xx_sdr_t *sdr = opaque; 450 451 sdr->addr = 0; 452 } 453 454 void ppc4xx_sdr_init(CPUPPCState *env) 455 { 456 ppc4xx_sdr_t *sdr; 457 458 sdr = g_malloc0(sizeof(*sdr)); 459 qemu_register_reset(&sdr_reset, sdr); 460 ppc_dcr_register(env, SDR0_CFGADDR, 461 sdr, &dcr_read_sdr, &dcr_write_sdr); 462 ppc_dcr_register(env, SDR0_CFGDATA, 463 sdr, &dcr_read_sdr, &dcr_write_sdr); 464 ppc_dcr_register(env, SDR0_102, 465 sdr, &dcr_read_sdr, &dcr_write_sdr); 466 ppc_dcr_register(env, SDR0_103, 467 sdr, &dcr_read_sdr, &dcr_write_sdr); 468 ppc_dcr_register(env, SDR0_128, 469 sdr, &dcr_read_sdr, &dcr_write_sdr); 470 ppc_dcr_register(env, SDR0_USB0, 471 sdr, &dcr_read_sdr, &dcr_write_sdr); 472 } 473 474 /*****************************************************************************/ 475 /* PLB to AHB bridge */ 476 enum { 477 AHB_TOP = 0xA4, 478 AHB_BOT = 0xA5, 479 }; 480 481 typedef struct ppc4xx_ahb_t { 482 uint32_t top; 483 uint32_t bot; 484 } ppc4xx_ahb_t; 485 486 static uint32_t dcr_read_ahb(void *opaque, int dcrn) 487 { 488 ppc4xx_ahb_t *ahb = opaque; 489 uint32_t ret = 0; 490 491 switch (dcrn) { 492 case AHB_TOP: 493 ret = ahb->top; 494 break; 495 case AHB_BOT: 496 ret = ahb->bot; 497 break; 498 default: 499 break; 500 } 501 502 return ret; 503 } 504 505 static void dcr_write_ahb(void *opaque, int dcrn, uint32_t val) 506 { 507 ppc4xx_ahb_t *ahb = opaque; 508 509 switch (dcrn) { 510 case AHB_TOP: 511 ahb->top = val; 512 break; 513 case AHB_BOT: 514 ahb->bot = val; 515 break; 516 } 517 } 518 519 static void ppc4xx_ahb_reset(void *opaque) 520 { 521 ppc4xx_ahb_t *ahb = opaque; 522 523 /* No error */ 524 ahb->top = 0; 525 ahb->bot = 0; 526 } 527 528 void ppc4xx_ahb_init(CPUPPCState *env) 529 { 530 ppc4xx_ahb_t *ahb; 531 532 ahb = g_malloc0(sizeof(*ahb)); 533 ppc_dcr_register(env, AHB_TOP, ahb, &dcr_read_ahb, &dcr_write_ahb); 534 ppc_dcr_register(env, AHB_BOT, ahb, &dcr_read_ahb, &dcr_write_ahb); 535 qemu_register_reset(ppc4xx_ahb_reset, ahb); 536 } 537 538 /*****************************************************************************/ 539 /* DMA controller */ 540 541 #define DMA0_CR_CE (1 << 31) 542 #define DMA0_CR_PW (1 << 26 | 1 << 25) 543 #define DMA0_CR_DAI (1 << 24) 544 #define DMA0_CR_SAI (1 << 23) 545 #define DMA0_CR_DEC (1 << 2) 546 547 enum { 548 DMA0_CR = 0x00, 549 DMA0_CT, 550 DMA0_SAH, 551 DMA0_SAL, 552 DMA0_DAH, 553 DMA0_DAL, 554 DMA0_SGH, 555 DMA0_SGL, 556 557 DMA0_SR = 0x20, 558 DMA0_SGC = 0x23, 559 DMA0_SLP = 0x25, 560 DMA0_POL = 0x26, 561 }; 562 563 typedef struct { 564 uint32_t cr; 565 uint32_t ct; 566 uint64_t sa; 567 uint64_t da; 568 uint64_t sg; 569 } PPC4xxDmaChnl; 570 571 typedef struct { 572 int base; 573 PPC4xxDmaChnl ch[4]; 574 uint32_t sr; 575 } PPC4xxDmaState; 576 577 static uint32_t dcr_read_dma(void *opaque, int dcrn) 578 { 579 PPC4xxDmaState *dma = opaque; 580 uint32_t val = 0; 581 int addr = dcrn - dma->base; 582 int chnl = addr / 8; 583 584 switch (addr) { 585 case 0x00 ... 0x1f: 586 switch (addr % 8) { 587 case DMA0_CR: 588 val = dma->ch[chnl].cr; 589 break; 590 case DMA0_CT: 591 val = dma->ch[chnl].ct; 592 break; 593 case DMA0_SAH: 594 val = dma->ch[chnl].sa >> 32; 595 break; 596 case DMA0_SAL: 597 val = dma->ch[chnl].sa; 598 break; 599 case DMA0_DAH: 600 val = dma->ch[chnl].da >> 32; 601 break; 602 case DMA0_DAL: 603 val = dma->ch[chnl].da; 604 break; 605 case DMA0_SGH: 606 val = dma->ch[chnl].sg >> 32; 607 break; 608 case DMA0_SGL: 609 val = dma->ch[chnl].sg; 610 break; 611 } 612 break; 613 case DMA0_SR: 614 val = dma->sr; 615 break; 616 default: 617 qemu_log_mask(LOG_UNIMP, "%s: unimplemented register %x (%d, %x)\n", 618 __func__, dcrn, chnl, addr); 619 } 620 621 return val; 622 } 623 624 static void dcr_write_dma(void *opaque, int dcrn, uint32_t val) 625 { 626 PPC4xxDmaState *dma = opaque; 627 int addr = dcrn - dma->base; 628 int chnl = addr / 8; 629 630 switch (addr) { 631 case 0x00 ... 0x1f: 632 switch (addr % 8) { 633 case DMA0_CR: 634 dma->ch[chnl].cr = val; 635 if (val & DMA0_CR_CE) { 636 int count = dma->ch[chnl].ct & 0xffff; 637 638 if (count) { 639 int width, i, sidx, didx; 640 uint8_t *rptr, *wptr; 641 hwaddr rlen, wlen; 642 hwaddr xferlen; 643 644 sidx = didx = 0; 645 width = 1 << ((val & DMA0_CR_PW) >> 25); 646 xferlen = count * width; 647 wlen = rlen = xferlen; 648 rptr = cpu_physical_memory_map(dma->ch[chnl].sa, &rlen, 649 false); 650 wptr = cpu_physical_memory_map(dma->ch[chnl].da, &wlen, 651 true); 652 if (rptr && rlen == xferlen && wptr && wlen == xferlen) { 653 if (!(val & DMA0_CR_DEC) && 654 val & DMA0_CR_SAI && val & DMA0_CR_DAI) { 655 /* optimise common case */ 656 memmove(wptr, rptr, count * width); 657 sidx = didx = count * width; 658 } else { 659 /* do it the slow way */ 660 for (sidx = didx = i = 0; i < count; i++) { 661 uint64_t v = ldn_le_p(rptr + sidx, width); 662 stn_le_p(wptr + didx, width, v); 663 if (val & DMA0_CR_SAI) { 664 sidx += width; 665 } 666 if (val & DMA0_CR_DAI) { 667 didx += width; 668 } 669 } 670 } 671 } 672 if (wptr) { 673 cpu_physical_memory_unmap(wptr, wlen, 1, didx); 674 } 675 if (rptr) { 676 cpu_physical_memory_unmap(rptr, rlen, 0, sidx); 677 } 678 } 679 } 680 break; 681 case DMA0_CT: 682 dma->ch[chnl].ct = val; 683 break; 684 case DMA0_SAH: 685 dma->ch[chnl].sa &= 0xffffffffULL; 686 dma->ch[chnl].sa |= (uint64_t)val << 32; 687 break; 688 case DMA0_SAL: 689 dma->ch[chnl].sa &= 0xffffffff00000000ULL; 690 dma->ch[chnl].sa |= val; 691 break; 692 case DMA0_DAH: 693 dma->ch[chnl].da &= 0xffffffffULL; 694 dma->ch[chnl].da |= (uint64_t)val << 32; 695 break; 696 case DMA0_DAL: 697 dma->ch[chnl].da &= 0xffffffff00000000ULL; 698 dma->ch[chnl].da |= val; 699 break; 700 case DMA0_SGH: 701 dma->ch[chnl].sg &= 0xffffffffULL; 702 dma->ch[chnl].sg |= (uint64_t)val << 32; 703 break; 704 case DMA0_SGL: 705 dma->ch[chnl].sg &= 0xffffffff00000000ULL; 706 dma->ch[chnl].sg |= val; 707 break; 708 } 709 break; 710 case DMA0_SR: 711 dma->sr &= ~val; 712 break; 713 default: 714 qemu_log_mask(LOG_UNIMP, "%s: unimplemented register %x (%d, %x)\n", 715 __func__, dcrn, chnl, addr); 716 } 717 } 718 719 static void ppc4xx_dma_reset(void *opaque) 720 { 721 PPC4xxDmaState *dma = opaque; 722 int dma_base = dma->base; 723 724 memset(dma, 0, sizeof(*dma)); 725 dma->base = dma_base; 726 } 727 728 void ppc4xx_dma_init(CPUPPCState *env, int dcr_base) 729 { 730 PPC4xxDmaState *dma; 731 int i; 732 733 dma = g_malloc0(sizeof(*dma)); 734 dma->base = dcr_base; 735 qemu_register_reset(&ppc4xx_dma_reset, dma); 736 for (i = 0; i < 4; i++) { 737 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_CR, 738 dma, &dcr_read_dma, &dcr_write_dma); 739 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_CT, 740 dma, &dcr_read_dma, &dcr_write_dma); 741 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SAH, 742 dma, &dcr_read_dma, &dcr_write_dma); 743 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SAL, 744 dma, &dcr_read_dma, &dcr_write_dma); 745 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_DAH, 746 dma, &dcr_read_dma, &dcr_write_dma); 747 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_DAL, 748 dma, &dcr_read_dma, &dcr_write_dma); 749 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SGH, 750 dma, &dcr_read_dma, &dcr_write_dma); 751 ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SGL, 752 dma, &dcr_read_dma, &dcr_write_dma); 753 } 754 ppc_dcr_register(env, dcr_base + DMA0_SR, 755 dma, &dcr_read_dma, &dcr_write_dma); 756 ppc_dcr_register(env, dcr_base + DMA0_SGC, 757 dma, &dcr_read_dma, &dcr_write_dma); 758 ppc_dcr_register(env, dcr_base + DMA0_SLP, 759 dma, &dcr_read_dma, &dcr_write_dma); 760 ppc_dcr_register(env, dcr_base + DMA0_POL, 761 dma, &dcr_read_dma, &dcr_write_dma); 762 } 763 764 /*****************************************************************************/ 765 /* PCI Express controller */ 766 /* 767 * FIXME: This is not complete and does not work, only implemented partially 768 * to allow firmware and guests to find an empty bus. Cards should use PCI. 769 */ 770 #include "hw/pci/pcie_host.h" 771 772 #define TYPE_PPC460EX_PCIE_HOST "ppc460ex-pcie-host" 773 OBJECT_DECLARE_SIMPLE_TYPE(PPC460EXPCIEState, PPC460EX_PCIE_HOST) 774 775 struct PPC460EXPCIEState { 776 PCIExpressHost host; 777 778 MemoryRegion iomem; 779 qemu_irq irq[4]; 780 int32_t dcrn_base; 781 782 uint64_t cfg_base; 783 uint32_t cfg_mask; 784 uint64_t msg_base; 785 uint32_t msg_mask; 786 uint64_t omr1_base; 787 uint64_t omr1_mask; 788 uint64_t omr2_base; 789 uint64_t omr2_mask; 790 uint64_t omr3_base; 791 uint64_t omr3_mask; 792 uint64_t reg_base; 793 uint32_t reg_mask; 794 uint32_t special; 795 uint32_t cfg; 796 }; 797 798 #define DCRN_PCIE0_BASE 0x100 799 #define DCRN_PCIE1_BASE 0x120 800 801 enum { 802 PEGPL_CFGBAH = 0x0, 803 PEGPL_CFGBAL, 804 PEGPL_CFGMSK, 805 PEGPL_MSGBAH, 806 PEGPL_MSGBAL, 807 PEGPL_MSGMSK, 808 PEGPL_OMR1BAH, 809 PEGPL_OMR1BAL, 810 PEGPL_OMR1MSKH, 811 PEGPL_OMR1MSKL, 812 PEGPL_OMR2BAH, 813 PEGPL_OMR2BAL, 814 PEGPL_OMR2MSKH, 815 PEGPL_OMR2MSKL, 816 PEGPL_OMR3BAH, 817 PEGPL_OMR3BAL, 818 PEGPL_OMR3MSKH, 819 PEGPL_OMR3MSKL, 820 PEGPL_REGBAH, 821 PEGPL_REGBAL, 822 PEGPL_REGMSK, 823 PEGPL_SPECIAL, 824 PEGPL_CFG, 825 }; 826 827 static uint32_t dcr_read_pcie(void *opaque, int dcrn) 828 { 829 PPC460EXPCIEState *state = opaque; 830 uint32_t ret = 0; 831 832 switch (dcrn - state->dcrn_base) { 833 case PEGPL_CFGBAH: 834 ret = state->cfg_base >> 32; 835 break; 836 case PEGPL_CFGBAL: 837 ret = state->cfg_base; 838 break; 839 case PEGPL_CFGMSK: 840 ret = state->cfg_mask; 841 break; 842 case PEGPL_MSGBAH: 843 ret = state->msg_base >> 32; 844 break; 845 case PEGPL_MSGBAL: 846 ret = state->msg_base; 847 break; 848 case PEGPL_MSGMSK: 849 ret = state->msg_mask; 850 break; 851 case PEGPL_OMR1BAH: 852 ret = state->omr1_base >> 32; 853 break; 854 case PEGPL_OMR1BAL: 855 ret = state->omr1_base; 856 break; 857 case PEGPL_OMR1MSKH: 858 ret = state->omr1_mask >> 32; 859 break; 860 case PEGPL_OMR1MSKL: 861 ret = state->omr1_mask; 862 break; 863 case PEGPL_OMR2BAH: 864 ret = state->omr2_base >> 32; 865 break; 866 case PEGPL_OMR2BAL: 867 ret = state->omr2_base; 868 break; 869 case PEGPL_OMR2MSKH: 870 ret = state->omr2_mask >> 32; 871 break; 872 case PEGPL_OMR2MSKL: 873 ret = state->omr3_mask; 874 break; 875 case PEGPL_OMR3BAH: 876 ret = state->omr3_base >> 32; 877 break; 878 case PEGPL_OMR3BAL: 879 ret = state->omr3_base; 880 break; 881 case PEGPL_OMR3MSKH: 882 ret = state->omr3_mask >> 32; 883 break; 884 case PEGPL_OMR3MSKL: 885 ret = state->omr3_mask; 886 break; 887 case PEGPL_REGBAH: 888 ret = state->reg_base >> 32; 889 break; 890 case PEGPL_REGBAL: 891 ret = state->reg_base; 892 break; 893 case PEGPL_REGMSK: 894 ret = state->reg_mask; 895 break; 896 case PEGPL_SPECIAL: 897 ret = state->special; 898 break; 899 case PEGPL_CFG: 900 ret = state->cfg; 901 break; 902 } 903 904 return ret; 905 } 906 907 static void dcr_write_pcie(void *opaque, int dcrn, uint32_t val) 908 { 909 PPC460EXPCIEState *s = opaque; 910 uint64_t size; 911 912 switch (dcrn - s->dcrn_base) { 913 case PEGPL_CFGBAH: 914 s->cfg_base = ((uint64_t)val << 32) | (s->cfg_base & 0xffffffff); 915 break; 916 case PEGPL_CFGBAL: 917 s->cfg_base = (s->cfg_base & 0xffffffff00000000ULL) | val; 918 break; 919 case PEGPL_CFGMSK: 920 s->cfg_mask = val; 921 size = ~(val & 0xfffffffe) + 1; 922 /* 923 * Firmware sets this register to E0000001. Why we are not sure, 924 * but the current guess is anything above PCIE_MMCFG_SIZE_MAX is 925 * ignored. 926 */ 927 if (size > PCIE_MMCFG_SIZE_MAX) { 928 size = PCIE_MMCFG_SIZE_MAX; 929 } 930 pcie_host_mmcfg_update(PCIE_HOST_BRIDGE(s), val & 1, s->cfg_base, size); 931 break; 932 case PEGPL_MSGBAH: 933 s->msg_base = ((uint64_t)val << 32) | (s->msg_base & 0xffffffff); 934 break; 935 case PEGPL_MSGBAL: 936 s->msg_base = (s->msg_base & 0xffffffff00000000ULL) | val; 937 break; 938 case PEGPL_MSGMSK: 939 s->msg_mask = val; 940 break; 941 case PEGPL_OMR1BAH: 942 s->omr1_base = ((uint64_t)val << 32) | (s->omr1_base & 0xffffffff); 943 break; 944 case PEGPL_OMR1BAL: 945 s->omr1_base = (s->omr1_base & 0xffffffff00000000ULL) | val; 946 break; 947 case PEGPL_OMR1MSKH: 948 s->omr1_mask = ((uint64_t)val << 32) | (s->omr1_mask & 0xffffffff); 949 break; 950 case PEGPL_OMR1MSKL: 951 s->omr1_mask = (s->omr1_mask & 0xffffffff00000000ULL) | val; 952 break; 953 case PEGPL_OMR2BAH: 954 s->omr2_base = ((uint64_t)val << 32) | (s->omr2_base & 0xffffffff); 955 break; 956 case PEGPL_OMR2BAL: 957 s->omr2_base = (s->omr2_base & 0xffffffff00000000ULL) | val; 958 break; 959 case PEGPL_OMR2MSKH: 960 s->omr2_mask = ((uint64_t)val << 32) | (s->omr2_mask & 0xffffffff); 961 break; 962 case PEGPL_OMR2MSKL: 963 s->omr2_mask = (s->omr2_mask & 0xffffffff00000000ULL) | val; 964 break; 965 case PEGPL_OMR3BAH: 966 s->omr3_base = ((uint64_t)val << 32) | (s->omr3_base & 0xffffffff); 967 break; 968 case PEGPL_OMR3BAL: 969 s->omr3_base = (s->omr3_base & 0xffffffff00000000ULL) | val; 970 break; 971 case PEGPL_OMR3MSKH: 972 s->omr3_mask = ((uint64_t)val << 32) | (s->omr3_mask & 0xffffffff); 973 break; 974 case PEGPL_OMR3MSKL: 975 s->omr3_mask = (s->omr3_mask & 0xffffffff00000000ULL) | val; 976 break; 977 case PEGPL_REGBAH: 978 s->reg_base = ((uint64_t)val << 32) | (s->reg_base & 0xffffffff); 979 break; 980 case PEGPL_REGBAL: 981 s->reg_base = (s->reg_base & 0xffffffff00000000ULL) | val; 982 break; 983 case PEGPL_REGMSK: 984 s->reg_mask = val; 985 /* FIXME: how is size encoded? */ 986 size = (val == 0x7001 ? 4096 : ~(val & 0xfffffffe) + 1); 987 break; 988 case PEGPL_SPECIAL: 989 s->special = val; 990 break; 991 case PEGPL_CFG: 992 s->cfg = val; 993 break; 994 } 995 } 996 997 static void ppc460ex_set_irq(void *opaque, int irq_num, int level) 998 { 999 PPC460EXPCIEState *s = opaque; 1000 qemu_set_irq(s->irq[irq_num], level); 1001 } 1002 1003 static void ppc460ex_pcie_realize(DeviceState *dev, Error **errp) 1004 { 1005 PPC460EXPCIEState *s = PPC460EX_PCIE_HOST(dev); 1006 PCIHostState *pci = PCI_HOST_BRIDGE(dev); 1007 int i, id; 1008 char buf[16]; 1009 1010 switch (s->dcrn_base) { 1011 case DCRN_PCIE0_BASE: 1012 id = 0; 1013 break; 1014 case DCRN_PCIE1_BASE: 1015 id = 1; 1016 break; 1017 default: 1018 error_setg(errp, "invalid PCIe DCRN base"); 1019 return; 1020 } 1021 snprintf(buf, sizeof(buf), "pcie%d-io", id); 1022 memory_region_init(&s->iomem, OBJECT(s), buf, UINT64_MAX); 1023 for (i = 0; i < 4; i++) { 1024 sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]); 1025 } 1026 snprintf(buf, sizeof(buf), "pcie.%d", id); 1027 pci->bus = pci_register_root_bus(DEVICE(s), buf, ppc460ex_set_irq, 1028 pci_swizzle_map_irq_fn, s, &s->iomem, 1029 get_system_io(), 0, 4, TYPE_PCIE_BUS); 1030 } 1031 1032 static Property ppc460ex_pcie_props[] = { 1033 DEFINE_PROP_INT32("dcrn-base", PPC460EXPCIEState, dcrn_base, -1), 1034 DEFINE_PROP_END_OF_LIST(), 1035 }; 1036 1037 static void ppc460ex_pcie_class_init(ObjectClass *klass, void *data) 1038 { 1039 DeviceClass *dc = DEVICE_CLASS(klass); 1040 1041 set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); 1042 dc->realize = ppc460ex_pcie_realize; 1043 device_class_set_props(dc, ppc460ex_pcie_props); 1044 dc->hotpluggable = false; 1045 } 1046 1047 static const TypeInfo ppc460ex_pcie_host_info = { 1048 .name = TYPE_PPC460EX_PCIE_HOST, 1049 .parent = TYPE_PCIE_HOST_BRIDGE, 1050 .instance_size = sizeof(PPC460EXPCIEState), 1051 .class_init = ppc460ex_pcie_class_init, 1052 }; 1053 1054 static void ppc460ex_pcie_register(void) 1055 { 1056 type_register_static(&ppc460ex_pcie_host_info); 1057 } 1058 1059 type_init(ppc460ex_pcie_register) 1060 1061 static void ppc460ex_pcie_register_dcrs(PPC460EXPCIEState *s, CPUPPCState *env) 1062 { 1063 ppc_dcr_register(env, s->dcrn_base + PEGPL_CFGBAH, s, 1064 &dcr_read_pcie, &dcr_write_pcie); 1065 ppc_dcr_register(env, s->dcrn_base + PEGPL_CFGBAL, s, 1066 &dcr_read_pcie, &dcr_write_pcie); 1067 ppc_dcr_register(env, s->dcrn_base + PEGPL_CFGMSK, s, 1068 &dcr_read_pcie, &dcr_write_pcie); 1069 ppc_dcr_register(env, s->dcrn_base + PEGPL_MSGBAH, s, 1070 &dcr_read_pcie, &dcr_write_pcie); 1071 ppc_dcr_register(env, s->dcrn_base + PEGPL_MSGBAL, s, 1072 &dcr_read_pcie, &dcr_write_pcie); 1073 ppc_dcr_register(env, s->dcrn_base + PEGPL_MSGMSK, s, 1074 &dcr_read_pcie, &dcr_write_pcie); 1075 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1BAH, s, 1076 &dcr_read_pcie, &dcr_write_pcie); 1077 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1BAL, s, 1078 &dcr_read_pcie, &dcr_write_pcie); 1079 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1MSKH, s, 1080 &dcr_read_pcie, &dcr_write_pcie); 1081 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1MSKL, s, 1082 &dcr_read_pcie, &dcr_write_pcie); 1083 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2BAH, s, 1084 &dcr_read_pcie, &dcr_write_pcie); 1085 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2BAL, s, 1086 &dcr_read_pcie, &dcr_write_pcie); 1087 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2MSKH, s, 1088 &dcr_read_pcie, &dcr_write_pcie); 1089 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2MSKL, s, 1090 &dcr_read_pcie, &dcr_write_pcie); 1091 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3BAH, s, 1092 &dcr_read_pcie, &dcr_write_pcie); 1093 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3BAL, s, 1094 &dcr_read_pcie, &dcr_write_pcie); 1095 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3MSKH, s, 1096 &dcr_read_pcie, &dcr_write_pcie); 1097 ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3MSKL, s, 1098 &dcr_read_pcie, &dcr_write_pcie); 1099 ppc_dcr_register(env, s->dcrn_base + PEGPL_REGBAH, s, 1100 &dcr_read_pcie, &dcr_write_pcie); 1101 ppc_dcr_register(env, s->dcrn_base + PEGPL_REGBAL, s, 1102 &dcr_read_pcie, &dcr_write_pcie); 1103 ppc_dcr_register(env, s->dcrn_base + PEGPL_REGMSK, s, 1104 &dcr_read_pcie, &dcr_write_pcie); 1105 ppc_dcr_register(env, s->dcrn_base + PEGPL_SPECIAL, s, 1106 &dcr_read_pcie, &dcr_write_pcie); 1107 ppc_dcr_register(env, s->dcrn_base + PEGPL_CFG, s, 1108 &dcr_read_pcie, &dcr_write_pcie); 1109 } 1110 1111 void ppc460ex_pcie_init(CPUPPCState *env) 1112 { 1113 DeviceState *dev; 1114 1115 dev = qdev_new(TYPE_PPC460EX_PCIE_HOST); 1116 qdev_prop_set_int32(dev, "dcrn-base", DCRN_PCIE0_BASE); 1117 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); 1118 ppc460ex_pcie_register_dcrs(PPC460EX_PCIE_HOST(dev), env); 1119 1120 dev = qdev_new(TYPE_PPC460EX_PCIE_HOST); 1121 qdev_prop_set_int32(dev, "dcrn-base", DCRN_PCIE1_BASE); 1122 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); 1123 ppc460ex_pcie_register_dcrs(PPC460EX_PCIE_HOST(dev), env); 1124 } 1125