diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_bios.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bios.c | 64 |
1 files changed, 15 insertions, 49 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index e4f33a4edea..974b0f8ae04 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
@@ -3869,27 +3869,10 @@ static int call_lvds_manufacturer_script(struct drm_device *dev, struct dcb_entr | |||
3869 | } | 3869 | } |
3870 | #ifdef __powerpc__ | 3870 | #ifdef __powerpc__ |
3871 | /* Powerbook specific quirks */ | 3871 | /* Powerbook specific quirks */ |
3872 | if ((dev->pci_device & 0xffff) == 0x0179 || | 3872 | if (script == LVDS_RESET && |
3873 | (dev->pci_device & 0xffff) == 0x0189 || | 3873 | (dev->pci_device == 0x0179 || dev->pci_device == 0x0189 || |
3874 | (dev->pci_device & 0xffff) == 0x0329) { | 3874 | dev->pci_device == 0x0329)) |
3875 | if (script == LVDS_RESET) { | 3875 | nv_write_tmds(dev, dcbent->or, 0, 0x02, 0x72); |
3876 | nv_write_tmds(dev, dcbent->or, 0, 0x02, 0x72); | ||
3877 | |||
3878 | } else if (script == LVDS_PANEL_ON) { | ||
3879 | bios_wr32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL, | ||
3880 | bios_rd32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL) | ||
3881 | | (1 << 31)); | ||
3882 | bios_wr32(bios, NV_PCRTC_GPIO_EXT, | ||
3883 | bios_rd32(bios, NV_PCRTC_GPIO_EXT) | 1); | ||
3884 | |||
3885 | } else if (script == LVDS_PANEL_OFF) { | ||
3886 | bios_wr32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL, | ||
3887 | bios_rd32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL) | ||
3888 | & ~(1 << 31)); | ||
3889 | bios_wr32(bios, NV_PCRTC_GPIO_EXT, | ||
3890 | bios_rd32(bios, NV_PCRTC_GPIO_EXT) & ~3); | ||
3891 | } | ||
3892 | } | ||
3893 | #endif | 3876 | #endif |
3894 | 3877 | ||
3895 | return 0; | 3878 | return 0; |
@@ -4381,11 +4364,8 @@ int nouveau_bios_parse_lvds_table(struct drm_device *dev, int pxclk, bool *dl, b | |||
4381 | * | 4364 | * |
4382 | * For the moment, a quirk will do :) | 4365 | * For the moment, a quirk will do :) |
4383 | */ | 4366 | */ |
4384 | if ((dev->pdev->device == 0x01d7) && | 4367 | if (nv_match_device(dev, 0x01d7, 0x1028, 0x01c2)) |
4385 | (dev->pdev->subsystem_vendor == 0x1028) && | ||
4386 | (dev->pdev->subsystem_device == 0x01c2)) { | ||
4387 | bios->fp.duallink_transition_clk = 80000; | 4368 | bios->fp.duallink_transition_clk = 80000; |
4388 | } | ||
4389 | 4369 | ||
4390 | /* set dual_link flag for EDID case */ | 4370 | /* set dual_link flag for EDID case */ |
4391 | if (pxclk && (chip_version < 0x25 || chip_version > 0x28)) | 4371 | if (pxclk && (chip_version < 0x25 || chip_version > 0x28)) |
@@ -5814,9 +5794,7 @@ parse_dcb_gpio_table(struct nvbios *bios) | |||
5814 | */ | 5794 | */ |
5815 | 5795 | ||
5816 | /* Apple iMac G4 NV18 */ | 5796 | /* Apple iMac G4 NV18 */ |
5817 | if (dev->pdev->device == 0x0189 && | 5797 | if (nv_match_device(dev, 0x0189, 0x10de, 0x0010)) { |
5818 | dev->pdev->subsystem_vendor == 0x10de && | ||
5819 | dev->pdev->subsystem_device == 0x0010) { | ||
5820 | struct dcb_gpio_entry *gpio = new_gpio_entry(bios); | 5798 | struct dcb_gpio_entry *gpio = new_gpio_entry(bios); |
5821 | 5799 | ||
5822 | gpio->tag = DCB_GPIO_TVDAC0; | 5800 | gpio->tag = DCB_GPIO_TVDAC0; |
@@ -5898,9 +5876,7 @@ apply_dcb_connector_quirks(struct nvbios *bios, int idx) | |||
5898 | struct drm_device *dev = bios->dev; | 5876 | struct drm_device *dev = bios->dev; |
5899 | 5877 | ||
5900 | /* Gigabyte NX85T */ | 5878 | /* Gigabyte NX85T */ |
5901 | if ((dev->pdev->device == 0x0421) && | 5879 | if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) { |
5902 | (dev->pdev->subsystem_vendor == 0x1458) && | ||
5903 | (dev->pdev->subsystem_device == 0x344c)) { | ||
5904 | if (cte->type == DCB_CONNECTOR_HDMI_1) | 5880 | if (cte->type == DCB_CONNECTOR_HDMI_1) |
5905 | cte->type = DCB_CONNECTOR_DVI_I; | 5881 | cte->type = DCB_CONNECTOR_DVI_I; |
5906 | } | 5882 | } |
@@ -6153,7 +6129,7 @@ parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb, | |||
6153 | entry->tmdsconf.slave_addr = (conf & 0x00000070) >> 4; | 6129 | entry->tmdsconf.slave_addr = (conf & 0x00000070) >> 4; |
6154 | 6130 | ||
6155 | break; | 6131 | break; |
6156 | case 0xe: | 6132 | case OUTPUT_EOL: |
6157 | /* weird g80 mobile type that "nv" treats as a terminator */ | 6133 | /* weird g80 mobile type that "nv" treats as a terminator */ |
6158 | dcb->entries--; | 6134 | dcb->entries--; |
6159 | return false; | 6135 | return false; |
@@ -6190,22 +6166,14 @@ parse_dcb15_entry(struct drm_device *dev, struct dcb_table *dcb, | |||
6190 | entry->type = OUTPUT_TV; | 6166 | entry->type = OUTPUT_TV; |
6191 | break; | 6167 | break; |
6192 | case 2: | 6168 | case 2: |
6193 | case 3: | ||
6194 | entry->type = OUTPUT_LVDS; | ||
6195 | break; | ||
6196 | case 4: | 6169 | case 4: |
6197 | switch ((conn & 0x000000f0) >> 4) { | 6170 | if (conn & 0x10) |
6198 | case 0: | ||
6199 | entry->type = OUTPUT_TMDS; | ||
6200 | break; | ||
6201 | case 1: | ||
6202 | entry->type = OUTPUT_LVDS; | 6171 | entry->type = OUTPUT_LVDS; |
6203 | break; | 6172 | else |
6204 | default: | 6173 | entry->type = OUTPUT_TMDS; |
6205 | NV_ERROR(dev, "Unknown DCB subtype 4/%d\n", | 6174 | break; |
6206 | (conn & 0x000000f0) >> 4); | 6175 | case 3: |
6207 | return false; | 6176 | entry->type = OUTPUT_LVDS; |
6208 | } | ||
6209 | break; | 6177 | break; |
6210 | default: | 6178 | default: |
6211 | NV_ERROR(dev, "Unknown DCB type %d\n", conn & 0x0000000f); | 6179 | NV_ERROR(dev, "Unknown DCB type %d\n", conn & 0x0000000f); |
@@ -6321,9 +6289,7 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf) | |||
6321 | * nasty problems until this is sorted (assuming it's not a | 6289 | * nasty problems until this is sorted (assuming it's not a |
6322 | * VBIOS bug). | 6290 | * VBIOS bug). |
6323 | */ | 6291 | */ |
6324 | if ((dev->pdev->device == 0x040d) && | 6292 | if (nv_match_device(dev, 0x040d, 0x1028, 0x019b)) { |
6325 | (dev->pdev->subsystem_vendor == 0x1028) && | ||
6326 | (dev->pdev->subsystem_device == 0x019b)) { | ||
6327 | if (*conn == 0x02026312 && *conf == 0x00000020) | 6293 | if (*conn == 0x02026312 && *conf == 0x00000020) |
6328 | return false; | 6294 | return false; |
6329 | } | 6295 | } |