e14b7a163eee0f8ea4cbe9959fde3107168de93d
[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: 0,
67     core_offset: 0,
68     multi_instance: 0,
69     interrupt_load: 0.5,
70     platforms: ['x86_64']
71 }.
72
73 pci_driver{
74     binary: "rtl8029",
75     supported_cards:
76     [ pci_card{ vendor: 16'10ec, device: 16'8029, function: _, subvendor: _, subdevice: _ } ],
77     core_hint: 0,
78     core_offset: 0,
79     multi_instance: 0,
80     interrupt_load: 0.5,
81     platforms: ['x86_64', 'x86_32']
82 }.
83
84 pci_driver{
85     binary: "xeon_phi",
86     supported_cards:
87     [ pci_card{ vendor: 16'8086, device: 16'225e, function: _, subvendor: _, subdevice: _ } ],
88     core_hint: 2,
89     core_offset: 10,
90     multi_instance: 1,
91     interrupt_load: 0.5,
92     platforms: ['x86_64']
93 }.
94
95
96 pci_driver{
97     binary: "ioat_dma",
98     supported_cards:
99     [ pci_card{ vendor: 16'8086, device: 16'0e20, function: _, subvendor: _, subdevice: _ },
100       pci_card{ vendor: 16'8086, device: 16'2f20, function: _, subvendor: _, subdevice: _ } ],
101     core_hint: 4,
102     core_offset: 20,
103     multi_instance: 1,
104     interrupt_load: 0.5,
105     platforms: ['x86_64']
106 }.
107
108 pci_driver{
109     binary: "ahcid",
110     supported_cards:
111     [ pci_card{ vendor: 16'8086, device: 16'2922, function: _, subvendor: _, subdevice: _ },
112       pci_card{ vendor: 16'8086, device: 16'3a22, function: _, subvendor: _, subdevice: _ },
113       pci_card{ vendor: 16'1002, device: 16'4390, function: _, subvendor: _, subdevice: _ } ],
114     core_hint: 0,
115     core_offset: 0,
116     multi_instance: 0,
117     interrupt_load: 0.5,
118     platforms: ['x86_64', 'x86_32']
119 }.
120
121 cpu_driver{
122     binary: "cpu",
123     platforms: ['x86_64', 'x86_32']
124 }.
125
126 bus_driver{
127     binary: "ioapic",
128     core_hint: 0,
129     platforms: ['x86_64', 'x86_32']
130 }.
131
132
133
134 %
135 % Driver selection logic
136 %
137
138 % Picks from a list of IntModels one that is feasible on this system
139 % Currently, return first entry
140 int_model_enum(none, 0).
141 int_model_enum(legacy, 1).
142 int_model_enum(msi, 2).
143 int_model_enum(msix, 3).
144
145 get_interrupt_model(IntModels, Model) :-
146     ((var(IntModels) -> ModelAtom = none);
147     IntModels = [ModelAtom | _]),
148     int_model_enum(ModelAtom, Model). 
149
150 find_pci_driver(PciInfo, DriverInfo) :-
151     PciInfo = pci_card{vendor:VId, device: DId, function: Fun, subvendor: SVId,
152                         subdevice: SDId},
153     pci_driver{binary: Binary, supported_cards: _, core_hint: Core,
154         core_offset: Offset, multi_instance: Multi,
155         interrupt_load: IRQLoad, platforms: Platforms, interrupt_model: IntModels},
156
157     % We find the highest priority matching driver.
158     % TODO: The binary name is used as an identifier. Thus, multiple entries with the same
159     % binary are not supported
160     findall((Prio,X), (pci_driver{ supported_cards: Cards, binary: X, priority: Prio },
161         member(PciInfo, Cards)), LiU),
162     sort(0,>,LiU, [(_,Binary)|_]),
163     get_interrupt_model(IntModels, IntModel),
164     DriverInfo = driver(Core, Multi, Offset, Binary, IntModel).
165
166 find_cpu_driver(ApicId, DriverInfo) :-
167     cpu_driver{binary: Binary, platforms: Platforms},
168     % TODO: In future use ApicId to select cpu driver that has listed the correct 
169     % platform
170     DriverInfo = driver(Binary).
171
172 find_ioapic_driver(IOApicId, DriverInfo) :-
173     bus_driver{binary: Binary, core_hint: Core, platforms: Platforms},
174     % TODO: Select appropriate Core based on core_hint, platform, ioapic id
175     DriverInfo = driver(Core, Binary).
176