blob: 92102cab84233b9b3e44556a5718c4a639a36d98 [file] [log] [blame]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBEC_READ_MEMMAP_COMMAND_H_
#define LIBEC_READ_MEMMAP_COMMAND_H_
#include <algorithm>
#include "libec/ec_command.h"
namespace ec {
template <typename Response>
class BRILLO_EXPORT ReadMemmapCommand
: public EcCommand<struct ec_params_read_memmap, Response> {
public:
explicit ReadMemmapCommand(uint8_t offset)
: EcCommand<struct ec_params_read_memmap, Response>(
EC_CMD_READ_MEMMAP,
kVersionZero,
{.offset = offset, .size = sizeof(Response)}),
offset_(offset) {
this->SetRespSize(sizeof(Response));
}
~ReadMemmapCommand() override = default;
bool Run(int fd) override {
if (ReadMemmapUsingIoctl(fd, offset_, bytes_, this->Resp())) {
return true;
}
return EcCommandRun(fd);
}
virtual bool EcCommandRun(int fd) {
return EcCommand<struct ec_params_read_memmap, Response>::Run(fd);
}
private:
virtual int IoctlReadmem(int fd, uint32_t request, cros_ec_readmem_v2* data) {
return ::ioctl(fd, request, data);
}
bool ReadMemmapUsingIoctl(int fd, int offset, int bytes, void* dest) {
struct cros_ec_readmem_v2 ioctl_mem_buffer;
ioctl_mem_buffer.offset = offset;
ioctl_mem_buffer.bytes = bytes;
int ret = IoctlReadmem(fd, CROS_EC_DEV_IOCRDMEM_V2, &ioctl_mem_buffer);
if (ret >= 0) {
std::copy(ioctl_mem_buffer.buffer, ioctl_mem_buffer.buffer + bytes,
static_cast<uint8_t*>(dest));
return true;
}
return false;
}
constexpr static uint8_t bytes_ = sizeof(Response);
uint8_t offset_;
};
using ReadMemmapMem8Command = ReadMemmapCommand<uint8_t>;
static_assert(!std::is_copy_constructible<ReadMemmapMem8Command>::value,
"EcCommands are not copyable by default");
static_assert(!std::is_copy_assignable<ReadMemmapMem8Command>::value,
"EcCommands are not copy-assignable by default");
using ReadMemmapMem16Command = ReadMemmapCommand<uint16_t>;
static_assert(!std::is_copy_constructible<ReadMemmapMem16Command>::value,
"EcCommands are not copyable by default");
static_assert(!std::is_copy_assignable<ReadMemmapMem16Command>::value,
"EcCommands are not copy-assignable by default");
} // namespace ec
#endif // LIBEC_READ_MEMMAP_COMMAND_H_