All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [tip:x86/urgent] x86/Sandy Bridge:  reserve pages when integrated graphics is present
       [not found] <tip-a9acc5365dbda29f7be2884efb63771dc24bd815@git.kernel.org>
@ 2013-01-11 23:00 ` Jesse Barnes
  2013-01-12  0:08   ` H. Peter Anvin
  2013-01-13 20:30   ` Mathias Krause
  0 siblings, 2 replies; 4+ messages in thread
From: Jesse Barnes @ 2013-01-11 23:00 UTC (permalink / raw)
  To: linux-kernel, mingo, hpa, jbarnes, tglx, hpa
  Cc: linux-tip-commits, Stéphane Marchesin

On Fri, 11 Jan 2013 14:39:04 -0800
tip-bot for Jesse Barnes <jbarnes@virtuousgeek.org> wrote:

> Commit-ID:  a9acc5365dbda29f7be2884efb63771dc24bd815
> Gitweb:     http://git.kernel.org/tip/a9acc5365dbda29f7be2884efb63771dc24bd815
> Author:     Jesse Barnes <jbarnes@virtuousgeek.org>
> AuthorDate: Wed, 14 Nov 2012 20:43:31 +0000
> Committer:  H. Peter Anvin <hpa@linux.intel.com>
> CommitDate: Fri, 11 Jan 2013 14:26:38 -0800
> 
> x86/Sandy Bridge: reserve pages when integrated graphics is present
> 
> SNB graphics devices have a bug that prevent them from accessing certain
> memory ranges, namely anything below 1M and in the pages listed in the
> table.  So reserve those at boot if set detect a SNB gfx device on the
> CPU to avoid GPU hangs.
> 
> Stephane Marchesin had a similar patch to the page allocator awhile
> back, but rather than reserving pages up front, it leaked them at
> allocation time.
> 
> [ hpa: made a number of stylistic changes, marked arrays as static
>   const, and made less verbose; use "memblock=debug" for full
>   verbosity. ]
> 
> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
> ---
>  arch/x86/kernel/setup.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 78 insertions(+)
> 
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index 23ddd55..9dcb325 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -610,6 +610,81 @@ static __init void reserve_ibft_region(void)
>  
>  static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
>  
> +static bool __init snb_gfx_workaround_needed(void)
> +{
> +	int i;
> +	u16 vendor, devid;
> +	static const u16 snb_ids[] = {
> +		0x0102,
> +		0x0112,
> +		0x0122,
> +		0x0106,
> +		0x0116,
> +		0x0126,
> +		0x010a,
> +	};
> +
> +	/* Assume no if something weird is going on with PCI */
> +	if (!early_pci_allowed())
> +		return false;
> +
> +	vendor = read_pci_config_16(0, 2, 0, PCI_VENDOR_ID);
> +	if (vendor != 0x8086)
> +		return false;
> +
> +	devid = read_pci_config_16(0, 2, 0, PCI_DEVICE_ID);
> +	for (i = 0; i < ARRAY_SIZE(snb_ids); i++)
> +		if (devid == snb_ids[i])
> +			return true;
> +
> +	return false;
> +}
> +
> +/*
> + * Sandy Bridge graphics has trouble with certain ranges, exclude
> + * them from allocation.
> + */
> +static void __init trim_snb_memory(void)
> +{
> +	static const unsigned long bad_pages[] = {
> +		0x20050000,
> +		0x20110000,
> +		0x20130000,
> +		0x20138000,
> +		0x40004000,
> +	};
> +	int i;
> +
> +	if (!snb_gfx_workaround_needed())
> +		return;
> +
> +	printk(KERN_DEBUG "reserving inaccessible SNB gfx pages\n");
> +
> +	/*
> +	 * Reserve all memory below the 1 MB mark that has not
> +	 * already been reserved.
> +	 */
> +	memblock_reserve(0, 1<<20);
> +	
> +	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) {
> +		if (memblock_reserve(bad_pages[i], PAGE_SIZE))
> +			printk(KERN_WARNING "failed to reserve 0x%08lx\n",
> +			       bad_pages[i]);
> +	}
> +}
> +
> +/*
> + * Here we put platform-specific memory range workarounds, i.e.
> + * memory known to be corrupt or otherwise in need to be reserved on
> + * specific platforms.
> + *
> + * If this gets used more widely it could use a real dispatch mechanism.
> + */
> +static void __init trim_platform_memory_ranges(void)
> +{
> +	trim_snb_memory();
> +}
> +
>  static void __init trim_bios_range(void)
>  {
>  	/*
> @@ -630,6 +705,7 @@ static void __init trim_bios_range(void)
>  	 * take them out.
>  	 */
>  	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1);
> +
>  	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
>  }
>  
> @@ -908,6 +984,8 @@ void __init setup_arch(char **cmdline_p)
>  
>  	setup_real_mode();
>  
> +	trim_platform_memory_ranges();
> +
>  	init_gbpages();
>  
>  	/* max_pfn_mapped is updated here */
> 

Great, thanks Peter.

Stephane, care to try this out?

-- 
Jesse Barnes, Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [tip:x86/urgent] x86/Sandy Bridge:  reserve pages when integrated graphics is present
  2013-01-11 23:00 ` [tip:x86/urgent] x86/Sandy Bridge: reserve pages when integrated graphics is present Jesse Barnes
