rewrite comments into one, unified style
This commit is contained in:
1 parent
6260de0085
commit
467a58c9c6
163 files changed
+3560
-2556
No files matched your search
@@ -1,4 +1,5 @@
|
||||
// pci.c - PCI bus driver, PDO enumerator, and exported PCI DDI
|
||||
// PCI bus driver. This file owns PCI enumeration, PDO creation, BAR decoding, and explicit MMIO mappings for function drivers.
|
||||
|
||||
#include "pci.h"
|
||||
|
||||
#include <stdint.h>
|
||||
@@ -20,24 +21,26 @@ static const HAL_API* gHal;
|
||||
static DRIVER_OBJECT gPciDriver;
|
||||
static uint32_t gPciDeviceCount;
|
||||
|
||||
/*
|
||||
* PCI MMIO BARs use a private virtual aperture instead of the physical
|
||||
* direct map. This avoids cacheability aliasing with large direct-map pages
|
||||
* and keeps BAR mappings page-granular.
|
||||
*/
|
||||
// PCI MMIO BARs use a private virtual aperture instead of the physical
|
||||
// direct map. This avoids cacheability aliasing with large direct-map pages
|
||||
// and keeps BAR mappings page-granular.
|
||||
|
||||
#define PCI_MMIO_VA_BASE 0xFFFF900000000000ULL
|
||||
#define PCI_MMIO_VA_LIMIT 0xFFFF980000000000ULL
|
||||
|
||||
static uintptr_t gPciMmioNext = PCI_MMIO_VA_BASE;
|
||||
|
||||
// Implements the align Up64 operation.
|
||||
static uint64_t PciAlignUp64(uint64_t value, uint64_t alignment) {
|
||||
return (value + alignment - 1u) & ~(alignment - 1u);
|
||||
}
|
||||
|
||||
// Implements the default Mmio Flags operation.
|
||||
static uint64_t PciDefaultMmioFlags(void) {
|
||||
return PAGE_PRESENT | PAGE_WRITE | PAGE_WRITETHROUGH | PAGE_NOCACHE | PAGE_NX;
|
||||
}
|
||||
|
||||
// Creates mmio Va.
|
||||
static KSTATUS PciAllocateMmioVa(uint64_t length, uintptr_t* outVa) {
|
||||
if (!outVa || !length)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
@@ -54,6 +57,7 @@ static KSTATUS PciAllocateMmioVa(uint64_t length, uintptr_t* outVa) {
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Checks whether pdo.
|
||||
static bool PciIsPdo(DEVICE_OBJECT* pdo, PCI_PDO_EXTENSION** outExt) {
|
||||
if (!pdo || pdo->Type != DeviceObjectPhysical || pdo->u.Pdo.BusType != IoBusPci)
|
||||
return false;
|
||||
@@ -63,26 +67,31 @@ static bool PciIsPdo(DEVICE_OBJECT* pdo, PCI_PDO_EXTENSION** outExt) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Implements the raw Read32 operation.
|
||||
static uint32_t PciRawRead32(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset) {
|
||||
if (!gHal || offset > 0xFCu) return 0xFFFFFFFFu;
|
||||
return gHal->Pci.Read32(0, bus, dev, fn, offset & 0xFCu);
|
||||
}
|
||||
|
||||
// Implements the raw Write32 operation.
|
||||
static void PciRawWrite32(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset, uint32_t value) {
|
||||
if (!gHal || offset > 0xFCu) return;
|
||||
gHal->Pci.Write32(0, bus, dev, fn, offset & 0xFCu, value);
|
||||
}
|
||||
|
||||
// Implements the raw Read8 operation.
|
||||
static uint8_t PciRawRead8(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset) {
|
||||
uint32_t v = PciRawRead32(bus, dev, fn, offset);
|
||||
return (uint8_t)(v >> ((offset & 3u) * 8u));
|
||||
}
|
||||
|
||||
// Implements the raw Read16 operation.
|
||||
static uint16_t PciRawRead16(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset) {
|
||||
uint32_t v = PciRawRead32(bus, dev, fn, offset);
|
||||
return (uint16_t)(v >> ((offset & 2u) * 8u));
|
||||
}
|
||||
|
||||
// Implements the raw Write8 operation.
|
||||
static void PciRawWrite8(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset, uint8_t value) {
|
||||
uint16_t aligned = offset & ~3u;
|
||||
uint32_t shift = (offset & 3u) * 8u;
|
||||
@@ -92,6 +101,7 @@ static void PciRawWrite8(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset,
|
||||
PciRawWrite32(bus, dev, fn, aligned, old);
|
||||
}
|
||||
|
||||
// Implements the raw Write16 operation.
|
||||
static void PciRawWrite16(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset, uint16_t value) {
|
||||
uint16_t aligned = offset & ~3u;
|
||||
uint32_t shift = (offset & 2u) * 8u;
|
||||
@@ -101,6 +111,7 @@ static void PciRawWrite16(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset,
|
||||
PciRawWrite32(bus, dev, fn, aligned, old);
|
||||
}
|
||||
|
||||
// Implements the bar Size From Mask operation.
|
||||
static uint64_t PciBarSizeFromMask(uint64_t mask, uint64_t baseMask) {
|
||||
uint64_t sizeMask = mask & baseMask;
|
||||
if (!sizeMask || sizeMask == baseMask)
|
||||
@@ -108,6 +119,7 @@ static uint64_t PciBarSizeFromMask(uint64_t mask, uint64_t baseMask) {
|
||||
return (~sizeMask + 1u) & baseMask;
|
||||
}
|
||||
|
||||
// Implements the header Bar Count operation.
|
||||
static uint8_t PciHeaderBarCount(uint8_t headerType) {
|
||||
switch (headerType & PCI_HEADER_TYPE_MASK) {
|
||||
case 0x00: return 6;
|
||||
@@ -117,6 +129,7 @@ static uint8_t PciHeaderBarCount(uint8_t headerType) {
|
||||
}
|
||||
}
|
||||
|
||||
// Implements the decode Bars operation.
|
||||
static void PciDecodeBars(PCI_PDO_EXTENSION* ext) {
|
||||
uint8_t barCount = PciHeaderBarCount(ext->Info.HeaderType);
|
||||
for (uint8_t i = 0; i < PCI_MAX_BARS; i++) {
|
||||
@@ -255,6 +268,7 @@ static void PciDecodeBars(PCI_PDO_EXTENSION* ext) {
|
||||
}
|
||||
}
|
||||
|
||||
// Returns capability Offset.
|
||||
static uint8_t PciFindCapabilityOffset(PCI_PDO_EXTENSION* ext) {
|
||||
uint16_t status = (uint16_t)(PciRawRead32(ext->Info.Address.Bus,
|
||||
ext->Info.Address.Device,
|
||||
@@ -270,6 +284,7 @@ static uint8_t PciFindCapabilityOffset(PCI_PDO_EXTENSION* ext) {
|
||||
return cap;
|
||||
}
|
||||
|
||||
// Creates ids.
|
||||
static void PciMakeIds(const PCI_DEVICE_INFO* info, IO_DEVICE_ID* ids, char storage[][IO_MAX_DEVICE_ID_CHARS], size_t* outCount) {
|
||||
size_t count = 0;
|
||||
|
||||
@@ -311,6 +326,7 @@ static void PciMakeIds(const PCI_DEVICE_INFO* info, IO_DEVICE_ID* ids, char stor
|
||||
*outCount = count;
|
||||
}
|
||||
|
||||
// Creates pdo.
|
||||
static KSTATUS PciCreatePdo(uint8_t bus, uint8_t dev, uint8_t fn) {
|
||||
uint32_t id = PciRawRead32(bus, dev, fn, PCI_REG_VENDOR_DEVICE);
|
||||
uint16_t vendor = (uint16_t)(id & 0xFFFFu);
|
||||
@@ -385,6 +401,7 @@ static KSTATUS PciCreatePdo(uint8_t bus, uint8_t dev, uint8_t fn) {
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the enumerate Bus operation.
|
||||
static void PciEnumerateBus(void) {
|
||||
for (uint32_t bus = 0; bus < 256u; bus++) {
|
||||
for (uint32_t dev = 0; dev < 32u; dev++) {
|
||||
@@ -406,6 +423,7 @@ static void PciEnumerateBus(void) {
|
||||
}
|
||||
}
|
||||
|
||||
// Dispatches pnp.
|
||||
static KSTATUS PciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
|
||||
if (!device || !irp) return STATUS_INVALID_PARAMETER;
|
||||
IO_STACK_LOCATION* ios = IoGetCurrentIrpStackLocation(irp);
|
||||
@@ -425,10 +443,12 @@ static KSTATUS PciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
|
||||
}
|
||||
}
|
||||
|
||||
// Implements the driver Abi Version operation.
|
||||
__declspec(dllexport) uint32_t PciDriverAbiVersion(void) {
|
||||
return 1u;
|
||||
}
|
||||
|
||||
// Returns device Info.
|
||||
__declspec(dllexport) KSTATUS PciGetDeviceInfo(DEVICE_OBJECT* pdo, PCI_DEVICE_INFO* outInfo) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!outInfo || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -436,6 +456,7 @@ __declspec(dllexport) KSTATUS PciGetDeviceInfo(DEVICE_OBJECT* pdo, PCI_DEVICE_IN
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns config8.
|
||||
__declspec(dllexport) KSTATUS PciReadConfig8(DEVICE_OBJECT* pdo, uint16_t offset, uint8_t* outValue) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!outValue || offset > 0xFFu || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -443,6 +464,7 @@ __declspec(dllexport) KSTATUS PciReadConfig8(DEVICE_OBJECT* pdo, uint16_t offset
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns config16.
|
||||
__declspec(dllexport) KSTATUS PciReadConfig16(DEVICE_OBJECT* pdo, uint16_t offset, uint16_t* outValue) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!outValue || offset > 0xFEu || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -450,6 +472,7 @@ __declspec(dllexport) KSTATUS PciReadConfig16(DEVICE_OBJECT* pdo, uint16_t offse
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns config32.
|
||||
__declspec(dllexport) KSTATUS PciReadConfig32(DEVICE_OBJECT* pdo, uint16_t offset, uint32_t* outValue) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!outValue || offset > 0xFCu || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -457,6 +480,7 @@ __declspec(dllexport) KSTATUS PciReadConfig32(DEVICE_OBJECT* pdo, uint16_t offse
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Updates config8.
|
||||
__declspec(dllexport) KSTATUS PciWriteConfig8(DEVICE_OBJECT* pdo, uint16_t offset, uint8_t value) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (offset > 0xFFu || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -464,6 +488,7 @@ __declspec(dllexport) KSTATUS PciWriteConfig8(DEVICE_OBJECT* pdo, uint16_t offse
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Updates config16.
|
||||
__declspec(dllexport) KSTATUS PciWriteConfig16(DEVICE_OBJECT* pdo, uint16_t offset, uint16_t value) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (offset > 0xFEu || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -471,6 +496,7 @@ __declspec(dllexport) KSTATUS PciWriteConfig16(DEVICE_OBJECT* pdo, uint16_t offs
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Updates config32.
|
||||
__declspec(dllexport) KSTATUS PciWriteConfig32(DEVICE_OBJECT* pdo, uint16_t offset, uint32_t value) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (offset > 0xFCu || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -478,6 +504,7 @@ __declspec(dllexport) KSTATUS PciWriteConfig32(DEVICE_OBJECT* pdo, uint16_t offs
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns bar.
|
||||
__declspec(dllexport) KSTATUS PciGetBar(DEVICE_OBJECT* pdo, uint8_t index, PCI_BAR* outBar) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!outBar || index >= PCI_MAX_BARS || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -486,6 +513,7 @@ __declspec(dllexport) KSTATUS PciGetBar(DEVICE_OBJECT* pdo, uint8_t index, PCI_B
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Maps a PCI BAR through the private MMIO aperture with explicit cache attributes.
|
||||
__declspec(dllexport) KSTATUS PciMapBar(DEVICE_OBJECT* pdo, uint8_t index, uint64_t pageFlags, void** outVirtual, uint64_t* outLength) {
|
||||
PCI_BAR bar;
|
||||
if (!outVirtual) return STATUS_INVALID_PARAMETER;
|
||||
@@ -522,6 +550,7 @@ __declspec(dllexport) KSTATUS PciMapBar(DEVICE_OBJECT* pdo, uint8_t index, uint6
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Enables device.
|
||||
__declspec(dllexport) KSTATUS PciEnableDevice(DEVICE_OBJECT* pdo, uint32_t flags) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -544,6 +573,7 @@ __declspec(dllexport) KSTATUS PciEnableDevice(DEVICE_OBJECT* pdo, uint32_t flags
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns interrupt.
|
||||
__declspec(dllexport) KSTATUS PciGetInterrupt(DEVICE_OBJECT* pdo, uint8_t* outIrq) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!outIrq || !PciIsPdo(pdo, &ext)) return STATUS_INVALID_PARAMETER;
|
||||
@@ -552,6 +582,7 @@ __declspec(dllexport) KSTATUS PciGetInterrupt(DEVICE_OBJECT* pdo, uint8_t* outIr
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns capability.
|
||||
static uint8_t PciFindCapability(PCI_PDO_EXTENSION* ext, uint8_t capId) {
|
||||
if (!ext || !ext->CapabilityOffset)
|
||||
return 0;
|
||||
@@ -572,6 +603,7 @@ static uint8_t PciFindCapability(PCI_PDO_EXTENSION* ext, uint8_t capId) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Enables msi.
|
||||
__declspec(dllexport) KSTATUS PciEnableMsi(DEVICE_OBJECT* pdo, uint8_t irqSlot) {
|
||||
PCI_PDO_EXTENSION* ext;
|
||||
if (!PciIsPdo(pdo, &ext))
|
||||
@@ -627,6 +659,7 @@ __declspec(dllexport) KSTATUS PciEnableMsi(DEVICE_OBJECT* pdo, uint8_t irqSlot)
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Implements the driver Entry operation.
|
||||
KSTATUS DriverEntry(const HAL_API* hal) {
|
||||
if (!hal) return STATUS_INVALID_PARAMETER;
|
||||
gHal = hal;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// PCI bus-driver declarations shared with PCI function drivers.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
Reference in new issue
Block a user