[U-Boot-Users] this is my understanding of pciauto_region_align function, is it right?
xianghui ren
renfamilyxh at gmail.com
Thu Dec 6 10:00:07 CET 2007
void pciauto_region_align(struct pci_region *res, unsigned long size)
{
res->bus_lower = ((res->bus_lower - 1) | (size - 1)) + 1;
}
The above function is to do address align with size.
Belows is my explanation with example:
According to PCI specification, size must be the power of 2,
assume Size is 0x100, then size-1 = 0xFF;
(res->bus_lower - 1) | (size - 1) = 0x??????FF;
((res->bus_lower - 1) | (size - 1)) + 1=0x??????00;
So, the result is aligned with size of 0x100.
Now let analyse "res->bus_lower", we must divide it into two aspects:
1. res->bus_lower = 0x??????0?
because or operate with 0x??????FF, substracting 1 is not important.
2. res->bus_lower = 0x??????00
Obviously, the address is aligned with size of 0x100, so doing substract 1
is necessary,
then the result of ((res->bus_lower - 1) | (size - 1)) + 1 is the same with
the original value of res->bus_lower.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.denx.de/pipermail/u-boot/attachments/20071206/cf71f7b8/attachment.htm
More information about the U-Boot
mailing list