@@ -2067,45 +2067,101 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
20672067 return ret ;
20682068}
20692069
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+
20702108static int sienna_cichlid_update_pcie_parameters (struct smu_context * smu ,
20712109 uint32_t pcie_gen_cap ,
20722110 uint32_t pcie_width_cap )
20732111{
20742112 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 ;
20772115 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 ;
20782119 int ret , i ;
20792120
20802121 GET_PPTABLE_MEMBER (PcieGenSpeed , & table_member1 );
20812122 GET_PPTABLE_MEMBER (PcieLaneCount , & table_member2 );
20822123
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 ;
20872137 }
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 ;
20882153
20892154 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 ]);
20972158
20982159 ret = smu_cmn_send_smc_msg_with_param (smu ,
20992160 SMU_MSG_OverridePcieParameters ,
21002161 smu_pcie_arg ,
21012162 NULL );
21022163 if (ret )
21032164 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 ;
21092165 }
21102166
21112167 return 0 ;
0 commit comments