drm/radeon/kms: add disabled vbios accessor for NI asics
authorAlex Deucher <alexdeucher@gmail.com>
Fri, 7 Jan 2011 02:19:23 +0000 (21:19 -0500)
committerDave Airlie <airlied@redhat.com>
Fri, 7 Jan 2011 04:11:30 +0000 (14:11 +1000)
Some systems disable the vbios on secondary cards or cards that
have been posted.  This code re-enabled the vbios so the driver
can load it.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_bios.c

index 8f2c7b5..1aba85c 100644 (file)
@@ -131,6 +131,45 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
        return true;
 }
 
+static bool ni_read_disabled_bios(struct radeon_device *rdev)
+{
+       u32 bus_cntl;
+       u32 d1vga_control;
+       u32 d2vga_control;
+       u32 vga_render_control;
+       u32 rom_cntl;
+       bool r;
+
+       bus_cntl = RREG32(R600_BUS_CNTL);
+       d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
+       d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
+       vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
+       rom_cntl = RREG32(R600_ROM_CNTL);
+
+       /* enable the rom */
+       WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
+       /* Disable VGA mode */
+       WREG32(AVIVO_D1VGA_CONTROL,
+              (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
+               AVIVO_DVGA_CONTROL_TIMING_SELECT)));
+       WREG32(AVIVO_D2VGA_CONTROL,
+              (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
+               AVIVO_DVGA_CONTROL_TIMING_SELECT)));
+       WREG32(AVIVO_VGA_RENDER_CONTROL,
+              (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK));
+       WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
+
+       r = radeon_read_bios(rdev);
+
+       /* restore regs */
+       WREG32(R600_BUS_CNTL, bus_cntl);
+       WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
+       WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
+       WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
+       WREG32(R600_ROM_CNTL, rom_cntl);
+       return r;
+}
+
 static bool r700_read_disabled_bios(struct radeon_device *rdev)
 {
        uint32_t viph_control;
@@ -416,6 +455,8 @@ static bool radeon_read_disabled_bios(struct radeon_device *rdev)
 {
        if (rdev->flags & RADEON_IS_IGP)
                return igp_read_bios_from_vram(rdev);
+       else if (rdev->family >= CHIP_BARTS)
+               return ni_read_disabled_bios(rdev);
        else if (rdev->family >= CHIP_RV770)
                return r700_read_disabled_bios(rdev);
        else if (rdev->family >= CHIP_R600)