aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-05-08 23:49:56 -0400
committerDave Airlie <airlied@redhat.com>2016-05-08 23:49:56 -0400
commitbafb86f5bc3173479002555dea7f31d943b12332 (patch)
tree6ec94c96460faf782cdb8781339560e13e0918b0 /drivers/gpu/drm/amd
parentba391646d0d43aee3596b616113cce0f22dde627 (diff)
parent44549e8f5eea4e0a41b487b63e616cb089922b99 (diff)
Merge tag 'v4.6-rc7' into drm-next
Merge this back as we've built up a fair few conflicts, and I have some newer trees to pull in.
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atombios_encoders.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/tonga_ih.c2
13 files changed, 46 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 1012bd3f3482..113fd4bf9b64 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1639,6 +1639,7 @@ struct amdgpu_uvd {
1639 struct amdgpu_bo *vcpu_bo; 1639 struct amdgpu_bo *vcpu_bo;
1640 void *cpu_addr; 1640 void *cpu_addr;
1641 uint64_t gpu_addr; 1641 uint64_t gpu_addr;
1642 unsigned fw_version;
1642 void *saved_bo; 1643 void *saved_bo;
1643 unsigned max_handles; 1644 unsigned max_handles;
1644 atomic_t handles[AMDGPU_MAX_UVD_HANDLES]; 1645 atomic_t handles[AMDGPU_MAX_UVD_HANDLES];
@@ -2074,6 +2075,7 @@ struct amdgpu_device {
2074 2075
2075 /* tracking pinned memory */ 2076 /* tracking pinned memory */
2076 u64 vram_pin_size; 2077 u64 vram_pin_size;
2078 u64 invisible_pin_size;
2077 u64 gart_pin_size; 2079 u64 gart_pin_size;
2078 2080
2079 /* amdkfd interface */ 2081 /* amdkfd interface */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
index da764e193fb9..49838dfe9bda 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
@@ -425,6 +425,10 @@ static int acp_resume(void *handle)
425 struct acp_pm_domain *apd; 425 struct acp_pm_domain *apd;
426 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 426 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
427 427
428 /* return early if no ACP */
429 if (!adev->acp.acp_genpd)
430 return 0;
431
428 /* SMU block will power on ACP irrespective of ACP runtime status. 432 /* SMU block will power on ACP irrespective of ACP runtime status.
429 * Power off explicitly based on genpd ACP runtime status so that ACP 433 * Power off explicitly based on genpd ACP runtime status so that ACP
430 * hw and ACP-genpd status are in sync. 434 * hw and ACP-genpd status are in sync.
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
index 0020a0ea43ff..35a1248aaa77 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
@@ -63,10 +63,6 @@ bool amdgpu_has_atpx(void) {
63 return amdgpu_atpx_priv.atpx_detected; 63 return amdgpu_atpx_priv.atpx_detected;
64} 64}
65 65
66bool amdgpu_has_atpx_dgpu_power_cntl(void) {
67 return amdgpu_atpx_priv.atpx.functions.power_cntl;
68}
69
70/** 66/**
71 * amdgpu_atpx_call - call an ATPX method 67 * amdgpu_atpx_call - call an ATPX method
72 * 68 *
@@ -146,6 +142,13 @@ static void amdgpu_atpx_parse_functions(struct amdgpu_atpx_functions *f, u32 mas
146 */ 142 */
147static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx) 143static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
148{ 144{
145 /* make sure required functions are enabled */
146 /* dGPU power control is required */
147 if (atpx->functions.power_cntl == false) {
148 printk("ATPX dGPU power cntl not present, forcing\n");
149 atpx->functions.power_cntl = true;
150 }
151
149 if (atpx->functions.px_params) { 152 if (atpx->functions.px_params) {
150 union acpi_object *info; 153 union acpi_object *info;
151 struct atpx_px_params output; 154 struct atpx_px_params output;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 8f037e5e08fa..778330529ff5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -64,12 +64,6 @@ static const char *amdgpu_asic_name[] = {
64 "LAST", 64 "LAST",
65}; 65};
66 66
67#if defined(CONFIG_VGA_SWITCHEROO)
68bool amdgpu_has_atpx_dgpu_power_cntl(void);
69#else
70static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; }
71#endif
72
73bool amdgpu_device_is_px(struct drm_device *dev) 67bool amdgpu_device_is_px(struct drm_device *dev)
74{ 68{
75 struct amdgpu_device *adev = dev->dev_private; 69 struct amdgpu_device *adev = dev->dev_private;
@@ -1494,7 +1488,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1494 1488
1495 if (amdgpu_runtime_pm == 1) 1489 if (amdgpu_runtime_pm == 1)
1496 runtime = true; 1490 runtime = true;
1497 if (amdgpu_device_is_px(ddev) && amdgpu_has_atpx_dgpu_power_cntl()) 1491 if (amdgpu_device_is_px(ddev))
1498 runtime = true; 1492 runtime = true;
1499 vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime); 1493 vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
1500 if (runtime) 1494 if (runtime)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 4ac83c8b40d9..7db271278e70 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -303,7 +303,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
303 fw_info.feature = adev->vce.fb_version; 303 fw_info.feature = adev->vce.fb_version;
304 break; 304 break;
305 case AMDGPU_INFO_FW_UVD: 305 case AMDGPU_INFO_FW_UVD:
306 fw_info.ver = 0; 306 fw_info.ver = adev->uvd.fw_version;
307 fw_info.feature = 0; 307 fw_info.feature = 0;
308 break; 308 break;
309 case AMDGPU_INFO_FW_GMC: 309 case AMDGPU_INFO_FW_GMC:
@@ -384,7 +384,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
384 vram_gtt.vram_size = adev->mc.real_vram_size; 384 vram_gtt.vram_size = adev->mc.real_vram_size;
385 vram_gtt.vram_size -= adev->vram_pin_size; 385 vram_gtt.vram_size -= adev->vram_pin_size;
386 vram_gtt.vram_cpu_accessible_size = adev->mc.visible_vram_size; 386 vram_gtt.vram_cpu_accessible_size = adev->mc.visible_vram_size;
387 vram_gtt.vram_cpu_accessible_size -= adev->vram_pin_size; 387 vram_gtt.vram_cpu_accessible_size -= (adev->vram_pin_size - adev->invisible_pin_size);
388 vram_gtt.gtt_size = adev->mc.gtt_size; 388 vram_gtt.gtt_size = adev->mc.gtt_size;
389 vram_gtt.gtt_size -= adev->gart_pin_size; 389 vram_gtt.gtt_size -= adev->gart_pin_size;
390 return copy_to_user(out, &vram_gtt, 390 return copy_to_user(out, &vram_gtt,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 5b6639faa731..7ecea83ce453 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -424,9 +424,11 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
424 bo->pin_count = 1; 424 bo->pin_count = 1;
425 if (gpu_addr != NULL) 425 if (gpu_addr != NULL)
426 *gpu_addr = amdgpu_bo_gpu_offset(bo); 426 *gpu_addr = amdgpu_bo_gpu_offset(bo);
427 if (domain == AMDGPU_GEM_DOMAIN_VRAM) 427 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
428 bo->adev->vram_pin_size += amdgpu_bo_size(bo); 428 bo->adev->vram_pin_size += amdgpu_bo_size(bo);
429 else 429 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
430 bo->adev->invisible_pin_size += amdgpu_bo_size(bo);
431 } else
430 bo->adev->gart_pin_size += amdgpu_bo_size(bo); 432 bo->adev->gart_pin_size += amdgpu_bo_size(bo);
431 } else { 433 } else {
432 dev_err(bo->adev->dev, "%p pin failed\n", bo); 434 dev_err(bo->adev->dev, "%p pin failed\n", bo);
@@ -456,9 +458,11 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
456 } 458 }
457 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 459 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
458 if (likely(r == 0)) { 460 if (likely(r == 0)) {
459 if (bo->tbo.mem.mem_type == TTM_PL_VRAM) 461 if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
460 bo->adev->vram_pin_size -= amdgpu_bo_size(bo); 462 bo->adev->vram_pin_size -= amdgpu_bo_size(bo);
461 else 463 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
464 bo->adev->invisible_pin_size -= amdgpu_bo_size(bo);
465 } else
462 bo->adev->gart_pin_size -= amdgpu_bo_size(bo); 466 bo->adev->gart_pin_size -= amdgpu_bo_size(bo);
463 } else { 467 } else {
464 dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo); 468 dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo);
@@ -537,6 +541,7 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
537 if (!metadata_size) { 541 if (!metadata_size) {
538 if (bo->metadata_size) { 542 if (bo->metadata_size) {
539 kfree(bo->metadata); 543 kfree(bo->metadata);
544 bo->metadata = NULL;
540 bo->metadata_size = 0; 545 bo->metadata_size = 0;
541 } 546 }
542 return 0; 547 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index a0065765ed2d..3b9053af4762 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -223,6 +223,8 @@ static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp)
223{ 223{
224 struct amdgpu_bo *rbo = container_of(bo, struct amdgpu_bo, tbo); 224 struct amdgpu_bo *rbo = container_of(bo, struct amdgpu_bo, tbo);
225 225
226 if (amdgpu_ttm_tt_get_usermm(bo->ttm))
227 return -EPERM;
226 return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp); 228 return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp);
227} 229}
228 230
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index db86012deb67..abda242980ba 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -181,6 +181,9 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
181 ((version_major == 0x01) && (version_minor >= 0x50))) 181 ((version_major == 0x01) && (version_minor >= 0x50)))
182 adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES; 182 adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES;
183 183
184 adev->uvd.fw_version = ((version_major << 24) | (version_minor << 16) |
185 (family_id << 8));
186
184 bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8) 187 bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8)
185 + AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE 188 + AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE
186 + AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles; 189 + AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles;
@@ -279,6 +282,8 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
279 if (i == AMDGPU_MAX_UVD_HANDLES) 282 if (i == AMDGPU_MAX_UVD_HANDLES)
280 return 0; 283 return 0;
281 284
285 cancel_delayed_work_sync(&adev->uvd.idle_work);
286
282 size = amdgpu_bo_size(adev->uvd.vcpu_bo); 287 size = amdgpu_bo_size(adev->uvd.vcpu_bo);
283 ptr = adev->uvd.cpu_addr; 288 ptr = adev->uvd.cpu_addr;
284 289
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 80c1048f3324..22a4d96fedb7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -244,6 +244,7 @@ int amdgpu_vce_suspend(struct amdgpu_device *adev)
244 if (i == AMDGPU_MAX_VCE_HANDLES) 244 if (i == AMDGPU_MAX_VCE_HANDLES)
245 return 0; 245 return 0;
246 246
247 cancel_delayed_work_sync(&adev->vce.idle_work);
247 /* TODO: suspending running encoding sessions isn't supported */ 248 /* TODO: suspending running encoding sessions isn't supported */
248 return -EINVAL; 249 return -EINVAL;
249} 250}
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
index a873780183d5..48b6bd671cda 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
@@ -298,6 +298,10 @@ bool amdgpu_atombios_encoder_mode_fixup(struct drm_encoder *encoder,
298 && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2))) 298 && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
299 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2; 299 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
300 300
301 /* vertical FP must be at least 1 */
302 if (mode->crtc_vsync_start == mode->crtc_vdisplay)
303 adjusted_mode->crtc_vsync_start++;
304
301 /* get the native mode for scaling */ 305 /* get the native mode for scaling */
302 if (amdgpu_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) 306 if (amdgpu_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
303 amdgpu_panel_mode_fixup(encoder, adjusted_mode); 307 amdgpu_panel_mode_fixup(encoder, adjusted_mode);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 3b620a8e8682..48e4800eafcc 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -910,7 +910,10 @@ static int gmc_v7_0_late_init(void *handle)
910{ 910{
911 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 911 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
912 912
913 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); 913 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
914 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0);
915 else
916 return 0;
914} 917}
915 918
916static int gmc_v7_0_sw_init(void *handle) 919static int gmc_v7_0_sw_init(void *handle)
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index c0de22f7311d..53c3339e2cfd 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -905,7 +905,10 @@ static int gmc_v8_0_late_init(void *handle)
905{ 905{
906 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 906 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
907 907
908 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); 908 if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
909 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0);
910 else
911 return 0;
909} 912}
910 913
911#define mmMC_SEQ_MISC0_FIJI 0xA71 914#define mmMC_SEQ_MISC0_FIJI 0xA71
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
index dd9e5e36fec9..55cdab849089 100644
--- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
@@ -307,7 +307,7 @@ static int tonga_ih_sw_fini(void *handle)
307 307
308 amdgpu_irq_fini(adev); 308 amdgpu_irq_fini(adev);
309 amdgpu_ih_ring_fini(adev); 309 amdgpu_ih_ring_fini(adev);
310 amdgpu_irq_add_domain(adev); 310 amdgpu_irq_remove_domain(adev);
311 311
312 return 0; 312 return 0;
313} 313}