[Intel-gfx] [PATCH 34/71] drm/i915/chv: Implement stolen memory size detection

Jani Nikula jani.nikula at linux.intel.com
Thu May 8 20:19:32 CEST 2014


On Wed, 09 Apr 2014, ville.syrjala at linux.intel.com wrote:
> From: Damien Lespiau <damien.lespiau at intel.com>
>
> CHV uses the same bits as SNB/VLV to code the Graphics Mode Select field
> (GFX stolen memory size) with the addition of finer granularity modes:
> 4MB increments from 0x11 (8MB) to 0x1d.
>
> Values strictly above 0x1d are either reserved or not supported.
>
> v2: 4MB increments, not 8MB. 32MB has been omitted from the list of new
>     values (Ville Syrjälä)
>
> v3: Also correctly interpret GGMS (GTT Graphics Memory Size) (Ville
>     Syrjälä)
>
> v4: Don't assign a value that needs 20bits or more to a u16 (Rafael
>     Barbalho)
>

Folded to patch 14, and fixed to use INTEL_CHV_IDS,

Reviewed-by: Jani Nikula <jani.nikula at intel.com>


> Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Reviewed-by: Rafael Barbalho <rafael.barbalho at intel.com>
> Tested-by: Rafael Barbalho <rafael.barbalho at intel.com>
> Signed-off-by: Damien Lespiau <damien.lespiau at intel.com>
> ---
>  arch/x86/kernel/early-quirks.c      | 23 +++++++++++++++++++++-
>  drivers/gpu/drm/i915/i915_gem_gtt.c | 38 +++++++++++++++++++++++++++++++++++--
>  2 files changed, 58 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
> index 5758f5b..46ce15c 100644
> --- a/arch/x86/kernel/early-quirks.c
> +++ b/arch/x86/kernel/early-quirks.c
> @@ -323,6 +323,27 @@ static inline size_t gen8_stolen_size(int num, int slot, int func)
>  	return gmch_ctrl << 25; /* 32 MB units */
>  }
>  
> +static size_t __init chv_stolen_size(int num, int slot, int func)
> +{
> +	u16 gmch_ctrl;
> +
> +	gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
> +	gmch_ctrl >>= SNB_GMCH_GMS_SHIFT;
> +	gmch_ctrl &= SNB_GMCH_GMS_MASK;
> +
> +	/*
> +	 * 0x0  to 0x10: 32MB increments starting at 0MB
> +	 * 0x11 to 0x16: 4MB increments starting at 8MB
> +	 * 0x17 to 0x1d: 4MB increments start at 36MB
> +	 */
> +	if (gmch_ctrl < 0x11)
> +		return gmch_ctrl << 25;
> +	else if (gmch_ctrl < 0x17)
> +		return (gmch_ctrl - 0x11 + 2) << 22;
> +	else
> +		return (gmch_ctrl - 0x17 + 9) << 22;
> +}
> +
>  typedef size_t (*stolen_size_fn)(int num, int slot, int func);
>  
>  static struct pci_device_id intel_stolen_ids[] __initdata = {
> @@ -348,7 +369,7 @@ static struct pci_device_id intel_stolen_ids[] __initdata = {
>  	INTEL_HSW_M_IDS(gen6_stolen_size),
>  	INTEL_BDW_M_IDS(gen8_stolen_size),
>  	INTEL_BDW_D_IDS(gen8_stolen_size),
> -	INTEL_CHV_PCI_IDS(gen8_stolen_size)
> +	INTEL_CHV_PCI_IDS(chv_stolen_size),
>  };
>  
>  static void __init intel_graphics_stolen(int num, int slot, int func)
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index ba51901..97f52fc 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -1757,6 +1757,17 @@ static inline unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl)
>  	return bdw_gmch_ctl << 20;
>  }
>  
> +static inline unsigned int chv_get_total_gtt_size(u16 gmch_ctrl)
> +{
> +	gmch_ctrl >>= SNB_GMCH_GGMS_SHIFT;
> +	gmch_ctrl &= SNB_GMCH_GGMS_MASK;
> +
> +	if (gmch_ctrl)
> +		return 1 << (20 + gmch_ctrl);
> +
> +	return 0;
> +}
> +
>  static inline size_t gen6_get_stolen_size(u16 snb_gmch_ctl)
>  {
>  	snb_gmch_ctl >>= SNB_GMCH_GMS_SHIFT;
> @@ -1771,6 +1782,24 @@ static inline size_t gen8_get_stolen_size(u16 bdw_gmch_ctl)
>  	return bdw_gmch_ctl << 25; /* 32 MB units */
>  }
>  
> +static size_t chv_get_stolen_size(u16 gmch_ctrl)
> +{
> +	gmch_ctrl >>= SNB_GMCH_GMS_SHIFT;
> +	gmch_ctrl &= SNB_GMCH_GMS_MASK;
> +
> +	/*
> +	 * 0x0  to 0x10: 32MB increments starting at 0MB
> +	 * 0x11 to 0x16: 4MB increments starting at 8MB
> +	 * 0x17 to 0x1d: 4MB increments start at 36MB
> +	 */
> +	if (gmch_ctrl < 0x11)
> +		return gmch_ctrl << 25;
> +	else if (gmch_ctrl < 0x17)
> +		return (gmch_ctrl - 0x11 + 2) << 22;
> +	else
> +		return (gmch_ctrl - 0x17 + 9) << 22;
> +}
> +
>  static int ggtt_probe_common(struct drm_device *dev,
>  			     size_t gtt_size)
>  {
> @@ -1867,9 +1896,14 @@ static int gen8_gmch_probe(struct drm_device *dev,
>  
>  	pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
>  
> -	*stolen = gen8_get_stolen_size(snb_gmch_ctl);
> +	if (IS_CHERRYVIEW(dev)) {
> +		*stolen = chv_get_stolen_size(snb_gmch_ctl);
> +		gtt_size = chv_get_total_gtt_size(snb_gmch_ctl);
> +	} else {
> +		*stolen = gen8_get_stolen_size(snb_gmch_ctl);
> +		gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
> +	}
>  
> -	gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
>  	*gtt_total = (gtt_size / sizeof(gen8_gtt_pte_t)) << PAGE_SHIFT;
>  
>  	if (IS_CHERRYVIEW(dev))
> -- 
> 1.8.3.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Jani Nikula, Intel Open Source Technology Center



More information about the Intel-gfx mailing list