Drop CONFIG_CHIP_NAME. Those config statements in Config.lb should
[coreboot.git] / src / include / device / device.h
index d5013f15dac432af3d1bf5fd3097c7e85fd338b3..7d7a6bc15a9480cbbf97bde3a5d2abda1ce4f0d0 100644 (file)
@@ -1,62 +1,94 @@
 #ifndef DEVICE_H
 #define DEVICE_H
 
+#include <stdint.h>
 #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);
+       char *name;
+};
+
+#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);
+       const struct pci_operations *ops_pci;
+       const struct smbus_bus_operations *ops_smbus_bus;
+       const struct pci_bus_operations *ops_pci_bus;
 };
 
 
-#define MAX_RESOURCES 6
+struct bus {
+       device_t        dev;            /* This bridge device */
+       device_t        children;       /* devices behind this bridge */
+       unsigned        bridge_ctrl;    /* Bridge control register */
+       unsigned char   link;           /* 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 24 
+#define MAX_LINKS    8 
 /*
  * There is one device structure for each slot-number/function-number
  * combination:
  */
 
 struct device {
-       device_t bus;           /* bus this device is on */
-       device_t children;      /* devices behind this bridge */
-       device_t sibling;       /* next device on this bus */
-       device_t next;          /* chain of all devices */
-
-       unsigned int    devfn;          /* encoded device & function index */
-       unsigned short  vendor;
-       unsigned short  device;
-       unsigned int    class;          /* 3 bytes: (base,sub,prog-if) */
+       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) */
        unsigned int    hdr_type;       /* PCI header type */
-       unsigned int    enable : 1;     /* set if we should enable the device */
+       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;
+       unsigned long   rom_address;
 
-       unsigned char   secondary;      /* secondary bus number */
-       unsigned char   subordinate;    /* max subordinate bus number */
        uint8_t command;
-       /*
-        * In theory, the irq level can be read from configuration
-        * space and all would be fine.  However, old PCI chips don't
-        * support these registers and return 0 instead.  For example,
-        * the Vision864-P rev 0 chip can uses INTA, but returns 0 in
-        * the interrupt line and pin registers.  pci_init()
-        * initializes this field with the value at PCI_INTERRUPT_LINE
-        * and it is the job of pcibios_fixup() to change it if
-        * necessary.  The field must not be 0 unless the device
-        * cannot generate interrupts at all.
-        */
-       unsigned int    irq;            /* irq generated by this device */
 
-       /* Base registers for this device, can be adjusted by
-        * pcibios_fixup() as necessary.
-        */
+       /* Base registers for this device. I/O, MEM and Expansion ROM */
        struct resource resource[MAX_RESOURCES];
        unsigned int resources;
-       unsigned long rom_address;
+
+       /* link are (down stream) buses attached to the device, usually a leaf
+        * device with no children have 0 buses attached and a bridge has 1 bus 
+        */
+       struct bus link[MAX_LINKS];
+       /* number of buses attached to the device */
+       unsigned int links;
+
        struct device_operations *ops;
+       struct chip_operations *chip_ops;
+       void *chip_info;
 };
 
 extern struct device   dev_root;       /* root bus */
@@ -64,22 +96,35 @@ extern struct device        *all_devices;   /* list of all devices */
 
 
 /* Generic device interface functions */
-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 */
-void append_device(device_t dev);
-void compute_allocate_resource(device_t bus, struct resource *bridge,
+int reset_bus(struct bus *bus);
+unsigned int scan_bus(struct device *bus, unsigned int max);
+void compute_allocate_resource(struct bus *bus, struct resource *bridge,
        unsigned long type_mask, unsigned long type);
-void assign_resources(device_t bus);
+void assign_resources(struct bus *bus);
+void enable_resources(struct device *dev);
 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);
 
 /* 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_class (unsigned int class, device_t from);
 device_t dev_find_slot (unsigned int bus, unsigned int devfn);
+device_t dev_find_slot_on_smbus (unsigned int bus, unsigned int addr);
+
 
 /* Rounding for boundaries. 
  * Due to some chip bugs, go ahead and roung IO to 16
@@ -87,5 +132,12 @@ device_t dev_find_slot (unsigned int bus, unsigned int devfn);
 #define DEVICE_IO_ALIGN 16 
 #define DEVICE_MEM_ALIGN 4096
 
-
+extern struct device_operations default_dev_ops_root;
+void root_dev_read_resources(device_t dev);
+void root_dev_set_resources(device_t dev);
+unsigned int scan_static_bus(device_t bus, unsigned int max);
+void enable_childrens_resources(device_t dev);
+void root_dev_enable_resources(device_t dev);
+unsigned int root_dev_scan_bus(device_t root, unsigned int max);
+void root_dev_init(device_t dev);
 #endif /* DEVICE_H */