67c347040049c864912ca5ac854634a2e40ef022
[barrelfish] / usr / skb / programs / device_db.pl
1 :- local struct(pci_driver(
2     binary,             % Name of driver binary
3     supported_cards,    % List of cards this binary supports
4     core_hint,          % Preferred core to start the driver
5     core_offset,        % Core offset where to start the drivers (multi instance)
6     multi_instance,     % Allow multi instances of the driver
7     interrupt_load,     % Expected Interrupt load
8     interrupt_model,    % List of supported int models. legacy,msi,msix 
9     platforms,          % List of architectures the driver runs on
10     priority            % When more than one driver matches, the higher prio gets started
11 )).
12
13 :- dynamic(pci_driver/9).
14
15 :- local struct(cpu_driver(
16     binary,             % Name of driver binary
17     platforms           % List of architectures the driver runs on
18 )).
19
20 :- local struct(bus_driver(
21     binary,             % Name of driver binary
22     core_hint,          % Preferred core to start the driver
23     platforms           % List of architectures the driver runs on
24 )).
25
26 :- local struct(pci_card(
27     vendor,             % PCI Vendor ID
28     device,             % PCI Device ID
29     function,
30     subvendor,
31     subdevice
32 )).
33
34
35 %
36 % Driver entries
37 %
38
39 pci_driver{
40     binary: "e1000n",
41     supported_cards:
42     [ pci_card{ vendor: 16'8086, device: 16'1521, function: _, subvendor: _, subdevice: _ },
43       pci_card{ vendor: 16'8086, device: 16'107d, function: _, subvendor: _, subdevice: _ },
44       pci_card{ vendor: 16'8086, device: 16'107e, function: _, subvendor: _, subdevice: _ },
45       pci_card{ vendor: 16'8086, device: 16'107f, function: _, subvendor: _, subdevice: _ },
46       pci_card{ vendor: 16'8086, device: 16'10b9, function: _, subvendor: _, subdevice: _ },
47       pci_card{ vendor: 16'8086, device: 16'1096, function: _, subvendor: _, subdevice: _ },
48       pci_card{ vendor: 16'8086, device: 16'100e, function: _, subvendor: _, subdevice: _ },
49       pci_card{ vendor: 16'8086, device: 16'10c9, function: _, subvendor: _, subdevice: _ },
50       pci_card{ vendor: 16'8086, device: 16'10a7, function: _, subvendor: _, subdevice: _ },
51       pci_card{ vendor: 16'8086, device: 16'10d3, function: _, subvendor: _, subdevice: _ },
52       pci_card{ vendor: 16'8086, device: 16'1079, function: _, subvendor: _, subdevice: _ },
53       pci_card{ vendor: 16'8086, device: 16'1533, function: _, subvendor: _, subdevice: _ } ],
54     core_hint: 0,
55     core_offset: 0,
56     multi_instance: 0,
57     interrupt_load: 0.75,
58     platforms: ['x86_64', 'x86_32']
59 }.
60
61
62 pci_driver{
63     binary: "sfn5122f",
64     supported_cards:
65     [ pci_card{ vendor: 16'1924, device: 16'0803, function: _, subvendor: _, subdevice: _ }],
66     core_hint: 2,
67     core_offset: 1,
68     multi_instance: 1,
69     interrupt_load: 0.5,
70     platforms: ['x86_64']
71 }.
72
73
74 pci_driver{
75     binary: "e10k",
76     supported_cards:
77     [ pci_card{ vendor: 16'8086, device: 16'10fb, function: _, subvendor: _, subdevice: _ }],
78     core_hint: 2,
79     core_offset: 1,
80     multi_instance: 1,
81     interrupt_load: 0.5,
82     platforms: ['x86_64']
83 }.
84
85 pci_driver{
86     binary: "rtl8029",
87     supported_cards:
88     [ pci_card{ vendor: 16'10ec, device: 16'8029, function: _, subvendor: _, subdevice: _ } ],
89     core_hint: 0,
90     core_offset: 0,
91     multi_instance: 0,
92     interrupt_load: 0.5,
93     platforms: ['x86_64', 'x86_32']
94 }.
95
96 pci_driver{
97     binary: "xeon_phi",
98     supported_cards:
99     [ pci_card{ vendor: 16'8086, device: 16'225e, function: _, subvendor: _, subdevice: _ } ],
100     core_hint: 2,
101     core_offset: 10,
102     multi_instance: 1,
103     interrupt_load: 0.5,
104     platforms: ['x86_64']
105 }.
106
107
108 pci_driver{
109     binary: "ioat_dma",
110     supported_cards:
111     [ pci_card{ vendor: 16'8086, device: 16'0e20, function: _, subvendor: _, subdevice: _ },
112       pci_card{ vendor: 16'8086, device: 16'2f20, function: _, subvendor: _, subdevice: _ } ],
113     core_hint: 4,
114     core_offset: 20,
115     multi_instance: 1,
116     interrupt_load: 0.5,
117     platforms: ['x86_64']
118 }.
119
120 pci_driver{
121     binary: "ahcid",
122     supported_cards:
123     [ pci_card{ vendor: 16'8086, device: 16'2922, function: _, subvendor: _, subdevice: _ },
124       pci_card{ vendor: 16'8086, device: 16'3a22, function: _, subvendor: _, subdevice: _ },
125       pci_card{ vendor: 16'1002, device: 16'4390, function: _, subvendor: _, subdevice: _ } ],
126     core_hint: 0,
127     core_offset: 0,
128     multi_instance: 0,
129     interrupt_load: 0.5,
130     platforms: ['x86_64', 'x86_32']
131 }.
132
133 cpu_driver{
134     binary: "cpu",
135     platforms: ['x86_64', 'x86_32']
136 }.
137
138 bus_driver{
139     binary: "ioapic",
140     core_hint: 0,
141     platforms: ['x86_64', 'x86_32']
142 }.
143
144
145
146 %
147 % Driver selection logic
148 %
149
150 % Picks from a list of IntModels one that is feasible on this system
151 % Currently, return first entry
152 int_model_enum(none, 0).
153 int_model_enum(legacy, 1).
154 int_model_enum(msi, 2).
155 int_model_enum(msix, 3).
156
157 get_interrupt_model(IntModels, Model) :-
158     ((var(IntModels) -> ModelAtom = none);
159     IntModels = [ModelAtom | _]),
160     int_model_enum(ModelAtom, Model). 
161
162 find_pci_driver(PciInfo, DriverInfo) :-
163     PciInfo = pci_card{vendor:VId, device: DId, function: Fun, subvendor: SVId,
164                         subdevice: SDId},
165     pci_driver{binary: Binary, supported_cards: _, core_hint: Core,
166         core_offset: Offset, multi_instance: Multi,
167         interrupt_load: IRQLoad, platforms: Platforms, interrupt_model: IntModels},
168
169     % We find the highest priority matching driver.
170     % TODO: The binary name is used as an identifier. Thus, multiple entries with the same
171     % binary are not supported
172     findall((Prio,X), (pci_driver{ supported_cards: Cards, binary: X, priority: Prio },
173         member(PciInfo, Cards)), LiU),
174     sort(0,>,LiU, [(_,Binary)|_]),
175     get_interrupt_model(IntModels, IntModel),
176     DriverInfo = driver(Core, Multi, Offset, Binary, IntModel).
177
178 find_cpu_driver(ApicId, DriverInfo) :-
179     cpu_driver{binary: Binary, platforms: Platforms},
180     % TODO: In future use ApicId to select cpu driver that has listed the correct 
181     % platform
182     DriverInfo = driver(Binary).
183
184 find_ioapic_driver(IOApicId, DriverInfo) :-
185     bus_driver{binary: Binary, core_hint: Core, platforms: Platforms},
186     % TODO: Select appropriate Core based on core_hint, platform, ioapic id
187     DriverInfo = driver(Core, Binary).
188