diff options
| author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2014-02-05 14:28:58 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2014-02-09 09:11:30 -0500 |
| commit | 52ca70454ea5ff29bc39f7871d28f8e6f4713867 (patch) | |
| tree | 977a4bb8986b86f8a0316ab3e7c29a09045d55fb | |
| parent | 494479038d97f1b9f76fc633a360a681acdf035c (diff) | |
x86/gpu: Add vfunc for Intel graphics stolen memory base address
For gen2 devices we're going to need another way to determine
the stolen memory base address. Make that into a vfunc as well.
Also drop the bogus inline keyword from gen8_stolen_size().
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Link: http://lkml.kernel.org/r/1391628540-23072-2-git-send-email-ville.syrjala@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
| -rw-r--r-- | arch/x86/kernel/early-quirks.c | 77 |
1 files changed, 48 insertions, 29 deletions
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index bc4a088f9023..fddd4d05d1fa 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
| @@ -228,7 +228,7 @@ static void __init intel_remapping_check(int num, int slot, int func) | |||
| 228 | * | 228 | * |
| 229 | * And yes, so far on current devices the base addr is always under 4G. | 229 | * And yes, so far on current devices the base addr is always under 4G. |
| 230 | */ | 230 | */ |
| 231 | static u32 __init intel_stolen_base(int num, int slot, int func) | 231 | static u32 __init intel_stolen_base(int num, int slot, int func, size_t stolen_size) |
| 232 | { | 232 | { |
| 233 | u32 base; | 233 | u32 base; |
| 234 | 234 | ||
| @@ -313,7 +313,7 @@ static size_t __init gen6_stolen_size(int num, int slot, int func) | |||
| 313 | return gmch_ctrl << 25; /* 32 MB units */ | 313 | return gmch_ctrl << 25; /* 32 MB units */ |
| 314 | } | 314 | } |
| 315 | 315 | ||
| 316 | static inline size_t gen8_stolen_size(int num, int slot, int func) | 316 | static size_t gen8_stolen_size(int num, int slot, int func) |
| 317 | { | 317 | { |
| 318 | u16 gmch_ctrl; | 318 | u16 gmch_ctrl; |
| 319 | 319 | ||
| @@ -323,31 +323,50 @@ static inline size_t gen8_stolen_size(int num, int slot, int func) | |||
| 323 | return gmch_ctrl << 25; /* 32 MB units */ | 323 | return gmch_ctrl << 25; /* 32 MB units */ |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | typedef size_t (*stolen_size_fn)(int num, int slot, int func); | 326 | |
| 327 | struct intel_stolen_funcs { | ||
| 328 | size_t (*size)(int num, int slot, int func); | ||
| 329 | u32 (*base)(int num, int slot, int func, size_t size); | ||
| 330 | }; | ||
| 331 | |||
| 332 | static const struct intel_stolen_funcs gen3_stolen_funcs = { | ||
| 333 | .base = intel_stolen_base, | ||
| 334 | .size = gen3_stolen_size, | ||
| 335 | }; | ||
| 336 | |||
| 337 | static const struct intel_stolen_funcs gen6_stolen_funcs = { | ||
| 338 | .base = intel_stolen_base, | ||
| 339 | .size = gen6_stolen_size, | ||
| 340 | }; | ||
| 341 | |||
| 342 | static const struct intel_stolen_funcs gen8_stolen_funcs = { | ||
| 343 | .base = intel_stolen_base, | ||
| 344 | .size = gen8_stolen_size, | ||
| 345 | }; | ||
| 327 | 346 | ||
| 328 | static struct pci_device_id intel_stolen_ids[] __initdata = { | 347 | static struct pci_device_id intel_stolen_ids[] __initdata = { |
| 329 | INTEL_I915G_IDS(gen3_stolen_size), | 348 | INTEL_I915G_IDS(&gen3_stolen_funcs), |
| 330 | INTEL_I915GM_IDS(gen3_stolen_size), | 349 | INTEL_I915GM_IDS(&gen3_stolen_funcs), |
| 331 | INTEL_I945G_IDS(gen3_stolen_size), | 350 | INTEL_I945G_IDS(&gen3_stolen_funcs), |
| 332 | INTEL_I945GM_IDS(gen3_stolen_size), | 351 | INTEL_I945GM_IDS(&gen3_stolen_funcs), |
| 333 | INTEL_VLV_M_IDS(gen6_stolen_size), | 352 | INTEL_VLV_M_IDS(&gen6_stolen_funcs), |
| 334 | INTEL_VLV_D_IDS(gen6_stolen_size), | 353 | INTEL_VLV_D_IDS(&gen6_stolen_funcs), |
| 335 | INTEL_PINEVIEW_IDS(gen3_stolen_size), | 354 | INTEL_PINEVIEW_IDS(&gen3_stolen_funcs), |
| 336 | INTEL_I965G_IDS(gen3_stolen_size), | 355 | INTEL_I965G_IDS(&gen3_stolen_funcs), |
| 337 | INTEL_G33_IDS(gen3_stolen_size), | 356 | INTEL_G33_IDS(&gen3_stolen_funcs), |
| 338 | INTEL_I965GM_IDS(gen3_stolen_size), | 357 | INTEL_I965GM_IDS(&gen3_stolen_funcs), |
| 339 | INTEL_GM45_IDS(gen3_stolen_size), | 358 | INTEL_GM45_IDS(&gen3_stolen_funcs), |
| 340 | INTEL_G45_IDS(gen3_stolen_size), | 359 | INTEL_G45_IDS(&gen3_stolen_funcs), |
| 341 | INTEL_IRONLAKE_D_IDS(gen3_stolen_size), | 360 | INTEL_IRONLAKE_D_IDS(&gen3_stolen_funcs), |
| 342 | INTEL_IRONLAKE_M_IDS(gen3_stolen_size), | 361 | INTEL_IRONLAKE_M_IDS(&gen3_stolen_funcs), |
| 343 | INTEL_SNB_D_IDS(gen6_stolen_size), | 362 | INTEL_SNB_D_IDS(&gen6_stolen_funcs), |
| 344 | INTEL_SNB_M_IDS(gen6_stolen_size), | 363 | INTEL_SNB_M_IDS(&gen6_stolen_funcs), |
| 345 | INTEL_IVB_M_IDS(gen6_stolen_size), | 364 | INTEL_IVB_M_IDS(&gen6_stolen_funcs), |
| 346 | INTEL_IVB_D_IDS(gen6_stolen_size), | 365 | INTEL_IVB_D_IDS(&gen6_stolen_funcs), |
| 347 | INTEL_HSW_D_IDS(gen6_stolen_size), | 366 | INTEL_HSW_D_IDS(&gen6_stolen_funcs), |
| 348 | INTEL_HSW_M_IDS(gen6_stolen_size), | 367 | INTEL_HSW_M_IDS(&gen6_stolen_funcs), |
| 349 | INTEL_BDW_M_IDS(gen8_stolen_size), | 368 | INTEL_BDW_M_IDS(&gen8_stolen_funcs), |
| 350 | INTEL_BDW_D_IDS(gen8_stolen_size) | 369 | INTEL_BDW_D_IDS(&gen8_stolen_funcs) |
| 351 | }; | 370 | }; |
| 352 | 371 | ||
| 353 | static void __init intel_graphics_stolen(int num, int slot, int func) | 372 | static void __init intel_graphics_stolen(int num, int slot, int func) |
| @@ -364,10 +383,10 @@ static void __init intel_graphics_stolen(int num, int slot, int func) | |||
| 364 | 383 | ||
| 365 | for (i = 0; i < ARRAY_SIZE(intel_stolen_ids); i++) { | 384 | for (i = 0; i < ARRAY_SIZE(intel_stolen_ids); i++) { |
| 366 | if (intel_stolen_ids[i].device == device) { | 385 | if (intel_stolen_ids[i].device == device) { |
| 367 | stolen_size_fn stolen_size = | 386 | const struct intel_stolen_funcs *stolen_funcs = |
| 368 | (stolen_size_fn)intel_stolen_ids[i].driver_data; | 387 | (const struct intel_stolen_funcs *)intel_stolen_ids[i].driver_data; |
| 369 | size = stolen_size(num, slot, func); | 388 | size = stolen_funcs->size(num, slot, func); |
| 370 | start = intel_stolen_base(num, slot, func); | 389 | start = stolen_funcs->base(num, slot, func, size); |
| 371 | if (size && start) { | 390 | if (size && start) { |
| 372 | /* Mark this space as reserved */ | 391 | /* Mark this space as reserved */ |
| 373 | e820_add_region(start, size, E820_RESERVED); | 392 | e820_add_region(start, size, E820_RESERVED); |
