From: José F. <j_r...@ya...> - 2002-04-30 22:44:29
|
On 2002.04.30 22:53 Leif Delgass wrote: > ... > > There's a wrinkle for the vertex buffers though. The register offsets > and > data in the buffer have already been swapped to little-endian, whereas > the > 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 > > MACH64_WRITE(reg, *p++); > > to > > MACH64_DEREF(reg) = *p++; > > 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, indeed. I never check how you implemented that so I overlooked. I attached a complete diff that should do the right thing. I believe this is the only way to do this in a portable fashion, even if results in some redundant work being done on bigendian machines. I also avoided to increment the pointer inside the macros, just in case the le32_to_cpu macro reuses it's argument. Peter, apply it by making something like patch -p1 -i mach64-endian-mmio.diff in the xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel and report back to us when you have time. José Fonseca |