blob: 629076a2e6de202ada7c2f4d93c78d02989467ea [file] [log] [blame]
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/firmware/scmi/shmem.h>
#include <zephyr/sys/crc.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(arm_scmi_shmem_nxp);
#define SMT_CRC_NONE 0U
#define SMT_CRC_XOR 1U /* Unsupported */
#define SMT_CRC_J1850 2U /* Unsupported */
#define SMT_CRC_CRC32 3U
int scmi_shmem_vendor_read_message(const struct scmi_shmem_layout *layout)
{
uint32_t validation_type = layout->res1[0];
if (validation_type == SMT_CRC_CRC32) {
if (layout->res1[1] != crc32_ieee((const uint8_t *)&layout->msg_hdr, layout->len)) {
LOG_ERR("bad message crc");
return -EBADMSG;
}
} else if (validation_type == SMT_CRC_NONE) {
/* do nothing */
} else {
LOG_ERR("unsupported validation type 0x%x", validation_type);
return -EINVAL;
}
return 0;
}
int scmi_shmem_vendor_write_message(struct scmi_shmem_layout *layout)
{
uint32_t validation_type = layout->res1[0];
if (validation_type == SMT_CRC_CRC32) {
layout->res1[1] = crc32_ieee((const uint8_t *)&layout->msg_hdr, layout->len);
} else if (validation_type == SMT_CRC_NONE) {
/* do nothing */
} else {
LOG_ERR("unsupported validation type 0x%x", validation_type);
return -EINVAL;
}
return 0;
}