2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/fstub/translate.c
5 * PURPOSE: Interrupt Translator Routines
6 * PROGRAMMERS: Pierre Schweitzer (pierre.schweitzer@reactos.org)
9 /* INCLUDES ******************************************************************/
15 /* PRIVATE FUNCTIONS *********************************************************/
22 FstubTranslatorNull(PVOID Context
)
35 FstubTranslateResource(IN OUT PVOID Context OPTIONAL
,
36 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source
,
37 IN RESOURCE_TRANSLATION_DIRECTION Direction
,
38 IN ULONG AlternativesCount OPTIONAL
,
39 IN IO_RESOURCE_DESCRIPTOR Alternatives
[],
40 IN PDEVICE_OBJECT PhysicalDeviceObject
,
41 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
)
46 ULONG MinimumVector
, Vector
;
47 PIO_RESOURCE_DESCRIPTOR Alternative
;
48 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
51 ASSERT(Source
->Type
== CmResourceTypeInterrupt
);
53 /* Copy common information */
54 Target
->Type
= Source
->Type
;
55 Target
->ShareDisposition
= Source
->ShareDisposition
;
56 Target
->Flags
= Source
->Flags
;
58 if (Direction
== TranslateChildToParent
)
60 /* Get IRQL, affinity & system vector for the device vector */
61 Target
->u
.Interrupt
.Vector
= HalGetInterruptVector((INTERFACE_TYPE
)Context
, 0,
62 Source
->u
.Interrupt
.Vector
,
63 Source
->u
.Interrupt
.Vector
,
65 Target
->u
.Interrupt
.Level
= Irql
;
66 Target
->u
.Interrupt
.Affinity
= Affinity
;
67 Status
= STATUS_TRANSLATION_COMPLETE
;
69 else if (Direction
== TranslateParentToChild
)
71 /* Browse all the resources */
72 for (k
= 0; k
< AlternativesCount
; k
++)
74 Alternative
= &(Alternatives
[k
]);
76 ASSERT(Alternative
->Type
== CmResourceTypeInterrupt
);
78 /* Try to find the device vector, proceeding by trial & error
79 * We try a vector, and translate it
81 MinimumVector
= Alternative
->u
.Interrupt
.MinimumVector
;
82 while (MinimumVector
<= Alternative
->u
.Interrupt
.MaximumVector
)
84 /* Translate the vector */
85 Vector
= HalGetInterruptVector((INTERFACE_TYPE
)Context
, 0,
90 /* If the translated vector is matching the given translated vector */
91 if (Vector
== Source
->u
.Interrupt
.Vector
)
93 /* We are done, send back device vector */
94 Target
->u
.Interrupt
.Affinity
= -1;
95 Target
->u
.Interrupt
.Vector
= MinimumVector
;
96 Target
->u
.Interrupt
.Level
= MinimumVector
;
98 return STATUS_SUCCESS
;
114 FstubTranslateRequirement(IN OUT PVOID Context OPTIONAL
,
115 IN PIO_RESOURCE_DESCRIPTOR Source
,
116 IN PDEVICE_OBJECT PhysicalDeviceObject
,
117 OUT PULONG TargetCount
,
118 OUT PIO_RESOURCE_DESCRIPTOR
*Target
)
124 ASSERT(Source
->Type
== CmResourceTypeInterrupt
);
126 /* Allocate output buffer */
127 *Target
= ExAllocatePoolWithTag(PagedPool
, sizeof(IO_RESOURCE_DESCRIPTOR
), 'btsF');
130 return STATUS_INSUFFICIENT_RESOURCES
;
133 /* Zero & set out count to 1 */
134 RtlZeroMemory(*Target
, sizeof(IO_RESOURCE_DESCRIPTOR
));
137 /* Translate minimum interrupt vector */
138 (*Target
)->u
.Interrupt
.MinimumVector
= HalGetInterruptVector((INTERFACE_TYPE
)Context
, 0,
139 Source
->u
.Interrupt
.MinimumVector
,
140 Source
->u
.Interrupt
.MinimumVector
,
143 /* Translate maximum interrupt vector */
144 (*Target
)->u
.Interrupt
.MaximumVector
= HalGetInterruptVector((INTERFACE_TYPE
)Context
, 0,
145 Source
->u
.Interrupt
.MaximumVector
,
146 Source
->u
.Interrupt
.MaximumVector
,
149 return STATUS_TRANSLATION_COMPLETE
;
157 xHalGetInterruptTranslator(IN INTERFACE_TYPE ParentInterfaceType
,
158 IN ULONG ParentBusNumber
,
159 IN INTERFACE_TYPE BridgeInterfaceType
,
162 OUT PTRANSLATOR_INTERFACE Translator
,
163 OUT PULONG BridgeBusNumber
)
167 ASSERT(Version
== HAL_IRQ_TRANSLATOR_VERSION
);
168 ASSERT(Size
>= sizeof(TRANSLATOR_INTERFACE
));
170 /* Only (E)ISA interfaces are supported */
171 if (BridgeInterfaceType
== Internal
|| BridgeInterfaceType
>= MicroChannel
)
173 return STATUS_NOT_IMPLEMENTED
;
176 /* Fill in output struct */
177 Translator
->Size
= sizeof(TRANSLATOR_INTERFACE
);
178 Translator
->Version
= HAL_IRQ_TRANSLATOR_VERSION
;
179 /* In case caller set interface to undefined, faulty it to ISA */
180 Translator
->Context
= (PVOID
)((BridgeInterfaceType
== InterfaceTypeUndefined
) ? Isa
: BridgeInterfaceType
);
181 Translator
->InterfaceReference
= FstubTranslatorNull
;
182 Translator
->InterfaceDereference
= FstubTranslatorNull
;
183 Translator
->TranslateResources
= FstubTranslateResource
;
184 Translator
->TranslateResourceRequirements
= FstubTranslateRequirement
;
186 return STATUS_SUCCESS
;