diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 128 |
1 files changed, 112 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 567c4a5cf90c..a296f7bbe57c 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c | |||
@@ -65,6 +65,7 @@ | |||
65 | #include "oss/oss_2_0_d.h" | 65 | #include "oss/oss_2_0_d.h" |
66 | #include "oss/oss_2_0_sh_mask.h" | 66 | #include "oss/oss_2_0_sh_mask.h" |
67 | 67 | ||
68 | #include "amdgpu_dm.h" | ||
68 | #include "amdgpu_amdkfd.h" | 69 | #include "amdgpu_amdkfd.h" |
69 | #include "amdgpu_powerplay.h" | 70 | #include "amdgpu_powerplay.h" |
70 | #include "dce_virtual.h" | 71 | #include "dce_virtual.h" |
@@ -1022,22 +1023,101 @@ static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = | |||
1022 | {mmPA_SC_RASTER_CONFIG_1, true}, | 1023 | {mmPA_SC_RASTER_CONFIG_1, true}, |
1023 | }; | 1024 | }; |
1024 | 1025 | ||
1025 | static uint32_t cik_read_indexed_register(struct amdgpu_device *adev, | 1026 | |
1026 | u32 se_num, u32 sh_num, | 1027 | static uint32_t cik_get_register_value(struct amdgpu_device *adev, |
1027 | u32 reg_offset) | 1028 | bool indexed, u32 se_num, |
1029 | u32 sh_num, u32 reg_offset) | ||
1028 | { | 1030 | { |
1029 | 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 | } | ||
1030 | 1046 | ||
1031 | mutex_lock(&adev->grbm_idx_mutex); | 1047 | mutex_lock(&adev->grbm_idx_mutex); |
1032 | if (se_num != 0xffffffff || sh_num != 0xffffffff) | 1048 | if (se_num != 0xffffffff || sh_num != 0xffffffff) |
1033 | amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); | 1049 | amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); |
1034 | 1050 | ||
1035 | val = RREG32(reg_offset); | 1051 | val = RREG32(reg_offset); |
1036 | 1052 | ||
1037 | if (se_num != 0xffffffff || sh_num != 0xffffffff) | 1053 | if (se_num != 0xffffffff || sh_num != 0xffffffff) |
1038 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | 1054 | amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
1039 | mutex_unlock(&adev->grbm_idx_mutex); | 1055 | mutex_unlock(&adev->grbm_idx_mutex); |
1040 | 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 | } | ||
1041 | } | 1121 | } |
1042 | 1122 | ||
1043 | 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, |
@@ -1047,13 +1127,13 @@ static int cik_read_register(struct amdgpu_device *adev, u32 se_num, | |||
1047 | 1127 | ||
1048 | *value = 0; | 1128 | *value = 0; |
1049 | 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 | |||
1050 | if (reg_offset != cik_allowed_read_registers[i].reg_offset) | 1132 | if (reg_offset != cik_allowed_read_registers[i].reg_offset) |
1051 | continue; | 1133 | continue; |
1052 | 1134 | ||
1053 | *value = cik_allowed_read_registers[i].grbm_indexed ? | 1135 | *value = cik_get_register_value(adev, indexed, se_num, sh_num, |
1054 | cik_read_indexed_register(adev, se_num, | 1136 | reg_offset); |
1055 | sh_num, reg_offset) : | ||
1056 | RREG32(reg_offset); | ||
1057 | return 0; | 1137 | return 0; |
1058 | } | 1138 | } |
1059 | return -EINVAL; | 1139 | return -EINVAL; |
@@ -1900,6 +1980,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev) | |||
1900 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); | 1980 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); |
1901 | if (adev->enable_virtual_display) | 1981 | if (adev->enable_virtual_display) |
1902 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); | 1982 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); |
1983 | #if defined(CONFIG_DRM_AMD_DC) | ||
1984 | else if (amdgpu_device_has_dc_support(adev)) | ||
1985 | amdgpu_ip_block_add(adev, &dm_ip_block); | ||
1986 | #endif | ||
1903 | else | 1987 | else |
1904 | amdgpu_ip_block_add(adev, &dce_v8_2_ip_block); | 1988 | amdgpu_ip_block_add(adev, &dce_v8_2_ip_block); |
1905 | amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); | 1989 | amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); |
@@ -1914,6 +1998,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev) | |||
1914 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); | 1998 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); |
1915 | if (adev->enable_virtual_display) | 1999 | if (adev->enable_virtual_display) |
1916 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); | 2000 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); |
2001 | #if defined(CONFIG_DRM_AMD_DC) | ||
2002 | else if (amdgpu_device_has_dc_support(adev)) | ||
2003 | amdgpu_ip_block_add(adev, &dm_ip_block); | ||
2004 | #endif | ||
1917 | else | 2005 | else |
1918 | amdgpu_ip_block_add(adev, &dce_v8_5_ip_block); | 2006 | amdgpu_ip_block_add(adev, &dce_v8_5_ip_block); |
1919 | amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block); | 2007 | amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block); |
@@ -1928,6 +2016,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev) | |||
1928 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); | 2016 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); |
1929 | if (adev->enable_virtual_display) | 2017 | if (adev->enable_virtual_display) |
1930 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); | 2018 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); |
2019 | #if defined(CONFIG_DRM_AMD_DC) | ||
2020 | else if (amdgpu_device_has_dc_support(adev)) | ||
2021 | amdgpu_ip_block_add(adev, &dm_ip_block); | ||
2022 | #endif | ||
1931 | else | 2023 | else |
1932 | amdgpu_ip_block_add(adev, &dce_v8_1_ip_block); | 2024 | amdgpu_ip_block_add(adev, &dce_v8_1_ip_block); |
1933 | amdgpu_ip_block_add(adev, &gfx_v7_1_ip_block); | 2025 | amdgpu_ip_block_add(adev, &gfx_v7_1_ip_block); |
@@ -1943,6 +2035,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev) | |||
1943 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); | 2035 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); |
1944 | if (adev->enable_virtual_display) | 2036 | if (adev->enable_virtual_display) |
1945 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); | 2037 | amdgpu_ip_block_add(adev, &dce_virtual_ip_block); |
2038 | #if defined(CONFIG_DRM_AMD_DC) | ||
2039 | else if (amdgpu_device_has_dc_support(adev)) | ||
2040 | amdgpu_ip_block_add(adev, &dm_ip_block); | ||
2041 | #endif | ||
1946 | else | 2042 | else |
1947 | amdgpu_ip_block_add(adev, &dce_v8_3_ip_block); | 2043 | amdgpu_ip_block_add(adev, &dce_v8_3_ip_block); |
1948 | amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); | 2044 | amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); |