[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] xen/SandyBridge: reserve pages when integrated graphics
On 26/03/2013 09:38, "Xudong Hao" <xudong.hao@xxxxxxxxx> wrote: > 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. > > Xen does not initialize below 1MB to heap, i.e. below 1MB pages don't be > allocated, so it's unnecessary to reserve memory below the 1 MB mark > that has not already been reserved. > > So reserve those pages listed in the table at xen boot if set detect a > SNB gfx device on the CPU to avoid GPU hangs. > > Changes in v2: > - using MFNs directly rather than passing a string to parse, suggestion by Jan > Beulich > > Signed-off-by: Xudong Hao <xudong.hao@xxxxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> > --- > xen/arch/x86/mm.c | 20 ++++++++++++++++++++ > xen/common/page_alloc.c | 23 +++++++++++++++++++++++ > xen/drivers/passthrough/vtd/quirks.c | 2 +- > xen/include/asm-x86/mm.h | 1 + > xen/include/asm-x86/pci.h | 5 +++++ > 5 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c > index add93ac..ee09b55 100644 > --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -121,6 +121,7 @@ > #include <xen/trace.h> > #include <asm/setup.h> > #include <asm/fixmap.h> > +#include <asm/pci.h> > > /* Mapping of the fixmap space needed early. */ > l1_pgentry_t __attribute__ ((__section__ (".bss.page_aligned"))) > @@ -5597,6 +5598,25 @@ void arch_dump_shared_mem_info(void) > mem_sharing_get_nr_saved_mfns()); > } > > +unsigned long *__init get_platform_badpages(int *array_size) > +{ > + u32 igd_id; > + static unsigned long __initdata bad_pages[] = { > + 0x20050000, > + 0x20110000, > + 0x20130000, > + 0x20138000, > + 0x40004000, > + }; > + > + *array_size = ARRAY_SIZE(bad_pages); > + igd_id = pci_conf_read32(0, 0, 2, 0, 0); > + if (!IS_SNB_GFX(igd_id)) > + return NULL; > + > + return bad_pages; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c > index 9e9fb15..45ba327 100644 > --- a/xen/common/page_alloc.c > +++ b/xen/common/page_alloc.c > @@ -152,6 +152,10 @@ void __init init_boot_pages(paddr_t ps, paddr_t pe) > { > unsigned long bad_spfn, bad_epfn; > const char *p; > +#ifdef CONFIG_X86 > + unsigned long *badpage = NULL; > + int i, array_size; > +#endif > > ps = round_pgup(ps); > pe = round_pgdown(pe); > @@ -162,6 +166,25 @@ void __init init_boot_pages(paddr_t ps, paddr_t pe) > > bootmem_region_add(ps >> PAGE_SHIFT, pe >> PAGE_SHIFT); > > +#ifdef CONFIG_X86 > + /* > + * 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. > + * We get these certain pages and remove them from memory region list. > + */ > + badpage = get_platform_badpages(&array_size); > + if ( badpage ) > + { > + for ( i = 0; i < array_size; i++ ) > + { > + bootmem_region_zap(*badpage >> PAGE_SHIFT, > + (*badpage >> PAGE_SHIFT) + 1); > + badpage++; > + } > + } > +#endif > + > /* Check new pages against the bad-page list. */ > p = opt_badpage; > while ( *p != '\0' ) > diff --git a/xen/drivers/passthrough/vtd/quirks.c > b/xen/drivers/passthrough/vtd/quirks.c > index d79a155..70d57de 100644 > --- a/xen/drivers/passthrough/vtd/quirks.c > +++ b/xen/drivers/passthrough/vtd/quirks.c > @@ -31,6 +31,7 @@ > #include <xen/keyhandler.h> > #include <asm/msi.h> > #include <asm/irq.h> > +#include <asm/pci.h> > #include <mach_apic.h> > #include "iommu.h" > #include "dmar.h" > @@ -47,7 +48,6 @@ > #define IS_CTG(id) (id == 0x2a408086) > #define IS_ILK(id) (id == 0x00408086 || id == 0x00448086 || id== > 0x00628086 || id == 0x006A8086) > #define IS_CPT(id) (id == 0x01008086 || id == 0x01048086) > -#define IS_SNB_GFX(id) (id == 0x01068086 || id == 0x01168086 || id == > 0x01268086 || id == 0x01028086 || id == 0x01128086 || id == 0x01228086 || id > == 0x010A8086) > > static u32 __read_mostly ioh_id; > static u32 __initdata igd_id; > diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h > index 4f89dae..8328893 100644 > --- a/xen/include/asm-x86/mm.h > +++ b/xen/include/asm-x86/mm.h > @@ -322,6 +322,7 @@ int is_iomem_page(unsigned long mfn); > > void clear_superpage_mark(struct page_info *page); > > +unsigned long *get_platform_badpages(int *array_size); > /* Per page locks: > * page_lock() is used for two purposes: pte serialization, and memory > sharing. > * > diff --git a/xen/include/asm-x86/pci.h b/xen/include/asm-x86/pci.h > index 7bcb702..e0598fd 100644 > --- a/xen/include/asm-x86/pci.h > +++ b/xen/include/asm-x86/pci.h > @@ -1,6 +1,11 @@ > #ifndef __X86_PCI_H__ > #define __X86_PCI_H__ > > +#define IS_SNB_GFX(id) (id == 0x01068086 || id == 0x01168086 \ > + || id == 0x01268086 || id == 0x01028086 \ > + || id == 0x01128086 || id == 0x01228086 \ > + || id == 0x010A8086 ) > + > struct arch_pci_dev { > vmask_t used_vectors; > }; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |