From: Michel Dänzer <daen...@vmware.com>

It's happened time and time again (most recently with the support for EDID
hardcoded in the BIOS ROM) that new code didn't check for rdev->bios being
non-NULL before triggering dereferences of it. This would result in an
oops/panic on setups with no BIOS ROM. Hopefully this central test will be
more robust.

Signed-off-by: Michel Dänzer <daen...@vmware.com>
---
 drivers/gpu/drm/radeon/radeon_combios.c |   40 +++---------------------------
 1 files changed, 4 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_combios.c 
b/drivers/gpu/drm/radeon/radeon_combios.c
index 26fb424..9989d22 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -150,6 +150,9 @@ static uint16_t combios_get_table_offset(struct drm_device 
*dev,
        int rev;
        uint16_t offset = 0, check_offset;
 
+       if (!rdev->bios)
+               return 0;
+
        switch (table) {
                /* absolute offset tables */
        case COMBIOS_ASIC_INIT_1_TABLE:
@@ -621,9 +624,6 @@ bool radeon_combios_get_clock_info(struct drm_device *dev)
        int8_t rev;
        uint16_t sclk, mclk;
 
-       if (rdev->bios == NULL)
-               return false;
-
        pll_info = combios_get_table_offset(dev, COMBIOS_PLL_INFO_TABLE);
        if (pll_info) {
                rev = RBIOS8(pll_info);
@@ -748,9 +748,6 @@ struct radeon_encoder_primary_dac 
*radeon_combios_get_primary_dac_info(struct
        if (!p_dac)
                return NULL;
 
-       if (rdev->bios == NULL)
-               goto out;
-
        /* check CRT table */
        dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
        if (dac_info) {
@@ -767,7 +764,6 @@ struct radeon_encoder_primary_dac 
*radeon_combios_get_primary_dac_info(struct
                found = 1;
        }
 
-out:
        if (!found) /* fallback to defaults */
                radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac);
 
@@ -781,9 +777,6 @@ radeon_combios_get_tv_info(struct radeon_device *rdev)
        uint16_t tv_info;
        enum radeon_tv_std tv_std = TV_STD_NTSC;
 
-       if (rdev->bios == NULL)
-               return tv_std;
-
        tv_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
        if (tv_info) {
                if (RBIOS8(tv_info + 6) == 'T') {
@@ -887,9 +880,6 @@ struct radeon_encoder_tv_dac 
*radeon_combios_get_tv_dac_info(struct
        if (!tv_dac)
                return NULL;
 
-       if (rdev->bios == NULL)
-               goto out;
-
        /* first check TV table */
        dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
        if (dac_info) {
@@ -951,7 +941,6 @@ struct radeon_encoder_tv_dac 
*radeon_combios_get_tv_dac_info(struct
                }
        }
 
-out:
        if (!found) /* fallback to defaults */
                radeon_legacy_get_tv_dac_info_from_table(rdev, tv_dac);
 
@@ -1039,11 +1028,6 @@ struct radeon_encoder_lvds 
*radeon_combios_get_lvds_info(struct radeon_encoder
        int tmp, i;
        struct radeon_encoder_lvds *lvds = NULL;
 
-       if (rdev->bios == NULL) {
-               lvds = radeon_legacy_get_lvds_info_from_regs(rdev);
-               goto out;
-       }
-
        lcd_info = combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE);
 
        if (lcd_info) {
@@ -1144,7 +1128,7 @@ struct radeon_encoder_lvds 
*radeon_combios_get_lvds_info(struct radeon_encoder
                DRM_INFO("No panel info found in BIOS\n");
                lvds = radeon_legacy_get_lvds_info_from_regs(rdev);
        }
-out:
+
        if (lvds)
                encoder->native_mode = lvds->native_mode;
        return lvds;
@@ -1196,9 +1180,6 @@ bool radeon_legacy_get_tmds_info_from_combios(struct 
radeon_encoder *encoder,
        int i, n;
        uint8_t ver;
 
-       if (rdev->bios == NULL)
-               return false;
-
        tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);
 
        if (tmds_info) {
@@ -1278,9 +1259,6 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct 
radeon_encoder *encoder
        enum radeon_combios_ddc gpio;
        struct radeon_i2c_bus_rec i2c_bus;
 
-       if (rdev->bios == NULL)
-               return false;
-
        tmds->i2c_bus = NULL;
        if (rdev->flags & RADEON_IS_IGP) {
                offset = combios_get_table_offset(dev, COMBIOS_I2C_INFO_TABLE);
@@ -2006,9 +1984,6 @@ bool radeon_get_legacy_connector_info_from_bios(struct 
drm_device *dev)
        struct radeon_i2c_bus_rec ddc_i2c;
        struct radeon_hpd hpd;
 
-       if (rdev->bios == NULL)
-               return false;
-
        conn_info = combios_get_table_offset(dev, COMBIOS_CONNECTOR_INFO_TABLE);
        if (conn_info) {
                for (i = 0; i < 4; i++) {
@@ -2385,10 +2360,6 @@ void radeon_combios_get_power_modes(struct radeon_device 
*rdev)
        rdev->pm.default_power_state = NULL;
        rdev->pm.current_power_state = NULL;
 
-       /* XXX mac/sparc cards */
-       if (rdev->bios == NULL)
-               goto default_mode;
-
        if (rdev->flags & RADEON_IS_MOBILITY) {
                offset = combios_get_table_offset(dev, 
COMBIOS_POWERPLAY_INFO_TABLE);
                if (offset) {
@@ -2545,9 +2516,6 @@ bool radeon_combios_external_tmds_setup(struct 
drm_encoder *encoder)
        uint32_t reg, val, and_mask, or_mask;
        struct radeon_encoder_ext_tmds *tmds = radeon_encoder->enc_priv;
 
-       if (rdev->bios == NULL)
-               return false;
-
        if (!tmds)
                return false;
 
-- 
1.6.6.1


------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to