ReactOS 0.4.16-dev-2293-g4d8327b
sof-tplg.cpp File Reference
#include "driver.h"
#include <acpiioct.h>
#include "sof-tplg.h"
Include dependency graph for sof-tplg.cpp:

Go to the source code of this file.

Functions

 DEFINE_GUID (GUID_ACPI_DSD, 0xdaffd814, 0x6eba, 0x4d8c, 0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01)
 
void copyDSDParam (PACPI_METHOD_ARGUMENT dsdParameterData, char **buf)
 
NTSTATUS GetSOFTplg (_In_ WDFDEVICE FxDevice, SOF_TPLG *sofTplg)
 

Function Documentation

◆ copyDSDParam()

void copyDSDParam ( PACPI_METHOD_ARGUMENT  dsdParameterData,
char **  buf 
)

Definition at line 8 of file sof-tplg.cpp.

8 {
10 RtlCopyMemory(buf, dsdParameterData->Data, min(dsdParameterData->DataLength, 32));
11}
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define min(a, b)
Definition: monoChain.cc:55
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

Referenced by GetSOFTplg().

◆ DEFINE_GUID()

DEFINE_GUID ( GUID_ACPI_DSD  ,
0xdaffd814  ,
0x6eba  ,
0x4d8c  ,
0x8a  ,
0x91  ,
0xbc  ,
0x9b  ,
0xbf  ,
0x4a  ,
0xa3  ,
0x01   
)

◆ GetSOFTplg()

NTSTATUS GetSOFTplg ( _In_ WDFDEVICE  FxDevice,
SOF_TPLG sofTplg 
)

Definition at line 14 of file sof-tplg.cpp.

