ron minnich <rminnich at 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