[Intel-gfx] [PATCH v2 2/2] drm/i915: Function per early graphics quirk
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Wed Apr 27 10:52:18 UTC 2016
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 at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at intel.com>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
> Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Joonas Lahtinen <joonas.lahtinen at 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.
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
More information about the Intel-gfx
mailing list