X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=coreboot.git;a=blobdiff_plain;f=src%2Finclude%2Fdevice%2Fdevice.h;h=0aea1d6087ee3a3ec2be198719432fc6c5b75767;hp=6dade9ed99ed113c1ac7c7e3c4bab047d2939a5c;hb=dc8448fd8be4768ef9d5f9b8cbcf28db0a2029be;hpb=b78c1972feed4c57eebba8f94de86a91e32c3fa7 diff --git a/src/include/device/device.h b/src/include/device/device.h index 6dade9ed9..0aea1d608 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -5,104 +5,161 @@ #include #include + struct device; typedef struct device * device_t; +struct pci_operations; +struct pci_bus_operations; +struct smbus_bus_operations; + +/* Chip operations */ +struct chip_operations { + 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); + 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 8 -#define MAX_LINKS 3 /* * 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 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 *chip; + 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); -extern void compact_resources(device_t dev); -extern struct resource *get_resource(device_t dev, unsigned index); +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 unsigned int root_dev_scan_pci_bus(device_t root, unsigned int max); +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 */