rendered paste bodydiff --git a/src/revenge_detect.c b/src/revenge_detect.c
index 5ed41da..2a5e5b9 100644
--- a/src/revenge_detect.c
+++ b/src/revenge_detect.c
@@ -153,6 +153,22 @@ detect_pcigart_aperture (void)
}
void
+detect_rs690gart_aperture (void)
+{
+ pcigart_addr = register_read_rs690 (RADEON_RS690GART_BASE_ADDR);
+ pcigart_start = (register_read_rs690 (RADEON_RS690GART_LOCATION) & 0xffff) << 16;
+ pcigart_end = (register_read_rs690 (RADEON_RS690GART_LOCATION) & 0xffff0000);
+ pcigart_len = pcigart_end - pcigart_start;
+
+ if (option_debug)
+ {
+ printf
+ ("%s: pcigart_addr = 0x%08x pcigart_len = 0x%08x pcigart_start = 0x%08x pcigart_end = 0x%08x\n",
+ __func__, pcigart_addr, pcigart_len, pcigart_start, pcigart_end);
+ }
+}
+
+void
detect_igpgart_aperture (void)
{
unsigned int agp_addr;
diff --git a/src/revenge_detect.h b/src/revenge_detect.h
index b53fae2..b7ea81a 100644
--- a/src/revenge_detect.h
+++ b/src/revenge_detect.h
@@ -40,6 +40,7 @@ void detect_agp_aperture (void);
void detect_fb_aperture (void);
void detect_pcigart_aperture (void);
void detect_igpgart_aperture (void);
+void detect_rs690gart_aperture (void);
void detect_reg_aperture (void);
void detect_max_texture_units (void);
diff --git a/src/revenge_main.c b/src/revenge_main.c
index b8d363a..a760838 100644
--- a/src/revenge_main.c
+++ b/src/revenge_main.c
@@ -103,6 +103,7 @@ static struct option long_options[] = {
{"output", required_argument, 0, 'o'},
{"pci", no_argument, &option_interface, INTERFACE_PCI},
{"pci-e", no_argument, &option_interface, INTERFACE_PCI_E},
+ {"rs690", no_argument, &option_interface, INTERFACE_RS690},
{"verbose", no_argument, &option_verbose, 1},
{0, 0, 0, 0},
};
@@ -216,6 +217,17 @@ main (int argc, char **argv)
exit (EXIT_FAILURE);
}
break;
+ case INTERFACE_RS690:
+ detect_rs690gart_aperture ();
+ if ((pcigart_mem_map =
+ mmap (NULL, pcigart_len, PROT_READ | PROT_WRITE, MAP_SHARED,
+ mem_fd, pcigart_addr)) == MAP_FAILED)
+ {
+ fprintf (stderr, "%s: %s\n", program_invocation_short_name,
+ strerror (errno));
+ exit (EXIT_FAILURE);
+ }
+ break;
default:
assert (0);
break;
@@ -269,6 +281,7 @@ main (int argc, char **argv)
exit (EXIT_FAILURE);
}
break;
+ case INTERFACE_RS690:
case INTERFACE_IGP:
case INTERFACE_PCI:
case INTERFACE_PCI_E:
diff --git a/src/revenge_main.h b/src/revenge_main.h
index a79c990..5714b07 100644
--- a/src/revenge_main.h
+++ b/src/revenge_main.h
@@ -29,6 +29,7 @@ enum interface_t
INTERFACE_IGP,
INTERFACE_PCI,
INTERFACE_PCI_E,
+ INTERFACE_RS690,
};
#define AVIVO_CRTC1_FB_LOCATION 0x6110
@@ -113,6 +114,15 @@ enum interface_t
#define RADEON_IGPGART_ENABLE 0x38
#define RADEON_IGPGART_UNK_39 0x39
+#define RADEON_RS690GART_INDEX 0x78
+# define RADEON_RS690GART_INDEX_MASK 0x1ff
+# define RADEON_RS690GART_INDEX_WRITEBIT (1 << 9)
+# define RADEON_RS690GART_INDEX_WRITEACK 0x7f /* write ack value */
+#define RADEON_RS690GART_DATA 0x7c
+
+#define RADEON_RS690GART_BASE_ADDR 0x2c
+#define RADEON_RS690GART_LOCATION 0x101
+
#define R300_TX_SIZE_0 0x4480
# define R300_TX_WIDTHMASK_SHIFT 0
# define R300_TX_WIDTHMASK_MASK 0x7ff
diff --git a/src/revenge_memory.c b/src/revenge_memory.c
index fd28e04..9bcd3c1 100644
--- a/src/revenge_memory.c
+++ b/src/revenge_memory.c
@@ -61,6 +61,7 @@ memory_gart_to_phys (unsigned int addr)
switch (option_interface)
{
+ case INTERFACE_RS690:
case INTERFACE_IGP:
phys_addr = pcigart_mem_map[num] & ~0xc;
break;
@@ -162,6 +163,7 @@ memory_read (unsigned int addr, unsigned int size)
case INTERFACE_AGP:
mem_map = memory_read_agp (addr, size);
break;
+ case INTERFACE_RS690:
case INTERFACE_IGP:
case INTERFACE_PCI:
case INTERFACE_PCI_E:
diff --git a/src/revenge_register.c b/src/revenge_register.c
index 05d1b58..00483c2 100644
--- a/src/revenge_register.c
+++ b/src/revenge_register.c
@@ -65,3 +65,19 @@ register_write_igp (unsigned int key, unsigned int val)
register_write (RADEON_IGPGART_DATA, val);
register_write (RADEON_IGPGART_INDEX, 0x7f);
}
+
+unsigned int
+register_read_rs690 (unsigned int key)
+{
+ register_write (RADEON_RS690GART_INDEX, key & RADEON_RS690GART_INDEX_MASK);
+ return register_read (RADEON_RS690GART_DATA);
+}
+
+
+void
+register_write_rs690 (unsigned int key, unsigned int val)
+{
+ register_write (RADEON_RS690GART_INDEX, (key & RADEON_RS690GART_INDEX_MASK) | RADEON_RS690GART_INDEX_WRITEBIT);
+ register_write (RADEON_RS690GART_DATA, val);
+ register_write (RADEON_RS690GART_INDEX, RADEON_RS690GART_INDEX_WRITEACK);
+}
diff --git a/src/revenge_register.h b/src/revenge_register.h
index 59e624e..4a34f57 100644
--- a/src/revenge_register.h
+++ b/src/revenge_register.h
@@ -29,5 +29,6 @@ unsigned int register_read_pcie (unsigned int key);
void register_write_pcie (unsigned int key, unsigned int val);
unsigned int register_read_igp (unsigned int key);
void register_write_igp (unsigned int key, unsigned int val);
-
+unsigned int register_read_rs690 (unsigned int key);
+void register_write_rs690 (unsigned int key, unsigned int val);
#endif