18{
19 if (!sofTplg) {
21 }
22
24 ACPI_EVAL_INPUT_BUFFER_EX inputBuffer;
25 RtlZeroMemory(&inputBuffer, sizeof(inputBuffer));
26
29 inputBuffer.MethodName,
30 sizeof(inputBuffer.MethodName),
31 "_DSD"
32 );
33 if (!NT_SUCCESS(status)) {
34 return status;
35 }
36
37 ACPI_EVAL_OUTPUT_BUFFER outputSizeBuffer = { 0 };
38
39 WDF_MEMORY_DESCRIPTOR outputSizeMemDesc;
40 WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&outputSizeMemDesc, &outputSizeBuffer, (ULONG)sizeof(outputSizeBuffer));
41
42 WDF_MEMORY_DESCRIPTOR inputMemDesc;
43 WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&inputMemDesc, &inputBuffer, (ULONG)sizeof(inputBuffer));
44
45 // Send the request along
46 status = WdfIoTargetSendInternalIoctlSynchronously(
47 WdfDeviceGetIoTarget(FxDevice),
48 NULL,
50 &inputMemDesc,
51 &outputSizeMemDesc,
52 NULL,
53 NULL
54 );
55
57 // Method might not exist?
58 return status;
59 }
60
61 WDFMEMORY outputMemory;
62 PACPI_EVAL_OUTPUT_BUFFER outputBuffer;
63 size_t outputArgumentBufferSize = outputSizeBuffer.Length;
64 size_t outputBufferSize = FIELD_OFFSET(ACPI_EVAL_OUTPUT_BUFFER, Argument) + outputArgumentBufferSize;
65
66 WDF_OBJECT_ATTRIBUTES attributes;
67 WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
68 attributes.ParentObject = FxDevice;
69
70 status = WdfMemoryCreate(&attributes,
71 NonPagedPoolNx,
72 0,
73 outputBufferSize,
74 &outputMemory,
75 (PVOID*)&outputBuffer);
76 if (!NT_SUCCESS(status)) {
77 return status;
78 }
79
80 RtlZeroMemory(outputBuffer, outputBufferSize);
81
82 WDF_MEMORY_DESCRIPTOR outputMemDesc;
83 WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&outputMemDesc, outputMemory, NULL);
84
85 status = WdfIoTargetSendInternalIoctlSynchronously(
86 WdfDeviceGetIoTarget(FxDevice),
87 NULL,
89 &inputMemDesc,
90 &outputMemDesc,
91 NULL,
92 NULL
93 );
94 if (!NT_SUCCESS(status)) {
95 goto Exit;
96 }
97
98 if (outputBuffer->Signature != ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE) {
99 goto Exit;
100 }
101
102 SklHdAudBusPrint(DEBUG_LEVEL_ERROR, DBG_PNP,
103 "Evaluted %s successfully\n", inputBuffer.MethodName);
104
105 if (outputBuffer->Count % 2) {
107 goto Exit;
108 }
109
111
112 RtlZeroMemory(sofTplg, sizeof(*sofTplg));
113 sofTplg->magic = SOFTPLG_MAGIC;
114 sofTplg->length = sizeof(*sofTplg);
115
116 {
117 PACPI_METHOD_ARGUMENT currArgument = &outputBuffer->Argument[0];
118 for (ULONG i = 0; i < outputBuffer->Count; i += 2) {
119 PACPI_METHOD_ARGUMENT guidArg = currArgument;
120 currArgument = ACPI_METHOD_NEXT_ARGUMENT(currArgument);
121 PACPI_METHOD_ARGUMENT packageArg = currArgument;
122 currArgument = ACPI_METHOD_NEXT_ARGUMENT(currArgument);
123
124 if (guidArg->Type != ACPI_METHOD_ARGUMENT_BUFFER ||
125 guidArg->DataLength != 16 ||
126 packageArg->Type != ACPI_METHOD_ARGUMENT_PACKAGE) {
127 break;
128 }
129
130 if (memcmp(guidArg->Data, &GUID_ACPI_DSD, guidArg->DataLength) != 0) {
131 continue;
132 }
133
135
136 FOR_EACH_ACPI_METHOD_ARGUMENT(dsdParameter, (PACPI_METHOD_ARGUMENT)packageArg->Data, (PACPI_METHOD_ARGUMENT)(packageArg->Data + packageArg->DataLength)) {
137 PACPI_METHOD_ARGUMENT dsdParameterName = (PACPI_METHOD_ARGUMENT)dsdParameter->Data;
138 PACPI_METHOD_ARGUMENT dsdParameterData = ACPI_METHOD_NEXT_ARGUMENT(dsdParameterName);
139
140 if (strncmp((const char*)&dsdParameterName->Data[0], "speaker-tplg", dsdParameterName->DataLength) == 0) {
141 copyDSDParam(dsdParameterData, (char **)&sofTplg->speaker_tplg);
142 }
143 else if (strncmp((const char*)&dsdParameterName->Data[0], "hp-tplg", dsdParameterName->DataLength) == 0) {
144 copyDSDParam(dsdParameterData, (char**)&sofTplg->hp_tplg);
145 }
146 else if (strncmp((const char*)&dsdParameterName->Data[0], "mic-tplg", dsdParameterName->DataLength) == 0) {
147 copyDSDParam(dsdParameterData, (char**)&sofTplg->dmic_tplg);
148 }
149 }
150 }
151 }
152
153Exit:
154 if (outputMemory != WDF_NO_HANDLE) {
155 WdfObjectDelete(outputMemory);
156 }
157 return status;
158}
ACPI_METHOD_ARGUMENT UNALIGNED * PACPI_METHOD_ARGUMENT
Definition: acpiioct.h:80
#define ACPI_METHOD_NEXT_ARGUMENT(Argument)
Definition: acpiioct.h:159
#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE_EX
Definition: acpiioct.h:24
#define ACPI_METHOD_ARGUMENT_BUFFER
Definition: acpiioct.h:32
#define IOCTL_ACPI_EVAL_METHOD_EX
Definition: acpiioct.h:199
#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:16
#define FOR_EACH_ACPI_METHOD_ARGUMENT(MethodArgument, MethodArgumentsBegin, MethodArgumentsEnd)
Definition: acpiioct.h:186
#define ACPI_METHOD_ARGUMENT_PACKAGE
Definition: acpiioct.h:33
ACPI_EVAL_OUTPUT_BUFFER UNALIGNED * PACPI_EVAL_OUTPUT_BUFFER
Definition: acpiioct.h:99
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
_ACRTIMP int __cdecl strncmp(const char *, const char *, size_t)
Definition: string.c:3330
#define SklHdAudBusPrint(dbglevel, fmt,...)
Definition: driver.h:111
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define STATUS_ACPI_INVALID_DATA
Definition: ntstatus.h:1662
#define STATUS_ACPI_NOT_INITIALIZED
Definition: ntstatus.h:1667
NTSTRSAFEVAPI RtlStringCchPrintfA(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1085
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_NOT_FOUND
Definition: shellext.h:72
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
static void Exit(void)
Definition: sock.c:1330
void copyDSDParam(PACPI_METHOD_ARGUMENT dsdParameterData, char **buf)
Definition: sof-tplg.cpp:8
#define SOFTPLG_MAGIC
Definition: sof-tplg.h:1
_Null_terminated_ CHAR MethodName[256]
Definition: acpiioct.h:108
UINT32 magic
Definition: sof-tplg.h:10
char speaker_tplg[32]
Definition: sof-tplg.h:12
char dmic_tplg[32]
Definition: sof-tplg.h:14
char hp_tplg[32]
Definition: sof-tplg.h:13
UINT32 length
Definition: sof-tplg.h:11
WDFOBJECT ParentObject
Definition: wdfobject.h:130
Definition: ps.c:97
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
FORCEINLINE VOID WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(_Out_ PWDF_MEMORY_DESCRIPTOR Descriptor, _In_ PVOID Buffer, _In_ ULONG BufferLength)
Definition: wdfmemory.h:102
FORCEINLINE VOID WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(_Out_ PWDF_MEMORY_DESCRIPTOR Descriptor, _In_ WDFMEMORY Memory, _In_opt_ PWDFMEMORY_OFFSET Offsets)
Definition: wdfmemory.h:117
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147
#define WDF_NO_HANDLE
Definition: wdftypes.h:107

Referenced by Fdo_EvtDevicePrepareHardware().