Module Name:    src
Committed By:   riastradh
Date:           Wed Jun 24 18:23:23 UTC 2015

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/radeon: radeon_bios.c

Log Message:
Use bus_space_read rather than kmemdup to read ROM.

jakllsch@ reports that on some 64-bit systems, kmemdup does 8-byte
reads, which yield garbage in the high word.  bus_space_read_region_1
does 1-byte reads instead, which seem to work.

Derived from a patch from jakllsch@.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c:1.3 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c:1.3	Sat Jun 13 18:18:18 2015
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c	Wed Jun 24 18:23:23 2015
@@ -116,6 +116,31 @@ static bool radeon_read_bios(struct rade
 		return false;
 	}
 
+#ifdef __NetBSD__
+	/*
+	 * Using kmemdup results in >4-byte memory access on 64-bit
+	 * systems, which yields bogus answers on some devices.  So we
+	 * use bus_space(9) to do guaranteed byte access with
+	 * bus_space_read_region_1 which seems to work better.
+	 */
+    {
+	const bus_space_tag_t bst = rdev->pdev->pd_rom_bst;
+	const bus_space_handle_t bsh = rdev->pdev->pd_rom_found_bsh;
+
+	if (size == 0 ||
+	    bus_space_read_1(bst, bsh, 0) != 0x55 ||
+	    bus_space_read_1(bst, bsh, 1) != 0xaa) {
+		pci_unmap_rom(rdev->pdev, bios);
+		return false;
+	}
+	rdev->bios = kmalloc(size, GFP_KERNEL);
+	if (rdev->bios == NULL) {
+		pci_unmap_rom(rdev->pdev, bios);
+		return false;
+	}
+	bus_space_read_region_1(bst, bsh, 0, rdev->bios, size);
+    }
+#else
 	if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) {
 		pci_unmap_rom(rdev->pdev, bios);
 		return false;
@@ -125,6 +150,7 @@ static bool radeon_read_bios(struct rade
 		pci_unmap_rom(rdev->pdev, bios);
 		return false;
 	}
+#endif
 	pci_unmap_rom(rdev->pdev, bios);
 	return true;
 }

Reply via email to