On Thursday 03 November 2005 16:16, Martin Krause wrote:
> Mark Chambers wrote on Thursday, November 03, 2005 3:06 PM:
> > > The endianess on PCI on ppc is still an issue (I haven't
> > > investigated this problem further during the last month).
> >
> > There really shouldn't be an endian issue on SM501 since registers are
> > 32 bit.  What we do have is the 5200 that does byte swapping on PCI
> > for no good reason (IMHO)

Actually the 5200 does _not_ change the order of bytes written on the PCI bus, 
but just the bytelanes. Why? Consider this. We have two mapped entities and 
some data in system memory.

        struct something {
                char 1;
                char 2;
                char 3;
                char 4;
        };

        /* Mapped memory from PCI bus */
        struct something *device_memory;
        uint32_t *device_register;

        /* And local data */
        struct something system_memory = { 0x11, 0x22, 0x33, 0x44 };
        uint32_t value = 0x11223344;

And we transfer data from system memory to PCI device.

        memcpy(device_memory, &system_memory, sizeof(struct something));
        *device_register = value;

These both would create 32-bit access to the PCI device( I suppose :), but if 
we just blindly swap or don't swap written bytes the result is mess:

                                        Swapping
Item            With                                            Without
struct  { 0x44, 0x33, 0x22, 0x11 }      { 0x11, 0x22, 0x33, 0x44 }
integer 0x44331100                              0x11223344
Result  Integer OK                              Struct OK
                Struct messed                           Integer messed

So the actual problem is that there is no feasible way to determine if a 
access of given width needs to be swapped on the "bus-level". So basically it 
is left to user to decide when the swapping is needed. But of course this can 
be taken care on the device level with clever planning.

I hope I didn't get it all too wrong. :)

> We experienced a byte swapping issue on the SM501, too, although it
> is connected via the local plus bus with the MPC5200 and not via PCI
> bus.
>
> In 16 bpp mode bytes appear to be swapped in a very ugly way.
> Unfortunately we have no explanation for this, nor a real
> workaround.

Yes, the byteswap implementation on SMI-chips is quite braindead. They have
        
Input   1234
Swap1   4321
Swap2   3412

When what we really need is:

Swap    2143

IMHO the easiest way is to use 24-bit mode that can be usually handled only by 
changing the byte-offsets.

- Jarno

Reply via email to