Merge branch 'core-resources-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull ram resource handling changes from Ingo Molnar: "Core kernel resource handling changes to support NVDIMM error injection. This tree introduces a new I/O resource type, IORESOURCE_SYSTEM_RAM, for System RAM while keeping the current IORESOURCE_MEM type bit set for all memory-mapped ranges (including System RAM) for backward compatibility. With this resource flag it no longer takes a strcmp() loop through the resource tree to find "System RAM" resources. The new resource type is then used to extend ACPI/APEI error injection facility to also support NVDIMM" * 'core-resources-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: ACPI/EINJ: Allow memory error injection to NVDIMM resource: Kill walk_iomem_res() x86/kexec: Remove walk_iomem_res() call with GART type x86, kexec, nvdimm: Use walk_iomem_res_desc() for iomem search resource: Add walk_iomem_res_desc() memremap: Change region_intersects() to take @flags and @desc arm/samsung: Change s3c_pm_run_res() to use System RAM type resource: Change walk_system_ram() to use System RAM type drivers: Initialize resource entry to zero xen, mm: Set IORESOURCE_SYSTEM_RAM to System RAM kexec: Set IORESOURCE_SYSTEM_RAM for System RAM arch: Set IORESOURCE_SYSTEM_RAM flag for System RAM ia64: Set System RAM type and descriptor x86/e820: Set System RAM type and descriptor resource: Add I/O resource descriptor resource: Handle resource flags properly resource: Add System RAM resource type
This commit is contained in:
@@ -20,6 +20,7 @@ struct resource {
|
||||
resource_size_t end;
|
||||
const char *name;
|
||||
unsigned long flags;
|
||||
unsigned long desc;
|
||||
struct resource *parent, *sibling, *child;
|
||||
};
|
||||
|
||||
@@ -49,12 +50,19 @@ struct resource {
|
||||
#define IORESOURCE_WINDOW 0x00200000 /* forwarded by bridge */
|
||||
#define IORESOURCE_MUXED 0x00400000 /* Resource is software muxed */
|
||||
|
||||
#define IORESOURCE_EXT_TYPE_BITS 0x01000000 /* Resource extended types */
|
||||
#define IORESOURCE_SYSRAM 0x01000000 /* System RAM (modifier) */
|
||||
|
||||
#define IORESOURCE_EXCLUSIVE 0x08000000 /* Userland may not map this resource */
|
||||
|
||||
#define IORESOURCE_DISABLED 0x10000000
|
||||
#define IORESOURCE_UNSET 0x20000000 /* No address assigned yet */
|
||||
#define IORESOURCE_AUTO 0x40000000
|
||||
#define IORESOURCE_BUSY 0x80000000 /* Driver has marked this resource busy */
|
||||
|
||||
/* I/O resource extended types */
|
||||
#define IORESOURCE_SYSTEM_RAM (IORESOURCE_MEM|IORESOURCE_SYSRAM)
|
||||
|
||||
/* PnP IRQ specific bits (IORESOURCE_BITS) */
|
||||
#define IORESOURCE_IRQ_HIGHEDGE (1<<0)
|
||||
#define IORESOURCE_IRQ_LOWEDGE (1<<1)
|
||||
@@ -105,6 +113,22 @@ struct resource {
|
||||
/* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */
|
||||
#define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */
|
||||
|
||||
/*
|
||||
* I/O Resource Descriptors
|
||||
*
|
||||
* Descriptors are used by walk_iomem_res_desc() and region_intersects()
|
||||
* for searching a specific resource range in the iomem table. Assign
|
||||
* a new descriptor when a resource range supports the search interfaces.
|
||||
* Otherwise, resource.desc must be set to IORES_DESC_NONE (0).
|
||||
*/
|
||||
enum {
|
||||
IORES_DESC_NONE = 0,
|
||||
IORES_DESC_CRASH_KERNEL = 1,
|
||||
IORES_DESC_ACPI_TABLES = 2,
|
||||
IORES_DESC_ACPI_NV_STORAGE = 3,
|
||||
IORES_DESC_PERSISTENT_MEMORY = 4,
|
||||
IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5,
|
||||
};
|
||||
|
||||
/* helpers to define resources */
|
||||
#define DEFINE_RES_NAMED(_start, _size, _name, _flags) \
|
||||
@@ -113,6 +137,7 @@ struct resource {
|
||||
.end = (_start) + (_size) - 1, \
|
||||
.name = (_name), \
|
||||
.flags = (_flags), \
|
||||
.desc = IORES_DESC_NONE, \
|
||||
}
|
||||
|
||||
#define DEFINE_RES_IO_NAMED(_start, _size, _name) \
|
||||
@@ -170,6 +195,10 @@ static inline unsigned long resource_type(const struct resource *res)
|
||||
{
|
||||
return res->flags & IORESOURCE_TYPE_BITS;
|
||||
}
|
||||
static inline unsigned long resource_ext_type(const struct resource *res)
|
||||
{
|
||||
return res->flags & IORESOURCE_EXT_TYPE_BITS;
|
||||
}
|
||||
/* True iff r1 completely contains r2 */
|
||||
static inline bool resource_contains(struct resource *r1, struct resource *r2)
|
||||
{
|
||||
@@ -239,8 +268,8 @@ extern int
|
||||
walk_system_ram_res(u64 start, u64 end, void *arg,
|
||||
int (*func)(u64, u64, void *));
|
||||
extern int
|
||||
walk_iomem_res(char *name, unsigned long flags, u64 start, u64 end, void *arg,
|
||||
int (*func)(u64, u64, void *));
|
||||
walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end,
|
||||
void *arg, int (*func)(u64, u64, void *));
|
||||
|
||||
/* True if any part of r1 overlaps r2 */
|
||||
static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
|
||||
|
||||
@@ -387,7 +387,8 @@ enum {
|
||||
REGION_MIXED,
|
||||
};
|
||||
|
||||
int region_intersects(resource_size_t offset, size_t size, const char *type);
|
||||
int region_intersects(resource_size_t offset, size_t size, unsigned long flags,
|
||||
unsigned long desc);
|
||||
|
||||
/* Support for virtually mapped pages */
|
||||
struct page *vmalloc_to_page(const void *addr);
|
||||
|
||||
Reference in New Issue
Block a user