@ 2013-01-12  0:08   ` H. Peter Anvin
  2013-01-13 20:30   ` Mathias Krause
  1 sibling, 0 replies; 4+ messages in thread
From: H. Peter Anvin @ 2013-01-12  0:08 UTC (permalink / raw)
  To: Jesse Barnes
  Cc: linux-kernel, mingo, hpa, tglx, linux-tip-commits,
	Stéphane Marchesin

On 01/11/2013 03:00 PM, Jesse Barnes wrote:
> 
> Great, thanks Peter.
> 
> Stephane, care to try this out?
> 

For the record, I can confirm that it reserves the appropriate ranges on
my personal Sandy Bridge system; I don't have any test which can provoke
the use of these pages, so I can't say I have "fully tested" this.

	-hpa


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [tip:x86/urgent] x86/Sandy Bridge:  reserve pages when integrated graphics is present
  2013-01-11 23:00 ` [tip:x86/urgent] x86/Sandy Bridge: reserve pages when integrated graphics is present Jesse Barnes
  2013-01-12  0:08   ` H. Peter Anvin
@ 2013-01-13 20:30   ` Mathias Krause
  2013-01-14  5:11     ` [tip:x86/urgent] x86/Sandy Bridge: mark arrays in __init functions as __initconst tip-bot for H. Peter Anvin
  1 sibling, 1 reply; 4+ messages in thread
From: Mathias Krause @ 2013-01-13 20:30 UTC (permalink / raw)
  To: hpa
  Cc: linux-kernel, mingo, hpa, tglx, linux-tip-commits,
	Stéphane Marchesin, Jesse Barnes

Hi Peter,

Am 12.01.2013 um 00:00 schrieb Jesse Barnes <jbarnes@virtuousgeek.org>:

> On Fri, 11 Jan 2013 14:39:04 -0800
> tip-bot for Jesse Barnes <jbarnes@virtuousgeek.org> wrote:
> 
>> Commit-ID:  a9acc5365dbda29f7be2884efb63771dc24bd815
>> Gitweb:     http://git.kernel.org/tip/a9acc5365dbda29f7be2884efb63771dc24bd815
>> Author:     Jesse Barnes <jbarnes@virtuousgeek.org>
>> AuthorDate: Wed, 14 Nov 2012 20:43:31 +0000
>> Committer:  H. Peter Anvin <hpa@linux.intel.com>
>> CommitDate: Fri, 11 Jan 2013 14:26:38 -0800
>> 
>> x86/Sandy Bridge: reserve pages when integrated graphics is present
>> 
>> SNB graphics devices have a bug that prevent them from accessing certain
>> memory ranges, namely anything below 1M and in the pages listed in the
>> table.  So reserve those at boot if set detect a SNB gfx device on the
>> CPU to avoid GPU hangs.
>> 
>> Stephane Marchesin had a similar patch to the page allocator awhile
>> back, but rather than reserving pages up front, it leaked them at
>> allocation time.
>> 
>> [ hpa: made a number of stylistic changes, marked arrays as static
>>  const, and made less verbose; use "memblock=debug" for full
>>  verbosity. ]

That stylistic change introduced the unwanted side effect of leaving the tables in memory after __init cleanup. But that can be fixed, see below :)

