Skip to content

Commit 8467a4d

Browse files
Simone Lombardohpoussin
authored andcommitted
[AC97] Experimental Xbox audio patch. CORE-18997
Co-authored-by: Hervé Poussineau <[email protected]>
1 parent 6bd679b commit 8467a4d

File tree

4 files changed

+65
-20
lines changed

4 files changed

+65
-20
lines changed

drivers/wdm/audio/drivers/ac97/ac97.inf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ ExcludeFromSelect = *
5858
%ac97_GB.DeviceDesc%=ac97, PCI\VEN_8086&DEV_27DE
5959
%ac97_6300ESB.DeviceDesc%=ac97, PCI\VEN_8086&DEV_25A6
6060
%ac97_63xxESB.DeviceDesc%=ac97, PCI\VEN_8086&DEV_2698
61+
%ac97_63xxESB.DeviceDesc%=ac97, PCI\VEN_10de&DEV_01b1
6162

6263
;; This section enables installing on x64 systems
6364

drivers/wdm/audio/drivers/ac97/adapter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ NTSTATUS ValidateResources
181181
//
182182
// Get counts for the types of resources.
183183
//
184-
ULONG countIO = ResourceList->NumberOfPorts ();
184+
ULONG countIO = ResourceList->NumberOfPorts () + ResourceList->NumberOfMemories ();
185185
ULONG countIRQ = ResourceList->NumberOfInterrupts ();
186186
ULONG countDMA = ResourceList->NumberOfDmas ();
187187

188188
// validate resources
189-
if ((countIO != 2) || (countIRQ != 1) || (countDMA != 0))
189+
if ((countIO < 0) || (countIRQ != 1) || (countDMA != 0))
190190
{
191191
DOUT (DBG_ERROR, ("Unknown configuration:\n"
192192
" IO count: %d\n"

drivers/wdm/audio/drivers/ac97/common.cpp

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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));

drivers/wdm/audio/drivers/ac97/common.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,18 @@ class CAC97AdapterCommon : public IAC97AdapterCommon,
9898
DEVICE_POWER_STATE m_PowerState; // Current power state of the device.
9999
PAC97MINIPORTTOPOLOGY m_Topology; // Miniport Topology pointer.
100100

101+
typedef UCHAR (NTAPI *PFN_READ_PORT_UCHAR)(PUCHAR Port);
102+
typedef USHORT (NTAPI *PFN_READ_PORT_USHORT)(PUSHORT Port);
103+
typedef ULONG (NTAPI *PFN_READ_PORT_ULONG)(PULONG Port);
104+
typedef VOID (NTAPI *PFN_WRITE_PORT_UCHAR)(PUCHAR Port, UCHAR Value);
105+
typedef VOID (NTAPI *PFN_WRITE_PORT_USHORT)(PUSHORT Port, USHORT Value);
106+
typedef VOID (NTAPI *PFN_WRITE_PORT_ULONG)(PULONG Port, ULONG Value);
107+
PFN_READ_PORT_UCHAR m_pfnREAD_UCHAR;
108+
PFN_READ_PORT_USHORT m_pfnREAD_USHORT;
109+
PFN_READ_PORT_ULONG m_pfnREAD_ULONG;
110+
PFN_WRITE_PORT_UCHAR m_pfnWRITE_UCHAR;
111+
PFN_WRITE_PORT_USHORT m_pfnWRITE_USHORT;
112+
PFN_WRITE_PORT_ULONG m_pfnWRITE_ULONG;
101113

102114
/*************************************************************************
103115
* CAC97AdapterCommon methods

0 commit comments

Comments
 (0)