#include #include #include #include #include #include void * mmio; //#define RADEON_RBASE 0xe3000000 //#define RADEON_RBASE 0xb0000000 #define RADEON_RBASE 0x90000000 //#define RADEON_RBASE 0x90080000 static unsigned char regr8(volatile void *base, const unsigned long offset) { unsigned char val; __asm__ __volatile__( "lbzx %0,%1,%2\n\t" "eieio" : "=r" (val) : "b" (base), "r" (offset), "m" (*((volatile unsigned char *)base+offset))); return(val); } static void regw8(volatile void *base, const unsigned long offset, const unsigned char val) { __asm__ __volatile__ ("stbx %1,%2,%3\n\t" "eieio" : "=m" (*((volatile unsigned char *)base+offset)) : "r" (val), "b" (base), "r" (offset)); } static unsigned int regr(volatile void *base, const unsigned long offset) { unsigned int val; __asm__ __volatile__ ("lwbrx %0,%1,%2\n\t" "eieio" : "=r" (val) : "b" (base), "r"(offset), "m" (*((volatile unsigned char *)base+offset))); return val; } static void regw(volatile void *base, const unsigned long offset, const unsigned int val) { __asm__ __volatile__ ("stwbrx %1,%2,%3\n\t" "eieio" : "=m" (*((volatile unsigned char *)base+offset)) : "r"(val), "b"(base), "r"(offset)); } static unsigned int pllr(volatile void *base, const unsigned long index) { unsigned int val; regw8(base, 0x8, index & 0x3f); return regr(base, 0xc); } unsigned long regs[0x800]; unsigned long pllregs[0x40]; int main() { int fd, i; fd = open("/dev/mem", O_RDWR); mmio = (void *)mmap(0, 0x80000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, RADEON_RBASE); for (i=0; i<0x800; i++) regs[i] = regr(mmio, i*4); for (i=0; i<0x40; i++) pllregs[i] = pllr(mmio, i); printf("Radeon MMIO registers:\n"); for (i=0; i<0x800; i++) { if (regs[i] != 0) printf("%04x : %08x\n", i*4, regs[i]); } printf("\nRadeon PLL registers:\n"); for (i=0; i<0x40; i++) { if (pllregs[i] != 0) printf(" %02x : %08x\n", i, pllregs[i]); } printf("\n"); }