AquilaOS documentation
How it works, and its code
Loading...
Searching...
No Matches
conf1.c
Go to the documentation of this file.
1
10
11#include <core/system.h>
12#include <dev/pci.h>
13#include <cpu/io.h>
14
15#define PCI_CONFIG_ADDRESS 0x00
16#define PCI_CONFIG_DATA 0x04
17
20 struct {
21 uint8_t reg : 8;
22 uint8_t function : 3;
23 uint8_t device : 5;
24 uint8_t bus : 8;
25 uint8_t reserved : 7;
26 uint8_t enable : 1;
29} __packed;
30
33static void conf1_select(struct pci_host *host, struct pci_dev *dev, uint16_t reg)
34{
35 union pci_address addr;
36 addr.raw = 0;
37
38 addr.structure.enable = 1;
39 addr.structure.bus = dev->bus;
40 addr.structure.device = dev->dev;
41 addr.structure.function = dev->func;
42 addr.structure.reg = reg & 0xfc;
43
45}
46
56{
57 if (reg > 0xFF)
58 return 0xFFFFFFFF;
59
60 conf1_select(host, dev, reg);
61 return io_in32(&host->config, PCI_CONFIG_DATA);
62}
63
73void pci_conf1_write(struct pci_host *host, struct pci_dev *dev, uint16_t reg, uint32_t val)
74{
75 if (reg > 0xFF)
76 return;
77
78 conf1_select(host, dev, reg);
79 io_out32(&host->config, PCI_CONFIG_DATA, val);
80}
static uint32_t io_in32(struct ioaddr *io, uintptr_t off)
Definition io.h:38
static void io_out32(struct ioaddr *io, uintptr_t off, uint32_t val)
Definition io.h:54
static void conf1_select(struct pci_host *host, struct pci_dev *dev, uint16_t reg)
Selects register reg of dev (rounded down to 4 bytes), for the next access to CONFIG_DATA.
Definition conf1.c:33
void pci_conf1_write(struct pci_host *host, struct pci_dev *dev, uint16_t reg, uint32_t val)
Writes a 32-bit register of a function's configuration space.
Definition conf1.c:73
uint32_t pci_conf1_read(struct pci_host *host, struct pci_dev *dev, uint16_t reg)
Reads a 32-bit register of a function's configuration space.
Definition conf1.c:55
#define PCI_CONFIG_ADDRESS
Definition conf1.c:15
#define PCI_CONFIG_DATA
Definition conf1.c:16
#define __packed
Definition system.h:30
unsigned int uint32_t
Definition stddef.h:22
unsigned char uint8_t
Definition stddef.h:20
unsigned short int uint16_t
Definition stddef.h:21
A device driver: its operations, any of which may be NULL.
Definition dev.h:28
A PCI function: its bus, device (slot) and function numbers.
Definition pci.h:18
The host bridge, which the platform describes (platform_init() sets it): how its configuration space ...
Definition pci.h:32
struct ioaddr config
Definition pci.h:38
What is written to CONFIG_ADDRESS: the register to reach.
Definition conf1.c:19
uint32_t raw
Definition conf1.c:28
struct pci_address::@101077010334364201370103200271212236154121237126 structure