[PATCH 3/6] avivotool: error out unless there is exactly one control and fb region

Jonathan Nieder jrnieder at gmail.com
Mon Feb 20 23:45:39 PST 2012


Just like radeontool, avivotool should not blindly fall back to
region 0 when the expected memory areas cannot be found.  Noticed by
code inspection.  (Compare commits 51a87cf0 and 7e3e9808.)

Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
---
 avivotool.c |   29 ++++++++++++++++++++++-------
 1 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/avivotool.c b/avivotool.c
index 9a01a9fd..62f96a8e 100644
--- a/avivotool.c
+++ b/avivotool.c
@@ -57,7 +57,7 @@ int reg_type[0x8001];
 /* Not the address but what it points to is volatile. */
 struct pci_device *avivo_device = NULL;
 RADEONCardInfo *card_info = NULL;
-unsigned int ctrl_region, fb_region;
+int ctrl_region = -1, fb_region = -1;
 unsigned char * volatile ctrl_mem;
 unsigned char * volatile fb_mem;
 
@@ -1846,14 +1846,29 @@ static int map_radeon_mem(void)
             }
 
             for (i = 0; i < 6; i++) {
-                if (device->regions[i].size == 64 * 1024)
+                if (device->regions[i].size == 64 * 1024 ||
+                    device->regions[i].size == 128 * 1024 ||
+                    device->regions[i].size == 256 * 1024) {
+                    if (ctrl_region != -1) {
+                        printf("cannot distinguish ctrl region\n");
+                        return -1;
+                    }
                     ctrl_region = i;
-                else if (device->regions[i].size == 128 * 1024)
-                    ctrl_region = i;
-                else if (device->regions[i].size == 256 * 1024)
-                    ctrl_region = i;
-                else if (device->regions[i].size >= 128 * 1024 * 1024)
+                } else if (device->regions[i].size >= 128 * 1024 * 1024) {
+                    if (fb_region != -1) {
+                        printf("cannot distinguish fb region\n");
+                        return -1;
+                    }
                     fb_region = i;
+                }
+            }
+            if (ctrl_region == -1) {
+                printf("cannot find ctrl region\n");
+                return -1;
+            }
+            if (fb_region == -1) {
+                printf("cannot find fb region\n");
+                return -1;
             }
             avivo_device = device;
             if(skip-- == 0) {
-- 
1.7.9.1



More information about the xorg-driver-ati mailing list