@@ -2067,45 +2067,101 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
2067
2067
return ret ;
2068
2068
}
2069
2069
2070
+ static void sienna_cichlid_get_override_pcie_settings (struct smu_context * smu ,
2071
+ uint32_t * gen_speed_override ,
2072
+ uint32_t * lane_width_override )
2073
+ {
2074
+ struct amdgpu_device * adev = smu -> adev ;
2075
+
2076
+ * gen_speed_override = 0xff ;
2077
+ * lane_width_override = 0xff ;
2078
+
2079
+ switch (adev -> pdev -> device ) {
2080
+ case 0x73A0 :
2081
+ case 0x73A1 :
2082
+ case 0x73A2 :
2083
+ case 0x73A3 :
2084
+ case 0x73AB :
2085
+ case 0x73AE :
2086
+ /* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */
2087
+ * lane_width_override = 6 ;
2088
+ break ;
2089
+ case 0x73E0 :
2090
+ case 0x73E1 :
2091
+ case 0x73E3 :
2092
+ * lane_width_override = 4 ;
2093
+ break ;
2094
+ case 0x7420 :
2095
+ case 0x7421 :
2096
+ case 0x7422 :
2097
+ case 0x7423 :
2098
+ case 0x7424 :
2099
+ * lane_width_override = 3 ;
2100
+ break ;
2101
+ default :
2102
+ break ;
2103
+ }
2104
+ }
2105
+
2106
+ #define MAX (a , b ) ((a) > (b) ? (a) : (b))
2107
+
2070
2108
static int sienna_cichlid_update_pcie_parameters (struct smu_context * smu ,
2071
2109
uint32_t pcie_gen_cap ,
2072
2110
uint32_t pcie_width_cap )
2073
2111
{
2074
2112
struct smu_11_0_dpm_context * dpm_context = smu -> smu_dpm .dpm_context ;
2075
-
2076
- uint32_t smu_pcie_arg ;
2113
+ struct smu_11_0_pcie_table * pcie_table = & dpm_context -> dpm_tables . pcie_table ;
2114
+ uint32_t gen_speed_override , lane_width_override ;
2077
2115
uint8_t * table_member1 , * table_member2 ;
2116
+ uint32_t min_gen_speed , max_gen_speed ;
2117
+ uint32_t min_lane_width , max_lane_width ;
2118
+ uint32_t smu_pcie_arg ;
2078
2119
int ret , i ;
2079
2120
2080
2121
GET_PPTABLE_MEMBER (PcieGenSpeed , & table_member1 );
2081
2122
GET_PPTABLE_MEMBER (PcieLaneCount , & table_member2 );
2082
2123
2083
- /* lclk dpm table setup */
2084
- for (i = 0 ; i < MAX_PCIE_CONF ; i ++ ) {
2085
- dpm_context -> dpm_tables .pcie_table .pcie_gen [i ] = table_member1 [i ];
2086
- dpm_context -> dpm_tables .pcie_table .pcie_lane [i ] = table_member2 [i ];
2124
+ sienna_cichlid_get_override_pcie_settings (smu ,
2125
+ & gen_speed_override ,
2126
+ & lane_width_override );
2127
+
2128
+ /* PCIE gen speed override */
2129
+ if (gen_speed_override != 0xff ) {
2130
+ min_gen_speed = MIN (pcie_gen_cap , gen_speed_override );
2131
+ max_gen_speed = MIN (pcie_gen_cap , gen_speed_override );
2132
+ } else {
2133
+ min_gen_speed = MAX (0 , table_member1 [0 ]);
2134
+ max_gen_speed = MIN (pcie_gen_cap , table_member1 [1 ]);
2135
+ min_gen_speed = min_gen_speed > max_gen_speed ?
2136
+ max_gen_speed : min_gen_speed ;
2087
2137
}
2138
+ pcie_table -> pcie_gen [0 ] = min_gen_speed ;
2139
+ pcie_table -> pcie_gen [1 ] = max_gen_speed ;
2140
+
2141
+ /* PCIE lane width override */
2142
+ if (lane_width_override != 0xff ) {
2143
+ min_lane_width = MIN (pcie_width_cap , lane_width_override );
2144
+ max_lane_width = MIN (pcie_width_cap , lane_width_override );
2145
+ } else {
2146
+ min_lane_width = MAX (1 , table_member2 [0 ]);
2147
+ max_lane_width = MIN (pcie_width_cap , table_member2 [1 ]);
2148
+ min_lane_width = min_lane_width > max_lane_width ?
2149
+ max_lane_width : min_lane_width ;
2150
+ }
2151
+ pcie_table -> pcie_lane [0 ] = min_lane_width ;
2152
+ pcie_table -> pcie_lane [1 ] = max_lane_width ;
2088
2153
2089
2154
for (i = 0 ; i < NUM_LINK_LEVELS ; i ++ ) {
2090
- smu_pcie_arg = (i << 16 ) |
2091
- ((table_member1 [i ] <= pcie_gen_cap ) ?
2092
- (table_member1 [i ] << 8 ) :
2093
- (pcie_gen_cap << 8 )) |
2094
- ((table_member2 [i ] <= pcie_width_cap ) ?
2095
- table_member2 [i ] :
2096
- pcie_width_cap );
2155
+ smu_pcie_arg = (i << 16 |
2156
+ pcie_table -> pcie_gen [i ] << 8 |
2157
+ pcie_table -> pcie_lane [i ]);
2097
2158
2098
2159
ret = smu_cmn_send_smc_msg_with_param (smu ,
2099
2160
SMU_MSG_OverridePcieParameters ,
2100
2161
smu_pcie_arg ,
2101
2162
NULL );
2102
2163
if (ret )
2103
2164
return ret ;
2104
-
2105
- if (table_member1 [i ] > pcie_gen_cap )
2106
- dpm_context -> dpm_tables .pcie_table .pcie_gen [i ] = pcie_gen_cap ;
2107
- if (table_member2 [i ] > pcie_width_cap )
2108
- dpm_context -> dpm_tables .pcie_table .pcie_lane [i ] = pcie_width_cap ;
2109
2165
}
2110
2166
2111
2167
return 0 ;
0 commit comments