提交 afe00ca0 编写于 作者: X Xiong Aifei 提交者: guzitao

sw64: gpu: correct low-level mmio memset/memcpy direct calls

Sunway inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5GDKC

--------------------------------

Driver codes of the direct calls, via the SIMD-optimized memset
and memcpy functions, may raise DFAULT when using RX580 or R7
Series graphics card on sw64, so work around 'memset' references
to '_memset_c_io' and 'memcpy' to 'memcpy_fromio'.
Signed-off-by: NXiong Aifei <xiongaifei@wxiat.com>
Signed-off-by: NGu Zitao <guzitao@wxiat.com>
上级 42518209
...@@ -1354,7 +1354,11 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev) ...@@ -1354,7 +1354,11 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev)
return r; return r;
} }
#if IS_ENABLED(CONFIG_SW64)
_memset_c_io(hpd, 0, mec_hpd_size);
#else
memset(hpd, 0, mec_hpd_size); memset(hpd, 0, mec_hpd_size);
#endif
amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj); amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj);
amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj); amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj);
...@@ -4649,7 +4653,11 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring) ...@@ -4649,7 +4653,11 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
vi_srbm_select(adev, 0, 0, 0, 0); vi_srbm_select(adev, 0, 0, 0, 0);
mutex_unlock(&adev->srbm_mutex); mutex_unlock(&adev->srbm_mutex);
} else { } else {
#if IS_ENABLED(CONFIG_SW64)
_memset_c_io((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
#else
memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation)); memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
#endif
((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF; ((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF; ((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
mutex_lock(&adev->srbm_mutex); mutex_lock(&adev->srbm_mutex);
...@@ -4660,7 +4668,11 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring) ...@@ -4660,7 +4668,11 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
mutex_unlock(&adev->srbm_mutex); mutex_unlock(&adev->srbm_mutex);
if (adev->gfx.mec.mqd_backup[mqd_idx]) if (adev->gfx.mec.mqd_backup[mqd_idx])
#if IS_ENABLED(CONFIG_SW64)
memcpy_fromio(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation));
#else
memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation));
#endif
} }
return 0; return 0;
......
...@@ -193,8 +193,13 @@ int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data) ...@@ -193,8 +193,13 @@ int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data)
data[3] = sign->val[i].nonce[3]; data[3] = sign->val[i].nonce[3];
data[4] = cpu_to_le32(le32_to_cpu(sign->len) + 64); data[4] = cpu_to_le32(le32_to_cpu(sign->len) + 64);
#if IS_ENABLED(CONFIG_SW64)
memset_io(&data[5], 0, 44);
memcpy_toio(&data[16], &sign[1], rdev->vce_fw->size - sizeof(*sign));
#else
memset(&data[5], 0, 44); memset(&data[5], 0, 44);
memcpy(&data[16], &sign[1], rdev->vce_fw->size - sizeof(*sign)); memcpy(&data[16], &sign[1], rdev->vce_fw->size - sizeof(*sign));
#endif
data += (le32_to_cpu(sign->len) + 64) / 4; data += (le32_to_cpu(sign->len) + 64) / 4;
data[0] = sign->val[i].sigval[0]; data[0] = sign->val[i].sigval[0];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册