diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs b/Source/Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs
index 3d369d4cfc..739ea36739 100644
--- a/Source/Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs
+++ b/Source/Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs
@@ -24,10 +24,10 @@ public void Execute()
Program.Bullet(ConsoleColor.Yellow);
Console.Write(" ");
- var pciDevice = (PCIDevice)device.Parent.DeviceDriver;
+ var pciDevice = (PCIDeviceConfiguration)device.Configuration;
var name = device.DeviceDriverRegistryEntry == null ? "UnknownPCIDevice" : device.Name;
- Program.InBrackets(pciDevice.Device.Name + ": " + name + " " + pciDevice.VendorID.ToString("x") + ":" + pciDevice.DeviceID.ToString("x") + " " + pciDevice.SubSystemID.ToString("x") + ":" + pciDevice.SubSystemVendorID.ToString("x") + " (" + pciDevice.ClassCode.ToString("x") + ":" + pciDevice.SubClassCode.ToString("x") + ":" + pciDevice.ProgIF.ToString("x") + ":" + pciDevice.RevisionID.ToString("x") + ")", ConsoleColor.White, ConsoleColor.Green);
+ Program.InBrackets(pciDevice.Name + ": " + name + " " + pciDevice.VendorID.ToString("x") + ":" + pciDevice.DeviceID.ToString("x") + " " + pciDevice.SubSystemID.ToString("x") + ":" + pciDevice.SubSystemVendorID.ToString("x") + " (" + pciDevice.ClassCode.ToString("x") + ":" + pciDevice.SubClassCode.ToString("x") + ":" + pciDevice.ProgIF.ToString("x") + ":" + pciDevice.RevisionID.ToString("x") + ")", ConsoleColor.White, ConsoleColor.Green);
Console.WriteLine();
}
}
diff --git a/Source/Mosa.DeviceDriver/ISA/PCIController.cs b/Source/Mosa.DeviceDriver/ISA/PCIController.cs
index 09ca5a6423..f9c734df34 100644
--- a/Source/Mosa.DeviceDriver/ISA/PCIController.cs
+++ b/Source/Mosa.DeviceDriver/ISA/PCIController.cs
@@ -51,39 +51,39 @@ private static uint GetIndex(byte bus, byte slot, byte function, byte register)
#region IPCIController
- public uint ReadConfig32(PCIDevice pciDevice, byte register)
+ public uint ReadConfig32(PCIDeviceConfiguration configuration, byte register)
{
- configAddress.Write32(GetIndex(pciDevice.Bus, pciDevice.Slot, pciDevice.Function, register));
+ configAddress.Write32(GetIndex(configuration.Bus, configuration.Slot, configuration.Function, register));
return configData.Read32();
}
- public ushort ReadConfig16(PCIDevice pciDevice, byte register)
+ public ushort ReadConfig16(PCIDeviceConfiguration configuration, byte register)
{
- configAddress.Write32(GetIndex(pciDevice.Bus, pciDevice.Slot, pciDevice.Function, register));
+ configAddress.Write32(GetIndex(configuration.Bus, configuration.Slot, configuration.Function, register));
return (ushort)((configData.Read32() >> (register % 4 * 8)) & 0xFFFF);
}
- public byte ReadConfig8(PCIDevice pciDevice, byte register)
+ public byte ReadConfig8(PCIDeviceConfiguration configuration, byte register)
{
- configAddress.Write32(GetIndex(pciDevice.Bus, pciDevice.Slot, pciDevice.Function, register));
+ configAddress.Write32(GetIndex(configuration.Bus, configuration.Slot, configuration.Function, register));
return (byte)((configData.Read32() >> (register % 4 * 8)) & 0xFF);
}
- public void WriteConfig32(PCIDevice pciDevice, byte register, uint value)
+ public void WriteConfig32(PCIDeviceConfiguration configuration, byte register, uint value)
{
- configAddress.Write32(GetIndex(pciDevice.Bus, pciDevice.Slot, pciDevice.Function, register));
+ configAddress.Write32(GetIndex(configuration.Bus, configuration.Slot, configuration.Function, register));
configData.Write32(value);
}
- public void WriteConfig16(PCIDevice pciDevice, byte register, ushort value)
+ public void WriteConfig16(PCIDeviceConfiguration configuration, byte register, ushort value)
{
- configAddress.Write32(GetIndex(pciDevice.Bus, pciDevice.Slot, pciDevice.Function, register));
+ configAddress.Write32(GetIndex(configuration.Bus, configuration.Slot, configuration.Function, register));
configData.Write16(value);
}
- public void WriteConfig8(PCIDevice pciDevice, byte register, byte value)
+ public void WriteConfig8(PCIDeviceConfiguration configuration, byte register, byte value)
{
- configAddress.Write32(GetIndex(pciDevice.Bus, pciDevice.Slot, pciDevice.Function, register));
+ configAddress.Write32(GetIndex(configuration.Bus, configuration.Slot, configuration.Function, register));
configData.Write8(value);
}
diff --git a/Source/Mosa.DeviceDriver/PCI/VirtIO/VirtIODevice.cs b/Source/Mosa.DeviceDriver/PCI/VirtIO/VirtIODevice.cs
index 83a34c5e99..b864e3a566 100644
--- a/Source/Mosa.DeviceDriver/PCI/VirtIO/VirtIODevice.cs
+++ b/Source/Mosa.DeviceDriver/PCI/VirtIO/VirtIODevice.cs
@@ -14,7 +14,7 @@ namespace Mosa.DeviceDriver.PCI.VirtIO;
public class VirtIODevice
{
private readonly string devName;
- private readonly PCIDevice pciDevice;
+ private readonly PCIDeviceConfiguration configuration;
private readonly IPCIController pciController;
private readonly ConstrainedPointer devBar;
private readonly uint devOff;
@@ -38,30 +38,30 @@ public class VirtIODevice
public VirtIODevice(Device device)
{
devName = device.Name;
- pciDevice = (PCIDevice)device.Parent.DeviceDriver;
+ configuration = (PCIDeviceConfiguration)device.Configuration;
- if (pciDevice.RevisionID < 1)
+ if (configuration.RevisionID < 1)
{
- HAL.DebugWriteLine("[" + devName + "] pci revision id mismatch; abort");
+ HAL.DebugWriteLine($"[{devName}] pci revision id mismatch; abort");
return;
}
- pciController = pciDevice.Controller;
+ pciController = configuration.Controller;
- foreach (var capability in pciDevice.Capabilities)
+ foreach (var capability in configuration.Capabilities)
{
if (capability.Capability != 0x09)
continue;
- var configType = pciController.ReadConfig8(pciDevice, (byte)(capability.Offset + 3));
- var bar = pciController.ReadConfig8(pciDevice, (byte)(capability.Offset + 4));
- var offset = pciController.ReadConfig32(pciDevice, (byte)(capability.Offset + 8));
+ var configType = pciController.ReadConfig8(configuration, (byte)(capability.Offset + 3));
+ var bar = pciController.ReadConfig8(configuration, (byte)(capability.Offset + 4));
+ var offset = pciController.ReadConfig32(configuration, (byte)(capability.Offset + 8));
switch (configType)
{
case VirtIOConfigurationCapabilities.Common:
{
- var pciBar = pciDevice.BaseAddresses[bar];
+ var pciBar = configuration.BaseAddresses[bar];
if (pciBar.Region == AddressType.Memory)
{
@@ -78,7 +78,7 @@ public VirtIODevice(Device device)
}
case VirtIOConfigurationCapabilities.Notify:
{
- var pciBar = pciDevice.BaseAddresses[bar];
+ var pciBar = configuration.BaseAddresses[bar];
if (pciBar.Region == AddressType.Memory)
{
@@ -91,13 +91,13 @@ public VirtIODevice(Device device)
return;
}
- notifyOffMultiplier = pciController.ReadConfig32(pciDevice, (byte)(capability.Offset + 16));
+ notifyOffMultiplier = pciController.ReadConfig32(configuration, (byte)(capability.Offset + 16));
break;
}
case VirtIOConfigurationCapabilities.ISR: break;
case VirtIOConfigurationCapabilities.Device:
{
- var pciBar = pciDevice.BaseAddresses[bar];
+ var pciBar = configuration.BaseAddresses[bar];
if (pciBar.Region == AddressType.Memory)
{
diff --git a/Source/Mosa.DeviceSystem/Framework/BaseDeviceConfiguration.cs b/Source/Mosa.DeviceSystem/Framework/BaseDeviceConfiguration.cs
index a3a2c1bd4a..f024698b29 100644
--- a/Source/Mosa.DeviceSystem/Framework/BaseDeviceConfiguration.cs
+++ b/Source/Mosa.DeviceSystem/Framework/BaseDeviceConfiguration.cs
@@ -1,11 +1,12 @@
// Copyright (c) MOSA Project. Licensed under the New BSD License.
using Mosa.DeviceSystem.Disks;
+using Mosa.DeviceSystem.PCI;
namespace Mosa.DeviceSystem.Framework;
///
-/// The base class for device configurations. See and
-/// for implementations of this class.
+/// The base class for device configurations. See ,
+/// and for implementations of this class.
///
public abstract class BaseDeviceConfiguration { }
diff --git a/Source/Mosa.DeviceSystem/HardwareAbstraction/HAL.cs b/Source/Mosa.DeviceSystem/HardwareAbstraction/HAL.cs
index 7e6286ceaf..2dd83096d5 100644
--- a/Source/Mosa.DeviceSystem/HardwareAbstraction/HAL.cs
+++ b/Source/Mosa.DeviceSystem/HardwareAbstraction/HAL.cs
@@ -28,9 +28,9 @@ public static class HAL
public static ConstrainedPointer GetPhysicalMemory(Pointer address, uint size) => hardwareAbstraction.GetPhysicalMemory(address, size);
- internal static void DisableAllInterrupts() => hardwareAbstraction.DisableInterrupts();
+ public static void DisableAllInterrupts() => hardwareAbstraction.DisableInterrupts();
- internal static void EnableAllInterrupts() => hardwareAbstraction.EnableInterrupts();
+ public static void EnableAllInterrupts() => hardwareAbstraction.EnableInterrupts();
public static void Sleep(uint milliseconds) => hardwareAbstraction.Sleep(milliseconds);
diff --git a/Source/Mosa.DeviceSystem/PCI/IPCIController.cs b/Source/Mosa.DeviceSystem/PCI/IPCIController.cs
index bac525c188..d808270afb 100644
--- a/Source/Mosa.DeviceSystem/PCI/IPCIController.cs
+++ b/Source/Mosa.DeviceSystem/PCI/IPCIController.cs
@@ -7,15 +7,15 @@ namespace Mosa.DeviceSystem.PCI;
///
public interface IPCIController
{
- uint ReadConfig32(PCIDevice pciDevice, byte register);
+ uint ReadConfig32(PCIDeviceConfiguration configuration, byte register);
- ushort ReadConfig16(PCIDevice pciDevice, byte register);
+ ushort ReadConfig16(PCIDeviceConfiguration configuration, byte register);
- byte ReadConfig8(PCIDevice pciDevice, byte register);
+ byte ReadConfig8(PCIDeviceConfiguration configuration, byte register);
- void WriteConfig32(PCIDevice pciDevice, byte register, uint value);
+ void WriteConfig32(PCIDeviceConfiguration configuration, byte register, uint value);
- void WriteConfig16(PCIDevice pciDevice, byte register, ushort value);
+ void WriteConfig16(PCIDeviceConfiguration configuration, byte register, ushort value);
- void WriteConfig8(PCIDevice pciDevice, byte register, byte value);
+ void WriteConfig8(PCIDeviceConfiguration configuration, byte register, byte value);
}
diff --git a/Source/Mosa.DeviceSystem/PCI/PCIDevice.cs b/Source/Mosa.DeviceSystem/PCI/PCIDeviceConfiguration.cs
similarity index 76%
rename from Source/Mosa.DeviceSystem/PCI/PCIDevice.cs
rename to Source/Mosa.DeviceSystem/PCI/PCIDeviceConfiguration.cs
index 60af79135a..85e2d17664 100644
--- a/Source/Mosa.DeviceSystem/PCI/PCIDevice.cs
+++ b/Source/Mosa.DeviceSystem/PCI/PCIDeviceConfiguration.cs
@@ -11,7 +11,7 @@ namespace Mosa.DeviceSystem.PCI;
/// The base class for all PCI devices in the device driver framework. It provides a generic way of initializing and enabling/disabling
/// such devices.
///
-public class PCIDevice : BaseDeviceDriver
+public class PCIDeviceConfiguration : BaseDeviceConfiguration
{
#region Properties
@@ -21,7 +21,9 @@ public class PCIDevice : BaseDeviceDriver
public byte Function { get; }
- public IPCIController Controller { get; private set; }
+ public string Name { get; }
+
+ public IPCIController Controller { get; }
public PCICapability[] Capabilities { get; private set; }
@@ -59,19 +61,17 @@ public ushort CommandRegister
#endregion Properties
- public PCIDevice(byte bus, byte slot, byte function)
+ public PCIDeviceConfiguration(string pciControllerName, IPCIController pciController, byte bus, byte slot, byte function)
{
Bus = bus;
Slot = slot;
Function = function;
+ Name = $"{pciControllerName}/{bus}.{slot}.{function}";
+ Controller = pciController;
}
- public override void Initialize()
+ public void Initialize()
{
- Controller = Device.Parent.DeviceDriver as IPCIController;
- if (Controller == null)
- return;
-
VendorID = Controller.ReadConfig16(this, PCIConfigurationHeader.VendorID);
DeviceID = Controller.ReadConfig16(this, PCIConfigurationHeader.DeviceID);
RevisionID = Controller.ReadConfig8(this, PCIConfigurationHeader.RevisionID);
@@ -82,13 +82,11 @@ public override void Initialize()
SubSystemID = Controller.ReadConfig16(this, PCIConfigurationHeader.SubSystemID);
IRQ = Controller.ReadConfig8(this, PCIConfigurationHeader.InterruptLineRegister);
- Device.Name = $"{Device.Parent.Name}/{Bus}.{Slot}.{Function}";
-
for (byte i = 0; i < 6; i++)
{
var bar = (byte)(PCIConfigurationHeader.BaseAddressRegisterBase + i * 4);
-
var address = Controller.ReadConfig32(this, bar);
+
if (address == 0)
continue;
@@ -101,13 +99,9 @@ public override void Initialize()
HAL.EnableAllInterrupts();
if (address % 2 == 1)
- {
BaseAddresses[i] = new BaseAddress(AddressType.PortIO, new Pointer(address & 0x0000FFF8), (~(mask & 0xFFF8) + 1) & 0xFFFF, false);
- }
else
- {
BaseAddresses[i] = new BaseAddress(AddressType.Memory, new Pointer(address & 0xFFFFFFF0), ~(mask & 0xFFFFFFF0) + 1, (address & 0x08) == 1);
- }
}
// FIXME: Special case for generic VGA
@@ -117,33 +111,21 @@ public override void Initialize()
BaseAddresses[7] = new BaseAddress(AddressType.PortIO, new Pointer(0x3B0), 0x0F, false);
}
- if ((StatusRegister & (byte)PCIStatus.Capability) != 0)
- {
- var capabilities = new List();
- var ptr = Controller.ReadConfig8(this, PCIConfigurationHeader.CapabilitiesPointer);
+ if ((StatusRegister & (byte)PCIStatus.Capability) == 0)
+ return;
- while (ptr != 0)
- {
- var capability = Controller.ReadConfig8(this, ptr);
- capabilities.Add(new PCICapability(capability, ptr));
+ var capabilities = new List();
+ var ptr = Controller.ReadConfig8(this, PCIConfigurationHeader.CapabilitiesPointer);
- ptr = Controller.ReadConfig8(this, (byte)(ptr + 1));
- }
+ while (ptr != 0)
+ {
+ var capability = Controller.ReadConfig8(this, ptr);
+ capabilities.Add(new PCICapability(capability, ptr));
- Capabilities = capabilities.ToArray();
+ ptr = Controller.ReadConfig8(this, (byte)(ptr + 1));
}
- EnableDevice();
- }
-
- public override void Probe() => Device.Status = DeviceStatus.Available;
-
- public override void Start() => Device.Status = DeviceStatus.Online;
-
- public override bool OnInterrupt()
- {
- // TODO
- return true;
+ Capabilities = capabilities.ToArray();
}
public void EnableDevice()
@@ -151,8 +133,4 @@ public void EnableDevice()
public void DisableDevice()
=> CommandRegister = (ushort)(CommandRegister & ~PCICommand.IOSpaceEnable & ~PCICommand.BusMasterFunctionEnable & PCICommand.MemorySpaceEnable);
-
- public void SetNoDriverFound() => Device.Status = DeviceStatus.NotFound;
-
- public void SetDeviceOnline() => Device.Status = DeviceStatus.Online;
}
diff --git a/Source/Mosa.DeviceSystem/Services/DeviceService.cs b/Source/Mosa.DeviceSystem/Services/DeviceService.cs
index dcc25f3deb..4b02cef115 100644
--- a/Source/Mosa.DeviceSystem/Services/DeviceService.cs
+++ b/Source/Mosa.DeviceSystem/Services/DeviceService.cs
@@ -45,18 +45,14 @@ public void RegisterDeviceDriver(List deviceDrivers)
var platformArchitecture = HAL.PlatformArchitecture;
foreach (var deviceDriver in deviceDrivers)
- {
if ((deviceDriver.Platform & platformArchitecture) == platformArchitecture)
RegisterDeviceDriver(deviceDriver);
- }
}
public void RegisterDeviceDriver(DeviceDriverRegistryEntry deviceDriver)
{
lock (sync)
- {
registry.Add(deviceDriver);
- }
}
public List GetDeviceDrivers(DeviceBusType busType)
@@ -64,13 +60,9 @@ public List GetDeviceDrivers(DeviceBusType busType)
var drivers = new List();
lock (sync)
- {
foreach (var deviceDriver in registry)
- {
if (deviceDriver.BusType == busType)
drivers.Add(deviceDriver);
- }
- }
return drivers;
}
@@ -182,13 +174,9 @@ private void StartDevice(Device device)
public Device GetFirstDevice()
{
lock (sync)
- {
foreach (var device in devices)
- {
if (device.DeviceDriver is T)
return device;
- }
- }
return null;
}
@@ -198,13 +186,9 @@ public List GetDevices()
var list = new List();
lock (sync)
- {
foreach (var device in devices)
- {
if (device.DeviceDriver is T)
list.Add(device);
- }
- }
return list;
}
@@ -212,13 +196,9 @@ public List GetDevices()
public Device GetFirstDevice(DeviceStatus status)
{
lock (sync)
- {
foreach (var device in devices)
- {
if (device.Status == status && device.DeviceDriver is T)
return device;
- }
- }
return null;
}
@@ -228,13 +208,9 @@ public List GetDevices(DeviceStatus status)
var list = new List();
lock (sync)
- {
foreach (var device in devices)
- {
if (device.Status == status && device.DeviceDriver is T)
list.Add(device);
- }
- }
return list;
}
@@ -244,13 +220,9 @@ public List GetDevices(string name)
var list = new List();
lock (sync)
- {
foreach (var device in devices)
- {
if (device.Name == name)
list.Add(device);
- }
- }
return list;
}
@@ -260,10 +232,8 @@ public List GetChildrenOf(Device parent)
var list = new List();
lock (sync)
- {
foreach (var device in parent.Children)
list.Add(device);
- }
return list;
}
@@ -298,13 +268,9 @@ public List GetAllDevices(DeviceBusType busType)
public bool CheckExists(Device parent, ulong componentID)
{
lock (sync)
- {
foreach (var device in devices)
- {
if (device.Parent == parent && device.ComponentID == componentID)
return true;
- }
- }
return false;
}
@@ -336,9 +302,7 @@ public void AddInterruptHandler(Device device)
return;
lock (sync)
- {
IRQDispatch[irq].Add(device);
- }
}
HAL.DebugWriteLine("DeviceService::AddInterruptHandler() [Exit]");
@@ -354,9 +318,7 @@ public void ReleaseInterruptHandler(Device device)
return;
lock (sync)
- {
IRQDispatch[irq].Remove(device);
- }
}
#endregion Interrupts
diff --git a/Source/Mosa.DeviceSystem/Services/PCIDeviceService.cs b/Source/Mosa.DeviceSystem/Services/PCIDeviceService.cs
index 96d311a257..44f223abba 100644
--- a/Source/Mosa.DeviceSystem/Services/PCIDeviceService.cs
+++ b/Source/Mosa.DeviceSystem/Services/PCIDeviceService.cs
@@ -4,7 +4,6 @@
using Mosa.DeviceSystem.Framework;
using Mosa.DeviceSystem.Framework.PCI;
using Mosa.DeviceSystem.HardwareAbstraction;
-using Mosa.DeviceSystem.Misc;
using Mosa.DeviceSystem.PCI;
namespace Mosa.DeviceSystem.Services;
@@ -34,17 +33,17 @@ protected override void Initialize()
HAL.DebugWriteLine("PCIDeviceService::Initialize() [Exit]");
}
- private void CreateDevice(byte bus, byte slot, byte function, Device device, IPCIController pciController)
+ private void CreateDevice(byte bus, byte slot, byte function, Device pciControllerDevice, IPCIController pciController)
{
- var pciDevice = new PCIDevice(bus, slot, function);
- var value = pciController.ReadConfig32(pciDevice, 0);
+ var configuration = new PCIDeviceConfiguration(pciControllerDevice.Name, pciController, bus, slot, function);
+ var value = pciController.ReadConfig32(configuration, 0);
if (value == 0xFFFFFFFF)
return;
// TODO: Check for duplicates
- var parentDevice = deviceService.Initialize(pciDevice, device);
+ configuration.Initialize();
// Find the best matching driver
PCIDeviceDriverRegistryEntry matchedDriver = null;
@@ -53,7 +52,7 @@ private void CreateDevice(byte bus, byte slot, byte function, Device device, IPC
var drivers = deviceService.GetDeviceDrivers(DeviceBusType.PCI);
foreach (var driver in drivers)
{
- if (driver is not PCIDeviceDriverRegistryEntry pciDriver || !IsMatch(pciDriver, pciDevice))
+ if (driver is not PCIDeviceDriverRegistryEntry pciDriver || !IsMatch(pciDriver, configuration))
continue;
var priority = GetMatchedPriority(pciDriver);
@@ -64,71 +63,72 @@ private void CreateDevice(byte bus, byte slot, byte function, Device device, IPC
matchPriority = priority;
}
- StartDevice(matchedDriver, parentDevice, pciDevice);
+ StartDevice(matchedDriver, pciControllerDevice, configuration);
}
- private void StartDevice(PCIDeviceDriverRegistryEntry driver, Device device, PCIDevice pciDevice)
+ private void StartDevice(PCIDeviceDriverRegistryEntry driver, Device parentDevice, PCIDeviceConfiguration configuration)
{
var ioPortRegions = new List();
var memoryRegions = new List();
- foreach (var pciBaseAddress in pciDevice.BaseAddresses)
+ foreach (var baseAddress in configuration.BaseAddresses)
{
- if (pciBaseAddress == null || pciBaseAddress.Size == 0)
+ if (baseAddress == null || baseAddress.Size == 0)
continue;
- switch (pciBaseAddress.Region)
+ switch (baseAddress.Region)
{
- case AddressType.PortIO: ioPortRegions.Add(new IOPortRegion((ushort)pciBaseAddress.Address, (ushort)pciBaseAddress.Size)); break;
- case AddressType.Memory: memoryRegions.Add(new AddressRegion(pciBaseAddress.Address, pciBaseAddress.Size)); break;
+ case AddressType.PortIO: ioPortRegions.Add(new IOPortRegion((ushort)baseAddress.Address, (ushort)baseAddress.Size)); break;
+ case AddressType.Memory: memoryRegions.Add(new AddressRegion(baseAddress.Address, baseAddress.Size)); break;
}
}
- var hardwareResources = new HardwareResources(ioPortRegions, memoryRegions, pciDevice.IRQ);
+ var hardwareResources = new HardwareResources(ioPortRegions, memoryRegions, configuration.IRQ);
// No driver was found previously
if (driver == null)
{
HAL.DebugWriteLine(" > Unknown PCI Device: ");
- HAL.DebugWriteLine(pciDevice.VendorID.ToString("x") + ":" + pciDevice.DeviceID.ToString("x"));
+ HAL.DebugWriteLine(configuration.VendorID.ToString("x") + ":" + configuration.DeviceID.ToString("x"));
// It must be set to auto start, or else the device isn't registered in the framework
- deviceService.Initialize(null, device, true, null, hardwareResources, DeviceBusType.PCI);
+ deviceService.Initialize(null, parentDevice, true, configuration, hardwareResources, DeviceBusType.PCI);
return;
}
HAL.DebugWriteLine(" > PCI Device: ");
HAL.DebugWriteLine(driver.Name);
- deviceService.Initialize(driver, device, driver.AutoStart, null, hardwareResources, DeviceBusType.PCI);
+ configuration.EnableDevice();
+ deviceService.Initialize(driver, parentDevice, driver.AutoStart, configuration, hardwareResources, DeviceBusType.PCI);
}
private static bool HasFlag(PCIField list, PCIField match) => (int)(list & match) != 0;
- private static bool IsMatch(PCIDeviceDriverRegistryEntry driver, PCIDevice pciDevice)
+ private static bool IsMatch(PCIDeviceDriverRegistryEntry driver, PCIDeviceConfiguration pciDeviceConfiguration)
{
- if (HasFlag(driver.PCIFields, PCIField.VendorID) && driver.VendorID != pciDevice.VendorID)
+ if (HasFlag(driver.PCIFields, PCIField.VendorID) && driver.VendorID != pciDeviceConfiguration.VendorID)
return false;
- if (HasFlag(driver.PCIFields, PCIField.DeviceID) && driver.DeviceID != pciDevice.DeviceID)
+ if (HasFlag(driver.PCIFields, PCIField.DeviceID) && driver.DeviceID != pciDeviceConfiguration.DeviceID)
return false;
- if (HasFlag(driver.PCIFields, PCIField.SubSystemID) && driver.SubSystemID != pciDevice.SubSystemID)
+ if (HasFlag(driver.PCIFields, PCIField.SubSystemID) && driver.SubSystemID != pciDeviceConfiguration.SubSystemID)
return false;
- if (HasFlag(driver.PCIFields, PCIField.SubSystemVendorID) && driver.SubSystemVendorID != pciDevice.SubSystemVendorID)
+ if (HasFlag(driver.PCIFields, PCIField.SubSystemVendorID) && driver.SubSystemVendorID != pciDeviceConfiguration.SubSystemVendorID)
return false;
- if (HasFlag(driver.PCIFields, PCIField.ClassCode) && driver.ClassCode != pciDevice.ClassCode)
+ if (HasFlag(driver.PCIFields, PCIField.ClassCode) && driver.ClassCode != pciDeviceConfiguration.ClassCode)
return false;
- if (HasFlag(driver.PCIFields, PCIField.SubClassCode) && driver.SubClassCode != pciDevice.SubClassCode)
+ if (HasFlag(driver.PCIFields, PCIField.SubClassCode) && driver.SubClassCode != pciDeviceConfiguration.SubClassCode)
return false;
- if (HasFlag(driver.PCIFields, PCIField.ProgIF) && driver.ProgIF != pciDevice.ProgIF)
+ if (HasFlag(driver.PCIFields, PCIField.ProgIF) && driver.ProgIF != pciDeviceConfiguration.ProgIF)
return false;
- if (HasFlag(driver.PCIFields, PCIField.RevisionID) && driver.RevisionID != pciDevice.RevisionID)
+ if (HasFlag(driver.PCIFields, PCIField.RevisionID) && driver.RevisionID != pciDeviceConfiguration.RevisionID)
return false;
return true;
@@ -136,30 +136,30 @@ private static bool IsMatch(PCIDeviceDriverRegistryEntry driver, PCIDevice pciDe
private static int GetMatchedPriority(PCIDeviceDriverRegistryEntry driver)
{
- var vendorID = HasFlag(driver.PCIFields, PCIField.VendorID);
- var deviceID = HasFlag(driver.PCIFields, PCIField.DeviceID);
- var subSystemID = HasFlag(driver.PCIFields, PCIField.SubSystemID);
- var subSystemVendorID = HasFlag(driver.PCIFields, PCIField.SubSystemVendorID);
+ var vendorId = HasFlag(driver.PCIFields, PCIField.VendorID);
+ var deviceId = HasFlag(driver.PCIFields, PCIField.DeviceID);
+ var subSystemId = HasFlag(driver.PCIFields, PCIField.SubSystemID);
+ var subSystemVendorId = HasFlag(driver.PCIFields, PCIField.SubSystemVendorID);
var classCode = HasFlag(driver.PCIFields, PCIField.ClassCode);
var subClassCode = HasFlag(driver.PCIFields, PCIField.SubClassCode);
- var progIF = HasFlag(driver.PCIFields, PCIField.ProgIF);
- var revisionID = HasFlag(driver.PCIFields, PCIField.RevisionID);
+ var progIf = HasFlag(driver.PCIFields, PCIField.ProgIF);
+ var revisionId = HasFlag(driver.PCIFields, PCIField.RevisionID);
- switch (vendorID)
+ switch (vendorId)
{
- case true when deviceID && classCode && subClassCode && progIF && revisionID: return 1;
- case true when deviceID && classCode && subClassCode && progIF: return 2;
- case true when deviceID && subSystemVendorID && subSystemID && revisionID: return 3;
- case true when deviceID && subSystemVendorID && subSystemID: return 4;
- case true when deviceID && revisionID: return 5;
- case true when deviceID: return 6;
+ case true when deviceId && classCode && subClassCode && progIf && revisionId: return 1;
+ case true when deviceId && classCode && subClassCode && progIf: return 2;
+ case true when deviceId && subSystemVendorId && subSystemId && revisionId: return 3;
+ case true when deviceId && subSystemVendorId && subSystemId: return 4;
+ case true when deviceId && revisionId: return 5;
+ case true when deviceId: return 6;
default:
{
switch (classCode)
{
- case true when subClassCode && progIF && revisionID: return 7;
- case true when subClassCode && progIF: return 8;
- case true when subClassCode && revisionID: return 9;
+ case true when subClassCode && progIf && revisionId: return 7;
+ case true when subClassCode && progIf: return 8;
+ case true when subClassCode && revisionId: return 9;
case true when subClassCode: return 10;
}
break;