Tighten representation of DbC context type
[libxhcidbg.git] / src / hw-dbc-contexts.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.Contexts
16 is
17
18    Context_Size : constant := 64;
19
20    Endpoint_Context_Alignment : constant := 32;
21
22    ----------------------------------------------------------------------------
23
24    type DbC_Info_Context is record
25       String_0_Address             : Word64;
26       Manufacturer_String_Address  : Word64;
27       Product_String_Address       : Word64;
28       Serial_Number_String_Address : Word64;
29       String_0_Length              : Word8;
30       Manufacturer_String_Length   : Word8;
31       Product_String_Length        : Word8;
32       Serial_Number_String_Length  : Word8;
33       Reserved_Z                   : Word32;
34       Reserved_Z_2                 : Word64;
35       Reserved_Z_3                 : Word64;
36       Reserved_Z_4                 : Word64;
37    end record
38    with
39       Volatile,
40       Size      => Context_Size * 8,
41       Alignment => Context_Size;
42
43    ----------------------------------------------------------------------------
44
45    type Endpoint_State is (
46       Disabled,
47       Running,
48       Halted,
49       Stopped,
50       Error,
51       Reserved1,
52       Reserved2,
53       Reserved3)
54    with Size => 3;
55    for Endpoint_State use
56      (Disabled  => 0,
57       Running   => 1,
58       Halted    => 2,
59       Stopped   => 3,
60       Error     => 4,
61       Reserved1 => 5,
62       Reserved2 => 6,
63       Reserved3 => 7);
64
65    type Endpoint_Type is (
66       NA,
67       Isoch_O,
68       Bulk_O,
69       Interrupt_O,
70       Control,
71       Isoch_I,
72       Bulk_I,
73       Interrupt_I)
74    with Size => 3;
75    for Endpoint_Type use
76      (NA          => 0,
77       Isoch_O     => 1,
78       Bulk_O      => 2,
79       Interrupt_O => 3,
80       Control     => 4,
81       Isoch_I     => 5,
82       Bulk_I      => 6,
83       Interrupt_I => 7);
84
85    pragma Warnings (Off, "* bits of * unused");
86    type Endpoint_Context is record
87       EP_State              : Endpoint_State;
88       Reserved_Z            : Word5;
89       Mult                  : Word2;
90       Max_P_Streams         : Word5;
91       Linear_Stream_Array   : Bit;
92       Interval              : Word8;
93       Reserved_Z_2          : Word8;
94       Reserved_Z_3          : Bit;
95       Error_Count           : Word2;
96       EP_Type               : Endpoint_Type;
97       Reserved_Z_4          : Bit;
98       Host_Initiate_Disable : Bit;
99       Max_Burst_Size        : Word8;
100       Max_Packet_Size       : Word16;
101       Dequeue_Cycle_State   : Bit;
102       Reserved_Z_5          : Word3;
103       TR_Dequeue_Pointer_Lo : Word28;
104       TR_Dequeue_Pointer_Hi : Word32;
105       Average_TRB_Length    : Word16;
106       Max_ESIT_Payload      : Word16;
107       reserved1             : Word32;
108       reserved2             : Word32;
109       reserved3             : Word32;
110    end record
111    with
112       Volatile,
113       Size      => Context_Size * 8,
114       Alignment => Endpoint_Context_Alignment;
115    for Endpoint_Context use record
116       EP_State              at 16#00# range 0 .. 2;
117       Reserved_Z            at 16#00# range 3 .. 7;
118       Mult                  at 16#00# range 8 .. 9;
119       Max_P_Streams         at 16#00# range 10 .. 14;
120       Linear_Stream_Array   at 16#00# range 15 .. 15;
121       Interval              at 16#00# range 16 .. 23;
122       Reserved_Z_2          at 16#00# range 24 .. 31;
123       Reserved_Z_3          at 16#04# range 0 .. 0;
124       Error_Count           at 16#04# range 1 .. 2;
125       EP_Type               at 16#04# range 3 .. 5;
126       Reserved_Z_4          at 16#04# range 6 .. 6;
127       Host_Initiate_Disable at 16#04# range 7 .. 7;
128       Max_Burst_Size        at 16#04# range 8 .. 15;
129       Max_Packet_Size       at 16#04# range 16 .. 31;
130       Dequeue_Cycle_State   at 16#08# range 0 .. 0;
131       Reserved_Z_5          at 16#08# range 1 .. 3;
132       TR_Dequeue_Pointer_Lo at 16#08# range 4 .. 31;
133       TR_Dequeue_Pointer_Hi at 16#0c# range 0 .. 31;
134       Average_TRB_Length    at 16#10# range 0 .. 15;
135       Max_ESIT_Payload      at 16#10# range 16 .. 31;
136       reserved1             at 16#14# range 0 .. 31;
137       reserved2             at 16#18# range 0 .. 31;
138       reserved3             at 16#1c# range 0 .. 31;
139    end record;
140    pragma Warnings (On, "* bits of * unused");
141
142    ----------------------------------------------------------------------------
143
144    --  See "eXtensible Host Controller Interface for Universal Serial Bus"
145    --  revision 1.1, section 7.6.9, figure 120.
146    type DbC_Context is record
147       DbC_Info : DbC_Info_Context;
148       OUT_EP   : Endpoint_Context;
149       IN_EP    : Endpoint_Context;
150    end record
151    with
152       Volatile,
153       Alignment => Context_Size;
154    -- Use size for alignment:
155    -- It always fullfills page crossing requirements.
156
157    for DbC_Context use record
158       DbC_Info at 16#00# range 0 .. Context_Size * 8 - 1;
159       OUT_EP   at 16#40# range 0 .. Context_Size * 8 - 1;
160       IN_EP    at 16#80# range 0 .. Context_Size * 8 - 1;
161    end record;
162
163    -----------------------------------------------------------------------
164
165    procedure Clear_DbC_Context (Context : out DbC_Context);
166
167    procedure Dump_Endpoint_Context (EC : in Endpoint_Context);
168
169 end HW.DbC.Contexts;
170
171 --  vim: set ts=8 sts=3 sw=3 et: