Skip to content
Snippets Groups Projects
Commit 9ad7eae5 authored by Dustin L. Howett's avatar Dustin L. Howett
Browse files

ec: add some ioctls (cmd, readmem)

parent 6a31048f
Branches
Tags
No related merge requests found
......@@ -22,3 +22,8 @@ Environment:
DEFINE_GUID(GUID_DEVINTERFACE_CrosEC,
0xd66bb4f8, 0x0a7a, 0x4f89, 0x90, 0x33, 0x79, 0x8a, 0xff, 0xa4, 0xf5, 0x38);
// {d66bb4f8-0a7a-4f89-9033-798affa4f538}
#define FILE_DEVICE_CROS_EMBEDDED_CONTROLLER 0x80EC
#define IOCTL_CROSEC_XCMD CTL_CODE(FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x801, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
#define IOCTL_CROSEC_RDMEM CTL_CODE(FILE_DEVICE_CROS_EMBEDDED_CONTROLLER, 0x802, METHOD_BUFFERED, FILE_READ_DATA)
......@@ -17,6 +17,8 @@ Environment:
#include "driver.h"
#include "queue.tmh"
#include "EC.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text (PAGE, CrosECQueueInitialize)
#endif
......@@ -118,6 +120,50 @@ Return Value:
"%!FUNC! Queue 0x%p, Request 0x%p OutputBufferLength %d InputBufferLength %d IoControlCode %d",
Queue, Request, (int)OutputBufferLength, (int)InputBufferLength, IoControlCode);
WDFDEVICE device = WdfIoQueueGetDevice(Queue);
PDEVICE_CONTEXT deviceContext = DeviceGetContext(device);
switch (IoControlCode) {
case IOCTL_CROSEC_XCMD: {
struct cros_ec_command_v2* cmd;
size_t cmdLen;
WdfRequestRetrieveInputBuffer(Request, sizeof(cmd), (PVOID*)&cmd, &cmdLen);
RtlZeroMemory(deviceContext->inflightCommand, 0x200/*TODO*/);
memcpy(deviceContext->inflightCommand, cmd, InputBufferLength);
int res = ECSendCommandLPCv3(device, cmd->command, cmd->version, cmd->data, cmd->outsize, deviceContext->inflightCommand->data, cmd->insize);
if (res > 0) {
deviceContext->inflightCommand->insize = res;
res = 0; // propagate it to the client
}
deviceContext->inflightCommand->result = res;
int requiredReplySize = sizeof(struct cros_ec_command_v2) + deviceContext->inflightCommand->insize;
WDFMEMORY OutputMem;
WdfRequestRetrieveOutputMemory(Request, &OutputMem);
WdfMemoryCopyFromBuffer(OutputMem, 0, deviceContext->inflightCommand, min(requiredReplySize, OutputBufferLength));
WdfRequestSetInformation(Request, requiredReplySize);
break;
}
case IOCTL_CROSEC_RDMEM: {
struct cros_ec_readmem_v2* rq;
WdfRequestRetrieveInputBuffer(Request, sizeof(*rq), (PVOID*)&rq, NULL);
ECReadMemoryLPC(device, rq->offset, rq->buffer, rq->bytes);
struct cros_ec_readmem_v2* rs;
WdfRequestRetrieveOutputBuffer(Request, sizeof(*rs), (PVOID*)&rs, NULL);
memcpy(rs, rq, sizeof(rs));
WdfRequestSetInformation(Request, sizeof(*rs));
break;
}
default:
WdfRequestComplete(Request, STATUS_INVALID_PARAMETER);
return;
}
WdfRequestComplete(Request, STATUS_SUCCESS);
return;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment