From: Christian Ehrhardt <[EMAIL PROTECTED]> The old memory initialization code was broken for all cases not fitting in one ram stick. This patch fixes the ram_stick calculation, now sets the proper base adresses per stick and removes the old workaround.
Signed-off-by: Christian Ehrhardt <[EMAIL PROTECTED]> --- [diffstat] ppc440.c | 12 +++++------- ppc440.h | 8 ++++++-- ppc440_bamboo.c | 30 ++++++++++++++++++++---------- 3 files changed, 31 insertions(+), 19 deletions(-) [diff] diff --git a/qemu/hw/ppc440.c b/qemu/hw/ppc440.c --- a/qemu/hw/ppc440.c +++ b/qemu/hw/ppc440.c @@ -3,6 +3,7 @@ * * Copyright 2007 IBM Corporation. * Authors: Jerone Young <[EMAIL PROTECTED]> + * Christian Ehrhardt <[EMAIL PROTECTED]> * * This work is licensed under the GNU GPL license version 2 or later. * @@ -24,15 +25,15 @@ void ppc440ep_init(CPUState *env, - target_phys_addr_t ram_bases[2], - target_phys_addr_t ram_sizes[2], + target_phys_addr_t ram_bases[PPC440_MAX_RAM_SLOTS], + target_phys_addr_t ram_sizes[PPC440_MAX_RAM_SLOTS], + int nbanks, qemu_irq **picp, ppc4xx_pci_t **pcip, int do_init) { ppc4xx_mmio_t *mmio; qemu_irq *pic, *irqs; - ram_addr_t offset; ppc4xx_pci_t *pci; int i; @@ -55,10 +56,7 @@ /* SDRAM controller */ printf("trying to setup sdram controller\n"); /* XXX 440EP's ECC interrupts are on UIC1 */ - ppc405_sdram_init(env, pic[14], 2, ram_bases, ram_sizes, do_init); - offset = 0; - for (i = 0; i < 2; i++) - offset += ram_sizes[i]; + ppc405_sdram_init(env, pic[14], nbanks, ram_bases, ram_sizes, do_init); /* PCI */ pci = ppc4xx_pci_init(env, pic, diff --git a/qemu/hw/ppc440.h b/qemu/hw/ppc440.h --- a/qemu/hw/ppc440.h +++ b/qemu/hw/ppc440.h @@ -3,6 +3,7 @@ * * Copyright 2007 IBM Corporation. * Authors: Jerone Young <[EMAIL PROTECTED]> + * Christian Ehrhardt <[EMAIL PROTECTED]> * * This work is licensed under the GNU GPL licence version 2 or later * @@ -20,9 +21,12 @@ #include "exec-all.h" #include "boards.h" +#define PPC440_MAX_RAM_SLOTS 4 + void ppc440ep_init(CPUState *env, - target_phys_addr_t ram_bases[2], - target_phys_addr_t ram_sizes[2], + target_phys_addr_t ram_bases[PPC440_MAX_RAM_SLOTS], + target_phys_addr_t ram_sizes[PPC440_MAX_RAM_SLOTS], + int nbanks, qemu_irq **picp, ppc4xx_pci_t **pcip, int do_init); diff --git a/qemu/hw/ppc440_bamboo.c b/qemu/hw/ppc440_bamboo.c --- a/qemu/hw/ppc440_bamboo.c +++ b/qemu/hw/ppc440_bamboo.c @@ -2,7 +2,9 @@ * Qemu PowerPC 440 board emualtion * * Copyright 2007 IBM Corporation. - * Authors: Jerone Young <[EMAIL PROTECTED]> + * Authors: + * Jerone Young <[EMAIL PROTECTED]> + * Christian Ehrhardt <[EMAIL PROTECTED]> * * This work is licensed under the GNU GPL license version 2 or later. * @@ -30,7 +32,8 @@ const char *cpu_model) { char *buf=NULL; - target_phys_addr_t ram_bases[4], ram_sizes[4]; + target_phys_addr_t ram_bases[PPC440_MAX_RAM_SLOTS]; + target_phys_addr_t ram_sizes[PPC440_MAX_RAM_SLOTS]; NICInfo *nd; qemu_irq *pic; ppc4xx_pci_t *pci; @@ -46,6 +49,8 @@ int ret; int ram_stick_sizes[] = {256<<20, 128<<20, 64<<20, 32<<20, 16<<20, 8<<20 }; /* in bytes */ + int nbanks = 0; /* number of used memory banks */ + int next_bank_offset = 0; ram_addr_t tmp_ram_size; int i=0, k=0; uint32_t cpu_freq; @@ -55,15 +60,22 @@ printf("%s: START\n", __func__); /* Setup Memory */ - printf("Ram size passed is: %i MB\n", - bytes_to_mb((int)ram_size)); + if (ram_size < 8<<20) { + printf("ERROR: ram size too small (min 8mb)\n"); + exit(1); + } else + printf("Ram size passed is: %i MB\n", + bytes_to_mb((int)ram_size)); tmp_ram_size = ram_size; - for (i=0; i < (sizeof(ram_sizes)/sizeof(ram_sizes[0])); i++) { - for (k=0; k < (sizeof(ram_stick_sizes)/sizeof(ram_stick_sizes[0])); k++) { + for (i = 0; i < PPC440_MAX_RAM_SLOTS; i++) { + for (k = 0; k < (sizeof(ram_stick_sizes)/sizeof(int)); k++) { if ((tmp_ram_size/ram_stick_sizes[k]) > 0) { ram_sizes[i] = ram_stick_sizes[k]; + ram_bases[i] = next_bank_offset; + next_bank_offset += ram_stick_sizes[k]; + nbanks++; tmp_ram_size -= ram_stick_sizes[k]; break; } @@ -89,11 +101,8 @@ /* call init */ printf("Calling function ppc440_init\n"); - ppc440ep_init(env, ram_bases, ram_sizes, &pic, &pci, 1); + ppc440ep_init(env, ram_bases, ram_sizes, nbanks, &pic, &pci, 1); printf("Done calling ppc440_init\n"); - - /* Register mem */ - cpu_register_physical_memory(0, ram_size, 0); /* load kernel with uboot loader */ printf("%s: load kernel\n", __func__); -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html