Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentranslate.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Kernel 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: ntoskrnl/fstub/translate.c 00005 * PURPOSE: Interrupt Translator Routines 00006 * PROGRAMMERS: Pierre Schweitzer (pierre.schweitzer@reactos.org) 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 #include <ntoskrnl.h> 00012 #define NDEBUG 00013 #include <debug.h> 00014 00015 /* PRIVATE FUNCTIONS *********************************************************/ 00016 00017 /* 00018 * @implemented 00019 */ 00020 VOID 00021 NTAPI 00022 FstubTranslatorNull(PVOID Context) 00023 { 00024 PAGED_CODE(); 00025 00026 /* Do nothing */ 00027 return; 00028 } 00029 00030 /* 00031 * @implemented 00032 */ 00033 NTSTATUS 00034 NTAPI 00035 FstubTranslateResource(IN OUT PVOID Context OPTIONAL, 00036 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, 00037 IN RESOURCE_TRANSLATION_DIRECTION Direction, 00038 IN ULONG AlternativesCount OPTIONAL, 00039 IN IO_RESOURCE_DESCRIPTOR Alternatives[], 00040 IN PDEVICE_OBJECT PhysicalDeviceObject, 00041 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target) 00042 { 00043 KIRQL Irql; 00044 KAFFINITY Affinity; 00045 ULONG MinimumVector, Vector, k; 00046 PIO_RESOURCE_DESCRIPTOR Alternative; 00047 NTSTATUS Status = STATUS_UNSUCCESSFUL; 00048 PAGED_CODE(); 00049 00050 ASSERT(Source->Type == CmResourceTypeInterrupt); 00051 00052 /* Copy common information */ 00053 Target->Type = Source->Type; 00054 Target->ShareDisposition = Source->ShareDisposition; 00055 Target->Flags = Source->Flags; 00056 00057 if (Direction == TranslateChildToParent) 00058 { 00059 /* Get IRQL, affinity & system vector for the device vector */ 00060 Target->u.Interrupt.Vector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, 00061 Source->u.Interrupt.Vector, 00062 Source->u.Interrupt.Vector, 00063 &Irql, &Affinity); 00064 Target->u.Interrupt.Level = Irql; 00065 Target->u.Interrupt.Affinity = Affinity; 00066 Status = STATUS_TRANSLATION_COMPLETE; 00067 } 00068 else if (Direction == TranslateParentToChild) 00069 { 00070 /* Browse all the resources */ 00071 for (k = 0; k < AlternativesCount; k++) 00072 { 00073 Alternative = &(Alternatives[k]); 00074 00075 ASSERT(Alternative->Type == CmResourceTypeInterrupt); 00076 00077 /* Try to find the device vector, proceeding by trial & error 00078 * We try a vector, and translate it 00079 */ 00080 MinimumVector = Alternative->u.Interrupt.MinimumVector; 00081 while (MinimumVector <= Alternative->u.Interrupt.MaximumVector) 00082 { 00083 /* Translate the vector */ 00084 Vector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, 00085 MinimumVector, 00086 MinimumVector, 00087 &Irql, &Affinity); 00088 00089 /* If the translated vector is matching the given translated vector */ 00090 if (Vector == Source->u.Interrupt.Vector) 00091 { 00092 /* We are done, send back device vector */ 00093 Target->u.Interrupt.Affinity = -1; 00094 Target->u.Interrupt.Vector = MinimumVector; 00095 Target->u.Interrupt.Level = MinimumVector; 00096 00097 return STATUS_SUCCESS; 00098 } 00099 00100 MinimumVector++; 00101 } 00102 } 00103 } 00104 00105 return Status; 00106 } 00107 00108 /* 00109 * @implemented 00110 */ 00111 NTSTATUS 00112 NTAPI 00113 FstubTranslateRequirement(IN OUT PVOID Context OPTIONAL, 00114 IN PIO_RESOURCE_DESCRIPTOR Source, 00115 IN PDEVICE_OBJECT PhysicalDeviceObject, 00116 OUT PULONG TargetCount, 00117 OUT PIO_RESOURCE_DESCRIPTOR *Target) 00118 { 00119 KIRQL Irql; 00120 KAFFINITY Affinity; 00121 PAGED_CODE(); 00122 00123 ASSERT(Source->Type == CmResourceTypeInterrupt); 00124 00125 /* Allocate output buffer */ 00126 *Target = ExAllocatePoolWithTag(PagedPool, sizeof(IO_RESOURCE_DESCRIPTOR), 'btsF'); 00127 if (!*Target) 00128 { 00129 return STATUS_INSUFFICIENT_RESOURCES; 00130 } 00131 00132 /* Zero & set out count to 1 */ 00133 RtlZeroMemory(*Target, sizeof(IO_RESOURCE_DESCRIPTOR)); 00134 *TargetCount = 1; 00135 00136 /* Translate minimum interrupt vector */ 00137 (*Target)->u.Interrupt.MinimumVector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, 00138 Source->u.Interrupt.MinimumVector, 00139 Source->u.Interrupt.MinimumVector, 00140 &Irql, &Affinity); 00141 00142 /* Translate maximum interrupt vector */ 00143 (*Target)->u.Interrupt.MaximumVector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, 00144 Source->u.Interrupt.MaximumVector, 00145 Source->u.Interrupt.MaximumVector, 00146 &Irql, &Affinity); 00147 00148 return STATUS_TRANSLATION_COMPLETE; 00149 } 00150 00151 /* 00152 * @implemented 00153 */ 00154 NTSTATUS 00155 NTAPI 00156 xHalGetInterruptTranslator(IN INTERFACE_TYPE ParentInterfaceType, 00157 IN ULONG ParentBusNumber, 00158 IN INTERFACE_TYPE BridgeInterfaceType, 00159 IN USHORT Size, 00160 IN USHORT Version, 00161 OUT PTRANSLATOR_INTERFACE Translator, 00162 OUT PULONG BridgeBusNumber) 00163 { 00164 PAGED_CODE(); 00165 00166 ASSERT(Version == HAL_IRQ_TRANSLATOR_VERSION); 00167 ASSERT(Size >= sizeof(TRANSLATOR_INTERFACE)); 00168 00169 /* Only (E)ISA interfaces are supported */ 00170 if (BridgeInterfaceType == Internal || BridgeInterfaceType >= MicroChannel) 00171 { 00172 return STATUS_NOT_IMPLEMENTED; 00173 } 00174 00175 /* Fill in output struct */ 00176 Translator->Size = sizeof(TRANSLATOR_INTERFACE); 00177 Translator->Version = HAL_IRQ_TRANSLATOR_VERSION; 00178 /* In case caller set interface to undefined, faulty it to ISA */ 00179 Translator->Context = (PVOID)((BridgeInterfaceType == InterfaceTypeUndefined) ? Isa : BridgeInterfaceType); 00180 Translator->InterfaceReference = FstubTranslatorNull; 00181 Translator->InterfaceDereference = FstubTranslatorNull; 00182 Translator->TranslateResources = FstubTranslateResource; 00183 Translator->TranslateResourceRequirements = FstubTranslateRequirement; 00184 00185 return STATUS_SUCCESS; 00186 } Generated on Sun May 27 2012 04:37:12 for ReactOS by
1.7.6.1
|