Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0
2 : : #include <linux/kernel.h>
3 : : #include <linux/pci.h>
4 : : #include <asm/pci-direct.h>
5 : : #include <asm/io.h>
6 : : #include <asm/pci_x86.h>
7 : :
8 : : /* Direct PCI access. This is used for PCI accesses in early boot before
9 : : the PCI subsystem works. */
10 : :
11 : 114 : u32 read_pci_config(u8 bus, u8 slot, u8 func, u8 offset)
12 : : {
13 : 114 : u32 v;
14 : 114 : outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
15 : 114 : v = inl(0xcfc);
16 : 114 : return v;
17 : : }
18 : :
19 : 18 : u8 read_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset)
20 : : {
21 : 18 : u8 v;
22 : 18 : outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
23 : 18 : v = inb(0xcfc + (offset&3));
24 : 18 : return v;
25 : : }
26 : :
27 : 138 : u16 read_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset)
28 : : {
29 : 138 : u16 v;
30 : 138 : outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
31 : 138 : v = inw(0xcfc + (offset&2));
32 : 138 : return v;
33 : : }
34 : :
35 : 0 : void write_pci_config(u8 bus, u8 slot, u8 func, u8 offset,
36 : : u32 val)
37 : : {
38 : 0 : outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
39 : 0 : outl(val, 0xcfc);
40 : 0 : }
41 : :
42 : 0 : void write_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset, u8 val)
43 : : {
44 : 0 : outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
45 : 0 : outb(val, 0xcfc + (offset&3));
46 : 0 : }
47 : :
48 : 0 : void write_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset, u16 val)
49 : : {
50 : 0 : outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
51 : 0 : outw(val, 0xcfc + (offset&2));
52 : 0 : }
53 : :
54 : 15 : int early_pci_allowed(void)
55 : : {
56 : 15 : return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) ==
57 : : PCI_PROBE_CONF1;
58 : : }
59 : :
|