2021-11-02 20:03:11 +00:00
|
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
2023-02-03 20:47:05 +00:00
|
|
|
#include "../io/io.h"
|
2023-02-21 13:36:20 +00:00
|
|
|
#include "../terminal/kterm.h"
|
2023-02-03 20:47:05 +00:00
|
|
|
#include "pciDevice.h"
|
2021-11-28 15:46:16 +00:00
|
|
|
|
2021-11-02 20:03:11 +00:00
|
|
|
// Configuration Space Access Mechanism #1
|
|
|
|
#define CONFIG_ADDRESS 0xCF8 // Configuration adress that is to be accessed
|
|
|
|
#define CONFIG_DATA 0xCFC // Will do the actual configuration operation
|
2023-02-17 13:42:42 +00:00
|
|
|
#define PCI_BUS_ADDR_SHIFT 16
|
|
|
|
#define PCI_DEVICE_ADDR_SHIFT 11
|
|
|
|
#define PCI_FUNCTION_ADDR_SHIFT 8
|
|
|
|
#define PCI_ENABLE_ADDR_SHIFT 31
|
|
|
|
|
|
|
|
class PCI {
|
|
|
|
public:
|
|
|
|
static void Scan();
|
|
|
|
static uint32_t ConfigReadWord ( PCIBusAddress& PCIDeviceAddress , uint8_t offset);
|
|
|
|
static uint8_t GetProgIF (PCIBusAddress& PCIDeviceAddress);
|
|
|
|
static uint32_t ReadBAR ( PCIBusAddress& PCIDeviceAddress, int bar_number);
|
|
|
|
static uint32_t ConfigReadWord (uint8_t bus, uint8_t device, uint8_t func, uint8_t offset);
|
|
|
|
static uint8_t GetHeaderType( PCIBusAddress& PCIDeviceAddress );
|
|
|
|
static uint16_t GetClassCodes( PCIBusAddress& PCIDeviceAddress );
|
|
|
|
static bool IsMultiFunctionDevice(PCIBusAddress& PCIDeviceAddress);
|
|
|
|
static uint64_t GetDevice (int bus, int device, int function );
|
|
|
|
|
|
|
|
|
|
|
|
static const char* getClassName (uint8_t ClassCode);
|
|
|
|
static const char* getVendor( uint32_t VendorID);
|
|
|
|
static void PrintPCIDevice(PCIBusAddress& PCIDevice);
|
|
|
|
|
|
|
|
private:
|
|
|
|
struct ClassCode {
|
|
|
|
const char* name;
|
|
|
|
uint8_t code;
|
|
|
|
};
|
|
|
|
static constexpr ClassCode ClassCodeNames []= {
|
|
|
|
{"Unclassified", 0x0},
|
|
|
|
{"MassStorage Controller", 0x1},
|
|
|
|
{"Network Controller", 0x2},
|
|
|
|
{"Display Controller", 0x3},
|
|
|
|
{"Multimedia Controller", 0x4},
|
|
|
|
{"Memory Controller", 0x5},
|
|
|
|
{"Bridge", 0x6},
|
|
|
|
{"Simple Communication Controller", 0x7},
|
|
|
|
{"Base System Peripheral", 0x8},
|
|
|
|
{"Input Device Controller", 0x9},
|
|
|
|
{"Docking Station", 0xA},
|
|
|
|
{"Processor", 0xB},
|
|
|
|
{"Serial Bus Controller", 0xC},
|
|
|
|
{ "Wireless Controller", 0xD},
|
|
|
|
{"Intelligent Controller", 0xE},
|
|
|
|
{"Satellite Communication Controller", 0xF},
|
|
|
|
{"Encryption Controller", 0x10},
|
|
|
|
{"Signal Processing Controller", 0x11},
|
|
|
|
{ "Processing Accelerator", 0x12},
|
|
|
|
{ "Non-Essential Instrumentation", 0x13}
|
|
|
|
};
|
|
|
|
static const uint8_t KnownClassCodes = sizeof(ClassCodeNames) / sizeof(ClassCode);
|
|
|
|
};
|
2021-11-02 20:03:11 +00:00
|
|
|
|