/* SPDX-License-Identifier: GPL-2.0-only
 *
 * Copyright (c) 2021, MediaTek Inc.
 * Copyright (c) 2021-2022, Intel Corporation.
 *
 * Authors:
 *  Haijun Liu <haijun.liu@mediatek.com>
 *  Eliot Lee <eliot.lee@intel.com>
 *  Moises Veleta <moises.veleta@intel.com>
 *  Ricardo Martinez <ricardo.martinez@linux.intel.com>
 *
 * Contributors:
 *  Amir Hanania <amir.hanania@intel.com>
 *  Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com>
 *  Sreehari Kancharla <sreehari.kancharla@intel.com>
 */

#ifndef __T7XX_MODEM_OPS_H__
#define __T7XX_MODEM_OPS_H__

#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/workqueue.h>

#include "t7xx_hif_cldma.h"
#include "t7xx_pci.h"

#define FEATURE_COUNT		64

/**
 * enum hif_ex_stage -	HIF exception handshake stages with the HW.
 * @HIF_EX_INIT:        Disable and clear TXQ.
 * @HIF_EX_INIT_DONE:   Polling for initialization to be done.
 * @HIF_EX_CLEARQ_DONE: Disable RX, flush TX/RX workqueues and clear RX.
 * @HIF_EX_ALLQ_RESET:  HW is back in safe mode for re-initialization and restart.
 */
enum hif_ex_stage {
	HIF_EX_INIT,
	HIF_EX_INIT_DONE,
	HIF_EX_CLEARQ_DONE,
	HIF_EX_ALLQ_RESET,
};

struct mtk_runtime_feature {
	u8				feature_id;
	u8				support_info;
	u8				reserved[2];
	__le32				data_len;
	__le32				data[];
};

enum md_event_id {
	FSM_PRE_START,
	FSM_START,
	FSM_READY,
};

struct t7xx_sys_info {
	bool				ready;
	bool				handshake_ongoing;
	u8				feature_set[FEATURE_COUNT];
	struct t7xx_port		*ctl_port;
};

struct t7xx_modem {
	struct cldma_ctrl		*md_ctrl[CLDMA_NUM];
	struct t7xx_pci_dev		*t7xx_dev;
	struct t7xx_sys_info		core_md;
	struct t7xx_sys_info		core_ap;
	bool				md_init_finish;
	bool				rgu_irq_asserted;
	struct workqueue_struct		*handshake_wq;
	struct work_struct		handshake_work;
	struct work_struct		ap_handshake_work;
	struct t7xx_fsm_ctl		*fsm_ctl;
	struct port_proxy		*port_prox;
	unsigned int			exp_id;
	spinlock_t			exp_lock; /* Protects exception events */
};

void t7xx_md_exception_handshake(struct t7xx_modem *md);
void t7xx_md_event_notify(struct t7xx_modem *md, enum md_event_id evt_id);
int t7xx_md_reset(struct t7xx_pci_dev *t7xx_dev);
int t7xx_md_init(struct t7xx_pci_dev *t7xx_dev);
void t7xx_md_exit(struct t7xx_pci_dev *t7xx_dev);
void t7xx_clear_rgu_irq(struct t7xx_pci_dev *t7xx_dev);
int t7xx_acpi_fldr_func(struct t7xx_pci_dev *t7xx_dev);
int t7xx_acpi_pldr_func(struct t7xx_pci_dev *t7xx_dev);
int t7xx_pci_mhccif_isr(struct t7xx_pci_dev *t7xx_dev);

#endif	/* __T7XX_MODEM_OPS_H__ */
