2022-09-21 15:57:02 +00:00
|
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
|
2022-09-23 15:24:45 +00:00
|
|
|
#define PCI_VENDOR_FIELD 0x0
|
|
|
|
#define PCI_DEVICE_FIELD 0x2
|
|
|
|
#define PCI_SUBCLASS_FIELD 0xa
|
|
|
|
#define PCI_CLASS_FIELD 0xb
|
|
|
|
#define PCI_REVISION_ID_FIELD 0x8
|
|
|
|
#define PCI_PROG_IF_FIELD 0x9
|
|
|
|
#define PCI_HEADER_TYPE_FIELD 0xe
|
|
|
|
#define PCI_SECONDARY_BUS_NUMBER_FIELD 0x19
|
|
|
|
#define PCI_BAR0_FIELD 0x10
|
|
|
|
#define PCI_BAR1_FIELD 0x14
|
|
|
|
#define PCI_BAR2_FIELD 0x18
|
|
|
|
#define PCI_BAR3_FIELD 0x1C
|
|
|
|
#define PCI_BAR4_FIELD 0x20
|
|
|
|
#define PCI_BAR5_FIELD 0x24
|
|
|
|
|
2022-09-21 15:57:02 +00:00
|
|
|
namespace PCI
|
|
|
|
{
|
|
|
|
struct DeviceID
|
|
|
|
{
|
|
|
|
uint16_t vendor;
|
|
|
|
uint16_t device;
|
|
|
|
};
|
2022-09-23 15:24:45 +00:00
|
|
|
|
2022-09-21 15:57:02 +00:00
|
|
|
struct DeviceType
|
|
|
|
{
|
|
|
|
uint8_t dev_class;
|
|
|
|
uint8_t dev_subclass;
|
|
|
|
uint8_t prog_if;
|
|
|
|
uint8_t revision;
|
|
|
|
};
|
2022-09-23 15:24:45 +00:00
|
|
|
|
|
|
|
struct Device
|
|
|
|
{
|
|
|
|
void write8(int32_t offset, uint8_t value);
|
|
|
|
void write16(int32_t offset, uint16_t value);
|
|
|
|
void write32(int32_t offset, uint32_t value);
|
|
|
|
uint8_t read8(int32_t offset);
|
|
|
|
uint16_t read16(int32_t offset);
|
|
|
|
uint32_t read32(int32_t offset);
|
|
|
|
|
|
|
|
uint32_t getBAR0();
|
|
|
|
uint32_t getBAR1();
|
|
|
|
uint32_t getBAR2();
|
|
|
|
uint32_t getBAR3();
|
|
|
|
uint32_t getBAR4();
|
|
|
|
uint32_t getBAR5();
|
|
|
|
|
|
|
|
uint8_t bus()
|
|
|
|
{
|
|
|
|
return m_bus;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t slot()
|
|
|
|
{
|
|
|
|
return m_slot;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t function()
|
|
|
|
{
|
|
|
|
return m_function;
|
|
|
|
}
|
|
|
|
|
|
|
|
DeviceID id()
|
|
|
|
{
|
|
|
|
return m_id;
|
|
|
|
}
|
|
|
|
|
|
|
|
DeviceType type()
|
|
|
|
{
|
|
|
|
return m_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
Device(DeviceID id, DeviceType type, uint8_t bus, uint8_t slot, uint8_t function);
|
|
|
|
Device(uint8_t bus, uint8_t slot, uint8_t function);
|
|
|
|
Device(const Device& other);
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint8_t m_bus;
|
|
|
|
uint8_t m_slot;
|
|
|
|
uint8_t m_function;
|
|
|
|
DeviceID m_id;
|
|
|
|
DeviceType m_type;
|
|
|
|
};
|
|
|
|
|
2022-09-21 15:57:02 +00:00
|
|
|
uint32_t raw_address(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset);
|
|
|
|
void raw_write8(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset, uint8_t value);
|
|
|
|
void raw_write16(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset, uint16_t value);
|
|
|
|
void raw_write32(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset, uint32_t value);
|
|
|
|
uint8_t raw_read8(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset);
|
|
|
|
uint16_t raw_read16(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset);
|
|
|
|
uint32_t raw_read32(uint32_t bus, uint32_t slot, uint32_t function, int32_t offset);
|
|
|
|
DeviceID get_device_id(uint32_t bus, uint32_t slot, uint32_t function);
|
|
|
|
DeviceType get_device_type(uint32_t bus, uint32_t slot, uint32_t function);
|
2022-09-23 15:24:45 +00:00
|
|
|
void scan(void (*callback)(PCI::Device&));
|
2022-09-21 15:57:02 +00:00
|
|
|
}
|