source: GPL/branches/uniaud32-2.1.x/drv32/rmhelp.c@ 588

Last change on this file since 588 was 588, checked in by David Azarewicz, 9 years ago

Build system cleanup

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