/*

 * 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 __DMS_HOTRESET_H

#define __DMS_HOTRESET_H

#include "ka_common_pub.h"

#include "dms_template.h"

#include "devdrv_common.h"



extern int devdrv_manager_container_logical_id_to_physical_id(u32 logical_dev_id, u32 *physical_dev_id, u32 *vfid);

struct devdrv_info *devdrv_manager_get_devdrv_info(u32 dev_id);



#define DMS_MODULE_BASIC_POWER_INFO "dms_basic_power"

INIT_MODULE_FUNC(DMS_MODULE_BASIC_POWER_INFO);

EXIT_MODULE_FUNC(DMS_MODULE_BASIC_POWER_INFO);



#define HOTRESET_TASK_FLAG_BIT 0

#define ALL_DEVICE_HOTRESET_FLAG 0xff



#ifdef CFG_FEATURE_OLD_ALL_DEVICE_RESET_FLAG

#define DEVDRV_RESET_ALL_DEVICE_ID 0xff

#else

#define DEVDRV_RESET_ALL_DEVICE_ID 0xffffffff

#endif



#define DEVDRV_HOTRESET_INFORM_DELAY 500



struct hotreset_task_info {

    unsigned long task_flag;

    unsigned long task_ref_cnt;

    ka_rw_semaphore_t task_rw_sema;

};



int dms_power_hotreset_init(void);

void dms_power_hotreset_exit(void);

int dms_hotreset_task_init(unsigned int dev_id);

#ifdef CFG_FEATURE_SRIOV

void dms_hotreset_vf_task_exit(unsigned int dev_id);

#endif

void dms_hotreset_task_exit(void);



int dms_hotreset_task_cnt_increase(unsigned int dev_id);

void dms_hotreset_task_cnt_decrease(unsigned int dev_id);



int dms_notify_device_hotreset(unsigned int dev_id);

int dms_notify_pre_device_hotreset(unsigned int dev_id);

int dms_hotreset_atomic_setflag(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_hotreset_atomic_clearflag(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_hotreset_assmemble(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_power_pcie_pre_reset(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_power_pcie_pre_reset_v1(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_hotreset_atomic_unbind(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_hotreset_atomic_reset(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_hotreset_atomic_remove(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);

int dms_hotreset_atomic_rescan(void *feature, char *in, unsigned int in_len, char *out, unsigned int out_len);



void dms_notify_single_device_cancel_hotreset(unsigned int dev_id);

int dms_notify_all_device_pre_hotreset(void);

int dms_power_check_phy_mach(unsigned int dev_id);

int devdrv_uda_one_dev_ctrl_hotreset(u32 udevid);

void devdrv_uda_one_dev_ctrl_hotreset_cancel(u32 udevid);



#endif