Revision b6dcbe08

b/hw/ppc405.h
59 59
ram_addr_t ppc405_set_bootinfo (CPUState *env, ppc4xx_bd_info_t *bd,
60 60
                                uint32_t flags);
61 61

  
62
CPUState *ppc405cr_init (target_phys_addr_t ram_bases[4],
62
CPUState *ppc405cr_init (MemoryRegion ram_memories[4],
63
                         target_phys_addr_t ram_bases[4],
63 64
                         target_phys_addr_t ram_sizes[4],
64 65
                         uint32_t sysclk, qemu_irq **picp,
65 66
                         int do_init);
66
CPUState *ppc405ep_init (target_phys_addr_t ram_bases[2],
67
CPUState *ppc405ep_init (MemoryRegion ram_memories[2],
68
                         target_phys_addr_t ram_bases[2],
67 69
                         target_phys_addr_t ram_sizes[2],
68 70
                         uint32_t sysclk, qemu_irq **picp,
69 71
                         int do_init);
70 72
/* IBM STBxxx microcontrollers */
71
CPUState *ppc_stb025_init (target_phys_addr_t ram_bases[2],
73
CPUState *ppc_stb025_init (MemoryRegion ram_memories[2],
74
                           target_phys_addr_t ram_bases[2],
72 75
                           target_phys_addr_t ram_sizes[2],
73 76
                           uint32_t sysclk, qemu_irq **picp,
74 77
                           ram_addr_t *offsetp);
b/hw/ppc405_boards.c
182 182
    CPUPPCState *env;
183 183
    qemu_irq *pic;
184 184
    ram_addr_t sram_offset, bios_offset, bdloc;
185
    MemoryRegion *ram_memories = g_malloc(2 * sizeof(*ram_memories));
185 186
    target_phys_addr_t ram_bases[2], ram_sizes[2];
186 187
    target_ulong sram_size;
187 188
    long bios_size;
......
194 195
    DriveInfo *dinfo;
195 196

  
196 197
    /* XXX: fix this */
197
    ram_bases[0] = qemu_ram_alloc(NULL, "ef405ep.ram", 0x08000000);
198
    memory_region_init_ram(&ram_memories[0], NULL, "ef405ep.ram", 0x08000000);
199
    ram_bases[0] = 0;
198 200
    ram_sizes[0] = 0x08000000;
201
    memory_region_init(&ram_memories[1], "ef405ep.ram1", 0);
199 202
    ram_bases[1] = 0x00000000;
200 203
    ram_sizes[1] = 0x00000000;
201 204
    ram_size = 128 * 1024 * 1024;
202 205
#ifdef DEBUG_BOARD_INIT
203 206
    printf("%s: register cpu\n", __func__);
204 207
#endif
205
    env = ppc405ep_init(ram_bases, ram_sizes, 33333333, &pic,
208
    env = ppc405ep_init(ram_memories, ram_bases, ram_sizes, 33333333, &pic,
206 209
                        kernel_filename == NULL ? 0 : 1);
207 210
    /* allocate SRAM */
208 211
    sram_size = 512 * 1024;
......
505 508
    char *filename;
506 509
    qemu_irq *pic;
507 510
    ram_addr_t bios_offset;
511
    MemoryRegion *ram_memories = g_malloc(2 * sizeof(*ram_memories));
508 512
    target_phys_addr_t ram_bases[2], ram_sizes[2];
509 513
    long bios_size;
510 514
    target_ulong kernel_base, initrd_base;
......
514 518
    DriveInfo *dinfo;
515 519

  
516 520
    /* RAM is soldered to the board so the size cannot be changed */
517
    ram_bases[0] = qemu_ram_alloc(NULL, "taihu_405ep.ram-0", 0x04000000);
521
    memory_region_init_ram(&ram_memories[0], NULL,
522
                           "taihu_405ep.ram-0", 0x04000000);
523
    ram_bases[0] = 0;
518 524
    ram_sizes[0] = 0x04000000;
519
    ram_bases[1] = qemu_ram_alloc(NULL, "taihu_405ep.ram-1", 0x04000000);
525
    memory_region_init_ram(&ram_memories[1], NULL,
526
                           "taihu_405ep.ram-1", 0x04000000);
527
    ram_bases[1] = 0x04000000;
520 528
    ram_sizes[1] = 0x04000000;
521 529
    ram_size = 0x08000000;
522 530
#ifdef DEBUG_BOARD_INIT
523 531
    printf("%s: register cpu\n", __func__);
524 532
#endif
525
    ppc405ep_init(ram_bases, ram_sizes, 33333333, &pic,
533
    ppc405ep_init(ram_memories, ram_bases, ram_sizes, 33333333, &pic,
526 534
                  kernel_filename == NULL ? 0 : 1);
527 535
    /* allocate and load BIOS */
528 536
#ifdef DEBUG_BOARD_INIT
b/hw/ppc405_uc.c
2107 2107
    qemu_register_reset(ppc405cr_cpc_reset, cpc);
2108 2108
}
2109 2109

  
2110
CPUState *ppc405cr_init (target_phys_addr_t ram_bases[4],
2110
CPUState *ppc405cr_init (MemoryRegion ram_memories[4],
2111
                         target_phys_addr_t ram_bases[4],
2111 2112
                         target_phys_addr_t ram_sizes[4],
2112 2113
                         uint32_t sysclk, qemu_irq **picp,
2113 2114
                         int do_init)
......
2136 2137
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2137 2138
    *picp = pic;
2138 2139
    /* SDRAM controller */
2139
    ppc4xx_sdram_init(env, pic[14], 1, ram_bases, ram_sizes, do_init);
2140
    ppc4xx_sdram_init(env, pic[14], 1, ram_memories,
2141
                      ram_bases, ram_sizes, do_init);
2140 2142
    /* External bus controller */
2141 2143
    ppc405_ebc_init(env);
2142 2144
    /* DMA controller */
......
2451 2453
#endif
2452 2454
}
2453 2455

  
2454
CPUState *ppc405ep_init (target_phys_addr_t ram_bases[2],
2456
CPUState *ppc405ep_init (MemoryRegion ram_memories[2],
2457
                         target_phys_addr_t ram_bases[2],
2455 2458
                         target_phys_addr_t ram_sizes[2],
2456 2459
                         uint32_t sysclk, qemu_irq **picp,
2457 2460
                         int do_init)
......
2485 2488
    *picp = pic;
2486 2489
    /* SDRAM controller */
2487 2490
	/* XXX 405EP has no ECC interrupt */
2488
    ppc4xx_sdram_init(env, pic[17], 2, ram_bases, ram_sizes, do_init);
2491
    ppc4xx_sdram_init(env, pic[17], 2, ram_memories,
2492
                      ram_bases, ram_sizes, do_init);
2489 2493
    /* External bus controller */
2490 2494
    ppc405_ebc_init(env);
2491 2495
    /* DMA controller */
b/hw/ppc440.c
38 38
                        const unsigned int pci_irq_nrs[4], int do_init,
39 39
                        const char *cpu_model)
40 40
{
41
    MemoryRegion *ram_memories
42
        = g_malloc(PPC440EP_SDRAM_NR_BANKS * sizeof(*ram_memories));
41 43
    target_phys_addr_t ram_bases[PPC440EP_SDRAM_NR_BANKS];
42 44
    target_phys_addr_t ram_sizes[PPC440EP_SDRAM_NR_BANKS];
43 45
    CPUState *env;
......
66 68
    memset(ram_bases, 0, sizeof(ram_bases));
67 69
    memset(ram_sizes, 0, sizeof(ram_sizes));
68 70
    *ram_size = ppc4xx_sdram_adjust(*ram_size, PPC440EP_SDRAM_NR_BANKS,
71
                                    ram_memories,
69 72
                                    ram_bases, ram_sizes,
70 73
                                    ppc440ep_sdram_bank_sizes);
71 74
    /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
72
    ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_bases,
73
                      ram_sizes, do_init);
75
    ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
76
                      ram_bases, ram_sizes, do_init);
74 77

  
75 78
    /* PCI */
76 79
    pci_irqs = g_malloc(sizeof(qemu_irq) * 4);
b/hw/ppc4xx.h
42 42
                       uint32_t dcr_base, int has_ssr, int has_vr);
43 43

  
44 44
ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
45
                               MemoryRegion ram_memories[],
45 46
                               target_phys_addr_t ram_bases[],
46 47
                               target_phys_addr_t ram_sizes[],
47 48
                               const unsigned int sdram_bank_sizes[]);
48 49

  
49 50
void ppc4xx_sdram_init (CPUState *env, qemu_irq irq, int nbanks,
51
                        MemoryRegion ram_memories[],
50 52
                        target_phys_addr_t *ram_bases,
51 53
                        target_phys_addr_t *ram_sizes,
52 54
                        int do_init);
b/hw/ppc4xx_devs.c
25 25
#include "ppc.h"
26 26
#include "ppc4xx.h"
27 27
#include "qemu-log.h"
28
#include "exec-memory.h"
28 29

  
29 30
//#define DEBUG_MMIO
30 31
//#define DEBUG_UNASSIGNED
......
313 314
struct ppc4xx_sdram_t {
314 315
    uint32_t addr;
315 316
    int nbanks;
317
    MemoryRegion containers[4]; /* used for clipping */
318
    MemoryRegion *ram_memories;
316 319
    target_phys_addr_t ram_bases[4];
317 320
    target_phys_addr_t ram_sizes[4];
318 321
    uint32_t besr0;
......
395 398
    return size;
396 399
}
397 400

  
398
static void sdram_set_bcr (uint32_t *bcrp, uint32_t bcr, int enabled)
401
static void sdram_set_bcr(ppc4xx_sdram_t *sdram,
402
                          uint32_t *bcrp, uint32_t bcr, int enabled)
399 403
{
404
    unsigned n = bcrp - sdram->bcr;
405

  
400 406
    if (*bcrp & 0x00000001) {
401 407
        /* Unmap RAM */
402 408
#ifdef DEBUG_SDRAM
403 409
        printf("%s: unmap RAM area " TARGET_FMT_plx " " TARGET_FMT_lx "\n",
404 410
               __func__, sdram_base(*bcrp), sdram_size(*bcrp));
405 411
#endif
406
        cpu_register_physical_memory(sdram_base(*bcrp), sdram_size(*bcrp),
407
                                     IO_MEM_UNASSIGNED);
412
        memory_region_del_subregion(get_system_memory(),
413
                                    &sdram->containers[n]);
414
        memory_region_del_subregion(&sdram->containers[n],
415
                                    &sdram->ram_memories[n]);
416
        memory_region_destroy(&sdram->containers[n]);
408 417
    }
409 418
    *bcrp = bcr & 0xFFDEE001;
410 419
    if (enabled && (bcr & 0x00000001)) {
......
412 421
        printf("%s: Map RAM area " TARGET_FMT_plx " " TARGET_FMT_lx "\n",
413 422
               __func__, sdram_base(bcr), sdram_size(bcr));
414 423
#endif
415
        cpu_register_physical_memory(sdram_base(bcr), sdram_size(bcr),
416
                                     sdram_base(bcr) | IO_MEM_RAM);
424
        memory_region_init(&sdram->containers[n], "sdram-containers",
425
                           sdram_size(bcr));
426
        memory_region_add_subregion(&sdram->containers[n], 0,
427
                                    &sdram->ram_memories[n]);
428
        memory_region_add_subregion(get_system_memory(),
429
                                    sdram_base(bcr),
430
                                    &sdram->containers[n]);
417 431
    }
418 432
}
419 433

  
......
423 437

  
424 438
    for (i = 0; i < sdram->nbanks; i++) {
425 439
        if (sdram->ram_sizes[i] != 0) {
426
            sdram_set_bcr(&sdram->bcr[i],
440
            sdram_set_bcr(sdram,
441
                          &sdram->bcr[i],
427 442
                          sdram_bcr(sdram->ram_bases[i], sdram->ram_sizes[i]),
428 443
                          1);
429 444
        } else {
430
            sdram_set_bcr(&sdram->bcr[i], 0x00000000, 0);
445
            sdram_set_bcr(sdram, &sdram->bcr[i], 0x00000000, 0);
431 446
        }
432 447
    }
433 448
}
......
441 456
        printf("%s: Unmap RAM area " TARGET_FMT_plx " " TARGET_FMT_lx "\n",
442 457
               __func__, sdram_base(sdram->bcr[i]), sdram_size(sdram->bcr[i]));
443 458
#endif
444
        cpu_register_physical_memory(sdram_base(sdram->bcr[i]),
445
                                     sdram_size(sdram->bcr[i]),
446
                                     IO_MEM_UNASSIGNED);
459
        memory_region_del_subregion(get_system_memory(),
460
                                    &sdram->ram_memories[i]);
447 461
    }
448 462
}
449 463

  
......
568 582
            sdram->pmit = (val & 0xF8000000) | 0x07C00000;
569 583
            break;
570 584
        case 0x40: /* SDRAM_B0CR */
571
            sdram_set_bcr(&sdram->bcr[0], val, sdram->cfg & 0x80000000);
585
            sdram_set_bcr(sdram, &sdram->bcr[0], val, sdram->cfg & 0x80000000);
572 586
            break;
573 587
        case 0x44: /* SDRAM_B1CR */
574
            sdram_set_bcr(&sdram->bcr[1], val, sdram->cfg & 0x80000000);
588
            sdram_set_bcr(sdram, &sdram->bcr[1], val, sdram->cfg & 0x80000000);
575 589
            break;
576 590
        case 0x48: /* SDRAM_B2CR */
577
            sdram_set_bcr(&sdram->bcr[2], val, sdram->cfg & 0x80000000);
591
            sdram_set_bcr(sdram, &sdram->bcr[2], val, sdram->cfg & 0x80000000);
578 592
            break;
579 593
        case 0x4C: /* SDRAM_B3CR */
580
            sdram_set_bcr(&sdram->bcr[3], val, sdram->cfg & 0x80000000);
594
            sdram_set_bcr(sdram, &sdram->bcr[3], val, sdram->cfg & 0x80000000);
