aboutsummaryrefslogtreecommitdiff
path: root/include/pci.h
blob: 7f40f38333f93b1a901e3532cce057f324e26a50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef BIOS_PCI_H
#define BIOS_PCI_H

#include "ioport.h"

static inline void pci_config_writel(uint16_t bdf, uint32_t addr, uint32_t val)
{
	outl(0xcf8, 0x80000000 | (bdf << 8) | (addr & 0xfc));
	outl(0xcfc, val);
}

static inline void pci_config_writew(uint16_t bdf, uint32_t addr, uint16_t val)
{
	outl(0xcf8, 0x80000000 | (bdf << 8) | (addr & 0xfc));
	outw(0xcfc | (addr & 2), val);
}

static inline void pci_config_writeb(uint16_t bdf, uint32_t addr, uint8_t val)
{
	outl(0xcf8, 0x80000000 | (bdf << 8) | (addr & 0xfc));
	outb(0xcfc | (addr & 3), val);
}

static inline uint32_t pci_config_readl(uint16_t bdf, uint32_t addr)
{
	outl(0xcf8, 0x80000000 | (bdf << 8) | (addr & 0xfc));
	return inl(0xcfc);
}

static inline uint16_t pci_config_readw(uint16_t bdf, uint32_t addr)
{
	outl(0xcf8, 0x80000000 | (bdf << 8) | (addr & 0xfc));
	return inw(0xcfc | (addr & 2));
}

static inline uint8_t pci_config_readb(uint16_t bdf, uint32_t addr)
{
	outl(0xcf8, 0x80000000 | (bdf << 8) | (addr & 0xfc));
	return inb(0xcfc | (addr & 3));
}

#define PCI_VENDOR_ID 0x00
#define PCI_DEVICE_ID 0x02
#define PCI_COMMAND 0x04
#define PCI_CLASS_DEVICE 0x0a
#define PCI_HEADER_TYPE 0x0e
#define PCI_PRIMARY_BUS 0x18
#define PCI_SECONDARY_BUS 0x19
#define PCI_SUBORDINATE_BUS 0x1a
#define PCI_INTERRUPT_LINE 0x3c
#define PCI_INTERRUPT_PIN 0x3d
#define PCI_BRIDGE_CONTROL 0x3e

/* PCI_COMMAND */
#define PCI_COMMAND_DIS_INTX 0x400

/* PCI_CLASS_DEVICE */
#define PCI_CLASS_STORAGE_IDE 0x0101
#define PCI_CLASS_BRIDGE_PCI 0x0604

/* PCI_HEADER_TYPE */
#define PCI_HEADER_TYPE_BRIDGE 1
#define PCI_HEADER_TYPE_MULTI_FUNCTION 0x80

/* PCI_BRIDGE_CONTROL */
#define PCI_BRIDGE_CTL_SERR 0x02

/* PCI_VENDOR_ID / PCI_DEVICE_ID */
#define PCI_VENDOR_ID_INTEL		0x8086
#define PCI_DEVICE_ID_INTEL_82441	0x1237
#define PCI_DEVICE_ID_INTEL_Q35_MCH     0x29c0
#define PCI_DEVICE_ID_INTEL_82371SB_1	0x7010
#define PCI_DEVICE_ID_INTEL_82371AB	0x7111

#define PCIE_MMCONFIG_BASE 0xb0000000
#define PCIE_MMCONFIG_SIZE (256 * 1024 * 1024)

#endif