[PATCH 3/3] kvm-userspace: ppc: fix initial ppc memory setup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Christian Ehrhardt <ehrhardt@xxxxxxxxxxxxxxxxxx>

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 <ehrhardt@xxxxxxxxxxxxxxxxxx>
---

[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 <jyoung5@xxxxxxxxxx>
+ * 	    Christian Ehrhardt <ehrhardt@xxxxxxxxxxxxxxxxxx>
  *
  * 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 <jyoung5@xxxxxxxxxx>
+ * 	    Christian Ehrhardt <ehrhardt@xxxxxxxxxxxxxxxxxx>
  *
  * 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 <jyoung5@xxxxxxxxxx>
+ * Authors:
+ * 	Jerone Young <jyoung5@xxxxxxxxxx>
+ * 	Christian Ehrhardt <ehrhardt@xxxxxxxxxxxxxxxxxx>
  *
  * 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-ppc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM Development]     [KVM ARM]     [KVM ia64]     [Linux Virtualization]     [Linux USB Devel]     [Linux Video]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux