Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
vgaarb: Wrap vga_(get|put) in CONFIG_VGA_ARB
drm/radeon/kms: add missing scratch update in dp_detect
drm/modes: Fix CVT-R modeline generation
drm: fix regression in drm locking since BKL removal.
drm/radeon/kms: remove stray radeon_i2c_destroy
drm: mm: fix range restricted allocations
drm/nouveau: drop drm_global_mutex before sleeping in submission path
drm: export drm_global_mutex for drivers to use
drm/nv20: Don't use pushbuf calls on the original nv20.
drm/nouveau: Fix TMDS on some DCB1.5 boards.
drm/nouveau: Fix backlight control on PPC machines with an internal TMDS panel.
drm/nv30: Apply modesetting to the correct slave encoder
drm/nouveau: Use a helper function to match PCI device/subsystem IDs.
drm/nv50: add dcb type 14 to enum to prevent compiler complaint

+95 -76
+1
drivers/gpu/drm/drm_fops.c
··· 41 41 42 42 /* from BKL pushdown: note that nothing else serializes idr_find() */ 43 43 DEFINE_MUTEX(drm_global_mutex); 44 + EXPORT_SYMBOL(drm_global_mutex); 44 45 45 46 static int drm_open_helper(struct inode *inode, struct file *filp, 46 47 struct drm_device * dev);
+2
drivers/gpu/drm/drm_lock.c
··· 92 92 } 93 93 94 94 /* Contention */ 95 + mutex_unlock(&drm_global_mutex); 95 96 schedule(); 97 + mutex_lock(&drm_global_mutex); 96 98 if (signal_pending(current)) { 97 99 ret = -EINTR; 98 100 break;
+14 -10
drivers/gpu/drm/drm_mm.c
··· 285 285 286 286 EXPORT_SYMBOL(drm_mm_put_block); 287 287 288 - static int check_free_mm_node(struct drm_mm_node *entry, unsigned long size, 289 - unsigned alignment) 288 + static int check_free_hole(unsigned long start, unsigned long end, 289 + unsigned long size, unsigned alignment) 290 290 { 291 291 unsigned wasted = 0; 292 292 293 - if (entry->size < size) 293 + if (end - start < size) 294 294 return 0; 295 295 296 296 if (alignment) { 297 - register unsigned tmp = entry->start % alignment; 297 + unsigned tmp = start % alignment; 298 298 if (tmp) 299 299 wasted = alignment - tmp; 300 300 } 301 301 302 - if (entry->size >= size + wasted) { 302 + if (end >= start + size + wasted) { 303 303 return 1; 304 304 } 305 305 ··· 320 320 best_size = ~0UL; 321 321 322 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 325 continue; 325 326 326 327 if (!best_match) ··· 354 353 best_size = ~0UL; 355 354 356 355 list_for_each_entry(entry, &mm->free_stack, free_stack) { 357 - if (entry->start > end || (entry->start+entry->size) < start) 358 - continue; 356 + unsigned long adj_start = entry->start < start ? 357 + start : entry->start; 358 + unsigned long adj_end = entry->start + entry->size > end ? 359 + end : entry->start + entry->size; 359 360 360 - if (!check_free_mm_node(entry, size, alignment)) 361 + if (!check_free_hole(adj_start, adj_end, size, alignment)) 361 362 continue; 362 363 363 364 if (!best_match) ··· 452 449 node->free_stack.prev = prev_free; 453 450 node->free_stack.next = next_free; 454 451 455 - if (check_free_mm_node(node, mm->scan_size, mm->scan_alignment)) { 452 + if (check_free_hole(node->start, node->start + node->size, 453 + mm->scan_size, mm->scan_alignment)) { 456 454 mm->scan_hit_start = node->start; 457 455 mm->scan_hit_size = node->size; 458 456
+4 -1
drivers/gpu/drm/drm_modes.c
··· 251 251 drm_mode->htotal = drm_mode->hdisplay + CVT_RB_H_BLANK; 252 252 /* Fill in HSync values */ 253 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 259 /* 15/13. Find pixel clock frequency (kHz for xf86) */ 257 260 drm_mode->clock = drm_mode->htotal * HV_FACTOR * 1000 / hperiod;
+15 -49
drivers/gpu/drm/nouveau/nouveau_bios.c
··· 3869 3869 } 3870 3870 #ifdef __powerpc__ 3871 3871 /* Powerbook specific quirks */ 3872 - if ((dev->pci_device & 0xffff) == 0x0179 || 3873 - (dev->pci_device & 0xffff) == 0x0189 || 3874 - (dev->pci_device & 0xffff) == 0x0329) { 3875 - if (script == LVDS_RESET) { 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 - } 3872 + if (script == LVDS_RESET && 3873 + (dev->pci_device == 0x0179 || dev->pci_device == 0x0189 || 3874 + dev->pci_device == 0x0329)) 3875 + nv_write_tmds(dev, dcbent->or, 0, 0x02, 0x72); 3893 3876 #endif 3894 3877 3895 3878 return 0; ··· 4364 4381 * 4365 4382 * For the moment, a quirk will do :) 4366 4383 */ 4367 - if ((dev->pdev->device == 0x01d7) && 4368 - (dev->pdev->subsystem_vendor == 0x1028) && 4369 - (dev->pdev->subsystem_device == 0x01c2)) { 4384 + if (nv_match_device(dev, 0x01d7, 0x1028, 0x01c2)) 4370 4385 bios->fp.duallink_transition_clk = 80000; 4371 - } 4372 4386 4373 4387 /* set dual_link flag for EDID case */ 4374 4388 if (pxclk && (chip_version < 0x25 || chip_version > 0x28)) ··· 5794 5814 */ 5795 5815 5796 5816 /* Apple iMac G4 NV18 */ 5797 - if (dev->pdev->device == 0x0189 && 5798 - dev->pdev->subsystem_vendor == 0x10de && 5799 - dev->pdev->subsystem_device == 0x0010) { 5817 + if (nv_match_device(dev, 0x0189, 0x10de, 0x0010)) { 5800 5818 struct dcb_gpio_entry *gpio = new_gpio_entry(bios); 5801 5819 5802 5820 gpio->tag = DCB_GPIO_TVDAC0; ··· 5876 5898 struct drm_device *dev = bios->dev; 5877 5899 5878 5900 /* Gigabyte NX85T */ 5879 - if ((dev->pdev->device == 0x0421) && 5880 - (dev->pdev->subsystem_vendor == 0x1458) && 5881 - (dev->pdev->subsystem_device == 0x344c)) { 5901 + if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) { 5882 5902 if (cte->type == DCB_CONNECTOR_HDMI_1) 5883 5903 cte->type = DCB_CONNECTOR_DVI_I; 5884 5904 } ··· 6129 6153 entry->tmdsconf.slave_addr = (conf & 0x00000070) >> 4; 6130 6154 6131 6155 break; 6132 - case 0xe: 6156 + case OUTPUT_EOL: 6133 6157 /* weird g80 mobile type that "nv" treats as a terminator */ 6134 6158 dcb->entries--; 6135 6159 return false; ··· 6166 6190 entry->type = OUTPUT_TV; 6167 6191 break; 6168 6192 case 2: 6193 + case 4: 6194 + if (conn & 0x10) 6195 + entry->type = OUTPUT_LVDS; 6196 + else 6197 + entry->type = OUTPUT_TMDS; 6198 + break; 6169 6199 case 3: 6170 6200 entry->type = OUTPUT_LVDS; 6171 - break; 6172 - case 4: 6173 - switch ((conn & 0x000000f0) >> 4) { 6174 - case 0: 6175 - entry->type = OUTPUT_TMDS; 6176 - break; 6177 - case 1: 6178 - entry->type = OUTPUT_LVDS; 6179 - break; 6180 - default: 6181 - NV_ERROR(dev, "Unknown DCB subtype 4/%d\n", 6182 - (conn & 0x000000f0) >> 4); 6183 - return false; 6184 - } 6185 6201 break; 6186 6202 default: 6187 6203 NV_ERROR(dev, "Unknown DCB type %d\n", conn & 0x0000000f); ··· 6289 6321 * nasty problems until this is sorted (assuming it's not a 6290 6322 * VBIOS bug). 6291 6323 */ 6292 - if ((dev->pdev->device == 0x040d) && 6293 - (dev->pdev->subsystem_vendor == 0x1028) && 6294 - (dev->pdev->subsystem_device == 0x019b)) { 6324 + if (nv_match_device(dev, 0x040d, 0x1028, 0x019b)) { 6295 6325 if (*conn == 0x02026312 && *conf == 0x00000020) 6296 6326 return false; 6297 6327 }
+1
drivers/gpu/drm/nouveau/nouveau_bios.h
··· 95 95 OUTPUT_TMDS = 2, 96 96 OUTPUT_LVDS = 3, 97 97 OUTPUT_DP = 6, 98 + OUTPUT_EOL = 14, /* DCB 4.0+, appears to be end-of-list */ 98 99 OUTPUT_ANY = -1 99 100 }; 100 101
+9
drivers/gpu/drm/nouveau/nouveau_drv.h
··· 1389 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 1401 #define NV_SW 0x0000506e 1393 1402 #define NV_SW_DMA_SEMAPHORE 0x00000060 1394 1403 #define NV_SW_SEMAPHORE_OFFSET 0x00000064
+4 -2
drivers/gpu/drm/nouveau/nouveau_gem.c
··· 337 337 return -EINVAL; 338 338 } 339 339 340 + mutex_unlock(&drm_global_mutex); 340 341 ret = ttm_bo_wait_cpu(&nvbo->bo, false); 342 + mutex_lock(&drm_global_mutex); 341 343 if (ret) { 342 344 NV_ERROR(dev, "fail wait_cpu\n"); 343 345 return ret; ··· 665 663 push[i].length); 666 664 } 667 665 } else 668 - if (dev_priv->card_type >= NV_20) { 666 + if (dev_priv->chipset >= 0x25) { 669 667 ret = RING_SPACE(chan, req->nr_push * 2); 670 668 if (ret) { 671 669 NV_ERROR(dev, "cal_space: %d\n", ret); ··· 740 738 req->suffix0 = 0x00000000; 741 739 req->suffix1 = 0x00000000; 742 740 } else 743 - if (dev_priv->card_type >= NV_20) { 741 + if (dev_priv->chipset >= 0x25) { 744 742 req->suffix0 = 0x00020000; 745 743 req->suffix1 = 0x00000000; 746 744 } else {
+28 -3
drivers/gpu/drm/nouveau/nv04_dfp.c
··· 444 444 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 445 445 struct dcb_entry *dcbe = nv_encoder->dcb; 446 446 int head = nouveau_crtc(encoder->crtc)->index; 447 + struct drm_encoder *slave_encoder; 447 448 448 449 if (dcbe->type == OUTPUT_TMDS) 449 450 run_tmds_table(dev, dcbe, head, nv_encoder->mode.clock); ··· 463 462 NVWriteRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + nv04_dac_output_offset(encoder), 0x00100000); 464 463 465 464 /* Init external transmitters */ 466 - if (get_tmds_slave(encoder)) 467 - get_slave_funcs(get_tmds_slave(encoder))->mode_set( 468 - encoder, &nv_encoder->mode, &nv_encoder->mode); 465 + slave_encoder = get_tmds_slave(encoder); 466 + if (slave_encoder) 467 + get_slave_funcs(slave_encoder)->mode_set( 468 + slave_encoder, &nv_encoder->mode, &nv_encoder->mode); 469 469 470 470 helper->dpms(encoder, DRM_MODE_DPMS_ON); 471 471 472 472 NV_INFO(dev, "Output %s is running on CRTC %d using output %c\n", 473 473 drm_get_connector_name(&nouveau_encoder_connector_get(nv_encoder)->base), 474 474 nv_crtc->index, '@' + ffs(nv_encoder->dcb->or)); 475 + } 476 + 477 + static void nv04_dfp_update_backlight(struct drm_encoder *encoder, int mode) 478 + { 479 + #ifdef __powerpc__ 480 + struct drm_device *dev = encoder->dev; 481 + 482 + /* BIOS scripts usually take care of the backlight, thanks 483 + * Apple for your consistency. 484 + */ 485 + if (dev->pci_device == 0x0179 || dev->pci_device == 0x0189 || 486 + dev->pci_device == 0x0329) { 487 + if (mode == DRM_MODE_DPMS_ON) { 488 + nv_mask(dev, NV_PBUS_DEBUG_DUALHEAD_CTL, 0, 1 << 31); 489 + nv_mask(dev, NV_PCRTC_GPIO_EXT, 3, 1); 490 + } else { 491 + nv_mask(dev, NV_PBUS_DEBUG_DUALHEAD_CTL, 1 << 31, 0); 492 + nv_mask(dev, NV_PCRTC_GPIO_EXT, 3, 0); 493 + } 494 + } 495 + #endif 475 496 } 476 497 477 498 static inline bool is_powersaving_dpms(int mode) ··· 543 520 LVDS_PANEL_OFF, 0); 544 521 } 545 522 523 + nv04_dfp_update_backlight(encoder, mode); 546 524 nv04_dfp_update_fp_control(encoder, mode); 547 525 548 526 if (mode == DRM_MODE_DPMS_ON) ··· 567 543 NV_INFO(dev, "Setting dpms mode %d on tmds encoder (output %d)\n", 568 544 mode, nv_encoder->dcb->index); 569 545 546 + nv04_dfp_update_backlight(encoder, mode); 570 547 nv04_dfp_update_fp_control(encoder, mode); 571 548 } 572 549
+3 -7
drivers/gpu/drm/nouveau/nv17_tv.c
··· 121 121 get_tv_detect_quirks(struct drm_device *dev, uint32_t *pin_mask) 122 122 { 123 123 /* Zotac FX5200 */ 124 - if (dev->pdev->device == 0x0322 && 125 - dev->pdev->subsystem_vendor == 0x19da && 126 - (dev->pdev->subsystem_device == 0x1035 || 127 - dev->pdev->subsystem_device == 0x2035)) { 124 + if (nv_match_device(dev, 0x0322, 0x19da, 0x1035) || 125 + nv_match_device(dev, 0x0322, 0x19da, 0x2035)) { 128 126 *pin_mask = 0xc; 129 127 return false; 130 128 } 131 129 132 130 /* MSI nForce2 IGP */ 133 - if (dev->pdev->device == 0x01f0 && 134 - dev->pdev->subsystem_vendor == 0x1462 && 135 - dev->pdev->subsystem_device == 0x5710) { 131 + if (nv_match_device(dev, 0x01f0, 0x1462, 0x5710)) { 136 132 *pin_mask = 0xc; 137 133 return false; 138 134 }
+1
drivers/gpu/drm/radeon/radeon_connectors.c
··· 999 999 } 1000 1000 } 1001 1001 1002 + radeon_connector_update_scratch_regs(connector, ret); 1002 1003 return ret; 1003 1004 } 1004 1005
-2
drivers/gpu/drm/radeon/radeon_pm.c
··· 637 637 } 638 638 639 639 radeon_hwmon_fini(rdev); 640 - if (rdev->pm.i2c_bus) 641 - radeon_i2c_destroy(rdev->pm.i2c_bus); 642 640 } 643 641 644 642 void radeon_pm_compute_clocks(struct radeon_device *rdev)
+13 -2
include/linux/vgaarb.h
··· 93 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, 97 - int interruptible); 96 + #if defined(CONFIG_VGA_ARB) 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 103 * vga_get_interruptible ··· 134 131 * are already locked by another card. It can be called in any context 135 132 */ 136 133 134 + #if defined(CONFIG_VGA_ARB) 137 135 extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); 136 + #else 137 + static inline int vga_tryget(struct pci_dev *pdev, unsigned int rsrc) { return 0; } 138 + #endif 138 139 139 140 /** 140 141 * vga_put - release lock on legacy VGA resources ··· 153 146 * released if the counter reaches 0. 154 147 */ 155 148 149 + #if defined(CONFIG_VGA_ARB) 156 150 extern void vga_put(struct pci_dev *pdev, unsigned int rsrc); 151 + #else 152 + #define vga_put(pdev, rsrc) 153 + #endif 157 154 158 155 159 156 /**