Subject: Re: Appropriate use of bus_space_vaddr()
To: McGranaghan, Sean <SMcGranaghan@vanteon.com>
From: Nathan J. Williams <nathanw@wasabisystems.com>
List: netbsd-help
Date: 02/25/2004 12:14:07
"McGranaghan, Sean" <SMcGranaghan@vanteon.com> writes:

> 	#define rCTRLREG(b)	(*(b + REG_OFFSET))
> 
> 	vaddr_t b;
> 
> 	b = (vaddr_t) bus_space_vaddr(sc->sc_iot, sc->ioh);
> 	rCTRLREG(b) |= BITMSK;
> 
> Seems preferable to:
> 
> 	u_int32_t value;
> 
> 	value = bus_space_read_4(sc->sc_iot, sc->ioh, REG_OFFSET);
> 	value |= BITMSK;
>       bus_space_write_4(sc->sc_iot, sc->ioh, offset, REG_OFFSET);
> 
> Are these equivalent?

If the types and access sizes worked out, I think that those would be
equivalent. I'm not at all sure the type operation on vaddr_t will
work there, but even ignoring that, that's not an approved use of
bus_space_vaddr() - the main purpose is exposing frame buffer
memory.

Importantly, bus_space_vaddr() doesn't always work - it only works for
bus spaces that are linearly mappable, which is not true of device
register spaces on several architectures (I/O space on x86,
sparse-mapped buses on Alpha, etc...)

> Do I need to specify a barrier after my read-modify-write?

In practice, everything currently has implicit barriers, so it's not
worth worrying about now. You would need a barrier in theory if the
later reads and writes depended critically on happening after that
bitmask was set.

        - Nathan