diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 111 |
1 files changed, 95 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 793b1470284d..a296f7bbe57c 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c | |||
@@ -1023,22 +1023,101 @@ static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = | |||
1023 | {mmPA_SC_RASTER_CONFIG_1, true}, | 1023 | {mmPA_SC_RASTER_CONFIG_1, true}, |
1024 | }; | 1024 | }; |
1025 | 1025 | ||
1026 | static uint32_t cik_read_indexed_register(struct amdgpu_device *adev, | 1026 | |
1027 | u32 se_num, u32 sh_num, | 1027 | static uint32_t cik_get_register_value(struct amdgpu_device *adev, |
1028 | u32 reg_offset) | 1028 | bool indexed, u32 se_num, |
1029 | u32 sh_num, u32 reg_offset) | ||
1029 | { | 1030 | { |
1030 | uint32_t val; | 1031 | if (indexed) { |
1032 | uint32_t val; | ||
1033 | unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; | ||
1034 | unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; | ||
1035 | |||
1036 | switch (reg_offset) { | ||
1037 | case mmCC_RB_BACKEND_DISABLE: | ||
1038 | return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; | ||
1039 | case mmGC_USER_RB_BACKEND_DISABLE: | ||
1040 | return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; | ||
1041 | case mmPA_SC_RASTER_CONFIG: | ||
1042 | return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; | ||
1043 | case mmPA_SC_RASTER_CONFIG_1: | ||
1044 | return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1; | ||
1045 | } | ||
1031 | 1046 | ||
1032 | mutex_lock(&adev->grbm_idx_mutex); | 1047 | mutex_lock(&adev->grbm_idx_mutex); |
1033 | if (se_num != 0xffffffff || sh_num != 0xffffffff) | 1048 | if (se_num != 0xffffffff || sh_num != 0xffffffff) |
1034 | amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); | 1049 | amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); |
1035 | 1050 | ||
1036 | val = RREG32(reg_offset); | 1051 | val = RREG32(reg_offset); |
1037 | 1052 | ||
1038 | if (se_num != 0xffffffff || sh_num != 0xffffffff) | 1053 | if (se_num != 0xffffffff || sh_num != 0xffffffff) |
1039 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | 1054 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
1040 | mutex_unlock(&adev->grbm_idx_mutex); | 1055 | mutex_unlock(&adev->grbm_idx_mutex); |
1041 | return val; | 1056 | return val; |
1057 | } else { | ||
1058 | unsigned idx; | ||
1059 | |||
1060 | switch (reg_offset) { | ||
1061 | case mmGB_ADDR_CONFIG: | ||
1062 | return adev->gfx.config.gb_addr_config; | ||
1063 | case mmMC_ARB_RAMCFG: | ||
1064 | return adev->gfx.config.mc_arb_ramcfg; | ||
1065 | case mmGB_TILE_MODE0: | ||
1066 | case mmGB_TILE_MODE1: | ||
1067 | case mmGB_TILE_MODE2: | ||
1068 | case mmGB_TILE_MODE3: | ||
1069 | case mmGB_TILE_MODE4: | ||
1070 | case mmGB_TILE_MODE5: | ||
1071 | case mmGB_TILE_MODE6: | ||
1072 | case mmGB_TILE_MODE7: | ||
1073 | case mmGB_TILE_MODE8: | ||
1074 | case mmGB_TILE_MODE9: | ||
1075 | case mmGB_TILE_MODE10: | ||
1076 | case mmGB_TILE_MODE11: | ||
1077 | case mmGB_TILE_MODE12: | ||
1078 | case mmGB_TILE_MODE13: | ||
1079 | case mmGB_TILE_MODE14: | ||
1080 | case mmGB_TILE_MODE15: | ||
1081 | case mmGB_TILE_MODE16: | ||
1082 | case mmGB_TILE_MODE17: | ||
1083 | case mmGB_TILE_MODE18: | ||
1084 | case mmGB_TILE_MODE19: | ||
1085 | case mmGB_TILE_MODE20: | ||
1086 | case mmGB_TILE_MODE21: | ||
1087 | case mmGB_TILE_MODE22: | ||
1088 | case mmGB_TILE_MODE23: | ||
1089 | case mmGB_TILE_MODE24: | ||
1090 | case mmGB_TILE_MODE25: | ||
1091 | case mmGB_TILE_MODE26: | ||
1092 | case mmGB_TILE_MODE27: | ||
1093 | case mmGB_TILE_MODE28: | ||
1094 | case mmGB_TILE_MODE29: | ||
1095 | case mmGB_TILE_MODE30: | ||
1096 | case mmGB_TILE_MODE31: | ||
1097 | idx = (reg_offset - mmGB_TILE_MODE0); | ||
1098 | return adev->gfx.config.tile_mode_array[idx]; | ||
1099 | case mmGB_MACROTILE_MODE0: | ||
1100 | case mmGB_MACROTILE_MODE1: | ||
1101 | case mmGB_MACROTILE_MODE2: | ||
1102 | case mmGB_MACROTILE_MODE3: | ||
1103 | case mmGB_MACROTILE_MODE4: | ||
1104 | case mmGB_MACROTILE_MODE5: | ||
1105 | case mmGB_MACROTILE_MODE6: | ||
1106 | case mmGB_MACROTILE_MODE7: | ||
1107 | case mmGB_MACROTILE_MODE8: | ||
1108 | case mmGB_MACROTILE_MODE9: | ||
1109 | case mmGB_MACROTILE_MODE10: | ||
1110 | case mmGB_MACROTILE_MODE11: | ||
1111 | case mmGB_MACROTILE_MODE12: | ||
1112 | case mmGB_MACROTILE_MODE13: | ||
1113 | case mmGB_MACROTILE_MODE14: | ||
1114 | case mmGB_MACROTILE_MODE15: | ||
1115 | idx = (reg_offset - mmGB_MACROTILE_MODE0); | ||
1116 | return adev->gfx.config.macrotile_mode_array[idx]; | ||
1117 | default: | ||
1118 | return RREG32(reg_offset); | ||
1119 | } | ||
1120 | } | ||
1042 | } | 1121 | } |
1043 | 1122 | ||
1044 | static int cik_read_register(struct amdgpu_device *adev, u32 se_num, | 1123 | static int cik_read_register(struct amdgpu_device *adev, u32 se_num, |
@@ -1048,13 +1127,13 @@ static int cik_read_register(struct amdgpu_device *adev, u32 se_num, | |||
1048 | 1127 | ||
1049 | *value = 0; | 1128 | *value = 0; |
1050 | for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) { | 1129 | for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) { |
1130 | bool indexed = cik_allowed_read_registers[i].grbm_indexed; | ||
1131 | |||
1051 | if (reg_offset != cik_allowed_read_registers[i].reg_offset) | 1132 | if (reg_offset != cik_allowed_read_registers[i].reg_offset) |
1052 | continue; | 1133 | continue; |
1053 | 1134 | ||
1054 | *value = cik_allowed_read_registers[i].grbm_indexed ? | 1135 | *value = cik_get_register_value(adev, indexed, se_num, sh_num, |
1055 | cik_read_indexed_register(adev, se_num, | 1136 | reg_offset); |
1056 | sh_num, reg_offset) : | ||
1057 | RREG32(reg_offset); | ||
1058 | return 0; | 1137 | return 0; |
1059 | } | 1138 | } |
1060 | return -EINVAL; | 1139 | return -EINVAL; |