162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (c) 2021, MediaTek Inc. 462306a36Sopenharmony_ci * Copyright (c) 2021-2022, Intel Corporation. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Authors: 762306a36Sopenharmony_ci * Haijun Liu <haijun.liu@mediatek.com> 862306a36Sopenharmony_ci * Eliot Lee <eliot.lee@intel.com> 962306a36Sopenharmony_ci * Moises Veleta <moises.veleta@intel.com> 1062306a36Sopenharmony_ci * Ricardo Martinez <ricardo.martinez@linux.intel.com> 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * Contributors: 1362306a36Sopenharmony_ci * Amir Hanania <amir.hanania@intel.com> 1462306a36Sopenharmony_ci * Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com> 1562306a36Sopenharmony_ci * Sreehari Kancharla <sreehari.kancharla@intel.com> 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef __T7XX_MODEM_OPS_H__ 1962306a36Sopenharmony_ci#define __T7XX_MODEM_OPS_H__ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <linux/spinlock.h> 2262306a36Sopenharmony_ci#include <linux/types.h> 2362306a36Sopenharmony_ci#include <linux/workqueue.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include "t7xx_hif_cldma.h" 2662306a36Sopenharmony_ci#include "t7xx_pci.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define FEATURE_COUNT 64 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/** 3162306a36Sopenharmony_ci * enum hif_ex_stage - HIF exception handshake stages with the HW. 3262306a36Sopenharmony_ci * @HIF_EX_INIT: Disable and clear TXQ. 3362306a36Sopenharmony_ci * @HIF_EX_INIT_DONE: Polling for initialization to be done. 3462306a36Sopenharmony_ci * @HIF_EX_CLEARQ_DONE: Disable RX, flush TX/RX workqueues and clear RX. 3562306a36Sopenharmony_ci * @HIF_EX_ALLQ_RESET: HW is back in safe mode for re-initialization and restart. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_cienum hif_ex_stage { 3862306a36Sopenharmony_ci HIF_EX_INIT, 3962306a36Sopenharmony_ci HIF_EX_INIT_DONE, 4062306a36Sopenharmony_ci HIF_EX_CLEARQ_DONE, 4162306a36Sopenharmony_ci HIF_EX_ALLQ_RESET, 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistruct mtk_runtime_feature { 4562306a36Sopenharmony_ci u8 feature_id; 4662306a36Sopenharmony_ci u8 support_info; 4762306a36Sopenharmony_ci u8 reserved[2]; 4862306a36Sopenharmony_ci __le32 data_len; 4962306a36Sopenharmony_ci __le32 data[]; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cienum md_event_id { 5362306a36Sopenharmony_ci FSM_PRE_START, 5462306a36Sopenharmony_ci FSM_START, 5562306a36Sopenharmony_ci FSM_READY, 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct t7xx_sys_info { 5962306a36Sopenharmony_ci bool ready; 6062306a36Sopenharmony_ci bool handshake_ongoing; 6162306a36Sopenharmony_ci u8 feature_set[FEATURE_COUNT]; 6262306a36Sopenharmony_ci struct t7xx_port *ctl_port; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct t7xx_modem { 6662306a36Sopenharmony_ci struct cldma_ctrl *md_ctrl[CLDMA_NUM]; 6762306a36Sopenharmony_ci struct t7xx_pci_dev *t7xx_dev; 6862306a36Sopenharmony_ci struct t7xx_sys_info core_md; 6962306a36Sopenharmony_ci struct t7xx_sys_info core_ap; 7062306a36Sopenharmony_ci bool md_init_finish; 7162306a36Sopenharmony_ci bool rgu_irq_asserted; 7262306a36Sopenharmony_ci struct workqueue_struct *handshake_wq; 7362306a36Sopenharmony_ci struct work_struct handshake_work; 7462306a36Sopenharmony_ci struct work_struct ap_handshake_work; 7562306a36Sopenharmony_ci struct t7xx_fsm_ctl *fsm_ctl; 7662306a36Sopenharmony_ci struct port_proxy *port_prox; 7762306a36Sopenharmony_ci unsigned int exp_id; 7862306a36Sopenharmony_ci spinlock_t exp_lock; /* Protects exception events */ 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_civoid t7xx_md_exception_handshake(struct t7xx_modem *md); 8262306a36Sopenharmony_civoid t7xx_md_event_notify(struct t7xx_modem *md, enum md_event_id evt_id); 8362306a36Sopenharmony_ciint t7xx_md_reset(struct t7xx_pci_dev *t7xx_dev); 8462306a36Sopenharmony_ciint t7xx_md_init(struct t7xx_pci_dev *t7xx_dev); 8562306a36Sopenharmony_civoid t7xx_md_exit(struct t7xx_pci_dev *t7xx_dev); 8662306a36Sopenharmony_civoid t7xx_clear_rgu_irq(struct t7xx_pci_dev *t7xx_dev); 8762306a36Sopenharmony_ciint t7xx_acpi_fldr_func(struct t7xx_pci_dev *t7xx_dev); 8862306a36Sopenharmony_ciint t7xx_pci_mhccif_isr(struct t7xx_pci_dev *t7xx_dev); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci#endif /* __T7XX_MODEM_OPS_H__ */ 91