diff options
author | Dave Airlie <airlied@redhat.com> | 2017-03-30 21:47:18 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-03-30 21:47:18 -0400 |
commit | 8cd3ac52963f2e99f4c21d1c9ce89531ce66c2d6 (patch) | |
tree | 94f7d4526fe19a32643308d6e00d0fc5442af277 /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |
parent | 8bcad07a45637fb88e799466e4eee83859e8ffd3 (diff) | |
parent | 60508d3df2d2052881190ac82802a12cabcef53c (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.c | 146 |
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 | */ | ||
734 | void 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); |