7 #include <acpi_drivers.h>
21 Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData
,
26 ACPI_OBJECT_LIST
*ParamList
;
27 PACPI_EVAL_INPUT_BUFFER EvalInputBuff
= Irp
->AssociatedIrp
.SystemBuffer
;
28 ACPI_BUFFER RetBuff
= {ACPI_ALLOCATE_BUFFER
, NULL
};
29 PACPI_EVAL_OUTPUT_BUFFER OutputBuf
;
30 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
32 if (IrpSp
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(ULONG
))
33 return STATUS_INVALID_PARAMETER
;
35 Signature
= *((PULONG
)Irp
->AssociatedIrp
.SystemBuffer
);
39 case ACPI_EVAL_INPUT_BUFFER_SIGNATURE
:
40 if (IrpSp
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(ACPI_EVAL_INPUT_BUFFER
))
41 return STATUS_INVALID_PARAMETER
;
46 /* FIXME: Support input parameters */
49 DPRINT1("Unsupported input buffer signature: %d\n", Signature
);
50 return STATUS_NOT_IMPLEMENTED
;
53 Status
= AcpiEvaluateObject(DeviceData
->AcpiHandle
,
54 (CHAR
*)EvalInputBuff
->MethodName
,
57 if (ACPI_SUCCESS(Status
))
59 ACPI_OBJECT
*Obj
= RetBuff
.Pointer
;
60 ULONG ExtraParamLength
;
64 case ACPI_TYPE_INTEGER
:
65 ExtraParamLength
= sizeof(ULONG
);
68 case ACPI_TYPE_STRING
:
69 ExtraParamLength
= Obj
->String
.Length
;
72 case ACPI_TYPE_BUFFER
:
73 ExtraParamLength
= Obj
->Buffer
.Length
;
76 case ACPI_TYPE_PACKAGE
:
77 DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
78 return STATUS_UNSUCCESSFUL
;
82 return STATUS_UNSUCCESSFUL
;
85 /* Enough space for a ULONG is always included */
86 if (ExtraParamLength
>= sizeof(ULONG
))
87 ExtraParamLength
-= sizeof(ULONG
);
91 OutputBuf
= ExAllocatePool(NonPagedPool
, sizeof(ACPI_EVAL_OUTPUT_BUFFER
) +
93 if (!OutputBuf
) return STATUS_INSUFFICIENT_RESOURCES
;
95 OutputBuf
->Signature
= ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
;
96 OutputBuf
->Length
= ExtraParamLength
+ sizeof(ACPI_METHOD_ARGUMENT
);
101 case ACPI_TYPE_INTEGER
:
102 ACPI_METHOD_SET_ARGUMENT_INTEGER(OutputBuf
->Argument
, Obj
->Integer
.Value
);
105 case ACPI_TYPE_STRING
:
106 ACPI_METHOD_SET_ARGUMENT_STRING(OutputBuf
->Argument
, Obj
->String
.Pointer
);
109 case ACPI_TYPE_BUFFER
:
110 ACPI_METHOD_SET_ARGUMENT_BUFFER(OutputBuf
->Argument
, Obj
->Buffer
.Pointer
, Obj
->Buffer
.Length
);
113 case ACPI_TYPE_PACKAGE
:
114 DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
115 return STATUS_UNSUCCESSFUL
;
119 return STATUS_UNSUCCESSFUL
;
122 if (IrpSp
->Parameters
.DeviceIoControl
.OutputBufferLength
>= sizeof(ACPI_EVAL_OUTPUT_BUFFER
) +
125 RtlCopyMemory(Irp
->AssociatedIrp
.SystemBuffer
, OutputBuf
, sizeof(ACPI_EVAL_OUTPUT_BUFFER
) +
127 Irp
->IoStatus
.Information
= sizeof(ACPI_EVAL_OUTPUT_BUFFER
) + ExtraParamLength
;
128 ExFreePool(OutputBuf
);
129 return STATUS_SUCCESS
;
133 ExFreePool(OutputBuf
);
134 return STATUS_BUFFER_TOO_SMALL
;
139 DPRINT1("Query method %s failed on %p\n", EvalInputBuff
->MethodName
, DeviceData
->AcpiHandle
);
140 return STATUS_UNSUCCESSFUL
;