From: Michel <mi...@da...> - 2002-04-30 22:36:23
|
On Tue, 2002-04-30 at 23:53, Leif Delgass wrote: > On Tue, 30 Apr 2002, Jos=E9 Fonseca wrote: >=20 > > On 2002.04.30 22:07 Jos=E9 Fonseca wrote: > > > ... Next in mach64_drv.h, let's try the following definitions for the= =20 > > > MMIO: > > >=20 > > > #define MACH64_READ(reg) readl(MACH64_ADDR(reg)) > > > #define MACH64_WRITE(reg,val) writel(MACH64_ADDR(val, reg)) > > >=20 > >=20 > > Sorry, i've mistaken writting it. It's instead > >=20 > > #define MACH64_READ(reg) readl(MACH64_ADDR(reg)) > > #define MACH64_WRITE(reg,val) writel(val, MACH64_ADDR(reg)) >=20 > There's a wrinkle for the vertex buffers though. The register offsets an= d > data in the buffer have already been swapped to little-endian, whereas th= e > state updates and such using the DMA* macros (which in turn use > MACH64_WRITE) pass data to the macros in cpu endianess. So in the > pseudo-DMA code in _dispatch_vertex, I changed the >=20 > MACH64_WRITE(reg, *p++);=20 >=20 > to >=20 > MACH64_DEREF(reg) =3D *p++; Maybe better MACH64_WRITE(le32_to_cpu(*p++), reg); ? > because the value (*p) is already little-endian, whereas the register > address has to be swapped from little-endian back to big-endian for the > MMSELECT(reg). So wouldn't you have to swap the value back to big-endian > as well in order to use this modified MACH64_WRITE macro? Yes, but it's already done correctly AFAICS on mach64_state.c line 530: reg =3D le32_to_cpu(*p++); PS: http://www.byteswap.net/mikesnotes/2002/getting-started/ is a nice introductory article about cross-platform lowlevel programming. --=20 Earthling Michel D=E4nzer (MrCooper)/ Debian GNU/Linux (powerpc) developer XFree86 and DRI project member / CS student, Free Software enthusiast |