aff95158创建于 2025年12月23日历史提交
/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */
#include <sys/ioctl.h>

#include "ascend_hal.h"
#include "dms_user_common.h"
#include "dsmi_common_interface.h"
#include "dms_sils.h"

#ifdef STATIC_SKIP
#define STATIC
#else
#define STATIC static
#endif

STATIC void dms_fill_sils_input(struct dms_sils_info_in *in, unsigned int dev_id, unsigned int cmd, 
    void *buf, unsigned int size)
{
    in->dev_id = dev_id;
    in->resv[0] = cmd;
    in->buff = buf;
    in->size = size;
}

STATIC int dms_sils_ioctl(unsigned int main_cmd, unsigned int sub_cmd, struct dms_sils_info_in *in, 
    struct dms_sils_info_out *out)
{
    int ret;
    struct dms_ioctl_arg ioarg = {0};
    ioarg.main_cmd = main_cmd;
    ioarg.sub_cmd = sub_cmd;
    ioarg.filter_len = 0;
    ioarg.input = (void*)in;
    ioarg.input_len = (unsigned int)sizeof(struct dms_sils_info_in);
    ioarg.output = (void*)out;
    ioarg.output_len = (unsigned int)sizeof(struct dms_sils_info_out);;

    ret = DmsIoctl(DMS_IOCTL_CMD, &ioarg);
    if (ret != 0) {
        DMS_ERR("Sils ioctl failed. (main_cmd=%u; sub_cmd=%u; ret=%d)\n", main_cmd, sub_cmd, ret);
        return errno_to_user_errno(ret);
    }
    return 0;
}

int dms_get_emu_subsys_status(unsigned int dev_id, struct dsmi_emu_subsys_state_stru *emu_subsys_state_data)
{
    int ret;
    struct dms_sils_info_in in = {0};
    struct dms_sils_info_out out = {0};

    dms_fill_sils_input(
        &in, dev_id, 0, (void *)emu_subsys_state_data, (unsigned int)sizeof(struct dsmi_emu_subsys_state_stru));

    ret = dms_sils_ioctl(DMS_MAIN_CMD_SILS, DMS_SUBCMD_GET_SILS_EMU_INFO, &in, &out);
    if (ret != 0) {
        DMS_ERR("Get emu subsys status failed. (dev_id=%u; ret=%d)\n", dev_id, ret);
        return ret;
    }

    return 0;
}

int dms_get_sils_status(unsigned int dev_id, struct dsmi_safetyisland_status_stru *safetyisland_status_data)
{
    int ret;
    struct dms_sils_info_in in = {0};
    struct dms_sils_info_out out = {0};

    dms_fill_sils_input(
        &in, dev_id, 0, (void *)safetyisland_status_data, (unsigned int)sizeof(struct dsmi_safetyisland_status_stru));

    ret = dms_sils_ioctl(DMS_MAIN_CMD_SILS, DMS_SUBCMD_GET_SILS_HEALTH_STATUS, &in, &out);
    if (ret != 0) {
        DMS_ERR("Get sils status failed. (dev_id=%u; ret=%d)\n", dev_id, ret);
        return ret;
    }

    return 0;
}

int dms_set_sils_info(unsigned int dev_id, unsigned int sub_cmd, void *buf, unsigned int size)
{
    int ret;
    struct dms_sils_info_in in = {0};
    struct dms_sils_info_out out = {0};

    dms_fill_sils_input(&in, dev_id, sub_cmd, buf, size);

    ret = dms_sils_ioctl(DMS_MAIN_CMD_SILS, DMS_SUBCMD_SET_SILS_PMUWDG_INFO, &in, &out);
    if (ret != 0) {
        DMS_ERR("Set sils info failed. (ret=%d; sub_cmd=%u)\n", ret, sub_cmd);
        return ret;
    }

    return 0;
}
 
int dms_get_sils_info(unsigned int dev_id, unsigned int vfid, unsigned int sub_cmd,
    void *buf, unsigned int *size)
{
    int ret;
    struct dms_sils_info_in in = {0};
    struct dms_sils_info_out out = {0};

    dms_fill_sils_input(&in, dev_id, sub_cmd, buf, *size);
    ret = dms_sils_ioctl(DMS_MAIN_CMD_SILS, DMS_SUBCMD_GET_SILS_PMUWDG_INFO, &in, &out);
    if (ret != 0) {
        DMS_ERR("Get sils info failed. (ret=%d; sub_cmd=%u)\n", ret, sub_cmd);
        return ret;
    }

    *size = out.size;
    (void)vfid;
    return 0;
}

int dms_equipment_set_sils_info(unsigned int dev_id, unsigned int sub_cmd, void *buf, unsigned int size)
{
    int ret;
    struct dms_sils_info_in in = {0};
	struct dms_sils_info_out out = {0};

    dms_fill_sils_input(&in, dev_id, sub_cmd, buf, size);

    ret = dms_sils_ioctl(DMS_MAIN_CMD_SILS, DMS_SUBCMD_SET_SILS_HARDWARE_TEST, &in, &out);
    if (ret != 0) {
        DMS_ERR("Set equipment sils info failed. (ret=%d; sub_cmd=%u)\n", ret, sub_cmd);
        return ret;
    }

    return 0;
}

int dms_equipment_get_sils_info(unsigned int dev_id, unsigned int sub_cmd, void *buf, unsigned int *size)
{
    int ret;
    struct dms_sils_info_in in = {0};
    struct dms_sils_info_out out = {0};

    dms_fill_sils_input(&in, dev_id, sub_cmd, buf, *size);

    ret = dms_sils_ioctl(DMS_MAIN_CMD_SILS, DMS_SUBCMD_GET_SILS_HARDWARE_TEST, &in, &out);
    if (ret != 0) {
        DMS_ERR("Get equipment sils info failed. (ret=%d; sub_cmd=%u)\n", ret, sub_cmd);
        return ret;
    }

    *size = out.size;
    return 0;
}