581 595
            break;
582 596
        case 0x80: /* SDRAM_TR */
583 597
            sdram->tr = val & 0x018FC01F;
......
621 635
}
622 636

  
623 637
void ppc4xx_sdram_init (CPUState *env, qemu_irq irq, int nbanks,
638
                        MemoryRegion *ram_memories,
624 639
                        target_phys_addr_t *ram_bases,
625 640
                        target_phys_addr_t *ram_sizes,
626 641
                        int do_init)
......
630 645
    sdram = g_malloc0(sizeof(ppc4xx_sdram_t));
631 646
    sdram->irq = irq;
632 647
    sdram->nbanks = nbanks;
648
    sdram->ram_memories = ram_memories;
633 649
    memset(sdram->ram_bases, 0, 4 * sizeof(target_phys_addr_t));
634 650
    memcpy(sdram->ram_bases, ram_bases,
635 651
           nbanks * sizeof(target_phys_addr_t));
......
653 669
 * must be one of a small set of sizes. The number of banks and the supported
654 670
 * sizes varies by SoC. */
655 671
ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
672
                               MemoryRegion ram_memories[],
656 673
                               target_phys_addr_t ram_bases[],
657 674
                               target_phys_addr_t ram_sizes[],
658 675
                               const unsigned int sdram_bank_sizes[])
659 676
{
660 677
    ram_addr_t size_left = ram_size;
678
    ram_addr_t base = 0;
661 679
    int i;
662 680
    int j;
663 681

  
......
668 686
            if (bank_size <= size_left) {
669 687
                char name[32];
670 688
                snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
671
                ram_bases[i] = qemu_ram_alloc(NULL, name, bank_size);
689
                memory_region_init_ram(&ram_memories[i], NULL, name, bank_size);
690
                ram_bases[i] = base;
672 691
                ram_sizes[i] = bank_size;
692
                base += ram_size;
673 693
                size_left -= bank_size;
674 694
                break;
675 695
            }

Also available in: Unified diff