2003-04-24 08:25:08 +02:00
|
|
|
#ifndef DEVICE_H
|
|
|
|
#define DEVICE_H
|
|
|
|
|
2014-06-24 09:35:02 +02:00
|
|
|
/*
|
|
|
|
* NOTICE: Header is ROMCC tentative.
|
|
|
|
* This header is incompatible with ROMCC and its inclusion leads to 'odd'
|
|
|
|
* build failures.
|
|
|
|
*/
|
|
|
|
#if !defined(__ROMCC__)
|
|
|
|
|
2003-09-02 01:17:58 +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>
|
2014-02-26 14:19:04 +01:00
|
|
|
#include <rules.h>
|
2003-04-24 08:25:08 +02:00
|
|
|
#include <device/resource.h>
|
2003-09-02 05:36:25 +02:00
|
|
|
#include <device/path.h>
|
2003-04-24 08:25:08 +02:00
|
|
|
|
|
|
|
struct device;
|
2013-06-25 22:17:43 +02:00
|
|
|
|
|
|
|
#ifndef __SIMPLE_DEVICE__
|
2003-06-12 21:23:51 +02:00
|
|
|
typedef struct device * device_t;
|
2004-10-14 23:10:23 +02:00
|
|
|
struct pci_operations;
|
2004-11-18 23:38:08 +01:00
|
|
|
struct pci_bus_operations;
|
2016-06-08 00:38:14 +02:00
|
|
|
struct i2c_bus_operations;
|
2004-10-14 23:10:23 +02:00
|
|
|
struct smbus_bus_operations;
|
2013-06-10 22:08:35 +02:00
|
|
|
struct pnp_mode_ops;
|
2017-02-11 19:57:23 +01:00
|
|
|
struct spi_bus_operations;
|
2003-06-12 21:23:51 +02:00
|
|
|
|
2004-10-16 08:20:29 +02:00
|
|
|
/* Chip operations */
|
|
|
|
struct chip_operations {
|
|
|
|
void (*enable_dev)(struct device *dev);
|
2012-07-25 10:33:05 +02:00
|
|
|
void (*init)(void *chip_info);
|
2013-10-30 00:32:00 +01:00
|
|
|
void (*final)(void *chip_info);
|
2012-07-25 10:33:05 +02:00
|
|
|
unsigned int initialized : 1;
|
2013-10-30 00:32:00 +01:00
|
|
|
unsigned int finalized : 1;
|
2009-09-29 16:56:15 +02:00
|
|
|
const char *name;
|
2004-10-16 08:20:29 +02:00
|
|
|
};
|
|
|
|
|
2004-11-04 12:04:33 +01:00
|
|
|
#define CHIP_NAME(X) .name = X,
|
|
|
|
|
2005-07-08 04:49:49 +02:00
|
|
|
struct bus;
|
|
|
|
|
2014-08-27 23:42:45 +02:00
|
|
|
struct smbios_type11;
|
2014-08-30 19:28:05 +02:00
|
|
|
struct acpi_rsdp;
|
2014-08-27 23:42:45 +02:00
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
struct device_operations {
|
2003-06-12 21:23:51 +02:00
|
|
|
void (*read_resources)(device_t dev);
|
|
|
|
void (*set_resources)(device_t dev);
|
2003-09-02 05:36:25 +02:00
|
|
|
void (*enable_resources)(device_t dev);
|
2003-06-12 21:23:51 +02:00
|
|
|
void (*init)(device_t dev);
|
2013-10-30 00:32:00 +01:00
|
|
|
void (*final)(device_t dev);
|
2015-03-19 20:04:23 +01:00
|
|
|
void (*scan_bus)(device_t bus);
|
2003-07-17 05:26:03 +02:00
|
|
|
void (*enable)(device_t dev);
|
2012-07-20 12:29:33 +02:00
|
|
|
void (*disable)(device_t dev);
|
2004-12-03 04:39:04 +01:00
|
|
|
void (*set_link)(device_t dev, unsigned int link);
|
2005-07-08 04:49:49 +02:00
|
|
|
void (*reset_bus)(struct bus *bus);
|
2011-08-14 20:56:34 +02:00
|
|
|
#if CONFIG_GENERATE_SMBIOS_TABLES
|
|
|
|
int (*get_smbios_data)(device_t dev, int *handle, unsigned long *current);
|
2014-08-27 23:42:45 +02:00
|
|
|
void (*get_smbios_strings)(device_t dev, struct smbios_type11 *t);
|
2014-08-30 19:28:05 +02:00
|
|
|
#endif
|
2014-11-09 13:30:50 +01:00
|
|
|
#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)
|
2015-04-12 22:28:37 +02:00
|
|
|
unsigned long (*write_acpi_tables)(device_t dev, unsigned long start, struct acpi_rsdp *rsdp);
|
2015-04-12 22:18:55 +02:00
|
|
|
void (*acpi_fill_ssdt_generator)(device_t dev);
|
2015-04-12 21:49:46 +02:00
|
|
|
void (*acpi_inject_dsdt_generator)(device_t dev);
|
2016-05-09 03:15:25 +02:00
|
|
|
const char *(*acpi_name)(device_t dev);
|
2011-08-14 20:56:34 +02:00
|
|
|
#endif
|
2004-11-18 23:38:08 +01:00
|
|
|
const struct pci_operations *ops_pci;
|
2016-06-08 00:38:14 +02:00
|
|
|
const struct i2c_bus_operations *ops_i2c_bus;
|
2017-02-11 19:57:23 +01:00
|
|
|
const struct spi_bus_operations *ops_spi_bus;
|
2004-11-18 23:38:08 +01:00
|
|
|
const struct smbus_bus_operations *ops_smbus_bus;
|
2013-07-04 16:17:45 +02:00
|
|
|
const struct pci_bus_operations * (*ops_pci_bus)(device_t dev);
|
2013-06-10 22:08:35 +02:00
|
|
|
const struct pnp_mode_ops *ops_pnp_mode;
|
2003-04-24 08:25:08 +02:00
|
|
|
};
|
2014-06-30 12:15:42 +02:00
|
|
|
|
2014-10-30 22:31:44 +01:00
|
|
|
/**
|
|
|
|
* Standard device operations function pointers shims.
|
|
|
|
*/
|
|
|
|
static inline void device_noop(struct device *dev) {}
|
|
|
|
#define DEVICE_NOOP device_noop
|
|
|
|
|
2013-06-25 22:17:43 +02:00
|
|
|
#endif /* ! __SIMPLE_DEVICE__ */
|
2003-04-24 08:25:08 +02:00
|
|
|
|
|
|
|
|
2003-09-02 05:36:25 +02:00
|
|
|
struct bus {
|
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
|
|
|
|
2017-03-08 00:00:18 +01:00
|
|
|
ROMSTAGE_CONST struct device * dev; /* This bridge device */
|
|
|
|
ROMSTAGE_CONST struct device * children; /* devices behind this bridge */
|
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
|
|
|
ROMSTAGE_CONST struct bus *next; /* The next bridge on this device */
|
2017-03-07 03:01:04 +01:00
|
|
|
unsigned int bridge_ctrl; /* Bridge control register */
|
2015-02-23 05:58:26 +01:00
|
|
|
uint16_t bridge_cmd; /* Bridge command register */
|
2010-06-10 00:41:35 +02:00
|
|
|
unsigned char link_num; /* The index of this link */
|
2017-03-08 00:00:18 +01:00
|
|
|
uint16_t secondary; /* secondary bus number */
|
2006-10-04 22:46:15 +02:00
|
|
|
uint16_t subordinate; /* max subordinate bus number */
|
2003-09-02 05:36:25 +02:00
|
|
|
unsigned char cap; /* PCi capability offset */
|
2015-02-22 10:38:49 +01:00
|
|
|
uint32_t hcdn_reg; /* For HyperTransport link */
|
|
|
|
|
2017-03-07 03:01:04 +01:00
|
|
|
unsigned int reset_needed : 1;
|
|
|
|
unsigned int disable_relaxed_ordering : 1;
|
|
|
|
unsigned int ht_link_up : 1;
|
2003-09-02 05:36:25 +02:00
|
|
|
};
|
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
/*
|
2003-07-21 22:13:45 +02:00
|
|
|
* There is one device structure for each slot-number/function-number
|
2003-04-24 08:25:08 +02:00
|
|
|
* combination:
|
|
|
|
*/
|
|
|
|
|
2012-06-21 22:19:48 +02:00
|
|
|
struct pci_irq_info {
|
|
|
|
unsigned int ioapic_irq_pin;
|
|
|
|
unsigned int ioapic_src_pin;
|
|
|
|
unsigned int ioapic_dst_id;
|
|
|
|
unsigned int ioapic_flags;
|
|
|
|
};
|
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
struct device {
|
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
|
|
|
ROMSTAGE_CONST struct bus * bus; /* bus this device is on, for bridge
|
2004-11-25 18:37:19 +01:00
|
|
|
* devices, it is the up stream bus */
|
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
|
|
|
|
|
|
|
ROMSTAGE_CONST struct device * sibling; /* next device on this bus */
|
|
|
|
|
|
|
|
ROMSTAGE_CONST struct device * next; /* chain of all devices */
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2003-09-02 05:36:25 +02:00
|
|
|
struct device_path path;
|
2017-03-07 03:01:04 +01:00
|
|
|
unsigned int vendor;
|
|
|
|
unsigned int device;
|
2011-03-01 22:51:29 +01:00
|
|
|
u16 subsystem_vendor;
|
|
|
|
u16 subsystem_device;
|
2008-10-29 05:46:52 +01:00
|
|
|
unsigned int class; /* 3 bytes: (base, sub, prog-if) */
|
2003-04-24 08:25:08 +02:00
|
|
|
unsigned int hdr_type; /* PCI header type */
|
2004-04-29 22:08:54 +02:00
|
|
|
unsigned int enabled : 1; /* set if we should enable the device */
|
2004-10-14 23:10:23 +02:00
|
|
|
unsigned int initialized : 1; /* set if we have initialized the device */
|
2004-10-21 12:44:08 +02:00
|
|
|
unsigned int on_mainboard : 1;
|
2012-06-21 22:19:48 +02:00
|
|
|
struct pci_irq_info pci_irq_info[4];
|
2009-07-02 20:56:24 +02:00
|
|
|
u8 command;
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2004-12-27 18:53:45 +01:00
|
|
|
/* Base registers for this device. I/O, MEM and Expansion ROM */
|
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
|
|
|
ROMSTAGE_CONST struct resource *resource_list;
|
2003-09-02 05:36:25 +02:00
|
|
|
|
2009-07-02 20:56:24 +02:00
|
|
|
/* links are (downstream) buses attached to the device, usually a leaf
|
2010-05-21 16:33:48 +02:00
|
|
|
* device with no children has 0 buses attached and a bridge has 1 bus
|
2005-07-08 04:49:49 +02:00
|
|
|
*/
|
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
|
|
|
ROMSTAGE_CONST struct bus *link_list;
|
2003-09-02 05:36:25 +02:00
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
struct device_operations *ops;
|
2012-08-07 23:50:47 +02:00
|
|
|
#ifndef __PRE_RAM__
|
2012-07-25 10:33:05 +02:00
|
|
|
struct chip_operations *chip_ops;
|
2012-10-10 22:14:28 +02:00
|
|
|
const char *name;
|
2012-08-07 23:50:47 +02:00
|
|
|
#endif
|
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
|
|
|
ROMSTAGE_CONST void *chip_info;
|
2003-04-24 08:25:08 +02:00
|
|
|
};
|
|
|
|
|
2009-10-09 22:13:43 +02:00
|
|
|
/**
|
|
|
|
* This is the root of the device tree. The device tree is defined in the
|
|
|
|
* static.c file and is generated by the config tool at compile time.
|
|
|
|
*/
|
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
|
|
|
extern ROMSTAGE_CONST struct device dev_root;
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2013-06-25 22:17:43 +02:00
|
|
|
#ifndef __SIMPLE_DEVICE__
|
|
|
|
|
|
|
|
extern struct device *all_devices; /* list of all devices */
|
2010-05-21 16:33:48 +02:00
|
|
|
extern struct resource *free_resources;
|
2010-06-10 00:41:35 +02:00
|
|
|
extern struct bus *free_links;
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2012-10-09 21:28:56 +02:00
|
|
|
extern const char mainboard_name[];
|
|
|
|
|
2013-10-18 10:02:46 +02:00
|
|
|
#if CONFIG_GFXUMA
|
2012-07-11 06:55:21 +02:00
|
|
|
/* IGD UMA memory */
|
|
|
|
extern uint64_t uma_memory_base;
|
|
|
|
extern uint64_t uma_memory_size;
|
2013-10-18 10:02:46 +02:00
|
|
|
#endif
|
2012-07-11 06:55:21 +02:00
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
/* Generic device interface functions */
|
2009-03-13 16:42:27 +01:00
|
|
|
device_t alloc_dev(struct bus *parent, struct device_path *path);
|
2012-07-25 10:33:05 +02:00
|
|
|
void dev_initialize_chips(void);
|
2009-03-13 16:42:27 +01:00
|
|
|
void dev_enumerate(void);
|
|
|
|
void dev_configure(void);
|
|
|
|
void dev_enable(void);
|
|
|
|
void dev_initialize(void);
|
|
|
|
void dev_optimize(void);
|
2013-10-30 00:32:00 +01:00
|
|
|
void dev_finalize(void);
|
|
|
|
void dev_finalize_chips(void);
|
2003-04-24 08:25:08 +02:00
|
|
|
|
|
|
|
/* Generic device helper functions */
|
2009-03-13 16:42:27 +01:00
|
|
|
int reset_bus(struct bus *bus);
|
2015-02-20 20:28:31 +01:00
|
|
|
void scan_bridges(struct bus *bus);
|
2009-03-13 16:42:27 +01:00
|
|
|
void assign_resources(struct bus *bus);
|
2012-10-07 14:57:15 +02:00
|
|
|
const char *dev_name(device_t dev);
|
2009-03-13 16:42:27 +01:00
|
|
|
const char *dev_path(device_t dev);
|
2013-06-10 18:59:17 +02:00
|
|
|
u32 dev_path_encode(device_t dev);
|
2005-07-08 04:49:49 +02:00
|
|
|
const char *bus_path(struct bus *bus);
|
2009-03-13 16:42:27 +01:00
|
|
|
void dev_set_enabled(device_t dev, int enable);
|
|
|
|
void disable_children(struct bus *bus);
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2010-03-05 19:27:19 +01:00
|
|
|
/* Option ROM helper functions */
|
|
|
|
void run_bios(struct device *dev, unsigned long addr);
|
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
/* Helper functions */
|
2004-10-14 23:10:23 +02:00
|
|
|
device_t find_dev_path(struct bus *parent, struct device_path *path);
|
2003-10-11 08:20:25 +02:00
|
|
|
device_t alloc_find_dev(struct bus *parent, struct device_path *path);
|
2010-11-05 00:23:47 +01:00
|
|
|
device_t dev_find_device (u16 vendor, u16 device, device_t from);
|
2003-06-12 21:23:51 +02:00
|
|
|
device_t dev_find_class (unsigned int class, device_t from);
|
2016-12-06 13:36:30 +01:00
|
|
|
device_t dev_find_path(device_t prev_match, enum device_path_type path_type);
|
2003-06-12 21:23:51 +02:00
|
|
|
device_t dev_find_slot (unsigned int bus, unsigned int devfn);
|
2005-07-06 19:13:46 +02:00
|
|
|
device_t dev_find_slot_on_smbus (unsigned int bus, unsigned int addr);
|
2014-02-08 18:58:39 +01:00
|
|
|
device_t dev_find_slot_pnp(u16 port, u16 device);
|
2017-03-07 03:01:04 +01:00
|
|
|
device_t dev_find_lapic(unsigned int apic_id);
|
2012-03-30 22:52:58 +02:00
|
|
|
int dev_count_cpu(void);
|
2005-07-06 19:13:46 +02:00
|
|
|
|
2017-03-07 03:01:04 +01:00
|
|
|
device_t add_cpu_device(struct bus *cpu_bus, unsigned int apic_id, int enabled);
|
|
|
|
void set_cpu_topology(device_t cpu, unsigned int node, unsigned int package, unsigned int core, unsigned int thread);
|
2012-08-07 16:12:11 +02:00
|
|
|
|
|
|
|
#define amd_cpu_topology(cpu, node, core) \
|
|
|
|
set_cpu_topology(cpu, node, 0, core, 0)
|
|
|
|
|
|
|
|
#define intel_cpu_topology(cpu, package, core, thread) \
|
|
|
|
set_cpu_topology(cpu, 0, package, core, thread)
|
|
|
|
|
2009-05-12 00:45:35 +02:00
|
|
|
/* Debug functions */
|
|
|
|
void print_resource_tree(struct device * root, int debug_level,
|
|
|
|
const char *msg);
|
2016-08-15 09:04:21 +02:00
|
|
|
void show_devs_tree(struct device *dev, int debug_level, int depth);
|
2009-05-12 00:45:35 +02:00
|
|
|
void show_devs_subtree(struct device *root, int debug_level, const char *msg);
|
|
|
|
void show_all_devs(int debug_level, const char *msg);
|
2009-10-27 15:29:29 +01:00
|
|
|
void show_all_devs_tree(int debug_level, const char *msg);
|
2009-05-12 00:45:35 +02:00
|
|
|
void show_one_resource(int debug_level, struct device *dev,
|
|
|
|
struct resource *resource, const char *comment);
|
|
|
|
void show_all_devs_resources(int debug_level, const char* msg);
|
2003-04-24 08:25:08 +02:00
|
|
|
|
2010-04-27 08:56:47 +02:00
|
|
|
/* Rounding for boundaries.
|
2009-05-12 00:45:35 +02:00
|
|
|
* Due to some chip bugs, go ahead and round IO to 16
|
2003-04-24 08:25:08 +02:00
|
|
|
*/
|
2010-04-27 08:56:47 +02:00
|
|
|
#define DEVICE_IO_ALIGN 16
|
2003-04-24 08:25:08 +02:00
|
|
|
#define DEVICE_MEM_ALIGN 4096
|
|
|
|
|
2009-03-13 16:42:27 +01:00
|
|
|
extern struct device_operations default_dev_ops_root;
|
2009-07-02 20:56:24 +02:00
|
|
|
void pci_domain_read_resources(struct device *dev);
|
2015-03-19 20:04:23 +01:00
|
|
|
void pci_domain_scan_bus(struct device *dev);
|
2010-10-11 21:36:13 +02:00
|
|
|
|
2012-07-27 07:37:12 +02:00
|
|
|
void fixed_mem_resource(device_t dev, unsigned long index,
|
|
|
|
unsigned long basek, unsigned long sizek, unsigned long type);
|
|
|
|
|
2016-12-02 07:56:05 +01:00
|
|
|
void mmconf_resource_init(struct resource *res, resource_t base, int buses);
|
|
|
|
void mmconf_resource(struct device *dev, unsigned long index);
|
|
|
|
|
2015-03-19 20:04:23 +01:00
|
|
|
void scan_smbus(device_t bus);
|
2017-02-13 22:22:19 +01:00
|
|
|
void scan_generic_bus(device_t bus);
|
2016-05-08 05:01:34 +02:00
|
|
|
void scan_static_bus(device_t bus);
|
2015-03-19 20:04:23 +01:00
|
|
|
void scan_lpc_bus(device_t bus);
|
2012-07-26 22:51:20 +02:00
|
|
|
|
|
|
|
/* It is the caller's responsibility to adjust regions such that ram_resource()
|
|
|
|
* and mmio_resource() do not overlap.
|
|
|
|
*/
|
2012-07-27 07:37:12 +02:00
|
|
|
#define ram_resource(dev, idx, basek, sizek) \
|
|
|
|
fixed_mem_resource(dev, idx, basek, sizek, IORESOURCE_CACHEABLE)
|
|
|
|
|
2013-03-23 04:03:09 +01:00
|
|
|
#define reserved_ram_resource(dev, idx, basek, sizek) \
|
2013-03-23 04:09:46 +01:00
|
|
|
fixed_mem_resource(dev, idx, basek, sizek, IORESOURCE_CACHEABLE | IORESOURCE_RESERVE)
|
2013-03-23 04:03:09 +01:00
|
|
|
|
2012-07-27 07:37:12 +02:00
|
|
|
#define bad_ram_resource(dev, idx, basek, sizek) \
|
2013-03-23 04:03:09 +01:00
|
|
|
reserved_ram_resource((dev), (idx), (basek), (sizek))
|
2012-07-27 07:37:12 +02:00
|
|
|
|
|
|
|
#define uma_resource(dev, idx, basek, sizek) \
|
2013-03-23 04:09:46 +01:00
|
|
|
fixed_mem_resource(dev, idx, basek, sizek, IORESOURCE_RESERVE)
|
2012-07-27 07:37:12 +02:00
|
|
|
|
|
|
|
#define mmio_resource(dev, idx, basek, sizek) \
|
2013-03-23 04:09:46 +01:00
|
|
|
fixed_mem_resource(dev, idx, basek, sizek, IORESOURCE_RESERVE)
|
2012-07-27 07:37:12 +02:00
|
|
|
|
2010-10-11 21:36:13 +02:00
|
|
|
void tolm_test(void *gp, struct device *dev, struct resource *new);
|
|
|
|
u32 find_pci_tolm(struct bus *bus);
|
2013-06-25 22:17:43 +02:00
|
|
|
|
|
|
|
#else /* vv __SIMPLE_DEVICE__ vv */
|
|
|
|
|
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
|
|
|
ROMSTAGE_CONST struct device * dev_find_slot (unsigned int bus,
|
|
|
|
unsigned int devfn);
|
2014-05-13 01:38:59 +02:00
|
|
|
ROMSTAGE_CONST struct device *dev_find_next_pci_device(
|
|
|
|
ROMSTAGE_CONST struct device *previous_dev);
|
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
|
|
|
ROMSTAGE_CONST struct device * dev_find_slot_on_smbus (unsigned int bus,
|
|
|
|
unsigned int addr);
|
2015-01-28 21:03:46 +01:00
|
|
|
ROMSTAGE_CONST struct device * dev_find_slot_pnp(u16 port, u16 device);
|
2013-06-25 22:17:43 +02:00
|
|
|
|
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
|
|
|
#endif
|
2013-06-25 22:17:43 +02:00
|
|
|
|
2014-06-24 09:35:02 +02:00
|
|
|
#endif /* !defined(__ROMCC__) */
|
|
|
|
|
2003-04-24 08:25:08 +02:00
|
|
|
#endif /* DEVICE_H */
|