From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
To: Intel graphics driver community testing & development
<intel-gfx@lists.freedesktop.org>
Cc: x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Mika Kuoppala <mika.kuoppala@intel.com>
Subject: Re: [PATCH 1/2] drm/i915: Canonicalize stolen memory calculations
Date: Wed, 27 Apr 2016 13:50:39 +0300 [thread overview]
Message-ID: <1461754239.3986.30.camel@linux.intel.com> (raw)
In-Reply-To: <1461324307-16019-2-git-send-email-joonas.lahtinen@linux.intel.com>
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 14:25 +0300, Joonas Lahtinen wrote:
> Move the better constructs/comments from i915_gem_stolen.c to
> early-quirks.c and increase readability in preparation of only
> having one set of functions.
>
> - intel_stolen_base -> gen3_stolen_base
> - use phys_addr_t instead of u32 for address for future proofing
>
> 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>
> Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> ---
> arch/x86/kernel/early-quirks.c | 234 +++++++++++++++------------------
> drivers/gpu/drm/i915/i915_gem_stolen.c | 4 +-
> include/drm/i915_drm.h | 3 +
> 3 files changed, 109 insertions(+), 132 deletions(-)
>
> diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
> index bca14c8..f169475 100644
> --- a/arch/x86/kernel/early-quirks.c
> +++ b/arch/x86/kernel/early-quirks.c
> @@ -223,36 +223,19 @@ static void __init intel_remapping_check(int num, int slot, int func)
> * despite the efforts of the "RAM buffer" approach, which simply rounds
> * memory boundaries up to 64M to try to catch space that may decode
> * as RAM and so is not suitable for MMIO.
> - *
> - * And yes, so far on current devices the base addr is always under 4G.
> */
> -static u32 __init intel_stolen_base(int num, int slot, int func, size_t stolen_size)
> -{
> - u32 base;
> -
> - /*
> - * For the PCI IDs in this quirk, the stolen base is always
> - * in 0x5c, aka the BDSM register (yes that's really what
> - * it's called).
> - */
> - base = read_pci_config(num, slot, func, 0x5c);
> - base &= ~((1<<20) - 1);
> -
> - return base;
> -}
>
> #define KB(x) ((x) * 1024UL)
> #define MB(x) (KB (KB (x)))
> -#define GB(x) (MB (KB (x)))
>
> static size_t __init i830_tseg_size(void)
> {
> - u8 tmp = read_pci_config_byte(0, 0, 0, I830_ESMRAMC);
> + u8 esmramc = read_pci_config_byte(0, 0, 0, I830_ESMRAMC);
>
> - if (!(tmp & TSEG_ENABLE))
> + if (!(esmramc & TSEG_ENABLE))
> return 0;
>
> - if (tmp & I830_TSEG_SIZE_1M)
> + if (esmramc & I830_TSEG_SIZE_1M)
> return MB(1);
> else
> return KB(512);
> @@ -260,27 +243,26 @@ static size_t __init i830_tseg_size(void)
>
> static size_t __init i845_tseg_size(void)
> {
> - u8 tmp = read_pci_config_byte(0, 0, 0, I845_ESMRAMC);
> + u8 esmramc = read_pci_config_byte(0, 0, 0, I845_ESMRAMC);
> + u8 tseg_size = esmramc & I845_TSEG_SIZE_MASK;
>
> - if (!(tmp & TSEG_ENABLE))
> + if (!(esmramc & TSEG_ENABLE))
> return 0;
>
> - switch (tmp & I845_TSEG_SIZE_MASK) {
> - case I845_TSEG_SIZE_512K:
> - return KB(512);
> - case I845_TSEG_SIZE_1M:
> - return MB(1);
> + switch (tseg_size) {
> + case I845_TSEG_SIZE_512K: return KB(512);
> + case I845_TSEG_SIZE_1M: return MB(1);
> default:
> - WARN_ON(1);
> - return 0;
> + WARN(1, "Unknown register value!\n");
> }
> + return 0;
> }
>
> static size_t __init i85x_tseg_size(void)
> {
> - u8 tmp = read_pci_config_byte(0, 0, 0, I85X_ESMRAMC);
> + u8 esmramc = read_pci_config_byte(0, 0, 0, I85X_ESMRAMC);
>
> - if (!(tmp & TSEG_ENABLE))
> + if (!(esmramc & TSEG_ENABLE))
> return 0;
>
> return MB(1);
> @@ -300,174 +282,166 @@ static size_t __init i85x_mem_size(void)
> * On 830/845/85x the stolen memory base isn't available in any
> * register. We need to calculate it as TOM-TSEG_SIZE-stolen_size.
> */
> -static u32 __init i830_stolen_base(int num, int slot, int func, size_t stolen_size)
> +static phys_addr_t __init i830_stolen_base(int num, int slot, int func,
> + size_t stolen_size)
> {
> - return i830_mem_size() - i830_tseg_size() - stolen_size;
> + return (phys_addr_t)i830_mem_size() - i830_tseg_size() - stolen_size;
> }
>
> -static u32 __init i845_stolen_base(int num, int slot, int func, size_t stolen_size)
> +static phys_addr_t __init i845_stolen_base(int num, int slot, int func,
> + size_t stolen_size)
> {
> - return i830_mem_size() - i845_tseg_size() - stolen_size;
> + return (phys_addr_t)i830_mem_size() - i845_tseg_size() - stolen_size;
> }
>
> -static u32 __init i85x_stolen_base(int num, int slot, int func, size_t stolen_size)
> +static phys_addr_t __init i85x_stolen_base(int num, int slot, int func,
> + size_t stolen_size)
> {
> - return i85x_mem_size() - i85x_tseg_size() - stolen_size;
> + return (phys_addr_t)i85x_mem_size() - i85x_tseg_size() - stolen_size;
> }
>
> -static u32 __init i865_stolen_base(int num, int slot, int func, size_t stolen_size)
> +static phys_addr_t __init i865_stolen_base(int num, int slot, int func,
> + size_t stolen_size)
> {
> + u16 toud;
> +
> /*
> * FIXME is the graphics stolen memory region
> * always at TOUD? Ie. is it always the last
> * one to be allocated by the BIOS?
> */
> - return read_pci_config_16(0, 0, 0, I865_TOUD) << 16;
> + toud = read_pci_config_16(0, 0, 0, I865_TOUD);
> +
> + return (phys_addr_t)toud << 16;
> +}
> +
> +static phys_addr_t __init gen3_stolen_base(int num, int slot, int func,
> + size_t stolen_size)
> +{
> + u32 bsm;
> +
> + /* Almost universally we can find the Graphics Base of Stolen Memory
> + * at register BSM (0x5c) in the igfx configuration space. On a few
> + * (desktop) machines this is also mirrored in the bridge device at
> + * different locations, or in the MCHBAR.
> + */
> + bsm = read_pci_config(num, slot, func, INTEL_BSM);
> +
> + return (phys_addr_t)bsm & INTEL_BSM_MASK;
> }
>
> static size_t __init i830_stolen_size(int num, int slot, int func)
> {
> - size_t stolen_size;
> u16 gmch_ctrl;
> + u16 gms;
>
> gmch_ctrl = read_pci_config_16(0, 0, 0, I830_GMCH_CTRL);
> -
> - switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
> - case I830_GMCH_GMS_STOLEN_512:
> - stolen_size = KB(512);
> - break;
> - case I830_GMCH_GMS_STOLEN_1024:
> - stolen_size = MB(1);
> - break;
> - case I830_GMCH_GMS_STOLEN_8192:
> - stolen_size = MB(8);
> - break;
> - case I830_GMCH_GMS_LOCAL:
> - /* local memory isn't part of the normal address space */
> - stolen_size = 0;
> - break;
> + gms = gmch_ctrl & I830_GMCH_GMS_MASK;
> +
> + switch (gms) {
> + case I830_GMCH_GMS_STOLEN_512: return KB(512);
> + case I830_GMCH_GMS_STOLEN_1024: return MB(1);
> + case I830_GMCH_GMS_STOLEN_8192: return MB(8);
> + /* local memory isn't part of the normal address space */
> + case I830_GMCH_GMS_LOCAL: return 0;
> default:
> - return 0;
> + WARN(1, "Unknown register value!\n");
> }
>
> - return stolen_size;
> + return 0;
> }
>
> static size_t __init gen3_stolen_size(int num, int slot, int func)
> {
> - size_t stolen_size;
> u16 gmch_ctrl;
> + u16 gms;
>
> gmch_ctrl = read_pci_config_16(0, 0, 0, I830_GMCH_CTRL);
> -
> - switch (gmch_ctrl & I855_GMCH_GMS_MASK) {
> - case I855_GMCH_GMS_STOLEN_1M:
> - stolen_size = MB(1);
> - break;
> - case I855_GMCH_GMS_STOLEN_4M:
> - stolen_size = MB(4);
> - break;
> - case I855_GMCH_GMS_STOLEN_8M:
> - stolen_size = MB(8);
> - break;
> - case I855_GMCH_GMS_STOLEN_16M:
> - stolen_size = MB(16);
> - break;
> - case I855_GMCH_GMS_STOLEN_32M:
> - stolen_size = MB(32);
> - break;
> - case I915_GMCH_GMS_STOLEN_48M:
> - stolen_size = MB(48);
> - break;
> - case I915_GMCH_GMS_STOLEN_64M:
> - stolen_size = MB(64);
> - break;
> - case G33_GMCH_GMS_STOLEN_128M:
> - stolen_size = MB(128);
> - break;
> - case G33_GMCH_GMS_STOLEN_256M:
> - stolen_size = MB(256);
> - break;
> - case INTEL_GMCH_GMS_STOLEN_96M:
> - stolen_size = MB(96);
> - break;
> - case INTEL_GMCH_GMS_STOLEN_160M:
> - stolen_size = MB(160);
> - break;
> - case INTEL_GMCH_GMS_STOLEN_224M:
> - stolen_size = MB(224);
> - break;
> - case INTEL_GMCH_GMS_STOLEN_352M:
> - stolen_size = MB(352);
> - break;
> + gms = gmch_ctrl & I855_GMCH_GMS_MASK;
> +
> + switch (gms) {
> + case I855_GMCH_GMS_STOLEN_1M: return MB(1);
> + case I855_GMCH_GMS_STOLEN_4M: return MB(4);
> + case I855_GMCH_GMS_STOLEN_8M: return MB(8);
> + case I855_GMCH_GMS_STOLEN_16M: return MB(16);
> + case I855_GMCH_GMS_STOLEN_32M: return MB(32);
> + case I915_GMCH_GMS_STOLEN_48M: return MB(48);
> + case I915_GMCH_GMS_STOLEN_64M: return MB(64);
> + case G33_GMCH_GMS_STOLEN_128M: return MB(128);
> + case G33_GMCH_GMS_STOLEN_256M: return MB(256);
> + case INTEL_GMCH_GMS_STOLEN_96M: return MB(96);
> + case INTEL_GMCH_GMS_STOLEN_160M:return MB(160);
> + case INTEL_GMCH_GMS_STOLEN_224M:return MB(224);
> + case INTEL_GMCH_GMS_STOLEN_352M:return MB(352);
> default:
> - stolen_size = 0;
> - break;
> + WARN(1, "Unknown register value!\n");
> }
>
> - return stolen_size;
> + return 0;
> }
>
> static size_t __init gen6_stolen_size(int num, int slot, int func)
> {
> u16 gmch_ctrl;
> + u16 gms;
>
> gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
> - gmch_ctrl >>= SNB_GMCH_GMS_SHIFT;
> - gmch_ctrl &= SNB_GMCH_GMS_MASK;
> + gms = (gmch_ctrl >> SNB_GMCH_GMS_SHIFT) & SNB_GMCH_GMS_MASK;
>
> - return gmch_ctrl << 25; /* 32 MB units */
> + return (size_t)gms * MB(32);
> }
>
> static size_t __init gen8_stolen_size(int num, int slot, int func)
> {
> u16 gmch_ctrl;
> + u16 gms;
>
> gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
> - gmch_ctrl >>= BDW_GMCH_GMS_SHIFT;
> - gmch_ctrl &= BDW_GMCH_GMS_MASK;
> - return gmch_ctrl << 25; /* 32 MB units */
> + gms = (gmch_ctrl >> BDW_GMCH_GMS_SHIFT) & BDW_GMCH_GMS_MASK;
> +
> + return (size_t)gms * MB(32);
> }
>
> static size_t __init chv_stolen_size(int num, int slot, int func)
> {
> u16 gmch_ctrl;
> + u16 gms;
>
> gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
> - gmch_ctrl >>= SNB_GMCH_GMS_SHIFT;
> - gmch_ctrl &= SNB_GMCH_GMS_MASK;
> + gms = (gmch_ctrl >> SNB_GMCH_GMS_SHIFT) & 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;
> + if (gms < 0x11)
> + return (size_t)gms * MB(32);
> + else if (gms < 0x17)
> + return (size_t)(gms - 0x11 + 2) * MB(4);
> else
> - return (gmch_ctrl - 0x17 + 9) << 22;
> + return (size_t)(gms - 0x17 + 9) * MB(4);
> }
>
> struct intel_stolen_funcs {
> size_t (*size)(int num, int slot, int func);
> - u32 (*base)(int num, int slot, int func, size_t size);
> + 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;
> + u16 gms;
>
> gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
> - gmch_ctrl >>= BDW_GMCH_GMS_SHIFT;
> - gmch_ctrl &= BDW_GMCH_GMS_MASK;
> + gms = (gmch_ctrl >> BDW_GMCH_GMS_SHIFT) & BDW_GMCH_GMS_MASK;
>
> - if (gmch_ctrl < 0xf0)
> - return gmch_ctrl << 25; /* 32 MB units */
> + /* 0x0 to 0xef: 32MB increments starting at 0MB */
> + /* 0xf0 to 0xfe: 4MB increments starting at 4MB */
> + if (gms < 0xf0)
> + return (size_t)gms * MB(32);
> else
> - /* 4MB increments starting at 0xf0 for 4MB */
> - return (gmch_ctrl - 0xf0 + 1) << 22;
> + return (size_t)(gms - 0xf0 + 1) * MB(4);
> }
>
> typedef size_t (*stolen_size_fn)(int num, int slot, int func);
> @@ -493,27 +467,27 @@ static const struct intel_stolen_funcs i865_stolen_funcs __initconst = {
> };
>
> static const struct intel_stolen_funcs gen3_stolen_funcs __initconst = {
> - .base = intel_stolen_base,
> + .base = gen3_stolen_base,
> .size = gen3_stolen_size,
> };
>
> static const struct intel_stolen_funcs gen6_stolen_funcs __initconst = {
> - .base = intel_stolen_base,
> + .base = gen3_stolen_base,
> .size = gen6_stolen_size,
> };
>
> static const struct intel_stolen_funcs gen8_stolen_funcs __initconst = {
> - .base = intel_stolen_base,
> + .base = gen3_stolen_base,
> .size = gen8_stolen_size,
> };
>
> static const struct intel_stolen_funcs gen9_stolen_funcs __initconst = {
> - .base = intel_stolen_base,
> + .base = gen3_stolen_base,
> .size = gen9_stolen_size,
> };
>
> static const struct intel_stolen_funcs chv_stolen_funcs __initconst = {
> - .base = intel_stolen_base,
> + .base = gen3_stolen_base,
> .size = chv_stolen_size,
> };
>
> @@ -554,7 +528,7 @@ static void __init intel_graphics_stolen(int num, int slot, int func)
> {
> size_t size;
> int i;
> - u32 start;
> + phys_addr_t start;
> u16 device, subvendor, subdevice;
>
> device = read_pci_config_16(num, slot, func, PCI_DEVICE_ID);
> @@ -569,8 +543,8 @@ static void __init intel_graphics_stolen(int num, int slot, int func)
> 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%x-0x%x\n",
> - start, start + (u32)size - 1);
> + 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,
> diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
> index b7ce963..68fde8f 100644
> --- a/drivers/gpu/drm/i915/i915_gem_stolen.c
> +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
> @@ -109,9 +109,9 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
> if (INTEL_INFO(dev)->gen >= 3) {
> u32 bsm;
>
> - pci_read_config_dword(dev->pdev, BSM, &bsm);
> + pci_read_config_dword(dev->pdev, INTEL_BSM, &bsm);
>
> - base = bsm & BSM_MASK;
> + base = bsm & INTEL_BSM_MASK;
> } else if (IS_I865G(dev)) {
> u16 toud = 0;
>
> diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h
> index 595f85c..b1755f8 100644
> --- a/include/drm/i915_drm.h
> +++ b/include/drm/i915_drm.h
> @@ -92,4 +92,7 @@ extern bool i915_gpu_turbo_disable(void);
> #define I845_TSEG_SIZE_512K (2 << 1)
> #define I845_TSEG_SIZE_1M (3 << 1)
>
> +#define INTEL_BSM 0x5c
> +#define INTEL_BSM_MASK (0xFFFF << 20)
> +
> #endif /* _I915_DRM_H_ */
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-04-27 10:49 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-22 11:25 Cleanup of early quirks Joonas Lahtinen
2016-04-22 11:25 ` [PATCH 1/2] drm/i915: Canonicalize stolen memory calculations Joonas Lahtinen
2016-04-22 11:48 ` Chris Wilson
2016-04-27 10:50 ` Joonas Lahtinen [this message]
2016-04-22 11:25 ` [PATCH 2/2] drm/i915: Function per early graphics quirk Joonas Lahtinen
2016-04-22 11:55 ` Chris Wilson
2016-04-22 12:07 ` Joonas Lahtinen
2016-04-22 12:17 ` Chris Wilson
2016-04-22 12:28 ` [PATCH v2 1/2] drm/i915: Canonicalize stolen memory calculations Joonas Lahtinen
2016-04-22 12:28 ` [PATCH v2 2/2] drm/i915: Function per early graphics quirk Joonas Lahtinen
2016-04-27 10:52 ` Joonas Lahtinen
2016-04-22 13:32 ` ✗ Fi.CI.BAT: warning for series starting with [1/2] drm/i915: Canonicalize stolen memory calculations (rev2) Patchwork
2016-04-24 7:53 ` Patchwork
2016-04-25 8:54 ` Joonas Lahtinen
2016-04-25 9:23 ` Tvrtko Ursulin
2016-04-25 10:35 ` Joonas Lahtinen
2016-04-25 10:49 ` Mika Kuoppala
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1461754239.3986.30.camel@linux.intel.com \
--to=joonas.lahtinen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=mika.kuoppala@intel.com \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.