ec2019dfd606dacb05e4c2b7f1dfb6b595b76854
[reactos.git] / hal / halx86 / legacy / bus / sysbus.c
1 /*
2 * PROJECT: ReactOS HAL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: hal/halx86/legacy/bus/sysbus.c
5 * PURPOSE:
6 * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <hal.h>
12 #define NDEBUG
13 #include <debug.h>
14
15 /* GLOBALS ********************************************************************/
16
17 /* PRIVATE FUNCTIONS **********************************************************/
18
19 BOOLEAN
20 NTAPI
21 HalpTranslateSystemBusAddress(IN PBUS_HANDLER BusHandler,
22 IN PBUS_HANDLER RootHandler,
23 IN PHYSICAL_ADDRESS BusAddress,
24 IN OUT PULONG AddressSpace,
25 OUT PPHYSICAL_ADDRESS TranslatedAddress)
26 {
27 PSUPPORTED_RANGE Range = NULL;
28
29 /* Check what kind of address space this is */
30 switch (*AddressSpace)
31 {
32 /* Memory address */
33 case 0:
34
35 /* Loop all prefetch memory */
36 for (Range = &BusHandler->BusAddresses->PrefetchMemory;
37 Range;
38 Range = Range->Next)
39 {
40 /* Check if it's in a valid range */
41 if ((BusAddress.QuadPart >= Range->Base) &&
42 (BusAddress.QuadPart <= Range->Limit))
43 {
44 /* Get out */
45 break;
46 }
47 }
48
49 /* Check if we haven't found anything yet */
50 if (!Range)
51 {
52 /* Loop all bus memory */
53 for (Range = &BusHandler->BusAddresses->Memory;
54 Range;
55 Range = Range->Next)
56 {
57 /* Check if it's in a valid range */
58 if ((BusAddress.QuadPart >= Range->Base) &&
59 (BusAddress.QuadPart <= Range->Limit))
60 {
61 /* Get out */
62 break;
63 }
64 }
65 }
66
67 /* Done */
68 break;
69
70 /* I/O Space */
71 case 1:
72
73 /* Loop all bus I/O memory */
74 for (Range = &BusHandler->BusAddresses->IO;
75 Range;
76 Range = Range->Next)
77 {
78 /* Check if it's in a valid range */
79 if ((BusAddress.QuadPart >= Range->Base) &&
80 (BusAddress.QuadPart <= Range->Limit))
81 {
82 /* Get out */
83 break;
84 }
85 }
86
87 /* Done */
88 break;
89 }
90
91 /* Check if we found a range */
92 if (Range)
93 {
94 /* Do the translation and return the kind of address space this is */
95 TranslatedAddress->QuadPart = BusAddress.QuadPart + Range->SystemBase;
96 if ((TranslatedAddress->QuadPart != BusAddress.QuadPart) ||
97 (*AddressSpace != Range->SystemAddressSpace))
98 {
99 /* Different than what the old HAL would do */
100 DPRINT1("Translation of %I64x is %I64x %s\n",
101 BusAddress.QuadPart, TranslatedAddress->QuadPart,
102 Range->SystemAddressSpace ? "In I/O Space" : "In RAM");
103 }
104 *AddressSpace = Range->SystemAddressSpace;
105 return TRUE;
106 }
107
108 /* Nothing found */
109 DPRINT1("Translation of %I64x failed!\n", BusAddress.QuadPart);
110 return FALSE;
111 }
112
113 ULONG
114 NTAPI
115 HalpGetRootInterruptVector(IN ULONG BusInterruptLevel,
116 IN ULONG BusInterruptVector,
117 OUT PKIRQL Irql,
118 OUT PKAFFINITY Affinity)
119 {
120 UCHAR SystemVector;
121
122 /* Validate the IRQ */
123 if (BusInterruptLevel > 23)
124 {
125 /* Invalid vector */
126 DPRINT1("IRQ %lx is too high!\n", BusInterruptLevel);
127 return 0;
128 }
129
130 /* Get the system vector */
131 SystemVector = HalpIrqToVector((UCHAR)BusInterruptLevel);
132
133 /* Return the IRQL and affinity */
134 *Irql = HalpVectorToIrql(SystemVector);
135 *Affinity = HalpDefaultInterruptAffinity;
136 ASSERT(HalpDefaultInterruptAffinity);
137
138 /* Return the vector */
139 return SystemVector;
140 }
141
142 INIT_FUNCTION
143 ULONG
144 NTAPI
145 HalpGetSystemInterruptVector(IN PBUS_HANDLER BusHandler,
146 IN PBUS_HANDLER RootHandler,
147 IN ULONG BusInterruptLevel,
148 IN ULONG BusInterruptVector,
149 OUT PKIRQL Irql,
150 OUT PKAFFINITY Affinity)
151 {
152 ULONG Vector;
153
154 /* Get the root vector */
155 Vector = HalpGetRootInterruptVector(BusInterruptLevel,
156 BusInterruptVector,
157 Irql,
158 Affinity);
159
160 /* Check if the vector is owned by the HAL and fail if it is */
161 if (HalpIDTUsageFlags[Vector].Flags & IDT_REGISTERED) DPRINT1("Vector %lx is ALREADY IN USE!\n", Vector);
162 return (HalpIDTUsageFlags[Vector].Flags & IDT_REGISTERED) ? 0 : Vector;
163 }
164
165 /* EOF */