>> 
>> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
>> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
>> ---
>> arch/x86/kernel/setup.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 78 insertions(+)
>> 
>> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
>> index 23ddd55..9dcb325 100644
>> --- a/arch/x86/kernel/setup.c
>> +++ b/arch/x86/kernel/setup.c
>> @@ -610,6 +610,81 @@ static __init void reserve_ibft_region(void)
>> 
>> static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
>> 
>> +static bool __init snb_gfx_workaround_needed(void)
>> +{
>> +	int i;
>> +	u16 vendor, devid;
>> +	static const u16 snb_ids[] = {

__initconst is missing here

>> +		0x0102,
>> +		0x0112,
>> +		0x0122,
>> +		0x0106,
>> +		0x0116,
>> +		0x0126,
>> +		0x010a,
>> +	};
>> +
>> +	/* Assume no if something weird is going on with PCI */
>> +	if (!early_pci_allowed())
>> +		return false;
>> +
>> +	vendor = read_pci_config_16(0, 2, 0, PCI_VENDOR_ID);
>> +	if (vendor != 0x8086)
>> +		return false;
>> +
>> +	devid = read_pci_config_16(0, 2, 0, PCI_DEVICE_ID);
>> +	for (i = 0; i < ARRAY_SIZE(snb_ids); i++)
>> +		if (devid == snb_ids[i])
>> +			return true;
>> +
>> +	return false;
>> +}
>> +
>> +/*
>> + * Sandy Bridge graphics has trouble with certain ranges, exclude
>> + * them from allocation.
>> + */
>> +static void __init trim_snb_memory(void)
>> +{
>> +	static const unsigned long bad_pages[] = {

here, too

>> +		0x20050000,
>> +		0x20110000,
>> +		0x20130000,
>> +		0x20138000,
>> +		0x40004000,
>> +	};
>> +	int i;
>> +
>> +	if (!snb_gfx_workaround_needed())
>> +		return;
>> +
>> +	printk(KERN_DEBUG "reserving inaccessible SNB gfx pages\n");
>> +
>> +	/*
>> +	 * Reserve all memory below the 1 MB mark that has not
>> +	 * already been reserved.
>> +	 */
>> +	memblock_reserve(0, 1<<20);
>> +	
>> +	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) {
>> +		if (memblock_reserve(bad_pages[i], PAGE_SIZE))
>> +			printk(KERN_WARNING "failed to reserve 0x%08lx\n",
>> +			       bad_pages[i]);
>> +	}
>> +}
>> +
>> +/*
>> + * Here we put platform-specific memory range workarounds, i.e.
>> + * memory known to be corrupt or otherwise in need to be reserved on
>> + * specific platforms.
>> + *
>> + * If this gets used more widely it could use a real dispatch mechanism.
>> + */
>> +static void __init trim_platform_memory_ranges(void)
>> +{
>> +	trim_snb_memory();
>> +}
>> +
>> static void __init trim_bios_range(void)
>> {
>> 	/*
>> @@ -630,6 +705,7 @@ static void __init trim_bios_range(void)
>> 	 * take them out.
>> 	 */
>> 	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1);
>> +
>> 	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
>> }
>> 
>> @@ -908,6 +984,8 @@ void __init setup_arch(char **cmdline_p)
>> 
>> 	setup_real_mode();
>> 
>> +	trim_platform_memory_ranges();
>> +
>> 	init_gbpages();
>> 
>> 	/* max_pfn_mapped is updated here */
>> 


Regards,
Mathias

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [tip:x86/urgent] x86/Sandy Bridge: mark arrays in __init functions as __initconst
  2013-01-13 20:30   ` Mathias Krause
@ 2013-01-14  5:11     ` tip-bot for H. Peter Anvin
  0 siblings, 0 replies; 4+ messages in thread
From: tip-bot for H. Peter Anvin @ 2013-01-14  5:11 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, minipli, tglx, hpa

Commit-ID:  ab3cd8670e0b3fcde7f029e1503ed3c5138e9571
Gitweb:     http://git.kernel.org/tip/ab3cd8670e0b3fcde7f029e1503ed3c5138e9571
Author:     H. Peter Anvin <hpa@linux.intel.com>
AuthorDate: Sun, 13 Jan 2013 20:36:39 -0800
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Sun, 13 Jan 2013 20:36:39 -0800

x86/Sandy Bridge: mark arrays in __init functions as __initconst

Mark static arrays as __initconst so they get removed when the init
sections are flushed.

Reported-by: Mathias Krause <minipli@googlemail.com>
Link: http://lkml.kernel.org/r/75F4BEE6-CB0E-4426-B40B-697451677738@googlemail.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/kernel/setup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 9dcb325..18182d1 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -614,7 +614,7 @@ static bool __init snb_gfx_workaround_needed(void)
 {
 	int i;
 	u16 vendor, devid;
-	static const u16 snb_ids[] = {
+	static const __initconst u16 snb_ids[] = {
 		0x0102,
 		0x0112,
 		0x0122,
@@ -646,7 +646,7 @@ static bool __init snb_gfx_workaround_needed(void)
  */
 static void __init trim_snb_memory(void)
 {
-	static const unsigned long bad_pages[] = {
+	static const __initconst unsigned long bad_pages[] = {
 		0x20050000,
 		0x20110000,
 		0x20130000,

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-01-14  5:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <tip-a9acc5365dbda29f7be2884efb63771dc24bd815@git.kernel.org>
2013-01-11 23:00 ` [tip:x86/urgent] x86/Sandy Bridge: reserve pages when integrated graphics is present Jesse Barnes
2013-01-12  0:08   ` H. Peter Anvin
2013-01-13 20:30   ` Mathias Krause
2013-01-14  5:11     ` [tip:x86/urgent] x86/Sandy Bridge: mark arrays in __init functions as __initconst tip-bot for H. Peter Anvin

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.