diff options
| author | Alexey Skidanov <Alexey.Skidanov@amd.com> | 2015-05-19 12:25:01 -0400 |
|---|---|---|
| committer | Oded Gabbay <oded.gabbay@gmail.com> | 2015-06-03 04:34:46 -0400 |
| commit | edad40239ffcaafd7eb56e4060d472aa5af2df21 (patch) | |
| tree | f84acc8cabbce7fcd815c5f95991949ee0805f6e /drivers | |
| parent | f8bd13338a9a42358158954251969e66934ec3d1 (diff) | |
drm/radeon: Add ATC VMID<-->PASID functions to kfd->kgd
This patch adds three new interfaces to kfd2kgd interface file of radeon.
The interfaces are:
- Check if a specific VMID has a valid PASID mapping
- Retrieve the PASID which is mapped to a specific VMID
- Issue a VMID invalidation request to the ATC
Signed-off-by: Alexey Skidanov <Alexey.Skidanov@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cikd.h | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_kfd.c | 38 |
3 files changed, 50 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index afde1b75eeee..9080daa116b6 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h | |||
| @@ -175,6 +175,14 @@ struct kfd2kgd_calls { | |||
| 175 | uint32_t (*address_watch_get_offset)(struct kgd_dev *kgd, | 175 | uint32_t (*address_watch_get_offset)(struct kgd_dev *kgd, |
| 176 | unsigned int watch_point_id, | 176 | unsigned int watch_point_id, |
| 177 | unsigned int reg_offset); | 177 | unsigned int reg_offset); |
| 178 | bool (*get_atc_vmid_pasid_mapping_valid)( | ||
| 179 | struct kgd_dev *kgd, | ||
| 180 | uint8_t vmid); | ||
| 181 | uint16_t (*get_atc_vmid_pasid_mapping_pasid)( | ||
| 182 | struct kgd_dev *kgd, | ||
| 183 | uint8_t vmid); | ||
| 184 | void (*write_vmid_invalidate_request)(struct kgd_dev *kgd, | ||
| 185 | uint8_t vmid); | ||
| 178 | 186 | ||
| 179 | uint16_t (*get_fw_version)(struct kgd_dev *kgd, | 187 | uint16_t (*get_fw_version)(struct kgd_dev *kgd, |
| 180 | enum kgd_engine_type type); | 188 | enum kgd_engine_type type); |
diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h index b33ba3b0808b..391ff9d5d706 100644 --- a/drivers/gpu/drm/radeon/cikd.h +++ b/drivers/gpu/drm/radeon/cikd.h | |||
| @@ -2148,9 +2148,12 @@ | |||
| 2148 | #define VCE_CMD_IB_AUTO 0x00000005 | 2148 | #define VCE_CMD_IB_AUTO 0x00000005 |
| 2149 | #define VCE_CMD_SEMAPHORE 0x00000006 | 2149 | #define VCE_CMD_SEMAPHORE 0x00000006 |
| 2150 | 2150 | ||
| 2151 | #define ATC_VMID0_PASID_MAPPING 0x339Cu | 2151 | #define ATC_VMID_PASID_MAPPING_UPDATE_STATUS 0x3398u |
| 2152 | #define ATC_VMID_PASID_MAPPING_UPDATE_STATUS 0x3398u | 2152 | #define ATC_VMID0_PASID_MAPPING 0x339Cu |
| 2153 | #define ATC_VMID_PASID_MAPPING_VALID (1U << 31) | 2153 | #define ATC_VMID_PASID_MAPPING_PASID_MASK (0xFFFF) |
| 2154 | #define ATC_VMID_PASID_MAPPING_PASID_SHIFT 0 | ||
| 2155 | #define ATC_VMID_PASID_MAPPING_VALID_MASK (0x1 << 31) | ||
| 2156 | #define ATC_VMID_PASID_MAPPING_VALID_SHIFT 31 | ||
| 2154 | 2157 | ||
| 2155 | #define ATC_VM_APERTURE0_CNTL 0x3310u | 2158 | #define ATC_VM_APERTURE0_CNTL 0x3310u |
| 2156 | #define ATS_ACCESS_MODE_NEVER 0 | 2159 | #define ATS_ACCESS_MODE_NEVER 0 |
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index fd9590de2605..e476c331f3fa 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c | |||
| @@ -99,6 +99,11 @@ static uint32_t kgd_address_watch_get_offset(struct kgd_dev *kgd, | |||
| 99 | unsigned int watch_point_id, | 99 | unsigned int watch_point_id, |
| 100 | unsigned int reg_offset); | 100 | unsigned int reg_offset); |
| 101 | 101 | ||
| 102 | static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid); | ||
| 103 | static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, | ||
| 104 | uint8_t vmid); | ||
| 105 | static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid); | ||
| 106 | |||
| 102 | static const struct kfd2kgd_calls kfd2kgd = { | 107 | static const struct kfd2kgd_calls kfd2kgd = { |
| 103 | .init_gtt_mem_allocation = alloc_gtt_mem, | 108 | .init_gtt_mem_allocation = alloc_gtt_mem, |
| 104 | .free_gtt_mem = free_gtt_mem, | 109 | .free_gtt_mem = free_gtt_mem, |
| @@ -119,6 +124,9 @@ static const struct kfd2kgd_calls kfd2kgd = { | |||
| 119 | .address_watch_execute = kgd_address_watch_execute, | 124 | .address_watch_execute = kgd_address_watch_execute, |
| 120 | .wave_control_execute = kgd_wave_control_execute, | 125 | .wave_control_execute = kgd_wave_control_execute, |
| 121 | .address_watch_get_offset = kgd_address_watch_get_offset, | 126 | .address_watch_get_offset = kgd_address_watch_get_offset, |
| 127 | .get_atc_vmid_pasid_mapping_pasid = get_atc_vmid_pasid_mapping_pasid, | ||
| 128 | .get_atc_vmid_pasid_mapping_valid = get_atc_vmid_pasid_mapping_valid, | ||
| 129 | .write_vmid_invalidate_request = write_vmid_invalidate_request, | ||
| 122 | .get_fw_version = get_fw_version | 130 | .get_fw_version = get_fw_version |
| 123 | }; | 131 | }; |
| 124 | 132 | ||
| @@ -395,8 +403,8 @@ static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid, | |||
| 395 | * the SW cleared it. | 403 | * the SW cleared it. |
| 396 | * So the protocol is to always wait & clear. | 404 | * So the protocol is to always wait & clear. |
| 397 | */ | 405 | */ |
| 398 | uint32_t pasid_mapping = (pasid == 0) ? 0 : | 406 | uint32_t pasid_mapping = (pasid == 0) ? 0 : (uint32_t)pasid | |
| 399 | (uint32_t)pasid | ATC_VMID_PASID_MAPPING_VALID; | 407 | ATC_VMID_PASID_MAPPING_VALID_MASK; |
| 400 | 408 | ||
| 401 | write_register(kgd, ATC_VMID0_PASID_MAPPING + vmid*sizeof(uint32_t), | 409 | write_register(kgd, ATC_VMID0_PASID_MAPPING + vmid*sizeof(uint32_t), |
| 402 | pasid_mapping); | 410 | pasid_mapping); |
| @@ -778,6 +786,32 @@ static uint32_t kgd_address_watch_get_offset(struct kgd_dev *kgd, | |||
| 778 | return watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + reg_offset]; | 786 | return watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + reg_offset]; |
| 779 | } | 787 | } |
| 780 | 788 | ||
| 789 | static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid) | ||
| 790 | { | ||
| 791 | uint32_t reg; | ||
| 792 | struct radeon_device *rdev = (struct radeon_device *) kgd; | ||
| 793 | |||
| 794 | reg = RREG32(ATC_VMID0_PASID_MAPPING + vmid*4); | ||
| 795 | return reg & ATC_VMID_PASID_MAPPING_VALID_MASK; | ||
| 796 | } | ||
| 797 | |||
| 798 | static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, | ||
| 799 | uint8_t vmid) | ||
| 800 | { | ||
| 801 | uint32_t reg; | ||
| 802 | struct radeon_device *rdev = (struct radeon_device *) kgd; | ||
| 803 | |||
| 804 | reg = RREG32(ATC_VMID0_PASID_MAPPING + vmid*4); | ||
| 805 | return reg & ATC_VMID_PASID_MAPPING_PASID_MASK; | ||
| 806 | } | ||
| 807 | |||
| 808 | static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid) | ||
| 809 | { | ||
| 810 | struct radeon_device *rdev = (struct radeon_device *) kgd; | ||
| 811 | |||
| 812 | return WREG32(VM_INVALIDATE_REQUEST, 1 << vmid); | ||
| 813 | } | ||
| 814 | |||
| 781 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) | 815 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) |
| 782 | { | 816 | { |
| 783 | struct radeon_device *rdev = (struct radeon_device *) kgd; | 817 | struct radeon_device *rdev = (struct radeon_device *) kgd; |
