Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bb045f1 authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

Merge branch 'x86/pat' into x86/urgent



Merge reason:

Suresh Siddha (1):
      x86, pat: don't use rb-tree based lookup in reserve_memtype()

... requires previous x86/pat commits already pushed to Linus.

Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parents 80938332 dcb73bf4
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -112,6 +112,10 @@ config IA64_UNCACHED_ALLOCATOR
	bool
	bool
	select GENERIC_ALLOCATOR
	select GENERIC_ALLOCATOR


config ARCH_USES_PG_UNCACHED
	def_bool y
	depends on IA64_UNCACHED_ALLOCATOR

config AUDIT_ARCH
config AUDIT_ARCH
	bool
	bool
	default y
	default y
+4 −0
Original line number Original line Diff line number Diff line
@@ -1414,6 +1414,10 @@ config X86_PAT


	  If unsure, say Y.
	  If unsure, say Y.


config ARCH_USES_PG_UNCACHED
	def_bool y
	depends on X86_PAT

config EFI
config EFI
	bool "EFI runtime service support"
	bool "EFI runtime service support"
	depends on ACPI
	depends on ACPI
+52 −2
Original line number Original line Diff line number Diff line
@@ -43,8 +43,58 @@ static inline void copy_from_user_page(struct vm_area_struct *vma,
	memcpy(dst, src, len);
	memcpy(dst, src, len);
}
}


#define PG_non_WB				PG_arch_1
#define PG_WC				PG_arch_1
PAGEFLAG(NonWB, non_WB)
PAGEFLAG(WC, WC)

#ifdef CONFIG_X86_PAT
/*
 * X86 PAT uses page flags WC and Uncached together to keep track of
 * memory type of pages that have backing page struct. X86 PAT supports 3
 * different memory types, _PAGE_CACHE_WB, _PAGE_CACHE_WC and
 * _PAGE_CACHE_UC_MINUS and fourth state where page's memory type has not
 * been changed from its default (value of -1 used to denote this).
 * Note we do not support _PAGE_CACHE_UC here.
 *
 * Caller must hold memtype_lock for atomicity.
 */
static inline unsigned long get_page_memtype(struct page *pg)
{
	if (!PageUncached(pg) && !PageWC(pg))
		return -1;
	else if (!PageUncached(pg) && PageWC(pg))
		return _PAGE_CACHE_WC;
	else if (PageUncached(pg) && !PageWC(pg))
		return _PAGE_CACHE_UC_MINUS;
	else
		return _PAGE_CACHE_WB;
}

static inline void set_page_memtype(struct page *pg, unsigned long memtype)
{
	switch (memtype) {
	case _PAGE_CACHE_WC:
		ClearPageUncached(pg);
		SetPageWC(pg);
		break;
	case _PAGE_CACHE_UC_MINUS:
		SetPageUncached(pg);
		ClearPageWC(pg);
		break;
	case _PAGE_CACHE_WB:
		SetPageUncached(pg);
		SetPageWC(pg);
		break;
	default:
	case -1:
		ClearPageUncached(pg);
		ClearPageWC(pg);
		break;
	}
}
#else
static inline unsigned long get_page_memtype(struct page *pg) { return -1; }
static inline void set_page_memtype(struct page *pg, unsigned long memtype) { }
#endif


/*
/*
 * The set_memory_* API can be used to change various attributes of a virtual
 * The set_memory_* API can be used to change various attributes of a virtual
+6 −3
Original line number Original line Diff line number Diff line
@@ -26,13 +26,16 @@
#include <asm/pgtable.h>
#include <asm/pgtable.h>
#include <asm/tlbflush.h>
#include <asm/tlbflush.h>


int
is_io_mapping_possible(resource_size_t base, unsigned long size);

void *
void *
iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);


void
void
iounmap_atomic(void *kvaddr, enum km_type type);
iounmap_atomic(void *kvaddr, enum km_type type);


int
iomap_create_wc(resource_size_t base, unsigned long size, pgprot_t *prot);

void
iomap_free(resource_size_t base, unsigned long size);

#endif /* _ASM_X86_IOMAP_H */
#endif /* _ASM_X86_IOMAP_H */
+6 −0
Original line number Original line Diff line number Diff line
@@ -121,6 +121,9 @@ extern int mtrr_del_page(int reg, unsigned long base, unsigned long size);
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
extern void mtrr_ap_init(void);
extern void mtrr_ap_init(void);
extern void mtrr_bp_init(void);
extern void mtrr_bp_init(void);
extern void set_mtrr_aps_delayed_init(void);
extern void mtrr_aps_init(void);
extern void mtrr_bp_restore(void);
extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
extern int amd_special_default_mtrr(void);
extern int amd_special_default_mtrr(void);
#  else
#  else
@@ -161,6 +164,9 @@ static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi)


#define mtrr_ap_init() do {} while (0)
#define mtrr_ap_init() do {} while (0)
#define mtrr_bp_init() do {} while (0)
#define mtrr_bp_init() do {} while (0)
#define set_mtrr_aps_delayed_init() do {} while (0)
#define mtrr_aps_init() do {} while (0)
#define mtrr_bp_restore() do {} while (0)
#  endif
#  endif


#ifdef CONFIG_COMPAT
#ifdef CONFIG_COMPAT
Loading