drm/amdgpu: abstract set_vm_fault_masks function to refine the programming
This patch is to add set_vm_fault_masks helper to amdgpu_gmc to refine the original programming. Signed-off-by: Huang Rui <ray.huang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
5befb6fc3b
commit
f2c1b5c145
|
@ -411,3 +411,23 @@ void amdgpu_gmc_tmz_set(struct amdgpu_device *adev)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void amdgpu_gmc_set_vm_fault_masks(struct amdgpu_device *adev, int hub_type,
|
||||||
|
bool enable)
|
||||||
|
{
|
||||||
|
struct amdgpu_vmhub *hub;
|
||||||
|
u32 tmp, reg, i;
|
||||||
|
|
||||||
|
hub = &adev->vmhub[hub_type];
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
reg = hub->vm_context0_cntl + hub->ctx_distance * i;
|
||||||
|
|
||||||
|
tmp = RREG32(reg);
|
||||||
|
if (enable)
|
||||||
|
tmp |= hub->vm_cntx_cntl_vm_fault;
|
||||||
|
else
|
||||||
|
tmp &= ~hub->vm_cntx_cntl_vm_fault;
|
||||||
|
|
||||||
|
WREG32(reg, tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -291,4 +291,8 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev);
|
||||||
|
|
||||||
extern void amdgpu_gmc_tmz_set(struct amdgpu_device *adev);
|
extern void amdgpu_gmc_tmz_set(struct amdgpu_device *adev);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
amdgpu_gmc_set_vm_fault_masks(struct amdgpu_device *adev, int hub_type,
|
||||||
|
bool enable);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -62,63 +62,18 @@ gmc_v10_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
|
||||||
struct amdgpu_irq_src *src, unsigned type,
|
struct amdgpu_irq_src *src, unsigned type,
|
||||||
enum amdgpu_interrupt_state state)
|
enum amdgpu_interrupt_state state)
|
||||||
{
|
{
|
||||||
struct amdgpu_vmhub *hub;
|
|
||||||
u32 tmp, reg, bits[AMDGPU_MAX_VMHUBS], i;
|
|
||||||
|
|
||||||
bits[AMDGPU_GFXHUB_0] = GCVM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
GCVM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
GCVM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
GCVM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
GCVM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
GCVM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
GCVM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK;
|
|
||||||
|
|
||||||
bits[AMDGPU_MMHUB_0] = MMVM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
MMVM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
MMVM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
MMVM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
MMVM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
MMVM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
|
|
||||||
MMVM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK;
|
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case AMDGPU_IRQ_STATE_DISABLE:
|
case AMDGPU_IRQ_STATE_DISABLE:
|
||||||
/* MM HUB */
|
/* MM HUB */
|
||||||
hub = &adev->vmhub[AMDGPU_MMHUB_0];
|
amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, false);
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
reg = hub->vm_context0_cntl + hub->ctx_distance * i;
|
|
||||||
tmp = RREG32(reg);
|
|
||||||
tmp &= ~bits[AMDGPU_MMHUB_0];
|
|
||||||
WREG32(reg, tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GFX HUB */
|
/* GFX HUB */
|
||||||
hub = &adev->vmhub[AMDGPU_GFXHUB_0];
|
amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, false);
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
reg = hub->vm_context0_cntl + hub->ctx_distance * i;
|
|
||||||
tmp = RREG32(reg);
|
|
||||||
tmp &= ~bits[AMDGPU_GFXHUB_0];
|
|
||||||
WREG32(reg, tmp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case AMDGPU_IRQ_STATE_ENABLE:
|
case AMDGPU_IRQ_STATE_ENABLE:
|
||||||
/* MM HUB */
|
/* MM HUB */
|
||||||
hub = &adev->vmhub[AMDGPU_MMHUB_0];
|
amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, true);
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
reg = hub->vm_context0_cntl + hub->ctx_distance * i;
|
|
||||||
tmp = RREG32(reg);
|
|
||||||
tmp |= bits[AMDGPU_MMHUB_0];
|
|
||||||
WREG32(reg, tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GFX HUB */
|
/* GFX HUB */
|
||||||
hub = &adev->vmhub[AMDGPU_GFXHUB_0];
|
amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, true);
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
reg = hub->vm_context0_cntl + hub->ctx_distance * i;
|
|
||||||
tmp = RREG32(reg);
|
|
||||||
tmp |= bits[AMDGPU_GFXHUB_0];
|
|
||||||
WREG32(reg, tmp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue