Embedded Linux PCI memory map

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From English to

Threaded View
I have a question about PCI memory map. We use a processor that can only
access 128M of PCI memory. So lets say it has assigned the PCI memory
from 0xd0000000 - 0xd7ffffff .. Now I have PCI device which has 4 base

Base Adress 0        - 64M
Base Address 1      -4 M
Base Address 2      - 4 M
Base Adress   3      - 4 M

Now what I see when Linux Boots up. It sets the first PCI memory at 64 Meg
boundary. That means, linux Writes 0xd4000000 on the first BaseAddress_0 of
the PCI card . Then it would set the Base Address_1 to 0xd8000000.

Now as you can see, Linux just wasted the memory from 0xd0000000 -
0xd4000000 .. Is there any reason why Linux has to set the BaseAddress_0
starting at 64 Meg boundary. Why cannt I set BaseAddress_0 to 0xd0000000
(which is a page boudary)

Re: Embedded Linux PCI memory map

Quoted text here. Click to load it

First of all, I very much doubt that it is Linux that is the culprit. At
least on a standard PC platform, it is the BIOS that is responsible for
assigning addresses to PCI peripherals. I've never heard of an OS
re-mapping them?!? (but am happy to be proven wrong)

Quoted text here. Click to load it

In theory, the only restriction is that memory spaces must be
naturally-aligned. In this case, $d0000000 is perfectly valid for a 64MB

In the normal course of events, you don't get much choice where these
windows are allocated. You get what you're given.

However, it may be possible to re-locate a device's memory windows
yourself by re-programming the BAR registers via PCI configuration
cycles once the system is up and running. I'm not sure (a) exactly how
this is done and (b) whether or not that'll confuse the hell out of
Linux. Maybe you need to fake a 'hotswap'?


Site Timeline