summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-08-31 06:00:47 -0400
committerDave Airlie <airlied@redhat.com>2011-08-31 11:47:07 +0100
commit1058663a5ebc9f94ebeae6c3727f16dfc39d088e (patch)
treef2ffd3d064bac22b3601fa394dccea3345019617
parent4343ecb2291b86e2d7632cf9600b970e5c16ef42 (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.c112
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();