On Wed, 09 Apr 2014, ville.syrjala@xxxxxxxxxxxxxxx wrote: > From: Damien Lespiau <damien.lespiau@xxxxxxxxx> > > 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@xxxxxxxxx> > Reviewed-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Reviewed-by: Rafael Barbalho <rafael.barbalho@xxxxxxxxx> > Tested-by: Rafael Barbalho <rafael.barbalho@xxxxxxxxx> > Signed-off-by: Damien Lespiau <damien.lespiau@xxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Jani Nikula, Intel Open Source Technology Center _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx