Commit 6f9fa996 authored by Joonas Lahtinen's avatar Joonas Lahtinen

x86/early-quirks: Extend Intel graphics stolen memory placement to 64bit

To give upcoming SKU BIOSes more flexibility in placing the Intel
graphics stolen memory, make all variables storing the placement or size
compatible with full 64 bit range.
Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarMatthew Auld <matthew.auld@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: x86@kernel.org
Cc: linux-kernel@vger.kernel.org
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Acked-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20171211151822.20953-2-matthew.auld@intel.com
parent b92326a0
...@@ -243,7 +243,7 @@ static void __init intel_remapping_check(int num, int slot, int func) ...@@ -243,7 +243,7 @@ static void __init intel_remapping_check(int num, int slot, int func)
#define KB(x) ((x) * 1024UL) #define KB(x) ((x) * 1024UL)
#define MB(x) (KB (KB (x))) #define MB(x) (KB (KB (x)))
static size_t __init i830_tseg_size(void) static resource_size_t __init i830_tseg_size(void)
{ {
u8 esmramc = read_pci_config_byte(0, 0, 0, I830_ESMRAMC); u8 esmramc = read_pci_config_byte(0, 0, 0, I830_ESMRAMC);
...@@ -256,7 +256,7 @@ static size_t __init i830_tseg_size(void) ...@@ -256,7 +256,7 @@ static size_t __init i830_tseg_size(void)
return KB(512); return KB(512);
} }
static size_t __init i845_tseg_size(void) static resource_size_t __init i845_tseg_size(void)
{ {
u8 esmramc = 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; u8 tseg_size = esmramc & I845_TSEG_SIZE_MASK;
...@@ -273,7 +273,7 @@ static size_t __init i845_tseg_size(void) ...@@ -273,7 +273,7 @@ static size_t __init i845_tseg_size(void)
return 0; return 0;
} }
static size_t __init i85x_tseg_size(void) static resource_size_t __init i85x_tseg_size(void)
{ {
u8 esmramc = read_pci_config_byte(0, 0, 0, I85X_ESMRAMC); u8 esmramc = read_pci_config_byte(0, 0, 0, I85X_ESMRAMC);
...@@ -283,12 +283,12 @@ static size_t __init i85x_tseg_size(void) ...@@ -283,12 +283,12 @@ static size_t __init i85x_tseg_size(void)
return MB(1); return MB(1);
} }
static size_t __init i830_mem_size(void) static resource_size_t __init i830_mem_size(void)
{ {
return read_pci_config_byte(0, 0, 0, I830_DRB3) * MB(32); return read_pci_config_byte(0, 0, 0, I830_DRB3) * MB(32);
} }
static size_t __init i85x_mem_size(void) static resource_size_t __init i85x_mem_size(void)
{ {
return read_pci_config_byte(0, 0, 1, I85X_DRB3) * MB(32); return read_pci_config_byte(0, 0, 1, I85X_DRB3) * MB(32);
} }
...@@ -297,36 +297,36 @@ static size_t __init i85x_mem_size(void) ...@@ -297,36 +297,36 @@ static size_t __init i85x_mem_size(void)
* On 830/845/85x the stolen memory base isn't available in any * 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. * register. We need to calculate it as TOM-TSEG_SIZE-stolen_size.
*/ */
static phys_addr_t __init i830_stolen_base(int num, int slot, int func, static resource_size_t __init i830_stolen_base(int num, int slot, int func,
size_t stolen_size) resource_size_t stolen_size)
{ {
return (phys_addr_t)i830_mem_size() - i830_tseg_size() - stolen_size; return i830_mem_size() - i830_tseg_size() - stolen_size;
} }
static phys_addr_t __init i845_stolen_base(int num, int slot, int func, static resource_size_t __init i845_stolen_base(int num, int slot, int func,
size_t stolen_size) resource_size_t stolen_size)
{ {
return (phys_addr_t)i830_mem_size() - i845_tseg_size() - stolen_size; return i830_mem_size() - i845_tseg_size() - stolen_size;
} }
static phys_addr_t __init i85x_stolen_base(int num, int slot, int func, static resource_size_t __init i85x_stolen_base(int num, int slot, int func,
size_t stolen_size) resource_size_t stolen_size)
{ {
return (phys_addr_t)i85x_mem_size() - i85x_tseg_size() - stolen_size; return i85x_mem_size() - i85x_tseg_size() - stolen_size;
} }
static phys_addr_t __init i865_stolen_base(int num, int slot, int func, static resource_size_t __init i865_stolen_base(int num, int slot, int func,
size_t stolen_size) resource_size_t stolen_size)
{ {
u16 toud = 0; u16 toud = 0;
toud = read_pci_config_16(0, 0, 0, I865_TOUD); toud = read_pci_config_16(0, 0, 0, I865_TOUD);
return (phys_addr_t)(toud << 16) + i845_tseg_size(); return toud * KB(64) + i845_tseg_size();
} }
static phys_addr_t __init gen3_stolen_base(int num, int slot, int func, static resource_size_t __init gen3_stolen_base(int num, int slot, int func,
size_t stolen_size) resource_size_t stolen_size)
{ {
u32 bsm; u32 bsm;
...@@ -337,10 +337,10 @@ static phys_addr_t __init gen3_stolen_base(int num, int slot, int func, ...@@ -337,10 +337,10 @@ static phys_addr_t __init gen3_stolen_base(int num, int slot, int func,
*/ */
bsm = read_pci_config(num, slot, func, INTEL_BSM); bsm = read_pci_config(num, slot, func, INTEL_BSM);
return (phys_addr_t)bsm & INTEL_BSM_MASK; return bsm & INTEL_BSM_MASK;
} }
static size_t __init i830_stolen_size(int num, int slot, int func) static resource_size_t __init i830_stolen_size(int num, int slot, int func)
{ {
u16 gmch_ctrl; u16 gmch_ctrl;
u16 gms; u16 gms;
...@@ -361,7 +361,7 @@ static size_t __init i830_stolen_size(int num, int slot, int func) ...@@ -361,7 +361,7 @@ static size_t __init i830_stolen_size(int num, int slot, int func)
return 0; return 0;
} }
static size_t __init gen3_stolen_size(int num, int slot, int func) static resource_size_t __init gen3_stolen_size(int num, int slot, int func)
{ {
u16 gmch_ctrl; u16 gmch_ctrl;
u16 gms; u16 gms;
...@@ -390,7 +390,7 @@ static size_t __init gen3_stolen_size(int num, int slot, int func) ...@@ -390,7 +390,7 @@ static size_t __init gen3_stolen_size(int num, int slot, int func)
return 0; return 0;
} }
static size_t __init gen6_stolen_size(int num, int slot, int func) static resource_size_t __init gen6_stolen_size(int num, int slot, int func)
{ {
u16 gmch_ctrl; u16 gmch_ctrl;
u16 gms; u16 gms;
...@@ -398,10 +398,10 @@ static size_t __init gen6_stolen_size(int num, int slot, int func) ...@@ -398,10 +398,10 @@ static size_t __init gen6_stolen_size(int num, int slot, int func)
gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL); gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
gms = (gmch_ctrl >> SNB_GMCH_GMS_SHIFT) & SNB_GMCH_GMS_MASK; gms = (gmch_ctrl >> SNB_GMCH_GMS_SHIFT) & SNB_GMCH_GMS_MASK;
return (size_t)gms * MB(32); return gms * MB(32);
} }
static size_t __init gen8_stolen_size(int num, int slot, int func) static resource_size_t __init gen8_stolen_size(int num, int slot, int func)
{ {
u16 gmch_ctrl; u16 gmch_ctrl;
u16 gms; u16 gms;
...@@ -409,10 +409,10 @@ static size_t __init gen8_stolen_size(int num, int slot, int func) ...@@ -409,10 +409,10 @@ static size_t __init gen8_stolen_size(int num, int slot, int func)
gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL); gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
gms = (gmch_ctrl >> BDW_GMCH_GMS_SHIFT) & BDW_GMCH_GMS_MASK; gms = (gmch_ctrl >> BDW_GMCH_GMS_SHIFT) & BDW_GMCH_GMS_MASK;
return (size_t)gms * MB(32); return gms * MB(32);
} }
static size_t __init chv_stolen_size(int num, int slot, int func) static resource_size_t __init chv_stolen_size(int num, int slot, int func)
{ {
u16 gmch_ctrl; u16 gmch_ctrl;
u16 gms; u16 gms;
...@@ -426,14 +426,14 @@ static size_t __init chv_stolen_size(int num, int slot, int func) ...@@ -426,14 +426,14 @@ static size_t __init chv_stolen_size(int num, int slot, int func)
* 0x17 to 0x1d: 4MB increments start at 36MB * 0x17 to 0x1d: 4MB increments start at 36MB
*/ */
if (gms < 0x11) if (gms < 0x11)
return (size_t)gms * MB(32); return gms * MB(32);
else if (gms < 0x17) else if (gms < 0x17)
return (size_t)(gms - 0x11 + 2) * MB(4); return (gms - 0x11 + 2) * MB(4);
else else
return (size_t)(gms - 0x17 + 9) * MB(4); return (gms - 0x17 + 9) * MB(4);
} }
static size_t __init gen9_stolen_size(int num, int slot, int func) static resource_size_t __init gen9_stolen_size(int num, int slot, int func)
{ {
u16 gmch_ctrl; u16 gmch_ctrl;
u16 gms; u16 gms;
...@@ -444,14 +444,15 @@ static size_t __init gen9_stolen_size(int num, int slot, int func) ...@@ -444,14 +444,15 @@ static size_t __init gen9_stolen_size(int num, int slot, int func)
/* 0x0 to 0xef: 32MB increments starting at 0MB */ /* 0x0 to 0xef: 32MB increments starting at 0MB */
/* 0xf0 to 0xfe: 4MB increments starting at 4MB */ /* 0xf0 to 0xfe: 4MB increments starting at 4MB */
if (gms < 0xf0) if (gms < 0xf0)
return (size_t)gms * MB(32); return gms * MB(32);
else else
return (size_t)(gms - 0xf0 + 1) * MB(4); return (gms - 0xf0 + 1) * MB(4);
} }
struct intel_early_ops { struct intel_early_ops {
size_t (*stolen_size)(int num, int slot, int func); resource_size_t (*stolen_size)(int num, int slot, int func);
phys_addr_t (*stolen_base)(int num, int slot, int func, size_t size); resource_size_t (*stolen_base)(int num, int slot, int func,
resource_size_t size);
}; };
static const struct intel_early_ops i830_early_ops __initconst = { static const struct intel_early_ops i830_early_ops __initconst = {
...@@ -535,8 +536,8 @@ static void __init ...@@ -535,8 +536,8 @@ static void __init
intel_graphics_stolen(int num, int slot, int func, intel_graphics_stolen(int num, int slot, int func,
const struct intel_early_ops *early_ops) const struct intel_early_ops *early_ops)
{ {
phys_addr_t base, end; resource_size_t base, size;
size_t size; resource_size_t end;
size = early_ops->stolen_size(num, slot, func); size = early_ops->stolen_size(num, slot, func);
base = early_ops->stolen_base(num, slot, func, size); base = early_ops->stolen_base(num, slot, func, size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment