- Updates to config.g so that it works more reliably and has initial support
[coreboot.git] / src / include / device / device.h
1 #ifndef DEVICE_H
2 #define DEVICE_H
3
4 #include <stdint.h>
5 #include <device/resource.h>
6
7 struct device;
8 typedef struct device * device_t;
9
10 struct device_operations {
11         void (*read_resources)(device_t dev);
12         void (*set_resources)(device_t dev);
13         void (*init)(device_t dev);
14         unsigned int (*scan_bus)(device_t  bus, unsigned int max);
15         void (*enable)(device_t dev);
16 };
17
18
19 #define MAX_RESOURCES 6
20 /*
21  * There is one device structure for each slot-number/function-number
22  * combination:
23  */
24
25 struct device {
26         device_t bus;           /* bus this device is on */
27         device_t children;      /* devices behind this bridge */
28         device_t sibling;       /* next device on this bus */
29         device_t next;          /* chain of all devices */
30
31         unsigned int    devfn;          /* encoded device & function index */
32         unsigned short  vendor;
33         unsigned short  device;
34         unsigned int    class;          /* 3 bytes: (base,sub,prog-if) */
35         unsigned int    hdr_type;       /* PCI header type */
36         unsigned int    enable : 1;     /* set if we should enable the device */
37
38         unsigned char   secondary;      /* secondary bus number */
39         unsigned char   subordinate;    /* max subordinate bus number */
40         uint8_t command;
41         /*
42          * In theory, the irq level can be read from configuration
43          * space and all would be fine.  However, old PCI chips don't
44          * support these registers and return 0 instead.  For example,
45          * the Vision864-P rev 0 chip can uses INTA, but returns 0 in
46          * the interrupt line and pin registers.  pci_init()
47          * initializes this field with the value at PCI_INTERRUPT_LINE
48          * and it is the job of pcibios_fixup() to change it if
49          * necessary.  The field must not be 0 unless the device
50          * cannot generate interrupts at all.
51          */
52         unsigned int    irq;            /* irq generated by this device */
53
54         /* Base registers for this device, can be adjusted by
55          * pcibios_fixup() as necessary.
56          */
57         struct resource resource[MAX_RESOURCES];
58         unsigned int resources;
59         unsigned long rom_address;
60         struct device_operations *ops;
61 };
62
63 extern struct device    dev_root;       /* root bus */
64 extern struct device    *all_devices;   /* list of all devices */
65
66
67 /* Generic device interface functions */
68 extern void dev_enumerate(void);
69 extern void dev_configure(void);
70 extern void dev_enable(void);
71 extern void dev_initialize(void);
72
73 /* Generic device helper functions */
74 void append_device(device_t dev);
75 void compute_allocate_resource(device_t bus, struct resource *bridge,
76         unsigned long type_mask, unsigned long type);
77 void assign_resources(device_t bus);
78 void enumerate_static_device(void);
79
80 /* Helper functions */
81 device_t dev_find_device (unsigned int vendor, unsigned int device, device_t from);
82 device_t dev_find_class (unsigned int class, device_t from);
83 device_t dev_find_slot (unsigned int bus, unsigned int devfn);
84
85 /* Rounding for boundaries. 
86  * Due to some chip bugs, go ahead and roung IO to 16
87  */
88 #define DEVICE_IO_ALIGN 16 
89 #define DEVICE_MEM_ALIGN 4096
90
91
92 #endif /* DEVICE_H */