X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Finclude%2Fdevice%2Fdevice.h;h=0aea1d6087ee3a3ec2be198719432fc6c5b75767;hb=dc8448fd8be4768ef9d5f9b8cbcf28db0a2029be;hp=79402e2111caae06dcab37787c2440b7f84634c9;hpb=04da1d35d11ba195fbf0af8f7ca5149b6ce502a6;p=coreboot.git diff --git a/src/include/device/device.h b/src/include/device/device.h index 79402e211..0aea1d608 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -9,115 +9,157 @@ struct device; typedef struct device * device_t; struct pci_operations; +struct pci_bus_operations; struct smbus_bus_operations; /* Chip operations */ struct chip_operations { - char *name; /* This is the print name for debugging */ void (*enable_dev)(struct device *dev); + const char *name; +#if CONFIG_GENERATE_SMBIOS_TABLES + int (*get_smbios_data)(device_t dev, int *handle, unsigned long *current); +#endif }; +#define CHIP_NAME(X) .name = X, + +struct bus; + struct device_operations { void (*read_resources)(device_t dev); void (*set_resources)(device_t dev); void (*enable_resources)(device_t dev); void (*init)(device_t dev); - unsigned int (*scan_bus)(device_t bus, unsigned int max); + unsigned int (*scan_bus)(device_t bus, unsigned int max); void (*enable)(device_t dev); - struct pci_operations *ops_pci; - struct smbus_bus_operations *ops_smbus_bus; + void (*set_link)(device_t dev, unsigned int link); + void (*reset_bus)(struct bus *bus); +#if CONFIG_GENERATE_SMBIOS_TABLES + int (*get_smbios_data)(device_t dev, int *handle, unsigned long *current); +#endif + const struct pci_operations *ops_pci; + const struct smbus_bus_operations *ops_smbus_bus; + const struct pci_bus_operations *ops_pci_bus; }; struct bus { device_t dev; /* This bridge device */ device_t children; /* devices behind this bridge */ + struct bus *next; /* The next bridge on this device */ unsigned bridge_ctrl; /* Bridge control register */ - unsigned char link; /* The index of this link */ - unsigned char secondary; /* secondary bus number */ - unsigned char subordinate; /* max subordinate bus number */ + unsigned char link_num; /* The index of this link */ + uint16_t secondary; /* secondary bus number */ + uint16_t subordinate; /* max subordinate bus number */ unsigned char cap; /* PCi capability offset */ + unsigned reset_needed : 1; + unsigned disable_relaxed_ordering : 1; }; -#define MAX_RESOURCES 12 -#define MAX_LINKS 4 /* * There is one device structure for each slot-number/function-number * combination: */ -struct chip; struct device { - struct bus * bus; /* bus this device is on */ + struct bus * bus; /* bus this device is on, for bridge + * devices, it is the up stream bus */ device_t sibling; /* next device on this bus */ device_t next; /* chain of all devices */ struct device_path path; unsigned vendor; unsigned device; - unsigned int class; /* 3 bytes: (base,sub,prog-if) */ + u16 subsystem_vendor; + u16 subsystem_device; + unsigned int class; /* 3 bytes: (base, sub, prog-if) */ unsigned int hdr_type; /* PCI header type */ unsigned int enabled : 1; /* set if we should enable the device */ unsigned int initialized : 1; /* set if we have initialized the device */ - unsigned int have_resources : 1; /* Set if we have read the devices resources */ + unsigned int on_mainboard : 1; - uint8_t command; + u8 command; - /* Base registers for this device, can be adjusted by - * pcibios_fixup() as necessary. - */ - struct resource resource[MAX_RESOURCES]; - unsigned int resources; + /* Base registers for this device. I/O, MEM and Expansion ROM */ + struct resource *resource_list; - struct bus link[MAX_LINKS]; - unsigned int links; + /* links are (downstream) buses attached to the device, usually a leaf + * device with no children has 0 buses attached and a bridge has 1 bus + */ + struct bus *link_list; - unsigned long rom_address; struct device_operations *ops; - struct chip_operations *chip_ops; + const struct chip_operations *chip_ops; void *chip_info; }; -extern struct device dev_root; /* root bus */ +/** + * 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. + */ +extern struct device dev_root; extern struct device *all_devices; /* list of all devices */ +extern struct resource *free_resources; +extern struct bus *free_links; /* Generic device interface functions */ -extern device_t alloc_dev(struct bus *parent, struct device_path *path); -extern void dev_enumerate(void); -extern void dev_configure(void); -extern void dev_enable(void); -extern void dev_initialize(void); +device_t alloc_dev(struct bus *parent, struct device_path *path); +void dev_enumerate(void); +void dev_configure(void); +void dev_enable(void); +void dev_initialize(void); +void dev_optimize(void); /* Generic device helper functions */ -extern void compute_allocate_resource(struct bus *bus, struct resource *bridge, - unsigned long type_mask, unsigned long type); -extern void assign_resources(struct bus *bus); -extern void enable_resources(struct device *dev); -extern void enumerate_static_device(void); -extern void enumerate_static_devices(void); -extern const char *dev_path(device_t dev); +int reset_bus(struct bus *bus); +unsigned int scan_bus(struct device *bus, unsigned int max); +void assign_resources(struct bus *bus); +void enumerate_static_device(void); +void enumerate_static_devices(void); +const char *dev_path(device_t dev); +const char *bus_path(struct bus *bus); +void dev_set_enabled(device_t dev, int enable); +void disable_children(struct bus *bus); + +/* Option ROM helper functions */ +void run_bios(struct device *dev, unsigned long addr); /* Helper functions */ device_t find_dev_path(struct bus *parent, struct device_path *path); device_t alloc_find_dev(struct bus *parent, struct device_path *path); -device_t dev_find_device (unsigned int vendor, unsigned int device, device_t from); +device_t dev_find_device (u16 vendor, u16 device, device_t from); device_t dev_find_class (unsigned int class, device_t from); device_t dev_find_slot (unsigned int bus, unsigned int devfn); - -/* Rounding for boundaries. - * Due to some chip bugs, go ahead and roung IO to 16 +device_t dev_find_slot_on_smbus (unsigned int bus, unsigned int addr); +device_t dev_find_lapic(unsigned apic_id); +int dev_count_cpu(void); + +/* Debug functions */ +void print_resource_tree(struct device * root, int debug_level, + const char *msg); +void show_devs_tree(struct device *dev, int debug_level, int depth, int linknum); +void show_devs_subtree(struct device *root, int debug_level, const char *msg); +void show_all_devs(int debug_level, const char *msg); +void show_all_devs_tree(int debug_level, const char *msg); +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); + +/* Rounding for boundaries. + * Due to some chip bugs, go ahead and round IO to 16 */ -#define DEVICE_IO_ALIGN 16 +#define DEVICE_IO_ALIGN 16 #define DEVICE_MEM_ALIGN 4096 -struct device_operations default_dev_ops_root; -extern void root_dev_read_resources(device_t dev); -extern void root_dev_set_resources(device_t dev); -extern unsigned int scan_static_bus(device_t bus, unsigned int max); -extern void enable_childrens_resources(device_t dev); -extern void root_dev_enable_resources(device_t dev); -extern unsigned int root_dev_scan_bus(device_t root, unsigned int max); -extern void root_dev_init(device_t dev); +extern struct device_operations default_dev_ops_root; +void pci_domain_read_resources(struct device *dev); +unsigned int pci_domain_scan_bus(struct device *dev, unsigned int max); +unsigned int scan_static_bus(device_t bus, unsigned int max); + +void ram_resource(device_t dev, unsigned long index, + unsigned long basek, unsigned long sizek); +void tolm_test(void *gp, struct device *dev, struct resource *new); +u32 find_pci_tolm(struct bus *bus); #endif /* DEVICE_H */