1 /* 2 * PROJECT: ReactOS Kernel 3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) 4 * PURPOSE: Root arbiters of the PnP manager 5 * COPYRIGHT: Copyright 2020 Vadim Galyant <vgal@rambler.ru> 6 */ 7 8 /* INCLUDES ******************************************************************/ 9 10 #include <ntoskrnl.h> 11 12 #define NDEBUG 13 #include <debug.h> 14 15 /* GLOBALS *******************************************************************/ 16 17 extern ARBITER_INSTANCE IopRootBusNumberArbiter; 18 extern ARBITER_INSTANCE IopRootIrqArbiter; 19 extern ARBITER_INSTANCE IopRootDmaArbiter; 20 extern ARBITER_INSTANCE IopRootMemArbiter; 21 extern ARBITER_INSTANCE IopRootPortArbiter; 22 23 /* DATA **********************************************************************/ 24 25 /* FUNCTIONS *****************************************************************/ 26 27 /* BusNumber arbiter */ 28 29 CODE_SEG("PAGE") 30 NTSTATUS 31 NTAPI 32 IopBusNumberUnpackRequirement( 33 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 34 _Out_ PUINT64 OutMinimumAddress, 35 _Out_ PUINT64 OutMaximumAddress, 36 _Out_ PUINT32 OutLength, 37 _Out_ PUINT32 OutAlignment) 38 { 39 PAGED_CODE(); 40 41 UNIMPLEMENTED; 42 return STATUS_NOT_IMPLEMENTED; 43 } 44 45 CODE_SEG("PAGE") 46 NTSTATUS 47 NTAPI 48 IopBusNumberPackResource( 49 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 50 _In_ UINT64 Start, 51 _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor) 52 { 53 PAGED_CODE(); 54 55 UNIMPLEMENTED; 56 return STATUS_NOT_IMPLEMENTED; 57 } 58 59 CODE_SEG("PAGE") 60 NTSTATUS 61 NTAPI 62 IopBusNumberUnpackResource( 63 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, 64 _Out_ PUINT64 Start, 65 _Out_ PUINT32 Length) 66 { 67 PAGED_CODE(); 68 69 UNIMPLEMENTED; 70 return STATUS_NOT_IMPLEMENTED; 71 } 72 73 CODE_SEG("PAGE") 74 INT32 75 NTAPI 76 IopBusNumberScoreRequirement( 77 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor) 78 { 79 PAGED_CODE(); 80 81 UNIMPLEMENTED; 82 return 0; 83 } 84 85 #define ARB_MAX_BUS_NUMBER 0xFF 86 87 CODE_SEG("PAGE") 88 NTSTATUS 89 NTAPI 90 IopBusNumberInitialize(VOID) 91 { 92 NTSTATUS Status; 93 94 PAGED_CODE(); 95 96 DPRINT("IopRootBusNumberArbiter %p\n", &IopRootBusNumberArbiter); 97 98 IopRootBusNumberArbiter.UnpackRequirement = IopBusNumberUnpackRequirement; 99 IopRootBusNumberArbiter.PackResource = IopBusNumberPackResource; 100 IopRootBusNumberArbiter.UnpackResource = IopBusNumberUnpackResource; 101 IopRootBusNumberArbiter.ScoreRequirement = IopBusNumberScoreRequirement; 102 103 Status = ArbInitializeArbiterInstance(&IopRootBusNumberArbiter, 104 NULL, 105 CmResourceTypeBusNumber, 106 L"RootBusNumber", 107 L"Root", 108 NULL); 109 if (!NT_SUCCESS(Status)) 110 { 111 DPRINT1("IopBusNumberInitialize: Status %p\n", Status); 112 ASSERT(FALSE); 113 return Status; 114 } 115 116 Status = RtlAddRange(IopRootBusNumberArbiter.Allocation, 117 (UINT64)(ARB_MAX_BUS_NUMBER + 1), 118 (UINT64)(-1), 119 0, 120 0, 121 NULL, 122 NULL); 123 124 return Status; 125 } 126 127 /* Irq arbiter */ 128 129 CODE_SEG("PAGE") 130 NTSTATUS 131 NTAPI 132 IopIrqUnpackRequirement( 133 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 134 _Out_ PUINT64 OutMinimumVector, 135 _Out_ PUINT64 OutMaximumVector, 136 _Out_ PUINT32 OutParam1, 137 _Out_ PUINT32 OutParam2) 138 { 139 PAGED_CODE(); 140 141 UNIMPLEMENTED; 142 return STATUS_NOT_IMPLEMENTED; 143 } 144 145 CODE_SEG("PAGE") 146 NTSTATUS 147 NTAPI 148 IopIrqPackResource( 149 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 150 _In_ UINT64 Start, 151 _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor) 152 { 153 PAGED_CODE(); 154 155 UNIMPLEMENTED; 156 return STATUS_NOT_IMPLEMENTED; 157 } 158 159 CODE_SEG("PAGE") 160 NTSTATUS 161 NTAPI 162 IopIrqUnpackResource( 163 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, 164 _Out_ PUINT64 Start, 165 _Out_ PUINT32 OutLength) 166 { 167 PAGED_CODE(); 168 169 UNIMPLEMENTED; 170 return STATUS_NOT_IMPLEMENTED; 171 } 172 173 CODE_SEG("PAGE") 174 INT32 175 NTAPI 176 IopIrqScoreRequirement( 177 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor) 178 { 179 PAGED_CODE(); 180 181 UNIMPLEMENTED; 182 return 0; 183 } 184 185 CODE_SEG("PAGE") 186 NTSTATUS 187 NTAPI 188 IopIrqTranslateOrdering( 189 _Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, 190 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor) 191 { 192 PAGED_CODE(); 193 194 UNIMPLEMENTED; 195 return STATUS_NOT_IMPLEMENTED; 196 } 197 198 CODE_SEG("PAGE") 199 NTSTATUS 200 NTAPI 201 IopIrqInitialize(VOID) 202 { 203 NTSTATUS Status; 204 205 PAGED_CODE(); 206 207 DPRINT("IopRootIrqArbiter %p\n", &IopRootIrqArbiter); 208 209 IopRootIrqArbiter.UnpackRequirement = IopIrqUnpackRequirement; 210 IopRootIrqArbiter.PackResource = IopIrqPackResource; 211 IopRootIrqArbiter.UnpackResource = IopIrqUnpackResource; 212 IopRootIrqArbiter.ScoreRequirement = IopIrqScoreRequirement; 213 214 Status = ArbInitializeArbiterInstance(&IopRootIrqArbiter, 215 NULL, 216 CmResourceTypeInterrupt, 217 L"RootIRQ", 218 L"Root", 219 IopIrqTranslateOrdering); 220 return Status; 221 } 222 223 /* Dma arbiter */ 224 225 CODE_SEG("PAGE") 226 NTSTATUS 227 NTAPI 228 IopDmaUnpackRequirement( 229 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 230 _Out_ PUINT64 OutMinimumChannel, 231 _Out_ PUINT64 OutMaximumChannel, 232 _Out_ PUINT32 OutParam1, 233 _Out_ PUINT32 OutParam2) 234 { 235 PAGED_CODE(); 236 237 UNIMPLEMENTED; 238 return STATUS_NOT_IMPLEMENTED; 239 } 240 241 CODE_SEG("PAGE") 242 NTSTATUS 243 NTAPI 244 IopDmaPackResource( 245 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 246 _In_ UINT64 Start, 247 _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor) 248 { 249 PAGED_CODE(); 250 251 UNIMPLEMENTED; 252 return STATUS_NOT_IMPLEMENTED; 253 } 254 255 CODE_SEG("PAGE") 256 NTSTATUS 257 NTAPI 258 IopDmaUnpackResource( 259 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, 260 _Out_ PUINT64 Start, 261 _Out_ PUINT32 OutLength) 262 { 263 PAGED_CODE(); 264 265 UNIMPLEMENTED; 266 return STATUS_NOT_IMPLEMENTED; 267 } 268 269 CODE_SEG("PAGE") 270 INT32 271 NTAPI 272 IopDmaScoreRequirement( 273 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor) 274 { 275 PAGED_CODE(); 276 277 UNIMPLEMENTED; 278 return 0; 279 } 280 281 CODE_SEG("PAGE") 282 NTSTATUS 283 NTAPI 284 IopDmaOverrideConflict( 285 _In_ PARBITER_INSTANCE Arbiter) 286 { 287 PAGED_CODE(); 288 289 UNIMPLEMENTED; 290 return STATUS_NOT_IMPLEMENTED; 291 } 292 293 CODE_SEG("PAGE") 294 NTSTATUS 295 NTAPI 296 IopDmaInitialize(VOID) 297 { 298 NTSTATUS Status; 299 300 PAGED_CODE(); 301 302 DPRINT("IopRootDmaArbiter %p\n", &IopRootDmaArbiter); 303 304 IopRootDmaArbiter.UnpackRequirement = IopDmaUnpackRequirement; 305 IopRootDmaArbiter.PackResource = IopDmaPackResource; 306 IopRootDmaArbiter.UnpackResource = IopDmaUnpackResource; 307 IopRootDmaArbiter.ScoreRequirement = IopDmaScoreRequirement; 308 309 IopRootDmaArbiter.OverrideConflict = IopDmaOverrideConflict; 310 311 Status = ArbInitializeArbiterInstance(&IopRootDmaArbiter, 312 NULL, 313 CmResourceTypeDma, 314 L"RootDMA", 315 L"Root", 316 NULL); 317 return Status; 318 } 319 320 /* Common for Memory and Port arbiters */ 321 322 CODE_SEG("PAGE") 323 NTSTATUS 324 NTAPI 325 IopGenericUnpackRequirement( 326 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 327 _Out_ PUINT64 OutMinimumAddress, 328 _Out_ PUINT64 OutMaximumAddress, 329 _Out_ PUINT32 OutLength, 330 _Out_ PUINT32 OutAlignment) 331 { 332 PAGED_CODE(); 333 334 UNIMPLEMENTED; 335 return STATUS_NOT_IMPLEMENTED; 336 } 337 338 CODE_SEG("PAGE") 339 NTSTATUS 340 NTAPI 341 IopGenericPackResource( 342 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, 343 _In_ UINT64 Start, 344 _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor) 345 { 346 PAGED_CODE(); 347 348 UNIMPLEMENTED; 349 return STATUS_NOT_IMPLEMENTED; 350 } 351 352 CODE_SEG("PAGE") 353 NTSTATUS 354 NTAPI 355 IopGenericUnpackResource( 356 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, 357 _Out_ PUINT64 Start, 358 _Out_ PUINT32 OutLength) 359 { 360 PAGED_CODE(); 361 362 UNIMPLEMENTED; 363 return STATUS_NOT_IMPLEMENTED; 364 } 365 366 CODE_SEG("PAGE") 367 INT32 368 NTAPI 369 IopGenericScoreRequirement( 370 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor) 371 { 372 PAGED_CODE(); 373 374 UNIMPLEMENTED; 375 return 0; 376 } 377 378 CODE_SEG("PAGE") 379 NTSTATUS 380 NTAPI 381 IopGenericTranslateOrdering( 382 _Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, 383 _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor) 384 { 385 PAGED_CODE(); 386 387 UNIMPLEMENTED; 388 return STATUS_NOT_IMPLEMENTED; 389 } 390 391 /* Memory arbiter */ 392 393 CODE_SEG("PAGE") 394 BOOLEAN 395 NTAPI 396 IopMemFindSuitableRange( 397 _In_ PARBITER_INSTANCE Arbiter, 398 _In_ PARBITER_ALLOCATION_STATE State) 399 { 400 PAGED_CODE(); 401 402 UNIMPLEMENTED; 403 return FALSE; 404 } 405 406 CODE_SEG("PAGE") 407 NTSTATUS 408 NTAPI 409 IopMemInitialize(VOID) 410 { 411 NTSTATUS Status; 412 413 PAGED_CODE(); 414 415 DPRINT("IopRootMemArbiter %p\n", &IopRootMemArbiter); 416 417 IopRootMemArbiter.UnpackRequirement = IopGenericUnpackRequirement; 418 IopRootMemArbiter.PackResource = IopGenericPackResource; 419 IopRootMemArbiter.UnpackResource = IopGenericUnpackResource; 420 IopRootMemArbiter.ScoreRequirement = IopGenericScoreRequirement; 421 422 IopRootMemArbiter.FindSuitableRange = IopMemFindSuitableRange; 423 424 Status = ArbInitializeArbiterInstance(&IopRootMemArbiter, 425 NULL, 426 CmResourceTypeMemory, 427 L"RootMemory", 428 L"Root", 429 IopGenericTranslateOrdering); 430 if (!NT_SUCCESS(Status)) 431 { 432 DPRINT1("IopMemInitialize: Status %p\n", Status); 433 ASSERT(FALSE); 434 return Status; 435 } 436 437 Status = RtlAddRange(IopRootMemArbiter.Allocation, 438 0, 439 (UINT64)(PAGE_SIZE - 1), 440 0, 441 0, 442 NULL, 443 NULL); 444 445 return Status; 446 } 447 448 /* Port arbiter */ 449 450 CODE_SEG("PAGE") 451 BOOLEAN 452 NTAPI 453 IopPortFindSuitableRange( 454 _In_ PARBITER_INSTANCE Arbiter, 455 _In_ PARBITER_ALLOCATION_STATE State) 456 { 457 PAGED_CODE(); 458 459 UNIMPLEMENTED; 460 return FALSE; 461 } 462 463 CODE_SEG("PAGE") 464 VOID 465 NTAPI 466 IopPortAddAllocation( 467 _In_ PARBITER_INSTANCE Arbiter, 468 _In_ PARBITER_ALLOCATION_STATE ArbState) 469 { 470 PAGED_CODE(); 471 472 UNIMPLEMENTED; 473 } 474 475 CODE_SEG("PAGE") 476 VOID 477 NTAPI 478 IopPortBacktrackAllocation( 479 _In_ PARBITER_INSTANCE Arbiter, 480 _Inout_ PARBITER_ALLOCATION_STATE ArbState) 481 { 482 PAGED_CODE(); 483 484 UNIMPLEMENTED; 485 } 486 487 CODE_SEG("PAGE") 488 NTSTATUS 489 NTAPI 490 IopPortInitialize(VOID) 491 { 492 NTSTATUS Status; 493 494 PAGED_CODE(); 495 496 DPRINT("IopRootPortArbiter %p\n", &IopRootPortArbiter); 497 498 IopRootPortArbiter.UnpackRequirement = IopGenericUnpackRequirement; 499 IopRootPortArbiter.PackResource = IopGenericPackResource; 500 IopRootPortArbiter.UnpackResource = IopGenericUnpackResource; 501 IopRootPortArbiter.ScoreRequirement = IopGenericScoreRequirement; 502 503 IopRootPortArbiter.FindSuitableRange = IopPortFindSuitableRange; 504 IopRootPortArbiter.AddAllocation = IopPortAddAllocation; 505 IopRootPortArbiter.BacktrackAllocation = IopPortBacktrackAllocation; 506 507 Status = ArbInitializeArbiterInstance(&IopRootPortArbiter, 508 NULL, 509 CmResourceTypePort, 510 L"RootPort", 511 L"Root", 512 IopGenericTranslateOrdering); 513 return Status; 514 } 515