Message ID | 1461328105-13212-2-git-send-email-joonas.lahtinen@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, Adding x86 maintainers as CC as they were missing from the original patch due to some confusion in best practices. This patch was merged to the drm-intel.git after reviewing and testing. Regards, Joonas On pe, 2016-04-22 at 15:28 +0300, Joonas Lahtinen wrote: > Move graphics stolen memory related early quirk into a function to > allow easy adding of other graphics quirks to fix memory maps on > machines running old BIOS versions. > > While at it; > - _funcs -> _ops to follow de facto naming > - make the iteration code tad more readable > - remove unused variables > > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Mika Kuoppala <mika.kuoppala@intel.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > --- > arch/x86/kernel/early-quirks.c | 187 +++++++++++++++++++++-------------------- > 1 file changed, 98 insertions(+), 89 deletions(-) > > diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c > index 70e0ab6..d2f75b4 100644 > --- a/arch/x86/kernel/early-quirks.c > +++ b/arch/x86/kernel/early-quirks.c > @@ -423,11 +423,6 @@ static size_t __init chv_stolen_size(int num, int slot, int func) > return (size_t)(gms - 0x17 + 9) * MB(4); > } > > -struct intel_stolen_funcs { > - size_t (*size)(int num, int slot, int func); > - phys_addr_t (*base)(int num, int slot, int func, size_t size); > -}; > - > static size_t __init gen9_stolen_size(int num, int slot, int func) > { > u16 gmch_ctrl; > @@ -444,115 +439,129 @@ static size_t __init gen9_stolen_size(int num, int slot, int func) > return (size_t)(gms - 0xf0 + 1) * MB(4); > } > > -typedef size_t (*stolen_size_fn)(int num, int slot, int func); > +struct intel_early_ops { > + size_t (*stolen_size)(int num, int slot, int func); > + phys_addr_t (*stolen_base)(int num, int slot, int func, size_t size); > +}; > > -static const struct intel_stolen_funcs i830_stolen_funcs __initconst = { > - .base = i830_stolen_base, > - .size = i830_stolen_size, > +static const struct intel_early_ops i830_early_ops __initconst = { > + .stolen_base = i830_stolen_base, > + .stolen_size = i830_stolen_size, > }; > > -static const struct intel_stolen_funcs i845_stolen_funcs __initconst = { > - .base = i845_stolen_base, > - .size = i830_stolen_size, > +static const struct intel_early_ops i845_early_ops __initconst = { > + .stolen_base = i845_stolen_base, > + .stolen_size = i830_stolen_size, > }; > > -static const struct intel_stolen_funcs i85x_stolen_funcs __initconst = { > - .base = i85x_stolen_base, > - .size = gen3_stolen_size, > +static const struct intel_early_ops i85x_early_ops __initconst = { > + .stolen_base = i85x_stolen_base, > + .stolen_size = gen3_stolen_size, > }; > > -static const struct intel_stolen_funcs i865_stolen_funcs __initconst = { > - .base = i865_stolen_base, > - .size = gen3_stolen_size, > +static const struct intel_early_ops i865_early_ops __initconst = { > + .stolen_base = i865_stolen_base, > + .stolen_size = gen3_stolen_size, > }; > > -static const struct intel_stolen_funcs gen3_stolen_funcs __initconst = { > - .base = gen3_stolen_base, > - .size = gen3_stolen_size, > +static const struct intel_early_ops gen3_early_ops __initconst = { > + .stolen_base = gen3_stolen_base, > + .stolen_size = gen3_stolen_size, > }; > > -static const struct intel_stolen_funcs gen6_stolen_funcs __initconst = { > - .base = gen3_stolen_base, > - .size = gen6_stolen_size, > +static const struct intel_early_ops gen6_early_ops __initconst = { > + .stolen_base = gen3_stolen_base, > + .stolen_size = gen6_stolen_size, > }; > > -static const struct intel_stolen_funcs gen8_stolen_funcs __initconst = { > - .base = gen3_stolen_base, > - .size = gen8_stolen_size, > +static const struct intel_early_ops gen8_early_ops __initconst = { > + .stolen_base = gen3_stolen_base, > + .stolen_size = gen8_stolen_size, > }; > > -static const struct intel_stolen_funcs gen9_stolen_funcs __initconst = { > - .base = gen3_stolen_base, > - .size = gen9_stolen_size, > +static const struct intel_early_ops gen9_early_ops __initconst = { > + .stolen_base = gen3_stolen_base, > + .stolen_size = gen9_stolen_size, > }; > > -static const struct intel_stolen_funcs chv_stolen_funcs __initconst = { > - .base = gen3_stolen_base, > - .size = chv_stolen_size, > +static const struct intel_early_ops chv_early_ops __initconst = { > + .stolen_base = gen3_stolen_base, > + .stolen_size = chv_stolen_size, > }; > > -static const struct pci_device_id intel_stolen_ids[] __initconst = { > - INTEL_I830_IDS(&i830_stolen_funcs), > - INTEL_I845G_IDS(&i845_stolen_funcs), > - INTEL_I85X_IDS(&i85x_stolen_funcs), > - INTEL_I865G_IDS(&i865_stolen_funcs), > - INTEL_I915G_IDS(&gen3_stolen_funcs), > - INTEL_I915GM_IDS(&gen3_stolen_funcs), > - INTEL_I945G_IDS(&gen3_stolen_funcs), > - INTEL_I945GM_IDS(&gen3_stolen_funcs), > - INTEL_VLV_M_IDS(&gen6_stolen_funcs), > - INTEL_VLV_D_IDS(&gen6_stolen_funcs), > - INTEL_PINEVIEW_IDS(&gen3_stolen_funcs), > - INTEL_I965G_IDS(&gen3_stolen_funcs), > - INTEL_G33_IDS(&gen3_stolen_funcs), > - INTEL_I965GM_IDS(&gen3_stolen_funcs), > - INTEL_GM45_IDS(&gen3_stolen_funcs), > - INTEL_G45_IDS(&gen3_stolen_funcs), > - INTEL_IRONLAKE_D_IDS(&gen3_stolen_funcs), > - INTEL_IRONLAKE_M_IDS(&gen3_stolen_funcs), > - INTEL_SNB_D_IDS(&gen6_stolen_funcs), > - INTEL_SNB_M_IDS(&gen6_stolen_funcs), > - INTEL_IVB_M_IDS(&gen6_stolen_funcs), > - INTEL_IVB_D_IDS(&gen6_stolen_funcs), > - INTEL_HSW_D_IDS(&gen6_stolen_funcs), > - INTEL_HSW_M_IDS(&gen6_stolen_funcs), > - INTEL_BDW_M_IDS(&gen8_stolen_funcs), > - INTEL_BDW_D_IDS(&gen8_stolen_funcs), > - INTEL_CHV_IDS(&chv_stolen_funcs), > - INTEL_SKL_IDS(&gen9_stolen_funcs), > - INTEL_BXT_IDS(&gen9_stolen_funcs), > - INTEL_KBL_IDS(&gen9_stolen_funcs), > +static const struct pci_device_id intel_early_ids[] __initconst = { > + INTEL_I830_IDS(&i830_early_ops), > + INTEL_I845G_IDS(&i845_early_ops), > + INTEL_I85X_IDS(&i85x_early_ops), > + INTEL_I865G_IDS(&i865_early_ops), > + INTEL_I915G_IDS(&gen3_early_ops), > + INTEL_I915GM_IDS(&gen3_early_ops), > + INTEL_I945G_IDS(&gen3_early_ops), > + INTEL_I945GM_IDS(&gen3_early_ops), > + INTEL_VLV_M_IDS(&gen6_early_ops), > + INTEL_VLV_D_IDS(&gen6_early_ops), > + INTEL_PINEVIEW_IDS(&gen3_early_ops), > + INTEL_I965G_IDS(&gen3_early_ops), > + INTEL_G33_IDS(&gen3_early_ops), > + INTEL_I965GM_IDS(&gen3_early_ops), > + INTEL_GM45_IDS(&gen3_early_ops), > + INTEL_G45_IDS(&gen3_early_ops), > + INTEL_IRONLAKE_D_IDS(&gen3_early_ops), > + INTEL_IRONLAKE_M_IDS(&gen3_early_ops), > + INTEL_SNB_D_IDS(&gen6_early_ops), > + INTEL_SNB_M_IDS(&gen6_early_ops), > + INTEL_IVB_M_IDS(&gen6_early_ops), > + INTEL_IVB_D_IDS(&gen6_early_ops), > + INTEL_HSW_D_IDS(&gen6_early_ops), > + INTEL_HSW_M_IDS(&gen6_early_ops), > + INTEL_BDW_M_IDS(&gen8_early_ops), > + INTEL_BDW_D_IDS(&gen8_early_ops), > + INTEL_CHV_IDS(&chv_early_ops), > + INTEL_SKL_IDS(&gen9_early_ops), > + INTEL_BXT_IDS(&gen9_early_ops), > + INTEL_KBL_IDS(&gen9_early_ops), > }; > > -static void __init intel_graphics_stolen(int num, int slot, int func) > +static void __init > +intel_graphics_stolen(int num, int slot, int func, > + const struct intel_early_ops *early_ops) > { > + phys_addr_t base; > size_t size; > + > + size = early_ops->stolen_size(num, slot, func); > + base = early_ops->stolen_base(num, slot, func, size); > + > + if (!size || !base) > + return; > + > + printk(KERN_INFO "Reserving Intel graphics stolen memory at " > + "0x%llx-0x%llx\n", base, base + size - 1); > + > + /* Mark this space as reserved */ > + e820_add_region(base, size, E820_RESERVED); > + sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); > +} > + > +static void __init intel_graphics_quirks(int num, int slot, int func) > +{ > + const struct intel_early_ops *early_ops; > + u16 device; > int i; > - phys_addr_t start; > - u16 device, subvendor, subdevice; > > device = read_pci_config_16(num, slot, func, PCI_DEVICE_ID); > - subvendor = read_pci_config_16(num, slot, func, > - PCI_SUBSYSTEM_VENDOR_ID); > - subdevice = read_pci_config_16(num, slot, func, PCI_SUBSYSTEM_ID); > - > - for (i = 0; i < ARRAY_SIZE(intel_stolen_ids); i++) { > - if (intel_stolen_ids[i].device == device) { > - const struct intel_stolen_funcs *stolen_funcs = > - (const struct intel_stolen_funcs *)intel_stolen_ids[i].driver_data; > - size = stolen_funcs->size(num, slot, func); > - start = stolen_funcs->base(num, slot, func, size); > - if (size && start) { > - printk(KERN_INFO "Reserving Intel graphics stolen memory at 0x%llx-0x%llx\n", > - start, start + size - 1); > - /* Mark this space as reserved */ > - e820_add_region(start, size, E820_RESERVED); > - sanitize_e820_map(e820.map, > - ARRAY_SIZE(e820.map), > - &e820.nr_map); > - } > - return; > - } > + > + for (i = 0; i < ARRAY_SIZE(intel_early_ids); i++) { > + kernel_ulong_t driver_data = intel_early_ids[i].driver_data; > + > + if (intel_early_ids[i].device != device) > + continue; > + > + early_ops = (typeof(early_ops))driver_data; > + > + intel_graphics_stolen(num, slot, func, early_ops); > + > + return; > } > } > > @@ -601,7 +610,7 @@ static struct chipset early_qrk[] __initdata = { > { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST, > PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check }, > { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA, PCI_ANY_ID, > - QFLAG_APPLY_ONCE, intel_graphics_stolen }, > + QFLAG_APPLY_ONCE, intel_graphics_quirks }, > /* > * HPET on the current version of the Baytrail platform has accuracy > * problems: it will halt in deep idle state - so we disable it.
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 70e0ab6..d2f75b4 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -423,11 +423,6 @@ static size_t __init chv_stolen_size(int num, int slot, int func) return (size_t)(gms - 0x17 + 9) * MB(4); } -struct intel_stolen_funcs { - size_t (*size)(int num, int slot, int func); - phys_addr_t (*base)(int num, int slot, int func, size_t size); -}; - static size_t __init gen9_stolen_size(int num, int slot, int func) { u16 gmch_ctrl; @@ -444,115 +439,129 @@ static size_t __init gen9_stolen_size(int num, int slot, int func) return (size_t)(gms - 0xf0 + 1) * MB(4); } -typedef size_t (*stolen_size_fn)(int num, int slot, int func); +struct intel_early_ops { + size_t (*stolen_size)(int num, int slot, int func); + phys_addr_t (*stolen_base)(int num, int slot, int func, size_t size); +}; -static const struct intel_stolen_funcs i830_stolen_funcs __initconst = { - .base = i830_stolen_base, - .size = i830_stolen_size, +static const struct intel_early_ops i830_early_ops __initconst = { + .stolen_base = i830_stolen_base, + .stolen_size = i830_stolen_size, }; -static const struct intel_stolen_funcs i845_stolen_funcs __initconst = { - .base = i845_stolen_base, - .size = i830_stolen_size, +static const struct intel_early_ops i845_early_ops __initconst = { + .stolen_base = i845_stolen_base, + .stolen_size = i830_stolen_size, }; -static const struct intel_stolen_funcs i85x_stolen_funcs __initconst = { - .base = i85x_stolen_base, - .size = gen3_stolen_size, +static const struct intel_early_ops i85x_early_ops __initconst = { + .stolen_base = i85x_stolen_base, + .stolen_size = gen3_stolen_size, }; -static const struct intel_stolen_funcs i865_stolen_funcs __initconst = { - .base = i865_stolen_base, - .size = gen3_stolen_size, +static const struct intel_early_ops i865_early_ops __initconst = { + .stolen_base = i865_stolen_base, + .stolen_size = gen3_stolen_size, }; -static const struct intel_stolen_funcs gen3_stolen_funcs __initconst = { - .base = gen3_stolen_base, - .size = gen3_stolen_size, +static const struct intel_early_ops gen3_early_ops __initconst = { + .stolen_base = gen3_stolen_base, + .stolen_size = gen3_stolen_size, }; -static const struct intel_stolen_funcs gen6_stolen_funcs __initconst = { - .base = gen3_stolen_base, - .size = gen6_stolen_size, +static const struct intel_early_ops gen6_early_ops __initconst = { + .stolen_base = gen3_stolen_base, + .stolen_size = gen6_stolen_size, }; -static const struct intel_stolen_funcs gen8_stolen_funcs __initconst = { - .base = gen3_stolen_base, - .size = gen8_stolen_size, +static const struct intel_early_ops gen8_early_ops __initconst = { + .stolen_base = gen3_stolen_base, + .stolen_size = gen8_stolen_size, }; -static const struct intel_stolen_funcs gen9_stolen_funcs __initconst = { - .base = gen3_stolen_base, - .size = gen9_stolen_size, +static const struct intel_early_ops gen9_early_ops __initconst = { + .stolen_base = gen3_stolen_base, + .stolen_size = gen9_stolen_size, }; -static const struct intel_stolen_funcs chv_stolen_funcs __initconst = { - .base = gen3_stolen_base, - .size = chv_stolen_size, +static const struct intel_early_ops chv_early_ops __initconst = { + .stolen_base = gen3_stolen_base, + .stolen_size = chv_stolen_size, }; -static const struct pci_device_id intel_stolen_ids[] __initconst = { - INTEL_I830_IDS(&i830_stolen_funcs), - INTEL_I845G_IDS(&i845_stolen_funcs), - INTEL_I85X_IDS(&i85x_stolen_funcs), - INTEL_I865G_IDS(&i865_stolen_funcs), - INTEL_I915G_IDS(&gen3_stolen_funcs), - INTEL_I915GM_IDS(&gen3_stolen_funcs), - INTEL_I945G_IDS(&gen3_stolen_funcs), - INTEL_I945GM_IDS(&gen3_stolen_funcs), - INTEL_VLV_M_IDS(&gen6_stolen_funcs), - INTEL_VLV_D_IDS(&gen6_stolen_funcs), - INTEL_PINEVIEW_IDS(&gen3_stolen_funcs), - INTEL_I965G_IDS(&gen3_stolen_funcs), - INTEL_G33_IDS(&gen3_stolen_funcs), - INTEL_I965GM_IDS(&gen3_stolen_funcs), - INTEL_GM45_IDS(&gen3_stolen_funcs), - INTEL_G45_IDS(&gen3_stolen_funcs), - INTEL_IRONLAKE_D_IDS(&gen3_stolen_funcs), - INTEL_IRONLAKE_M_IDS(&gen3_stolen_funcs), - INTEL_SNB_D_IDS(&gen6_stolen_funcs), - INTEL_SNB_M_IDS(&gen6_stolen_funcs), - INTEL_IVB_M_IDS(&gen6_stolen_funcs), - INTEL_IVB_D_IDS(&gen6_stolen_funcs), - INTEL_HSW_D_IDS(&gen6_stolen_funcs), - INTEL_HSW_M_IDS(&gen6_stolen_funcs), - INTEL_BDW_M_IDS(&gen8_stolen_funcs), - INTEL_BDW_D_IDS(&gen8_stolen_funcs), - INTEL_CHV_IDS(&chv_stolen_funcs), - INTEL_SKL_IDS(&gen9_stolen_funcs), - INTEL_BXT_IDS(&gen9_stolen_funcs), - INTEL_KBL_IDS(&gen9_stolen_funcs), +static const struct pci_device_id intel_early_ids[] __initconst = { + INTEL_I830_IDS(&i830_early_ops), + INTEL_I845G_IDS(&i845_early_ops), + INTEL_I85X_IDS(&i85x_early_ops), + INTEL_I865G_IDS(&i865_early_ops), + INTEL_I915G_IDS(&gen3_early_ops), + INTEL_I915GM_IDS(&gen3_early_ops), + INTEL_I945G_IDS(&gen3_early_ops), + INTEL_I945GM_IDS(&gen3_early_ops), + INTEL_VLV_M_IDS(&gen6_early_ops), + INTEL_VLV_D_IDS(&gen6_early_ops), + INTEL_PINEVIEW_IDS(&gen3_early_ops), + INTEL_I965G_IDS(&gen3_early_ops), + INTEL_G33_IDS(&gen3_early_ops), + INTEL_I965GM_IDS(&gen3_early_ops), + INTEL_GM45_IDS(&gen3_early_ops), + INTEL_G45_IDS(&gen3_early_ops), + INTEL_IRONLAKE_D_IDS(&gen3_early_ops), + INTEL_IRONLAKE_M_IDS(&gen3_early_ops), + INTEL_SNB_D_IDS(&gen6_early_ops), + INTEL_SNB_M_IDS(&gen6_early_ops), + INTEL_IVB_M_IDS(&gen6_early_ops), + INTEL_IVB_D_IDS(&gen6_early_ops), + INTEL_HSW_D_IDS(&gen6_early_ops), + INTEL_HSW_M_IDS(&gen6_early_ops), + INTEL_BDW_M_IDS(&gen8_early_ops), + INTEL_BDW_D_IDS(&gen8_early_ops), + INTEL_CHV_IDS(&chv_early_ops), + INTEL_SKL_IDS(&gen9_early_ops), + INTEL_BXT_IDS(&gen9_early_ops), + INTEL_KBL_IDS(&gen9_early_ops), }; -static void __init intel_graphics_stolen(int num, int slot, int func) +static void __init +intel_graphics_stolen(int num, int slot, int func, + const struct intel_early_ops *early_ops) { + phys_addr_t base; size_t size; + + size = early_ops->stolen_size(num, slot, func); + base = early_ops->stolen_base(num, slot, func, size); + + if (!size || !base) + return; + + printk(KERN_INFO "Reserving Intel graphics stolen memory at " + "0x%llx-0x%llx\n", base, base + size - 1); + + /* Mark this space as reserved */ + e820_add_region(base, size, E820_RESERVED); + sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); +} + +static void __init intel_graphics_quirks(int num, int slot, int func) +{ + const struct intel_early_ops *early_ops; + u16 device; int i; - phys_addr_t start; - u16 device, subvendor, subdevice; device = read_pci_config_16(num, slot, func, PCI_DEVICE_ID); - subvendor = read_pci_config_16(num, slot, func, - PCI_SUBSYSTEM_VENDOR_ID); - subdevice = read_pci_config_16(num, slot, func, PCI_SUBSYSTEM_ID); - - for (i = 0; i < ARRAY_SIZE(intel_stolen_ids); i++) { - if (intel_stolen_ids[i].device == device) { - const struct intel_stolen_funcs *stolen_funcs = - (const struct intel_stolen_funcs *)intel_stolen_ids[i].driver_data; - size = stolen_funcs->size(num, slot, func); - start = stolen_funcs->base(num, slot, func, size); - if (size && start) { - printk(KERN_INFO "Reserving Intel graphics stolen memory at 0x%llx-0x%llx\n", - start, start + size - 1); - /* Mark this space as reserved */ - e820_add_region(start, size, E820_RESERVED); - sanitize_e820_map(e820.map, - ARRAY_SIZE(e820.map), - &e820.nr_map); - } - return; - } + + for (i = 0; i < ARRAY_SIZE(intel_early_ids); i++) { + kernel_ulong_t driver_data = intel_early_ids[i].driver_data; + + if (intel_early_ids[i].device != device) + continue; + + early_ops = (typeof(early_ops))driver_data; + + intel_graphics_stolen(num, slot, func, early_ops); + + return; } } @@ -601,7 +610,7 @@ static struct chipset early_qrk[] __initdata = { { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST, PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check }, { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA, PCI_ANY_ID, - QFLAG_APPLY_ONCE, intel_graphics_stolen }, + QFLAG_APPLY_ONCE, intel_graphics_quirks }, /* * HPET on the current version of the Baytrail platform has accuracy * problems: it will halt in deep idle state - so we disable it.