source: GPL/branches/uniaud32-2.1.x/drv32/rmhelp.cpp@ 548

Last change on this file since 548 was 548, checked in by David Azarewicz, 14 years ago

APIC interrupt fixes from trunk

File size: 12.4 KB
Line 
1/*
2 * Resource manager helper functions
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
8 *
9 */
10
11#define INCL_NOPMAPI
12#define INCL_DOSINFOSEG
13#include <os2.h>
14
15#include <devhelp.h>
16#include <devinfo.h>
17
18#include <rmbase.h> // Resource manager definitions.
19#include "rmcalls.h"
20#include <rmioctl.h>
21
22#include <version.h>
23#include <dbgos2.h>
24#include <unicard.h>
25#include <osspci.h>
26#include <ossidc32.h>
27#include "pciids.h"
28
29#include <string.h>
30
31
32#define MAX_RESHANDLES 16
33
34//******************************************************************************
35//******************************************************************************
36
37PFN RM_Help;
38PFN RM_Help0;
39PFN RM_Help3;
40ULONG RMFlags;
41
42static HDRIVER DriverHandle = (HDRIVER)-1;
43static HDEVICE DeviceHandle = 0;
44static HADAPTER AdapterHandle = 0;
45static ULONG ctResHandles = 0;
46static HRESOURCE arResHandles[MAX_RESHANDLES];
47
48
49//******************************************************************************
50//******************************************************************************
51VOID RMInit(VOID)
52{
53 APIRET rc;
54 HDRIVER hDriver;
55 DRIVERSTRUCT DriverStruct;
56 char DriverName[sizeof(RM_DRIVER_NAME)];
57 char VendorName[sizeof(RM_DRIVER_VENDORNAME)];
58 char DriverDesc[sizeof(RM_DRIVER_DESCRIPTION)];
59
60 if( DriverHandle == (HDRIVER)-1 )
61 {
62 memset( (PVOID) &DriverStruct, 0, sizeof(DriverStruct) );
63
64 //copy strings to stack, because we need to give RM 16:16 pointers
65 //(which can only be (easily) generated from 32 bits stack addresses)
66 strcpy(DriverName, RM_DRIVER_NAME);
67 strcpy(VendorName, RM_DRIVER_VENDORNAME);
68 strcpy(DriverDesc, RM_DRIVER_DESCRIPTION);
69
70 DriverStruct.DrvrName = FlatToSel((ULONG)DriverName); /* ### IHV */
71 DriverStruct.DrvrDescript = FlatToSel((ULONG)DriverDesc); /* ### IHV */
72 DriverStruct.VendorName = FlatToSel((ULONG)VendorName); /* ### IHV */
73 DriverStruct.MajorVer = CMVERSION_MAJOR; //rmbase.h /* ### IHV */
74 DriverStruct.MinorVer = CMVERSION_MINOR; //rmbase.h /* ### IHV */
75 DriverStruct.Date.Year = RM_DRIVER_BUILDYEAR; /* ### IHV */
76 DriverStruct.Date.Month = RM_DRIVER_BUILDMONTH; /* ### IHV */
77 DriverStruct.Date.Day = RM_DRIVER_BUILDDAY; /* ### IHV */
78 DriverStruct.DrvrType = DRT_AUDIO;
79 DriverStruct.DrvrSubType = 0;
80 DriverStruct.DrvrCallback = NULL;
81
82 rc = RMCreateDriver( FlatToSel((ULONG)&DriverStruct), FlatToSel((ULONG)&hDriver) );
83
84 if( rc == RMRC_SUCCESS ) DriverHandle = hDriver;
85 dprintf(("RMCreateDriver rc=%d DriverHandle=%x", rc, DriverHandle));
86 }
87
88 while( ctResHandles )
89 RMDeallocResource(DriverHandle, arResHandles[--ctResHandles]);
90}
91
92
93//******************************************************************************
94//******************************************************************************
95BOOL RMRequestIO(ULONG ulIOBase, ULONG ulIOLength)
96{
97 RESOURCESTRUCT Resource;
98 HRESOURCE hres;
99 APIRET rc;
100
101 Resource.ResourceType = RS_TYPE_IO;
102 Resource.IOResource.BaseIOPort = (USHORT)ulIOBase;
103 Resource.IOResource.NumIOPorts = (USHORT)ulIOLength;
104 Resource.IOResource.IOFlags = RS_IO_EXCLUSIVE;
105 Resource.IOResource.IOAddressLines = ( ulIOBase > 0x3ff ) ? 16 : 10;
106
107 rc = RMAllocResource(DriverHandle, // Handle to driver.
108 FlatToSel((ULONG)&hres), // OUT: "allocated" resource node handle
109 FlatToSel((ULONG)&Resource)); // Resource to allocate.
110
111 if( rc == 0 && ctResHandles < MAX_RESHANDLES )
112 {
113 arResHandles[ctResHandles++] = hres; return TRUE;
114 }
115
116 dprintf(("RMAllocResource[%d] IO rc = %d", ctResHandles, rc));
117
118 return FALSE;
119}
120
121
122//******************************************************************************
123//******************************************************************************
124BOOL RMRequestMem(ULONG ulMemBase, ULONG ulMemLength)
125{
126 RESOURCESTRUCT Resource;
127 HRESOURCE hres;
128 APIRET rc;
129
130 Resource.ResourceType = RS_TYPE_MEM;
131 Resource.MEMResource.MemBase = ulMemBase;
132 Resource.MEMResource.MemSize = ulMemLength;
133 Resource.MEMResource.MemFlags = RS_MEM_EXCLUSIVE;
134
135 rc = RMAllocResource(DriverHandle, // Handle to driver.
136 FlatToSel((ULONG)&hres), // OUT: "allocated" resource node handle
137 FlatToSel((ULONG)&Resource)); // Resource to allocate.
138
139 if( rc == 0 && ctResHandles < MAX_RESHANDLES )
140 {
141 arResHandles[ctResHandles++] = hres; return TRUE;
142 }
143
144 dprintf(("RMAllocResource[%d] MEM rc = %d", ctResHandles, rc));
145
146 return rc == 0;
147}
148
149
150//******************************************************************************
151//******************************************************************************
152BOOL RMRequestIRQ(ULONG ulIrq, BOOL fShared, PHRESOURCE phRes)
153{
154 RESOURCESTRUCT Resource;
155 HRESOURCE hRes;
156 APIRET rc;
157
158 Resource.ResourceType = RS_TYPE_IRQ;
159 Resource.IRQResource.IRQLevel = (USHORT)ulIrq & 0xff;
160 Resource.IRQResource.PCIIrqPin = 0;
161 Resource.IRQResource.IRQFlags = ( fShared ) ? RS_IRQ_SHARED : RS_IRQ_EXCLUSIVE;
162
163 rc = RMAllocResource(DriverHandle, // Handle to driver.
164 FlatToSel((ULONG)&hRes), // OUT: "allocated" resource node handle
165 FlatToSel((ULONG)&Resource)); // Resource to allocate.
166
167
168 if (rc == 0) {
169 *phRes = hRes;
170 if (DeviceHandle) {
171 dprintf(("RMRequestIRQ: DriverHandle=%x DeviceHandle=%x hRes=%x", DriverHandle, DeviceHandle, hRes));
172 rc = RMModifyResources(DriverHandle, DeviceHandle, RM_MODIFY_ADD, hRes);
173 } else {
174 if (ctResHandles < MAX_RESHANDLES ) arResHandles[ctResHandles++] = hRes;
175 }
176 }
177
178 dprintf(("RMAllocResource[%d] IRQ=%d rc=%d", ctResHandles, ulIrq, rc));
179
180 return rc == 0;
181}
182
183//******************************************************************************
184//******************************************************************************
185BOOL RMDeallocateIRQ(HRESOURCE hRes)
186{
187 APIRET rc;
188
189 dprintf(("RMDeallocateIRQ: DriverHandle=%x DeviceHandle=%x hRes=%x", DriverHandle, DeviceHandle, hRes));
190 rc = RMModifyResources(DriverHandle, DeviceHandle, RM_MODIFY_DELETE, hRes);
191
192 return rc == 0;
193}
194
195
196//******************************************************************************
197//******************************************************************************
198VOID RMDone(ULONG DevID, PHADAPTER phAdapter, PHDEVICE phDevice)
199{
200 APIRET rc;
201 HDEVICE hDevice;
202 HADAPTER hAdapter;
203 ADAPTERSTRUCT AdapterStruct;
204 DEVICESTRUCT DeviceStruct;
205 char AdapterName[sizeof(RM_ADAPTER_NAME)];
206 char szDeviceName[128];
207 char szMixerName[64];
208 struct {
209 ULONG NumResource;
210 HRESOURCE hResource[MAX_RESHANDLES];
211 } ahResource;
212
213 szDeviceName[0] = szMixerName[0] = '\0';
214
215 if( DevID && OSS32_QueryNames(OSS32_DEFAULT_DEVICE,
216 szDeviceName, sizeof(szDeviceName),
217 szMixerName, sizeof(szMixerName), FALSE) == OSSERR_SUCCESS )
218 {
219 switch(DevID) {
220 case PCIID_VIA_686A:
221 case PCIID_VIA_8233:
222 case PCIID_SI_7012:
223 case PCIID_INTEL_82801:
224 case PCIID_INTEL_82901:
225 case PCIID_INTEL_92801BA:
226 case PCIID_INTEL_440MX:
227 case PCIID_INTEL_ICH3:
228 case PCIID_INTEL_ICH4:
229 case PCIID_INTEL_ICH5:
230 case PCIID_INTEL_ICH6:
231 case PCIID_INTEL_ICH7:
232 case PCIID_NVIDIA_MCP_AUDIO:
233 case PCIID_NVIDIA_MCP2_AUDIO:
234 case PCIID_NVIDIA_MCP3_AUDIO:
235 case PCIID_NVIDIA_CK8S_AUDIO:
236 case PCIID_NVIDIA_CK8_AUDIO:
237 strcat(szDeviceName, " with ");
238 strcat(szDeviceName, szMixerName);
239 break;
240/*
241 case PCIID_CREATIVELABS_SBLIVE:
242 case PCIID_ALS4000:
243 case PCIID_CMEDIA_CM8338A:
244 case PCIID_CMEDIA_CM8338B:
245 case PCIID_CMEDIA_CM8738:
246 case PCIID_CMEDIA_CM8738B:
247 case PCIID_CIRRUS_4281:
248 case PCIID_CIRRUS_4280:
249 case PCIID_CIRRUS_4612:
250 case PCIID_CIRRUS_4615:
251 case PCIID_ESS_ALLEGRO_1:
252 case PCIID_ESS_ALLEGRO:
253 case PCIID_ESS_MAESTRO3:
254 case PCIID_ESS_MAESTRO3_1:
255 case PCIID_ESS_MAESTRO3_HW:
256 case PCIID_ESS_MAESTRO3_2:
257 case PCIID_ESS_CANYON3D_2LE:
258 case PCIID_ESS_CANYON3D_2:
259 case PCIID_ESS_ES1938:
260 case PCIID_AUREAL_VORTEX:
261 case PCIID_AUREAL_VORTEX2:
262 case PCIID_AUREAL_ADVANTAGE:
263 case PCIID_ENSONIQ_CT5880:
264 case PCIID_ENSONIQ_ES1371:
265 case PCIID_YAMAHA_YMF724:
266 case PCIID_YAMAHA_YMF724F:
267 case PCIID_YAMAHA_YMF740:
268 case PCIID_YAMAHA_YMF740C:
269 case PCIID_YAMAHA_YMF744:
270 case PCIID_YAMAHA_YMF754:
271 case PCIID_ESS_M2E:
272 case PCIID_ESS_M2:
273 case PCIID_ESS_M1:
274 case PCIID_ALI_5451:
275 case PCIID_TRIDENT_4DWAVE_DX:
276 case PCIID_TRIDENT_4DWAVE_NX:
277 case PCIID_SI_7018:
278 case PCIID_FM801:
279 case PCIID_ATIIXP_SB200:
280 case PCIID_ATIIXP_SB300:
281 case PCIID_ATIIXP_SB400:
282 case PCIID_AUDIGYLS:
283 case PCIID_AUDIGYLS1:
284 case PCIID_AUDIGYLS2:
285 break;
286*/
287 } /* switch */
288
289
290 if( ctResHandles )
291 {
292 ahResource.NumResource = ctResHandles;
293 memcpy(ahResource.hResource,
294 arResHandles, ctResHandles * sizeof(arResHandles[0]));
295
296 //copy string to stack, because we need to give RM 16:16 pointers
297 //(which can only be (easily) generated from 32 bits stack addresses)
298 strcpy(AdapterName, RM_ADAPTER_NAME);
299
300 memset( (PVOID) &AdapterStruct, 0, sizeof(AdapterStruct) );
301 AdapterStruct.AdaptDescriptName = FlatToSel((ULONG)AdapterName); /* ### IHV */
302 AdapterStruct.AdaptFlags = AS_16MB_ADDRESS_LIMIT; // AdaptFlags /* ### IHV */
303 AdapterStruct.BaseType = AS_BASE_MMEDIA; // BaseType
304 AdapterStruct.SubType = AS_SUB_MM_AUDIO; // SubType
305 AdapterStruct.InterfaceType = AS_INTF_GENERIC; // InterfaceType
306 AdapterStruct.HostBusType = AS_HOSTBUS_PCI; // HostBusType /* ### IHV */
307 AdapterStruct.HostBusWidth = AS_BUSWIDTH_32BIT; // HostBusWidth /* ### IHV */
308 AdapterStruct.pAdjunctList = NULL; // pAdjunctList /* ### IHV */
309
310 //--- Register adapter. We'll record any error code, but won't fail
311 // the driver initialization and won't return resources.
312 //NOTE: hAdapter must be used as FlatToSel only works for stack variables
313 rc = RMCreateAdapter(DriverHandle, // Handle to driver
314 FlatToSel((ULONG)&hAdapter), // (OUT) Handle to adapter
315 FlatToSel((ULONG)&AdapterStruct), // Adapter structure
316 NULL, // Parent device (defaults OK)
317 NULL); // Allocated resources.
318
319 dprintf(("RMCreateAdapter rc=%d", rc));
320
321 if( rc == 0 )
322 {
323 AdapterHandle = hAdapter;
324 if (phAdapter) *phAdapter = hAdapter;
325 if( !szDeviceName[0] ) strcpy(szDeviceName, "Unknown");
326
327 //NOTE: Assumes szDeviceName is a stack pointer!!
328 memset( (PVOID) &DeviceStruct, 0, sizeof(DeviceStruct) );
329 DeviceStruct.DevDescriptName = FlatToSel((ULONG)szDeviceName);
330 DeviceStruct.DevFlags = DS_FIXED_LOGICALNAME;
331 DeviceStruct.DevType = DS_TYPE_AUDIO;
332 DeviceStruct.pAdjunctList = NULL;
333
334 rc = RMCreateDevice(DriverHandle, // Handle to driver
335 FlatToSel((ULONG)&hDevice), // (OUT) Handle to device, unused.
336 FlatToSel((ULONG)&DeviceStruct), // Device structure
337 hAdapter, // Parent adapter
338 FlatToSel((ULONG)&ahResource)); // Allocated resources
339
340 dprintf(("RMCreateDevice rc=%d", rc));
341
342 if( rc == 0 )
343 {
344 DeviceHandle = hDevice;
345 if (phDevice) *phDevice = hDevice;
346 ctResHandles = 0; // no resource handles to be freed
347 dprintf(("RMDone: DriverHandle=%x DeviceHandle=%x", DriverHandle, DeviceHandle));
348 return;
349 }
350
351 // !!! Not implemented in startup.asm
352 // RMDestroyAdapter(DriverHandle, hAdapter);
353 } /* if rc == 0 */
354 } /* ctResHandles */
355 else dprintf(("No resources allocated !!!"));
356 } /* if DevID */
357
358
359 // free resource handles
360 while( ctResHandles )
361 RMDeallocResource(DriverHandle, arResHandles[--ctResHandles]);
362}
363
364
365/* DAZ - dirty hack so that resource manager is updated correctly
366 * when using APIC and multiple adapters */
367VOID RMSetHandles(HADAPTER hAdapter, HDEVICE hDevice)
368{
369 AdapterHandle = hAdapter;
370 DeviceHandle = hDevice;
371}
372
Note: See TracBrowser for help on using the repository browser.