1 //
2 // Copyright (c) 2010-2023 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.Utilities.Packets;
8 
9 namespace Antmicro.Renode.Storage.SCSI.Commands
10 {
11     public enum ModePagePolicy : byte
12     {
13         Shared = 0b00,
14         PerTargetPort = 0b01,
15         Obsolete = 0b10,
16         PerInitiatorTargetNexus = 0b11
17     }
18 
19 #pragma warning disable 649, 169
20     public struct StandardInquiryResponse
21     {
22         [PacketField, Offset(bytes: 0, bits: 0), Width(5)]
23         public byte PeripheralDeviceType;
24         [PacketField, Offset(bytes: 0, bits: 5), Width(3)]
25         public byte PeripheralQualifier;
26         [PacketField, Offset(bytes: 1, bits: 7), Width(1)]
27         public bool RemovableMedium;
28         [PacketField, Offset(bytes: 2)]
29         public byte Version;
30         [PacketField, Offset(bytes: 3, bits: 0), Width(4)]
31         public byte ResponseDataFormat;
32         [PacketField, Offset(bytes: 3, bits: 4), Width(1)]
33         public bool HierarchicalSupport;
34         [PacketField, Offset(bytes: 3, bits: 5), Width(1)]
35         public byte NormalACASupported;
36         [PacketField, Offset(bytes: 4)]
37         public byte AdditionalLength;
38         [PacketField, Offset(bytes: 5, bits: 0), Width(1)]
39         public bool Protect;
40         [PacketField, Offset(bytes: 5, bits: 3), Width(1)]
41         public bool ThirdPartyCopy;
42         [PacketField, Offset(bytes: 5, bits: 4), Width(2)]
43         public byte TargetPortGroupSupport;
44         [PacketField, Offset(bytes: 5, bits: 6), Width(1)]
45         public bool AccessControlsCoordinator;
46         [PacketField, Offset(bytes: 5, bits: 7), Width(1)]
47         public bool StorageControllerComponentSupported;
48         [PacketField, Offset(bytes: 6, bits: 0), Width(1)]
49         public bool ADDR16;
50         [PacketField, Offset(bytes: 6, bits: 4), Width(1)]
51         public bool MultiPort;
52         [PacketField, Offset(bytes: 6, bits: 5), Width(1)]
53         public bool VendorSpecific0;
54         [PacketField, Offset(bytes: 6, bits: 6), Width(1)]
55         public bool EnclosureServices;
56         [PacketField, Offset(bytes: 7, bits: 0), Width(1)]
57         public bool VendorSpecific1;
58         [PacketField, Offset(bytes: 7, bits: 1), Width(1)]
59         public bool CommandQueue;
60         [PacketField, Offset(bytes: 7, bits: 4), Width(1)]
61         public bool Sync;
62         [PacketField, Offset(bytes: 7, bits: 5), Width(1)]
63         public bool WBUS16;
64         [PacketField, Offset(bytes: 8), Width(8)]
65         public byte[] VendorIdentification;
66         [PacketField, Offset(bytes: 16), Width(16)]
67         public byte[] ProductIdentification;
68         [PacketField, Offset(bytes: 32), Width(4)]
69         public byte[] ProductRevisionLevel;
70     }
71 
72     public struct VitalProductDataPageHeader
73     {
74         [PacketField, Offset(bytes: 0, bits: 0), Width(5)]
75         public byte PeripheralDeviceType;
76         [PacketField, Offset(bytes: 0, bits: 5), Width(3)]
77         public byte PeripheralQualifier;
78         [PacketField, Offset(bytes: 1)]
79         public VitalProductDataPageCode PageCode;
80         [PacketField, Offset(bytes: 2)]
81         public ushort PageLength;
82     }
83 
84     public struct ModePagePolicyDescriptor
85     {
86         [PacketField, Offset(bytes: 0, bits: 0), Width(6)]
87         public byte PolicyPageCode;
88         [PacketField, Offset(bytes: 1)]
89         public byte PolicySubpageCode;
90         [PacketField, Offset(bytes: 2, bits: 0), Width(2)]
91         public ModePagePolicy ModePagePolicy;
92         [PacketField, Offset(bytes: 2, bits: 7), Width(1)]
93         public bool MultipleLogicalUnitsShare;
94         [PacketField, Offset(bytes: 4)]
95         private byte Reserved;
96     }
97 
98     public struct ReadCapcity10Result
99     {
100         [PacketField]
101         public uint ReturnedLogicalBlockAddress;
102         [PacketField]
103         public uint BlockLengthInBytes;
104     }
105 
106     public struct ReadCapacity16ParameterData
107     {
108         [PacketField, Offset(bytes: 0)]
109         public ulong ReturnedLogicalBlockAddress;
110         [PacketField, Offset(bytes: 8)]
111         public uint LogicalBlockLengthInBytes;
112         [PacketField, Offset(bytes: 12, bits: 0), Width(1)]
113         public bool ProtectionEnable;
114         [PacketField, Offset(bytes: 12, bits: 1), Width(3)]
115         public byte ProtectionType;
116         [PacketField, Offset(bytes: 13, bits: 0), Width(4)]
117         public byte LogicalBlocksPerPhysicalBlockExponent;
118         [PacketField, Offset(bytes: 13, bits: 4), Width(4)]
119         public byte ProtectionInformationIntervalsExponent;
120         [PacketField, Offset(bytes: 14, bits: 0), Width(6)]
121         public byte LowestAlignedLogicalBlockAddressMSB;
122         [PacketField, Offset(bytes: 14, bits: 6), Width(1)]
123         public bool ThinProvisioningReadZero;
124         [PacketField, Offset(bytes: 14, bits: 7), Width(1)]
125         public bool ThinProvisioningEnable;
126         [PacketField, Offset(bytes: 15)]
127         public byte LowestAlignedLogicalBlockAddressHighLSB;
128         [PacketField, Offset(bytes: 16), Width(16)]
129         private byte[] Reserved;
130     }
131 #pragma warning restore 649, 169
132 }