1/*
2 * Copyright (c) 2007, 2008, 2009, 2010, 2011 ETH Zurich.
3 * All rights reserved.
4 *
5 * This file is distributed under the terms in the attached LICENSE file.
6 * If you do not find this file, copies can be found by writing to:
7 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8 */
9
10interface pci "The PCI Interface" {
11    typedef uint32 caps_per_bar[6]; // 6 == PCI_NBARS
12
13    /* Init PCI device */
14    rpc init_pci_device(in uint32 class_code,
15                        in uint32 sub_class,
16                        in uint32 prog_if,
17                        in uint32 vendor_id,
18                        in uint32 device_id,
19                        in uint32 bus,
20                        in uint32 dev,
21                        in uint32 fun,
22                        out errval err,
23                        out uint8 nr_allocated_bars // Number of bars supported
24                        );
25
26    /* Init legacy IO device */
27    rpc init_legacy_device(in uint16 iomin,
28                           in uint16 iomax,
29                           in uint8 irq,
30                           in uint8 coreid, // core ID for interrupt handler
31                           in uint32 vector,// interrupt vector (0 == no interrupt)
32                           out errval err,
33                           out cap iocap);
34
35    /* request a bar cap for a previously-initialised device */
36    rpc get_bar_cap(in uint32 idx,
37                    out errval err,
38                    out cap cap,
39                    out uint8 type,
40                    out uint8 bar_nr);
41
42    rpc get_vf_bar_cap(in uint32 vf_num,
43                       in uint32 idx,
44                       out cap cap,
45                       out errval err);
46
47    rpc get_vf_iommu_endpoint_cap(in uint32 vf_num,
48                                  in uint8 type,
49                                  out cap cap,
50                                  out errval err);
51
52    rpc get_vf_pci_endpoint_cap(in uint32 vf_num,
53                                in uint8 type,
54                                out cap cap,
55                                out errval err);
56
57    /* request an irq cap for a previously-initialised device */
58    rpc get_irq_cap(in uint16 idx, out errval err, out cap cap);
59
60    /* reregister interrupt for a previously-initialized device */
61    rpc reregister_interrupt(in uint32 class_code,
62                        in uint32 sub_class,
63                        in uint32 prog_if,
64                        in uint32 vendor_id,
65                        in uint32 device_id,
66                        in uint32 bus,
67                        in uint32 dev,
68                        in uint32 fun,
69                        in uint8 coreid,  // core ID for interrupt handler
70                        in uint32 vector, // interrupt vector (0 == no interrupt)
71                        out errval err);
72
73    /* Kludge: retrieve frame cap to VBE BIOS
74    rpc get_vbe_bios_cap(out errval err, out cap cap, out uint32 size);
75    rpc reset(out errval err);
76    rpc sleep(in int state, out errval err);  */
77
78    /* read PCI conf header */
79    rpc read_conf_header(in uint32 dword, out errval err, out uint32 val);
80
81    /* write PCI conf header */
82    rpc write_conf_header(in uint32 dword, in uint32 val, out errval err);
83    
84    /* enable a VF */
85    rpc sriov_enable_vf(in uint32 vf_num, out errval err);
86
87    /* Enable (legacy) interrupt */
88    rpc irq_enable(out errval err);
89
90    /* Enable MSI-X for the specified PCI device. */
91    rpc msix_enable_addr(in uint8 bus, in uint8 dev, in uint8 fn,
92                         out errval err,
93                         out uint16 vec_count);
94    rpc msix_enable(out errval err,
95                    out uint16 vec_count);
96
97    /* Configure specified MSI-X vector */
98    rpc msix_vector_init_addr(in uint8 bus, in uint8 dev, in uint8 fn,
99                              in uint16 idx,        /* Index of MSI-X vector */
100                              in uint8 destination, /* Interrupt Destination */
101                              in uint8 vector,      /* Interrupt Vector */
102                              out errval err);
103    rpc msix_vector_init(in uint16 idx,        /* Index of MSI-X vector */
104                         in uint8 destination, /* Interrupt Destination */
105                         in uint8 vector,      /* Interrupt Vector */
106                         out errval err);
107
108    /* Get the device pci addr as well as vendor and device id*/
109    rpc get_device_addr(out uint32 bus, out uint32 dev, out uint32 fn, out uint32 vendor,
110                        out uint32 devid);
111
112    /* Get nodeid for the cards view of the system */
113    rpc get_nodeid(out int32 nodeid);
114};
115