/root/src/xen/xen/arch/x86/x86_64/pci.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * pci.c |
3 | | * |
4 | | * Architecture-dependent PCI access functions. |
5 | | */ |
6 | | |
7 | | #include <xen/spinlock.h> |
8 | | #include <xen/pci.h> |
9 | | #include <asm/io.h> |
10 | | |
11 | | #define PCI_CONF_ADDRESS(bus, dev, func, reg) \ |
12 | 73.3k | (0x80000000 | (bus << 16) | (dev << 11) | (func << 8) | (reg & ~3)) |
13 | | |
14 | | uint8_t pci_conf_read8( |
15 | | unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, |
16 | | unsigned int reg) |
17 | 4.71k | { |
18 | 4.71k | u32 value; |
19 | 4.71k | |
20 | 4.71k | if ( seg || reg > 255 ) |
21 | 0 | { |
22 | 0 | pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, 1, &value); |
23 | 0 | return value; |
24 | 0 | } |
25 | 4.71k | else |
26 | 4.71k | { |
27 | 4.71k | BUG_ON((bus > 255) || (dev > 31) || (func > 7)); |
28 | 4.71k | return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 3, 1); |
29 | 4.71k | } |
30 | 4.71k | } |
31 | | |
32 | | uint16_t pci_conf_read16( |
33 | | unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, |
34 | | unsigned int reg) |
35 | 5.26k | { |
36 | 5.26k | u32 value; |
37 | 5.26k | |
38 | 5.26k | if ( seg || reg > 255 ) |
39 | 0 | { |
40 | 0 | pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, 2, &value); |
41 | 0 | return value; |
42 | 0 | } |
43 | 5.26k | else |
44 | 5.26k | { |
45 | 5.26k | BUG_ON((bus > 255) || (dev > 31) || (func > 7)); |
46 | 5.26k | return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 2, 2); |
47 | 5.26k | } |
48 | 5.26k | } |
49 | | |
50 | | uint32_t pci_conf_read32( |
51 | | unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, |
52 | | unsigned int reg) |
53 | 59.8k | { |
54 | 59.8k | u32 value; |
55 | 59.8k | |
56 | 59.8k | if ( seg || reg > 255 ) |
57 | 2 | { |
58 | 2 | pci_mmcfg_read(seg, bus, PCI_DEVFN(dev, func), reg, 4, &value); |
59 | 2 | return value; |
60 | 2 | } |
61 | 59.8k | else |
62 | 59.8k | { |
63 | 59.8k | BUG_ON((bus > 255) || (dev > 31) || (func > 7)); |
64 | 59.8k | return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4); |
65 | 59.8k | } |
66 | 59.8k | } |
67 | | |
68 | | void pci_conf_write8( |
69 | | unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, |
70 | | unsigned int reg, uint8_t data) |
71 | 607 | { |
72 | 607 | if ( seg || reg > 255 ) |
73 | 0 | pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, 1, data); |
74 | 607 | else |
75 | 607 | { |
76 | 607 | BUG_ON((bus > 255) || (dev > 31) || (func > 7)); |
77 | 607 | pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 3, 1, data); |
78 | 607 | } |
79 | 607 | } |
80 | | |
81 | | void pci_conf_write16( |
82 | | unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, |
83 | | unsigned int reg, uint16_t data) |
84 | 1.20k | { |
85 | 1.20k | if ( seg || reg > 255 ) |
86 | 0 | pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, 2, data); |
87 | 1.20k | else |
88 | 1.20k | { |
89 | 1.20k | BUG_ON((bus > 255) || (dev > 31) || (func > 7)); |
90 | 1.20k | pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 2, 2, data); |
91 | 1.20k | } |
92 | 1.20k | } |
93 | | |
94 | | void pci_conf_write32( |
95 | | unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, |
96 | | unsigned int reg, uint32_t data) |
97 | 1.61k | { |
98 | 1.61k | if ( seg || reg > 255 ) |
99 | 0 | pci_mmcfg_write(seg, bus, PCI_DEVFN(dev, func), reg, 4, data); |
100 | 1.61k | else |
101 | 1.61k | { |
102 | 1.61k | BUG_ON((bus > 255) || (dev > 31) || (func > 7)); |
103 | 1.61k | pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4, data); |
104 | 1.61k | } |
105 | 1.61k | } |