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
|
#ifndef PCI_H
#define PCI_H
#include <stdbool.h>
#include "port.h"
#include "interrupts.h"
#include "driver.h"
typedef struct {
uint16_t bus;
uint16_t device;
uint16_t function;
uint16_t vendor_id;
uint16_t device_id;
uint8_t class_id;
uint8_t subclass_id;
uint8_t interface_id;
uint8_t revision_id;
uint32_t port_base;
uint8_t interrupt;
} pci_device_descriptor_t;
typedef struct {
port32_t command_port;
port32_t data_port;
} pci_controller_t;
typedef enum {
BASE_ADDRESS_REGISTER_TYPE_IO,
BASE_ADDRESS_REGISTER_TYPE_MEMORY_MAPPED
} pci_base_address_register_type_t;
typedef struct {
pci_base_address_register_type_t type;
bool prefetchable;
uint8_t *addr;
uint32_t *size;
} pci_base_address_register_t;
void pci_controller_init( pci_controller_t *controller );
uint16_t pci_controller_read( pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function, uint32_t offset );
void pci_controller_write( pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function, uint32_t offset, uint32_t data );
void pci_controller_scan_and_register( pci_controller_t *controller, driver_manager_t *driver_manager, interrupt_t *interrupt, void *context );
void pci_device_descriptor_init( pci_device_descriptor_t *descriptor, pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function );
void pci_base_address_register_init( pci_base_address_register_t *base_address_register, pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function, uint16_t bar );
driver_t *pci_device_get_driver( pci_controller_t *pci, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context );
void pci_enable_bus_mastering( pci_controller_t *controller, pci_device_descriptor_t *descriptor );
#endif // PCI_H
|