1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 using Antmicro.Renode.Core; 8 using Antmicro.Renode.Core.Structure.Registers; 9 using Antmicro.Renode.Logging; 10 using Antmicro.Renode.Utilities; 11 using Antmicro.Renode.Peripherals; 12 using Antmicro.Renode.Peripherals.Bus; 13 14 namespace Antmicro.Renode.Storage.VirtIO 15 { 16 public abstract class VirtIO : BasicDoubleWordPeripheral, IKnownSize 17 { VirtIO(IMachine machine)18 public VirtIO(IMachine machine) : base(machine) {} 19 InterruptUsedBuffer()20 public void InterruptUsedBuffer() 21 { 22 hasUsedBuffer.Value = true; 23 UpdateInterrupts(); 24 } 25 Reset()26 public override void Reset() 27 { 28 // Ready bits in the QueueReady register for all queues in the device 29 base.Reset(); 30 foreach(var vq in Virtqueues) 31 { 32 vq.Reset(); 33 } 34 35 // Clear all bits in InterruptStatus 36 UpdateInterrupts(); 37 } 38 ProcessChain(Virtqueue vqueue)39 public abstract bool ProcessChain(Virtqueue vqueue); 40 UpdateInterrupts()41 protected void UpdateInterrupts() 42 { 43 var newVal = hasUsedBuffer.Value || configHasChanged.Value; 44 this.Log(LogLevel.Debug, "Updating IRQ to {0}", newVal); 45 IRQ.Set(newVal); 46 } 47 48 public Virtqueue[] Virtqueues { set; get; } 49 public uint QueueSel { set; get; } 50 public long Size => 0x150; 51 public GPIO IRQ { get; } = new GPIO(); 52 53 public IBusController SystemBus => sysbus; 54 IsFeatureEnabled(byte feature)55 protected bool IsFeatureEnabled(byte feature) 56 { 57 return BitHelper.IsBitSet(driverFeatureBits, feature); 58 } 59 60 protected uint lastQueueIdx; 61 protected ulong deviceFeatureBits; 62 protected ulong driverFeatureBits; 63 protected IFlagRegisterField deviceStatusAcknowledge; 64 protected IFlagRegisterField deviceStatusDriver; 65 protected IFlagRegisterField deviceStatusDriverOk; 66 protected IFlagRegisterField deviceStatusFeaturesOk; 67 protected IFlagRegisterField deviceStatusNeedsReset; 68 protected IFlagRegisterField deviceStatusFailed; 69 protected IFlagRegisterField deviceFeatureBitsIndex; 70 protected IFlagRegisterField driverFeatureBitsIndex; 71 protected IFlagRegisterField hasUsedBuffer; 72 protected IFlagRegisterField configHasChanged; 73 } 74 } 75