@@ -477,10 +477,15 @@ struct smu_feature_bits {
477477 DECLARE_BITMAP (bits , SMU_FEATURE_MAX );
478478};
479479
480+ enum smu_feature_list {
481+ SMU_FEATURE_LIST_SUPPORTED ,
482+ SMU_FEATURE_LIST_ALLOWED ,
483+ SMU_FEATURE_LIST_MAX ,
484+ };
485+
480486struct smu_feature {
481487 uint32_t feature_num ;
482- DECLARE_BITMAP (supported , SMU_FEATURE_MAX );
483- DECLARE_BITMAP (allowed , SMU_FEATURE_MAX );
488+ struct smu_feature_bits bits [SMU_FEATURE_LIST_MAX ];
484489};
485490
486491struct smu_clocks {
@@ -2055,4 +2060,99 @@ static inline void smu_feature_bits_or(struct smu_feature_bits *dst,
20552060 bitmap_or (dst -> bits , src1 -> bits , src2 , nbits );
20562061}
20572062
2063+ static inline struct smu_feature_bits *
2064+ __smu_feature_get_list (struct smu_context * smu , enum smu_feature_list list )
2065+ {
2066+ if (unlikely (list >= SMU_FEATURE_LIST_MAX )) {
2067+ dev_warn (smu -> adev -> dev , "Invalid feature list: %d\n" , list );
2068+ return & smu -> smu_feature .bits [SMU_FEATURE_LIST_SUPPORTED ];
2069+ }
2070+
2071+ return & smu -> smu_feature .bits [list ];
2072+ }
2073+
2074+ static inline bool smu_feature_list_is_set (struct smu_context * smu ,
2075+ enum smu_feature_list list ,
2076+ unsigned int bit )
2077+ {
2078+ if (bit >= smu -> smu_feature .feature_num )
2079+ return false;
2080+
2081+ return smu_feature_bits_is_set (__smu_feature_get_list (smu , list ), bit );
2082+ }
2083+
2084+ static inline void smu_feature_list_set_bit (struct smu_context * smu ,
2085+ enum smu_feature_list list ,
2086+ unsigned int bit )
2087+ {
2088+ if (bit >= smu -> smu_feature .feature_num )
2089+ return ;
2090+
2091+ smu_feature_bits_set_bit (__smu_feature_get_list (smu , list ), bit );
2092+ }
2093+
2094+ static inline void smu_feature_list_clear_bit (struct smu_context * smu ,
2095+ enum smu_feature_list list ,
2096+ unsigned int bit )
2097+ {
2098+ if (bit >= smu -> smu_feature .feature_num )
2099+ return ;
2100+
2101+ smu_feature_bits_clear_bit (__smu_feature_get_list (smu , list ), bit );
2102+ }
2103+
2104+ static inline void smu_feature_list_set_all (struct smu_context * smu ,
2105+ enum smu_feature_list list )
2106+ {
2107+ smu_feature_bits_fill (__smu_feature_get_list (smu , list ));
2108+ }
2109+
2110+ static inline void smu_feature_list_clear_all (struct smu_context * smu ,
2111+ enum smu_feature_list list )
2112+ {
2113+ smu_feature_bits_clearall (__smu_feature_get_list (smu , list ));
2114+ }
2115+
2116+ static inline bool smu_feature_list_is_empty (struct smu_context * smu ,
2117+ enum smu_feature_list list )
2118+ {
2119+ return smu_feature_bits_empty (__smu_feature_get_list (smu , list ),
2120+ smu -> smu_feature .feature_num );
2121+ }
2122+
2123+ static inline void smu_feature_list_set_bits (struct smu_context * smu ,
2124+ enum smu_feature_list dst_list ,
2125+ const unsigned long * src )
2126+ {
2127+ smu_feature_bits_copy (__smu_feature_get_list (smu , dst_list ), src ,
2128+ smu -> smu_feature .feature_num );
2129+ }
2130+
2131+ static inline void smu_feature_list_add_bits (struct smu_context * smu ,
2132+ enum smu_feature_list list ,
2133+ const unsigned long * src )
2134+ {
2135+ struct smu_feature_bits * bits = __smu_feature_get_list (smu , list );
2136+
2137+ smu_feature_bits_or (bits , bits , src , smu -> smu_feature .feature_num );
2138+ }
2139+
2140+ static inline void smu_feature_list_to_arr32 (struct smu_context * smu ,
2141+ enum smu_feature_list list ,
2142+ uint32_t * arr )
2143+ {
2144+ smu_feature_bits_to_arr32 (__smu_feature_get_list (smu , list ), arr ,
2145+ smu -> smu_feature .feature_num );
2146+ }
2147+
2148+ static inline void smu_feature_init (struct smu_context * smu , int feature_num )
2149+ {
2150+ if (!feature_num || smu -> smu_feature .feature_num != 0 )
2151+ return ;
2152+
2153+ smu -> smu_feature .feature_num = feature_num ;
2154+ smu_feature_list_clear_all (smu , SMU_FEATURE_LIST_SUPPORTED );
2155+ smu_feature_list_clear_all (smu , SMU_FEATURE_LIST_ALLOWED );
2156+ }
2157+
20582158#endif
0 commit comments