diff options
-rw-r--r-- | drivers/gpu/drm/drm_drv.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 109 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 54 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/dce6_afmt.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_hdmi.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_uvd.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/uvd_v1_0.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 2 | ||||
-rw-r--r-- | include/uapi/drm/drm_mode.h | 2 |
22 files changed, 207 insertions, 72 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index e572dd20bdee..05ad9ba0a67e 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
@@ -402,9 +402,16 @@ long drm_ioctl(struct file *filp, | |||
402 | cmd = ioctl->cmd_drv; | 402 | cmd = ioctl->cmd_drv; |
403 | } | 403 | } |
404 | else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) { | 404 | else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) { |
405 | u32 drv_size; | ||
406 | |||
405 | ioctl = &drm_ioctls[nr]; | 407 | ioctl = &drm_ioctls[nr]; |
406 | cmd = ioctl->cmd; | 408 | |
409 | drv_size = _IOC_SIZE(ioctl->cmd); | ||
407 | usize = asize = _IOC_SIZE(cmd); | 410 | usize = asize = _IOC_SIZE(cmd); |
411 | if (drv_size > asize) | ||
412 | asize = drv_size; | ||
413 | |||
414 | cmd = ioctl->cmd; | ||
408 | } else | 415 | } else |
409 | goto err_i1; | 416 | goto err_i1; |
410 | 417 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 69d8ed5416c3..2ad27880cd04 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -505,6 +505,8 @@ static int i915_drm_freeze(struct drm_device *dev) | |||
505 | intel_modeset_suspend_hw(dev); | 505 | intel_modeset_suspend_hw(dev); |
506 | } | 506 | } |
507 | 507 | ||
508 | i915_gem_suspend_gtt_mappings(dev); | ||
509 | |||
508 | i915_save_state(dev); | 510 | i915_save_state(dev); |
509 | 511 | ||
510 | intel_opregion_fini(dev); | 512 | intel_opregion_fini(dev); |
@@ -648,7 +650,8 @@ static int i915_drm_thaw(struct drm_device *dev) | |||
648 | mutex_lock(&dev->struct_mutex); | 650 | mutex_lock(&dev->struct_mutex); |
649 | i915_gem_restore_gtt_mappings(dev); | 651 | i915_gem_restore_gtt_mappings(dev); |
650 | mutex_unlock(&dev->struct_mutex); | 652 | mutex_unlock(&dev->struct_mutex); |
651 | } | 653 | } else if (drm_core_check_feature(dev, DRIVER_MODESET)) |
654 | i915_check_and_clear_faults(dev); | ||
652 | 655 | ||
653 | __i915_drm_thaw(dev); | 656 | __i915_drm_thaw(dev); |
654 | 657 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 35874b3a86dc..ab0f2c0a440c 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -497,10 +497,12 @@ struct i915_address_space { | |||
497 | 497 | ||
498 | /* FIXME: Need a more generic return type */ | 498 | /* FIXME: Need a more generic return type */ |
499 | gen6_gtt_pte_t (*pte_encode)(dma_addr_t addr, | 499 | gen6_gtt_pte_t (*pte_encode)(dma_addr_t addr, |
500 | enum i915_cache_level level); | 500 | enum i915_cache_level level, |
501 | bool valid); /* Create a valid PTE */ | ||
501 | void (*clear_range)(struct i915_address_space *vm, | 502 | void (*clear_range)(struct i915_address_space *vm, |
502 | unsigned int first_entry, | 503 | unsigned int first_entry, |
503 | unsigned int num_entries); | 504 | unsigned int num_entries, |
505 | bool use_scratch); | ||
504 | void (*insert_entries)(struct i915_address_space *vm, | 506 | void (*insert_entries)(struct i915_address_space *vm, |
505 | struct sg_table *st, | 507 | struct sg_table *st, |
506 | unsigned int first_entry, | 508 | unsigned int first_entry, |
@@ -2065,6 +2067,8 @@ void i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt, | |||
2065 | void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt, | 2067 | void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt, |
2066 | struct drm_i915_gem_object *obj); | 2068 | struct drm_i915_gem_object *obj); |
2067 | 2069 | ||
2070 | void i915_check_and_clear_faults(struct drm_device *dev); | ||
2071 | void i915_gem_suspend_gtt_mappings(struct drm_device *dev); | ||
2068 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); | 2072 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); |
2069 | int __must_check i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj); | 2073 | int __must_check i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj); |
2070 | void i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj, | 2074 | void i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj, |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 212f6d8c35ec..1f7b4caefb6e 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -58,9 +58,10 @@ | |||
58 | #define HSW_WT_ELLC_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0x6) | 58 | #define HSW_WT_ELLC_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0x6) |
59 | 59 | ||
60 | static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, | 60 | static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, |
61 | enum i915_cache_level level) | 61 | enum i915_cache_level level, |
62 | bool valid) | ||
62 | { | 63 | { |
63 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 64 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
64 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 65 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
65 | 66 | ||
66 | switch (level) { | 67 | switch (level) { |
@@ -79,9 +80,10 @@ static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, | |||
79 | } | 80 | } |
80 | 81 | ||
81 | static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, | 82 | static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, |
82 | enum i915_cache_level level) | 83 | enum i915_cache_level level, |
84 | bool valid) | ||
83 | { | 85 | { |
84 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 86 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
85 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 87 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
86 | 88 | ||
87 | switch (level) { | 89 | switch (level) { |
@@ -105,9 +107,10 @@ static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, | |||
105 | #define BYT_PTE_SNOOPED_BY_CPU_CACHES (1 << 2) | 107 | #define BYT_PTE_SNOOPED_BY_CPU_CACHES (1 << 2) |
106 | 108 | ||
107 | static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, | 109 | static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, |
108 | enum i915_cache_level level) | 110 | enum i915_cache_level level, |
111 | bool valid) | ||
109 | { | 112 | { |
110 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 113 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
111 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 114 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
112 | 115 | ||
113 | /* Mark the page as writeable. Other platforms don't have a | 116 | /* Mark the page as writeable. Other platforms don't have a |
@@ -122,9 +125,10 @@ static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, | |||
122 | } | 125 | } |
123 | 126 | ||
124 | static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, | 127 | static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, |
125 | enum i915_cache_level level) | 128 | enum i915_cache_level level, |
129 | bool valid) | ||
126 | { | 130 | { |
127 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 131 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
128 | pte |= HSW_PTE_ADDR_ENCODE(addr); | 132 | pte |= HSW_PTE_ADDR_ENCODE(addr); |
129 | 133 | ||
130 | if (level != I915_CACHE_NONE) | 134 | if (level != I915_CACHE_NONE) |
@@ -134,9 +138,10 @@ static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, | |||
134 | } | 138 | } |
135 | 139 | ||
136 | static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr, | 140 | static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr, |
137 | enum i915_cache_level level) | 141 | enum i915_cache_level level, |
142 | bool valid) | ||
138 | { | 143 | { |
139 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 144 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
140 | pte |= HSW_PTE_ADDR_ENCODE(addr); | 145 | pte |= HSW_PTE_ADDR_ENCODE(addr); |
141 | 146 | ||
142 | switch (level) { | 147 | switch (level) { |
@@ -236,7 +241,8 @@ static int gen6_ppgtt_enable(struct drm_device *dev) | |||
236 | /* PPGTT support for Sandybdrige/Gen6 and later */ | 241 | /* PPGTT support for Sandybdrige/Gen6 and later */ |
237 | static void gen6_ppgtt_clear_range(struct i915_address_space *vm, | 242 | static void gen6_ppgtt_clear_range(struct i915_address_space *vm, |
238 | unsigned first_entry, | 243 | unsigned first_entry, |
239 | unsigned num_entries) | 244 | unsigned num_entries, |
245 | bool use_scratch) | ||
240 | { | 246 | { |
241 | struct i915_hw_ppgtt *ppgtt = | 247 | struct i915_hw_ppgtt *ppgtt = |
242 | container_of(vm, struct i915_hw_ppgtt, base); | 248 | container_of(vm, struct i915_hw_ppgtt, base); |
@@ -245,7 +251,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm, | |||
245 | unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES; | 251 | unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES; |
246 | unsigned last_pte, i; | 252 | unsigned last_pte, i; |
247 | 253 | ||
248 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC); | 254 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true); |
249 | 255 | ||
250 | while (num_entries) { | 256 | while (num_entries) { |
251 | last_pte = first_pte + num_entries; | 257 | last_pte = first_pte + num_entries; |
@@ -282,7 +288,7 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm, | |||
282 | dma_addr_t page_addr; | 288 | dma_addr_t page_addr; |
283 | 289 | ||
284 | page_addr = sg_page_iter_dma_address(&sg_iter); | 290 | page_addr = sg_page_iter_dma_address(&sg_iter); |
285 | pt_vaddr[act_pte] = vm->pte_encode(page_addr, cache_level); | 291 | pt_vaddr[act_pte] = vm->pte_encode(page_addr, cache_level, true); |
286 | if (++act_pte == I915_PPGTT_PT_ENTRIES) { | 292 | if (++act_pte == I915_PPGTT_PT_ENTRIES) { |
287 | kunmap_atomic(pt_vaddr); | 293 | kunmap_atomic(pt_vaddr); |
288 | act_pt++; | 294 | act_pt++; |
@@ -367,7 +373,7 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt) | |||
367 | } | 373 | } |
368 | 374 | ||
369 | ppgtt->base.clear_range(&ppgtt->base, 0, | 375 | ppgtt->base.clear_range(&ppgtt->base, 0, |
370 | ppgtt->num_pd_entries * I915_PPGTT_PT_ENTRIES); | 376 | ppgtt->num_pd_entries * I915_PPGTT_PT_ENTRIES, true); |
371 | 377 | ||
372 | ppgtt->pd_offset = first_pd_entry_in_global_pt * sizeof(gen6_gtt_pte_t); | 378 | ppgtt->pd_offset = first_pd_entry_in_global_pt * sizeof(gen6_gtt_pte_t); |
373 | 379 | ||
@@ -444,7 +450,8 @@ void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt, | |||
444 | { | 450 | { |
445 | ppgtt->base.clear_range(&ppgtt->base, | 451 | ppgtt->base.clear_range(&ppgtt->base, |
446 | i915_gem_obj_ggtt_offset(obj) >> PAGE_SHIFT, | 452 | i915_gem_obj_ggtt_offset(obj) >> PAGE_SHIFT, |
447 | obj->base.size >> PAGE_SHIFT); | 453 | obj->base.size >> PAGE_SHIFT, |
454 | true); | ||
448 | } | 455 | } |
449 | 456 | ||
450 | extern int intel_iommu_gfx_mapped; | 457 | extern int intel_iommu_gfx_mapped; |
@@ -485,15 +492,65 @@ static void undo_idling(struct drm_i915_private *dev_priv, bool interruptible) | |||
485 | dev_priv->mm.interruptible = interruptible; | 492 | dev_priv->mm.interruptible = interruptible; |
486 | } | 493 | } |
487 | 494 | ||
495 | void i915_check_and_clear_faults(struct drm_device *dev) | ||
496 | { | ||
497 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
498 | struct intel_ring_buffer *ring; | ||
499 | int i; | ||
500 | |||
501 | if (INTEL_INFO(dev)->gen < 6) | ||
502 | return; | ||
503 | |||
504 | for_each_ring(ring, dev_priv, i) { | ||
505 | u32 fault_reg; | ||
506 | fault_reg = I915_READ(RING_FAULT_REG(ring)); | ||
507 | if (fault_reg & RING_FAULT_VALID) { | ||
508 | DRM_DEBUG_DRIVER("Unexpected fault\n" | ||
509 | "\tAddr: 0x%08lx\\n" | ||
510 | "\tAddress space: %s\n" | ||
511 | "\tSource ID: %d\n" | ||
512 | "\tType: %d\n", | ||
513 | fault_reg & PAGE_MASK, | ||
514 | fault_reg & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT", | ||
515 | RING_FAULT_SRCID(fault_reg), | ||
516 | RING_FAULT_FAULT_TYPE(fault_reg)); | ||
517 | I915_WRITE(RING_FAULT_REG(ring), | ||
518 | fault_reg & ~RING_FAULT_VALID); | ||
519 | } | ||
520 | } | ||
521 | POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS])); | ||
522 | } | ||
523 | |||
524 | void i915_gem_suspend_gtt_mappings(struct drm_device *dev) | ||
525 | { | ||
526 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
527 | |||
528 | /* Don't bother messing with faults pre GEN6 as we have little | ||
529 | * documentation supporting that it's a good idea. | ||
530 | */ | ||
531 | if (INTEL_INFO(dev)->gen < 6) | ||
532 | return; | ||
533 | |||
534 | i915_check_and_clear_faults(dev); | ||
535 | |||
536 | dev_priv->gtt.base.clear_range(&dev_priv->gtt.base, | ||
537 | dev_priv->gtt.base.start / PAGE_SIZE, | ||
538 | dev_priv->gtt.base.total / PAGE_SIZE, | ||
539 | false); | ||
540 | } | ||
541 | |||
488 | void i915_gem_restore_gtt_mappings(struct drm_device *dev) | 542 | void i915_gem_restore_gtt_mappings(struct drm_device *dev) |
489 | { | 543 | { |
490 | struct drm_i915_private *dev_priv = dev->dev_private; | 544 | struct drm_i915_private *dev_priv = dev->dev_private; |
491 | struct drm_i915_gem_object *obj; | 545 | struct drm_i915_gem_object *obj; |
492 | 546 | ||
547 | i915_check_and_clear_faults(dev); | ||
548 | |||
493 | /* First fill our portion of the GTT with scratch pages */ | 549 | /* First fill our portion of the GTT with scratch pages */ |
494 | dev_priv->gtt.base.clear_range(&dev_priv->gtt.base, | 550 | dev_priv->gtt.base.clear_range(&dev_priv->gtt.base, |
495 | dev_priv->gtt.base.start / PAGE_SIZE, | 551 | dev_priv->gtt.base.start / PAGE_SIZE, |
496 | dev_priv->gtt.base.total / PAGE_SIZE); | 552 | dev_priv->gtt.base.total / PAGE_SIZE, |
553 | true); | ||
497 | 554 | ||
498 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { | 555 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { |
499 | i915_gem_clflush_object(obj, obj->pin_display); | 556 | i915_gem_clflush_object(obj, obj->pin_display); |
@@ -536,7 +593,7 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm, | |||
536 | 593 | ||
537 | for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { | 594 | for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { |
538 | addr = sg_page_iter_dma_address(&sg_iter); | 595 | addr = sg_page_iter_dma_address(&sg_iter); |
539 | iowrite32(vm->pte_encode(addr, level), >t_entries[i]); | 596 | iowrite32(vm->pte_encode(addr, level, true), >t_entries[i]); |
540 | i++; | 597 | i++; |
541 | } | 598 | } |
542 | 599 | ||
@@ -548,7 +605,7 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm, | |||
548 | */ | 605 | */ |
549 | if (i != 0) | 606 | if (i != 0) |
550 | WARN_ON(readl(>t_entries[i-1]) != | 607 | WARN_ON(readl(>t_entries[i-1]) != |
551 | vm->pte_encode(addr, level)); | 608 | vm->pte_encode(addr, level, true)); |
552 | 609 | ||
553 | /* This next bit makes the above posting read even more important. We | 610 | /* This next bit makes the above posting read even more important. We |
554 | * want to flush the TLBs only after we're certain all the PTE updates | 611 | * want to flush the TLBs only after we're certain all the PTE updates |
@@ -560,7 +617,8 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm, | |||
560 | 617 | ||
561 | static void gen6_ggtt_clear_range(struct i915_address_space *vm, | 618 | static void gen6_ggtt_clear_range(struct i915_address_space *vm, |
562 | unsigned int first_entry, | 619 | unsigned int first_entry, |
563 | unsigned int num_entries) | 620 | unsigned int num_entries, |
621 | bool use_scratch) | ||
564 | { | 622 | { |
565 | struct drm_i915_private *dev_priv = vm->dev->dev_private; | 623 | struct drm_i915_private *dev_priv = vm->dev->dev_private; |
566 | gen6_gtt_pte_t scratch_pte, __iomem *gtt_base = | 624 | gen6_gtt_pte_t scratch_pte, __iomem *gtt_base = |
@@ -573,7 +631,8 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm, | |||
573 | first_entry, num_entries, max_entries)) | 631 | first_entry, num_entries, max_entries)) |
574 | num_entries = max_entries; | 632 | num_entries = max_entries; |
575 | 633 | ||
576 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC); | 634 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, use_scratch); |
635 | |||
577 | for (i = 0; i < num_entries; i++) | 636 | for (i = 0; i < num_entries; i++) |
578 | iowrite32(scratch_pte, >t_base[i]); | 637 | iowrite32(scratch_pte, >t_base[i]); |
579 | readl(gtt_base); | 638 | readl(gtt_base); |
@@ -594,7 +653,8 @@ static void i915_ggtt_insert_entries(struct i915_address_space *vm, | |||
594 | 653 | ||
595 | static void i915_ggtt_clear_range(struct i915_address_space *vm, | 654 | static void i915_ggtt_clear_range(struct i915_address_space *vm, |
596 | unsigned int first_entry, | 655 | unsigned int first_entry, |
597 | unsigned int num_entries) | 656 | unsigned int num_entries, |
657 | bool unused) | ||
598 | { | 658 | { |
599 | intel_gtt_clear_range(first_entry, num_entries); | 659 | intel_gtt_clear_range(first_entry, num_entries); |
600 | } | 660 | } |
@@ -622,7 +682,8 @@ void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj) | |||
622 | 682 | ||
623 | dev_priv->gtt.base.clear_range(&dev_priv->gtt.base, | 683 | dev_priv->gtt.base.clear_range(&dev_priv->gtt.base, |
624 | entry, | 684 | entry, |
625 | obj->base.size >> PAGE_SHIFT); | 685 | obj->base.size >> PAGE_SHIFT, |
686 | true); | ||
626 | 687 | ||
627 | obj->has_global_gtt_mapping = 0; | 688 | obj->has_global_gtt_mapping = 0; |
628 | } | 689 | } |
@@ -709,11 +770,11 @@ void i915_gem_setup_global_gtt(struct drm_device *dev, | |||
709 | const unsigned long count = (hole_end - hole_start) / PAGE_SIZE; | 770 | const unsigned long count = (hole_end - hole_start) / PAGE_SIZE; |
710 | DRM_DEBUG_KMS("clearing unused GTT space: [%lx, %lx]\n", | 771 | DRM_DEBUG_KMS("clearing unused GTT space: [%lx, %lx]\n", |
711 | hole_start, hole_end); | 772 | hole_start, hole_end); |
712 | ggtt_vm->clear_range(ggtt_vm, hole_start / PAGE_SIZE, count); | 773 | ggtt_vm->clear_range(ggtt_vm, hole_start / PAGE_SIZE, count, true); |
713 | } | 774 | } |
714 | 775 | ||
715 | /* And finally clear the reserved guard page */ | 776 | /* And finally clear the reserved guard page */ |
716 | ggtt_vm->clear_range(ggtt_vm, end / PAGE_SIZE - 1, 1); | 777 | ggtt_vm->clear_range(ggtt_vm, end / PAGE_SIZE - 1, 1, true); |
717 | } | 778 | } |
718 | 779 | ||
719 | static bool | 780 | static bool |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 38f96f65d87a..ef9b35479f01 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -604,6 +604,10 @@ | |||
604 | #define ARB_MODE_SWIZZLE_IVB (1<<5) | 604 | #define ARB_MODE_SWIZZLE_IVB (1<<5) |
605 | #define RENDER_HWS_PGA_GEN7 (0x04080) | 605 | #define RENDER_HWS_PGA_GEN7 (0x04080) |
606 | #define RING_FAULT_REG(ring) (0x4094 + 0x100*(ring)->id) | 606 | #define RING_FAULT_REG(ring) (0x4094 + 0x100*(ring)->id) |
607 | #define RING_FAULT_GTTSEL_MASK (1<<11) | ||
608 | #define RING_FAULT_SRCID(x) ((x >> 3) & 0xff) | ||
609 | #define RING_FAULT_FAULT_TYPE(x) ((x >> 1) & 0x3) | ||
610 | #define RING_FAULT_VALID (1<<0) | ||
607 | #define DONE_REG 0x40b0 | 611 | #define DONE_REG 0x40b0 |
608 | #define BSD_HWS_PGA_GEN7 (0x04180) | 612 | #define BSD_HWS_PGA_GEN7 (0x04180) |
609 | #define BLT_HWS_PGA_GEN7 (0x04280) | 613 | #define BLT_HWS_PGA_GEN7 (0x04280) |
@@ -4279,7 +4283,9 @@ | |||
4279 | #define FDI_RX_CHICKEN(pipe) _PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN) | 4283 | #define FDI_RX_CHICKEN(pipe) _PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN) |
4280 | 4284 | ||
4281 | #define SOUTH_DSPCLK_GATE_D 0xc2020 | 4285 | #define SOUTH_DSPCLK_GATE_D 0xc2020 |
4286 | #define PCH_DPLUNIT_CLOCK_GATE_DISABLE (1<<30) | ||
4282 | #define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29) | 4287 | #define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29) |
4288 | #define PCH_CPUNIT_CLOCK_GATE_DISABLE (1<<14) | ||
4283 | #define PCH_LP_PARTITION_LEVEL_DISABLE (1<<12) | 4289 | #define PCH_LP_PARTITION_LEVEL_DISABLE (1<<12) |
4284 | 4290 | ||
4285 | /* CPU: FDI_TX */ | 4291 | /* CPU: FDI_TX */ |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index f4c5e95b2d6f..26c2ea3e985c 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -4759,7 +4759,9 @@ static void cpt_init_clock_gating(struct drm_device *dev) | |||
4759 | * gating for the panel power sequencer or it will fail to | 4759 | * gating for the panel power sequencer or it will fail to |
4760 | * start up when no ports are active. | 4760 | * start up when no ports are active. |
4761 | */ | 4761 | */ |
4762 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | 4762 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE | |
4763 | PCH_DPLUNIT_CLOCK_GATE_DISABLE | | ||
4764 | PCH_CPUNIT_CLOCK_GATE_DISABLE); | ||
4763 | I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) | | 4765 | I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) | |
4764 | DPLS_EDP_PPS_FIX_DIS); | 4766 | DPLS_EDP_PPS_FIX_DIS); |
4765 | /* The below fixes the weird display corruption, a few pixels shifted | 4767 | /* The below fixes the weird display corruption, a few pixels shifted |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 32923d2f6002..5e891b226acf 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -707,24 +707,37 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
707 | switch (connector->connector_type) { | 707 | switch (connector->connector_type) { |
708 | case DRM_MODE_CONNECTOR_DVII: | 708 | case DRM_MODE_CONNECTOR_DVII: |
709 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | 709 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ |
710 | if ((radeon_connector->audio == RADEON_AUDIO_ENABLE) || | 710 | if (radeon_audio != 0) { |
711 | (drm_detect_hdmi_monitor(radeon_connector->edid) && | 711 | if (radeon_connector->use_digital && |
712 | (radeon_connector->audio == RADEON_AUDIO_AUTO))) | 712 | (radeon_connector->audio == RADEON_AUDIO_ENABLE)) |
713 | return ATOM_ENCODER_MODE_HDMI; | 713 | return ATOM_ENCODER_MODE_HDMI; |
714 | else if (radeon_connector->use_digital) | 714 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
715 | (radeon_connector->audio == RADEON_AUDIO_AUTO)) | ||
716 | return ATOM_ENCODER_MODE_HDMI; | ||
717 | else if (radeon_connector->use_digital) | ||
718 | return ATOM_ENCODER_MODE_DVI; | ||
719 | else | ||
720 | return ATOM_ENCODER_MODE_CRT; | ||
721 | } else if (radeon_connector->use_digital) { | ||
715 | return ATOM_ENCODER_MODE_DVI; | 722 | return ATOM_ENCODER_MODE_DVI; |
716 | else | 723 | } else { |
717 | return ATOM_ENCODER_MODE_CRT; | 724 | return ATOM_ENCODER_MODE_CRT; |
725 | } | ||
718 | break; | 726 | break; |
719 | case DRM_MODE_CONNECTOR_DVID: | 727 | case DRM_MODE_CONNECTOR_DVID: |
720 | case DRM_MODE_CONNECTOR_HDMIA: | 728 | case DRM_MODE_CONNECTOR_HDMIA: |
721 | default: | 729 | default: |
722 | if ((radeon_connector->audio == RADEON_AUDIO_ENABLE) || | 730 | if (radeon_audio != 0) { |
723 | (drm_detect_hdmi_monitor(radeon_connector->edid) && | 731 | if (radeon_connector->audio == RADEON_AUDIO_ENABLE) |
724 | (radeon_connector->audio == RADEON_AUDIO_AUTO))) | 732 | return ATOM_ENCODER_MODE_HDMI; |
725 | return ATOM_ENCODER_MODE_HDMI; | 733 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
726 | else | 734 | (radeon_connector->audio == RADEON_AUDIO_AUTO)) |
735 | return ATOM_ENCODER_MODE_HDMI; | ||
736 | else | ||
737 | return ATOM_ENCODER_MODE_DVI; | ||
738 | } else { | ||
727 | return ATOM_ENCODER_MODE_DVI; | 739 | return ATOM_ENCODER_MODE_DVI; |
740 | } | ||
728 | break; | 741 | break; |
729 | case DRM_MODE_CONNECTOR_LVDS: | 742 | case DRM_MODE_CONNECTOR_LVDS: |
730 | return ATOM_ENCODER_MODE_LVDS; | 743 | return ATOM_ENCODER_MODE_LVDS; |
@@ -732,14 +745,19 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
732 | case DRM_MODE_CONNECTOR_DisplayPort: | 745 | case DRM_MODE_CONNECTOR_DisplayPort: |
733 | dig_connector = radeon_connector->con_priv; | 746 | dig_connector = radeon_connector->con_priv; |
734 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | 747 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
735 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | 748 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
736 | return ATOM_ENCODER_MODE_DP; | 749 | return ATOM_ENCODER_MODE_DP; |
737 | else if ((radeon_connector->audio == RADEON_AUDIO_ENABLE) || | 750 | } else if (radeon_audio != 0) { |
738 | (drm_detect_hdmi_monitor(radeon_connector->edid) && | 751 | if (radeon_connector->audio == RADEON_AUDIO_ENABLE) |
739 | (radeon_connector->audio == RADEON_AUDIO_AUTO))) | 752 | return ATOM_ENCODER_MODE_HDMI; |
740 | return ATOM_ENCODER_MODE_HDMI; | 753 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
741 | else | 754 | (radeon_connector->audio == RADEON_AUDIO_AUTO)) |
755 | return ATOM_ENCODER_MODE_HDMI; | ||
756 | else | ||
757 | return ATOM_ENCODER_MODE_DVI; | ||
758 | } else { | ||
742 | return ATOM_ENCODER_MODE_DVI; | 759 | return ATOM_ENCODER_MODE_DVI; |
760 | } | ||
743 | break; | 761 | break; |
744 | case DRM_MODE_CONNECTOR_eDP: | 762 | case DRM_MODE_CONNECTOR_eDP: |
745 | return ATOM_ENCODER_MODE_DP; | 763 | return ATOM_ENCODER_MODE_DP; |
@@ -1655,7 +1673,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
1655 | * does the same thing and more. | 1673 | * does the same thing and more. |
1656 | */ | 1674 | */ |
1657 | if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730) && | 1675 | if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730) && |
1658 | (rdev->family != CHIP_RS880)) | 1676 | (rdev->family != CHIP_RS780) && (rdev->family != CHIP_RS880)) |
1659 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1677 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
1660 | } | 1678 | } |
1661 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | 1679 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index b874ccdf52f7..9cd2bc989ac7 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -1694,6 +1694,7 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1694 | fw_name); | 1694 | fw_name); |
1695 | release_firmware(rdev->smc_fw); | 1695 | release_firmware(rdev->smc_fw); |
1696 | rdev->smc_fw = NULL; | 1696 | rdev->smc_fw = NULL; |
1697 | err = 0; | ||
1697 | } else if (rdev->smc_fw->size != smc_req_size) { | 1698 | } else if (rdev->smc_fw->size != smc_req_size) { |
1698 | printk(KERN_ERR | 1699 | printk(KERN_ERR |
1699 | "cik_smc: Bogus length %zu in firmware \"%s\"\n", | 1700 | "cik_smc: Bogus length %zu in firmware \"%s\"\n", |
@@ -3182,6 +3183,7 @@ int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
3182 | r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); | 3183 | r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); |
3183 | if (r) { | 3184 | if (r) { |
3184 | DRM_ERROR("radeon: failed to get ib (%d).\n", r); | 3185 | DRM_ERROR("radeon: failed to get ib (%d).\n", r); |
3186 | radeon_scratch_free(rdev, scratch); | ||
3185 | return r; | 3187 | return r; |
3186 | } | 3188 | } |
3187 | ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); | 3189 | ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); |
@@ -3198,6 +3200,8 @@ int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
3198 | r = radeon_fence_wait(ib.fence, false); | 3200 | r = radeon_fence_wait(ib.fence, false); |
3199 | if (r) { | 3201 | if (r) { |
3200 | DRM_ERROR("radeon: fence wait failed (%d).\n", r); | 3202 | DRM_ERROR("radeon: fence wait failed (%d).\n", r); |
3203 | radeon_scratch_free(rdev, scratch); | ||
3204 | radeon_ib_free(rdev, &ib); | ||
3201 | return r; | 3205 | return r; |
3202 | } | 3206 | } |
3203 | for (i = 0; i < rdev->usec_timeout; i++) { | 3207 | for (i = 0; i < rdev->usec_timeout; i++) { |
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index 85a69d2ea3d2..9fcd338c0fcf 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | |||
@@ -113,6 +113,9 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder) | |||
113 | u8 *sadb; | 113 | u8 *sadb; |
114 | int sad_count; | 114 | int sad_count; |
115 | 115 | ||
116 | /* XXX: setting this register causes hangs on some asics */ | ||
117 | return; | ||
118 | |||
116 | if (!dig->afmt->pin) | 119 | if (!dig->afmt->pin) |
117 | return; | 120 | return; |
118 | 121 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index f815c20640bd..fe1de855775e 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -67,6 +67,9 @@ static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) | |||
67 | u8 *sadb; | 67 | u8 *sadb; |
68 | int sad_count; | 68 | int sad_count; |
69 | 69 | ||
70 | /* XXX: setting this register causes hangs on some asics */ | ||
71 | return; | ||
72 | |||
70 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { | 73 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
71 | if (connector->encoder == encoder) | 74 | if (connector->encoder == encoder) |
72 | radeon_connector = to_radeon_connector(connector); | 75 | radeon_connector = to_radeon_connector(connector); |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 93c1f9ef5da9..cac2866d79da 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -804,6 +804,7 @@ int ni_init_microcode(struct radeon_device *rdev) | |||
804 | fw_name); | 804 | fw_name); |
805 | release_firmware(rdev->smc_fw); | 805 | release_firmware(rdev->smc_fw); |
806 | rdev->smc_fw = NULL; | 806 | rdev->smc_fw = NULL; |
807 | err = 0; | ||
807 | } else if (rdev->smc_fw->size != smc_req_size) { | 808 | } else if (rdev->smc_fw->size != smc_req_size) { |
808 | printk(KERN_ERR | 809 | printk(KERN_ERR |
809 | "ni_mc: Bogus length %zu in firmware \"%s\"\n", | 810 | "ni_mc: Bogus length %zu in firmware \"%s\"\n", |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 2a1b1876b431..f9be22062df1 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2302,6 +2302,7 @@ int r600_init_microcode(struct radeon_device *rdev) | |||
2302 | fw_name); | 2302 | fw_name); |
2303 | release_firmware(rdev->smc_fw); | 2303 | release_firmware(rdev->smc_fw); |
2304 | rdev->smc_fw = NULL; | 2304 | rdev->smc_fw = NULL; |
2305 | err = 0; | ||
2305 | } else if (rdev->smc_fw->size != smc_req_size) { | 2306 | } else if (rdev->smc_fw->size != smc_req_size) { |
2306 | printk(KERN_ERR | 2307 | printk(KERN_ERR |
2307 | "smc: Bogus length %zu in firmware \"%s\"\n", | 2308 | "smc: Bogus length %zu in firmware \"%s\"\n", |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 5b729319f27b..06022e3b9c3b 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -309,6 +309,9 @@ static void dce3_2_afmt_write_speaker_allocation(struct drm_encoder *encoder) | |||
309 | u8 *sadb; | 309 | u8 *sadb; |
310 | int sad_count; | 310 | int sad_count; |
311 | 311 | ||
312 | /* XXX: setting this register causes hangs on some asics */ | ||
313 | return; | ||
314 | |||
312 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { | 315 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
313 | if (connector->encoder == encoder) | 316 | if (connector->encoder == encoder) |
314 | radeon_connector = to_radeon_connector(connector); | 317 | radeon_connector = to_radeon_connector(connector); |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 79159b5da05b..64565732cb98 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -1658,9 +1658,12 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1658 | drm_object_attach_property(&radeon_connector->base.base, | 1658 | drm_object_attach_property(&radeon_connector->base.base, |
1659 | rdev->mode_info.underscan_vborder_property, | 1659 | rdev->mode_info.underscan_vborder_property, |
1660 | 0); | 1660 | 0); |
1661 | drm_object_attach_property(&radeon_connector->base.base, | 1661 | if (radeon_audio != 0) |
1662 | rdev->mode_info.audio_property, | 1662 | drm_object_attach_property(&radeon_connector->base.base, |
1663 | RADEON_AUDIO_DISABLE); | 1663 | rdev->mode_info.audio_property, |
1664 | (radeon_audio == 1) ? | ||
1665 | RADEON_AUDIO_AUTO : | ||
1666 | RADEON_AUDIO_DISABLE); | ||
1664 | subpixel_order = SubPixelHorizontalRGB; | 1667 | subpixel_order = SubPixelHorizontalRGB; |
1665 | connector->interlace_allowed = true; | 1668 | connector->interlace_allowed = true; |
1666 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) | 1669 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
@@ -1754,10 +1757,12 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1754 | rdev->mode_info.underscan_vborder_property, | 1757 | rdev->mode_info.underscan_vborder_property, |
1755 | 0); | 1758 | 0); |
1756 | } | 1759 | } |
1757 | if (ASIC_IS_DCE2(rdev)) { | 1760 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
1758 | drm_object_attach_property(&radeon_connector->base.base, | 1761 | drm_object_attach_property(&radeon_connector->base.base, |
1759 | rdev->mode_info.audio_property, | 1762 | rdev->mode_info.audio_property, |
1760 | RADEON_AUDIO_DISABLE); | 1763 | (radeon_audio == 1) ? |
1764 | RADEON_AUDIO_AUTO : | ||
1765 | RADEON_AUDIO_DISABLE); | ||
1761 | } | 1766 | } |
1762 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { | 1767 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1763 | radeon_connector->dac_load_detect = true; | 1768 | radeon_connector->dac_load_detect = true; |
@@ -1799,10 +1804,12 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1799 | rdev->mode_info.underscan_vborder_property, | 1804 | rdev->mode_info.underscan_vborder_property, |
1800 | 0); | 1805 | 0); |
1801 | } | 1806 | } |
1802 | if (ASIC_IS_DCE2(rdev)) { | 1807 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
1803 | drm_object_attach_property(&radeon_connector->base.base, | 1808 | drm_object_attach_property(&radeon_connector->base.base, |
1804 | rdev->mode_info.audio_property, | 1809 | rdev->mode_info.audio_property, |
1805 | RADEON_AUDIO_DISABLE); | 1810 | (radeon_audio == 1) ? |
1811 | RADEON_AUDIO_AUTO : | ||
1812 | RADEON_AUDIO_DISABLE); | ||
1806 | } | 1813 | } |
1807 | subpixel_order = SubPixelHorizontalRGB; | 1814 | subpixel_order = SubPixelHorizontalRGB; |
1808 | connector->interlace_allowed = true; | 1815 | connector->interlace_allowed = true; |
@@ -1843,10 +1850,12 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1843 | rdev->mode_info.underscan_vborder_property, | 1850 | rdev->mode_info.underscan_vborder_property, |
1844 | 0); | 1851 | 0); |
1845 | } | 1852 | } |
1846 | if (ASIC_IS_DCE2(rdev)) { | 1853 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
1847 | drm_object_attach_property(&radeon_connector->base.base, | 1854 | drm_object_attach_property(&radeon_connector->base.base, |
1848 | rdev->mode_info.audio_property, | 1855 | rdev->mode_info.audio_property, |
1849 | RADEON_AUDIO_DISABLE); | 1856 | (radeon_audio == 1) ? |
1857 | RADEON_AUDIO_AUTO : | ||
1858 | RADEON_AUDIO_DISABLE); | ||
1850 | } | 1859 | } |
1851 | connector->interlace_allowed = true; | 1860 | connector->interlace_allowed = true; |
1852 | /* in theory with a DP to VGA converter... */ | 1861 | /* in theory with a DP to VGA converter... */ |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 66c222836631..80285e35bc65 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -85,9 +85,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) | |||
85 | VRAM, also but everything into VRAM on AGP cards to avoid | 85 | VRAM, also but everything into VRAM on AGP cards to avoid |
86 | image corruptions */ | 86 | image corruptions */ |
87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && | 87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && |
88 | p->rdev->family < CHIP_PALM && | ||
89 | (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { | 88 | (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { |
90 | 89 | /* TODO: is this still needed for NI+ ? */ | |
91 | p->relocs[i].lobj.domain = | 90 | p->relocs[i].lobj.domain = |
92 | RADEON_GEM_DOMAIN_VRAM; | 91 | RADEON_GEM_DOMAIN_VRAM; |
93 | 92 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index cdd12dcd988b..9c14a1ba1de4 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -153,7 +153,7 @@ int radeon_benchmarking = 0; | |||
153 | int radeon_testing = 0; | 153 | int radeon_testing = 0; |
154 | int radeon_connector_table = 0; | 154 | int radeon_connector_table = 0; |
155 | int radeon_tv = 1; | 155 | int radeon_tv = 1; |
156 | int radeon_audio = 1; | 156 | int radeon_audio = -1; |
157 | int radeon_disp_priority = 0; | 157 | int radeon_disp_priority = 0; |
158 | int radeon_hw_i2c = 0; | 158 | int radeon_hw_i2c = 0; |
159 | int radeon_pcie_gen2 = -1; | 159 | int radeon_pcie_gen2 = -1; |
@@ -196,7 +196,7 @@ module_param_named(connector_table, radeon_connector_table, int, 0444); | |||
196 | MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); | 196 | MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); |
197 | module_param_named(tv, radeon_tv, int, 0444); | 197 | module_param_named(tv, radeon_tv, int, 0444); |
198 | 198 | ||
199 | MODULE_PARM_DESC(audio, "Audio enable (1 = enable)"); | 199 | MODULE_PARM_DESC(audio, "Audio enable (-1 = auto, 0 = disable, 1 = enable)"); |
200 | module_param_named(audio, radeon_audio, int, 0444); | 200 | module_param_named(audio, radeon_audio, int, 0444); |
201 | 201 | ||
202 | MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); | 202 | MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 4f2e73f79638..308eff5be1b4 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
@@ -476,7 +476,8 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, | |||
476 | return -EINVAL; | 476 | return -EINVAL; |
477 | } | 477 | } |
478 | 478 | ||
479 | if (p->rdev->family < CHIP_PALM && (cmd == 0 || cmd == 0x3) && | 479 | /* TODO: is this still necessary on NI+ ? */ |
480 | if ((cmd == 0 || cmd == 0x3) && | ||
480 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { | 481 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { |
481 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", | 482 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", |
482 | start, end); | 483 | start, end); |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index d4652af425b8..d96f7cbca0a1 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -1681,6 +1681,7 @@ static int si_init_microcode(struct radeon_device *rdev) | |||
1681 | fw_name); | 1681 | fw_name); |
1682 | release_firmware(rdev->smc_fw); | 1682 | release_firmware(rdev->smc_fw); |
1683 | rdev->smc_fw = NULL; | 1683 | rdev->smc_fw = NULL; |
1684 | err = 0; | ||
1684 | } else if (rdev->smc_fw->size != smc_req_size) { | 1685 | } else if (rdev->smc_fw->size != smc_req_size) { |
1685 | printk(KERN_ERR | 1686 | printk(KERN_ERR |
1686 | "si_smc: Bogus length %zu in firmware \"%s\"\n", | 1687 | "si_smc: Bogus length %zu in firmware \"%s\"\n", |
diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c index 3100fa9cb52f..7266805d9786 100644 --- a/drivers/gpu/drm/radeon/uvd_v1_0.c +++ b/drivers/gpu/drm/radeon/uvd_v1_0.c | |||
@@ -212,8 +212,8 @@ int uvd_v1_0_start(struct radeon_device *rdev) | |||
212 | /* enable VCPU clock */ | 212 | /* enable VCPU clock */ |
213 | WREG32(UVD_VCPU_CNTL, 1 << 9); | 213 | WREG32(UVD_VCPU_CNTL, 1 << 9); |
214 | 214 | ||
215 | /* enable UMC and NC0 */ | 215 | /* enable UMC */ |
216 | WREG32_P(UVD_LMI_CTRL2, 1 << 13, ~((1 << 8) | (1 << 13))); | 216 | WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8)); |
217 | 217 | ||
218 | /* boot up the VCPU */ | 218 | /* boot up the VCPU */ |
219 | WREG32(UVD_SOFT_RESET, 0); | 219 | WREG32(UVD_SOFT_RESET, 0); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 1a90f0a2f7e5..0508f93b9795 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
@@ -740,9 +740,17 @@ static void vmw_postclose(struct drm_device *dev, | |||
740 | struct vmw_fpriv *vmw_fp; | 740 | struct vmw_fpriv *vmw_fp; |
741 | 741 | ||
742 | vmw_fp = vmw_fpriv(file_priv); | 742 | vmw_fp = vmw_fpriv(file_priv); |
743 | ttm_object_file_release(&vmw_fp->tfile); | 743 | |
744 | if (vmw_fp->locked_master) | 744 | if (vmw_fp->locked_master) { |
745 | struct vmw_master *vmaster = | ||
746 | vmw_master(vmw_fp->locked_master); | ||
747 | |||
748 | ttm_lock_set_kill(&vmaster->lock, true, SIGTERM); | ||
749 | ttm_vt_unlock(&vmaster->lock); | ||
745 | drm_master_put(&vmw_fp->locked_master); | 750 | drm_master_put(&vmw_fp->locked_master); |
751 | } | ||
752 | |||
753 | ttm_object_file_release(&vmw_fp->tfile); | ||
746 | kfree(vmw_fp); | 754 | kfree(vmw_fp); |
747 | } | 755 | } |
748 | 756 | ||
@@ -925,14 +933,13 @@ static void vmw_master_drop(struct drm_device *dev, | |||
925 | 933 | ||
926 | vmw_fp->locked_master = drm_master_get(file_priv->master); | 934 | vmw_fp->locked_master = drm_master_get(file_priv->master); |
927 | ret = ttm_vt_lock(&vmaster->lock, false, vmw_fp->tfile); | 935 | ret = ttm_vt_lock(&vmaster->lock, false, vmw_fp->tfile); |
928 | vmw_execbuf_release_pinned_bo(dev_priv); | ||
929 | |||
930 | if (unlikely((ret != 0))) { | 936 | if (unlikely((ret != 0))) { |
931 | DRM_ERROR("Unable to lock TTM at VT switch.\n"); | 937 | DRM_ERROR("Unable to lock TTM at VT switch.\n"); |
932 | drm_master_put(&vmw_fp->locked_master); | 938 | drm_master_put(&vmw_fp->locked_master); |
933 | } | 939 | } |
934 | 940 | ||
935 | ttm_lock_set_kill(&vmaster->lock, true, SIGTERM); | 941 | ttm_lock_set_kill(&vmaster->lock, false, SIGTERM); |
942 | vmw_execbuf_release_pinned_bo(dev_priv); | ||
936 | 943 | ||
937 | if (!dev_priv->enable_fb) { | 944 | if (!dev_priv->enable_fb) { |
938 | ret = ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM); | 945 | ret = ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 0e67cf41065d..37fb4befec82 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
@@ -970,7 +970,7 @@ void vmw_resource_unreserve(struct vmw_resource *res, | |||
970 | if (new_backup) | 970 | if (new_backup) |
971 | res->backup_offset = new_backup_offset; | 971 | res->backup_offset = new_backup_offset; |
972 | 972 | ||
973 | if (!res->func->may_evict) | 973 | if (!res->func->may_evict || res->id == -1) |
974 | return; | 974 | return; |
975 | 975 | ||
976 | write_lock(&dev_priv->resource_lock); | 976 | write_lock(&dev_priv->resource_lock); |
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index 550811712f78..28acbaf4a81e 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h | |||
@@ -223,6 +223,8 @@ struct drm_mode_get_connector { | |||
223 | __u32 connection; | 223 | __u32 connection; |
224 | __u32 mm_width, mm_height; /**< HxW in millimeters */ | 224 | __u32 mm_width, mm_height; /**< HxW in millimeters */ |
225 | __u32 subpixel; | 225 | __u32 subpixel; |
226 | |||
227 | __u32 pad; | ||
226 | }; | 228 | }; |
227 | 229 | ||
228 | #define DRM_MODE_PROP_PENDING (1<<0) | 230 | #define DRM_MODE_PROP_PENDING (1<<0) |