@ -54,26 +54,25 @@ static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)
sseu - > slice_mask = BIT ( 0 ) ;
if ( ! ( fuse & CHV_FGT_DISABLE_SS0 ) ) {
sseu - > subslice_per_slice + + ;
sseu - > subslice_mask | = BIT ( 0 ) ;
eu_dis = fuse & ( CHV_FGT_EU_DIS_SS0_R0_MASK |
CHV_FGT_EU_DIS_SS0_R1_MASK ) ;
sseu - > eu_total + = 8 - hweight32 ( eu_dis ) ;
}
if ( ! ( fuse & CHV_FGT_DISABLE_SS1 ) ) {
sseu - > subslice_per_slice + + ;
sseu - > subslice_mask | = BIT ( 1 ) ;
eu_dis = fuse & ( CHV_FGT_EU_DIS_SS1_R0_MASK |
CHV_FGT_EU_DIS_SS1_R1_MASK ) ;
sseu - > eu_total + = 8 - hweight32 ( eu_dis ) ;
}
sseu - > subslice_total = sseu - > subslice_per_slice ;
/*
* CHV expected to always have a uniform distribution of EU
* across subslices .
*/
sseu - > eu_per_subslice = sseu - > subslice_total ?
sseu - > eu_total / sseu - > subslice_total :
sseu - > eu_per_subslice = sseu_subslice_total ( sseu ) ?
sseu - > eu_total / sseu_subslice_total ( sseu ) :
0 ;
/*
* CHV supports subslice power gating on devices with more than
@ -81,7 +80,7 @@ static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)
* more than one EU pair per subslice .
*/
sseu - > has_slice_pg = 0 ;
sseu - > has_subslice_pg = ( sseu - > subslice_total > 1 ) ;
sseu - > has_subslice_pg = sseu_subslice_total ( sseu ) > 1 ;
sseu - > has_eu_pg = ( sseu - > eu_per_subslice > 2 ) ;
}
@ -91,20 +90,19 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
struct sseu_dev_info * sseu = & info - > sseu ;
int s_max = 3 , ss_max = 4 , eu_max = 8 ;
int s , ss ;
u32 fuse2 , ss_disable , eu_disable ;
u32 fuse2 , eu_disable ;
u8 eu_mask = 0xff ;
fuse2 = I915_READ ( GEN8_FUSE2 ) ;
sseu - > slice_mask = ( fuse2 & GEN8_F2_S_ENA_MASK ) > > GEN8_F2_S_ENA_SHIFT ;
ss_disable = ( fuse2 & GEN9_F2_SS_DIS_MASK ) > > GEN9_F2_SS_DIS_SHIFT ;
/*
* The subslice disable field is global , i . e . it applies
* to each of the enabled slices .
*/
sseu - > subslice_per_slice = ss_max - hweight32 ( ss_disable ) ;
sseu - > subslice_total = hweight8 ( sseu - > slice_mask ) *
sseu - > subslice_per_slice ;
sseu - > subslice_mask = ( 1 < < ss_max ) - 1 ;
sseu - > subslice_mask & = ~ ( ( fuse2 & GEN9_F2_SS_DIS_MASK ) > >
GEN9_F2_SS_DIS_SHIFT ) ;
/*
* Iterate through enabled slices and subslices to
@ -119,7 +117,7 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
for ( ss = 0 ; ss < ss_max ; ss + + ) {
int eu_per_ss ;
if ( ss_disable & BIT ( ss ) )
if ( ! ( sseu - > subslice_mask & BIT ( ss ) ) )
/* skip disabled subslice */
continue ;
@ -145,9 +143,9 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
* recovery . BXT is expected to be perfectly uniform in EU
* distribution .
*/
sseu - > eu_per_subslice = sseu - > subslice_total ?
sseu - > eu_per_subslice = sseu_subslice_total ( sseu ) ?
DIV_ROUND_UP ( sseu - > eu_total ,
sseu - > subslice_total ) : 0 ;
sseu_subslice_total ( sseu ) ) : 0 ;
/*
* SKL supports slice power gating on devices with more than
* one slice , and supports EU power gating on devices with
@ -160,11 +158,11 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
( IS_SKYLAKE ( dev_priv ) | | IS_KABYLAKE ( dev_priv ) ) & &
hweight8 ( sseu - > slice_mask ) > 1 ;
sseu - > has_subslice_pg =
IS_BROXTON ( dev_priv ) & & sseu - > subslice_total > 1 ;
IS_BROXTON ( dev_priv ) & & sseu_subslice_total ( sseu ) > 1 ;
sseu - > has_eu_pg = sseu - > eu_per_subslice > 2 ;
if ( IS_BROXTON ( dev_priv ) ) {
# define IS_SS_DISABLED(_ss_disable, ss) (_ss_disable & BIT(ss ))
# define IS_SS_DISABLED(ss) (!(sseu->subslice_mask & BIT(ss) ))
/*
* There is a HW issue in 2 x6 fused down parts that requires
* Pooled EU to be enabled as a WA . The pool configuration
@ -172,16 +170,15 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)
* doesn ' t affect if the device has all 3 subslices enabled .
*/
/* WaEnablePooledEuFor2x6:bxt */
info - > has_pooled_eu = ( ( sseu - > subslice_per_slice = = 3 ) | |
( sseu - > subslice_per_slice = = 2 & &
info - > has_pooled_eu = ( ( hweight8 ( sseu - > subslice_mask ) = = 3 ) | |
( hweight8 ( sseu - > subslice_mask ) = = 2 & &
INTEL_REVID ( dev_priv ) < BXT_REVID_C0 ) ) ;
sseu - > min_eu_in_pool = 0 ;
if ( info - > has_pooled_eu ) {
if ( IS_SS_DISABLED ( ss_disable , 0 ) | |
IS_SS_DISABLED ( ss_disable , 2 ) )
if ( IS_SS_DISABLED ( 2 ) | | IS_SS_DISABLED ( 0 ) )
sseu - > min_eu_in_pool = 3 ;
else if ( IS_SS_DISABLED ( ss_disable , 1 ) )
else if ( IS_SS_DISABLED ( 1 ) )
sseu - > min_eu_in_pool = 6 ;
else
sseu - > min_eu_in_pool = 9 ;
@ -195,11 +192,17 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
struct sseu_dev_info * sseu = & mkwrite_device_info ( dev_priv ) - > sseu ;
const int s_max = 3 , ss_max = 3 , eu_max = 8 ;
int s , ss ;
u32 fuse2 , eu_disable [ s_max ] , ss_disable ;
u32 fuse2 , eu_disable [ s_max ] ;
fuse2 = I915_READ ( GEN8_FUSE2 ) ;
sseu - > slice_mask = ( fuse2 & GEN8_F2_S_ENA_MASK ) > > GEN8_F2_S_ENA_SHIFT ;
ss_disable = ( fuse2 & GEN8_F2_SS_DIS_MASK ) > > GEN8_F2_SS_DIS_SHIFT ;
/*
* The subslice disable field is global , i . e . it applies
* to each of the enabled slices .
*/
sseu - > subslice_mask = BIT ( ss_max ) - 1 ;
sseu - > subslice_mask & = ~ ( ( fuse2 & GEN8_F2_SS_DIS_MASK ) > >
GEN8_F2_SS_DIS_SHIFT ) ;
eu_disable [ 0 ] = I915_READ ( GEN8_EU_DISABLE0 ) & GEN8_EU_DIS0_S0_MASK ;
eu_disable [ 1 ] = ( I915_READ ( GEN8_EU_DISABLE0 ) > > GEN8_EU_DIS0_S1_SHIFT ) |
@ -209,14 +212,6 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
( ( I915_READ ( GEN8_EU_DISABLE2 ) & GEN8_EU_DIS2_S2_MASK ) < <
( 32 - GEN8_EU_DIS1_S2_SHIFT ) ) ;
/*
* The subslice disable field is global , i . e . it applies
* to each of the enabled slices .
*/
sseu - > subslice_per_slice = ss_max - hweight32 ( ss_disable ) ;
sseu - > subslice_total = hweight8 ( sseu - > slice_mask ) *
sseu - > subslice_per_slice ;
/*
* Iterate through enabled slices and subslices to
* count the total enabled EU .
@ -229,7 +224,7 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
for ( ss = 0 ; ss < ss_max ; ss + + ) {
u32 n_disabled ;
if ( ss_disable & ( 0x1 < < ss ) )
if ( ! ( sseu - > subslice_mask & BIT ( ss ) ) )
/* skip disabled subslice */
continue ;
@ -250,8 +245,9 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
* subslices with the exception that any one EU in any one subslice may
* be fused off for die recovery .
*/
sseu - > eu_per_subslice = sseu - > subslice_total ?
DIV_ROUND_UP ( sseu - > eu_total , sseu - > subslice_total ) : 0 ;
sseu - > eu_per_subslice = sseu_subslice_total ( sseu ) ?
DIV_ROUND_UP ( sseu - > eu_total ,
sseu_subslice_total ( sseu ) ) : 0 ;
/*
* BDW supports slice power gating on devices with more than
@ -375,9 +371,10 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
info - > has_snoop = false ;
DRM_DEBUG_DRIVER ( " slice total: %u \n " , hweight8 ( info - > sseu . slice_mask ) ) ;
DRM_DEBUG_DRIVER ( " subslice total: %u \n " , info - > sseu . subslice_total ) ;
DRM_DEBUG_DRIVER ( " subslice total: %u \n " ,
sseu_subslice_total ( & info - > sseu ) ) ;
DRM_DEBUG_DRIVER ( " subslice per slice: %u \n " ,
info - > sseu . subslice_per_slice ) ;
hweight8 ( info - > sseu . subslice_mask ) ) ;
DRM_DEBUG_DRIVER ( " EU total: %u \n " , info - > sseu . eu_total ) ;
DRM_DEBUG_DRIVER ( " EU per subslice: %u \n " , info - > sseu . eu_per_subslice ) ;
DRM_DEBUG_DRIVER ( " has slice power gating: %s \n " ,