diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_device_info.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_device_info.c | 107 | 
1 files changed, 50 insertions, 57 deletions
| diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c index 1e56319334f3..855a5074ad77 100644 --- a/drivers/gpu/drm/i915/intel_device_info.c +++ b/drivers/gpu/drm/i915/intel_device_info.c @@ -104,7 +104,7 @@ static void sseu_dump(const struct sseu_dev_info *sseu, struct drm_printer *p)  	drm_printf(p, "has EU power gating: %s\n", yesno(sseu->has_eu_pg));  } -void intel_device_info_dump_runtime(const struct intel_device_info *info, +void intel_device_info_dump_runtime(const struct intel_runtime_info *info,  				    struct drm_printer *p)  {  	sseu_dump(&info->sseu, p); @@ -113,21 +113,6 @@ void intel_device_info_dump_runtime(const struct intel_device_info *info,  		   info->cs_timestamp_frequency_khz);  } -void intel_device_info_dump(const struct intel_device_info *info, -			    struct drm_printer *p) -{ -	struct drm_i915_private *dev_priv = -		container_of(info, struct drm_i915_private, info); - -	drm_printf(p, "pciid=0x%04x rev=0x%02x platform=%s gen=%i\n", -		   INTEL_DEVID(dev_priv), -		   INTEL_REVID(dev_priv), -		   intel_platform_name(info->platform), -		   info->gen); - -	intel_device_info_dump_flags(info, p); -} -  void intel_device_info_dump_topology(const struct sseu_dev_info *sseu,  				     struct drm_printer *p)  { @@ -164,7 +149,7 @@ static u16 compute_eu_total(const struct sseu_dev_info *sseu)  static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)  { -	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu; +	struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;  	u8 s_en;  	u32 ss_en, ss_en_mask;  	u8 eu_en; @@ -203,7 +188,7 @@ static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)  static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)  { -	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu; +	struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;  	const u32 fuse2 = I915_READ(GEN8_FUSE2);  	int s, ss;  	const int eu_mask = 0xff; @@ -280,7 +265,7 @@ static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)  static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)  { -	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu; +	struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;  	u32 fuse;  	fuse = I915_READ(CHV_FUSE_GT); @@ -334,7 +319,7 @@ static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)  static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)  {  	struct intel_device_info *info = mkwrite_device_info(dev_priv); -	struct sseu_dev_info *sseu = &info->sseu; +	struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;  	int s, ss;  	u32 fuse2, eu_disable, subslice_mask;  	const u8 eu_mask = 0xff; @@ -437,7 +422,7 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv)  static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)  { -	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu; +	struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;  	int s, ss;  	u32 fuse2, subslice_mask, eu_disable[3]; /* s_max */ @@ -519,8 +504,7 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)  static void haswell_sseu_info_init(struct drm_i915_private *dev_priv)  { -	struct intel_device_info *info = mkwrite_device_info(dev_priv); -	struct sseu_dev_info *sseu = &info->sseu; +	struct sseu_dev_info *sseu = &RUNTIME_INFO(dev_priv)->sseu;  	u32 fuse1;  	int s, ss; @@ -528,9 +512,9 @@ static void haswell_sseu_info_init(struct drm_i915_private *dev_priv)  	 * There isn't a register to tell us how many slices/subslices. We  	 * work off the PCI-ids here.  	 */ -	switch (info->gt) { +	switch (INTEL_INFO(dev_priv)->gt) {  	default: -		MISSING_CASE(info->gt); +		MISSING_CASE(INTEL_INFO(dev_priv)->gt);  		/* fall through */  	case 1:  		sseu->slice_mask = BIT(0); @@ -725,7 +709,7 @@ static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv)  /**   * intel_device_info_runtime_init - initialize runtime info - * @info: intel device info struct + * @dev_priv: the i915 device   *   * Determine various intel_device_info fields at runtime.   * @@ -739,29 +723,29 @@ static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv)   *   - after the PCH has been detected,   *   - before the first usage of the fields it can tweak.   */ -void intel_device_info_runtime_init(struct intel_device_info *info) +void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)  { -	struct drm_i915_private *dev_priv = -		container_of(info, struct drm_i915_private, info); +	struct intel_device_info *info = mkwrite_device_info(dev_priv); +	struct intel_runtime_info *runtime = RUNTIME_INFO(dev_priv);  	enum pipe pipe;  	if (INTEL_GEN(dev_priv) >= 10) {  		for_each_pipe(dev_priv, pipe) -			info->num_scalers[pipe] = 2; -	} else if (IS_GEN9(dev_priv)) { -		info->num_scalers[PIPE_A] = 2; -		info->num_scalers[PIPE_B] = 2; -		info->num_scalers[PIPE_C] = 1; +			runtime->num_scalers[pipe] = 2; +	} else if (IS_GEN(dev_priv, 9)) { +		runtime->num_scalers[PIPE_A] = 2; +		runtime->num_scalers[PIPE_B] = 2; +		runtime->num_scalers[PIPE_C] = 1;  	}  	BUILD_BUG_ON(I915_NUM_ENGINES > BITS_PER_TYPE(intel_ring_mask_t)); -	if (IS_GEN11(dev_priv)) +	if (IS_GEN(dev_priv, 11))  		for_each_pipe(dev_priv, pipe) -			info->num_sprites[pipe] = 6; -	else if (IS_GEN10(dev_priv) || IS_GEMINILAKE(dev_priv)) +			runtime->num_sprites[pipe] = 6; +	else if (IS_GEN(dev_priv, 10) || IS_GEMINILAKE(dev_priv))  		for_each_pipe(dev_priv, pipe) -			info->num_sprites[pipe] = 3; +			runtime->num_sprites[pipe] = 3;  	else if (IS_BROXTON(dev_priv)) {  		/*  		 * Skylake and Broxton currently don't expose the topmost plane as its @@ -772,22 +756,22 @@ void intel_device_info_runtime_init(struct intel_device_info *info)  		 * down the line.  		 */ -		info->num_sprites[PIPE_A] = 2; -		info->num_sprites[PIPE_B] = 2; -		info->num_sprites[PIPE_C] = 1; +		runtime->num_sprites[PIPE_A] = 2; +		runtime->num_sprites[PIPE_B] = 2; +		runtime->num_sprites[PIPE_C] = 1;  	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {  		for_each_pipe(dev_priv, pipe) -			info->num_sprites[pipe] = 2; +			runtime->num_sprites[pipe] = 2;  	} else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) {  		for_each_pipe(dev_priv, pipe) -			info->num_sprites[pipe] = 1; +			runtime->num_sprites[pipe] = 1;  	}  	if (i915_modparams.disable_display) {  		DRM_INFO("Display disabled (module parameter)\n");  		info->num_pipes = 0;  	} else if (HAS_DISPLAY(dev_priv) && -		   (IS_GEN7(dev_priv) || IS_GEN8(dev_priv)) && +		   (IS_GEN_RANGE(dev_priv, 7, 8)) &&  		   HAS_PCH_SPLIT(dev_priv)) {  		u32 fuse_strap = I915_READ(FUSE_STRAP);  		u32 sfuse_strap = I915_READ(SFUSE_STRAP); @@ -811,7 +795,7 @@ void intel_device_info_runtime_init(struct intel_device_info *info)  			DRM_INFO("PipeC fused off\n");  			info->num_pipes -= 1;  		} -	} else if (HAS_DISPLAY(dev_priv) && IS_GEN9(dev_priv)) { +	} else if (HAS_DISPLAY(dev_priv) && INTEL_GEN(dev_priv) >= 9) {  		u32 dfsm = I915_READ(SKL_DFSM);  		u8 disabled_mask = 0;  		bool invalid; @@ -851,20 +835,20 @@ void intel_device_info_runtime_init(struct intel_device_info *info)  		cherryview_sseu_info_init(dev_priv);  	else if (IS_BROADWELL(dev_priv))  		broadwell_sseu_info_init(dev_priv); -	else if (IS_GEN9(dev_priv)) +	else if (IS_GEN(dev_priv, 9))  		gen9_sseu_info_init(dev_priv); -	else if (IS_GEN10(dev_priv)) +	else if (IS_GEN(dev_priv, 10))  		gen10_sseu_info_init(dev_priv);  	else if (INTEL_GEN(dev_priv) >= 11)  		gen11_sseu_info_init(dev_priv); -	if (IS_GEN6(dev_priv) && intel_vtd_active()) { +	if (IS_GEN(dev_priv, 6) && intel_vtd_active()) {  		DRM_INFO("Disabling ppGTT for VT-d support\n");  		info->ppgtt = INTEL_PPGTT_NONE;  	}  	/* Initialize command stream timestamp frequency */ -	info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv); +	runtime->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);  }  void intel_driver_caps_print(const struct intel_driver_caps *caps, @@ -884,35 +868,44 @@ void intel_driver_caps_print(const struct intel_driver_caps *caps,  void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)  {  	struct intel_device_info *info = mkwrite_device_info(dev_priv); -	u32 media_fuse; +	unsigned int logical_vdbox = 0;  	unsigned int i; +	u32 media_fuse;  	if (INTEL_GEN(dev_priv) < 11)  		return;  	media_fuse = ~I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE); -	info->vdbox_enable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK; -	info->vebox_enable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >> -			     GEN11_GT_VEBOX_DISABLE_SHIFT; +	RUNTIME_INFO(dev_priv)->vdbox_enable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK; +	RUNTIME_INFO(dev_priv)->vebox_enable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >> +		GEN11_GT_VEBOX_DISABLE_SHIFT; -	DRM_DEBUG_DRIVER("vdbox enable: %04x\n", info->vdbox_enable); +	DRM_DEBUG_DRIVER("vdbox enable: %04x\n", RUNTIME_INFO(dev_priv)->vdbox_enable);  	for (i = 0; i < I915_MAX_VCS; i++) {  		if (!HAS_ENGINE(dev_priv, _VCS(i)))  			continue; -		if (!(BIT(i) & info->vdbox_enable)) { +		if (!(BIT(i) & RUNTIME_INFO(dev_priv)->vdbox_enable)) {  			info->ring_mask &= ~ENGINE_MASK(_VCS(i));  			DRM_DEBUG_DRIVER("vcs%u fused off\n", i); +			continue;  		} + +		/* +		 * In Gen11, only even numbered logical VDBOXes are +		 * hooked up to an SFC (Scaler & Format Converter) unit. +		 */ +		if (logical_vdbox++ % 2 == 0) +			RUNTIME_INFO(dev_priv)->vdbox_sfc_access |= BIT(i);  	} -	DRM_DEBUG_DRIVER("vebox enable: %04x\n", info->vebox_enable); +	DRM_DEBUG_DRIVER("vebox enable: %04x\n", RUNTIME_INFO(dev_priv)->vebox_enable);  	for (i = 0; i < I915_MAX_VECS; i++) {  		if (!HAS_ENGINE(dev_priv, _VECS(i)))  			continue; -		if (!(BIT(i) & info->vebox_enable)) { +		if (!(BIT(i) & RUNTIME_INFO(dev_priv)->vebox_enable)) {  			info->ring_mask &= ~ENGINE_MASK(_VECS(i));  			DRM_DEBUG_DRIVER("vecs%u fused off\n", i);  		} | 
