diff options
| -rw-r--r-- | drivers/gpu/drm/drm_fops.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_lock.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_mm.c | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_modes.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bios.c | 64 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bios.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.h | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_gem.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv04_dfp.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv17_tv.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 2 | ||||
| -rw-r--r-- | include/linux/vgaarb.h | 15 |
13 files changed, 95 insertions, 76 deletions
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 3a652a65546f..b744dad5c237 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | 41 | ||
| 42 | /* from BKL pushdown: note that nothing else serializes idr_find() */ | 42 | /* from BKL pushdown: note that nothing else serializes idr_find() */ |
| 43 | DEFINE_MUTEX(drm_global_mutex); | 43 | DEFINE_MUTEX(drm_global_mutex); |
| 44 | EXPORT_SYMBOL(drm_global_mutex); | ||
| 44 | 45 | ||
| 45 | static int drm_open_helper(struct inode *inode, struct file *filp, | 46 | static int drm_open_helper(struct inode *inode, struct file *filp, |
| 46 | struct drm_device * dev); | 47 | struct drm_device * dev); |
diff --git a/drivers/gpu/drm/drm_lock.c b/drivers/gpu/drm/drm_lock.c index e2f70a516c34..9bf93bc9a32c 100644 --- a/drivers/gpu/drm/drm_lock.c +++ b/drivers/gpu/drm/drm_lock.c | |||
| @@ -92,7 +92,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | /* Contention */ | 94 | /* Contention */ |
| 95 | mutex_unlock(&drm_global_mutex); | ||
| 95 | schedule(); | 96 | schedule(); |
| 97 | mutex_lock(&drm_global_mutex); | ||
| 96 | if (signal_pending(current)) { | 98 | if (signal_pending(current)) { |
| 97 | ret = -EINTR; | 99 | ret = -EINTR; |
| 98 | break; | 100 | break; |
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index da99edc50888..a6bfc302ed90 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
| @@ -285,21 +285,21 @@ void drm_mm_put_block(struct drm_mm_node *cur) | |||
| 285 | 285 | ||
| 286 | EXPORT_SYMBOL(drm_mm_put_block); | 286 | EXPORT_SYMBOL(drm_mm_put_block); |
| 287 | 287 | ||
| 288 | static int check_free_mm_node(struct drm_mm_node *entry, unsigned long size, | 288 | static int check_free_hole(unsigned long start, unsigned long end, |
| 289 | unsigned alignment) | 289 | unsigned long size, unsigned alignment) |
| 290 | { | 290 | { |
| 291 | unsigned wasted = 0; | 291 | unsigned wasted = 0; |
| 292 | 292 | ||
| 293 | if (entry->size < size) | 293 | if (end - start < size) |
| 294 | return 0; | 294 | return 0; |
| 295 | 295 | ||
| 296 | if (alignment) { | 296 | if (alignment) { |
| 297 | register unsigned tmp = entry->start % alignment; | 297 | unsigned tmp = start % alignment; |
| 298 | if (tmp) | 298 | if (tmp) |
| 299 | wasted = alignment - tmp; | 299 | wasted = alignment - tmp; |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | if (entry->size >= size + wasted) { | 302 | if (end >= start + size + wasted) { |
| 303 | return 1; | 303 | return 1; |
| 304 | } | 304 | } |
| 305 | 305 | ||
| @@ -320,7 +320,8 @@ struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, | |||
| 320 | best_size = ~0UL; | 320 | best_size = ~0UL; |
| 321 | 321 | ||
| 322 | list_for_each_entry(entry, &mm->free_stack, free_stack) { | 322 | list_for_each_entry(entry, &mm->free_stack, free_stack) { |
| 323 | if (!check_free_mm_node(entry, size, alignment)) | 323 | if (!check_free_hole(entry->start, entry->start + entry->size, |
| 324 | size, alignment)) | ||
| 324 | continue; | 325 | continue; |
| 325 | 326 | ||
| 326 | if (!best_match) | 327 | if (!best_match) |
| @@ -353,10 +354,12 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm, | |||
| 353 | best_size = ~0UL; | 354 | best_size = ~0UL; |
| 354 | 355 | ||
| 355 | list_for_each_entry(entry, &mm->free_stack, free_stack) { | 356 | list_for_each_entry(entry, &mm->free_stack, free_stack) { |
| 356 | if (entry->start > end || (entry->start+entry->size) < start) | 357 | unsigned long adj_start = entry->start < start ? |
| 357 | continue; | 358 | start : entry->start; |
| 359 | unsigned long adj_end = entry->start + entry->size > end ? | ||
| 360 | end : entry->start + entry->size; | ||
| 358 | 361 | ||
| 359 | if (!check_free_mm_node(entry, size, alignment)) | 362 | if (!check_free_hole(adj_start, adj_end, size, alignment)) |
| 360 | continue; | 363 | continue; |
| 361 | 364 | ||
| 362 | if (!best_match) | 365 | if (!best_match) |
| @@ -449,7 +452,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node) | |||
| 449 | node->free_stack.prev = prev_free; | 452 | node->free_stack.prev = prev_free; |
| 450 | node->free_stack.next = next_free; | 453 | node->free_stack.next = next_free; |
| 451 | 454 | ||
| 452 | if (check_free_mm_node(node, mm->scan_size, mm->scan_alignment)) { | 455 | if (check_free_hole(node->start, node->start + node->size, |
| 456 | mm->scan_size, mm->scan_alignment)) { | ||
| 453 | mm->scan_hit_start = node->start; | 457 | mm->scan_hit_start = node->start; |
| 454 | mm->scan_hit_size = node->size; | 458 | mm->scan_hit_size = node->size; |
| 455 | 459 | ||
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index f1f473ea97d3..949326d2a8e5 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
| @@ -251,7 +251,10 @@ struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, int hdisplay, | |||
| 251 | drm_mode->htotal = drm_mode->hdisplay + CVT_RB_H_BLANK; | 251 | drm_mode->htotal = drm_mode->hdisplay + CVT_RB_H_BLANK; |
| 252 | /* Fill in HSync values */ | 252 | /* Fill in HSync values */ |
| 253 | drm_mode->hsync_end = drm_mode->hdisplay + CVT_RB_H_BLANK / 2; | 253 | drm_mode->hsync_end = drm_mode->hdisplay + CVT_RB_H_BLANK / 2; |
| 254 | drm_mode->hsync_start = drm_mode->hsync_end = CVT_RB_H_SYNC; | 254 | drm_mode->hsync_start = drm_mode->hsync_end - CVT_RB_H_SYNC; |
| 255 | /* Fill in VSync values */ | ||
| 256 | drm_mode->vsync_start = drm_mode->vdisplay + CVT_RB_VFPORCH; | ||
| 257 | drm_mode->vsync_end = drm_mode->vsync_start + vsync; | ||
| 255 | } | 258 | } |
| 256 | /* 15/13. Find pixel clock frequency (kHz for xf86) */ | 259 | /* 15/13. Find pixel clock frequency (kHz for xf86) */ |
| 257 | drm_mode->clock = drm_mode->htotal * HV_FACTOR * 1000 / hperiod; | 260 | drm_mode->clock = drm_mode->htotal * HV_FACTOR * 1000 / hperiod; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index e4f33a4edea1..974b0f8ae048 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 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h index fd14dfd3d780..c1de2f3fcb0e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.h +++ b/drivers/gpu/drm/nouveau/nouveau_bios.h | |||
| @@ -95,6 +95,7 @@ enum dcb_type { | |||
| 95 | OUTPUT_TMDS = 2, | 95 | OUTPUT_TMDS = 2, |
| 96 | OUTPUT_LVDS = 3, | 96 | OUTPUT_LVDS = 3, |
| 97 | OUTPUT_DP = 6, | 97 | OUTPUT_DP = 6, |
| 98 | OUTPUT_EOL = 14, /* DCB 4.0+, appears to be end-of-list */ | ||
| 98 | OUTPUT_ANY = -1 | 99 | OUTPUT_ANY = -1 |
| 99 | }; | 100 | }; |
| 100 | 101 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 1e093a069b7b..b1be617373b6 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
| @@ -1389,6 +1389,15 @@ nv_two_reg_pll(struct drm_device *dev) | |||
| 1389 | return false; | 1389 | return false; |
| 1390 | } | 1390 | } |
| 1391 | 1391 | ||
| 1392 | static inline bool | ||
| 1393 | nv_match_device(struct drm_device *dev, unsigned device, | ||
| 1394 | unsigned sub_vendor, unsigned sub_device) | ||
| 1395 | { | ||
| 1396 | return dev->pdev->device == device && | ||
| 1397 | dev->pdev->subsystem_vendor == sub_vendor && | ||
| 1398 | dev->pdev->subsystem_device == sub_device; | ||
| 1399 | } | ||
| 1400 | |||
| 1392 | #define NV_SW 0x0000506e | 1401 | #define NV_SW 0x0000506e |
| 1393 | #define NV_SW_DMA_SEMAPHORE 0x00000060 | 1402 | #define NV_SW_DMA_SEMAPHORE 0x00000060 |
| 1394 | #define NV_SW_SEMAPHORE_OFFSET 0x00000064 | 1403 | #define NV_SW_SEMAPHORE_OFFSET 0x00000064 |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 79fc5ffff226..581c67cd7b24 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
| @@ -337,7 +337,9 @@ retry: | |||
| 337 | return -EINVAL; | 337 | return -EINVAL; |
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | mutex_unlock(&drm_global_mutex); | ||
| 340 | ret = ttm_bo_wait_cpu(&nvbo->bo, false); | 341 | ret = ttm_bo_wait_cpu(&nvbo->bo, false); |
| 342 | mutex_lock(&drm_global_mutex); | ||
| 341 | if (ret) { | 343 | if (ret) { |
| 342 | NV_ERROR(dev, "fail wait_cpu\n"); | 344 | NV_ERROR(dev, "fail wait_cpu\n"); |
| 343 | return ret; | 345 | return ret; |
| @@ -663,7 +665,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data, | |||
| 663 | push[i].length); | 665 | push[i].length); |
| 664 | } | 666 | } |
| 665 | } else | 667 | } else |
| 666 | if (dev_priv->card_type >= NV_20) { | 668 | if (dev_priv->chipset >= 0x25) { |
| 667 | ret = RING_SPACE(chan, req->nr_push * 2); | 669 | ret = RING_SPACE(chan, req->nr_push * 2); |
| 668 | if (ret) { | 670 | if (ret) { |
| 669 | NV_ERROR(dev, "cal_space: %d\n", ret); | 671 | NV_ERROR(dev, "cal_space: %d\n", ret); |
| @@ -738,7 +740,7 @@ out_next: | |||
| 738 | req->suffix0 = 0x00000000; | 740 | req->suffix0 = 0x00000000; |
| 739 | req->suffix1 = 0x00000000; | 741 | req->suffix1 = 0x00000000; |
| 740 | } else | 742 | } else |
| 741 | if (dev_priv->card_type >= NV_20) { | 743 | if (dev_priv->chipset >= 0x25) { |
| 742 | req->suffix0 = 0x00020000; | 744 | req->suffix0 = 0x00020000; |
| 743 | req->suffix1 = 0x00000000; | 745 | req->suffix1 = 0x00000000; |
| 744 | } else { | 746 | } else { |
diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c index a5dcf7685800..0d3206a7046c 100644 --- a/drivers/gpu/drm/nouveau/nv04_dfp.c +++ b/drivers/gpu/drm/nouveau/nv04_dfp.c | |||
| @@ -444,6 +444,7 @@ static void nv04_dfp_commit(struct drm_encoder *encoder) | |||
| 444 | struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); | 444 | struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); |
| 445 | struct dcb_entry *dcbe = nv_encoder->dcb; | 445 | struct dcb_entry *dcbe = nv_encoder->dcb; |
| 446 | int head = nouveau_crtc(encoder->crtc)->index; | 446 | int head = nouveau_crtc(encoder->crtc)->index; |
| 447 | struct drm_encoder *slave_encoder; | ||
| 447 | 448 | ||
| 448 | if (dcbe->type == OUTPUT_TMDS) | 449 | if (dcbe->type == OUTPUT_TMDS) |
| 449 | run_tmds_table(dev, dcbe, head, nv_encoder->mode.clock); | 450 | run_tmds_table(dev, dcbe, head, nv_encoder->mode.clock); |
| @@ -462,9 +463,10 @@ static void nv04_dfp_commit(struct drm_encoder *encoder) | |||
| 462 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + nv04_dac_output_offset(encoder), 0x00100000); | 463 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + nv04_dac_output_offset(encoder), 0x00100000); |
| 463 | 464 | ||
| 464 | /* Init external transmitters */ | 465 | /* Init external transmitters */ |
| 465 | if (get_tmds_slave(encoder)) | 466 | slave_encoder = get_tmds_slave(encoder); |
| 466 | get_slave_funcs(get_tmds_slave(encoder))->mode_set( | 467 | if (slave_encoder) |
| 467 | encoder, &nv_encoder->mode, &nv_encoder->mode); | 468 | get_slave_funcs(slave_encoder)->mode_set( |
| 469 | slave_encoder, &nv_encoder->mode, &nv_encoder->mode); | ||
| 468 | 470 | ||
| 469 | helper->dpms(encoder, DRM_MODE_DPMS_ON); | 471 | helper->dpms(encoder, DRM_MODE_DPMS_ON); |
| 470 | 472 | ||
| @@ -473,6 +475,27 @@ static void nv04_dfp_commit(struct drm_encoder *encoder) | |||
| 473 | nv_crtc->index, '@' + ffs(nv_encoder->dcb->or)); | 475 | nv_crtc->index, '@' + ffs(nv_encoder->dcb->or)); |
| 474 | } | 476 | } |
| 475 | 477 | ||
| 478 | static void nv04_dfp_update_backlight(struct drm_encoder *encoder, int mode) | ||
| 479 | { | ||
| 480 | #ifdef __powerpc__ | ||
| 481 | struct drm_device *dev = encoder->dev; | ||
| 482 | |||
| 483 | /* BIOS scripts usually take care of the backlight, thanks | ||
| 484 | * Apple for your consistency. | ||
| 485 | */ | ||
| 486 | if (dev->pci_device == 0x0179 || dev->pci_device == 0x0189 || | ||
| 487 | dev->pci_device == 0x0329) { | ||
| 488 | if (mode == DRM_MODE_DPMS_ON) { | ||
| 489 | nv_mask(dev, NV_PBUS_DEBUG_DUALHEAD_CTL, 0, 1 << 31); | ||
| 490 | nv_mask(dev, NV_PCRTC_GPIO_EXT, 3, 1); | ||
| 491 | } else { | ||
| 492 | nv_mask(dev, NV_PBUS_DEBUG_DUALHEAD_CTL, 1 << 31, 0); | ||
| 493 | nv_mask(dev, NV_PCRTC_GPIO_EXT, 3, 0); | ||
| 494 | } | ||
| 495 | } | ||
| 496 | #endif | ||
| 497 | } | ||
| 498 | |||
| 476 | static inline bool is_powersaving_dpms(int mode) | 499 | static inline bool is_powersaving_dpms(int mode) |
| 477 | { | 500 | { |
| 478 | return (mode != DRM_MODE_DPMS_ON); | 501 | return (mode != DRM_MODE_DPMS_ON); |
| @@ -520,6 +543,7 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 520 | LVDS_PANEL_OFF, 0); | 543 | LVDS_PANEL_OFF, 0); |
| 521 | } | 544 | } |
| 522 | 545 | ||
| 546 | nv04_dfp_update_backlight(encoder, mode); | ||
| 523 | nv04_dfp_update_fp_control(encoder, mode); | 547 | nv04_dfp_update_fp_control(encoder, mode); |
| 524 | 548 | ||
| 525 | if (mode == DRM_MODE_DPMS_ON) | 549 | if (mode == DRM_MODE_DPMS_ON) |
| @@ -543,6 +567,7 @@ static void nv04_tmds_dpms(struct drm_encoder *encoder, int mode) | |||
| 543 | NV_INFO(dev, "Setting dpms mode %d on tmds encoder (output %d)\n", | 567 | NV_INFO(dev, "Setting dpms mode %d on tmds encoder (output %d)\n", |
| 544 | mode, nv_encoder->dcb->index); | 568 | mode, nv_encoder->dcb->index); |
| 545 | 569 | ||
| 570 | nv04_dfp_update_backlight(encoder, mode); | ||
| 546 | nv04_dfp_update_fp_control(encoder, mode); | 571 | nv04_dfp_update_fp_control(encoder, mode); |
| 547 | } | 572 | } |
| 548 | 573 | ||
diff --git a/drivers/gpu/drm/nouveau/nv17_tv.c b/drivers/gpu/drm/nouveau/nv17_tv.c index eefa5c856932..13cdc05b7c2d 100644 --- a/drivers/gpu/drm/nouveau/nv17_tv.c +++ b/drivers/gpu/drm/nouveau/nv17_tv.c | |||
| @@ -121,18 +121,14 @@ static bool | |||
| 121 | get_tv_detect_quirks(struct drm_device *dev, uint32_t *pin_mask) | 121 | get_tv_detect_quirks(struct drm_device *dev, uint32_t *pin_mask) |
| 122 | { | 122 | { |
| 123 | /* Zotac FX5200 */ | 123 | /* Zotac FX5200 */ |
| 124 | if (dev->pdev->device == 0x0322 && | 124 | if (nv_match_device(dev, 0x0322, 0x19da, 0x1035) || |
| 125 | dev->pdev->subsystem_vendor == 0x19da && | 125 | nv_match_device(dev, 0x0322, 0x19da, 0x2035)) { |
| 126 | (dev->pdev->subsystem_device == 0x1035 || | ||
| 127 | dev->pdev->subsystem_device == 0x2035)) { | ||
| 128 | *pin_mask = 0xc; | 126 | *pin_mask = 0xc; |
| 129 | return false; | 127 | return false; |
| 130 | } | 128 | } |
| 131 | 129 | ||
| 132 | /* MSI nForce2 IGP */ | 130 | /* MSI nForce2 IGP */ |
| 133 | if (dev->pdev->device == 0x01f0 && | 131 | if (nv_match_device(dev, 0x01f0, 0x1462, 0x5710)) { |
| 134 | dev->pdev->subsystem_vendor == 0x1462 && | ||
| 135 | dev->pdev->subsystem_device == 0x5710) { | ||
| 136 | *pin_mask = 0xc; | 132 | *pin_mask = 0xc; |
| 137 | return false; | 133 | return false; |
| 138 | } | 134 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 31a09cd279ab..1a5ee392e9c7 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -999,6 +999,7 @@ static enum drm_connector_status radeon_dp_detect(struct drm_connector *connecto | |||
| 999 | } | 999 | } |
| 1000 | } | 1000 | } |
| 1001 | 1001 | ||
| 1002 | radeon_connector_update_scratch_regs(connector, ret); | ||
| 1002 | return ret; | 1003 | return ret; |
| 1003 | } | 1004 | } |
| 1004 | 1005 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 477ba673e1b4..f87efec76236 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -637,8 +637,6 @@ void radeon_pm_fini(struct radeon_device *rdev) | |||
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | radeon_hwmon_fini(rdev); | 639 | radeon_hwmon_fini(rdev); |
| 640 | if (rdev->pm.i2c_bus) | ||
| 641 | radeon_i2c_destroy(rdev->pm.i2c_bus); | ||
| 642 | } | 640 | } |
| 643 | 641 | ||
| 644 | void radeon_pm_compute_clocks(struct radeon_device *rdev) | 642 | void radeon_pm_compute_clocks(struct radeon_device *rdev) |
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h index 6228b5b77d35..e9e1524b582c 100644 --- a/include/linux/vgaarb.h +++ b/include/linux/vgaarb.h | |||
| @@ -93,8 +93,11 @@ extern void vga_set_legacy_decoding(struct pci_dev *pdev, | |||
| 93 | * Nested calls are supported (a per-resource counter is maintained) | 93 | * Nested calls are supported (a per-resource counter is maintained) |
| 94 | */ | 94 | */ |
| 95 | 95 | ||
| 96 | extern int vga_get(struct pci_dev *pdev, unsigned int rsrc, | 96 | #if defined(CONFIG_VGA_ARB) |
| 97 | int interruptible); | 97 | extern int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible); |
| 98 | #else | ||
| 99 | static inline int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible) { return 0; } | ||
| 100 | #endif | ||
| 98 | 101 | ||
| 99 | /** | 102 | /** |
| 100 | * vga_get_interruptible | 103 | * vga_get_interruptible |
| @@ -131,7 +134,11 @@ static inline int vga_get_uninterruptible(struct pci_dev *pdev, | |||
| 131 | * are already locked by another card. It can be called in any context | 134 | * are already locked by another card. It can be called in any context |
| 132 | */ | 135 | */ |
| 133 | 136 | ||
| 137 | #if defined(CONFIG_VGA_ARB) | ||
| 134 | extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); | 138 | extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); |
| 139 | #else | ||
| 140 | static inline int vga_tryget(struct pci_dev *pdev, unsigned int rsrc) { return 0; } | ||
| 141 | #endif | ||
| 135 | 142 | ||
| 136 | /** | 143 | /** |
| 137 | * vga_put - release lock on legacy VGA resources | 144 | * vga_put - release lock on legacy VGA resources |
| @@ -146,7 +153,11 @@ extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); | |||
| 146 | * released if the counter reaches 0. | 153 | * released if the counter reaches 0. |
| 147 | */ | 154 | */ |
| 148 | 155 | ||
| 156 | #if defined(CONFIG_VGA_ARB) | ||
| 149 | extern void vga_put(struct pci_dev *pdev, unsigned int rsrc); | 157 | extern void vga_put(struct pci_dev *pdev, unsigned int rsrc); |
| 158 | #else | ||
| 159 | #define vga_put(pdev, rsrc) | ||
| 160 | #endif | ||
| 150 | 161 | ||
| 151 | 162 | ||
| 152 | /** | 163 | /** |
