@@ -2077,89 +2077,36 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
20772077 return ret ;
20782078}
20792079
2080- static void sienna_cichlid_get_override_pcie_settings (struct smu_context * smu ,
2081- uint32_t * gen_speed_override ,
2082- uint32_t * lane_width_override )
2083- {
2084- struct amdgpu_device * adev = smu -> adev ;
2085-
2086- * gen_speed_override = 0xff ;
2087- * lane_width_override = 0xff ;
2088-
2089- switch (adev -> pdev -> device ) {
2090- case 0x73A0 :
2091- case 0x73A1 :
2092- case 0x73A2 :
2093- case 0x73A3 :
2094- case 0x73AB :
2095- case 0x73AE :
2096- /* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */
2097- * lane_width_override = 6 ;
2098- break ;
2099- case 0x73E0 :
2100- case 0x73E1 :
2101- case 0x73E3 :
2102- * lane_width_override = 4 ;
2103- break ;
2104- case 0x7420 :
2105- case 0x7421 :
2106- case 0x7422 :
2107- case 0x7423 :
2108- case 0x7424 :
2109- * lane_width_override = 3 ;
2110- break ;
2111- default :
2112- break ;
2113- }
2114- }
2115-
2116- #define MAX (a , b ) ((a) > (b) ? (a) : (b))
2117-
21182080static int sienna_cichlid_update_pcie_parameters (struct smu_context * smu ,
21192081 uint32_t pcie_gen_cap ,
21202082 uint32_t pcie_width_cap )
21212083{
21222084 struct smu_11_0_dpm_context * dpm_context = smu -> smu_dpm .dpm_context ;
21232085 struct smu_11_0_pcie_table * pcie_table = & dpm_context -> dpm_tables .pcie_table ;
2124- uint32_t gen_speed_override , lane_width_override ;
2125- uint8_t * table_member1 , * table_member2 ;
2126- uint32_t min_gen_speed , max_gen_speed ;
2127- uint32_t min_lane_width , max_lane_width ;
2128- uint32_t smu_pcie_arg ;
2086+ u32 smu_pcie_arg ;
21292087 int ret , i ;
21302088
2131- GET_PPTABLE_MEMBER (PcieGenSpeed , & table_member1 );
2132- GET_PPTABLE_MEMBER (PcieLaneCount , & table_member2 );
2133-
2134- sienna_cichlid_get_override_pcie_settings (smu ,
2135- & gen_speed_override ,
2136- & lane_width_override );
2089+ /* PCIE gen speed and lane width override */
2090+ if (!amdgpu_device_pcie_dynamic_switching_supported ()) {
2091+ if (pcie_table -> pcie_gen [NUM_LINK_LEVELS - 1 ] < pcie_gen_cap )
2092+ pcie_gen_cap = pcie_table -> pcie_gen [NUM_LINK_LEVELS - 1 ];
21372093
2138- /* PCIE gen speed override */
2139- if (gen_speed_override != 0xff ) {
2140- min_gen_speed = MIN (pcie_gen_cap , gen_speed_override );
2141- max_gen_speed = MIN (pcie_gen_cap , gen_speed_override );
2142- } else {
2143- min_gen_speed = MAX (0 , table_member1 [0 ]);
2144- max_gen_speed = MIN (pcie_gen_cap , table_member1 [1 ]);
2145- min_gen_speed = min_gen_speed > max_gen_speed ?
2146- max_gen_speed : min_gen_speed ;
2147- }
2148- pcie_table -> pcie_gen [0 ] = min_gen_speed ;
2149- pcie_table -> pcie_gen [1 ] = max_gen_speed ;
2094+ if (pcie_table -> pcie_lane [NUM_LINK_LEVELS - 1 ] < pcie_width_cap )
2095+ pcie_width_cap = pcie_table -> pcie_lane [NUM_LINK_LEVELS - 1 ];
21502096
2151- /* PCIE lane width override */
2152- if (lane_width_override != 0xff ) {
2153- min_lane_width = MIN (pcie_width_cap , lane_width_override );
2154- max_lane_width = MIN (pcie_width_cap , lane_width_override );
2097+ /* Force all levels to use the same settings */
2098+ for (i = 0 ; i < NUM_LINK_LEVELS ; i ++ ) {
2099+ pcie_table -> pcie_gen [i ] = pcie_gen_cap ;
2100+ pcie_table -> pcie_lane [i ] = pcie_width_cap ;
2101+ }
21552102 } else {
2156- min_lane_width = MAX (1 , table_member2 [0 ]);
2157- max_lane_width = MIN (pcie_width_cap , table_member2 [1 ]);
2158- min_lane_width = min_lane_width > max_lane_width ?
2159- max_lane_width : min_lane_width ;
2103+ for (i = 0 ; i < NUM_LINK_LEVELS ; i ++ ) {
2104+ if (pcie_table -> pcie_gen [i ] > pcie_gen_cap )
2105+ pcie_table -> pcie_gen [i ] = pcie_gen_cap ;
2106+ if (pcie_table -> pcie_lane [i ] > pcie_width_cap )
2107+ pcie_table -> pcie_lane [i ] = pcie_width_cap ;
2108+ }
21602109 }
2161- pcie_table -> pcie_lane [0 ] = min_lane_width ;
2162- pcie_table -> pcie_lane [1 ] = max_lane_width ;
21632110
21642111 for (i = 0 ; i < NUM_LINK_LEVELS ; i ++ ) {
21652112 smu_pcie_arg = (i << 16 |
@@ -3842,7 +3789,6 @@ static int sienna_cichlid_i2c_xfer(struct i2c_adapter *i2c_adap,
38423789 }
38433790 mutex_lock (& adev -> pm .mutex );
38443791 r = smu_cmn_update_table (smu , SMU_TABLE_I2C_COMMANDS , 0 , req , true);
3845- mutex_unlock (& adev -> pm .mutex );
38463792 if (r )
38473793 goto fail ;
38483794
@@ -3859,6 +3805,7 @@ static int sienna_cichlid_i2c_xfer(struct i2c_adapter *i2c_adap,
38593805 }
38603806 r = num_msgs ;
38613807fail :
3808+ mutex_unlock (& adev -> pm .mutex );
38623809 kfree (req );
38633810 return r ;
38643811}
0 commit comments