xref: /reactos/sdk/lib/drivers/arbiter/arbiter.h (revision 09dde2cf)
1 /*
2  * PROJECT:     ReactOS Kernel&Driver SDK
3  * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE:     Hardware Resources Arbiter Library
5  * COPYRIGHT:   Copyright 2020 Vadim Galyant <vgal@rambler.ru>
6  */
7 
8 #pragma once
9 
10 #define ARBITER_SIGNATURE  'sbrA'
11 #define TAG_ARBITER        'MbrA'
12 #define TAG_ARB_ALLOCATION 'AbrA'
13 #define TAG_ARB_RANGE      'RbrA'
14 
15 typedef struct _ARBITER_ORDERING
16 {
17     UINT64 Start;
18     UINT64 End;
19 } ARBITER_ORDERING, *PARBITER_ORDERING;
20 
21 typedef struct _ARBITER_ORDERING_LIST
22 {
23     UINT16 Count;
24     UINT16 Maximum;
25     PARBITER_ORDERING Orderings;
26 } ARBITER_ORDERING_LIST, *PARBITER_ORDERING_LIST;
27 
28 typedef struct _ARBITER_ALTERNATIVE
29 {
30     UINT64 Minimum;
31     UINT64 Maximum;
32     UINT32 Length;
33     UINT32 Alignment;
34     INT32 Priority;
35     UINT32 Flags;
36     PIO_RESOURCE_DESCRIPTOR Descriptor;
37     UINT32 Reserved[3];
38 } ARBITER_ALTERNATIVE, *PARBITER_ALTERNATIVE;
39 
40 typedef struct _ARBITER_ALLOCATION_STATE
41 {
42     UINT64 Start;
43     UINT64 End;
44     UINT64 CurrentMinimum;
45     UINT64 CurrentMaximum;
46     PARBITER_LIST_ENTRY Entry;
47     PARBITER_ALTERNATIVE CurrentAlternative;
48     UINT32 AlternativeCount;
49     PARBITER_ALTERNATIVE Alternatives;
50     UINT16 Flags;
51     UCHAR RangeAttributes;
52     UCHAR RangeAvailableAttributes;
53     ULONG_PTR WorkSpace;
54 } ARBITER_ALLOCATION_STATE, *PARBITER_ALLOCATION_STATE;
55 
56 typedef struct _ARBITER_INSTANCE *PARBITER_INSTANCE;
57 
58 typedef NTSTATUS
59 (NTAPI * PARB_UNPACK_REQUIREMENT)(
60     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
61     _Out_ PUINT64 OutMinimumAddress,
62     _Out_ PUINT64 OutMaximumAddress,
63     _Out_ PUINT32 OutLength,
64     _Out_ PUINT32 OutAlignment
65 );
66 
67 typedef NTSTATUS
68 (NTAPI * PARB_PACK_RESOURCE)(
69     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
70     _In_ UINT64 Start,
71     _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor
72 );
73 
74 typedef NTSTATUS
75 (NTAPI * PARB_UNPACK_RESOURCE)(
76     _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor,
77     _Out_ PUINT64 Start,
78     _Out_ PUINT32 OutLength
79 );
80 
81 typedef INT32
82 (NTAPI * PARB_SCORE_REQUIREMENT)(
83     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor
84 );
85 
86 typedef NTSTATUS
87 (NTAPI * PARB_TEST_ALLOCATION)(
88     _In_ PARBITER_INSTANCE Arbiter,
89     _In_ PLIST_ENTRY ArbitrationList
90 );
91 
92 typedef NTSTATUS
93 (NTAPI * PARB_RETEST_ALLOCATION)(
94     _In_ PARBITER_INSTANCE Arbiter,
95     _In_ PLIST_ENTRY ArbitrationList
96 );
97 
98 typedef NTSTATUS
99 (NTAPI * PARB_COMMIT_ALLOCATION)(
100     _In_ PARBITER_INSTANCE Arbiter
101 );
102 
103 typedef NTSTATUS
104 (NTAPI * PARB_ROLLBACK_ALLOCATION)(
105     _In_ PARBITER_INSTANCE Arbiter
106 );
107 
108 typedef NTSTATUS
109 (NTAPI * PARB_BOOT_ALLOCATION)(
110     _In_ PARBITER_INSTANCE Arbiter,
111     _In_ PLIST_ENTRY ArbitrationList
112 );
113 
114 /*  Not correct yet, FIXME! */
115 typedef NTSTATUS
116 (NTAPI * PARB_QUERY_ARBITRATE)(
117     _In_ PARBITER_INSTANCE Arbiter
118 );
119 
120 /*  Not correct yet, FIXME! */
121 typedef NTSTATUS
122 (NTAPI * PARB_QUERY_CONFLICT)(
123     _In_ PARBITER_INSTANCE Arbiter
124 );
125 
126 /*  Not correct yet, FIXME! */
127 typedef NTSTATUS
128 (NTAPI * PARB_ADD_RESERVED)(
129     _In_ PARBITER_INSTANCE Arbiter
130 );
131 
132 /*  Not correct yet, FIXME! */
133 typedef NTSTATUS
134 (NTAPI * PARB_START_ARBITER)(
135     _In_ PARBITER_INSTANCE Arbiter
136 );
137 
138 typedef NTSTATUS
139 (NTAPI * PARB_PREPROCESS_ENTRY)(
140     _In_ PARBITER_INSTANCE Arbiter,
141     _Inout_ PARBITER_ALLOCATION_STATE ArbState
142 );
143 
144 typedef NTSTATUS
145 (NTAPI * PARB_ALLOCATE_ENTRY)(
146     _In_ PARBITER_INSTANCE Arbiter,
147     _Inout_ PARBITER_ALLOCATION_STATE ArbState
148 );
149 
150 typedef BOOLEAN
151 (NTAPI * PARB_GET_NEXT_ALLOCATION_RANGE)(
152     _In_ PARBITER_INSTANCE Arbiter,
153     _Inout_ PARBITER_ALLOCATION_STATE ArbState
154 );
155 
156 typedef BOOLEAN
157 (NTAPI * PARB_FIND_SUITABLE_RANGE)(
158     _In_ PARBITER_INSTANCE Arbiter,
159     _Inout_ PARBITER_ALLOCATION_STATE ArbState
160 );
161 
162 typedef VOID
163 (NTAPI * PARB_ADD_ALLOCATION)(
164     _In_ PARBITER_INSTANCE Arbiter,
165     _Inout_ PARBITER_ALLOCATION_STATE ArbState
166 );
167 
168 typedef VOID
169 (NTAPI * PARB_BACKTRACK_ALLOCATION)(
170     _In_ PARBITER_INSTANCE Arbiter,
171     _Inout_ PARBITER_ALLOCATION_STATE ArbState
172 );
173 
174 /*  Not correct yet, FIXME! */
175 typedef NTSTATUS
176 (NTAPI * PARB_OVERRIDE_CONFLICT)(
177     _In_ PARBITER_INSTANCE Arbiter
178 );
179 
180 typedef struct _ARBITER_INSTANCE
181 {
182     UINT32 Signature;
183     PKEVENT MutexEvent;
184     PCWSTR Name;
185     CM_RESOURCE_TYPE ResourceType;
186     PRTL_RANGE_LIST Allocation;
187     PRTL_RANGE_LIST PossibleAllocation;
188     ARBITER_ORDERING_LIST OrderingList;
189     ARBITER_ORDERING_LIST ReservedList;
190     INT32 ReferenceCount;
191     PARBITER_INTERFACE Interface;
192     UINT32 AllocationStackMaxSize;
193     PARBITER_ALLOCATION_STATE AllocationStack;
194     PARB_UNPACK_REQUIREMENT UnpackRequirement;
195     PARB_PACK_RESOURCE PackResource;
196     PARB_UNPACK_RESOURCE UnpackResource;
197     PARB_SCORE_REQUIREMENT ScoreRequirement;
198     PARB_TEST_ALLOCATION TestAllocation;
199     PARB_RETEST_ALLOCATION RetestAllocation;
200     PARB_COMMIT_ALLOCATION CommitAllocation;
201     PARB_ROLLBACK_ALLOCATION RollbackAllocation;
202     PARB_BOOT_ALLOCATION BootAllocation;
203     PARB_QUERY_ARBITRATE QueryArbitrate; // Not used yet
204     PARB_QUERY_CONFLICT QueryConflict; // Not used yet
205     PARB_ADD_RESERVED AddReserved; // Not used yet
206     PARB_START_ARBITER StartArbiter; // Not used yet
207     PARB_PREPROCESS_ENTRY PreprocessEntry;
208     PARB_ALLOCATE_ENTRY AllocateEntry;
209     PARB_GET_NEXT_ALLOCATION_RANGE GetNextAllocationRange;
210     PARB_FIND_SUITABLE_RANGE FindSuitableRange;
211     PARB_ADD_ALLOCATION AddAllocation;
212     PARB_BACKTRACK_ALLOCATION BacktrackAllocation;
213     PARB_OVERRIDE_CONFLICT OverrideConflict; // Not used yet
214     BOOLEAN TransactionInProgress;
215     PVOID Extension;
216     PDEVICE_OBJECT BusDeviceObject;
217     PVOID ConflictCallbackContext;
218     PVOID ConflictCallback;
219 } ARBITER_INSTANCE, *PARBITER_INSTANCE;
220 
221 typedef NTSTATUS
222 (NTAPI * PARB_TRANSLATE_ORDERING)(
223     _Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor,
224     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor
225 );
226 
227 CODE_SEG("PAGE")
228 NTSTATUS
229 NTAPI
230 ArbInitializeArbiterInstance(
231     _Inout_ PARBITER_INSTANCE Arbiter,
232     _In_ PDEVICE_OBJECT BusDeviceObject,
233     _In_ CM_RESOURCE_TYPE ResourceType,
234     _In_ PCWSTR ArbiterName,
235     _In_ PCWSTR OrderName,
236     _In_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction
237 );
238