Subject: Re: bus.h style question
To: Bill Studenmund <>
From: Chris G. Demetriou <>
List: tech-kern
Date: 08/15/1997 14:27:19
[ i meant to jump in earlier in this discussion, but have not had the time. ]

> > On Thu, 14 Aug 1997 15:56:41 -0500 (CDT) 
> >  Scott Reynolds <scottr@Plexus.COM> wrote:
> > 
> >  > There is no byte swapping done by bus_space.  As Leo (I think) points out,
> >  > you may or may not need it for some hardware.  A simple example that
> >  > hasn't been mentioned is the DP8390 Ethernet controller; it can be
> >  > configured for either big- or little-endian modes.
> > 
> > For some busses, the only sane way to treat them is their "native" byte
> > order.  I.e. ISA, EISA, and PCI should all be considered "little endian".
> > It's my opinion that the bus_space_* functions _should_ perform the
> > necessary byte swapping, and the components on boards should always
> > be configured for the byte order they'd be configured if the processor
> > were little-endian.
> What about the case (which I think exists for the Atari's) where
> interveening hardware does the byte swapping? Also, what about PCI
> Powermacs? I'm not sure if the hardware there does swapping, but all of
> the docs I've seen for the MacIO stuff (Mac IO ports off the PCI bus)
> haven't spoken about enianisms, and Apple runs the CPU as big-endian.

Jason said "necessary" byte swapping.  In the case where a bus
interface does byte swapping, the code doesn't need to do the byte
swapping itself.

I seem to recall that there are multiple ISA bridges for the Amiga,
some of which do byte swapping and some of which do not.

> > Of course, this makes using the 16-bit or 32-bit methods for octet streams
> > a bit difficult...
> Since having the swapping DOES make sense for a lot (most maybe?) of cases,
> maybe it should be some sort of option? Maybe set when the space is
> mapped?

Thereby adding complexity to ... lots of things, most importantly the
code which implements the basic read-write path.

The 16-bit and 32-bit methods _should not_ be used for streams of
bytes.  They are meant to access multi-byte data items, and accessing
groups of single byte data items with them is _incorrect_.

If you want to access multiple data items "efficiently" (regardless of
their size) {read,write}_multi_* are the interfaces to use, and should
be used with the correct data item size.