Messages in this thread | | | Subject | Re: Question of resource_size() implementation | From | Ben Nizette <> | Date | Wed, 30 Dec 2009 12:04:07 +1100 |
| |
On 30/12/2009, at 11:16 AM, Felipe Balbi wrote:
> On Tue, 2009-12-29 at 16:12 -0800, Joe Perches wrote: >> On Wed, 2009-12-30 at 01:43 +0200, Felipe Balbi wrote: >>> I'm wondering whether the +1 in resource_size() is actually necessary. >>> resource_size() is defined as: >> [] >>> static inline resource_size_t resource_size(const struct resource *res) >>> { >>> return res->end - res->start + 1; >>> } >>> Are we off-by-one >>> here ? Or is this all expected ? >> >> Imagine you have 1 byte sized resources. >> >> AREA1 = 0x40000000 >> AREA2 = 0x40000001 >> >> area1.start = 0x40000000 >> area1.end = 0x40000000 >> >> area2.start = 0x40000001 >> area2.end = 0x40000001 > > (adding lkml back to the loop) > > in that you wouldn't use any of the SZ_* macros and simply hardcode > start and end, right ? then you would define: > > area1.start = 0x40000000 > area1.end = 0x40000001
No-o, you'd hardcode
area1.start=0x40000000 area1.end=0x40000000
As Joe wrote. Then the resource_size would return 1 and ioremap would map the 1 byte starting at 0x400000000, i.e. just 0x400000000. This is correct.
In your original example you had
.start = MEM_AREA1_BASE, .end = MEM_AREA1_BASE + SZ_4K - 1
So resource_size would return SZ_4K and ioremap would map the SZ_4K bytes starting at MEM_AREA1_BASE, i.e. MEM_AREA1_BASE to MEM_AREA1_BASE - 1 /inclusive/. This is also correct.
--Ben.
| |