/*
 * 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.
 */
#ifndef ESCHED_H2D_MSG_H
#define ESCHED_H2D_MSG_H

#include "hal_pkg/esched_pkg.h"

#if defined(CFG_FEATURE_HARDWARE_SCHED) && !defined(CFG_FEATURE_REMOTE_PUB_HARD_SCHED)  && !defined(CFG_FEATURE_STARS_V2)
#define SCHED_MAX_EVENT_MSG_LEN_EX  768U
#else
#define SCHED_MAX_EVENT_MSG_LEN_EX  EVENT_MAX_MSG_LEN
#endif

typedef enum esched_msg_type {
    ESCHED_MSG_TYPE_ADD_HOST_PID,
    ESCHED_MSG_TYPE_DEL_HOST_PID,
    ESCHED_MSG_TYPE_ADD_POOL,
    ESCHED_MSG_TYPE_GET_CPU_MBID,
    ESCHED_MSG_TYPE_ADD_MB,
    ESCHED_MSG_TYPE_CONF_INTR,
    ESCHED_MSG_TYPE_REMOTE_SUBMIT,
    ESCHED_MSG_TYPE_REMOTE_QUERY_GID,
    ESCHED_MSG_TYPE_GET_POOL_ID,
    ESCHED_MSG_TYPE_D2D_EVENT_DISPATCH,
    ESCHED_MSG_TYPE_REMOTE_QUERY_TRACE,
    ESCHED_MSG_TYPE_MAX_NUM
} ESCHED_MSG_TYPE;

struct esched_ctrl_msg_cfg_host_pid {
    int vfid;
    int host_ctrl_pid;
    int pid_type;
    int pid;
};

struct esched_ctrl_msg_cfg_pool {
    u32 cpu_type;
};

struct esched_ctrl_msg_get_cpu_mbid {
    u32 cpu_type;
    u32 mb_id;
    u32 wait_mb_id;
};

struct esched_ctrl_msg_cfg_mb {
    u32 vf_id;
};

struct esched_ctrl_msg_intr {
    u32 irq;
};

struct esched_msg_head {
    ESCHED_MSG_TYPE type;
    u32 src_pid;
    int error_code;
    int rsv;
};

struct esched_remote_submit_msg {
    struct sched_published_event_info event_info;
    char msg[SCHED_MAX_EVENT_MSG_LEN_EX];
};

struct esched_publish_msg {
    struct esched_msg_head head;
    struct esched_remote_submit_msg submit_msg;
};

struct esched_remote_query_gid_msg {
    int dst_devid;
    int pid;
    char grp_name[EVENT_MAX_GRP_NAME_LEN];
    u32 gid;
};

struct esched_ctrl_msg_get_pool_id {
    u32 pool_id;
};

struct esched_query_trace_msg {
    struct sched_trace_input para;
    struct sched_sync_event_trace sched_trace;
};

struct esched_ctrl_msg {
    struct esched_msg_head head;
    union {
        struct esched_ctrl_msg_cfg_host_pid host_pid_msg;
        struct esched_ctrl_msg_cfg_pool pool_msg;
        struct esched_ctrl_msg_get_cpu_mbid mbid_msg;
        struct esched_ctrl_msg_cfg_mb mb_msg;
        struct esched_ctrl_msg_intr intr_msg;
        struct esched_remote_query_gid_msg query_gid_msg;
        struct esched_ctrl_msg_get_pool_id pool_id_msg;
        struct esched_query_trace_msg trace_msg;
    };
};

static inline void sched_remote_msg_head_init(struct esched_msg_head *head, ESCHED_MSG_TYPE type)
{
    head->type = type;
    head->error_code = 0;
    head->src_pid = ka_task_get_current()->tgid;
    head->rsv = 0;
}
#endif