Index: radeon_bios.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/radeon_bios.c,v retrieving revision 1.2 diff -u -w -r1.2 radeon_bios.c --- radeon_bios.c 16 Jul 2014 20:59:57 -0000 1.2 +++ radeon_bios.c 18 Aug 2014 21:11:04 -0000 @@ -135,8 +135,35 @@ static bool radeon_read_platform_bios(struct radeon_device *rdev) { -#ifdef __NetBSD__ /* XXX radeon platform bios */ +#ifdef __NetBSD__ /* XXX this is x86 bollocks */ +#if defined(__i386__) || defined(__x86_64__) + bus_space_handle_t romh; + + /* look for a legacy video BIOS at c000:0000 */ + if (bus_space_map(rdev->pdev->pd_pa.pa_memt, 0xc0000, 0x10000, + BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, &romh) != 0) { + aprint_error("%s: unable to map legacy ROM\n", __func__); + return false; + } + if ((bus_space_read_1(rdev->pdev->pd_pa.pa_memt, romh, 0) !=0x55) || + (bus_space_read_1(rdev->pdev->pd_pa.pa_memt, romh, 1) !=0xaa)) { + aprint_error("%s: not a valid video BIOS at 0xc0000\n", __func__); + goto fail; + } + rdev->bios = kmalloc(0x10000, GFP_KERNEL); + if (rdev->bios == NULL) { + aprint_error("%s: couldn't allocate memory for BIOS\n", __func__); + goto fail; + } + bus_space_read_region_1(rdev->pdev->pd_pa.pa_memt, romh, 0, rdev->bios, 0x10000); + bus_space_unmap(rdev->pdev->pd_pa.pa_memt, romh, 0x10000); + return true; +fail: + bus_space_unmap(rdev->pdev->pd_pa.pa_memt, romh, 0x10000); + return false; +#else /* !x86 */ return false; +#endif #else uint8_t __iomem *bios; size_t size;