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:
drm: Include the connector name in the output_poll_execute() debug message
drm/radeon/kms: fix bug in r600_gpu_is_lockup
drm/radeon/kms: reorder display resume to avoid problems
drm/radeon/kms/evergreen: reset the grbm blocks at resume and init
drm/radeon/kms: fix evergreen asic reset
Revert "drm: Don't try and disable an encoder that was never enabled"
drm/radeon: Add early unregister of firmware fb's
drm/radeon: use aperture size not vram size for overlap tests
drm/radeon/kms/evergreen: flush hdp cache when flushing gart tlb
drm/radeon/kms: disable the r600 cb offset checker for linear surfaces
drm/radeon/kms: disable ss fixed ref divide
drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks
agp/intel: Fix missed cached memory flags setting in i965_write_entry()
drm/i915/sdvo: Only use the SDVO pin if it is in the valid range
drm/i915/ringbuffer: Handle wrapping of the autoreported HEAD
drm/i915/dp: Fix I2C/EDID handling with active DisplayPort to DVI converter

+115 -59
+9 -2
drivers/char/agp/intel-gtt.c
··· 1192 1192 writel(1, intel_private.i9xx_flush_page); 1193 1193 } 1194 1194 1195 - static void i965_write_entry(dma_addr_t addr, unsigned int entry, 1195 + static void i965_write_entry(dma_addr_t addr, 1196 + unsigned int entry, 1196 1197 unsigned int flags) 1197 1198 { 1199 + u32 pte_flags; 1200 + 1201 + pte_flags = I810_PTE_VALID; 1202 + if (flags == AGP_USER_CACHED_MEMORY) 1203 + pte_flags |= I830_PTE_SYSTEM_CACHED; 1204 + 1198 1205 /* Shift high bits down */ 1199 1206 addr |= (addr >> 28) & 0xf0; 1200 - writel(addr | I810_PTE_VALID, intel_private.gtt + entry); 1207 + writel(addr | pte_flags, intel_private.gtt + entry); 1201 1208 } 1202 1209 1203 1210 static bool gen6_check_flags(unsigned int flags)
+5 -2
drivers/gpu/drm/drm_crtc_helper.c
··· 241 241 } 242 242 243 243 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 244 - if (encoder->crtc && !drm_helper_encoder_in_use(encoder)) { 244 + if (!drm_helper_encoder_in_use(encoder)) { 245 245 drm_encoder_disable(encoder); 246 246 /* disconnector encoder from any connector */ 247 247 encoder->crtc = NULL; ··· 874 874 continue; 875 875 876 876 connector->status = connector->funcs->detect(connector, false); 877 - DRM_DEBUG_KMS("connector status updated to %d\n", connector->status); 877 + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n", 878 + connector->base.id, 879 + drm_get_connector_name(connector), 880 + old_status, connector->status); 878 881 if (old_status != connector->status) 879 882 changed = true; 880 883 }
+1 -1
drivers/gpu/drm/i915/intel_bios.c
··· 270 270 general->ssc_freq ? 66 : 48; 271 271 else if (IS_GEN5(dev) || IS_GEN6(dev)) 272 272 dev_priv->lvds_ssc_freq = 273 - general->ssc_freq ? 100 : 120; 273 + general->ssc_freq ? 120 : 100; 274 274 else 275 275 dev_priv->lvds_ssc_freq = 276 276 general->ssc_freq ? 100 : 96;
+30 -7
drivers/gpu/drm/i915/intel_dp.c
··· 479 479 uint16_t address = algo_data->address; 480 480 uint8_t msg[5]; 481 481 uint8_t reply[2]; 482 + unsigned retry; 482 483 int msg_bytes; 483 484 int reply_bytes; 484 485 int ret; ··· 514 513 break; 515 514 } 516 515 517 - for (;;) { 518 - ret = intel_dp_aux_ch(intel_dp, 519 - msg, msg_bytes, 520 - reply, reply_bytes); 516 + for (retry = 0; retry < 5; retry++) { 517 + ret = intel_dp_aux_ch(intel_dp, 518 + msg, msg_bytes, 519 + reply, reply_bytes); 521 520 if (ret < 0) { 522 521 DRM_DEBUG_KMS("aux_ch failed %d\n", ret); 523 522 return ret; 524 523 } 524 + 525 + switch (reply[0] & AUX_NATIVE_REPLY_MASK) { 526 + case AUX_NATIVE_REPLY_ACK: 527 + /* I2C-over-AUX Reply field is only valid 528 + * when paired with AUX ACK. 529 + */ 530 + break; 531 + case AUX_NATIVE_REPLY_NACK: 532 + DRM_DEBUG_KMS("aux_ch native nack\n"); 533 + return -EREMOTEIO; 534 + case AUX_NATIVE_REPLY_DEFER: 535 + udelay(100); 536 + continue; 537 + default: 538 + DRM_ERROR("aux_ch invalid native reply 0x%02x\n", 539 + reply[0]); 540 + return -EREMOTEIO; 541 + } 542 + 525 543 switch (reply[0] & AUX_I2C_REPLY_MASK) { 526 544 case AUX_I2C_REPLY_ACK: 527 545 if (mode == MODE_I2C_READ) { ··· 548 528 } 549 529 return reply_bytes - 1; 550 530 case AUX_I2C_REPLY_NACK: 551 - DRM_DEBUG_KMS("aux_ch nack\n"); 531 + DRM_DEBUG_KMS("aux_i2c nack\n"); 552 532 return -EREMOTEIO; 553 533 case AUX_I2C_REPLY_DEFER: 554 - DRM_DEBUG_KMS("aux_ch defer\n"); 534 + DRM_DEBUG_KMS("aux_i2c defer\n"); 555 535 udelay(100); 556 536 break; 557 537 default: 558 - DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]); 538 + DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]); 559 539 return -EREMOTEIO; 560 540 } 561 541 } 542 + 543 + DRM_ERROR("too many retries, giving up\n"); 544 + return -EREMOTEIO; 562 545 } 563 546 564 547 static int
+8 -11
drivers/gpu/drm/i915/intel_ringbuffer.c
··· 696 696 drm_i915_private_t *dev_priv = dev->dev_private; 697 697 u32 head; 698 698 699 - head = intel_read_status_page(ring, 4); 700 - if (head) { 701 - ring->head = head & HEAD_ADDR; 702 - ring->space = ring->head - (ring->tail + 8); 703 - if (ring->space < 0) 704 - ring->space += ring->size; 705 - if (ring->space >= n) 706 - return 0; 707 - } 708 - 709 699 trace_i915_ring_wait_begin (dev); 710 700 end = jiffies + 3 * HZ; 711 701 do { 712 - ring->head = I915_READ_HEAD(ring) & HEAD_ADDR; 702 + /* If the reported head position has wrapped or hasn't advanced, 703 + * fallback to the slow and accurate path. 704 + */ 705 + head = intel_read_status_page(ring, 4); 706 + if (head < ring->actual_head) 707 + head = I915_READ_HEAD(ring); 708 + ring->actual_head = head; 709 + ring->head = head & HEAD_ADDR; 713 710 ring->space = ring->head - (ring->tail + 8); 714 711 if (ring->space < 0) 715 712 ring->space += ring->size;
+3 -2
drivers/gpu/drm/i915/intel_ringbuffer.h
··· 30 30 struct drm_device *dev; 31 31 struct drm_gem_object *gem_object; 32 32 33 - unsigned int head; 34 - unsigned int tail; 33 + u32 actual_head; 34 + u32 head; 35 + u32 tail; 35 36 int space; 36 37 struct intel_hw_status_page status_page; 37 38
+6 -3
drivers/gpu/drm/i915/intel_sdvo.c
··· 1908 1908 speed = mapping->i2c_speed; 1909 1909 } 1910 1910 1911 - sdvo->i2c = &dev_priv->gmbus[pin].adapter; 1912 - intel_gmbus_set_speed(sdvo->i2c, speed); 1913 - intel_gmbus_force_bit(sdvo->i2c, true); 1911 + if (pin < GMBUS_NUM_PORTS) { 1912 + sdvo->i2c = &dev_priv->gmbus[pin].adapter; 1913 + intel_gmbus_set_speed(sdvo->i2c, speed); 1914 + intel_gmbus_force_bit(sdvo->i2c, true); 1915 + } else 1916 + sdvo->i2c = &dev_priv->gmbus[GMBUS_PORT_DPB].adapter; 1914 1917 } 1915 1918 1916 1919 static bool
+4 -3
drivers/gpu/drm/radeon/atombios_crtc.c
··· 253 253 case DRM_MODE_DPMS_SUSPEND: 254 254 case DRM_MODE_DPMS_OFF: 255 255 drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); 256 - atombios_blank_crtc(crtc, ATOM_ENABLE); 256 + if (radeon_crtc->enabled) 257 + atombios_blank_crtc(crtc, ATOM_ENABLE); 257 258 if (ASIC_IS_DCE3(rdev)) 258 259 atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); 259 260 atombios_enable_crtc(crtc, ATOM_DISABLE); ··· 531 530 dp_clock = dig_connector->dp_clock; 532 531 } 533 532 } 534 - 533 + #if 0 /* doesn't work properly on some laptops */ 535 534 /* use recommended ref_div for ss */ 536 535 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 537 536 if (ss_enabled) { ··· 541 540 } 542 541 } 543 542 } 544 - 543 + #endif 545 544 if (ASIC_IS_AVIVO(rdev)) { 546 545 /* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */ 547 546 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1)
+12 -15
drivers/gpu/drm/radeon/evergreen.c
··· 748 748 unsigned i; 749 749 u32 tmp; 750 750 751 + WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 752 + 751 753 WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1)); 752 754 for (i = 0; i < rdev->usec_timeout; i++) { 753 755 /* read MC_STATUS */ ··· 1924 1922 static int evergreen_gpu_soft_reset(struct radeon_device *rdev) 1925 1923 { 1926 1924 struct evergreen_mc_save save; 1927 - u32 srbm_reset = 0; 1928 1925 u32 grbm_reset = 0; 1929 1926 1930 1927 dev_info(rdev->dev, "GPU softreset \n"); ··· 1962 1961 udelay(50); 1963 1962 WREG32(GRBM_SOFT_RESET, 0); 1964 1963 (void)RREG32(GRBM_SOFT_RESET); 1965 - 1966 - /* reset all the system blocks */ 1967 - srbm_reset = SRBM_SOFT_RESET_ALL_MASK; 1968 - 1969 - dev_info(rdev->dev, " SRBM_SOFT_RESET=0x%08X\n", srbm_reset); 1970 - WREG32(SRBM_SOFT_RESET, srbm_reset); 1971 - (void)RREG32(SRBM_SOFT_RESET); 1972 - udelay(50); 1973 - WREG32(SRBM_SOFT_RESET, 0); 1974 - (void)RREG32(SRBM_SOFT_RESET); 1975 1964 /* Wait a little for things to settle down */ 1976 1965 udelay(50); 1977 1966 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", ··· 1972 1981 RREG32(GRBM_STATUS_SE1)); 1973 1982 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 1974 1983 RREG32(SRBM_STATUS)); 1975 - /* After reset we need to reinit the asic as GPU often endup in an 1976 - * incoherent state. 1977 - */ 1978 - atom_asic_init(rdev->mode_info.atom_context); 1979 1984 evergreen_mc_resume(rdev, &save); 1980 1985 return 0; 1981 1986 } ··· 2583 2596 { 2584 2597 int r; 2585 2598 2599 + /* reset the asic, the gfx blocks are often in a bad state 2600 + * after the driver is unloaded or after a resume 2601 + */ 2602 + if (radeon_asic_reset(rdev)) 2603 + dev_warn(rdev->dev, "GPU reset failed !\n"); 2586 2604 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 2587 2605 * posting will perform necessary task to bring back GPU into good 2588 2606 * shape. ··· 2704 2712 r = radeon_atombios_init(rdev); 2705 2713 if (r) 2706 2714 return r; 2715 + /* reset the asic, the gfx blocks are often in a bad state 2716 + * after the driver is unloaded or after a resume 2717 + */ 2718 + if (radeon_asic_reset(rdev)) 2719 + dev_warn(rdev->dev, "GPU reset failed !\n"); 2707 2720 /* Post card if necessary */ 2708 2721 if (!evergreen_card_posted(rdev)) { 2709 2722 if (!rdev->bios) {
+1
drivers/gpu/drm/radeon/evergreend.h
··· 174 174 #define HDP_NONSURFACE_BASE 0x2C04 175 175 #define HDP_NONSURFACE_INFO 0x2C08 176 176 #define HDP_NONSURFACE_SIZE 0x2C0C 177 + #define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480 177 178 #define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0 178 179 #define HDP_TILING_CONFIG 0x2F3C 179 180
+8 -2
drivers/gpu/drm/radeon/r600.c
··· 1342 1342 u32 srbm_status; 1343 1343 u32 grbm_status; 1344 1344 u32 grbm_status2; 1345 + struct r100_gpu_lockup *lockup; 1345 1346 int r; 1347 + 1348 + if (rdev->family >= CHIP_RV770) 1349 + lockup = &rdev->config.rv770.lockup; 1350 + else 1351 + lockup = &rdev->config.r600.lockup; 1346 1352 1347 1353 srbm_status = RREG32(R_000E50_SRBM_STATUS); 1348 1354 grbm_status = RREG32(R_008010_GRBM_STATUS); 1349 1355 grbm_status2 = RREG32(R_008014_GRBM_STATUS2); 1350 1356 if (!G_008010_GUI_ACTIVE(grbm_status)) { 1351 - r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp); 1357 + r100_gpu_lockup_update(lockup, &rdev->cp); 1352 1358 return false; 1353 1359 } 1354 1360 /* force CP activities */ ··· 1366 1360 radeon_ring_unlock_commit(rdev); 1367 1361 } 1368 1362 rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); 1369 - return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp); 1363 + return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp); 1370 1364 } 1371 1365 1372 1366 int r600_asic_reset(struct radeon_device *rdev)
+4 -5
drivers/gpu/drm/radeon/r600_cs.c
··· 315 315 if (array_mode == V_0280A0_ARRAY_LINEAR_GENERAL) { 316 316 /* the initial DDX does bad things with the CB size occasionally */ 317 317 /* it rounds up height too far for slice tile max but the BO is smaller */ 318 - tmp = (height - 7) * 8 * bpe; 319 - if ((tmp + track->cb_color_bo_offset[i]) > radeon_bo_size(track->cb_color_bo[i])) { 320 - dev_warn(p->dev, "%s offset[%d] %d %d %lu too big\n", __func__, i, track->cb_color_bo_offset[i], tmp, radeon_bo_size(track->cb_color_bo[i])); 321 - return -EINVAL; 322 - } 318 + /* r600c,g also seem to flush at bad times in some apps resulting in 319 + * bogus values here. So for linear just allow anything to avoid breaking 320 + * broken userspace. 321 + */ 323 322 } else { 324 323 dev_warn(p->dev, "%s offset[%d] %d %d %lu too big\n", __func__, i, track->cb_color_bo_offset[i], tmp, radeon_bo_size(track->cb_color_bo[i])); 325 324 return -EINVAL;
+4 -5
drivers/gpu/drm/radeon/radeon_device.c
··· 910 910 radeon_pm_resume(rdev); 911 911 radeon_restore_bios_scratch_regs(rdev); 912 912 913 - /* turn on display hw */ 914 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 915 - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); 916 - } 917 - 918 913 radeon_fbdev_set_suspend(rdev, 0); 919 914 release_console_sem(); 920 915 ··· 917 922 radeon_hpd_init(rdev); 918 923 /* blat the mode back in */ 919 924 drm_helper_resume_force_mode(dev); 925 + /* turn on display hw */ 926 + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 927 + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); 928 + } 920 929 return 0; 921 930 } 922 931
+19
drivers/gpu/drm/radeon/radeon_drv.c
··· 232 232 233 233 static struct drm_driver kms_driver; 234 234 235 + static void radeon_kick_out_firmware_fb(struct pci_dev *pdev) 236 + { 237 + struct apertures_struct *ap; 238 + bool primary = false; 239 + 240 + ap = alloc_apertures(1); 241 + ap->ranges[0].base = pci_resource_start(pdev, 0); 242 + ap->ranges[0].size = pci_resource_len(pdev, 0); 243 + 244 + #ifdef CONFIG_X86 245 + primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; 246 + #endif 247 + remove_conflicting_framebuffers(ap, "radeondrmfb", primary); 248 + kfree(ap); 249 + } 250 + 235 251 static int __devinit 236 252 radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 237 253 { 254 + /* Get rid of things like offb */ 255 + radeon_kick_out_firmware_fb(pdev); 256 + 238 257 return drm_get_pci_dev(pdev, ent, &kms_driver); 239 258 } 240 259
+1 -1
drivers/gpu/drm/radeon/radeon_fb.c
··· 245 245 goto out_unref; 246 246 } 247 247 info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base; 248 - info->apertures->ranges[0].size = rdev->mc.real_vram_size; 248 + info->apertures->ranges[0].size = rdev->mc.aper_size; 249 249 250 250 info->fix.mmio_start = 0; 251 251 info->fix.mmio_len = 0;