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.Peripherals.Storage
10 {
11     public enum DataDirection : uint
12     {
13         NoTransfer = 0b00,
14         Out = 0b01,
15         In = 0b10,
16     }
17 
18     public enum CommandType : uint
19     {
20         UFSStorage = 1,
21     }
22 
23     public enum UTPTransferStatus : uint
24     {
25         Success = 0,
26         InvalidCommandTableAttributes = 1,
27         InvalidPRDTAttributes = 2,
28         MismatchDataBufferSize = 3,
29         MismatchResponseUPIUSize = 4,
30         CommunicationFailure = 5,
31         Aborted = 6,
32         HostFatalError = 7,
33         DeviceFatalError = 8,
34         InvalidCryptoConfiguration = 9,
35         GeneralCryptoError = 10,
36         InvalidOCSValue = 15,
37     }
38 
39     public enum UTPTaskManagementStatus : uint
40     {
41         Success = 0,
42         InvalidTaskManagementFunctionAttributes = 1,
43         MismatchTaskManagementRequestSize = 2,
44         MismatchTaskManagementResponseSize = 3,
45         PeerCommunicationFailure = 4,
46         Aborted = 5,
47         HostFatalError = 6,
48         DeviceFatalError = 7,
49         InvalidOCSValue = 15,
50     }
51 
52 #pragma warning disable 649, 169
53     [LeastSignificantByteFirst]
54     public struct UTPTransferRequest
55     {
56         [PacketField, Offset(doubleWords: 0, bits: 0), Width(8)]
57         public byte CryptoConfigurationIndex;
58         [PacketField, Offset(doubleWords: 0, bits: 8), Width(8)]
59         public byte TotalEHSLength;
60         [PacketField, Offset(doubleWords: 0, bits: 23), Width(1)]
61         public bool CryptoEnable;
62         [PacketField, Offset(doubleWords: 0, bits: 24), Width(1)]
63         public bool Interrupt;
64         [PacketField, Offset(doubleWords: 0, bits: 25), Width(2)]
65         public DataDirection DataDirection;
66         [PacketField, Offset(doubleWords: 0, bits: 28), Width(4)]
67         public CommandType CommandType;
68         [PacketField, Offset(doubleWords: 1, bits: 0), Width(32)]
69         public uint DataUnitNumberLower;
70         [PacketField, Offset(doubleWords: 2, bits: 0), Width(8)]
71         public UTPTransferStatus OverallCommandStatus;
72         [PacketField, Offset(doubleWords: 2, bits: 8), Width(8)]
73         public uint CommonDataSize;
74         [PacketField, Offset(doubleWords: 2, bits: 16), Width(16)]
75         public ushort LastDataByteCount;
76         [PacketField, Offset(doubleWords: 3, bits: 0), Width(32)]
77         public uint DataUnitNumberUpper;
78         [PacketField, Offset(doubleWords: 4, bits: 7), Width(25)]
79         public uint UTPCommandDescriptorBaseAddressLower;
80         [PacketField, Offset(doubleWords: 5, bits: 0), Width(32)]
81         public uint UTPCommandDescriptorBaseAddressUpper;
82         [PacketField, Offset(doubleWords: 6, bits: 0), Width(16)]
83         public ushort ResponseUPIULength;
84         [PacketField, Offset(doubleWords: 6, bits: 16), Width(16)]
85         public ushort ResponseUPIUOffset;
86         [PacketField, Offset(doubleWords: 7, bits: 0), Width(16)]
87         public ushort PRDTLength;
88         [PacketField, Offset(doubleWords: 7, bits: 16), Width(16)]
89         public ushort PRDTOffset;
90     }
91 
92     [LeastSignificantByteFirst]
93     public struct UTPTaskManagementRequestHeader
94     {
95         [PacketField, Offset(doubleWords: 0, bits: 24), Width(1)]
96         public bool Interrupt;
97         [PacketField, Offset(doubleWords: 2, bits: 0), Width(8)]
98         public UTPTaskManagementStatus OverallCommandStatus;
99     }
100 
101     [LeastSignificantByteFirst]
102     public struct PRDT4DW
103     {
104         [PacketField, Offset(doubleWords: 0, bits: 2), Width(30)]
105         public uint DataBaseAddress;
106         [PacketField, Offset(doubleWords: 1, bits: 0), Width(32)]
107         public uint DataBaseAddressUpper;
108         [PacketField, Offset(doubleWords: 3, bits: 0), Width(18)]
109         public uint DataByteCount;
110     }
111 
112     [LeastSignificantByteFirst]
113     public struct PRDT2DW
114     {
115         [PacketField, Offset(doubleWords: 0, bits: 2), Width(30)]
116         public uint DataBaseAddress;
117         [PacketField, Offset(doubleWords: 1, bits: 0), Width(32)]
118         public uint DataBaseAddressUpper;
119     }
120 #pragma warning restore 649, 169
121 }