/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 */

#include "ka_kernel_def_pub.h"
#include "msg_chan_main.h"

void *devdrv_pcimsg_alloc_non_trans_queue_inner_msg(u32 index_id, struct devdrv_non_trans_msg_chan_info *chan_info)
{
    void* ret;
    struct devdrv_comm_dev_ops *dev_ops = NULL;

    dev_ops = devdrv_add_ops_ref();
    if (dev_ops == NULL) {
        devdrv_err("Host alloc non trans chan fail.\n");
        return NULL;
    }
    ret = dev_ops->ops.alloc_non_trans(index_id, chan_info);
    devdrv_sub_ops_ref(dev_ops);
    return ret;
}
KA_EXPORT_SYMBOL(devdrv_pcimsg_alloc_non_trans_queue_inner_msg);

void *devdrv_pcimsg_alloc_non_trans_queue(u32 dev_id, struct devdrv_non_trans_msg_chan_info *chan_info)
{
    u32 index_id;

    (void)uda_udevid_to_add_id(dev_id, &index_id);
    return devdrv_pcimsg_alloc_non_trans_queue_inner_msg(index_id, chan_info);
}
KA_EXPORT_SYMBOL(devdrv_pcimsg_alloc_non_trans_queue);

int devdrv_pcimsg_free_non_trans_queue(void *msg_chan)
{
    int ret;
    struct devdrv_comm_dev_ops *dev_ops = devdrv_add_ops_ref();
    if (dev_ops == NULL) {
        devdrv_err("Host free non trans chan fail.\n");
        return -ENODEV;
    }
    ret = dev_ops->ops.free_non_trans(msg_chan);
    devdrv_sub_ops_ref(dev_ops);
    return ret;
}
KA_EXPORT_SYMBOL(devdrv_pcimsg_free_non_trans_queue);

int devdrv_sync_msg_send(void *msg_chan, void *data, u32 in_data_len, u32 out_data_len, u32 *real_out_len)
{
    return devdrv_sync_msg_send_proc(msg_chan, data, in_data_len, out_data_len, real_out_len);
}
KA_EXPORT_SYMBOL(devdrv_sync_msg_send);

int devdrv_get_msg_chan_devid_inner(void *msg_chan)
{
    return devdrv_get_msg_chan_devid_proc(msg_chan);
}
KA_EXPORT_SYMBOL(devdrv_get_msg_chan_devid_inner);

int devdrv_get_msg_chan_devid(void *msg_chan)
{
    int index_id;
    u32 udevid;

    index_id = devdrv_get_msg_chan_devid_proc(msg_chan);
    if (index_id < 0) {
        return index_id;
    }
    (void)uda_add_id_to_udevid((u32)index_id, &udevid);
    return (int)udevid;
}
KA_EXPORT_SYMBOL(devdrv_get_msg_chan_devid);

int devdrv_set_msg_chan_priv(void *msg_chan, void *priv)
{
    return devdrv_set_msg_chan_priv_proc(msg_chan, priv);
}
KA_EXPORT_SYMBOL(devdrv_set_msg_chan_priv);

void *devdrv_get_msg_chan_priv(void *msg_chan)
{
    return devdrv_get_msg_chan_priv_proc(msg_chan);
}
KA_EXPORT_SYMBOL(devdrv_get_msg_chan_priv);