cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ioport.h (12577B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * ioport.h	Definitions of routines for detecting, reserving and
      4 *		allocating system resources.
      5 *
      6 * Authors:	Linus Torvalds
      7 */
      8
      9#ifndef _LINUX_IOPORT_H
     10#define _LINUX_IOPORT_H
     11
     12#ifndef __ASSEMBLY__
     13#include <linux/bits.h>
     14#include <linux/compiler.h>
     15#include <linux/minmax.h>
     16#include <linux/types.h>
     17/*
     18 * Resources are tree-like, allowing
     19 * nesting etc..
     20 */
     21struct resource {
     22	resource_size_t start;
     23	resource_size_t end;
     24	const char *name;
     25	unsigned long flags;
     26	unsigned long desc;
     27	struct resource *parent, *sibling, *child;
     28};
     29
     30/*
     31 * IO resources have these defined flags.
     32 *
     33 * PCI devices expose these flags to userspace in the "resource" sysfs file,
     34 * so don't move them.
     35 */
     36#define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */
     37
     38#define IORESOURCE_TYPE_BITS	0x00001f00	/* Resource type */
     39#define IORESOURCE_IO		0x00000100	/* PCI/ISA I/O ports */
     40#define IORESOURCE_MEM		0x00000200
     41#define IORESOURCE_REG		0x00000300	/* Register offsets */
     42#define IORESOURCE_IRQ		0x00000400
     43#define IORESOURCE_DMA		0x00000800
     44#define IORESOURCE_BUS		0x00001000
     45
     46#define IORESOURCE_PREFETCH	0x00002000	/* No side effects */
     47#define IORESOURCE_READONLY	0x00004000
     48#define IORESOURCE_CACHEABLE	0x00008000
     49#define IORESOURCE_RANGELENGTH	0x00010000
     50#define IORESOURCE_SHADOWABLE	0x00020000
     51
     52#define IORESOURCE_SIZEALIGN	0x00040000	/* size indicates alignment */
     53#define IORESOURCE_STARTALIGN	0x00080000	/* start field is alignment */
     54
     55#define IORESOURCE_MEM_64	0x00100000
     56#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
     57#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
     58
     59#define IORESOURCE_EXT_TYPE_BITS 0x01000000	/* Resource extended types */
     60#define IORESOURCE_SYSRAM	0x01000000	/* System RAM (modifier) */
     61
     62/* IORESOURCE_SYSRAM specific bits. */
     63#define IORESOURCE_SYSRAM_DRIVER_MANAGED	0x02000000 /* Always detected via a driver. */
     64#define IORESOURCE_SYSRAM_MERGEABLE		0x04000000 /* Resource can be merged. */
     65
     66#define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */
     67
     68#define IORESOURCE_DISABLED	0x10000000
     69#define IORESOURCE_UNSET	0x20000000	/* No address assigned yet */
     70#define IORESOURCE_AUTO		0x40000000
     71#define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */
     72
     73/* I/O resource extended types */
     74#define IORESOURCE_SYSTEM_RAM		(IORESOURCE_MEM|IORESOURCE_SYSRAM)
     75
     76/* PnP IRQ specific bits (IORESOURCE_BITS) */
     77#define IORESOURCE_IRQ_HIGHEDGE		(1<<0)
     78#define IORESOURCE_IRQ_LOWEDGE		(1<<1)
     79#define IORESOURCE_IRQ_HIGHLEVEL	(1<<2)
     80#define IORESOURCE_IRQ_LOWLEVEL		(1<<3)
     81#define IORESOURCE_IRQ_SHAREABLE	(1<<4)
     82#define IORESOURCE_IRQ_OPTIONAL 	(1<<5)
     83
     84/* PnP DMA specific bits (IORESOURCE_BITS) */
     85#define IORESOURCE_DMA_TYPE_MASK	(3<<0)
     86#define IORESOURCE_DMA_8BIT		(0<<0)
     87#define IORESOURCE_DMA_8AND16BIT	(1<<0)
     88#define IORESOURCE_DMA_16BIT		(2<<0)
     89
     90#define IORESOURCE_DMA_MASTER		(1<<2)
     91#define IORESOURCE_DMA_BYTE		(1<<3)
     92#define IORESOURCE_DMA_WORD		(1<<4)
     93
     94#define IORESOURCE_DMA_SPEED_MASK	(3<<6)
     95#define IORESOURCE_DMA_COMPATIBLE	(0<<6)
     96#define IORESOURCE_DMA_TYPEA		(1<<6)
     97#define IORESOURCE_DMA_TYPEB		(2<<6)
     98#define IORESOURCE_DMA_TYPEF		(3<<6)
     99
    100/* PnP memory I/O specific bits (IORESOURCE_BITS) */
    101#define IORESOURCE_MEM_WRITEABLE	(1<<0)	/* dup: IORESOURCE_READONLY */
    102#define IORESOURCE_MEM_CACHEABLE	(1<<1)	/* dup: IORESOURCE_CACHEABLE */
    103#define IORESOURCE_MEM_RANGELENGTH	(1<<2)	/* dup: IORESOURCE_RANGELENGTH */
    104#define IORESOURCE_MEM_TYPE_MASK	(3<<3)
    105#define IORESOURCE_MEM_8BIT		(0<<3)
    106#define IORESOURCE_MEM_16BIT		(1<<3)
    107#define IORESOURCE_MEM_8AND16BIT	(2<<3)
    108#define IORESOURCE_MEM_32BIT		(3<<3)
    109#define IORESOURCE_MEM_SHADOWABLE	(1<<5)	/* dup: IORESOURCE_SHADOWABLE */
    110#define IORESOURCE_MEM_EXPANSIONROM	(1<<6)
    111#define IORESOURCE_MEM_NONPOSTED	(1<<7)
    112
    113/* PnP I/O specific bits (IORESOURCE_BITS) */
    114#define IORESOURCE_IO_16BIT_ADDR	(1<<0)
    115#define IORESOURCE_IO_FIXED		(1<<1)
    116#define IORESOURCE_IO_SPARSE		(1<<2)
    117
    118/* PCI ROM control bits (IORESOURCE_BITS) */
    119#define IORESOURCE_ROM_ENABLE		(1<<0)	/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
    120#define IORESOURCE_ROM_SHADOW		(1<<1)	/* Use RAM image, not ROM BAR */
    121
    122/* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
    123#define IORESOURCE_PCI_FIXED		(1<<4)	/* Do not move resource */
    124#define IORESOURCE_PCI_EA_BEI		(1<<5)	/* BAR Equivalent Indicator */
    125
    126/*
    127 * I/O Resource Descriptors
    128 *
    129 * Descriptors are used by walk_iomem_res_desc() and region_intersects()
    130 * for searching a specific resource range in the iomem table.  Assign
    131 * a new descriptor when a resource range supports the search interfaces.
    132 * Otherwise, resource.desc must be set to IORES_DESC_NONE (0).
    133 */
    134enum {
    135	IORES_DESC_NONE				= 0,
    136	IORES_DESC_CRASH_KERNEL			= 1,
    137	IORES_DESC_ACPI_TABLES			= 2,
    138	IORES_DESC_ACPI_NV_STORAGE		= 3,
    139	IORES_DESC_PERSISTENT_MEMORY		= 4,
    140	IORES_DESC_PERSISTENT_MEMORY_LEGACY	= 5,
    141	IORES_DESC_DEVICE_PRIVATE_MEMORY	= 6,
    142	IORES_DESC_RESERVED			= 7,
    143	IORES_DESC_SOFT_RESERVED		= 8,
    144};
    145
    146/*
    147 * Flags controlling ioremap() behavior.
    148 */
    149enum {
    150	IORES_MAP_SYSTEM_RAM		= BIT(0),
    151	IORES_MAP_ENCRYPTED		= BIT(1),
    152};
    153
    154/* helpers to define resources */
    155#define DEFINE_RES_NAMED(_start, _size, _name, _flags)			\
    156	{								\
    157		.start = (_start),					\
    158		.end = (_start) + (_size) - 1,				\
    159		.name = (_name),					\
    160		.flags = (_flags),					\
    161		.desc = IORES_DESC_NONE,				\
    162	}
    163
    164#define DEFINE_RES_IO_NAMED(_start, _size, _name)			\
    165	DEFINE_RES_NAMED((_start), (_size), (_name), IORESOURCE_IO)
    166#define DEFINE_RES_IO(_start, _size)					\
    167	DEFINE_RES_IO_NAMED((_start), (_size), NULL)
    168
    169#define DEFINE_RES_MEM_NAMED(_start, _size, _name)			\
    170	DEFINE_RES_NAMED((_start), (_size), (_name), IORESOURCE_MEM)
    171#define DEFINE_RES_MEM(_start, _size)					\
    172	DEFINE_RES_MEM_NAMED((_start), (_size), NULL)
    173
    174#define DEFINE_RES_IRQ_NAMED(_irq, _name)				\
    175	DEFINE_RES_NAMED((_irq), 1, (_name), IORESOURCE_IRQ)
    176#define DEFINE_RES_IRQ(_irq)						\
    177	DEFINE_RES_IRQ_NAMED((_irq), NULL)
    178
    179#define DEFINE_RES_DMA_NAMED(_dma, _name)				\
    180	DEFINE_RES_NAMED((_dma), 1, (_name), IORESOURCE_DMA)
    181#define DEFINE_RES_DMA(_dma)						\
    182	DEFINE_RES_DMA_NAMED((_dma), NULL)
    183
    184/* PC/ISA/whatever - the normal PC address spaces: IO and memory */
    185extern struct resource ioport_resource;
    186extern struct resource iomem_resource;
    187
    188extern struct resource *request_resource_conflict(struct resource *root, struct resource *new);
    189extern int request_resource(struct resource *root, struct resource *new);
    190extern int release_resource(struct resource *new);
    191void release_child_resources(struct resource *new);
    192extern void reserve_region_with_split(struct resource *root,
    193			     resource_size_t start, resource_size_t end,
    194			     const char *name);
    195extern struct resource *insert_resource_conflict(struct resource *parent, struct resource *new);
    196extern int insert_resource(struct resource *parent, struct resource *new);
    197extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new);
    198extern int remove_resource(struct resource *old);
    199extern void arch_remove_reservations(struct resource *avail);
    200extern int allocate_resource(struct resource *root, struct resource *new,
    201			     resource_size_t size, resource_size_t min,
    202			     resource_size_t max, resource_size_t align,
    203			     resource_size_t (*alignf)(void *,
    204						       const struct resource *,
    205						       resource_size_t,
    206						       resource_size_t),
    207			     void *alignf_data);
    208struct resource *lookup_resource(struct resource *root, resource_size_t start);
    209int adjust_resource(struct resource *res, resource_size_t start,
    210		    resource_size_t size);
    211resource_size_t resource_alignment(struct resource *res);
    212static inline resource_size_t resource_size(const struct resource *res)
    213{
    214	return res->end - res->start + 1;
    215}
    216static inline unsigned long resource_type(const struct resource *res)
    217{
    218	return res->flags & IORESOURCE_TYPE_BITS;
    219}
    220static inline unsigned long resource_ext_type(const struct resource *res)
    221{
    222	return res->flags & IORESOURCE_EXT_TYPE_BITS;
    223}
    224/* True iff r1 completely contains r2 */
    225static inline bool resource_contains(struct resource *r1, struct resource *r2)
    226{
    227	if (resource_type(r1) != resource_type(r2))
    228		return false;
    229	if (r1->flags & IORESOURCE_UNSET || r2->flags & IORESOURCE_UNSET)
    230		return false;
    231	return r1->start <= r2->start && r1->end >= r2->end;
    232}
    233
    234/* True if any part of r1 overlaps r2 */
    235static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
    236{
    237       return r1->start <= r2->end && r1->end >= r2->start;
    238}
    239
    240static inline bool
    241resource_intersection(struct resource *r1, struct resource *r2, struct resource *r)
    242{
    243	if (!resource_overlaps(r1, r2))
    244		return false;
    245	r->start = max(r1->start, r2->start);
    246	r->end = min(r1->end, r2->end);
    247	return true;
    248}
    249
    250static inline bool
    251resource_union(struct resource *r1, struct resource *r2, struct resource *r)
    252{
    253	if (!resource_overlaps(r1, r2))
    254		return false;
    255	r->start = min(r1->start, r2->start);
    256	r->end = max(r1->end, r2->end);
    257	return true;
    258}
    259
    260/* Convenience shorthand with allocation */
    261#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0)
    262#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
    263#define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
    264#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
    265#define request_mem_region_muxed(start, n, name) \
    266	__request_region(&iomem_resource, (start), (n), (name), IORESOURCE_MUXED)
    267#define request_mem_region_exclusive(start,n,name) \
    268	__request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE)
    269#define rename_region(region, newname) do { (region)->name = (newname); } while (0)
    270
    271extern struct resource * __request_region(struct resource *,
    272					resource_size_t start,
    273					resource_size_t n,
    274					const char *name, int flags);
    275
    276/* Compatibility cruft */
    277#define release_region(start,n)	__release_region(&ioport_resource, (start), (n))
    278#define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n))
    279
    280extern void __release_region(struct resource *, resource_size_t,
    281				resource_size_t);
    282#ifdef CONFIG_MEMORY_HOTREMOVE
    283extern void release_mem_region_adjustable(resource_size_t, resource_size_t);
    284#endif
    285#ifdef CONFIG_MEMORY_HOTPLUG
    286extern void merge_system_ram_resource(struct resource *res);
    287#endif
    288
    289/* Wrappers for managed devices */
    290struct device;
    291
    292extern int devm_request_resource(struct device *dev, struct resource *root,
    293				 struct resource *new);
    294extern void devm_release_resource(struct device *dev, struct resource *new);
    295
    296#define devm_request_region(dev,start,n,name) \
    297	__devm_request_region(dev, &ioport_resource, (start), (n), (name))
    298#define devm_request_mem_region(dev,start,n,name) \
    299	__devm_request_region(dev, &iomem_resource, (start), (n), (name))
    300
    301extern struct resource * __devm_request_region(struct device *dev,
    302				struct resource *parent, resource_size_t start,
    303				resource_size_t n, const char *name);
    304
    305#define devm_release_region(dev, start, n) \
    306	__devm_release_region(dev, &ioport_resource, (start), (n))
    307#define devm_release_mem_region(dev, start, n) \
    308	__devm_release_region(dev, &iomem_resource, (start), (n))
    309
    310extern void __devm_release_region(struct device *dev, struct resource *parent,
    311				  resource_size_t start, resource_size_t n);
    312extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size);
    313extern bool iomem_is_exclusive(u64 addr);
    314
    315extern int
    316walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
    317		void *arg, int (*func)(unsigned long, unsigned long, void *));
    318extern int
    319walk_mem_res(u64 start, u64 end, void *arg,
    320	     int (*func)(struct resource *, void *));
    321extern int
    322walk_system_ram_res(u64 start, u64 end, void *arg,
    323		    int (*func)(struct resource *, void *));
    324extern int
    325walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end,
    326		    void *arg, int (*func)(struct resource *, void *));
    327
    328struct resource *devm_request_free_mem_region(struct device *dev,
    329		struct resource *base, unsigned long size);
    330struct resource *request_free_mem_region(struct resource *base,
    331		unsigned long size, const char *name);
    332
    333static inline void irqresource_disabled(struct resource *res, u32 irq)
    334{
    335	res->start = irq;
    336	res->end = irq;
    337	res->flags |= IORESOURCE_IRQ | IORESOURCE_DISABLED | IORESOURCE_UNSET;
    338}
    339
    340extern struct address_space *iomem_get_mapping(void);
    341
    342#endif /* __ASSEMBLY__ */
    343#endif	/* _LINUX_IOPORT_H */