diff options
| -rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_vm.c | 11 |
6 files changed, 31 insertions, 12 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index df281b54db01..872ba11c4533 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | * Jesse Barnes <jesse.barnes@intel.com> | 29 | * Jesse Barnes <jesse.barnes@intel.com> |
| 30 | */ | 30 | */ |
| 31 | 31 | ||
| 32 | #include <linux/kernel.h> | ||
| 32 | #include <linux/export.h> | 33 | #include <linux/export.h> |
| 33 | #include <linux/moduleparam.h> | 34 | #include <linux/moduleparam.h> |
| 34 | 35 | ||
| @@ -88,7 +89,13 @@ bool drm_helper_encoder_in_use(struct drm_encoder *encoder) | |||
| 88 | struct drm_connector *connector; | 89 | struct drm_connector *connector; |
| 89 | struct drm_device *dev = encoder->dev; | 90 | struct drm_device *dev = encoder->dev; |
| 90 | 91 | ||
| 91 | WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); | 92 | /* |
| 93 | * We can expect this mutex to be locked if we are not panicking. | ||
| 94 | * Locking is currently fubar in the panic handler. | ||
| 95 | */ | ||
| 96 | if (!oops_in_progress) | ||
| 97 | WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); | ||
| 98 | |||
| 92 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) | 99 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
| 93 | if (connector->encoder == encoder) | 100 | if (connector->encoder == encoder) |
| 94 | return true; | 101 | return true; |
| @@ -112,7 +119,13 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc) | |||
| 112 | struct drm_encoder *encoder; | 119 | struct drm_encoder *encoder; |
| 113 | struct drm_device *dev = crtc->dev; | 120 | struct drm_device *dev = crtc->dev; |
| 114 | 121 | ||
| 115 | WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); | 122 | /* |
| 123 | * We can expect this mutex to be locked if we are not panicking. | ||
| 124 | * Locking is currently fubar in the panic handler. | ||
| 125 | */ | ||
| 126 | if (!oops_in_progress) | ||
| 127 | WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); | ||
| 128 | |||
| 116 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) | 129 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) |
| 117 | if (encoder->crtc == crtc && drm_helper_encoder_in_use(encoder)) | 130 | if (encoder->crtc == crtc && drm_helper_encoder_in_use(encoder)) |
| 118 | return true; | 131 | return true; |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index c31c12b4e666..e911898348f8 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -270,8 +270,6 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 270 | switch (mode) { | 270 | switch (mode) { |
| 271 | case DRM_MODE_DPMS_ON: | 271 | case DRM_MODE_DPMS_ON: |
| 272 | radeon_crtc->enabled = true; | 272 | radeon_crtc->enabled = true; |
| 273 | /* adjust pm to dpms changes BEFORE enabling crtcs */ | ||
| 274 | radeon_pm_compute_clocks(rdev); | ||
| 275 | atombios_enable_crtc(crtc, ATOM_ENABLE); | 273 | atombios_enable_crtc(crtc, ATOM_ENABLE); |
| 276 | if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev)) | 274 | if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev)) |
| 277 | atombios_enable_crtc_memreq(crtc, ATOM_ENABLE); | 275 | atombios_enable_crtc_memreq(crtc, ATOM_ENABLE); |
| @@ -289,10 +287,10 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 289 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); | 287 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); |
| 290 | atombios_enable_crtc(crtc, ATOM_DISABLE); | 288 | atombios_enable_crtc(crtc, ATOM_DISABLE); |
| 291 | radeon_crtc->enabled = false; | 289 | radeon_crtc->enabled = false; |
| 292 | /* adjust pm to dpms changes AFTER disabling crtcs */ | ||
| 293 | radeon_pm_compute_clocks(rdev); | ||
| 294 | break; | 290 | break; |
| 295 | } | 291 | } |
| 292 | /* adjust pm to dpms */ | ||
| 293 | radeon_pm_compute_clocks(rdev); | ||
| 296 | } | 294 | } |
| 297 | 295 | ||
| 298 | static void | 296 | static void |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index be20e62dac83..e5f0177bea1e 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -2049,8 +2049,8 @@ static struct radeon_asic ci_asic = { | |||
| 2049 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, | 2049 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 2050 | .dma = &cik_copy_dma, | 2050 | .dma = &cik_copy_dma, |
| 2051 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, | 2051 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, |
| 2052 | .copy = &cik_copy_dma, | 2052 | .copy = &cik_copy_cpdma, |
| 2053 | .copy_ring_index = R600_RING_TYPE_DMA_INDEX, | 2053 | .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 2054 | }, | 2054 | }, |
| 2055 | .surface = { | 2055 | .surface = { |
| 2056 | .set_reg = r600_set_surface_reg, | 2056 | .set_reg = r600_set_surface_reg, |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 14671406212f..2cd144c378d6 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -1558,6 +1558,10 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | |||
| 1558 | 1558 | ||
| 1559 | drm_kms_helper_poll_enable(dev); | 1559 | drm_kms_helper_poll_enable(dev); |
| 1560 | 1560 | ||
| 1561 | /* set the power state here in case we are a PX system or headless */ | ||
| 1562 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) | ||
| 1563 | radeon_pm_compute_clocks(rdev); | ||
| 1564 | |||
| 1561 | if (fbcon) { | 1565 | if (fbcon) { |
| 1562 | radeon_fbdev_set_suspend(rdev, 0); | 1566 | radeon_fbdev_set_suspend(rdev, 0); |
| 1563 | console_unlock(); | 1567 | console_unlock(); |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 53d6e1bb48dc..2bdae61c0ac0 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -1104,7 +1104,6 @@ static void radeon_pm_resume_dpm(struct radeon_device *rdev) | |||
| 1104 | if (ret) | 1104 | if (ret) |
| 1105 | goto dpm_resume_fail; | 1105 | goto dpm_resume_fail; |
| 1106 | rdev->pm.dpm_enabled = true; | 1106 | rdev->pm.dpm_enabled = true; |
| 1107 | radeon_pm_compute_clocks(rdev); | ||
| 1108 | return; | 1107 | return; |
| 1109 | 1108 | ||
| 1110 | dpm_resume_fail: | 1109 | dpm_resume_fail: |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index 1f426696de36..c11b71d249e3 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
| @@ -132,7 +132,7 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev, | |||
| 132 | struct radeon_cs_reloc *list; | 132 | struct radeon_cs_reloc *list; |
| 133 | unsigned i, idx; | 133 | unsigned i, idx; |
| 134 | 134 | ||
| 135 | list = kmalloc_array(vm->max_pde_used + 1, | 135 | list = kmalloc_array(vm->max_pde_used + 2, |
| 136 | sizeof(struct radeon_cs_reloc), GFP_KERNEL); | 136 | sizeof(struct radeon_cs_reloc), GFP_KERNEL); |
| 137 | if (!list) | 137 | if (!list) |
| 138 | return NULL; | 138 | return NULL; |
| @@ -585,7 +585,8 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev, | |||
| 585 | { | 585 | { |
| 586 | static const uint32_t incr = RADEON_VM_PTE_COUNT * 8; | 586 | static const uint32_t incr = RADEON_VM_PTE_COUNT * 8; |
| 587 | 587 | ||
| 588 | uint64_t pd_addr = radeon_bo_gpu_offset(vm->page_directory); | 588 | struct radeon_bo *pd = vm->page_directory; |
| 589 | uint64_t pd_addr = radeon_bo_gpu_offset(pd); | ||
| 589 | uint64_t last_pde = ~0, last_pt = ~0; | 590 | uint64_t last_pde = ~0, last_pt = ~0; |
| 590 | unsigned count = 0, pt_idx, ndw; | 591 | unsigned count = 0, pt_idx, ndw; |
| 591 | struct radeon_ib ib; | 592 | struct radeon_ib ib; |
| @@ -642,6 +643,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev, | |||
| 642 | incr, R600_PTE_VALID); | 643 | incr, R600_PTE_VALID); |
| 643 | 644 | ||
| 644 | if (ib.length_dw != 0) { | 645 | if (ib.length_dw != 0) { |
| 646 | radeon_semaphore_sync_to(ib.semaphore, pd->tbo.sync_obj); | ||
| 645 | radeon_semaphore_sync_to(ib.semaphore, vm->last_id_use); | 647 | radeon_semaphore_sync_to(ib.semaphore, vm->last_id_use); |
| 646 | r = radeon_ib_schedule(rdev, &ib, NULL); | 648 | r = radeon_ib_schedule(rdev, &ib, NULL); |
| 647 | if (r) { | 649 | if (r) { |
| @@ -689,15 +691,18 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev, | |||
| 689 | /* walk over the address space and update the page tables */ | 691 | /* walk over the address space and update the page tables */ |
| 690 | for (addr = start; addr < end; ) { | 692 | for (addr = start; addr < end; ) { |
| 691 | uint64_t pt_idx = addr >> RADEON_VM_BLOCK_SIZE; | 693 | uint64_t pt_idx = addr >> RADEON_VM_BLOCK_SIZE; |
| 694 | struct radeon_bo *pt = vm->page_tables[pt_idx].bo; | ||
| 692 | unsigned nptes; | 695 | unsigned nptes; |
| 693 | uint64_t pte; | 696 | uint64_t pte; |
| 694 | 697 | ||
| 698 | radeon_semaphore_sync_to(ib->semaphore, pt->tbo.sync_obj); | ||
| 699 | |||
| 695 | if ((addr & ~mask) == (end & ~mask)) | 700 | if ((addr & ~mask) == (end & ~mask)) |
| 696 | nptes = end - addr; | 701 | nptes = end - addr; |
| 697 | else | 702 | else |
| 698 | nptes = RADEON_VM_PTE_COUNT - (addr & mask); | 703 | nptes = RADEON_VM_PTE_COUNT - (addr & mask); |
| 699 | 704 | ||
| 700 | pte = radeon_bo_gpu_offset(vm->page_tables[pt_idx].bo); | 705 | pte = radeon_bo_gpu_offset(pt); |
| 701 | pte += (addr & mask) * 8; | 706 | pte += (addr & mask) * 8; |
| 702 | 707 | ||
| 703 | if ((last_pte + 8 * count) != pte) { | 708 | if ((last_pte + 8 * count) != pte) { |
