7a129fae290695e57eb5b962a0b657d33ed73011
[barrelfish] / usr / pci / pci.c
1 /**
2  * \file
3  * \brief PCI driver
4  *
5  *  This file walks through the PCI bus, enumarates each device and gathers
6  *  informatiom about each device.
7  */
8
9 /*
10  * Copyright (c) 2007, 2008, 2009, 2010, 2011, ETH Zurich.
11  * All rights reserved.
12  *
13  * This file is distributed under the terms in the attached LICENSE file.
14  * If you do not find this file, copies can be found by writing to:
15  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
16  */
17
18 #include <stdio.h>
19 #include <stdlib.h>
20
21 #include <barrelfish/barrelfish.h>
22 #include <barrelfish/deferred.h>
23
24 #include <pci/devids.h>
25 #include <mm/mm.h>
26 #include <skb/skb.h>
27 #include <octopus/getset.h>
28 #include <acpi_client/acpi_client.h>
29 #include <dev/pci_sr_iov_cap_dev.h>
30
31 #include "pci.h"
32 #include "ht_config.h"
33 #include <dev/ht_config_dev.h>
34 #include "pci_debug.h"
35
36 #include <if/acpi_rpcclient_defs.h>
37
38 #define MIN(a,b)        ((a) < (b) ? (a) : (b))
39
40 #define BAR_PROBE       0xffffffff
41
42 #define PAGE_BITS BASE_PAGE_BITS
43
44 struct device_caps
45 {
46     struct capref *phys_cap;
47     struct capref *frame_cap;
48     size_t nr_caps;
49     uint8_t bar_nr;
50     uint8_t bits;
51     bool assigned;  //false => this entry is not in use
52     uint8_t type;
53 };
54
55 struct device_caps dev_caps[PCI_NBUSES][PCI_NDEVICES][PCI_NFUNCTIONS][PCI_NBARS];
56 const char *skb_bridge_program = "bridge_page";
57 uint16_t max_numvfs = 256;
58
59 static void
60 query_bars(pci_hdr0_t devhdr,
61            struct pci_address addr,
62            bool pci2pci_bridge);
63
64 static void
65 enable_busmaster(uint8_t bus,
66                  uint8_t dev,
67                  uint8_t fun,
68                  bool pcie);
69
70 static uint32_t bar_mapping_size(pci_hdr0_bar32_t bar)
71 {
72     if (bar.base == 0) {
73         return 0;
74     }
75
76     for (uint32_t mask = 1;; mask <<= 1) {
77         assert(mask != 0);
78         if (bar.base & mask) {
79             return mask << 7;
80         }
81     }
82 }
83
84 static pciaddr_t bar_mapping_size64(uint64_t base)
85 {
86     if (base == 0) {
87         return 0;
88     }
89
90     for (pciaddr_t mask = 1;; mask <<= 1) {
91         assert(mask != 0);
92         if (base & mask) {
93             /*
94              * Note: we get the actual raw register content here and not
95              *       the bar.base value so no shift.
96              *       - 2014-05-03, RA
97              */
98             return mask;
99         }
100     }
101 }
102
103 void pci_init_datastructures(void)
104 {
105     memset(dev_caps, 0, sizeof(dev_caps));
106 }
107
108 int pci_bar_to_caps_index(uint8_t bus,
109                           uint8_t dev,
110                           uint8_t fun,
111                           uint8_t BAR)
112 {
113     uint8_t i;
114     for (i = 0; i < PCI_NBARS && dev_caps[bus][dev][fun][i].assigned; i++) {
115         if (dev_caps[bus][dev][fun][i].bar_nr == BAR) {
116             return i;
117         }
118     }
119     return -1;
120 }
121
122 int pci_get_bar_nr_for_index(uint8_t bus,
123                             uint8_t dev,
124                             uint8_t fun,
125                             uint8_t idx)
126 {
127     return (dev_caps[bus][dev][fun][idx].bar_nr);
128 }
129
130 int pci_get_nr_caps_for_bar(uint8_t bus,
131                             uint8_t dev,
132                             uint8_t fun,
133                             uint8_t idx)
134 {
135     return (dev_caps[bus][dev][fun][idx].nr_caps);
136 }
137
138 struct capref pci_get_bar_cap_for_device(uint8_t bus,
139                                      uint8_t dev,
140                                      uint8_t fun,
141                                      uint8_t idx,
142                                      int cap_nr)
143 {
144     return (dev_caps[bus][dev][fun][idx].frame_cap[cap_nr]);
145 }
146 uint8_t pci_get_bar_cap_type_for_device(uint8_t bus,
147                                     uint8_t dev,
148                                     uint8_t fun,
149                                     uint8_t idx)
150 {
151     return (dev_caps[bus][dev][fun][idx].type);
152 }
153
154 static errval_t alloc_device_bar(uint8_t idx,
155                                  uint8_t bus,
156                                  uint8_t dev,
157                                  uint8_t fun,
158                                  uint8_t BAR,
159                                  pciaddr_t base,
160                                  pciaddr_t high,
161                                  pcisize_t size)
162 {
163     struct acpi_rpc_client* acl = get_acpi_rpc_client();
164
165     struct device_caps *c = &dev_caps[bus][dev][fun][idx];
166     errval_t err;
167     size = ROUND_UP(size, BASE_PAGE_SIZE); // Some BARs are less than 4 KiB
168
169     // first try with maximally-sized caps (we'll reduce this if it doesn't work)
170     uint8_t bits = log2ceil(size);
171
172     restart: ;
173     pcisize_t framesize = 1UL << bits;
174     c->nr_caps = size / framesize;
175     PCI_DEBUG("nr caps for one BAR of size %"PRIuPCISIZE": %lu\n", size,
176               c->nr_caps);
177
178     c->phys_cap = malloc(c->nr_caps * sizeof(struct capref));
179     if (c->phys_cap == NULL) {
180         return PCI_ERR_MEM_ALLOC;
181     }
182
183     for (int i = 0; i < c->nr_caps; i++) {
184         /*err = mm_alloc_range(&pci_mm_physaddr, bits, base + i * framesize,
185          base + (i + 1) * framesize, &c->phys_cap[i], NULL);*/
186         errval_t error_code;
187         err = acl->vtbl.mm_alloc_range_proxy(acl, bits, base + i * framesize,
188                                              base + (i + 1) * framesize,
189                                              &c->phys_cap[i], &error_code);
190         assert(err_is_ok(err));
191         err = error_code;
192         if (err_is_fail(err)) {
193             PCI_DEBUG("mm_alloc_range() failed: bits = %hhu, base = %"PRIxPCIADDR","
194                       " end = %"PRIxPCIADDR"\n", bits, base + i * framesize,
195                       base + (i + 1) * framesize);
196             if (err_no(err) == MM_ERR_MISSING_CAPS && bits > PAGE_BITS) {
197                 /* try again with smaller page-sized caps */
198                 for (int j = 0; j < i; j++) {
199                     err = acl->vtbl.mm_free_proxy(acl, c->phys_cap[i],
200                                                   base + j * framesize, bits,
201                                                   &error_code);
202                     assert(err_is_ok(err) && err_is_ok(error_code));
203                 }
204
205                 free(c->phys_cap);
206                 bits = PAGE_BITS;
207                 goto restart;
208             } else {
209                 return err;
210             }
211         }
212     }
213
214     c->frame_cap = malloc(c->nr_caps * sizeof(struct capref));
215     if (c->frame_cap == NULL) {
216         /* TODO: mm_free() */
217         free(c->phys_cap);
218         return PCI_ERR_MEM_ALLOC;
219     }
220
221     for (int i = 0; i < c->nr_caps; i++) {
222         err = devframe_type(&c->frame_cap[i], c->phys_cap[i], bits);
223         if (err_is_fail(err)) {
224             PCI_DEBUG("devframe_type() failed: bits = %hhu, base = %"PRIxPCIADDR
225                       ", doba = %"PRIxPCIADDR"\n", bits, base, base + (1UL << bits));
226             return err;
227         }
228     }
229
230     c->bits = bits;
231     c->bar_nr = BAR;
232     c->assigned = true;
233     c->type = 0;
234
235     return SYS_ERR_OK;
236 }
237
238 //XXX: FIXME: HACK: BAD!!! Only needed to allocate a full I/O range cap to
239 //                         the VESA graphics driver
240 static errval_t assign_complete_io_range(uint8_t idx,
241                                          uint8_t bus,
242                                          uint8_t dev,
243                                          uint8_t fun,
244                                          uint8_t BAR)
245 {
246     dev_caps[bus][dev][fun][idx].frame_cap = (struct capref*) malloc(
247                     sizeof(struct capref));
248     errval_t err = slot_alloc(&(dev_caps[bus][dev][fun][idx].frame_cap[0]));
249     assert(err_is_ok(err));
250     err = cap_copy(dev_caps[bus][dev][fun][idx].frame_cap[0], cap_io);
251     assert(err_is_ok(err));
252
253     dev_caps[bus][dev][fun][idx].bits = 16;
254     dev_caps[bus][dev][fun][idx].bar_nr = BAR;
255     dev_caps[bus][dev][fun][idx].assigned = true;
256     dev_caps[bus][dev][fun][idx].type = 1;
257     dev_caps[bus][dev][fun][idx].nr_caps = 1;
258     return SYS_ERR_OK;
259 }
260
261 errval_t device_init(uint32_t class_code,
262                      uint32_t sub_class,
263                      uint32_t prog_if,
264                      uint32_t vendor_id,
265                      uint32_t device_id,
266                      uint32_t *bus,
267                      uint32_t *dev,
268                      uint32_t *fun,
269                      bool *pcie,
270                      int *nr_allocated_bars)
271 {
272     *nr_allocated_bars = 0;
273
274     errval_t err;
275     char s_bus[10], s_dev[10], s_fun[10], s_vendor_id[10], s_device_id[10];
276     char s_class_code[10], s_sub_class[10], s_prog_if[10];
277     char s_pcie[5];
278     int error_code;
279     int bar_nr;
280     pciaddr_t bar_base, bar_high;
281     pcisize_t bar_size;
282
283     if (*bus != PCI_DONT_CARE) {
284         snprintf(s_bus, sizeof(s_bus), "%"PRIu32"", *bus);
285     } else {
286         strncpy(s_bus, "Bus", sizeof(s_bus));
287     }
288     if (*dev != PCI_DONT_CARE) {
289         snprintf(s_dev, sizeof(s_dev), "%"PRIu32, *dev);
290     } else {
291         strncpy(s_dev, "Dev", sizeof(s_dev));
292     }
293     if (*fun != PCI_DONT_CARE) {
294         snprintf(s_fun, sizeof(s_fun), "%"PRIu32, *fun);
295     } else {
296         strncpy(s_fun, "Fun", sizeof(s_fun));
297     }
298     if (vendor_id != PCI_DONT_CARE) {
299         snprintf(s_vendor_id, sizeof(s_vendor_id), "%"PRIu32, vendor_id);
300     } else {
301         strncpy(s_vendor_id, "Ven", sizeof(s_vendor_id));
302     }
303     if (device_id != PCI_DONT_CARE) {
304         snprintf(s_device_id, sizeof(s_device_id), "%"PRIu32, device_id);
305     } else {
306         strncpy(s_device_id, "DevID", sizeof(s_device_id));
307     }
308     if (class_code != PCI_DONT_CARE) {
309         snprintf(s_class_code, sizeof(s_class_code), "%"PRIu32, class_code);
310     } else {
311         strncpy(s_class_code, "Cl", sizeof(s_class_code));
312     }
313     if (sub_class != PCI_DONT_CARE) {
314         snprintf(s_sub_class, sizeof(s_sub_class), "%"PRIu32, sub_class);
315     } else {
316         strncpy(s_sub_class, "Sub", sizeof(s_sub_class));
317     }
318     if (prog_if != PCI_DONT_CARE) {
319         snprintf(s_prog_if, sizeof(s_prog_if), "%"PRIu32, prog_if);
320     } else {
321         strncpy(s_prog_if, "ProgIf", sizeof(s_prog_if));
322     }
323
324     PCI_DEBUG("device_init(): Searching device %s, %s, %s, %s, %s, %s, %s, %s\n",
325               s_bus, s_dev, s_fun, s_vendor_id, s_device_id, s_class_code,
326               s_sub_class, s_prog_if);
327
328 //find the device: Unify all values
329     error_code = skb_execute_query(
330                     "device(PCIE,addr(%s, %s, %s), %s, %s, %s, %s, %s, _),"
331                     "writeln(d(PCIE,%s,%s,%s,%s,%s,%s,%s,%s)).",
332                     s_bus, s_dev, s_fun, s_vendor_id, s_device_id, s_class_code,
333                     s_sub_class, s_prog_if, s_bus, s_dev, s_fun, s_vendor_id,
334                     s_device_id, s_class_code, s_sub_class, s_prog_if);
335     if (error_code != 0) {
336
337         PCI_DEBUG("pci.c: device_init(): SKB returnd error code %s\n",
338                   err_getcode(error_code));
339
340         PCI_DEBUG("SKB returned: %s\n", skb_get_output());
341         PCI_DEBUG("SKB error returned: %s\n", skb_get_error_output());
342
343         return PCI_ERR_DEVICE_INIT;
344     }
345
346     err = skb_read_output("d(%[a-z], %"PRIu32", %"PRIu32", %"PRIu32", %"PRIu32
347                           ",%"PRIu32", %"PRIu32", %"PRIu32", %"PRIu32").",
348                           s_pcie, bus, dev, fun, &vendor_id, &device_id,
349                           &class_code, &sub_class, &prog_if);
350
351     if (err_is_fail(err)) {
352         DEBUG_ERR(err, "skb read output\n");
353
354         PCI_DEBUG("device_init(): Could not read the SKB's output for the device\n");
355         PCI_DEBUG("device_init(): SKB returned: %s\n", skb_get_output());
356         PCI_DEBUG("device_init(): SKB error returned: %s\n",
357                   skb_get_error_output());
358         return err_push(err, PCI_ERR_DEVICE_INIT);
359     }
360     if (strncmp(s_pcie, "pcie", strlen("pcie")) == 0) {
361         *pcie = true;
362     } else {
363         *pcie = false;
364     }
365
366     PCI_DEBUG("device_init(): Found device at %u:%u:%u\n", *bus, *dev, *fun);
367     //get the implemented BARs for the found device
368     error_code = skb_execute_query("pci_get_implemented_BAR_addresses(%"PRIu32
369                                    ",%"PRIu32",%"PRIu32",%"PRIu32",%"PRIu32",%"
370                                    PRIu32",%"PRIu32",%"PRIu32",L),length(L,Len)"
371                                    ",writeln(L)", *bus, *dev, *fun, vendor_id,
372                                    device_id, class_code, sub_class, prog_if);
373
374     if (error_code != 0) {
375         PCI_DEBUG("pci.c: device_init(): SKB returnd error code %d\n",
376                   error_code);
377
378         PCI_DEBUG("SKB returned: %s\n", skb_get_output());
379         PCI_DEBUG("SKB error returned: %s\n", skb_get_error_output());
380
381         return PCI_ERR_DEVICE_INIT;
382     }
383
384     struct list_parser_status status;
385     skb_read_list_init(&status);
386
387     //iterate over all buselements
388     while (skb_read_list(&status, "baraddr(%d, %"PRIuPCIADDR", %"PRIuPCIADDR", "
389                          "%"PRIuPCISIZE")", &bar_nr, &bar_base, &bar_high, &bar_size)) {
390         err = alloc_device_bar(*nr_allocated_bars, *bus, *dev, *fun, bar_nr,
391                                bar_base, bar_high, bar_size);
392
393         PCI_DEBUG("device_init(): BAR %d: base = %"PRIxPCIADDR ", size = %"
394                   PRIxPCISIZE"\n", bar_nr, bar_base, bar_size);
395
396         if (err_is_fail(err)) {
397             PCI_DEBUG("device_init(): Could not allocate cap for BAR %d\n", bar_nr);
398             return err_push(err, PCI_ERR_DEVICE_INIT);
399         }
400         (*nr_allocated_bars)++;
401     }
402
403 //XXX: FIXME: HACK: BAD!!! Only needed to allocate a full I/O range cap to
404 //                         the VESA graphics driver
405     if (class_code == PCI_CLASS_DISPLAY) {
406         assert(*nr_allocated_bars < PCI_NBARS);
407         err = assign_complete_io_range(*nr_allocated_bars, *bus, *dev, *fun,
408                                        5 /*very BAAAD */);
409         (*nr_allocated_bars)++;
410     }
411 //end of badness
412
413     PCI_DEBUG("device_init(): Allocated caps for %d BARs\n", *nr_allocated_bars);
414
415     PCI_DEBUG("enable busmaster for device (%u, %u, %u)...\n", *bus, *dev, *fun);
416     enable_busmaster(*bus, *dev, *fun, *pcie);
417
418     return SYS_ERR_OK;
419 }
420
421 errval_t device_reregister_interrupt(uint8_t coreid, int vector,
422                  uint32_t class_code, uint32_t sub_class, uint32_t prog_if,
423                  uint32_t vendor_id, uint32_t device_id, uint32_t *bus,
424                  uint32_t *dev,uint32_t *fun)
425 {
426     errval_t err;
427     char s_bus[10], s_dev[10], s_fun[10], s_vendor_id[10], s_device_id[10];
428     char s_class_code[10], s_sub_class[10], s_prog_if[10];
429     char s_pcie[5];
430     bool pcie;
431     int error_code;
432
433     if (*bus != PCI_DONT_CARE) {
434         snprintf(s_bus, sizeof(s_bus), "%"PRIu32"", *bus);
435     } else {
436         strncpy(s_bus, "Bus", sizeof(s_bus));
437     }
438     if (*dev != PCI_DONT_CARE) {
439         snprintf(s_dev, sizeof(s_dev), "%"PRIu32, *dev);
440     } else {
441         strncpy(s_dev, "Dev", sizeof(s_dev));
442     }
443     if (*fun != PCI_DONT_CARE) {
444         snprintf(s_fun, sizeof(s_fun), "%"PRIu32, *fun);
445     } else {
446         strncpy(s_fun, "Fun", sizeof(s_fun));
447     }
448     if (vendor_id != PCI_DONT_CARE) {
449         snprintf(s_vendor_id, sizeof(s_vendor_id), "%"PRIu32, vendor_id);
450     } else {
451         strncpy(s_vendor_id, "Ven", sizeof(s_vendor_id));
452     }
453     if (device_id != PCI_DONT_CARE) {
454         snprintf(s_device_id, sizeof(s_device_id), "%"PRIu32, device_id);
455     } else {
456         strncpy(s_device_id, "DevID", sizeof(s_device_id));
457     }
458     if (class_code != PCI_DONT_CARE) {
459         snprintf(s_class_code, sizeof(s_class_code), "%"PRIu32, class_code);
460     } else {
461         strncpy(s_class_code, "Cl", sizeof(s_class_code));
462     }
463     if (sub_class != PCI_DONT_CARE) {
464         snprintf(s_sub_class, sizeof(s_sub_class), "%"PRIu32, sub_class);
465     } else {
466         strncpy(s_sub_class, "Sub", sizeof(s_sub_class));
467     }
468     if (prog_if != PCI_DONT_CARE) {
469         snprintf(s_prog_if, sizeof(s_prog_if), "%"PRIu32, prog_if);
470     } else {
471         strncpy(s_prog_if, "ProgIf", sizeof(s_prog_if));
472     }
473
474     PCI_DEBUG("device_init(): Searching device %s, %s, %s, %s, %s, %s, %s, %s\n",
475         s_bus, s_dev, s_fun, s_vendor_id, s_device_id, s_class_code,
476         s_sub_class, s_prog_if);
477
478 //find the device: Unify all values
479     error_code = skb_execute_query(
480         "device(PCIE,addr(%s, %s, %s), %s, %s, %s, %s, %s, _),"
481         "writeln(d(PCIE,%s,%s,%s,%s,%s,%s,%s,%s)).",
482         s_bus, s_dev, s_fun, s_vendor_id, s_device_id, s_class_code,
483         s_sub_class, s_prog_if,
484         s_bus, s_dev, s_fun, s_vendor_id, s_device_id, s_class_code,
485         s_sub_class, s_prog_if
486     );
487     if (error_code != 0) {
488
489         PCI_DEBUG("pci.c: device_init(): SKB returnd error code %s\n",
490             err_getcode(error_code));
491
492         PCI_DEBUG("SKB returned: %s\n", skb_get_output());
493         PCI_DEBUG("SKB error returned: %s\n", skb_get_error_output());
494
495         return PCI_ERR_DEVICE_INIT;
496     }
497
498     err = skb_read_output("d(%[a-z], %"PRIu32", %"PRIu32", %"PRIu32", %"PRIu32
499                           ",%"PRIu32", %"PRIu32", %"PRIu32", %"PRIu32").",
500                     s_pcie, bus, dev, fun, &vendor_id,
501                     &device_id, &class_code, &sub_class, &prog_if);
502
503     if (err_is_fail(err)) {
504         DEBUG_ERR(err, "skb read output\n");
505
506         PCI_DEBUG("device_init(): Could not read the SKB's output for the device\n");
507         PCI_DEBUG("device_init(): SKB returned: %s\n", skb_get_output());
508         PCI_DEBUG("device_init(): SKB error returned: %s\n", skb_get_error_output());
509         return err_push(err,PCI_ERR_DEVICE_INIT);
510     }
511     if(strncmp(s_pcie, "pcie", strlen("pcie")) == 0) {
512         pcie = true;
513     } else {
514         pcie = false;
515     }
516
517
518     PCI_DEBUG("device_init(): Found device at %u:%u:%u\n",
519                 *bus, *dev, *fun);
520 //get the implemented BARs for the found device
521
522     int irq = pci_setup_interrupt(*bus, *dev, *fun);
523     PCI_DEBUG("pci: init_device_handler_irq: init interrupt.\n");
524     PCI_DEBUG("pci: irq = %u, core = %hhu, vector = %u\n",
525             irq, coreid, vector);
526     struct acpi_rpc_client* cl = get_acpi_rpc_client();
527     errval_t ret_error;
528     err = cl->vtbl.enable_and_route_interrupt(cl, irq, coreid, vector, &ret_error);
529     assert(err_is_ok(err));
530     assert(err_is_ok(ret_error)); // FIXME
531     //        printf("IRQ for this device is %d\n", irq);
532     //DEBUG_ERR(err, "enable_and_route_interrupt");
533     pci_enable_interrupt_for_device(*bus, *dev, *fun, pcie);
534
535     return SYS_ERR_OK;
536 }
537
538 void pci_enable_interrupt_for_device(uint32_t bus, uint32_t dev, uint32_t fun,
539                                     bool pcie)
540 {
541     struct pci_address addr = { .bus = (uint8_t)(bus & 0xff),
542                                 .device = (uint8_t)(dev & 0xff),
543                                 .function = (uint8_t)(fun % 0xff) };
544
545     pci_hdr0_t hdr;
546     pci_hdr0_initialize(&hdr, addr);
547
548     if (pcie) {
549         pcie_enable();
550     } else {
551         pcie_disable();
552     }
553
554     pci_hdr0_command_t cmd = pci_hdr0_command_rd(&hdr);
555     cmd.int_dis = 0;
556     pci_hdr0_command_wr(&hdr, cmd);
557 }
558
559 /**
560  * This function performs a recursive, depth-first search through the
561  * PCI hierarchy starting at parentaddr (this should initially be a
562  * PCI root complex), with bus number A. It enters whatever it
563  * discovers (bridges and devices) into the SKB.
564  *
565  * Refer to http://www.tldp.org/LDP/tlk/dd/pci.html for an overview of
566  * a similar discovery algorithm.
567  *
568  * Upon discovery of a bridge, it sets the bridge's primary bus number
569  * to A and assigns a secondary bus number of A + 2. The subordinate
570  * bus number is set to A + 3. This way, buses are spaced 2 apart,
571  * which is sometimes required for SR-IOV hot-plugged buses.
572  */
573 static void assign_bus_numbers(struct pci_address parentaddr,
574                                uint8_t *busnum,
575                                uint8_t maxchild,
576                                char* handle)
577 {
578     struct pci_address addr = {
579         .bus = parentaddr.bus
580     };
581
582     pcie_enable();
583
584     // First go through all bridges on this bus and disable them
585     for (addr.device = 0; addr.device < PCI_NDEVICES; addr.device++) {
586         for (addr.function = 0; addr.function < PCI_NFUNCTIONS; addr.function++) {
587             pci_hdr1_t bhdr;
588             pci_hdr1_initialize(&bhdr, addr);
589
590             uint16_t vendor = pci_hdr1_vendor_id_rd(&bhdr);
591
592             if (vendor == 0xffff) {
593                 if (addr.function == 0) {
594                     // this device doesn't exist at all
595                     break;
596                 } else {
597                     // this function doesn't exist, but there may be others
598                     continue;
599                 }
600             }
601
602             pci_hdr1_hdr_type_t hdr_type = pci_hdr1_hdr_type_rd(&bhdr);
603             if (hdr_type.fmt == pci_hdr1_pci2pci) {
604                 PCI_DEBUG("Disabling bridge (%u,%u,%u)\n", addr.bus, addr.device,
605                           addr.function);
606
607                 pci_hdr1_bcfg_t bcfg = pci_hdr1_bcfg_rd(&bhdr);
608                 bcfg.pri_bus = 0;
609                 bcfg.sec_bus = 0;
610                 bcfg.sub_bus = 0;
611                 pci_hdr1_bcfg_wr(&bhdr, bcfg);
612             }
613         }
614     }
615
616     for (addr.device = 0; addr.device < PCI_NDEVICES; addr.device++) {
617         for (addr.function = 0; addr.function < PCI_NFUNCTIONS; addr.function++) {
618             pci_hdr0_t hdr;
619             pci_hdr0_initialize(&hdr, addr);
620
621             pcie_enable();
622             uint16_t pcie_vendor = pci_hdr0_vendor_id_rd(&hdr);
623             uint16_t vendor = pcie_vendor;
624             bool pcie = true;
625             bool extended_caps = false;  // Whether to scan for PCI Express extended caps
626
627             // Disable PCIe if device exists only in PCI
628             if (pcie_vendor != 0xffff) {
629                 vendor = pcie_vendor;
630                 pcie = true;
631             } else {
632                 pcie_disable();
633                 vendor = pci_hdr0_vendor_id_rd(&hdr);
634                 pcie = false;
635             }
636
637             if (vendor == 0xffff) {
638                 if (addr.function == 0) {
639                     // this device doesn't exist at all
640                     break;
641                 } else {
642                     // this function doesn't exist, but there may be others
643                     continue;
644                 }
645             }
646             pci_hdr0_class_code_t classcode = pci_hdr0_class_code_rd(&hdr);
647             uint16_t device_id = pci_hdr0_device_id_rd(&hdr);
648
649             /* Disable all decoders for this device,
650              * they will be re-enabled as devices are setup.
651              * NB: we are using "pci_hdr1" here, but the command field is
652              * common to all configuration header types.
653              */
654             /* PCI_DEBUG("disabling decoders for (%hhu,%hhu,%hhu)\n", */
655             /*     addr.bus, addr.device, addr.function); */
656             pci_hdr0_command_t cmd = pci_hdr0_command_rd(&hdr);
657
658             cmd.mem_space = 0;
659             cmd.io_space = 0;  // XXX: not handled in setup yet
660
661             // Ticket #210
662             //XXX: This should be set to 0 and only enabled if needed
663             //     (whenever a driver attaches to a device).
664             //     For bridges the pci driver enables the bit later when
665             //     programming the bridge window
666 //            cmd.master = 0;
667
668             // Ticket 229
669             //pci_hdr0_command_wr(&hdr, cmd);
670
671             // do we have a bridge?
672             pci_hdr0_hdr_type_t hdr_type = pci_hdr0_hdr_type_rd(&hdr);
673             if (hdr_type.fmt == pci_hdr0_pci2pci) {
674                 pci_hdr1_t bhdr;
675                 pci_hdr1_initialize(&bhdr, addr);
676
677                 //ACPI_HANDLE child;
678                 char* child = NULL;
679                 errval_t error_code;
680                 PCI_DEBUG("get irq table for (%hhu,%hhu,%hhu)\n", (*busnum) + 2,
681                           addr.device, addr.function);
682                 struct acpi_rpc_client* cl = get_acpi_rpc_client();
683                 // XXX: why do we have two different types for the same thing?
684                 acpi_pci_address_t xaddr = {
685                     .bus = addr.bus,
686                     .device = addr.device,
687                     .function = addr.function,
688                 };
689                 errval_t err = cl->vtbl.read_irq_table(cl, handle, xaddr, (*busnum) + 2,
690                                         &error_code, &child);
691                 if (err_is_ok(err) && error_code == ACPI_ERR_NO_CHILD_BRIDGE){
692                     PCI_DEBUG("No corresponding ACPI entry for bridge found\n");
693                 } else if (err_is_fail(err) || err_is_fail(error_code)) {
694                     DEBUG_ERR(error_code, "Reading IRQs failed");
695                 }
696
697                 // Increase by 2 to leave room for SR-IOV
698                 (*busnum) += 2;
699                 //assert(*busnum <= maxchild);
700
701                 PCI_DEBUG("program busses for bridge (%hhu,%hhu,%hhu)\n"
702                           "primary: %hhu, secondary: %hhu, subordinate: %hhu\n",
703                           addr.bus, addr.device, addr.function, addr.bus, *busnum,
704                           (*busnum) + 1);
705
706                 // Disable master abort mode on the bridge
707                 pci_hdr1_brdg_ctrl_mabort_wrf(&bhdr, 0);
708
709                 // Clear all errors
710                 pci_hdr1_status_wr_raw(&bhdr, 0);
711
712                 // program bus numbers for this bridge
713                 pci_hdr1_bcfg_t bcfg = pci_hdr1_bcfg_rd(&bhdr);
714                 bcfg.pri_bus = addr.bus;
715                 bcfg.sec_bus = *busnum;
716                 bcfg.sub_bus = 0xff;
717                 pci_hdr1_bcfg_wr(&bhdr, bcfg);
718
719                 skb_add_fact("bridge(%s,addr(%u,%u,%u),%u,%u,%u,%u,%u, secondary(%hhu)).",
720                              (pcie ? "pcie" : "pci"), addr.bus, addr.device,
721                              addr.function, vendor, device_id, classcode.clss,
722                              classcode.subclss, classcode.prog_if, *busnum);
723
724                 //use the original hdr (pci_hdr0_t) here
725                 query_bars(hdr, addr, true);
726
727                 // assign bus numbers to secondary bus
728                 struct pci_address bridge_addr = {
729                     .bus = *busnum,
730                     .device = addr.device,
731                     .function = addr.function
732                 };
733                 assign_bus_numbers(bridge_addr, busnum, maxchild, child);
734                 // Restore the old state of pcie. The above call changes this
735                 // state according to the devices under this bridge
736                 if (pcie) {
737                     pcie_enable();
738                 } else {
739                     pcie_disable();
740                 }
741
742                 // Set this bridge's subordinate to the maximum of the underlying hierarchy
743                 pci_hdr1_bcfg_sub_bus_wrf(&bhdr, (*busnum) + 1);
744             }
745
746             //is this a normal PCI device?
747             if (hdr_type.fmt == pci_hdr0_nonbridge) {
748                 PCI_DEBUG("Found device (%u, %u, %u), vendor = %x, device = %x\n",
749                           addr.bus, addr.device, addr.function, vendor,
750                           device_id);
751
752                 pci_hdr0_t devhdr;
753                 pci_hdr0_initialize(&devhdr, addr);
754                 skb_add_fact("device(%s,addr(%u,%u,%u),%u,%u,%u, %u, %u, %d).",
755                              (pcie ? "pcie" : "pci"), addr.bus, addr.device,
756                              addr.function, vendor, device_id, classcode.clss,
757                              classcode.subclss, classcode.prog_if,
758                              pci_hdr0_int_pin_rd(&devhdr) - 1);
759
760                 // octopus start
761                 char* record = NULL;
762                 static char* device_fmt = "hw.pci.device. { "
763                                 "bus: %u, device: %u, function: %u, "
764                                 "vendor: %u, device_id: %u, class: %u, "
765                                 "subclass: %u, prog_if: %u }";
766
767                 errval_t err = oct_mset(SET_SEQUENTIAL, device_fmt, addr.bus,
768                                         addr.device, addr.function, vendor,
769                                         device_id, classcode.clss,
770                                         classcode.subclss, classcode.prog_if);
771
772                 assert(err_is_ok(err));
773                 free(record);
774                 // end octopus
775
776                 query_bars(devhdr, addr, false);
777
778                 // Process device capabilities if existing
779                 if (pci_hdr0_status_rd(&devhdr).caplist) {
780                     uint8_t cap_ptr = pci_hdr0_cap_ptr_rd(&devhdr);
781
782                     // Walk capabilities list
783                     while (cap_ptr != 0) {
784                         assert(cap_ptr % 4 == 0 && cap_ptr >= 0x40);
785                         uint32_t capword = pci_read_conf_header(&addr,
786                                                                 cap_ptr / 4);
787
788                         switch (capword & 0xff) {
789                             case 0x10:  // PCI Express
790                                 PCI_DEBUG("PCI Express device\n");
791                                 extended_caps = true;
792                                 break;
793
794                             default:
795                                 PCI_DEBUG("Unknown PCI device capability 0x%x at 0x%x\n",
796                                           capword & 0xff, cap_ptr);
797                                 break;
798                         }
799
800                         cap_ptr = (capword >> 8) & 0xff;
801                     }
802                 }
803
804                 // Process extended device capabilities if existing
805                 if (pcie && extended_caps && addr.bus < pcie_get_endbus()) {
806                     uint32_t *ad = (uint32_t *) pcie_confspace_access(addr);
807                     assert(ad != NULL);
808                     uint16_t cap_ptr = 0x100;
809
810                     while (cap_ptr != 0) {
811                         uint32_t capword = *(ad + (cap_ptr / 4));
812                         assert(cap_ptr % 4 == 0 && cap_ptr >= 0x100
813                                && cap_ptr < 0x1000);
814
815                         switch (capword & 0xffff) {  // Switch on capability ID
816                             case 0:
817                                 // No extended caps
818                                 break;
819
820                             case 16:
821                                 // SR-IOV capability
822                                 {
823                                 /*
824                                  * XXX: When using our e1000 driver with the
825                                  *      I350 network card (device id 0x152x),
826                                  *      the configuration fails when VF are
827                                  *      enabled: Legacy descriptors are ignored
828                                  *      when VF are enabled.
829                                  */
830                                 if (vendor == 0x8086 && (device_id & 0xFFF0) == 0x1520) {
831                                     debug_printf("skipping SR IOV initialization"
832                                                     "for e1000 card.\n");
833                                     break;
834                                 }
835                                 pci_sr_iov_cap_t sr_iov_cap;
836                                 pci_sr_iov_cap_initialize(&sr_iov_cap,
837                                      (mackerel_addr_t) (ad + (cap_ptr / 4)));
838
839                                 PCI_DEBUG("Found SR-IOV capability\n");
840
841                                 // Support version 1 for the moment
842                                 assert(pci_sr_iov_cap_hdr_ver_rdf(&sr_iov_cap) == 1);
843
844                                 // Support system page size of 4K at the moment
845                                 assert(pci_sr_iov_cap_sys_psize_rd(&sr_iov_cap)
846                                        == 1);
847
848 #if 0   // Dump cap contents
849                                 pci_sr_iov_cap_caps_pr(str, 256, &sr_iov_cap);
850                                 PCI_DEBUG("%s\n", str);
851                                 pci_sr_iov_cap_ctrl_pr(str, 256, &sr_iov_cap);
852                                 PCI_DEBUG("%s\n", str);
853                                 pci_sr_iov_cap_status_pr(str, 256, &sr_iov_cap);
854                                 PCI_DEBUG("%s\n", str);
855                                 pci_sr_iov_cap_initialvfs_pr(str, 256, &sr_iov_cap);
856                                 PCI_DEBUG("%s\n", str);
857                                 pci_sr_iov_cap_totalvfs_pr(str, 256, &sr_iov_cap);
858                                 PCI_DEBUG("%s\n", str);
859                                 pci_sr_iov_cap_numvfs_pr(str, 256, &sr_iov_cap);
860                                 PCI_DEBUG("%s\n", str);
861                                 pci_sr_iov_cap_fdl_pr(str, 256, &sr_iov_cap);
862                                 PCI_DEBUG("%s\n", str);
863                                 pci_sr_iov_cap_offset_pr(str, 256, &sr_iov_cap);
864                                 PCI_DEBUG("%s\n", str);
865                                 pci_sr_iov_cap_stride_pr(str, 256, &sr_iov_cap);
866                                 PCI_DEBUG("%s\n", str);
867                                 pci_sr_iov_cap_devid_pr(str, 256, &sr_iov_cap);
868                                 PCI_DEBUG("%s\n", str);
869                                 pci_sr_iov_cap_sup_psize_pr(str, 256, &sr_iov_cap);
870                                 PCI_DEBUG("%s\n", str);
871                                 pci_sr_iov_cap_sys_psize_pr(str, 256, &sr_iov_cap);
872                                 PCI_DEBUG("%s\n", str);
873 #endif
874
875                                 if (max_numvfs > 0) {
876                                     // Set maximum number of VFs
877                                     uint16_t totalvfs = pci_sr_iov_cap_totalvfs_rd( &sr_iov_cap);
878                                     uint16_t numvfs = MIN(totalvfs, max_numvfs);
879                                     //                  uint16_t numvfs = 8;
880                                     PCI_DEBUG("Maximum supported VFs: %u. Enabling: %u\n",
881                                               totalvfs, numvfs);
882                                     pci_sr_iov_cap_numvfs_wr(&sr_iov_cap, numvfs);
883
884                                     uint16_t offset = pci_sr_iov_cap_offset_rd(&sr_iov_cap);
885                                     uint16_t stride = pci_sr_iov_cap_stride_rd(&sr_iov_cap);
886                                     uint16_t vf_devid = pci_sr_iov_cap_devid_rd(&sr_iov_cap);
887
888                                     PCI_DEBUG("VF offset is 0x%x, stride is 0x%x, "
889                                               "device ID is 0x%x\n",
890                                               offset, stride, vf_devid);
891
892 #if 0
893                                     // Make sure we enable the PF
894                                     cmd = pci_hdr0_command_rd(&hdr);
895                                     cmd.mem_space = 1;
896                                     cmd.io_space = 1;
897                                     /* cmd.master = 1; */
898                                     pci_hdr0_command_wr(&hdr, cmd);
899 #endif
900
901                                     // Start VFs (including memory spaces)
902                                     pci_sr_iov_cap_ctrl_vf_mse_wrf(&sr_iov_cap, 1);
903                                     pci_sr_iov_cap_ctrl_vf_enable_wrf(&sr_iov_cap, 1);
904
905                                     // Spec says to wait here for at least 100ms
906                                     err = barrelfish_usleep(100000);
907                                     assert(err_is_ok(err));
908
909                                     // Add all VFs
910                                     for (int vfn = 0; vfn < numvfs; vfn++) {
911                                         uint8_t busnr = addr.bus + ((((addr.device << 3)
912                                                                  + addr.function)
913                                                                  + offset
914                                                                  + stride * vfn)
915                                                                  >> 8);
916                                         uint8_t devfn = (((addr.device << 3)
917                                                         + addr.function)
918                                                         + offset
919                                                         + stride * vfn)
920                                                         & 0xff;
921                                         struct pci_address vf_addr = {
922                                             .bus = busnr,
923                                             .device = devfn >> 3,
924                                             .function = devfn & 7,
925                                         };
926
927                                         PCI_DEBUG("Adding VF (%u, %u, %u)\n",
928                                                   vf_addr.bus, vf_addr.device,
929                                                   vf_addr.function);
930
931                                         skb_add_fact("device(%s,addr(%u,%u,%u),%u,%u,%u, %u, %u, %d).",
932                                                      (pcie ? "pcie" : "pci"),
933                                                      vf_addr.bus,
934                                                      vf_addr.device,
935                                                      vf_addr.function, vendor,
936                                                      vf_devid, classcode.clss,
937                                                      classcode.subclss,
938                                                      classcode.prog_if, 0);
939
940                                         // octopus start
941                                         device_fmt ="hw.pci.device. { "
942                                                      "bus: %u, device: %u, function: %u, "
943                                                      "vendor: %u, device_id: %u, class: %u, "
944                                                      "subclass: %u, prog_if: %u }";
945                                         err = oct_mset(SET_SEQUENTIAL,
946                                                        device_fmt,
947                                                        vf_addr.bus,
948                                                        vf_addr.device,
949                                                        vf_addr.function,
950                                                        vendor, vf_devid,
951                                                        classcode.clss,
952                                                        classcode.subclss,
953                                                        classcode.prog_if);
954
955                                         assert(err_is_ok(err));
956                                         // end octopus
957
958                                         // We probe the BARs several times. Strictly
959                                         // speaking, this is not necessary, as we
960                                         // can calculate all offsets, but we're
961                                         // lazy...
962                                         pci_hdr0_bar32_t bar, barorigaddr;
963                                         for (int i = 0; i < pci_sr_iov_cap_vf_bar_length; i++) {
964                                             union pci_hdr0_bar32_un orig_value;
965                                             orig_value.raw = pci_sr_iov_cap_vf_bar_rd(&sr_iov_cap, i);
966                                             barorigaddr = orig_value.val;
967
968                                             // probe BAR to see if it is implemented
969                                             pci_sr_iov_cap_vf_bar_wr(&sr_iov_cap, i, BAR_PROBE);
970
971                                             union pci_hdr0_bar32_un bar_value;
972                                             bar_value.raw = pci_sr_iov_cap_vf_bar_rd(&sr_iov_cap, i);
973                                             bar = (union pci_hdr0_bar32_un ) {
974                                                         .raw =bar_value.raw
975                                                    }.val;
976
977                                             //write original value back to the BAR
978                                             pci_sr_iov_cap_vf_bar_wr(&sr_iov_cap,
979                                                                  i, orig_value.raw);
980
981                                             /*
982                                              * We need to check the entire register
983                                              * here to make sure the bar is not
984                                              * implemented as it could lie in the
985                                              * high 64 bit range...
986                                              */
987                                             if (bar_value.raw == 0) {
988                                                 // BAR not implemented
989                                                 continue;
990                                             }
991
992                                             // SR-IOV doesn't support IO space BARs
993                                             assert(bar.space == 0);
994                                             int type = -1;
995                                             if (bar.tpe == pci_hdr0_bar_32bit) {
996                                                 type = 32;
997                                             }
998                                             if (bar.tpe == pci_hdr0_bar_64bit) {
999                                                 type = 64;
1000                                             }
1001
1002                                             if (bar.tpe == pci_hdr0_bar_64bit) {
1003                                                 //read the upper 32bits of the address
1004                                                 pci_hdr0_bar32_t bar_high, barorigaddr_high;
1005                                                 union pci_hdr0_bar32_un orig_value_high;
1006                                                 orig_value_high.raw = pci_sr_iov_cap_vf_bar_rd(&sr_iov_cap, i + 1);
1007                                                 barorigaddr_high = orig_value_high.val;
1008
1009                                                 // probe BAR to determine the mapping size
1010                                                 pci_sr_iov_cap_vf_bar_wr(&sr_iov_cap, i + 1, BAR_PROBE);
1011
1012                                                 bar_high = (union pci_hdr0_bar32_un ) {
1013                                                               .raw =pci_sr_iov_cap_vf_bar_rd(&sr_iov_cap,i + 1)
1014                                                             }.val;
1015
1016                                                 //write original value back to the BAR
1017                                                 pci_sr_iov_cap_vf_bar_wr(&sr_iov_cap,
1018                                                           i + 1, orig_value_high.raw);
1019
1020                                                 pciaddr_t base64 = bar_high.base;
1021                                                 base64 <<= 32;
1022                                                 base64 |= bar.base << 7;
1023
1024                                                 pciaddr_t origbase64 = barorigaddr_high.base;
1025                                                 origbase64 <<= 32;
1026                                                 origbase64 |= barorigaddr.base << 7;
1027
1028                                                 PCI_DEBUG("(%u,%u,%u): 64bit BAR %d at 0x%"
1029                                                           PRIxPCIADDR ", size %" PRIx64 ", %s\n",
1030                                                           vf_addr.bus, vf_addr.device,
1031                                                           vf_addr.function, i,
1032                                                           (origbase64 << 7) + bar_mapping_size64(base64) * vfn,
1033                                                           bar_mapping_size64(base64),
1034                                                           (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"));
1035
1036                                                 skb_add_fact("bar(addr(%u, %u, %u), %d, 16'%"
1037                                                              PRIxPCIADDR", ""16'%" PRIx64 ", vf, %s, %d).",
1038                                                              vf_addr.bus, vf_addr.device, vf_addr.function, i,
1039                                                              (origbase64 << 7) + bar_mapping_size64(base64) * vfn,
1040                                                              bar_mapping_size64(base64),
1041                                                              (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"),
1042                                                              type);
1043
1044                                                 i++;  //step one forward, because it is a 64bit BAR
1045                                             } else {
1046                                                 PCI_DEBUG("(%u,%u,%u): 32bit BAR %d at 0x%" PRIx32 ", size %x, %s\n",
1047                                                           vf_addr.bus, vf_addr.device, vf_addr.function, i,
1048                                                           (barorigaddr.base << 7) + bar_mapping_size(bar) * vfn,
1049                                                           bar_mapping_size(bar),
1050                                                           (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"));
1051
1052                                                 //32bit BAR
1053                                                 skb_add_fact("bar(addr(%u, %u, %u), %d, 16'%"PRIx32", 16'%"
1054                                                              PRIx32 ", vf, %s, %d).", vf_addr.bus,
1055                                                              vf_addr.device, vf_addr.function, i,
1056                                                              (uint32_t) ((barorigaddr.base << 7)
1057                                                                          + bar_mapping_size( bar) * vfn),
1058                                                              (uint32_t) bar_mapping_size(bar),
1059                                                              (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"),
1060                                                              type);
1061                                             }
1062                                         }
1063                                     }
1064                                 }
1065                             }
1066                                 break;
1067
1068                             default:
1069                                 PCI_DEBUG("Unknown extended PCI device capability 0x%x at 0x%x\n",
1070                                           capword & 0xffff, cap_ptr);
1071                                 break;
1072                         }
1073
1074                         cap_ptr = capword >> 20;
1075                     }
1076                 }
1077             }
1078
1079             if(hdr_type.fmt == pci_hdr0_cardbus) {
1080                 printf("PCI: WARNING: Found cardbus bridge.\n");
1081             }
1082             // is this a multi-function device?
1083             if (addr.function == 0 && !hdr_type.multi) {
1084                 break;
1085             }
1086         }
1087     }
1088
1089     free(handle);
1090 }
1091
1092 #if 0
1093 static void get_bridges(struct pci_address myad)
1094 {
1095     struct pci_address addr = {.bus = myad.bus};
1096
1097     pcie_enable();
1098
1099     // First go through all bridges on this bus and disable them
1100     for (addr.device = 0; addr.device < PCI_NDEVICES; addr.device++) {
1101         for (addr.function = 0; addr.function < PCI_NFUNCTIONS; addr.function++) {
1102             pci_hdr1_t bhdr;
1103             pci_hdr1_initialize(&bhdr, addr);
1104
1105             uint16_t vendor = pci_hdr1_vendor_id_rd(&bhdr);
1106
1107             if (vendor == 0xffff) {
1108                 if (addr.function == 0) {
1109                     // this device doesn't exist at all
1110                     break;
1111                 } else {
1112                     // this function doesn't exist, but there may be others
1113                     continue;
1114                 }
1115             }
1116
1117             pci_hdr1_hdr_type_t hdr_type = pci_hdr1_hdr_type_rd(&bhdr);
1118             if (hdr_type.fmt == pci_hdr1_pci2pci) {
1119                 pci_hdr1_bcfg_t bcfg = pci_hdr1_bcfg_rd(&bhdr);
1120
1121                 PCI_DEBUG("Found bridge (%u,%u,%u), primary %u, secondary %u, subordinate %u\n",
1122                                 addr.bus, addr.device, addr.function,
1123                                 bcfg.pri_bus, bcfg.sec_bus, bcfg.sub_bus);
1124
1125                 struct pci_address bridge_addr= {
1126                     .bus = bcfg.sec_bus, .device = addr.device,
1127                     .function = addr.function
1128                 };
1129
1130                 get_bridges(bridge_addr);
1131             }
1132         }
1133     }
1134 }
1135 #endif
1136
1137 void pci_add_root(struct pci_address addr,
1138                   uint8_t maxchild,
1139                   char* handle)
1140 {
1141     uint8_t busnum = addr.bus;
1142     /* get_bridges(addr); */
1143     assign_bus_numbers(addr, &busnum, maxchild, handle);
1144     /* get_bridges(addr); */
1145 }
1146
1147 errval_t pci_setup_root_complex(void)
1148 {
1149     errval_t err;
1150     char* record = NULL;
1151     char** names = NULL;
1152     size_t len = 0;
1153
1154     // TODO: react to new rootbridges
1155     err = oct_get_names(&names, &len, "r'hw.pci.rootbridge.[0-9]+' "
1156                         "{ acpi_node: _, bus: _, device: _, function: _, maxbus: _ }");
1157     if (err_is_fail(err)) {
1158         DEBUG_ERR(err, "get names");
1159         goto out;
1160     }
1161
1162     for (size_t i = 0; i < len; i++) {
1163         err = oct_get(&record, names[i]);
1164         if (err_is_fail(err)) {
1165             goto out;
1166         }
1167
1168         PCI_DEBUG("found new root complex: %s\n", record);
1169
1170         char* acpi_node = NULL;  // freed in pci_add_root
1171         int64_t bus, device, function, maxbus;
1172         static char* format =
1173                         "_ { acpi_node: %s, bus: %d, device: %d, function: %d, maxbus: %d }";
1174         err = oct_read(record, format, &acpi_node, &bus, &device, &function,
1175                        &maxbus);
1176         if (err_is_fail(err)) {
1177             free(acpi_node);
1178             free(record);
1179             goto out;
1180         }
1181
1182         struct pci_address addr;
1183         addr.bus = (uint8_t) bus;
1184         addr.device = (uint8_t) device;
1185         addr.function = (uint8_t) function;
1186
1187         pcie_enable();
1188         pci_add_root(addr, maxbus, acpi_node);
1189         pcie_disable();
1190
1191         free(record);
1192     }
1193
1194     out: oct_free_names(names, len);
1195     return err;
1196 }
1197
1198 //query all BARs. That means, get the original address, the mapping size
1199 //and all attributes.
1200
1201 // XXX: asq: We are using this function to program also the _two_ BARs
1202 //           of a PCI-to-PCI bridge. They are at the same offset within the
1203 //           PCI header like for any PCI device. PCI HDR0 is misused
1204 //           here for the bridges.
1205
1206 static void query_bars(pci_hdr0_t devhdr,
1207                        struct pci_address addr,
1208                        bool pci2pci_bridge)
1209 {
1210     pci_hdr0_bar32_t bar, barorigaddr;
1211
1212     int maxbars = pci2pci_bridge ? 1 : pci_hdr0_bars_length;
1213     for (int i = 0; i <= maxbars; i++) {
1214         union pci_hdr0_bar32_un orig_value;
1215         orig_value.raw = pci_hdr0_bars_rd(&devhdr, i);
1216         barorigaddr = orig_value.val;
1217
1218         // probe BAR to determine the mapping size
1219         pci_hdr0_bars_wr(&devhdr, i, BAR_PROBE);
1220
1221         uint32_t bar_value = pci_hdr0_bars_rd(&devhdr, i);
1222
1223         bar = (union pci_hdr0_bar32_un ) { .raw = bar_value }.val;
1224
1225         //write original value back to the BAR
1226         pci_hdr0_bars_wr(&devhdr, i, orig_value.raw);
1227
1228         /*
1229          * Cannot just compare the base value, with addresses over 4G there
1230          * will be a problem. Thus we need to check if the entire register is
1231          * zero. If it is a 32bit register, then the address part will be filled.
1232          * If it is a 64bit register, the type will contain a nonzero value.
1233          * - 2014-05-02, RA
1234          */
1235         if (bar_value == 0) {
1236             // BAR not implemented
1237             continue;
1238         }
1239
1240         if (bar.space == 0) {  // memory mapped
1241             //bar(addr(bus, device, function), barnr, orig address, size, space,
1242             //         prefetchable?, 64bit?).
1243             //where space = mem | io, prefetchable= prefetchable | nonprefetchable,
1244             //64bit = 64bit | 32bit.
1245
1246             int type = -1;
1247             if (bar.tpe == pci_hdr0_bar_32bit) {
1248                 type = 32;
1249             }
1250             if (bar.tpe == pci_hdr0_bar_64bit) {
1251                 type = 64;
1252             }
1253
1254             if (bar.tpe == pci_hdr0_bar_64bit) {
1255                 //we must take the next BAR into account and do the same
1256                 //tests like in the 32bit case, but this time with the combined
1257                 //value from the current and the next BAR, since a 64bit BAR
1258                 //is constructed out of two consequtive 32bit BARs
1259
1260                 //read the upper 32bits of the address
1261                 uint32_t orig_value_high = pci_hdr0_bars_rd(&devhdr, i + 1);
1262
1263                 // probe BAR to determine the mapping size
1264                 pci_hdr0_bars_wr(&devhdr, i + 1, BAR_PROBE);
1265
1266                 // read the size information of the bar
1267                 uint32_t bar_value_high = pci_hdr0_bars_rd(&devhdr, i + 1);
1268
1269                 //write original value back to the BAR
1270                 pci_hdr0_bars_wr(&devhdr, i + 1, orig_value_high);
1271
1272                 pciaddr_t base64 = 0, origbase64 = 0;
1273                 base64 = bar_value_high;
1274                 base64 <<= 32;
1275                 base64 |= (uint32_t) (bar.base << 7);
1276
1277                 origbase64 = orig_value_high;
1278                 origbase64 <<= 32;
1279                 origbase64 |= (uint32_t) (barorigaddr.base << 7);
1280
1281                 PCI_DEBUG("(%u,%u,%u): 64bit BAR %d at 0x%" PRIxPCIADDR ", size %"
1282                           PRIx64 ", %s\n", addr.bus, addr.device, addr.function,
1283                           i, origbase64, bar_mapping_size64(base64),
1284                           (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"));
1285
1286               PCI_DEBUG("(%u,%u,%u): 64bit BAR %d at 0x%" PRIxPCIADDR ", size %" PRIx64 ", %s\n",
1287                         addr.bus, addr.device, addr.function,
1288                         i, origbase64 << 7, bar_mapping_size64(base64),
1289                         (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"));
1290
1291                 skb_add_fact("bar(addr(%u, %u, %u), %d, 16'%"PRIxPCIADDR", "
1292                              "16'%" PRIx64 ", mem, %s, %d).", addr.bus,
1293                              addr.device, addr.function, i, origbase64,
1294                              bar_mapping_size64(base64),
1295                              (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"),
1296                              type);
1297
1298                 i++;  //step one forward, because it is a 64bit BAR
1299             } else {
1300               PCI_DEBUG("(%u,%u,%u): 32bit BAR %d at 0x%" PRIx32 ", size %x, %s\n",
1301                         addr.bus, addr.device, addr.function,
1302                         i, barorigaddr.base << 7, bar_mapping_size(bar),
1303                         (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"));
1304
1305                 //32bit BAR
1306                 skb_add_fact("bar(addr(%u, %u, %u), %d, 16'%"PRIx32", 16'%" PRIx32
1307                              ", mem, %s, %d).", addr.bus, addr.device, addr.function,
1308                              i, (uint32_t) (barorigaddr.base << 7),
1309                              (uint32_t) bar_mapping_size(bar),
1310                              (bar.prefetch == 1 ? "prefetchable" : "nonprefetchable"),
1311                              type);
1312             }
1313         } else {
1314           PCI_DEBUG("(%u,%u,%u): IO BAR %d at 0x%x, size %x\n",
1315                     addr.bus, addr.device, addr.function,
1316                     i, barorigaddr.base << 7, bar_mapping_size(bar));
1317             //bar(addr(bus, device, function), barnr, orig address, size, space).
1318             //where space = mem | io
1319             skb_add_fact("bar(addr(%u, %u, %u), %d, 16'%"PRIx32", 16'%" PRIx32 ", io, "
1320                          "nonprefetchable, 32).", addr.bus, addr.device, addr.function, i,
1321                          (uint32_t) (barorigaddr.base << 7), (uint32_t) bar_mapping_size(bar));
1322         }
1323     }
1324 }
1325
1326 static void program_bridge_window(uint8_t bus,
1327                                   uint8_t dev,
1328                                   uint8_t fun,
1329                                   pciaddr_t base,
1330                                   pciaddr_t high,
1331                                   bool pcie,
1332                                   bool mem,
1333                                   bool pref)
1334 {
1335     struct pci_address addr;
1336     pci_hdr1_prefbl_t pref_reg;
1337     pci_hdr1_command_t cmd;
1338
1339     if (pcie) {
1340         pcie_enable();
1341     } else {
1342         pcie_disable();
1343     }
1344
1345     assert((base & 0x000fffff) == 0);
1346     assert((high & 0x000fffff) == 0x000fffff);
1347
1348     addr.bus = bus;
1349     addr.device = dev;
1350     addr.function = fun;
1351
1352     pci_hdr1_t bridgehdr;
1353     pci_hdr1_initialize(&bridgehdr, addr);
1354
1355     cmd = pci_hdr1_command_rd(&bridgehdr);
1356
1357     if (mem) {
1358         if (pref) {
1359             pci_hdr1_pref_base_upper_wr(&bridgehdr, base >> 32);
1360             pci_hdr1_pref_limit_upper_wr(&bridgehdr, high >> 32);
1361             /*
1362              * The least significant nibble of this register value (1h)
1363              * indicates that a 64 bit address decoder is supported and
1364              * that the Upper Base/Limit Registers are also used.
1365              */
1366             if ((base >> 32)) {
1367                 pref_reg.tpe = pci_hdr1_mem_64bit;
1368             } else {
1369                 pref_reg.tpe = pci_hdr1_mem_32bit;
1370             }
1371             pref_reg.val = base >> 20;
1372             pci_hdr1_pref_base_wr(&bridgehdr, pref_reg);
1373             if ((high >> 32)) {
1374                 pref_reg.tpe = pci_hdr1_mem_64bit;
1375             } else {
1376                 pref_reg.tpe = pci_hdr1_mem_32bit;
1377             }
1378             pref_reg.val = high >> 20;
1379             pci_hdr1_pref_limit_wr(&bridgehdr, pref_reg);
1380         } else {
1381             assert((base & 0xffffffff00000000) == 0);
1382             assert((high & 0xffffffff00000000) == 0);
1383             pci_hdr1_membl_t membl = {
1384                 .base = base >> 16,
1385                 .limit = high >> 16,
1386             };
1387             pci_hdr1_membl_wr(&bridgehdr, membl);
1388             /* pci_hdr1_mem_base_wr(&bridgehdr, base >> 16); */
1389             /* pci_hdr1_mem_limit_wr(&bridgehdr, high >> 16); */
1390         }
1391         // enable the memory decoder
1392         cmd.mem_space = 1;
1393     } else {
1394         // I/O
1395     }
1396
1397     cmd.int_dis = 0;
1398     cmd.master = 1;
1399     pci_hdr1_command_wr(&bridgehdr, cmd);
1400 }
1401
1402 static void program_device_bar(uint8_t bus,
1403                                uint8_t dev,
1404                                uint8_t fun,
1405                                int bar,
1406                                pciaddr_t base,
1407                                pcisize_t size,
1408                                int bits,
1409                                bool memspace,
1410                                bool pcie)
1411 {
1412     struct pci_address addr;
1413     addr.bus = bus;
1414     addr.device = dev;
1415     addr.function = fun;
1416
1417     if (pcie) {
1418         pcie_enable();
1419     } else {
1420         pcie_disable();
1421     }
1422
1423     pci_hdr0_t devhdr;
1424     pci_hdr0_initialize(&devhdr, addr);
1425
1426     //disable the address decoder for programming the BARs
1427     pci_hdr0_command_t cmd = pci_hdr0_command_rd(&devhdr);
1428     if (memspace) {
1429         cmd.mem_space = 0;
1430     } else {
1431         cmd.io_space = 0;
1432     }
1433     //disbale interrupts here. enable them as soon as a driver requests
1434     //interrupts
1435     cmd.int_dis = 1;
1436     pci_hdr0_command_wr(&devhdr, cmd);
1437
1438     if (bits == 64) {
1439         pci_hdr0_bars_wr(&devhdr, bar, base & 0xffffffff);
1440         pci_hdr0_bars_wr(&devhdr, bar + 1, base >> 32);
1441     } else {  // 32-bit
1442         assert(base + size <= 0xffffffff);  // 32-bit BAR
1443         pci_hdr0_bars_wr(&devhdr, bar, base);
1444     }
1445
1446     //re-enable the decoder for the BARs
1447     if (memspace) {
1448         cmd.mem_space = 1;
1449     } else {
1450         cmd.io_space = 1;
1451     }
1452     pci_hdr0_command_wr(&devhdr, cmd);
1453 }
1454
1455 static void enable_busmaster(uint8_t bus,
1456                              uint8_t dev,
1457                              uint8_t fun,
1458                              bool pcie)
1459 {
1460     struct pci_address addr;
1461     addr.bus = bus;
1462     addr.device = dev;
1463     addr.function = fun;
1464
1465     if (pcie) {
1466         pcie_enable();
1467     } else {
1468         pcie_disable();
1469     }
1470
1471     pci_hdr0_t devhdr;
1472     pci_hdr0_initialize(&devhdr, addr);
1473
1474     //enable bus master
1475     pci_hdr0_command_t cmd = pci_hdr0_command_rd(&devhdr);
1476     cmd.master = 1;
1477     pci_hdr0_command_wr(&devhdr, cmd);
1478 }
1479
1480 void pci_program_bridges(void)
1481 {
1482     char element_type[7];  // "device" | "bridge"
1483     char bar_secondary[16];  //[0-6] | secondary(<0-255>)
1484     char space[4];  // "mem" | "io"
1485     char prefetch[16];  // "prefetchable" | "nonprefetchable"
1486     char pcie_pci[5];  // "pcie" | "pci"
1487     int bar;  // the value of bar_secondary after parsing secondary(<nr>) to <nr>
1488     uint8_t bus, dev, fun;
1489     pciaddr_t base, high;
1490     pcisize_t size;
1491     int bits;
1492     bool mem, pcie, pref;
1493     char *output = NULL;
1494     int output_length = 0;
1495     int error_code = 0;
1496
1497     /*
1498      output = NULL;
1499      output_length = 0;
1500      skb_execute("listing.");
1501      output = skb_get_output();
1502      assert(output != NULL);
1503      output_length = strlen(output);
1504      PCI_DEBUG("pci_program_bridges: output = %s\n", output);
1505      PCI_DEBUG("pci_program_bridges: output length = %d\n", output_length);
1506
1507      error_code = skb_read_error_code();
1508      if (error_code != 0) {
1509      printf("pci.c: pci_program_bridges(): SKB returnd error code %d\n",
1510      error_code);
1511
1512      const char *errout = skb_get_error_output();
1513      printf("\nSKB error returned: %s\n", errout);
1514      printf("\nSKB output: %s\n", output);
1515      // XXX: no device can be used...
1516      return;
1517      }
1518      */
1519
1520     output = NULL;
1521     output_length = 0;
1522     char bridge_program[512];
1523     snprintf(bridge_program, 512, "[%s], bridge_programming(P, Nr),"
1524              "flatten(P, F),replace_current_BAR_values(F),"
1525              "write(nrelements(Nr)),writeln(P).",
1526              skb_bridge_program);
1527     skb_execute(bridge_program);
1528     output = skb_get_output();
1529     assert(output != NULL);
1530     output_length = strlen(output);
1531     PCI_DEBUG("pci_program_bridges: output = %s\n", output);
1532     PCI_DEBUG("pci_program_bridges: output length = %d\n", output_length);
1533
1534     error_code = skb_read_error_code();
1535     if (error_code != 0) {
1536         printf("pci.c: pci_program_bridges(): SKB returned error code %d\n",
1537                error_code);
1538
1539         const char *errout = skb_get_error_output();
1540         printf("SKB error returned: %s\n", errout);
1541         printf("SKB output: %s\n", output);
1542         // XXX: no device can be used...
1543         printf("WARNING: CONTINUING, HOWEVER PCI DEVICES WILL BE UNUSABLE\n");
1544         // except IO-space devices which aren't yet affected by bridge programming
1545         return;
1546     }
1547
1548     /*
1549      ********************************************************************************
1550      //for the ASPLOS11 paper:
1551      skb_execute("[bridge_page].");
1552      while (skb_read_error_code() == SKB_PROCESSING) messages_wait_and_handle_next();
1553      char *output = skb_get_output();
1554      assert(output != NULL);
1555      int output_length = strlen(output);
1556      PCI_DEBUG("pci_program_bridges: output = %s\n", output);
1557      PCI_DEBUG("pci_program_bridges: output length = %d\n", output_length);
1558
1559      int error_code = skb_read_error_code();
1560      if (error_code != 0) {
1561      printf("pci.c: pci_program_bridges() <2>: SKB returnd error code %d\n",
1562      error_code);
1563
1564      const char *errout = skb_get_error_output();
1565      printf("\nSKB error returned <2>: %s\n", errout);
1566      printf("\nSKB output <2>: %s\n", output);
1567      // XXX: no device can be used...
1568      return;
1569      }
1570      uint64_t start =rdtsc();
1571      //    uint64_t start =rdtscp();
1572      skb_execute("bridge_programming(P, Nr),write(nrelements(Nr)),writeln(P).");
1573      uint64_t end =rdtsc();
1574      //    uint64_t end =rdtscp();
1575      assert(end >= start);
1576
1577      printf("\n\nTicks: %lu\n\n", end - start);
1578      while (skb_read_error_code() == SKB_PROCESSING) messages_wait_and_handle_next();
1579      output = skb_get_output();
1580      assert(output != NULL);
1581      output_length = strlen(output);
1582      printf("pci_program_bridges: output = %s\n", output);
1583      PCI_DEBUG("pci_program_bridges: output length = %d\n", output_length);
1584
1585      error_code = skb_read_error_code();
1586      if (error_code != 0) {
1587      printf("pci.c: pci_program_bridges() <3>: SKB returnd error code %d\n",
1588      error_code);
1589
1590      const char *errout = skb_get_error_output();
1591      printf("\nSKB error returned <3>: %s\n", errout);
1592      printf("\nSKB output <3>: %s\n", output);
1593      // XXX: no device can be used...
1594      return;
1595      }
1596      ********************************************************************************
1597      */
1598
1599     //get the number of buselements from the output
1600     int nr_elements;
1601     int nr_conversions;
1602     nr_conversions = sscanf(output, "nrelements(%d)", &nr_elements);
1603     if (nr_conversions != 1) {
1604         printf("pci.c: No valid pci plan returned by the SKB\n.");
1605         //XXX: no device can be used
1606         return;
1607     }
1608
1609     //keep a pointer to the current location within the output
1610     char *conv_ptr = output;
1611
1612     //iterate over all buselements
1613     for (int i = 0; i < nr_elements; i++) {
1614         // search the beginning of the next buselement
1615         while ((conv_ptr < output + output_length) && (strncmp(
1616                         conv_ptr, "buselement", strlen("buselement"))
1617                                                        != 0)) {
1618             conv_ptr++;
1619         }
1620         //convert the string to single elements and numbers
1621         nr_conversions = sscanf(conv_ptr, "buselement(%[a-z], addr(%hhu, %hhu, %hhu), "
1622                                 "%[a-z0-9()], %"PRIuPCIADDR", %"PRIuPCIADDR", "
1623                                 "%"PRIuPCISIZE", %[a-z], %[a-z], %[a-z], %d",
1624                                 element_type, &bus, &dev, &fun, bar_secondary,
1625                                 &base, &high, &size, space, prefetch, pcie_pci,
1626                                 &bits);
1627         conv_ptr++;
1628         if (nr_conversions != 12) {
1629             printf("Could not parse output for device or bridge number %d\n"
1630                    "nr conversions: %d\n",
1631                    i, nr_conversions);
1632             continue;
1633         }
1634         if (strncmp(space, "mem", strlen("mem")) == 0) {
1635             mem = true;
1636         } else {
1637             mem = false;
1638         }
1639         if (strncmp(pcie_pci, "pcie", strlen("pcie")) == 0) {
1640             pcie = true;
1641         } else {
1642             pcie = false;
1643         }
1644         if (strncmp(prefetch, "prefetchable", strlen("prefetchable")) == 0) {
1645             pref = true;
1646         } else {
1647             pref = false;
1648         }
1649
1650         // Skip virtual functions
1651         if (strncmp(space, "vf", strlen("vf")) == 0) {
1652             /* PCI_DEBUG("Skipping VF addr(%hhu, %hhu, %hhu)\n", */
1653             /*      bus, dev, fun); */
1654             continue;
1655         }
1656
1657         if (strncmp(element_type, "device", strlen("device")) == 0) {
1658             nr_conversions = sscanf(bar_secondary, "%d", &bar);
1659             if (nr_conversions != 1) {
1660                 printf("Could not determine BAR number while programming BAR\n");
1661                 continue;
1662             }
1663             PCI_DEBUG("programming %s addr(%hhu, %hhu, %hhu), BAR %d, with base = "
1664                       "%"PRIxPCIADDR", high = %"PRIxPCIADDR", size = %"PRIxPCISIZE
1665                       " in" "space = %s, prefetch = %s, %s...\n",
1666                       element_type, bus, dev, fun, bar, base, high, size, space,
1667                       prefetch, pcie ? "PCIe" : "PCI");
1668             program_device_bar(bus, dev, fun, bar, base, size, bits, mem, pcie);
1669
1670         } else {
1671             PCI_DEBUG("programming %s addr(%hhu, %hhu, %hhu), with base = "
1672                       "%"PRIxPCIADDR", high = %"PRIxPCIADDR", size = %"PRIxPCISIZE
1673                       " in space = %s, prefetch = %s...\n",
1674                       element_type, bus, dev, fun, base, high, size, space,
1675                       prefetch);
1676             //a bridge expects the high address excluding the last byte which
1677             //is the base for the next bridge => decrement by one
1678             high--;
1679             program_bridge_window(bus, dev, fun, base, high, pcie, mem, pref);
1680         }
1681     }
1682 }
1683
1684 uint32_t pci_setup_interrupt(uint32_t bus,
1685                          uint32_t dev,
1686                          uint32_t fun)
1687 {
1688     char str[256], ldev[128];
1689
1690     snprintf(str, 256, "[\"irq_routing.pl\"], assigndeviceirq(addr(%"PRIu32
1691                        ", %"PRIu32", %"PRIu32")).",
1692                        bus, dev, fun);
1693     char *output, *error_out;
1694     int32_t int_err;
1695     errval_t err = skb_evaluate(str, &output, &error_out, &int_err);
1696     assert(output != NULL);
1697     assert(err_is_ok(err));
1698
1699     uint8_t irq;
1700     sscanf(output, "%s %hhu", ldev, &irq);
1701
1702     // It's a GSI
1703     if (strcmp(ldev, "fixedGsi") == 0) {
1704         printf("Got GSI %u\n", irq);
1705         return irq;
1706     }
1707
1708     struct acpi_rpc_client* cl = get_acpi_rpc_client();
1709     errval_t error_code;
1710     err = cl->vtbl.set_device_irq(cl, ldev, irq, &error_code);
1711     assert(err_is_ok(err));
1712     if (err_is_fail(error_code)) {
1713         //DEBUG_ERR(error_code, "set device irq failed.");
1714         return 0;
1715     }
1716
1717     return irq;
1718 }