Fix SPARK warning regarding nonvolatile functions
[libxhcidbg.git] / src / hw-dbc-trbs.ads
1 --
2 -- Copyright (C) 2016-2017 secunet Security Networks AG
3 --
4 -- This program is free software; you can redistribute it and/or modify
5 -- it under the terms of the GNU General Public License as published by
6 -- the Free Software Foundation; either version 2 of the License, or
7 -- (at your option) any later version.
8 --
9 -- This program is distributed in the hope that it will be useful,
10 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 -- GNU General Public License for more details.
13 --
14
15 private package HW.DbC.TRBs is
16
17    TRB_Size : constant := 16;
18    type T is limited private;
19
20    ----------------------------------------------------------------------------
21
22    TRBs_Per_Ring : constant := 2 ** 6;
23    Ring_Size     : constant := TRBs_Per_Ring * TRB_Size;
24    type Ring_Range is mod TRBs_Per_Ring;
25
26    type Transfer_Ring is array (Ring_Range) of T
27    with
28       Pack,
29       Volatile,
30       Alignment => Ring_Size;
31    --  Use size for alignment:
32    --  It always fullfills page crossing requirements.
33
34    ----------------------------------------------------------------------------
35
36    type Transfer_Type is mod 2 ** 2;
37    No_Data_Stage                       : constant Transfer_Type := 0;
38    OUT_Data_Stage                      : constant Transfer_Type := 2;
39    IN_Data_Stage                       : constant Transfer_Type := 3;
40
41    type Direction is mod 2 ** 1;
42    Dir_OUT                             : constant Direction := 0;
43    Dir_IN                              : constant Direction := 1;
44
45    type TRB_Types is mod 2 ** 6;
46    Empty                               : constant TRB_Types := 0;
47    Normal                              : constant TRB_Types := 1;
48    Setup_Stage                         : constant TRB_Types := 2;
49    Data_Stage                          : constant TRB_Types := 3;
50    Status_Stage                        : constant TRB_Types := 4;
51    Isoch                               : constant TRB_Types := 5;
52    Link                                : constant TRB_Types := 6;
53    Event_Data                          : constant TRB_Types := 7;
54    NoOp                                : constant TRB_Types := 8;
55    Enable_Slot_Command                 : constant TRB_Types := 9;
56    Disable_Slot_Command                : constant TRB_Types := 10;
57    Address_Device_Command              : constant TRB_Types := 11;
58    Configure_Endpoint_Command          : constant TRB_Types := 12;
59    Evaluate_Context_Command            : constant TRB_Types := 13;
60    Reset_Endpoint_Command              : constant TRB_Types := 14;
61    Stop_Endpoint_Command               : constant TRB_Types := 15;
62    Set_TR_Dequeue_Pointer_Command      : constant TRB_Types := 16;
63    Reset_Device_Command                : constant TRB_Types := 17;
64    Force_Event_Command                 : constant TRB_Types := 18;
65    Negotiate_Bandwidth_Command         : constant TRB_Types := 19;
66    Set_Latency_Tolerance_Value_Command : constant TRB_Types := 20;
67    Get_Port_Bandwidth_Command          : constant TRB_Types := 21;
68    Force_Header_Command                : constant TRB_Types := 22;
69    NoOp_Command                        : constant TRB_Types := 23;
70    Transfer_Event                      : constant TRB_Types := 32;
71    Command_Completion_Event            : constant TRB_Types := 33;
72    Port_Status_Change_Event            : constant TRB_Types := 34;
73    Bandwidth_Request_Event             : constant TRB_Types := 35;
74    Doorbell_Event                      : constant TRB_Types := 36;
75    Host_Controller_Event               : constant TRB_Types := 37;
76    Device_Notification_Event           : constant TRB_Types := 38;
77    MFINDEX_Wrap_Event                  : constant TRB_Types := 39;
78    NEC_Firmware_Request_Event          : constant TRB_Types := 48;
79    NEC_Firmware_Request_Command        : constant TRB_Types := 49;
80
81    type Completion_Code is mod 2 ** 8;
82    Invalid                          : constant Completion_Code := 0;
83    Success                          : constant Completion_Code := 1;
84    Data_Buffer_Error                : constant Completion_Code := 2;
85    Babble_Detected_Error            : constant Completion_Code := 3;
86    USB_Transaction_Error            : constant Completion_Code := 4;
87    TRB_Error                        : constant Completion_Code := 5;
88    Stall_Error                      : constant Completion_Code := 6;
89    Resource_Error                   : constant Completion_Code := 7;
90    Bandwidth_Error                  : constant Completion_Code := 8;
91    No_Slots_Available_Error         : constant Completion_Code := 9;
92    Invalid_Stream_Type_Error        : constant Completion_Code := 10;
93    Slot_Not_Enabled_Error           : constant Completion_Code := 11;
94    Endpoint_Not_Enabled_Error       : constant Completion_Code := 12;
95    Short_Packet                     : constant Completion_Code := 13;
96    Ring_Underrun                    : constant Completion_Code := 14;
97    Ring_Overrun                     : constant Completion_Code := 15;
98    VF_Event_Ring_Full_Error         : constant Completion_Code := 16;
99    Parameter_Error                  : constant Completion_Code := 17;
100    Bandwidth_Overrun_Error          : constant Completion_Code := 18;
101    Context_State_Error              : constant Completion_Code := 19;
102    No_Ping_Response_Error           : constant Completion_Code := 20;
103    Event_Ring_Full_Error            : constant Completion_Code := 21;
104    Incompatible_Device_Error        : constant Completion_Code := 22;
105    Missed_Service_Error             : constant Completion_Code := 23;
106    Command_Ring_Stopped             : constant Completion_Code := 24;
107    Command_Aborted                  : constant Completion_Code := 25;
108    Stopped                          : constant Completion_Code := 26;
109    Stopped_Length_Invalid           : constant Completion_Code := 27;
110    Max_Exit_Latency_Too_Large_Error : constant Completion_Code := 29;
111    Isoch_Buffer_Overrun             : constant Completion_Code := 31;
112    Event_Lost_Error                 : constant Completion_Code := 32;
113    Undefined_Error                  : constant Completion_Code := 33;
114    Invalid_Stream_ID_Error          : constant Completion_Code := 34;
115    Secondary_Bandwidth_Error        : constant Completion_Code := 35;
116    Split_Transaction_Error          : constant Completion_Code := 36;
117    function CC_To_Usb_Error (CC : Completion_Code) return Error;
118
119    ----------------------------------------------------------------------------
120
121    procedure Set_Length (Data : in out T; Length : in Natural);
122    procedure Get_Event_Length (Data : in T; Length : out Natural);
123
124    procedure Get_Completion_Code (Data : in T; Code : out Completion_Code);
125
126    procedure Set_Cycle (Data : in out T; Cycle : in Bit);
127    procedure Get_Cycle (Data : in T; Cycle : out Bit);
128    procedure Set_ISP (Data : in out T);
129    procedure Set_IOC (Data : in out T);
130
131    procedure Set_Type (Data : in out T; TRB_Type : in TRB_Types);
132    procedure Get_Type (Data : in T; TRB_Type : out TRB_Types);
133
134    procedure Get_Endpoint_ID (Data : in T; Endpoint_ID : out Natural);
135    procedure Get_Slot_ID (Data : in T; Slot_ID : out Word8);
136
137    procedure Set_Parameter (Data : in out T; Parameter : Word64);
138    procedure Get_Parameter (Data : in T; Parameter : out Word64);
139
140    procedure Clear (TR : out T; PCS : in Bit);
141    procedure Clear_Ring (TR : out Transfer_Ring; PCS : in Bit);
142    procedure Init_Cycle_Ring
143      (Ring     :    out Transfer_Ring;
144       Physical : in     Word64);
145
146 private
147
148    type T is record
149       Parameter : Word64;
150       Status    : Word32;
151       Control   : Word32;
152    end record
153    with
154       Pack,
155       Volatile,
156       Alignment => Natural'Max (16, TRB_Size);
157
158 end HW.DbC.TRBs;
159
160 --  vim: set ts=8 sts=3 sw=3 et: