aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-03-30 21:47:18 -0400
committerDave Airlie <airlied@redhat.com>2017-03-30 21:47:18 -0400
commit8cd3ac52963f2e99f4c21d1c9ce89531ce66c2d6 (patch)
tree94f7d4526fe19a32643308d6e00d0fc5442af277 /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
parent8bcad07a45637fb88e799466e4eee83859e8ffd3 (diff)
parent60508d3df2d2052881190ac82802a12cabcef53c (diff)
Merge branch 'drm-next-4.12' of git://people.freedesktop.org/~agd5f/linux into drm-next
New stuff for 4.12: - Preliminary vega10 support - Support for multi-level page tables - GPU sensor stuff for mesa - job tracing improvements - PRT support for sparse buffers - Additional SR-IOV improvements - ttm improvements - misc bug fixes and code cleanups * 'drm-next-4.12' of git://people.freedesktop.org/~agd5f/linux: (315 commits) drm/amdgpu: Fix 32bit x86 compilation warning drm/amdgpu: just disallow reading untouched registers drm/amdgpu: remove duplicate allowed reg CP_CPF_BUSY_STAT drm/amdgpu/soc15: enable psp block for SRIOV drm/amdgpu/soc15: bypass pp block for vf drm/amdgpu/psp: add check sOS sign drm/amd/amdgpu: Correct ring wptr address in debugfs (v2) drm/amdgpu: Fix multi-level page table bugs for large BOs v3 drm/amdgpu: Fix Vega10 VM initialization drm/amdgpu: Make max_pfn 64-bit drm/amdgpu: drop GB_GPU_ID from the golden settings drm/amdgpu: fix vm pte pde flags to 64-bit for sdma (v3) drm/amd/amdgpu: fix Tonga S3 resume hang on rhel6.8 drm/ttm: decrease ttm bo priority number drm/amd/amdgpu: fix performance drop when VRAM pressure drm/amdgpu: Couple small warning fixes drm/amdgpu: Clean up GFX 9 VM fault messages drm/amdgpu: Register UTCL2 as a source of VM faults drm/amdgpu/soc15: drop support for reading some registers drm/amdgpu/soc15: return cached values for some registers (v2) ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c146
1 files changed, 131 insertions, 15 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 61d94c745672..5ded370a4b35 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -208,6 +208,14 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,
208 fw_info->ver = adev->sdma.instance[query_fw->index].fw_version; 208 fw_info->ver = adev->sdma.instance[query_fw->index].fw_version;
209 fw_info->feature = adev->sdma.instance[query_fw->index].feature_version; 209 fw_info->feature = adev->sdma.instance[query_fw->index].feature_version;
210 break; 210 break;
211 case AMDGPU_INFO_FW_SOS:
212 fw_info->ver = adev->psp.sos_fw_version;
213 fw_info->feature = adev->psp.sos_feature_version;
214 break;
215 case AMDGPU_INFO_FW_ASD:
216 fw_info->ver = adev->psp.asd_fw_version;
217 fw_info->feature = adev->psp.asd_feature_version;
218 break;
211 default: 219 default:
212 return -EINVAL; 220 return -EINVAL;
213 } 221 }
@@ -240,6 +248,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
240 uint32_t ui32 = 0; 248 uint32_t ui32 = 0;
241 uint64_t ui64 = 0; 249 uint64_t ui64 = 0;
242 int i, found; 250 int i, found;
251 int ui32_size = sizeof(ui32);
243 252
244 if (!info->return_size || !info->return_pointer) 253 if (!info->return_size || !info->return_pointer)
245 return -EINVAL; 254 return -EINVAL;
@@ -308,6 +317,13 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
308 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE; 317 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
309 ib_size_alignment = 1; 318 ib_size_alignment = 1;
310 break; 319 break;
320 case AMDGPU_HW_IP_UVD_ENC:
321 type = AMD_IP_BLOCK_TYPE_UVD;
322 for (i = 0; i < adev->uvd.num_enc_rings; i++)
323 ring_mask |= ((adev->uvd.ring_enc[i].ready ? 1 : 0) << i);
324 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
325 ib_size_alignment = 1;
326 break;
311 default: 327 default:
312 return -EINVAL; 328 return -EINVAL;
313 } 329 }
@@ -347,6 +363,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
347 case AMDGPU_HW_IP_VCE: 363 case AMDGPU_HW_IP_VCE:
348 type = AMD_IP_BLOCK_TYPE_VCE; 364 type = AMD_IP_BLOCK_TYPE_VCE;
349 break; 365 break;
366 case AMDGPU_HW_IP_UVD_ENC:
367 type = AMD_IP_BLOCK_TYPE_UVD;
368 break;
350 default: 369 default:
351 return -EINVAL; 370 return -EINVAL;
352 } 371 }
@@ -527,6 +546,15 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
527 dev_info.vram_type = adev->mc.vram_type; 546 dev_info.vram_type = adev->mc.vram_type;
528 dev_info.vram_bit_width = adev->mc.vram_width; 547 dev_info.vram_bit_width = adev->mc.vram_width;
529 dev_info.vce_harvest_config = adev->vce.harvest_config; 548 dev_info.vce_harvest_config = adev->vce.harvest_config;
549 dev_info.gc_double_offchip_lds_buf =
550 adev->gfx.config.double_offchip_lds_buf;
551
552 if (amdgpu_ngg) {
553 dev_info.prim_buf_gpu_addr = adev->gfx.ngg.buf[PRIM].gpu_addr;
554 dev_info.pos_buf_gpu_addr = adev->gfx.ngg.buf[POS].gpu_addr;
555 dev_info.cntl_sb_buf_gpu_addr = adev->gfx.ngg.buf[CNTL].gpu_addr;
556 dev_info.param_buf_gpu_addr = adev->gfx.ngg.buf[PARAM].gpu_addr;
557 }
530 558
531 return copy_to_user(out, &dev_info, 559 return copy_to_user(out, &dev_info,
532 min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; 560 min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0;
@@ -596,6 +624,80 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
596 return -EINVAL; 624 return -EINVAL;
597 } 625 }
598 } 626 }
627 case AMDGPU_INFO_SENSOR: {
628 struct pp_gpu_power query = {0};
629 int query_size = sizeof(query);
630
631 if (amdgpu_dpm == 0)
632 return -ENOENT;
633
634 switch (info->sensor_info.type) {
635 case AMDGPU_INFO_SENSOR_GFX_SCLK:
636 /* get sclk in Mhz */
637 if (amdgpu_dpm_read_sensor(adev,
638 AMDGPU_PP_SENSOR_GFX_SCLK,
639 (void *)&ui32, &ui32_size)) {
640 return -EINVAL;
641 }
642 ui32 /= 100;
643 break;
644 case AMDGPU_INFO_SENSOR_GFX_MCLK:
645 /* get mclk in Mhz */
646 if (amdgpu_dpm_read_sensor(adev,
647 AMDGPU_PP_SENSOR_GFX_MCLK,
648 (void *)&ui32, &ui32_size)) {
649 return -EINVAL;
650 }
651 ui32 /= 100;
652 break;
653 case AMDGPU_INFO_SENSOR_GPU_TEMP:
654 /* get temperature in millidegrees C */
655 if (amdgpu_dpm_read_sensor(adev,
656 AMDGPU_PP_SENSOR_GPU_TEMP,
657 (void *)&ui32, &ui32_size)) {
658 return -EINVAL;
659 }
660 break;
661 case AMDGPU_INFO_SENSOR_GPU_LOAD:
662 /* get GPU load */
663 if (amdgpu_dpm_read_sensor(adev,
664 AMDGPU_PP_SENSOR_GPU_LOAD,
665 (void *)&ui32, &ui32_size)) {
666 return -EINVAL;
667 }
668 break;
669 case AMDGPU_INFO_SENSOR_GPU_AVG_POWER:
670 /* get average GPU power */
671 if (amdgpu_dpm_read_sensor(adev,
672 AMDGPU_PP_SENSOR_GPU_POWER,
673 (void *)&query, &query_size)) {
674 return -EINVAL;
675 }
676 ui32 = query.average_gpu_power >> 8;
677 break;
678 case AMDGPU_INFO_SENSOR_VDDNB:
679 /* get VDDNB in millivolts */
680 if (amdgpu_dpm_read_sensor(adev,
681 AMDGPU_PP_SENSOR_VDDNB,
682 (void *)&ui32, &ui32_size)) {
683 return -EINVAL;
684 }
685 break;
686 case AMDGPU_INFO_SENSOR_VDDGFX:
687 /* get VDDGFX in millivolts */
688 if (amdgpu_dpm_read_sensor(adev,
689 AMDGPU_PP_SENSOR_VDDGFX,
690 (void *)&ui32, &ui32_size)) {
691 return -EINVAL;
692 }
693 break;
694 default:
695 DRM_DEBUG_KMS("Invalid request %d\n",
696 info->sensor_info.type);
697 return -EINVAL;
698 }
699 return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0;
700 }
599 default: 701 default:
600 DRM_DEBUG_KMS("Invalid request %d\n", info->query); 702 DRM_DEBUG_KMS("Invalid request %d\n", info->query);
601 return -EINVAL; 703 return -EINVAL;
@@ -655,6 +757,14 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
655 goto out_suspend; 757 goto out_suspend;
656 } 758 }
657 759
760 fpriv->prt_va = amdgpu_vm_bo_add(adev, &fpriv->vm, NULL);
761 if (!fpriv->prt_va) {
762 r = -ENOMEM;
763 amdgpu_vm_fini(adev, &fpriv->vm);
764 kfree(fpriv);
765 goto out_suspend;
766 }
767
658 if (amdgpu_sriov_vf(adev)) { 768 if (amdgpu_sriov_vf(adev)) {
659 r = amdgpu_map_static_csa(adev, &fpriv->vm); 769 r = amdgpu_map_static_csa(adev, &fpriv->vm);
660 if (r) 770 if (r)
@@ -694,11 +804,15 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
694 if (!fpriv) 804 if (!fpriv)
695 return; 805 return;
696 806
807 pm_runtime_get_sync(dev->dev);
808
697 amdgpu_ctx_mgr_fini(&fpriv->ctx_mgr); 809 amdgpu_ctx_mgr_fini(&fpriv->ctx_mgr);
698 810
699 amdgpu_uvd_free_handles(adev, file_priv); 811 amdgpu_uvd_free_handles(adev, file_priv);
700 amdgpu_vce_free_handles(adev, file_priv); 812 amdgpu_vce_free_handles(adev, file_priv);
701 813
814 amdgpu_vm_bo_rmv(adev, fpriv->prt_va);
815
702 if (amdgpu_sriov_vf(adev)) { 816 if (amdgpu_sriov_vf(adev)) {
703 /* TODO: how to handle reserve failure */ 817 /* TODO: how to handle reserve failure */
704 BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, false)); 818 BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, false));
@@ -722,21 +836,6 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
722 pm_runtime_put_autosuspend(dev->dev); 836 pm_runtime_put_autosuspend(dev->dev);
723} 837}
724 838
725/**
726 * amdgpu_driver_preclose_kms - drm callback for pre close
727 *
728 * @dev: drm dev pointer
729 * @file_priv: drm file
730 *
731 * On device pre close, tear down hyperz and cmask filps on r1xx-r5xx
732 * (all asics).
733 */
734void amdgpu_driver_preclose_kms(struct drm_device *dev,
735 struct drm_file *file_priv)
736{
737 pm_runtime_get_sync(dev->dev);
738}
739
740/* 839/*
741 * VBlank related functions. 840 * VBlank related functions.
742 */ 841 */
@@ -989,6 +1088,23 @@ static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)
989 fw_info.feature, fw_info.ver); 1088 fw_info.feature, fw_info.ver);
990 } 1089 }
991 1090
1091 /* PSP SOS */
1092 query_fw.fw_type = AMDGPU_INFO_FW_SOS;
1093 ret = amdgpu_firmware_info(&fw_info, &query_fw, adev);
1094 if (ret)
1095 return ret;
1096 seq_printf(m, "SOS feature version: %u, firmware version: 0x%08x\n",
1097 fw_info.feature, fw_info.ver);
1098
1099
1100 /* PSP ASD */
1101 query_fw.fw_type = AMDGPU_INFO_FW_ASD;
1102 ret = amdgpu_firmware_info(&fw_info, &query_fw, adev);
1103 if (ret)
1104 return ret;
1105 seq_printf(m, "ASD feature version: %u, firmware version: 0x%08x\n",
1106 fw_info.feature, fw_info.ver);
1107
992 /* SMC */ 1108 /* SMC */
993 query_fw.fw_type = AMDGPU_INFO_FW_SMC; 1109 query_fw.fw_type = AMDGPU_INFO_FW_SMC;
994 ret = amdgpu_firmware_info(&fw_info, &query_fw, adev); 1110 ret = amdgpu_firmware_info(&fw_info, &query_fw, adev);