Skip to content

Commit

Permalink
PCI framework refactor: part 3 (#1218)
Browse files Browse the repository at this point in the history
* PCI framework refactor: part 3

Signed-off-by: AnErrupTion <[email protected]>

* Code style changes, use string interpolation

Signed-off-by: AnErrupTion <[email protected]>

---------

Signed-off-by: AnErrupTion <[email protected]>
  • Loading branch information
AnErrupTion authored Apr 15, 2024
1 parent eaf6992 commit 3faa11f
Show file tree
Hide file tree
Showing 9 changed files with 99 additions and 158 deletions.
4 changes: 2 additions & 2 deletions Source/Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
Expand Down
24 changes: 12 additions & 12 deletions Source/Mosa.DeviceDriver/ISA/PCIController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
26 changes: 13 additions & 13 deletions Source/Mosa.DeviceDriver/PCI/VirtIO/VirtIODevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
{
Expand All @@ -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)
{
Expand All @@ -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)
{
Expand Down
5 changes: 3 additions & 2 deletions Source/Mosa.DeviceSystem/Framework/BaseDeviceConfiguration.cs
Original file line number Diff line number Diff line change
@@ -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;

/// <summary>
/// The base class for device configurations. See <see cref="DiskDeviceConfiguration"/> and
/// <see cref="DiskPartitionConfiguration"/> for implementations of this class.
/// The base class for device configurations. See <see cref="PCIDeviceConfiguration"/>, <see cref="DiskDeviceConfiguration"/>
/// and <see cref="DiskPartitionConfiguration"/> for implementations of this class.
/// </summary>
public abstract class BaseDeviceConfiguration { }
4 changes: 2 additions & 2 deletions Source/Mosa.DeviceSystem/HardwareAbstraction/HAL.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
12 changes: 6 additions & 6 deletions Source/Mosa.DeviceSystem/PCI/IPCIController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ namespace Mosa.DeviceSystem.PCI;
/// </summary>
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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
/// </summary>
public class PCIDevice : BaseDeviceDriver
public class PCIDeviceConfiguration : BaseDeviceConfiguration
{
#region Properties

Expand All @@ -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; }

Expand Down Expand Up @@ -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);
Expand All @@ -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;

Expand All @@ -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
Expand All @@ -117,42 +111,26 @@ 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<PCICapability>();
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<PCICapability>();
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()
=> CommandRegister = (ushort)(CommandRegister | PCICommand.IOSpaceEnable | PCICommand.BusMasterFunctionEnable | PCICommand.MemorySpaceEnable);

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;
}
Loading

0 comments on commit 3faa11f

Please sign in to comment.