blob: a5dd00640698a6783c6b65e631177dcde32d443c [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2018 Intel Corporation. All rights reserved. */
#include <stdlib.h>
#include <limits.h>
#include <util/log.h>
#include <ndctl/libndctl.h>
#include "private.h"
/*
* Define the wrappers around the ndctl_dimm_ops for firmware update:
*/
NDCTL_EXPORT struct ndctl_cmd *
ndctl_dimm_cmd_new_fw_get_info(struct ndctl_dimm *dimm)
{
struct ndctl_dimm_ops *ops = dimm->ops;
if (ops && ops->new_fw_get_info)
return ops->new_fw_get_info(dimm);
else
return NULL;
}
NDCTL_EXPORT struct ndctl_cmd *
ndctl_dimm_cmd_new_fw_start_update(struct ndctl_dimm *dimm)
{
struct ndctl_dimm_ops *ops = dimm->ops;
if (ops && ops->new_fw_start_update)
return ops->new_fw_start_update(dimm);
else
return NULL;
}
NDCTL_EXPORT struct ndctl_cmd *
ndctl_dimm_cmd_new_fw_send(struct ndctl_cmd *start, unsigned int offset,
unsigned int len, void *data)
{
struct ndctl_dimm_ops *ops = start->dimm->ops;
if (ops && ops->new_fw_send)
return ops->new_fw_send(start, offset, len, data);
else
return NULL;
}
NDCTL_EXPORT struct ndctl_cmd *
ndctl_dimm_cmd_new_fw_finish(struct ndctl_cmd *start)
{
struct ndctl_dimm_ops *ops = start->dimm->ops;
if (ops && ops->new_fw_finish)
return ops->new_fw_finish(start);
else
return NULL;
}
NDCTL_EXPORT struct ndctl_cmd *
ndctl_dimm_cmd_new_fw_abort(struct ndctl_cmd *start)
{
struct ndctl_dimm_ops *ops = start->dimm->ops;
if (ops && ops->new_fw_finish)
return ops->new_fw_abort(start);
else
return NULL;
}
NDCTL_EXPORT struct ndctl_cmd *
ndctl_dimm_cmd_new_fw_finish_query(struct ndctl_cmd *start)
{
struct ndctl_dimm_ops *ops = start->dimm->ops;
if (ops && ops->new_fw_finish_query)
return ops->new_fw_finish_query(start);
else
return NULL;
}
#define firmware_cmd_op(op, rettype, defretvalue) \
NDCTL_EXPORT rettype ndctl_cmd_##op(struct ndctl_cmd *cmd) \
{ \
if (cmd->dimm) { \
struct ndctl_dimm_ops *ops = cmd->dimm->ops; \
if (ops && ops->op) \
return ops->op(cmd); \
} \
return defretvalue; \
}
firmware_cmd_op(fw_info_get_storage_size, unsigned int, 0)
firmware_cmd_op(fw_info_get_max_send_len, unsigned int, 0)
firmware_cmd_op(fw_info_get_query_interval, unsigned int, 0)
firmware_cmd_op(fw_info_get_max_query_time, unsigned int, 0)
firmware_cmd_op(fw_info_get_run_version, unsigned long long, 0)
firmware_cmd_op(fw_info_get_updated_version, unsigned long long, 0)
firmware_cmd_op(fw_start_get_context, unsigned int, 0)
firmware_cmd_op(fw_fquery_get_fw_rev, unsigned long long, 0)
NDCTL_EXPORT enum ND_FW_STATUS
ndctl_cmd_fw_xlat_firmware_status(struct ndctl_cmd *cmd)
{
struct ndctl_dimm_ops *ops = cmd->dimm->ops;
if (ops && ops->fw_xlat_firmware_status)
return ops->fw_xlat_firmware_status(cmd);
else
return FW_EUNKNOWN;
}
NDCTL_EXPORT int
ndctl_dimm_fw_update_supported(struct ndctl_dimm *dimm)
{
struct ndctl_dimm_ops *ops = dimm->ops;
if (ops && ops->fw_update_supported)
return ops->fw_update_supported(dimm);
else
return -ENOTTY;
}