I have come up with a fix for the problem that I was having regarding upgrading my 2GB of RAM to 4GB of RAM, when the nvidia was trying to place its memory request into the new system RAM place, as described in more detail here.
This was the error that I was getting, where the BAR 1 for pci 0000:01:00.0 means the nvidia geforce 7600 256MB graphics card.
[ 0.397452] pci 0000:00:01.0: BAR 15: address space collision on of bridge [0xb0000000-0xbfffffff] [ 0.397452] pci 0000:00:01.0: BAR 15: cant allocate resource start :0xb0000000-0xbfffffff [ 0.397452] pci 0000:01:00.0: BAR 1: no parent found for of device [0xb0000000-0xbfffffff] |
Also the problem with trying to apply the nvnews fix, which meant just blocking out the 0xc0000000-0xd0000000 range was that there was other devices using that and thus they was gaining that memory range before the nvidia could try to access it. What I have done is to hard code (shall try and do a better fix next), so that if anything tries to gain the memory resource 0xc0000000-0xcfffffff it will block the request and they will re-assign the memory in a later process (great linux kernel there 🙂 ). Then if there is a request for the ranges 0xb0000000 – 0xbfffffff (which is where the ACER BIOS tries to say to put the memory for the nvidia graphics card), move that to the 0xc0000000-0xcfffffff. I have placed at the bottom how the memory is organized before and after the update, where the pci devices that was in the 0xc0 -0xcf ranges are now placed further down in the memory allocation table.
So what I have done is to alter the linux-kernel-source-code /arch/x86/pci/i386.c file, by adding into the function pcibios_allocate_bus_resources come code. I have included the full code for the function below and also just the bit that I have updated further down, it is the bit just after the /* Ian Porter */ 🙂
static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) { struct pci_bus *bus; struct pci_dev *dev; int idx; struct resource *r; /* Depth-First Search on bus tree */ list_for_each_entry(bus, bus_list, node) { if ((dev = bus->self)) { for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { r = &dev->resource[idx]; /* Ian Porter added, to test for the nvidia problem [0xb0000000-0xbfffffff] is where the BIOS is telling nvidia to get the memory, but with 4GB this is where the system memory is. a better way of doing this, would be to run the BIOS find memory process twice and then if no resources can gain memory, e.g. nvidia in this case, flag it for the second run to then give that the starting area and re-do the rest of them, because mainly it is the graphics card that needs the most memory..e.g. 256-512 etc. */ if ((r->start >= 0xc0000000) && (r->end <= 0xcfffffff)) { dev_info(&dev->dev, " not allocating resource 0xc - 0xcf %pR\n", r); /* stop any resources gaining the 0xc0000000 - 0xcfffffff region, the linux kernel will re-place them. */ r->flags = 0; } /* where the nvidia is going and replace in the above region */ if ((r->start == 0xb0000000) && (r->end == 0xbfffffff)) { r->start = 0xc0000000; r->end = 0xcfffffff; } /* stop insert */ if (!r->flags) continue; if (!r->start || pci_claim_resource(dev, idx) < 0) { dev_warn(&dev->dev, "BAR %d: can't allocate resource\n", idx); /* * Something is wrong with the region. * Invalidate the resource to prevent * child resource allocations in this * range. */ r->flags = 0; } } } pcibios_allocate_bus_resources(&bus->children); } } |
Basically just place this code
/* Ian Porter added, to test for the nvidia problem [0xb0000000-0xbfffffff] is where the BIOS is telling nvidia to get the memory, but with 4GB this is where the system memory is. a better way of doing this, would be to run the BIOS find memory process twice and then if no resources can gain memory, e.g. nvidia in this case, flag it for the second run to then give that the starting area and re-do the rest of them, because mainly it is the graphics card that needs the most memory..e.g. 256-512 etc. */ if ((r->start >= 0xc0000000) && (r->end <= 0xcfffffff)) { dev_info(&dev->dev, " not allocating resource 0xc - 0xcf %pR\n", r); /* stop any resources gaining the 0xc0000000 - 0xcfffffff region, the linux kernel will re-place them. */ r->flags = 0; } /* where the nvidia is going and replace in the above region */ if ((r->start == 0xb0000000) && (r->end == 0xbfffffff)) { r->start = 0xc0000000; r->end = 0xcfffffff; } |
after the
r = &dev->resource[idx]; |
in the for loop
compile up the kernel as on this post, the basics are
cd /usr/src/ apt-get install fakeroot kernel-wedge build-essential makedumpfile apt-get build-dep linux apt-get build-dep linux-image-$(uname -r) apt-get source linux-image-$(uname -r) debian/rules updateconfigs cd debian.master/scripts/misc chmod a+x * cd - debian/rules updateconfigs |
make the changes as described in the file arch/x86/pci/i386.c as above, and then
fakeroot debian/rules clean CONCURRENCY_LEVEL=2 AUTOBUILD=1 NOEXTRAS=1 fakeroot debian/rules binary-generic |
this will create a linux image and headers debian file, after a long wait in the /usr/src directory there will be couple of deb files (Of course change the files names for the header and image that you may have)
cd .. dpkg -i linux-headers-2.6.31-17-generic_2.6.31-17.54_amd64.deb dpkg -i linux-image-2.6.31-17-generic_2.6.31-17.54_amd64.deb |
To stop the aptitude from trying to update the linux-image back to the stock one I just did (again change to the image and headers that you have)
aptitude hold linux-image-2.6.31-17-generic_2.6.31-17.54_amd64.deb aptitude hold linux-headers-2.6.31-17-generic_2.6.31-17.54_amd64.deb |
Also had to do
echo linux-headers-2.6.31-17-generic hold | dpkg --set-selections echo linux-image-2.6.31-17-generic hold | dpkg --set-selections |
To stop the apt-get upgrade/update as well.
IOMEM of a none working 4GB graphics card, if you note that there is not enough chunck of memory to house the nvidia 256MB memory grab, but there is space enough if the items between the 0xc0000000 – 0xcfffffff are moved about then there is enough space.
00000000-00000fff : System RAM 00001000-00005fff : reserved 00006000-0009b3ff : System RAM 0009b400-0009ffff : reserved 000dc000-000dffff : reserved 000e4000-000fffff : reserved 00100000-bfe8ffff : System RAM 01000000-01530dd8 : Kernel code 01530dd9-018236af : Kernel data 018d5000-019e4ccb : Kernel bss 02000000-09ffffff : Crash kernel bfe90000-bfe99fff : ACPI Non-volatile Storage bfe9a000-bfffffff : reserved c0000000-c1ffffff : PCI Bus 0000:03 c2000000-c3ffffff : PCI Bus 0000:05 c4000000-c5ffffff : PCI Bus 0000:02 c4000000-c401ffff : 0000:02:00.0 c6000000-c7ffffff : PCI Bus 0000:07 c8000000-c9ffffff : PCI Bus 0000:03 ca000000-cbffffff : PCI Bus 0000:05 cc000000-cdffffff : PCI Bus 0000:02 cc000000-cc003fff : 0000:02:00.0 cc000000-cc003fff : sky2 ce000000-cfffffff : PCI Bus 0000:07 ce000000-ce000fff : 0000:07:00.0 ce000000-ce000fff : iwl3945 d0000000-d1ffffff : PCI Bus 0000:01 d0000000-d0ffffff : 0000:01:00.0 d1000000-d1ffffff : 0000:01:00.0 d2000000-d20fffff : PCI Bus 0000:09 d2000000-d2003fff : 0000:09:06.1 d2004000-d2004fff : 0000:09:06.2 d2004000-d2004fff : tifm_7xx1 d2005000-d20057ff : 0000:09:04.0 d2005000-d20057ff : saa7133[0] d2005800-d2005fff : 0000:09:06.1 d2005800-d2005fff : ohci1394 d2006000-d20060ff : 0000:09:06.3 d2006000-d20060ff : mmc0 d2007000-d2007fff : 0000:09:06.0 d2007000-d2007fff : yenta_socket d2300000-d2303fff : 0000:00:1b.0 d2300000-d2303fff : ICH HD audio d2304000-d23043ff : 0000:00:1d.7 d2304000-d23043ff : ehci_hcd d2304400-d23047ff : 0000:00:1f.2 d2304400-d23047ff : ahci d4000000-d7ffffff : PCI Bus 0000:09 d4000000-d7ffffff : PCI CardBus 0000:0a d8000000-dbffffff : PCI CardBus 0000:0a e0000000-efffffff : PCI MMCONFIG 0 [00-ff] e0000000-efffffff : reserved e0000000-efffffff : pnp 00:01 fec00000-fec0ffff : reserved fec00000-fec00fff : IOAPIC 0 fed00000-fed003ff : HPET 0 fed00000-fed003ff : reserved fed14000-fed19fff : reserved fed14000-fed17fff : pnp 00:01 fed18000-fed18fff : pnp 00:01 fed19000-fed19fff : pnp 00:01 fed1c000-fed8ffff : reserved fed1c000-fed1ffff : pnp 00:01 fed20000-fed3ffff : pnp 00:01 fed45000-fed8ffff : pnp 00:01 fee00000-fee00fff : Local APIC fee00000-fee00fff : reserved ff000000-ffffffff : reserved |
Working IOMEM 4GB graphics nvidia geforce 7600 256MB card, the items that was in the 0xc0000000 – 0xcfffffff ranges are now placed further down in the memory allocations, if you look for sky2 , iwl3945 , which are kinder needed for the wireless capabilities of the laptop.
00000000-00000fff : System RAM 00001000-00005fff : reserved 00006000-0009b3ff : System RAM 0009b400-0009ffff : reserved 000dc000-000dffff : reserved 000e4000-000fffff : reserved 00100000-bfe8ffff : System RAM 01000000-01530f79 : Kernel code 01530f7a-018216ef : Kernel data 018d3000-019e2ccb : Kernel bss 02000000-09ffffff : Crash kernel bfe90000-bfe99fff : ACPI Non-volatile Storage bfe9a000-bfffffff : reserved c0000000-cfffffff : PCI Bus 0000:01 c0000000-cfffffff : 0000:01:00.0 d0000000-d1ffffff : PCI Bus 0000:01 d0000000-d0ffffff : 0000:01:00.0 d1000000-d1ffffff : 0000:01:00.0 d1000000-d1ffffff : nvidia d2000000-d20fffff : PCI Bus 0000:09 d2000000-d2003fff : 0000:09:06.1 d2004000-d2004fff : 0000:09:06.2 d2004000-d2004fff : tifm_7xx1 d2005000-d20057ff : 0000:09:04.0 d2005000-d20057ff : saa7133[0] d2005800-d2005fff : 0000:09:06.1 d2005800-d2005fff : ohci1394 d2006000-d20060ff : 0000:09:06.3 d2006000-d20060ff : mmc0 d2007000-d2007fff : 0000:09:06.0 d2007000-d2007fff : yenta_socket d2100000-d21fffff : PCI Bus 0000:02 d2100000-d2103fff : 0000:02:00.0 d2100000-d2103fff : sky2 d2200000-d22fffff : PCI Bus 0000:02 d2200000-d221ffff : 0000:02:00.0 d2300000-d2303fff : 0000:00:1b.0 d2300000-d2303fff : ICH HD audio d2304000-d23043ff : 0000:00:1d.7 d2304000-d23043ff : ehci_hcd d2304400-d23047ff : 0000:00:1f.2 d2304400-d23047ff : ahci d2400000-d24fffff : PCI Bus 0000:07 d2400000-d2400fff : 0000:07:00.0 d2400000-d2400fff : iwl3945 d4000000-d7ffffff : PCI Bus 0000:09 d4000000-d7ffffff : PCI CardBus 0000:0a d8000000-dbffffff : PCI CardBus 0000:0a e0000000-efffffff : PCI MMCONFIG 0 [00-ff] e0000000-efffffff : reserved e0000000-efffffff : pnp 00:01 fec00000-fec0ffff : reserved fec00000-fec00fff : IOAPIC 0 fed00000-fed003ff : HPET 0 fed00000-fed003ff : reserved fed14000-fed19fff : reserved fed14000-fed17fff : pnp 00:01 fed18000-fed18fff : pnp 00:01 fed19000-fed19fff : pnp 00:01 fed1c000-fed8ffff : reserved fed1c000-fed1ffff : pnp 00:01 fed20000-fed3ffff : pnp 00:01 fed45000-fed8ffff : pnp 00:01 fee00000-fee00fff : Local APIC fee00000-fee00fff : reserved ff000000-ffffffff : reserved |
hope this post helps other people to get around the nvidia laptop memory grab, hopefully I am going to write a pci kernel update so that it does not have to block out a set part of memory.