aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlexey Skidanov <Alexey.Skidanov@amd.com>2015-05-19 12:25:01 -0400
committerOded Gabbay <oded.gabbay@gmail.com>2015-06-03 04:34:46 -0400
commitedad40239ffcaafd7eb56e4060d472aa5af2df21 (patch)
treef84acc8cabbce7fcd815c5f95991949ee0805f6e /drivers
parentf8bd13338a9a42358158954251969e66934ec3d1 (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.h8
-rw-r--r--drivers/gpu/drm/radeon/cikd.h9
-rw-r--r--drivers/gpu/drm/radeon/radeon_kfd.c38
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
102static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid);
103static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
104 uint8_t vmid);
105static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
106
102static const struct kfd2kgd_calls kfd2kgd = { 107static 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
789static 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
798static 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
808static 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
781static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) 815static 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;