2 -- Copyright (C) 2016-2017 secunet Security Networks AG
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.
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.
15 private package HW.DbC.TRBs is
17 TRB_Size : constant := 16;
18 type T is limited private;
20 ----------------------------------------------------------------------------
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;
26 type Transfer_Ring is array (Ring_Range) of T
30 Alignment => Ring_Size;
31 -- Use size for alignment:
32 -- It always fullfills page crossing requirements.
34 ----------------------------------------------------------------------------
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;
41 type Direction is mod 2 ** 1;
42 Dir_OUT : constant Direction := 0;
43 Dir_IN : constant Direction := 1;
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;
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;
119 ----------------------------------------------------------------------------
121 procedure Set_Length (Data : in out T; Length : in Natural);
122 procedure Get_Event_Length (Data : in T; Length : out Natural);
124 procedure Get_Completion_Code (Data : in T; Code : out Completion_Code);
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);
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);
134 procedure Get_Endpoint_ID (Data : in T; Endpoint_ID : out Natural);
135 procedure Get_Slot_ID (Data : in T; Slot_ID : out Word8);
137 procedure Set_Parameter (Data : in out T; Parameter : Word64);
138 procedure Get_Parameter (Data : in T; Parameter : out Word64);
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);
156 Alignment => Natural'Max (16, TRB_Size);
160 -- vim: set ts=8 sts=3 sw=3 et: