ron minnich rminnich@lanl.gov writes:
On Tue, 9 Mar 2004, YhLu wrote:
I mean
/* Get the base address */ base = resource->base; /* Get the resource alignment */ align = 1UL << resource->align; /* Get the limit (rounded up) */ limit = base + ((resource->size + align - 1UL) & ~(align - 1UL))
-1UL;
I am thinking now about what you said. Granularity is the units of allocation. Alignment is the alignment of the data.
Examples: 64 byte granularity, 32-byte alignment, you can see that addresses of 32, 64, 96, etc. are acceptable. 64 byte granularity, 64 byte alignment, only addresses of 64, 128, ... are acceptable.
If memory serves, behind a bridge, the memory space granularity is 16 bits (or is it 20? memory fails). Alignment is more or less the size of the resource.
Looking at quadrics, the resource is 28 bits, so that will have to be the alignment, and granularity is 20 bits.
So the expression above is wrong, I think you are correct. It will work in many cases but fail in some. I think it should be this:
limit = base + ((resource->size + gran - 1UL) & ~(gran - 1UL)) -1UL
as you already said.
I.e. take the base, add a size rounded up to gran, and add it to base.
That is right. I feel quite silly that is the code that is sitting in my tree and I feel for not getting it pushed out earlier. I'm going to many directions at once or something like that.
It has the additional comment:
/* Get the resource granularity */ gran = 1UL << resource->gran;
/* For a non bridge resource granularity and alignment are the same. * For a bridge resource align is the largest needed alignment below * the bridge. While the granularity is simply how many low bits of the * address cannot be set. */ /* Get the limit (rounded up) */ limit = base + ((resource->size + gran - 1UL) & ~(gran - 1UL)) -1UL;
I will get this committed shortly. At least I chose sane names so this could be reasoned out.
Eric