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.

ron


_______________________________________________
Linuxbios mailing list
[EMAIL PROTECTED]
http://www.clustermatic.org/mailman/listinfo/linuxbios

Reply via email to