blob: 189ff9ada7a9a3eb9ab542c02f5e454afb3386e7 [file] [log] [blame]
Martin Roth239b5df2022-07-26 22:18:26 -06001/* SPDX-License-Identifier: GPL-2.0-only */
2
Myles Watson29cc9ed2009-07-02 18:56:24 +00003#ifndef DEVICE_RESOURCE_H
4#define DEVICE_RESOURCE_H
Eric Biederman5899fd82003-04-24 06:25:08 +00005
Eric Biederman992cd002004-10-14 21:10:23 +00006#include <stdint.h>
Stefan Reinauer57879c92012-07-31 16:47:25 -07007#include <stddef.h>
Eric Biederman5899fd82003-04-24 06:25:08 +00008
9#define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */
10
11#define IORESOURCE_IO 0x00000100 /* Resource type */
12#define IORESOURCE_MEM 0x00000200
13#define IORESOURCE_IRQ 0x00000400
Eric Biedermane9a271e32003-09-02 03:36:25 +000014#define IORESOURCE_DRQ 0x00000800
Eric Biederman5899fd82003-04-24 06:25:08 +000015
Lee Leahy6a566d72017-03-07 17:45:12 -080016#define IORESOURCE_TYPE_MASK (IORESOURCE_IO | IORESOURCE_MEM \
17 | IORESOURCE_IRQ | IORESOURCE_DRQ)
Kyösti Mälkkifdc0a902015-03-26 20:04:38 +020018
Eric Biederman5899fd82003-04-24 06:25:08 +000019#define IORESOURCE_PREFETCH 0x00001000 /* No side effects */
20#define IORESOURCE_READONLY 0x00002000
21#define IORESOURCE_CACHEABLE 0x00004000
Lee Leahy6a566d72017-03-07 17:45:12 -080022/* This resource filters all of the unclaimed transactions to the bus below. */
23#define IORESOURCE_SUBTRACTIVE 0x00040000
24/* The IO resource has a bus below it. */
25#define IORESOURCE_BRIDGE 0x00080000
Furquan Shaikh1bb05ef302020-05-15 17:33:52 -070026/* This is a request to allocate resource about 4G boundary. */
27#define IORESOURCE_ABOVE_4G 0x00100000
Jonathan Zhange111de02021-04-21 10:40:31 -070028/* The resource needs to be soft reserved in the coreboot table */
29#define IORESOURCE_SOFT_RESERVE 0x00200000
Lee Leahy6a566d72017-03-07 17:45:12 -080030/* The resource needs to be reserved in the coreboot table */
31#define IORESOURCE_RESERVE 0x10000000
32/* The IO resource assignment has been stored in the device */
33#define IORESOURCE_STORED 0x20000000
34/* An IO resource that has been assigned a value */
35#define IORESOURCE_ASSIGNED 0x40000000
36/* An IO resource the allocator must not change */
37#define IORESOURCE_FIXED 0x80000000
Eric Biederman5899fd82003-04-24 06:25:08 +000038
Kyösti Mälkkid2245bb2012-08-27 09:09:23 +030039/* PCI specific resource bits (IORESOURCE_BITS) */
Tim Wawrzynczak8c93fed2022-01-13 16:45:07 -070040#define IORESOURCE_PCI64 (1<<0) /* 64bit long pci resource */
41#define IORESOURCE_PCI_BRIDGE (1<<1) /* A bridge pci resource */
42#define IORESOURCE_PCIE_RESIZABLE_BAR (1<<2) /* A Resizable BAR */
Eric Biederman5899fd82003-04-24 06:25:08 +000043
Myles Watson29cc9ed2009-07-02 18:56:24 +000044typedef u64 resource_t;
Eric Biederman5899fd82003-04-24 06:25:08 +000045struct resource {
Eric Biederman992cd002004-10-14 21:10:23 +000046 resource_t base; /* Base address of the resource */
47 resource_t size; /* Size of the resource */
48 resource_t limit; /* Largest valid value base + size -1 */
Aaron Durbine4d7abc2017-04-16 22:05:36 -050049 DEVTREE_CONST struct resource *next; /* Next resource in the list */
Eric Biederman5899fd82003-04-24 06:25:08 +000050 unsigned long flags; /* Descriptions of the kind of resource */
51 unsigned long index; /* Bus specific per device resource id */
Li-Ta Loe3c79ed2004-03-19 00:08:48 +000052 unsigned char align; /* Required alignment (log 2) of the resource */
53 unsigned char gran; /* Granularity (log 2) of the resource */
Eric Biederman5899fd82003-04-24 06:25:08 +000054 /* Alignment must be >= the granularity of the resource */
55};
56
Myles Watson29cc9ed2009-07-02 18:56:24 +000057/* Macros to generate index values for resources */
Lee Leahyae3fd342017-03-07 12:55:23 -080058#define IOINDEX_SUBTRACTIVE(IDX, LINK) (0x10000000 + ((IDX) << 8) + LINK)
Eric Biederman992cd002004-10-14 21:10:23 +000059#define IOINDEX_SUBTRACTIVE_LINK(IDX) (IDX & 0xff)
60
Lee Leahyae3fd342017-03-07 12:55:23 -080061#define IOINDEX(IDX, LINK) (((LINK) << 16) + IDX)
Lee Leahy91d1e762017-03-07 14:31:19 -080062#define IOINDEX_LINK(IDX) ((IDX & 0xf0000) >> 16)
Myles Watson29cc9ed2009-07-02 18:56:24 +000063#define IOINDEX_IDX(IDX) (IDX & 0xffff)
64
Eric Biederman992cd002004-10-14 21:10:23 +000065/* Generic resource helper functions */
66struct device;
Eric Biedermanf8a2ddd2004-10-30 08:05:41 +000067struct bus;
Kyösti Mälkkib2287712021-06-14 11:29:51 +030068void compact_resources(struct device *dev);
69struct resource *probe_resource(const struct device *dev, unsigned int index);
70struct resource *new_resource(struct device *dev, unsigned int index);
71struct resource *find_resource(const struct device *dev, unsigned int index);
72resource_t resource_end(const struct resource *resource);
73resource_t resource_max(const struct resource *resource);
74void report_resource_stored(struct device *dev, const struct resource *resource,
75 const char *comment);
Eric Biederman992cd002004-10-14 21:10:23 +000076
Kyösti Mälkkib2287712021-06-14 11:29:51 +030077typedef void (*resource_search_t)(void *gp, struct device *dev, struct resource *res);
Eric Biedermanf8a2ddd2004-10-30 08:05:41 +000078
Kyösti Mälkkib2287712021-06-14 11:29:51 +030079void search_bus_resources(struct bus *bus, unsigned long type_mask, unsigned long type,
80 resource_search_t search, void *gp);
81
82void search_global_resources(unsigned long type_mask, unsigned long type,
83 resource_search_t search, void *gp);
Eric Biedermanf8a2ddd2004-10-30 08:05:41 +000084
Yinghai Lu13f1c2a2005-07-08 02:49:49 +000085#define RESOURCE_TYPE_MAX 20
Kyösti Mälkkib2287712021-06-14 11:29:51 +030086const char *resource_type(const struct resource *resource);
Yinghai Lu13f1c2a2005-07-08 02:49:49 +000087
Kyösti Mälkkib2287712021-06-14 11:29:51 +030088static inline void *res2mmio(const struct resource *res, unsigned long offset,
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080089 unsigned long mask)
90{
91 return (void *)(uintptr_t)((res->base + offset) & ~mask);
92}
93
Kyösti Mälkki68e6dc92021-06-14 00:40:22 +030094void log_resource(const char *type, const struct device *dev, const struct resource *res,
95 const char *srcfile, const int line);
96
97#define LOG_RESOURCE(type, dev, res) \
98 do { \
99 if (CONFIG(DEBUG_RESOURCES) && (dev) && (res)) \
100 log_resource(type, (dev), (res), __func__, __LINE__); \
101 } while (0)
102
Furquan Shaikh69395742020-05-15 15:43:15 -0700103/*
104 * Pick largest resource on the bus using the given mask and type.
105 * Params:
106 * bus = Bus from which the resource needs to picked from.
107 * result_res = If NULL, there was no previous resource picked on this bus, else it points to
108 * the last picked resource.
109 * type_mask = Mask to be applied when searching for resource
110 * type = Expected type for the resource
111 *
112 * Returns:
113 * If resource is found, returns the device and sets result_rest to point to the resource. Else
114 * returns NULL.
115 */
116const struct device *largest_resource(struct bus *bus, struct resource **result_res,
117 unsigned long type_mask, unsigned long type);
118
Furquan Shaikh69395742020-05-15 15:43:15 -0700119/* Compute and allocate resources. This is the main resource allocator entry point. */
120void allocate_resources(const struct device *root);
121
Myles Watson29cc9ed2009-07-02 18:56:24 +0000122#endif /* DEVICE_RESOURCE_H */