Hi,
the attached patch makes the i440bx emulation read the cmos registers of the bochs/qemu emulation that carry RAM size information instead of assuming 128MB.
Regards, Patrick
Signed-Off-By: Patrick Georgi patrick@georgi-clan.de
Index: northbridge/intel/i440bxemulation/domain =================================================================== --- northbridge/intel/i440bxemulation/domain (revision 689) +++ northbridge/intel/i440bxemulation/domain (working copy) @@ -19,6 +19,5 @@ */
{ - ramsize = "128"; device_operations = "i440bx_domain"; }; Index: northbridge/intel/i440bxemulation/i440bx.c =================================================================== --- northbridge/intel/i440bxemulation/i440bx.c (revision 689) +++ northbridge/intel/i440bxemulation/i440bx.c (working copy) @@ -37,25 +37,40 @@ * such modified SOFTWARE should be clearly marked, so as not to confuse * it with the version available from LANL. */ + /* dynamic qemu ram size detection + Copyright 2008 Patrick Georgi patrick@georgi-clan.de + Licensed under the terms of the GNU General Public License v2 or later + */
#include <types.h> #include <console.h> #include <device/device.h> #include <device/pci.h> #include <string.h> +#include <io.h> #include "i440bx.h" #include "statictree.h"
/* Here are the ops for 440BX as a PCI domain. */
+static int inb_cmos(int port) +{ + outb(port, 0x70); + return inb(0x71); +} + static void pci_domain_set_resources(struct device *dev) { struct device *mc_dev; u32 tolmk; /* Top of low mem, Kbytes. */ int idx; - struct northbridge_intel_i440bxemulation_domain_config *device_configuration = - dev->device_configuration; - tolmk = device_configuration->ramsize * 1024; + /* read large mem memory descriptor + for <16 MB read the more detailed small mem descriptor + all values in kbytes */ + tolmk = ((inb_cmos(0x35)<<8) |inb_cmos(0x34)) * 64; + if (tolmk <= 16 * 1024) { + tolmk = (inb_cmos(0x31)<<8) |inb_cmos(0x30); + } mc_dev = dev->link[0].children; if (mc_dev) { idx = 10;