X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Finclude%2Fdevice%2Fdevice.h;h=0aea1d6087ee3a3ec2be198719432fc6c5b75767;hb=dc8448fd8be4768ef9d5f9b8cbcf28db0a2029be;hp=db91fcc1efd616cbe5b29b23ebba2f95aaee8c4e;hpb=a9e632c2ac29c60872e7e4f9314263b34ce5031d;p=coreboot.git diff --git a/src/include/device/device.h b/src/include/device/device.h index db91fcc1e..0aea1d608 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -15,16 +15,15 @@ struct smbus_bus_operations; /* Chip operations */ struct chip_operations { void (*enable_dev)(struct device *dev); -#if CONFIG_CHIP_NAME == 1 - char *name; + const char *name; +#if CONFIG_GENERATE_SMBIOS_TABLES + int (*get_smbios_data)(device_t dev, int *handle, unsigned long *current); #endif }; -#if CONFIG_CHIP_NAME == 1 #define CHIP_NAME(X) .name = X, -#else -#define CHIP_NAME(X) -#endif + +struct bus; struct device_operations { void (*read_resources)(device_t dev); @@ -33,6 +32,11 @@ struct device_operations { void (*init)(device_t dev); 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; @@ -42,92 +46,120 @@ struct device_operations { 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 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 */