Merge branch 'drm-intel-next' of ../anholt-2.6 into drm-linus

+292 -123
+1 -6
drivers/gpu/drm/drm_gem.c
··· 505 505 struct drm_local_map *map = NULL; 506 506 struct drm_gem_object *obj; 507 507 struct drm_hash_item *hash; 508 - unsigned long prot; 509 508 int ret = 0; 510 509 511 510 mutex_lock(&dev->struct_mutex); ··· 537 538 vma->vm_ops = obj->dev->driver->gem_vm_ops; 538 539 vma->vm_private_data = map->handle; 539 540 /* FIXME: use pgprot_writecombine when available */ 540 - prot = pgprot_val(vma->vm_page_prot); 541 - #ifdef CONFIG_X86 542 - prot |= _PAGE_CACHE_WC; 543 - #endif 544 - vma->vm_page_prot = __pgprot(prot); 541 + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); 545 542 546 543 /* Take a ref for this mapping of the object, so that the fault 547 544 * handler can dereference the mmap offset's pointer to the object.
+1
drivers/gpu/drm/drm_sysfs.c
··· 451 451 452 452 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, envp); 453 453 } 454 + EXPORT_SYMBOL(drm_sysfs_hotplug_event); 454 455 455 456 /** 456 457 * drm_sysfs_device_add - adds a class device to sysfs for a character driver
+1 -8
drivers/gpu/drm/i915/i915_dma.c
··· 922 922 * Some of the preallocated space is taken by the GTT 923 923 * and popup. GTT is 1K per MB of aperture size, and popup is 4K. 924 924 */ 925 - if (IS_G4X(dev)) 925 + if (IS_G4X(dev) || IS_IGD(dev)) 926 926 overhead = 4096; 927 927 else 928 928 overhead = (*aperture_size / 1024) + 4096; ··· 1029 1029 ret = drm_irq_install(dev); 1030 1030 if (ret) 1031 1031 goto destroy_ringbuffer; 1032 - 1033 - /* FIXME: re-add hotplug support */ 1034 - #if 0 1035 - ret = drm_hotplug_init(dev); 1036 - if (ret) 1037 - goto destroy_ringbuffer; 1038 - #endif 1039 1032 1040 1033 /* Always safe in the mode setting case. */ 1041 1034 /* FIXME: do pre/post-mode set stuff in core KMS code */
+5
drivers/gpu/drm/i915/i915_drv.h
··· 159 159 u32 irq_mask_reg; 160 160 u32 pipestat[2]; 161 161 162 + u32 hotplug_supported_mask; 163 + struct work_struct hotplug_work; 164 + 162 165 int tex_lru_log_granularity; 163 166 int allow_batchbuffer; 164 167 struct mem_block *agp_heap; ··· 300 297 * 301 298 * A reference is held on the buffer while on this list. 302 299 */ 300 + spinlock_t active_list_lock; 303 301 struct list_head active_list; 304 302 305 303 /** ··· 814 810 #define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \ 815 811 IS_I915GM(dev))) 816 812 #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev)) 813 + #define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) 817 814 818 815 #define PRIMARY_RINGBUFFER_SIZE (128*1024) 819 816
+29 -9
drivers/gpu/drm/i915/i915_gem.c
··· 1072 1072 case -EAGAIN: 1073 1073 return VM_FAULT_OOM; 1074 1074 case -EFAULT: 1075 + case -EINVAL: 1075 1076 return VM_FAULT_SIGBUS; 1076 1077 default: 1077 1078 return VM_FAULT_NOPAGE; ··· 1325 1324 obj_priv->active = 1; 1326 1325 } 1327 1326 /* Move from whatever list we were on to the tail of execution. */ 1327 + spin_lock(&dev_priv->mm.active_list_lock); 1328 1328 list_move_tail(&obj_priv->list, 1329 1329 &dev_priv->mm.active_list); 1330 + spin_unlock(&dev_priv->mm.active_list_lock); 1330 1331 obj_priv->last_rendering_seqno = seqno; 1331 1332 } 1332 1333 ··· 1470 1467 /* Move any buffers on the active list that are no longer referenced 1471 1468 * by the ringbuffer to the flushing/inactive lists as appropriate. 1472 1469 */ 1470 + spin_lock(&dev_priv->mm.active_list_lock); 1473 1471 while (!list_empty(&dev_priv->mm.active_list)) { 1474 1472 struct drm_gem_object *obj; 1475 1473 struct drm_i915_gem_object *obj_priv; ··· 1485 1481 * this seqno. 1486 1482 */ 1487 1483 if (obj_priv->last_rendering_seqno != request->seqno) 1488 - return; 1484 + goto out; 1489 1485 1490 1486 #if WATCH_LRU 1491 1487 DRM_INFO("%s: retire %d moves to inactive list %p\n", ··· 1497 1493 else 1498 1494 i915_gem_object_move_to_inactive(obj); 1499 1495 } 1496 + out: 1497 + spin_unlock(&dev_priv->mm.active_list_lock); 1500 1498 } 1501 1499 1502 1500 /** ··· 1996 1990 int regnum = obj_priv->fence_reg; 1997 1991 uint32_t val; 1998 1992 uint32_t pitch_val; 1993 + uint32_t fence_size_bits; 1999 1994 2000 - if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) || 1995 + if ((obj_priv->gtt_offset & ~I830_FENCE_START_MASK) || 2001 1996 (obj_priv->gtt_offset & (obj->size - 1))) { 2002 - WARN(1, "%s: object 0x%08x not 1M or size aligned\n", 1997 + WARN(1, "%s: object 0x%08x not 512K or size aligned\n", 2003 1998 __func__, obj_priv->gtt_offset); 2004 1999 return; 2005 2000 } 2006 2001 2007 2002 pitch_val = (obj_priv->stride / 128) - 1; 2008 - 2003 + WARN_ON(pitch_val & ~0x0000000f); 2009 2004 val = obj_priv->gtt_offset; 2010 2005 if (obj_priv->tiling_mode == I915_TILING_Y) 2011 2006 val |= 1 << I830_FENCE_TILING_Y_SHIFT; 2012 - val |= I830_FENCE_SIZE_BITS(obj->size); 2007 + fence_size_bits = I830_FENCE_SIZE_BITS(obj->size); 2008 + WARN_ON(fence_size_bits & ~0x00000f00); 2009 + val |= fence_size_bits; 2013 2010 val |= pitch_val << I830_FENCE_PITCH_SHIFT; 2014 2011 val |= I830_FENCE_REG_VALID; 2015 2012 ··· 2203 2194 return -EBUSY; 2204 2195 if (alignment == 0) 2205 2196 alignment = i915_gem_get_gtt_alignment(obj); 2206 - if (alignment & (PAGE_SIZE - 1)) { 2197 + if (alignment & (i915_gem_get_gtt_alignment(obj) - 1)) { 2207 2198 DRM_ERROR("Invalid object alignment requested %u\n", alignment); 2208 2199 return -EINVAL; 2209 2200 } ··· 2220 2211 } 2221 2212 } 2222 2213 if (obj_priv->gtt_space == NULL) { 2214 + bool lists_empty; 2215 + 2223 2216 /* If the gtt is empty and we're still having trouble 2224 2217 * fitting our object in, we're out of memory. 2225 2218 */ 2226 2219 #if WATCH_LRU 2227 2220 DRM_INFO("%s: GTT full, evicting something\n", __func__); 2228 2221 #endif 2229 - if (list_empty(&dev_priv->mm.inactive_list) && 2230 - list_empty(&dev_priv->mm.flushing_list) && 2231 - list_empty(&dev_priv->mm.active_list)) { 2222 + spin_lock(&dev_priv->mm.active_list_lock); 2223 + lists_empty = (list_empty(&dev_priv->mm.inactive_list) && 2224 + list_empty(&dev_priv->mm.flushing_list) && 2225 + list_empty(&dev_priv->mm.active_list)); 2226 + spin_unlock(&dev_priv->mm.active_list_lock); 2227 + if (lists_empty) { 2232 2228 DRM_ERROR("GTT full, but LRU list empty\n"); 2233 2229 return -ENOMEM; 2234 2230 } ··· 3689 3675 3690 3676 i915_gem_retire_requests(dev); 3691 3677 3678 + spin_lock(&dev_priv->mm.active_list_lock); 3692 3679 if (!dev_priv->mm.wedged) { 3693 3680 /* Active and flushing should now be empty as we've 3694 3681 * waited for a sequence higher than any pending execbuffer ··· 3716 3701 obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; 3717 3702 i915_gem_object_move_to_inactive(obj_priv->obj); 3718 3703 } 3704 + spin_unlock(&dev_priv->mm.active_list_lock); 3719 3705 3720 3706 while (!list_empty(&dev_priv->mm.flushing_list)) { 3721 3707 struct drm_i915_gem_object *obj_priv; ··· 3965 3949 if (ret != 0) 3966 3950 return ret; 3967 3951 3952 + spin_lock(&dev_priv->mm.active_list_lock); 3968 3953 BUG_ON(!list_empty(&dev_priv->mm.active_list)); 3954 + spin_unlock(&dev_priv->mm.active_list_lock); 3955 + 3969 3956 BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); 3970 3957 BUG_ON(!list_empty(&dev_priv->mm.inactive_list)); 3971 3958 BUG_ON(!list_empty(&dev_priv->mm.request_list)); ··· 4012 3993 { 4013 3994 drm_i915_private_t *dev_priv = dev->dev_private; 4014 3995 3996 + spin_lock_init(&dev_priv->mm.active_list_lock); 4015 3997 INIT_LIST_HEAD(&dev_priv->mm.active_list); 4016 3998 INIT_LIST_HEAD(&dev_priv->mm.flushing_list); 4017 3999 INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
+2
drivers/gpu/drm/i915/i915_gem_debug.c
··· 105 105 struct drm_i915_gem_object *obj_priv; 106 106 107 107 DRM_INFO("active list %s {\n", where); 108 + spin_lock(&dev_priv->mm.active_list_lock); 108 109 list_for_each_entry(obj_priv, &dev_priv->mm.active_list, 109 110 list) 110 111 { 111 112 DRM_INFO(" %p: %08x\n", obj_priv, 112 113 obj_priv->last_rendering_seqno); 113 114 } 115 + spin_unlock(&dev_priv->mm.active_list_lock); 114 116 DRM_INFO("}\n"); 115 117 DRM_INFO("flushing list %s {\n", where); 116 118 list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list,
+6
drivers/gpu/drm/i915/i915_gem_debugfs.c
··· 69 69 struct drm_device *dev = node->minor->dev; 70 70 drm_i915_private_t *dev_priv = dev->dev_private; 71 71 struct drm_i915_gem_object *obj_priv; 72 + spinlock_t *lock = NULL; 72 73 73 74 switch (list) { 74 75 case ACTIVE_LIST: 75 76 seq_printf(m, "Active:\n"); 77 + lock = &dev_priv->mm.active_list_lock; 78 + spin_lock(lock); 76 79 head = &dev_priv->mm.active_list; 77 80 break; 78 81 case INACTIVE_LIST: ··· 107 104 seq_printf(m, " (fence: %d\n", obj_priv->fence_reg); 108 105 seq_printf(m, "\n"); 109 106 } 107 + 108 + if (lock) 109 + spin_unlock(lock); 110 110 return 0; 111 111 } 112 112
+16
drivers/gpu/drm/i915/i915_gem_tiling.c
··· 216 216 else 217 217 tile_width = 512; 218 218 219 + /* check maximum stride & object size */ 220 + if (IS_I965G(dev)) { 221 + /* i965 stores the end address of the gtt mapping in the fence 222 + * reg, so dont bother to check the size */ 223 + if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) 224 + return false; 225 + } else if (IS_I9XX(dev)) { 226 + if (stride / tile_width > I830_FENCE_MAX_PITCH_VAL || 227 + size > (I830_FENCE_MAX_SIZE_VAL << 20)) 228 + return false; 229 + } else { 230 + if (stride / 128 > I830_FENCE_MAX_PITCH_VAL || 231 + size > (I830_FENCE_MAX_SIZE_VAL << 19)) 232 + return false; 233 + } 234 + 219 235 /* 965+ just needs multiples of tile width */ 220 236 if (IS_I965G(dev)) { 221 237 if (stride & (tile_width - 1))
+62 -5
drivers/gpu/drm/i915/i915_irq.c
··· 48 48 /** Interrupts that we mask and unmask at runtime. */ 49 49 #define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT) 50 50 51 - /** These are all of the interrupts used by the driver */ 52 - #define I915_INTERRUPT_ENABLE_MASK (I915_INTERRUPT_ENABLE_FIX | \ 53 - I915_INTERRUPT_ENABLE_VAR) 54 - 55 51 #define I915_PIPE_VBLANK_STATUS (PIPE_START_VBLANK_INTERRUPT_STATUS |\ 56 52 PIPE_VBLANK_INTERRUPT_STATUS) 57 53 ··· 183 187 return I915_READ(reg); 184 188 } 185 189 190 + /* 191 + * Handle hotplug events outside the interrupt handler proper. 192 + */ 193 + static void i915_hotplug_work_func(struct work_struct *work) 194 + { 195 + drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, 196 + hotplug_work); 197 + struct drm_device *dev = dev_priv->dev; 198 + 199 + /* Just fire off a uevent and let userspace tell us what to do */ 200 + drm_sysfs_hotplug_event(dev); 201 + } 202 + 186 203 irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) 187 204 { 188 205 struct drm_device *dev = (struct drm_device *) arg; ··· 252 243 break; 253 244 254 245 ret = IRQ_HANDLED; 246 + 247 + /* Consume port. Then clear IIR or we'll miss events */ 248 + if ((I915_HAS_HOTPLUG(dev)) && 249 + (iir & I915_DISPLAY_PORT_INTERRUPT)) { 250 + u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); 251 + 252 + DRM_DEBUG("hotplug event received, stat 0x%08x\n", 253 + hotplug_status); 254 + if (hotplug_status & dev_priv->hotplug_supported_mask) 255 + schedule_work(&dev_priv->hotplug_work); 256 + 257 + I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); 258 + I915_READ(PORT_HOTPLUG_STAT); 259 + } 255 260 256 261 I915_WRITE(IIR, iir); 257 262 new_iir = I915_READ(IIR); /* Flush posted writes */ ··· 551 528 552 529 atomic_set(&dev_priv->irq_received, 0); 553 530 531 + if (I915_HAS_HOTPLUG(dev)) { 532 + I915_WRITE(PORT_HOTPLUG_EN, 0); 533 + I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); 534 + } 535 + 554 536 I915_WRITE(HWSTAM, 0xeffe); 555 537 I915_WRITE(PIPEASTAT, 0); 556 538 I915_WRITE(PIPEBSTAT, 0); 557 539 I915_WRITE(IMR, 0xffffffff); 558 540 I915_WRITE(IER, 0x0); 559 541 (void) I915_READ(IER); 542 + INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 560 543 } 561 544 562 545 int i915_driver_irq_postinstall(struct drm_device *dev) 563 546 { 564 547 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 548 + u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR; 565 549 566 550 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 567 551 ··· 580 550 dev_priv->pipestat[0] = 0; 581 551 dev_priv->pipestat[1] = 0; 582 552 553 + if (I915_HAS_HOTPLUG(dev)) { 554 + u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); 555 + 556 + /* Leave other bits alone */ 557 + hotplug_en |= HOTPLUG_EN_MASK; 558 + I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); 559 + 560 + dev_priv->hotplug_supported_mask = CRT_HOTPLUG_INT_STATUS | 561 + TV_HOTPLUG_INT_STATUS | SDVOC_HOTPLUG_INT_STATUS | 562 + SDVOB_HOTPLUG_INT_STATUS; 563 + if (IS_G4X(dev)) { 564 + dev_priv->hotplug_supported_mask |= 565 + HDMIB_HOTPLUG_INT_STATUS | 566 + HDMIC_HOTPLUG_INT_STATUS | 567 + HDMID_HOTPLUG_INT_STATUS; 568 + } 569 + /* Enable in IER... */ 570 + enable_mask |= I915_DISPLAY_PORT_INTERRUPT; 571 + /* and unmask in IMR */ 572 + i915_enable_irq(dev_priv, I915_DISPLAY_PORT_INTERRUPT); 573 + } 574 + 583 575 /* Disable pipe interrupt enables, clear pending pipe status */ 584 576 I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); 585 577 I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); 586 578 /* Clear pending interrupt status */ 587 579 I915_WRITE(IIR, I915_READ(IIR)); 588 580 589 - I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); 581 + I915_WRITE(IER, enable_mask); 590 582 I915_WRITE(IMR, dev_priv->irq_mask_reg); 591 583 (void) I915_READ(IER); 592 584 ··· 626 574 return; 627 575 628 576 dev_priv->vblank_pipe = 0; 577 + 578 + if (I915_HAS_HOTPLUG(dev)) { 579 + I915_WRITE(PORT_HOTPLUG_EN, 0); 580 + I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); 581 + } 629 582 630 583 I915_WRITE(HWSTAM, 0xffffffff); 631 584 I915_WRITE(PIPEASTAT, 0);
+11
drivers/gpu/drm/i915/i915_reg.h
··· 190 190 #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) 191 191 #define I830_FENCE_PITCH_SHIFT 4 192 192 #define I830_FENCE_REG_VALID (1<<0) 193 + #define I830_FENCE_MAX_PITCH_VAL 0x10 194 + #define I830_FENCE_MAX_SIZE_VAL (1<<8) 193 195 194 196 #define I915_FENCE_START_MASK 0x0ff00000 195 197 #define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8) ··· 200 198 #define I965_FENCE_PITCH_SHIFT 2 201 199 #define I965_FENCE_TILING_Y_SHIFT 1 202 200 #define I965_FENCE_REG_VALID (1<<0) 201 + #define I965_FENCE_MAX_PITCH_VAL 0x0400 203 202 204 203 /* 205 204 * Instruction and interrupt control regs ··· 651 648 #define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2) 652 649 #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) 653 650 #define CRT_HOTPLUG_MASK (0x3fc) /* Bits 9-2 */ 651 + #define CRT_FORCE_HOTPLUG_MASK 0xfffffe1f 652 + #define HOTPLUG_EN_MASK (HDMIB_HOTPLUG_INT_EN | \ 653 + HDMIC_HOTPLUG_INT_EN | \ 654 + HDMID_HOTPLUG_INT_EN | \ 655 + SDVOB_HOTPLUG_INT_EN | \ 656 + SDVOC_HOTPLUG_INT_EN | \ 657 + TV_HOTPLUG_INT_EN | \ 658 + CRT_HOTPLUG_INT_EN) 654 659 655 660 656 661 #define PORT_HOTPLUG_STAT 0x61114
+2 -2
drivers/gpu/drm/i915/intel_crt.c
··· 41 41 42 42 temp = I915_READ(ADPA); 43 43 temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE); 44 - temp &= ~ADPA_DAC_ENABLE; 44 + temp |= ADPA_DAC_ENABLE; 45 45 46 46 switch(mode) { 47 47 case DRM_MODE_DPMS_ON: ··· 158 158 else 159 159 tries = 1; 160 160 hotplug_en = I915_READ(PORT_HOTPLUG_EN); 161 - hotplug_en &= ~(CRT_HOTPLUG_MASK); 161 + hotplug_en &= CRT_FORCE_HOTPLUG_MASK; 162 162 hotplug_en |= CRT_HOTPLUG_FORCE_DETECT; 163 163 164 164 if (IS_GM45(dev))
+21 -1
drivers/gpu/drm/i915/intel_display.c
··· 636 636 intel_wait_for_vblank(struct drm_device *dev) 637 637 { 638 638 /* Wait for 20ms, i.e. one cycle at 50hz. */ 639 - udelay(20000); 639 + mdelay(20); 640 640 } 641 641 642 642 static int ··· 1104 1104 if (!ok) { 1105 1105 DRM_ERROR("Couldn't find PLL settings for mode!\n"); 1106 1106 return -EINVAL; 1107 + } 1108 + 1109 + /* SDVO TV has fixed PLL values depend on its clock range, 1110 + this mirrors vbios setting. */ 1111 + if (is_sdvo && is_tv) { 1112 + if (adjusted_mode->clock >= 100000 1113 + && adjusted_mode->clock < 140500) { 1114 + clock.p1 = 2; 1115 + clock.p2 = 10; 1116 + clock.n = 3; 1117 + clock.m1 = 16; 1118 + clock.m2 = 8; 1119 + } else if (adjusted_mode->clock >= 140500 1120 + && adjusted_mode->clock <= 200000) { 1121 + clock.p1 = 1; 1122 + clock.p2 = 10; 1123 + clock.n = 6; 1124 + clock.m1 = 12; 1125 + clock.m2 = 8; 1126 + } 1107 1127 } 1108 1128 1109 1129 if (IS_IGD(dev))
+1
drivers/gpu/drm/i915/intel_modes.c
··· 76 76 drm_mode_connector_update_edid_property(&intel_output->base, 77 77 edid); 78 78 ret = drm_add_edid_modes(&intel_output->base, edid); 79 + intel_output->base.display_info.raw_edid = NULL; 79 80 kfree(edid); 80 81 } 81 82
+108 -85
drivers/gpu/drm/i915/intel_sdvo.c
··· 273 273 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 274 274 int i; 275 275 276 - DRM_DEBUG("%s: W: %02X ", SDVO_NAME(sdvo_priv), cmd); 276 + printk(KERN_DEBUG "%s: W: %02X ", SDVO_NAME(sdvo_priv), cmd); 277 277 for (i = 0; i < args_len; i++) 278 - printk("%02X ", ((u8 *)args)[i]); 278 + printk(KERN_DEBUG "%02X ", ((u8 *)args)[i]); 279 279 for (; i < 8; i++) 280 - printk(" "); 280 + printk(KERN_DEBUG " "); 281 281 for (i = 0; i < sizeof(sdvo_cmd_names) / sizeof(sdvo_cmd_names[0]); i++) { 282 282 if (cmd == sdvo_cmd_names[i].cmd) { 283 - printk("(%s)", sdvo_cmd_names[i].name); 283 + printk(KERN_DEBUG "(%s)", sdvo_cmd_names[i].name); 284 284 break; 285 285 } 286 286 } 287 287 if (i == sizeof(sdvo_cmd_names)/ sizeof(sdvo_cmd_names[0])) 288 - printk("(%02X)",cmd); 289 - printk("\n"); 288 + printk(KERN_DEBUG "(%02X)", cmd); 289 + printk(KERN_DEBUG "\n"); 290 290 } 291 291 #else 292 292 #define intel_sdvo_debug_write(o, c, a, l) ··· 323 323 u8 status) 324 324 { 325 325 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 326 + int i; 326 327 327 - DRM_DEBUG("%s: R: ", SDVO_NAME(sdvo_priv)); 328 + printk(KERN_DEBUG "%s: R: ", SDVO_NAME(sdvo_priv)); 328 329 for (i = 0; i < response_len; i++) 329 - printk("%02X ", ((u8 *)response)[i]); 330 + printk(KERN_DEBUG "%02X ", ((u8 *)response)[i]); 330 331 for (; i < 8; i++) 331 - printk(" "); 332 + printk(KERN_DEBUG " "); 332 333 if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP) 333 - printk("(%s)", cmd_status_names[status]); 334 + printk(KERN_DEBUG "(%s)", cmd_status_names[status]); 334 335 else 335 - printk("(??? %d)", status); 336 - printk("\n"); 336 + printk(KERN_DEBUG "(??? %d)", status); 337 + printk(KERN_DEBUG "\n"); 337 338 } 338 339 #else 339 340 #define intel_sdvo_debug_response(o, r, l, s) ··· 589 588 struct intel_sdvo_preferred_input_timing_args args; 590 589 uint8_t status; 591 590 591 + memset(&args, 0, sizeof(args)); 592 592 args.clock = clock; 593 593 args.width = width; 594 594 args.height = height; 595 + args.interlace = 0; 596 + args.scaled = 0; 595 597 intel_sdvo_write_cmd(output, SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING, 596 598 &args, sizeof(args)); 597 599 status = intel_sdvo_read_response(output, NULL, 0); ··· 687 683 dtd->part1.v_high = (((height >> 8) & 0xf) << 4) | 688 684 ((v_blank_len >> 8) & 0xf); 689 685 690 - dtd->part2.h_sync_off = h_sync_offset; 686 + dtd->part2.h_sync_off = h_sync_offset & 0xff; 691 687 dtd->part2.h_sync_width = h_sync_len & 0xff; 692 688 dtd->part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 | 693 689 (v_sync_len & 0xf); ··· 709 705 static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode, 710 706 struct intel_sdvo_dtd *dtd) 711 707 { 712 - uint16_t width, height; 713 - uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len; 714 - uint16_t h_sync_offset, v_sync_offset; 715 - 716 - width = mode->crtc_hdisplay; 717 - height = mode->crtc_vdisplay; 718 - 719 - /* do some mode translations */ 720 - h_blank_len = mode->crtc_hblank_end - mode->crtc_hblank_start; 721 - h_sync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; 722 - 723 - v_blank_len = mode->crtc_vblank_end - mode->crtc_vblank_start; 724 - v_sync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; 725 - 726 - h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start; 727 - v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start; 728 - 729 708 mode->hdisplay = dtd->part1.h_active; 730 709 mode->hdisplay += ((dtd->part1.h_high >> 4) & 0x0f) << 8; 731 710 mode->hsync_start = mode->hdisplay + dtd->part2.h_sync_off; 732 - mode->hsync_start += (dtd->part2.sync_off_width_high & 0xa0) << 2; 711 + mode->hsync_start += (dtd->part2.sync_off_width_high & 0xc0) << 2; 733 712 mode->hsync_end = mode->hsync_start + dtd->part2.h_sync_width; 734 713 mode->hsync_end += (dtd->part2.sync_off_width_high & 0x30) << 4; 735 714 mode->htotal = mode->hdisplay + dtd->part1.h_blank; ··· 722 735 mode->vdisplay += ((dtd->part1.v_high >> 4) & 0x0f) << 8; 723 736 mode->vsync_start = mode->vdisplay; 724 737 mode->vsync_start += (dtd->part2.v_sync_off_width >> 4) & 0xf; 725 - mode->vsync_start += (dtd->part2.sync_off_width_high & 0x0a) << 2; 738 + mode->vsync_start += (dtd->part2.sync_off_width_high & 0x0c) << 2; 726 739 mode->vsync_start += dtd->part2.v_sync_off_high & 0xc0; 727 740 mode->vsync_end = mode->vsync_start + 728 741 (dtd->part2.v_sync_off_width & 0xf); ··· 732 745 733 746 mode->clock = dtd->part1.clock * 10; 734 747 735 - mode->flags &= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 748 + mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 736 749 if (dtd->part2.dtd_flags & 0x2) 737 750 mode->flags |= DRM_MODE_FLAG_PHSYNC; 738 751 if (dtd->part2.dtd_flags & 0x4) ··· 911 924 SDVO_HBUF_TX_VSYNC); 912 925 } 913 926 927 + static void intel_sdvo_set_tv_format(struct intel_output *output) 928 + { 929 + struct intel_sdvo_priv *sdvo_priv = output->dev_priv; 930 + struct intel_sdvo_tv_format *format, unset; 931 + u8 status; 932 + 933 + format = &sdvo_priv->tv_format; 934 + memset(&unset, 0, sizeof(unset)); 935 + if (memcmp(format, &unset, sizeof(*format))) { 936 + DRM_DEBUG("%s: Choosing default TV format of NTSC-M\n", 937 + SDVO_NAME(sdvo_priv)); 938 + format->ntsc_m = 1; 939 + intel_sdvo_write_cmd(output, SDVO_CMD_SET_TV_FORMAT, format, 940 + sizeof(*format)); 941 + status = intel_sdvo_read_response(output, NULL, 0); 942 + if (status != SDVO_CMD_STATUS_SUCCESS) 943 + DRM_DEBUG("%s: Failed to set TV format\n", 944 + SDVO_NAME(sdvo_priv)); 945 + } 946 + } 947 + 914 948 static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder, 915 949 struct drm_display_mode *mode, 916 950 struct drm_display_mode *adjusted_mode) ··· 976 968 &input_dtd); 977 969 intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd); 978 970 971 + drm_mode_set_crtcinfo(adjusted_mode, 0); 972 + 973 + mode->clock = adjusted_mode->clock; 974 + 975 + adjusted_mode->clock *= 976 + intel_sdvo_get_pixel_multiplier(mode); 979 977 } else { 980 978 return false; 981 979 } ··· 1026 1012 sdvox |= SDVO_AUDIO_ENABLE; 1027 1013 } 1028 1014 1029 - intel_sdvo_get_dtd_from_mode(&input_dtd, mode); 1015 + /* We have tried to get input timing in mode_fixup, and filled into 1016 + adjusted_mode */ 1017 + if (sdvo_priv->is_tv) 1018 + intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode); 1019 + else 1020 + intel_sdvo_get_dtd_from_mode(&input_dtd, mode); 1030 1021 1031 1022 /* If it's a TV, we already set the output timing in mode_fixup. 1032 1023 * Otherwise, the output timing is equal to the input timing. ··· 1045 1026 1046 1027 /* Set the input timing to the screen. Assume always input 0. */ 1047 1028 intel_sdvo_set_target_input(output, true, false); 1029 + 1030 + if (sdvo_priv->is_tv) 1031 + intel_sdvo_set_tv_format(output); 1048 1032 1049 1033 /* We would like to use intel_sdvo_create_preferred_input_timing() to 1050 1034 * provide the device with a timing it can support, if it supports that ··· 1417 1395 intel_sdvo_check_tv_format(struct intel_output *output) 1418 1396 { 1419 1397 struct intel_sdvo_priv *dev_priv = output->dev_priv; 1420 - struct intel_sdvo_tv_format format, unset; 1398 + struct intel_sdvo_tv_format format; 1421 1399 uint8_t status; 1422 1400 1423 1401 intel_sdvo_write_cmd(output, SDVO_CMD_GET_TV_FORMAT, NULL, 0); ··· 1425 1403 if (status != SDVO_CMD_STATUS_SUCCESS) 1426 1404 return; 1427 1405 1428 - memset(&unset, 0, sizeof(unset)); 1429 - if (memcmp(&format, &unset, sizeof(format))) { 1430 - DRM_DEBUG("%s: Choosing default TV format of NTSC-M\n", 1431 - SDVO_NAME(dev_priv)); 1432 - 1433 - format.ntsc_m = true; 1434 - intel_sdvo_write_cmd(output, SDVO_CMD_SET_TV_FORMAT, NULL, 0); 1435 - status = intel_sdvo_read_response(output, NULL, 0); 1436 - } 1406 + memcpy(&dev_priv->tv_format, &format, sizeof(format)); 1437 1407 } 1438 1408 1439 1409 /* ··· 1434 1420 * XXX: all 60Hz refresh? 1435 1421 */ 1436 1422 struct drm_display_mode sdvo_tv_modes[] = { 1437 - { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815680, 321, 384, 416, 1438 - 200, 0, 232, 201, 233, 4196112, 0, 1423 + { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815, 320, 321, 384, 1424 + 416, 0, 200, 201, 232, 233, 0, 1439 1425 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1440 - { DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 6814080, 321, 384, 416, 1441 - 240, 0, 272, 241, 273, 4196112, 0, 1426 + { DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 6814, 320, 321, 384, 1427 + 416, 0, 240, 241, 272, 273, 0, 1442 1428 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1443 - { DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 9910080, 401, 464, 496, 1444 - 300, 0, 332, 301, 333, 4196112, 0, 1429 + { DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 9910, 400, 401, 464, 1430 + 496, 0, 300, 301, 332, 333, 0, 1445 1431 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1446 - { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 16913280, 641, 704, 736, 1447 - 350, 0, 382, 351, 383, 4196112, 0, 1432 + { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 16913, 640, 641, 704, 1433 + 736, 0, 350, 351, 382, 383, 0, 1448 1434 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1449 - { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121280, 641, 704, 736, 1450 - 400, 0, 432, 401, 433, 4196112, 0, 1435 + { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121, 640, 641, 704, 1436 + 736, 0, 400, 401, 432, 433, 0, 1451 1437 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1452 - { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121280, 641, 704, 736, 1453 - 400, 0, 432, 401, 433, 4196112, 0, 1438 + { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 22654, 640, 641, 704, 1439 + 736, 0, 480, 481, 512, 513, 0, 1454 1440 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1455 - { DRM_MODE("704x480", DRM_MODE_TYPE_DRIVER, 24624000, 705, 768, 800, 1456 - 480, 0, 512, 481, 513, 4196112, 0, 1441 + { DRM_MODE("704x480", DRM_MODE_TYPE_DRIVER, 24624, 704, 705, 768, 1442 + 800, 0, 480, 481, 512, 513, 0, 1457 1443 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1458 - { DRM_MODE("704x576", DRM_MODE_TYPE_DRIVER, 29232000, 705, 768, 800, 1459 - 576, 0, 608, 577, 609, 4196112, 0, 1444 + { DRM_MODE("704x576", DRM_MODE_TYPE_DRIVER, 29232, 704, 705, 768, 1445 + 800, 0, 576, 577, 608, 609, 0, 1460 1446 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1461 - { DRM_MODE("720x350", DRM_MODE_TYPE_DRIVER, 18751680, 721, 784, 816, 1462 - 350, 0, 382, 351, 383, 4196112, 0, 1447 + { DRM_MODE("720x350", DRM_MODE_TYPE_DRIVER, 18751, 720, 721, 784, 1448 + 816, 0, 350, 351, 382, 383, 0, 1463 1449 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1464 - { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 21199680, 721, 784, 816, 1465 - 400, 0, 432, 401, 433, 4196112, 0, 1450 + { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 21199, 720, 721, 784, 1451 + 816, 0, 400, 401, 432, 433, 0, 1466 1452 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1467 - { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 25116480, 721, 784, 816, 1468 - 480, 0, 512, 481, 513, 4196112, 0, 1453 + { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 25116, 720, 721, 784, 1454 + 816, 0, 480, 481, 512, 513, 0, 1469 1455 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1470 - { DRM_MODE("720x540", DRM_MODE_TYPE_DRIVER, 28054080, 721, 784, 816, 1471 - 540, 0, 572, 541, 573, 4196112, 0, 1456 + { DRM_MODE("720x540", DRM_MODE_TYPE_DRIVER, 28054, 720, 721, 784, 1457 + 816, 0, 540, 541, 572, 573, 0, 1472 1458 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1473 - { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 29816640, 721, 784, 816, 1474 - 576, 0, 608, 577, 609, 4196112, 0, 1459 + { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 29816, 720, 721, 784, 1460 + 816, 0, 576, 577, 608, 609, 0, 1475 1461 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1476 - { DRM_MODE("768x576", DRM_MODE_TYPE_DRIVER, 31570560, 769, 832, 864, 1477 - 576, 0, 608, 577, 609, 4196112, 0, 1462 + { DRM_MODE("768x576", DRM_MODE_TYPE_DRIVER, 31570, 768, 769, 832, 1463 + 864, 0, 576, 577, 608, 609, 0, 1478 1464 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1479 - { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 34030080, 801, 864, 896, 1480 - 600, 0, 632, 601, 633, 4196112, 0, 1465 + { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 34030, 800, 801, 864, 1466 + 896, 0, 600, 601, 632, 633, 0, 1481 1467 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1482 - { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 36581760, 833, 896, 928, 1483 - 624, 0, 656, 625, 657, 4196112, 0, 1468 + { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 36581, 832, 833, 896, 1469 + 928, 0, 624, 625, 656, 657, 0, 1484 1470 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1485 - { DRM_MODE("920x766", DRM_MODE_TYPE_DRIVER, 48707040, 921, 984, 1016, 1486 - 766, 0, 798, 767, 799, 4196112, 0, 1471 + { DRM_MODE("920x766", DRM_MODE_TYPE_DRIVER, 48707, 920, 921, 984, 1472 + 1016, 0, 766, 767, 798, 799, 0, 1487 1473 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1488 - { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 53827200, 1025, 1088, 1120, 1489 - 768, 0, 800, 769, 801, 4196112, 0, 1474 + { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 53827, 1024, 1025, 1088, 1475 + 1120, 0, 768, 769, 800, 801, 0, 1490 1476 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1491 - { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 87265920, 1281, 1344, 1376, 1492 - 1024, 0, 1056, 1025, 1057, 4196112, 0, 1477 + { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 87265, 1280, 1281, 1344, 1478 + 1376, 0, 1024, 1025, 1056, 1057, 0, 1493 1479 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1494 1480 }; 1495 1481 1496 1482 static void intel_sdvo_get_tv_modes(struct drm_connector *connector) 1497 1483 { 1498 1484 struct intel_output *output = to_intel_output(connector); 1485 + struct intel_sdvo_priv *sdvo_priv = output->dev_priv; 1486 + struct intel_sdvo_sdtv_resolution_request tv_res; 1499 1487 uint32_t reply = 0; 1500 1488 uint8_t status; 1501 1489 int i = 0; ··· 1507 1491 /* Read the list of supported input resolutions for the selected TV 1508 1492 * format. 1509 1493 */ 1494 + memset(&tv_res, 0, sizeof(tv_res)); 1495 + memcpy(&tv_res, &sdvo_priv->tv_format, sizeof(tv_res)); 1510 1496 intel_sdvo_write_cmd(output, SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT, 1511 - NULL, 0); 1497 + &tv_res, sizeof(tv_res)); 1512 1498 status = intel_sdvo_read_response(output, &reply, 3); 1513 1499 if (status != SDVO_CMD_STATUS_SUCCESS) 1514 1500 return; 1515 1501 1516 1502 for (i = 0; i < ARRAY_SIZE(sdvo_tv_modes); i++) 1517 - if (reply & (1 << i)) 1518 - drm_mode_probed_add(connector, &sdvo_tv_modes[i]); 1503 + if (reply & (1 << i)) { 1504 + struct drm_display_mode *nmode; 1505 + nmode = drm_mode_duplicate(connector->dev, 1506 + &sdvo_tv_modes[i]); 1507 + if (nmode) 1508 + drm_mode_probed_add(connector, nmode); 1509 + } 1519 1510 } 1520 1511 1521 1512 static int intel_sdvo_get_modes(struct drm_connector *connector)
+3
drivers/gpu/drm/i915/intel_sdvo_regs.h
··· 100 100 u16 clock; 101 101 u16 width; 102 102 u16 height; 103 + u8 interlace:1; 104 + u8 scaled:1; 105 + u8 pad:6; 103 106 } __attribute__((packed)); 104 107 105 108 /* I2C registers for SDVO */
+23 -7
drivers/gpu/drm/i915/intel_tv.c
··· 1570 1570 struct drm_device *dev = connector->dev; 1571 1571 struct intel_output *intel_output = to_intel_output(connector); 1572 1572 struct intel_tv_priv *tv_priv = intel_output->dev_priv; 1573 + struct drm_encoder *encoder = &intel_output->enc; 1574 + struct drm_crtc *crtc = encoder->crtc; 1573 1575 int ret = 0; 1576 + bool changed = false; 1574 1577 1575 1578 ret = drm_connector_property_set_value(connector, property, val); 1576 1579 if (ret < 0) 1577 1580 goto out; 1578 1581 1579 - if (property == dev->mode_config.tv_left_margin_property) 1582 + if (property == dev->mode_config.tv_left_margin_property && 1583 + tv_priv->margin[TV_MARGIN_LEFT] != val) { 1580 1584 tv_priv->margin[TV_MARGIN_LEFT] = val; 1581 - else if (property == dev->mode_config.tv_right_margin_property) 1585 + changed = true; 1586 + } else if (property == dev->mode_config.tv_right_margin_property && 1587 + tv_priv->margin[TV_MARGIN_RIGHT] != val) { 1582 1588 tv_priv->margin[TV_MARGIN_RIGHT] = val; 1583 - else if (property == dev->mode_config.tv_top_margin_property) 1589 + changed = true; 1590 + } else if (property == dev->mode_config.tv_top_margin_property && 1591 + tv_priv->margin[TV_MARGIN_TOP] != val) { 1584 1592 tv_priv->margin[TV_MARGIN_TOP] = val; 1585 - else if (property == dev->mode_config.tv_bottom_margin_property) 1593 + changed = true; 1594 + } else if (property == dev->mode_config.tv_bottom_margin_property && 1595 + tv_priv->margin[TV_MARGIN_BOTTOM] != val) { 1586 1596 tv_priv->margin[TV_MARGIN_BOTTOM] = val; 1587 - else if (property == dev->mode_config.tv_mode_property) { 1597 + changed = true; 1598 + } else if (property == dev->mode_config.tv_mode_property) { 1588 1599 if (val >= NUM_TV_MODES) { 1589 1600 ret = -EINVAL; 1590 1601 goto out; 1591 1602 } 1603 + if (!strcmp(tv_priv->tv_format, tv_modes[val].name)) 1604 + goto out; 1605 + 1592 1606 tv_priv->tv_format = tv_modes[val].name; 1593 - intel_tv_mode_set(&intel_output->enc, NULL, NULL); 1607 + changed = true; 1594 1608 } else { 1595 1609 ret = -EINVAL; 1596 1610 goto out; 1597 1611 } 1598 1612 1599 - intel_tv_mode_set(&intel_output->enc, NULL, NULL); 1613 + if (changed && crtc) 1614 + drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, 1615 + crtc->y, crtc->fb); 1600 1616 out: 1601 1617 return ret; 1602 1618 }