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