diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
| -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; |
