@@ -65,8 +65,13 @@ tAC97Registers CAC97AdapterCommon::m_stAC97Registers[] =
6565{0xBB80 , SHREG_NOCACHE, NULL , 0 }, // AC97REG_LFE_SAMPLERATE
6666{0xBB80 , SHREG_NOCACHE, NULL , 0 }, // AC97REG_RECORD_SAMPLERATE
6767{0xBB80 , SHREG_NOCACHE, NULL , 0 }, // AC97REG_MIC_SAMPLERATE
68+ #ifdef SARCH_XBOX
69+ {0x8080 , SHREG_INVALID, L" CenterLFEVolume" , 0x0000 }, // AC97REG_CENTER_LFE_VOLUME
70+ {0x8080 , SHREG_INVALID, L" SurroundVolume" , 0x0000 }, // AC97REG_SURROUND_VOLUME
71+ #else
6872{0x8080 , SHREG_INIT, L" CenterLFEVolume" , 0x0000 }, // AC97REG_CENTER_LFE_VOLUME
6973{0x8080 , SHREG_INIT, L" SurroundVolume" , 0x0000 }, // AC97REG_SURROUND_VOLUME
74+ #endif
7075{0x0000 , SHREG_NOCACHE, NULL , 0 } // AC97REG_RESERVED2
7176
7277// We leave the other values blank. There would be a huge gap with 31
@@ -147,6 +152,8 @@ STDMETHODIMP_(NTSTATUS) CAC97AdapterCommon::Init
147152 IN PDEVICE_OBJECT DeviceObject
148153)
149154{
155+ PCM_PARTIAL_RESOURCE_DESCRIPTOR Resource0, Resource1;
156+
150157 PAGED_CODE ();
151158
152159 ASSERT (ResourceList);
@@ -169,13 +176,38 @@ STDMETHODIMP_(NTSTATUS) CAC97AdapterCommon::Init
169176 //
170177 // Get the base address for the AC97 codec and bus master.
171178 //
172- ASSERT (ResourceList->FindTranslatedPort (0 ));
173- m_pCodecBase = (PUSHORT)ResourceList->FindTranslatedPort (0 )->
174- u.Port .Start .QuadPart ;
179+ Resource0 = ResourceList->FindTranslatedPort (0 );
180+ Resource1 = ResourceList->FindTranslatedPort (1 );
175181
176- ASSERT (ResourceList->FindTranslatedPort (1 ));
177- m_pBusMasterBase = (PUCHAR)ResourceList->FindTranslatedPort (1 )->
178- u.Port .Start .QuadPart ;
182+ if (Resource0 && Resource1)
183+ {
184+ m_pCodecBase = (PUSHORT)Resource0->u .Port .Start .QuadPart ;
185+ m_pBusMasterBase = (PUCHAR)Resource1->u .Port .Start .QuadPart ;
186+ m_pfnREAD_UCHAR = READ_PORT_UCHAR;
187+ m_pfnREAD_USHORT = READ_PORT_USHORT;
188+ m_pfnREAD_ULONG = READ_PORT_ULONG;
189+ m_pfnWRITE_UCHAR = WRITE_PORT_UCHAR;
190+ m_pfnWRITE_USHORT = WRITE_PORT_USHORT;
191+ m_pfnWRITE_ULONG = WRITE_PORT_ULONG;
192+ }
193+ else
194+ {
195+ Resource0 = ResourceList->FindTranslatedMemory (0 );
196+
197+ ASSERT (Resource0);
198+ m_pCodecBase = (PUSHORT)MmMapIoSpace (Resource0->u .Memory .Start ,
199+ Resource0->u .Memory .Length ,
200+ MmNonCached);
201+ m_pBusMasterBase = (PUCHAR)m_pCodecBase + 0x100 ;
202+ ASSERT (m_pCodecBase && m_pBusMasterBase);
203+
204+ m_pfnREAD_UCHAR = (PFN_READ_PORT_UCHAR)READ_REGISTER_UCHAR;
205+ m_pfnREAD_USHORT = (PFN_READ_PORT_USHORT)READ_REGISTER_USHORT;
206+ m_pfnREAD_ULONG = (PFN_READ_PORT_ULONG)READ_REGISTER_ULONG;
207+ m_pfnWRITE_UCHAR = (PFN_WRITE_PORT_UCHAR)WRITE_REGISTER_UCHAR;
208+ m_pfnWRITE_USHORT = (PFN_WRITE_PORT_USHORT)WRITE_REGISTER_USHORT;
209+ m_pfnWRITE_ULONG = (PFN_WRITE_PORT_ULONG)WRITE_REGISTER_ULONG;
210+ }
179211
180212 DOUT (DBG_SYSINFO, (" Configuration:\n "
181213 " Bus Master = 0x%p\n "
@@ -1066,7 +1098,7 @@ NTSTATUS CAC97AdapterCommon::AcquireCodecSemiphore ()
10661098 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::AcquireCodecSemiphore]" ));
10671099
10681100 ULONG ulCount = 0 ;
1069- while (READ_PORT_UCHAR (m_pBusMasterBase + CAS) & CAS_CAS)
1101+ while (m_pfnREAD_UCHAR (m_pBusMasterBase + CAS) & CAS_CAS)
10701102 {
10711103 //
10721104 // Do we want to give up??
@@ -1132,18 +1164,18 @@ STDMETHODIMP_(NTSTATUS) CAC97AdapterCommon::ReadCodecRegister
11321164 //
11331165 // Read the data.
11341166 //
1135- *wData = READ_PORT_USHORT (m_pCodecBase + reg);
1167+ *wData = m_pfnREAD_USHORT (m_pCodecBase + reg);
11361168
11371169 //
11381170 // Check to see if the read was successful.
11391171 //
1140- Status = READ_PORT_ULONG ((PULONG)(m_pBusMasterBase + GLOB_STA));
1172+ Status = m_pfnREAD_ULONG ((PULONG)(m_pBusMasterBase + GLOB_STA));
11411173 if (Status & GLOB_STA_RCS)
11421174 {
11431175 //
11441176 // clear the timeout bit
11451177 //
1146- WRITE_PORT_ULONG ((PULONG)(m_pBusMasterBase + GLOB_STA), Status);
1178+ m_pfnWRITE_ULONG ((PULONG)(m_pBusMasterBase + GLOB_STA), Status);
11471179 *wData = 0 ;
11481180 DOUT (DBG_ERROR, (" ReadCodecRegister timed out for register %s" ,
11491181 reg <= AC97REG_RESERVED2 ? RegStrings[reg] :
@@ -1255,7 +1287,7 @@ STDMETHODIMP_(NTSTATUS) CAC97AdapterCommon::WriteCodecRegister
12551287 //
12561288 // Write the data.
12571289 //
1258- WRITE_PORT_USHORT (m_pCodecBase + reg, TempData);
1290+ m_pfnWRITE_USHORT (m_pCodecBase + reg, TempData);
12591291
12601292 //
12611293 // Update cache.
@@ -1308,7 +1340,7 @@ NTSTATUS CAC97AdapterCommon::PrimaryCodecReady (void)
13081340
13091341 do
13101342 {
1311- if (READ_PORT_ULONG ((PULONG)(m_pBusMasterBase + GLOB_STA)) &
1343+ if (m_pfnREAD_ULONG ((PULONG)(m_pBusMasterBase + GLOB_STA)) &
13121344 GLOB_STA_PCR)
13131345 {
13141346 return STATUS_SUCCESS;
@@ -2197,7 +2229,7 @@ STDMETHODIMP_(void) CAC97AdapterCommon::WriteBMControlRegister
21972229{
21982230 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::WriteBMControlRegister] (UCHAR)" ));
21992231
2200- WRITE_PORT_UCHAR ((PUCHAR)(m_pBusMasterBase + ulOffset), ucValue);
2232+ m_pfnWRITE_UCHAR ((PUCHAR)(m_pBusMasterBase + ulOffset), ucValue);
22012233
22022234 DOUT (DBG_REGS, (" WriteBMControlRegister wrote 0x%2x to 0x%4p." ,
22032235 ucValue, m_pBusMasterBase + ulOffset));
@@ -2216,7 +2248,7 @@ STDMETHODIMP_(void) CAC97AdapterCommon::WriteBMControlRegister
22162248{
22172249 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::WriteBMControlRegister (USHORT)]" ));
22182250
2219- WRITE_PORT_USHORT ((PUSHORT)(m_pBusMasterBase + ulOffset), usValue);
2251+ m_pfnWRITE_USHORT ((PUSHORT)(m_pBusMasterBase + ulOffset), usValue);
22202252
22212253 DOUT (DBG_REGS, (" WriteBMControlRegister wrote 0x%4x to 0x%4p" ,
22222254 usValue, m_pBusMasterBase + ulOffset));
@@ -2235,7 +2267,7 @@ STDMETHODIMP_(void) CAC97AdapterCommon::WriteBMControlRegister
22352267{
22362268 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::WriteBMControlRegister (ULONG)]" ));
22372269
2238- WRITE_PORT_ULONG ((PULONG)(m_pBusMasterBase + ulOffset), ulValue);
2270+ m_pfnWRITE_ULONG ((PULONG)(m_pBusMasterBase + ulOffset), ulValue);
22392271
22402272 DOUT (DBG_REGS, (" WriteBMControlRegister wrote 0x%8x to 0x%4p." ,
22412273 ulValue, m_pBusMasterBase + ulOffset));
@@ -2255,7 +2287,7 @@ STDMETHODIMP_(UCHAR) CAC97AdapterCommon::ReadBMControlRegister8
22552287
22562288 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::ReadBMControlRegister8]" ));
22572289
2258- ucValue = READ_PORT_UCHAR ((PUCHAR)(m_pBusMasterBase + ulOffset));
2290+ ucValue = m_pfnREAD_UCHAR ((PUCHAR)(m_pBusMasterBase + ulOffset));
22592291
22602292 DOUT (DBG_REGS, (" ReadBMControlRegister read 0x%2x from 0x%4p." , ucValue,
22612293 m_pBusMasterBase + ulOffset));
@@ -2277,7 +2309,7 @@ STDMETHODIMP_(USHORT) CAC97AdapterCommon::ReadBMControlRegister16
22772309
22782310 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::ReadBMControlRegister16]" ));
22792311
2280- usValue = READ_PORT_USHORT ((PUSHORT)(m_pBusMasterBase + ulOffset));
2312+ usValue = m_pfnREAD_USHORT ((PUSHORT)(m_pBusMasterBase + ulOffset));
22812313
22822314 DOUT (DBG_REGS, (" ReadBMControlRegister read 0x%4x = 0x%4p" , usValue,
22832315 m_pBusMasterBase + ulOffset));
@@ -2299,7 +2331,7 @@ STDMETHODIMP_(ULONG) CAC97AdapterCommon::ReadBMControlRegister32
22992331
23002332 DOUT (DBG_PRINT, (" [CAC97AdapterCommon::ReadBMControlRegister32]" ));
23012333
2302- ulValue = READ_PORT_ULONG ((PULONG)(m_pBusMasterBase + ulOffset));
2334+ ulValue = m_pfnREAD_ULONG ((PULONG)(m_pBusMasterBase + ulOffset));
23032335
23042336 DOUT (DBG_REGS, (" ReadBMControlRegister read 0x%8x = 0x%4p" , ulValue,
23052337 m_pBusMasterBase + ulOffset));
0 commit comments