5 #include <device/resource.h>
8 typedef struct device * device_t;
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);
19 #define MAX_RESOURCES 6
21 * There is one device structure for each slot-number/function-number
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 */
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 */
38 unsigned char secondary; /* secondary bus number */
39 unsigned char subordinate; /* max subordinate bus number */
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.
52 unsigned int irq; /* irq generated by this device */
54 /* Base registers for this device, can be adjusted by
55 * pcibios_fixup() as necessary.
57 struct resource resource[MAX_RESOURCES];
58 unsigned int resources;
59 unsigned long rom_address;
60 struct device_operations *ops;
63 extern struct device dev_root; /* root bus */
64 extern struct device *all_devices; /* list of all devices */
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);
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);
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);
85 /* Rounding for boundaries.
86 * Due to some chip bugs, go ahead and roung IO to 16
88 #define DEVICE_IO_ALIGN 16
89 #define DEVICE_MEM_ALIGN 4096