2009-07-02 20:56:24 +02:00
|
|
|
#ifndef DEVICE_RESOURCE_H
|
|
|
|
#define DEVICE_RESOURCE_H
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2004-10-14 23:10:23 +02:00
|
|
|
#include <stdint.h>
|
Make the device tree available in the rom stage
We thought about two ways to do this change. The way we decided to try
was to
1. drop all ops from devices in romstage
2. constify all devices in romstage (make them read-only) so we can
compile static.c into romstage
3. the device tree "devices" can be used to read configuration from
the device tree (and nothing else, really)
4. the device tree devices are accessed through struct device * in
romstage only. device_t stays the typedef to int in romstage
5. Use the same static.c file in ramstage and romstage
We declare structs as follows:
ROMSTAGE_CONST struct bus dev_root_links[];
ROMSTAGE_CONST is const in romstage and empty in ramstage; This
forces all of the device tree into the text area.
So a struct looks like this:
static ROMSTAGE_CONST struct device _dev21 = {
#ifndef __PRE_RAM__
.ops = 0,
#endif
.bus = &_dev7_links[0],
.path = {.type=DEVICE_PATH_PCI,{.pci={ .devfn = PCI_DEVFN(0x1c,3)}}},
.enabled = 0,
.on_mainboard = 1,
.subsystem_vendor = 0x1ae0,
.subsystem_device = 0xc000,
.link_list = NULL,
.sibling = &_dev22,
#ifndef __PRE_RAM__
.chip_ops = &southbridge_intel_bd82x6x_ops,
#endif
.chip_info = &southbridge_intel_bd82x6x_info_10,
.next=&_dev22
};
Change-Id: I722454d8d3c40baf7df989f5a6891f6ba7db5727
Signed-off-by: Ronald G. Minnich <rminnich@chromium.org>
Signed-off-by: Stefan Reinauer <reinauer@google.com>
Reviewed-on: http://review.coreboot.org/1398
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
2012-08-01 01:47:25 +02:00
|
|
|
#include <stddef.h>
|
2003-04-24 08:25:08 +02:00
|
|
|
|
|
|
|
#define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */
|
|
|
|
|
|
|
|
#define IORESOURCE_IO 0x00000100 /* Resource type */
|
|
|
|
#define IORESOURCE_MEM 0x00000200
|
|
|
|
#define IORESOURCE_IRQ 0x00000400
|
2003-09-02 05:36:25 +02:00
|
|
|
#define IORESOURCE_DRQ 0x00000800
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2015-03-26 19:04:38 +01:00
|
|
|
#define IORESOURCE_TYPE_MASK (IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_IRQ | IORESOURCE_DRQ)
|
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
#define IORESOURCE_PREFETCH 0x00001000 /* No side effects */
|
|
|
|
#define IORESOURCE_READONLY 0x00002000
|
|
|
|
#define IORESOURCE_CACHEABLE 0x00004000
|
|
|
|
#define IORESOURCE_RANGELENGTH 0x00008000
|
|
|
|
#define IORESOURCE_SHADOWABLE 0x00010000
|
|
|
|
#define IORESOURCE_BUS_HAS_VGA 0x00020000
|
2003-09-02 05:36:25 +02:00
|
|
|
#define IORESOURCE_SUBTRACTIVE 0x00040000 /* This resource filters all of the unclaimed transactions
|
|
|
|
* to the bus below.
|
|
|
|
*/
|
2009-07-02 20:56:24 +02:00
|
|
|
#define IORESOURCE_BRIDGE 0x00080000 /* The IO resource has a bus below it. */
|
2010-09-23 20:29:40 +02:00
|
|
|
#define IORESOURCE_RESERVE 0x10000000 /* The resource needs to be reserved in the coreboot table */
|
2004-03-11 16:01:31 +01:00
|
|
|
#define IORESOURCE_STORED 0x20000000 /* The IO resource assignment has been stored in the device */
|
|
|
|
#define IORESOURCE_ASSIGNED 0x40000000 /* An IO resource that has been assigned a value */
|
|
|
|
#define IORESOURCE_FIXED 0x80000000 /* An IO resource the allocator must not change */
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2012-08-27 08:09:23 +02:00
|
|
|
/* PCI specific resource bits (IORESOURCE_BITS) */
|
2003-04-24 08:25:08 +02:00
|
|
|
#define IORESOURCE_PCI64 (1<<0) /* 64bit long pci resource */
|
|
|
|
#define IORESOURCE_PCI_BRIDGE (1<<1) /* A bridge pci resource */
|
|
|
|
|
2009-07-02 20:56:24 +02:00
|
|
|
typedef u64 resource_t;
|
2003-04-24 08:25:08 +02:00
|
|
|
struct resource {
|
2004-10-14 23:10:23 +02:00
|
|
|
resource_t base; /* Base address of the resource */
|
|
|
|
resource_t size; /* Size of the resource */
|
|
|
|
resource_t limit; /* Largest valid value base + size -1 */
|
2017-03-08 00:24:16 +01:00
|
|
|
ROMSTAGE_CONST struct resource *next; /* Next resource in the list */
|
2003-04-24 08:25:08 +02:00
|
|
|
unsigned long flags; /* Descriptions of the kind of resource */
|
|
|
|
unsigned long index; /* Bus specific per device resource id */
|
2004-03-19 01:08:48 +01:00
|
|
|
unsigned char align; /* Required alignment (log 2) of the resource */
|
|
|
|
unsigned char gran; /* Granularity (log 2) of the resource */
|
2003-04-24 08:25:08 +02:00
|
|
|
/* Alignment must be >= the granularity of the resource */
|
|
|
|
};
|
|
|
|
|
2009-07-02 20:56:24 +02:00
|
|
|
/* Macros to generate index values for resources */
|
2017-03-07 21:55:23 +01:00
|
|
|
#define IOINDEX_SUBTRACTIVE(IDX, LINK) (0x10000000 + ((IDX) << 8) + LINK)
|
2004-10-14 23:10:23 +02:00
|
|
|
#define IOINDEX_SUBTRACTIVE_LINK(IDX) (IDX & 0xff)
|
|
|
|
|
2017-03-07 21:55:23 +01:00
|
|
|
#define IOINDEX(IDX, LINK) (((LINK) << 16) + IDX)
|
2017-03-07 23:31:19 +01:00
|
|
|
#define IOINDEX_LINK(IDX) ((IDX & 0xf0000) >> 16)
|
2009-07-02 20:56:24 +02:00
|
|
|
#define IOINDEX_IDX(IDX) (IDX & 0xffff)
|
|
|
|
|
2004-10-14 23:10:23 +02:00
|
|
|
/* Generic resource helper functions */
|
|
|
|
struct device;
|
2004-10-30 10:05:41 +02:00
|
|
|
struct bus;
|
2017-03-08 00:24:16 +01:00
|
|
|
extern void compact_resources(struct device *dev);
|
2017-03-07 03:01:04 +01:00
|
|
|
extern struct resource *probe_resource(struct device *dev, unsigned int index);
|
2017-03-08 00:24:16 +01:00
|
|
|
extern struct resource *new_resource(struct device *dev, unsigned int index);
|
|
|
|
extern struct resource *find_resource(struct device *dev, unsigned int index);
|
2004-10-14 23:10:23 +02:00
|
|
|
extern resource_t resource_end(struct resource *resource);
|
|
|
|
extern resource_t resource_max(struct resource *resource);
|
2017-03-08 00:24:16 +01:00
|
|
|
extern void report_resource_stored(struct device *dev, struct resource *resource, const char *comment);
|
2004-10-14 23:10:23 +02:00
|
|
|
|
2004-10-30 10:05:41 +02:00
|
|
|
typedef void (*resource_search_t)(void *gp, struct device *dev, struct resource *res);
|
|
|
|
extern void search_bus_resources(struct bus *bus,
|
|
|
|
unsigned long type_mask, unsigned long type,
|
|
|
|
resource_search_t search, void *gp);
|
|
|
|
|
|
|
|
extern void search_global_resources(
|
|
|
|
unsigned long type_mask, unsigned long type,
|
|
|
|
resource_search_t search, void *gp);
|
|
|
|
|
2005-07-08 04:49:49 +02:00
|
|
|
#define RESOURCE_TYPE_MAX 20
|
|
|
|
extern const char *resource_type(struct resource *resource);
|
|
|
|
|
2014-12-25 03:43:20 +01:00
|
|
|
static inline void *res2mmio(struct resource *res, unsigned long offset,
|
|
|
|
unsigned long mask)
|
|
|
|
{
|
|
|
|
return (void *)(uintptr_t)((res->base + offset) & ~mask);
|
|
|
|
}
|
|
|
|
|
2009-07-02 20:56:24 +02:00
|
|
|
#endif /* DEVICE_RESOURCE_H */
|