diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si.c | 90 |
1 files changed, 73 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c index da46992f7b18..b71e3faa40db 100644 --- a/drivers/gpu/drm/amd/amdgpu/si.c +++ b/drivers/gpu/drm/amd/amdgpu/si.c | |||
@@ -1010,24 +1010,81 @@ static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = { | |||
1010 | {PA_SC_RASTER_CONFIG, false, true}, | 1010 | {PA_SC_RASTER_CONFIG, false, true}, |
1011 | }; | 1011 | }; |
1012 | 1012 | ||
1013 | static uint32_t si_read_indexed_register(struct amdgpu_device *adev, | 1013 | static uint32_t si_get_register_value(struct amdgpu_device *adev, |
1014 | u32 se_num, u32 sh_num, | 1014 | bool indexed, u32 se_num, |
1015 | u32 reg_offset) | 1015 | u32 sh_num, u32 reg_offset) |
1016 | { | 1016 | { |
1017 | uint32_t val; | 1017 | if (indexed) { |
1018 | uint32_t val; | ||
1019 | unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; | ||
1020 | unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; | ||
1021 | |||
1022 | switch (reg_offset) { | ||
1023 | case mmCC_RB_BACKEND_DISABLE: | ||
1024 | return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; | ||
1025 | case mmGC_USER_RB_BACKEND_DISABLE: | ||
1026 | return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; | ||
1027 | case mmPA_SC_RASTER_CONFIG: | ||
1028 | return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; | ||
1029 | } | ||
1018 | 1030 | ||
1019 | mutex_lock(&adev->grbm_idx_mutex); | 1031 | mutex_lock(&adev->grbm_idx_mutex); |
1020 | if (se_num != 0xffffffff || sh_num != 0xffffffff) | 1032 | if (se_num != 0xffffffff || sh_num != 0xffffffff) |
1021 | amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); | 1033 | amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); |
1022 | 1034 | ||
1023 | val = RREG32(reg_offset); | 1035 | val = RREG32(reg_offset); |
1024 | 1036 | ||
1025 | if (se_num != 0xffffffff || sh_num != 0xffffffff) | 1037 | if (se_num != 0xffffffff || sh_num != 0xffffffff) |
1026 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | 1038 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
1027 | mutex_unlock(&adev->grbm_idx_mutex); | 1039 | mutex_unlock(&adev->grbm_idx_mutex); |
1028 | return val; | 1040 | return val; |
1041 | } else { | ||
1042 | unsigned idx; | ||
1043 | |||
1044 | switch (reg_offset) { | ||
1045 | case mmGB_ADDR_CONFIG: | ||
1046 | return adev->gfx.config.gb_addr_config; | ||
1047 | case mmMC_ARB_RAMCFG: | ||
1048 | return adev->gfx.config.mc_arb_ramcfg; | ||
1049 | case mmGB_TILE_MODE0: | ||
1050 | case mmGB_TILE_MODE1: | ||
1051 | case mmGB_TILE_MODE2: | ||
1052 | case mmGB_TILE_MODE3: | ||
1053 | case mmGB_TILE_MODE4: | ||
1054 | case mmGB_TILE_MODE5: | ||
1055 | case mmGB_TILE_MODE6: | ||
1056 | case mmGB_TILE_MODE7: | ||
1057 | case mmGB_TILE_MODE8: | ||
1058 | case mmGB_TILE_MODE9: | ||
1059 | case mmGB_TILE_MODE10: | ||
1060 | case mmGB_TILE_MODE11: | ||
1061 | case mmGB_TILE_MODE12: | ||
1062 | case mmGB_TILE_MODE13: | ||
1063 | case mmGB_TILE_MODE14: | ||
1064 | case mmGB_TILE_MODE15: | ||
1065 | case mmGB_TILE_MODE16: | ||
1066 | case mmGB_TILE_MODE17: | ||
1067 | case mmGB_TILE_MODE18: | ||
1068 | case mmGB_TILE_MODE19: | ||
1069 | case mmGB_TILE_MODE20: | ||
1070 | case mmGB_TILE_MODE21: | ||
1071 | case mmGB_TILE_MODE22: | ||
1072 | case mmGB_TILE_MODE23: | ||
1073 | case mmGB_TILE_MODE24: | ||
1074 | case mmGB_TILE_MODE25: | ||
1075 | case mmGB_TILE_MODE26: | ||
1076 | case mmGB_TILE_MODE27: | ||
1077 | case mmGB_TILE_MODE28: | ||
1078 | case mmGB_TILE_MODE29: | ||
1079 | case mmGB_TILE_MODE30: | ||
1080 | case mmGB_TILE_MODE31: | ||
1081 | idx = (reg_offset - mmGB_TILE_MODE0); | ||
1082 | return adev->gfx.config.tile_mode_array[idx]; | ||
1083 | default: | ||
1084 | return RREG32(reg_offset); | ||
1085 | } | ||
1086 | } | ||
1029 | } | 1087 | } |
1030 | |||
1031 | static int si_read_register(struct amdgpu_device *adev, u32 se_num, | 1088 | static int si_read_register(struct amdgpu_device *adev, u32 se_num, |
1032 | u32 sh_num, u32 reg_offset, u32 *value) | 1089 | u32 sh_num, u32 reg_offset, u32 *value) |
1033 | { | 1090 | { |
@@ -1039,10 +1096,9 @@ static int si_read_register(struct amdgpu_device *adev, u32 se_num, | |||
1039 | continue; | 1096 | continue; |
1040 | 1097 | ||
1041 | if (!si_allowed_read_registers[i].untouched) | 1098 | if (!si_allowed_read_registers[i].untouched) |
1042 | *value = si_allowed_read_registers[i].grbm_indexed ? | 1099 | *value = si_get_register_value(adev, |
1043 | si_read_indexed_register(adev, se_num, | 1100 | si_allowed_read_registers[i].grbm_indexed, |
1044 | sh_num, reg_offset) : | 1101 | se_num, sh_num, reg_offset); |
1045 | RREG32(reg_offset); | ||
1046 | return 0; | 1102 | return 0; |
1047 | } | 1103 | } |
1048 | return -EINVAL; | 1104 | return -EINVAL; |