diff options
author | Dave Airlie <airlied@redhat.com> | 2011-08-31 06:00:47 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-08-31 11:47:07 +0100 |
commit | 1058663a5ebc9f94ebeae6c3727f16dfc39d088e (patch) | |
tree | f2ffd3d064bac22b3601fa394dccea3345019617 | |
parent | 4343ecb2291b86e2d7632cf9600b970e5c16ef42 (diff) |
radeontool: add support for parsing OF ibm,* setup tables
using tables from rv100 on js22 machine, not sure what 0xa op in init2 table is
these tables are found in the open firmware device tree,
/proc/device-tree/pci@800000020000202/display@1/ on the js22
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | radeontool.c | 112 |
1 files changed, 103 insertions, 9 deletions
diff --git a/radeontool.c b/radeontool.c index aab1bca..6e269f1 100644 --- a/radeontool.c +++ b/radeontool.c @@ -2788,6 +2788,81 @@ void radeon_rom_legacy_memclktable(unsigned char *bios, int hdr) block_rev = BIOS8(offset); } } + +#define OF32(offset) (*((unsigned int *)(bios + (offset)))) +#define _2K (2*1024) + +#define OF_TABLE_INIT1 1 +#define OF_TABLE_INIT2 2 +#define OF_TABLE_PLL 3 +#define OF_TABLE_MEMINIT 4 + +void radeon_of_table(const char * file, int table) +{ + unsigned char bios[_2K]; + unsigned int reg, mask, val, op; + int fd; + int len; + int count = 0; + fd = open(file, O_RDONLY); + if (fd < 0) { + perror("can't open init file"); + return; + } + memset(bios, 0, _2K); + len = read(fd, bios, _2K); + close(fd); + + while (len > 0) { + switch(table) { + case OF_TABLE_INIT1: + len -= 12; + reg = OF32(count); + mask = OF32(count + 4); + val = OF32(count + 8); + printf("reg: 0x%x, mask 0x%x, val 0x%x\n", reg, mask, val); + count += 12; + break; + case OF_TABLE_INIT2: + len -= 16; + reg = OF32(count); + mask = OF32(count + 4); + val = OF32(count + 8); + op = OF32(count + 12); + printf("reg: 0x%x, mask 0x%x, val 0x%x op 0x%x\n", reg, mask, val, op); + count += 16; + break; + case OF_TABLE_PLL: + len -= 16; + reg = OF32(count); + mask = OF32(count + 4); + val = OF32(count + 8); + op = OF32(count + 12); + printf("pll reg: 0x%x, mask 0x%x, val 0x%x, op %x\n", reg, mask, val, op); + if (op == 5) + printf("delay 1 ms\n"); + else if (op == 6) + printf("delay 150 us\n"); + else if (op) + printf("unknown op %d\n", op); + count += 16; + break; + case OF_TABLE_MEMINIT: + len -= 4; + val = OF32(count); + if (val >> 16 == 0x6fff) + printf("pwup complete test\n"); + else { + mask = val >> 24; + val = val & 0xffff; + printf("rmw SDRAM mask %x %x\n", val, mask); + } + count += 4; + break; + } + } +} + void radeon_rom_tables(const char * file) { #define _64K (64*1024) @@ -2891,8 +2966,8 @@ int main(int argc,char *argv[]) break; } } - map_radeon_cntl_mem(); if(argc == 2) { + map_radeon_cntl_mem(); if(strcmp(argv[1],"regs") == 0) { radeon_cmd_regs(); return 0; @@ -2910,6 +2985,27 @@ int main(int argc,char *argv[]) return 0; }; } else if(argc == 3) { + if(strcmp(argv[1],"romtables") == 0) { + radeon_rom_tables(argv[2]); + return 0; + } + if(strcmp(argv[1],"oftablepll") == 0) { + radeon_of_table(argv[2], OF_TABLE_PLL); + return 0; + } + if(strcmp(argv[1],"oftableinit1") == 0) { + radeon_of_table(argv[2], OF_TABLE_INIT1); + return 0; + } + if(strcmp(argv[1],"oftableinit2") == 0) { + radeon_of_table(argv[2], OF_TABLE_INIT2); + return 0; + } + if(strcmp(argv[1],"oftablememinit") == 0) { + radeon_of_table(argv[2], OF_TABLE_MEMINIT); + return 0; + } + map_radeon_cntl_mem(); if(strcmp(argv[1],"dac") == 0) { radeon_cmd_dac(argv[2]); return 0; @@ -2922,15 +3018,13 @@ int main(int argc,char *argv[]) } else if(strcmp(argv[1],"regmatch") == 0) { radeon_reg_match(argv[2]); return 0; - } else if(strcmp(argv[1],"romtables") == 0) { - radeon_rom_tables(argv[2]); - return 0; - }; + } } else if(argc == 4) { - if(strcmp(argv[1],"regset") == 0) { - radeon_reg_set(argv[2], strtoul(argv[3], NULL, 0)); - return 0; - } + map_radeon_cntl_mem(); + if(strcmp(argv[1],"regset") == 0) { + radeon_reg_set(argv[2], strtoul(argv[3], NULL, 0)); + return 0; + } } usage(); |