Add a helper function to determine the number of enabled CPUs
[coreboot.git] / src / include / device / device.h
index 3e70f5d3868197313088f31dfbb29864bee06709..0aea1d6087ee3a3ec2be198719432fc6c5b75767 100644 (file)
 #include <device/resource.h>
 #include <device/path.h>
 
+
 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);
-       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     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    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 *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);
+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 */