Coverage Report

Created: 2017-10-25 09:10

/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
}