1#ifndef DEVICE_H
2#define DEVICE_H
3
4#include <stdint.h>
5#include <device/resource.h>
6#include <device/path.h>
7
8
9struct device;
10typedef struct device * device_t;
11struct pci_operations;
12struct pci_bus_operations;
13struct smbus_bus_operations;
14
15
16struct chip_operations {
17 void (*enable_dev)(struct device *dev);
18 const char *name;
19};
20
21#define CHIP_NAME(X) .name = X,
22
23struct bus;
24
25struct device_operations {
26 void (*read_resources)(device_t dev);
27 void (*set_resources)(device_t dev);
28 void (*enable_resources)(device_t dev);
29 void (*init)(device_t dev);
30 unsigned int (*scan_bus)(device_t bus, unsigned int max);
31 void (*enable)(device_t dev);
32 void (*set_link)(device_t dev, unsigned int link);
33 void (*reset_bus)(struct bus *bus);
34 const struct pci_operations *ops_pci;
35 const struct smbus_bus_operations *ops_smbus_bus;
36 const struct pci_bus_operations *ops_pci_bus;
37};
38
39
40struct bus {
41 device_t dev;
42 device_t children;
43 struct bus *next;
44 unsigned bridge_ctrl;
45 unsigned char link_num;
46 uint16_t secondary;
47 uint16_t subordinate;
48 unsigned char cap;
49 unsigned reset_needed : 1;
50 unsigned disable_relaxed_ordering : 1;
51};
52
53
54
55
56
57
58struct device {
59 struct bus * bus;
60
61 device_t sibling;
62 device_t next;
63
64 struct device_path path;
65 unsigned vendor;
66 unsigned device;
67 u16 subsystem_vendor;
68 u16 subsystem_device;
69 unsigned int class;
70 unsigned int hdr_type;
71 unsigned int enabled : 1;
72 unsigned int initialized : 1;
73 unsigned int on_mainboard : 1;
74
75 u8 command;
76
77
78 struct resource *resource_list;
79
80
81
82
83 struct bus *link_list;
84
85 struct device_operations *ops;
86 const struct chip_operations *chip_ops;
87 void *chip_info;
88};
89
90
91
92
93
94extern struct device dev_root;
95extern struct device *all_devices;
96
97extern struct resource *free_resources;
98extern struct bus *free_links;
99
100
101device_t alloc_dev(struct bus *parent, struct device_path *path);
102void dev_enumerate(void);
103void dev_configure(void);
104void dev_enable(void);
105void dev_initialize(void);
106void dev_optimize(void);
107
108
109int reset_bus(struct bus *bus);
110unsigned int scan_bus(struct device *bus, unsigned int max);
111void assign_resources(struct bus *bus);
112void enumerate_static_device(void);
113void enumerate_static_devices(void);
114const char *dev_path(device_t dev);
115const char *bus_path(struct bus *bus);
116void dev_set_enabled(device_t dev, int enable);
117void disable_children(struct bus *bus);
118
119
120void run_bios(struct device *dev, unsigned long addr);
121
122
123device_t find_dev_path(struct bus *parent, struct device_path *path);
124device_t alloc_find_dev(struct bus *parent, struct device_path *path);
125device_t dev_find_device (u16 vendor, u16 device, device_t from);
126device_t dev_find_class (unsigned int class, device_t from);
127device_t dev_find_slot (unsigned int bus, unsigned int devfn);
128device_t dev_find_slot_on_smbus (unsigned int bus, unsigned int addr);
129
130
131void print_resource_tree(struct device * root, int debug_level,
132 const char *msg);
133void show_devs_tree(struct device *dev, int debug_level, int depth, int linknum);
134void show_devs_subtree(struct device *root, int debug_level, const char *msg);
135void show_all_devs(int debug_level, const char *msg);
136void show_all_devs_tree(int debug_level, const char *msg);
137void show_one_resource(int debug_level, struct device *dev,
138 struct resource *resource, const char *comment);
139void show_all_devs_resources(int debug_level, const char* msg);
140
141
142
143
144#define DEVICE_IO_ALIGN 16
145#define DEVICE_MEM_ALIGN 4096
146
147extern struct device_operations default_dev_ops_root;
148void pci_domain_read_resources(struct device *dev);
149unsigned int pci_domain_scan_bus(struct device *dev, unsigned int max);
150unsigned int scan_static_bus(device_t bus, unsigned int max);
151
152void ram_resource(device_t dev, unsigned long index,
153 unsigned long basek, unsigned long sizek);
154void tolm_test(void *gp, struct device *dev, struct resource *new);
155u32 find_pci_tolm(struct bus *bus);
156
157#endif
158