1 /* SPDX-License-Identifier: GPL-2.0-only 2 * 3 * Copyright (c) 2021, MediaTek Inc. 4 * Copyright (c) 2021-2022, Intel Corporation. 5 * 6 * Authors: 7 * Haijun Liu <haijun.liu@mediatek.com> 8 * Eliot Lee <eliot.lee@intel.com> 9 * Moises Veleta <moises.veleta@intel.com> 10 * Ricardo Martinez <ricardo.martinez@linux.intel.com> 11 * 12 * Contributors: 13 * Amir Hanania <amir.hanania@intel.com> 14 * Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com> 15 * Sreehari Kancharla <sreehari.kancharla@intel.com> 16 */ 17 18 #ifndef __T7XX_MODEM_OPS_H__ 19 #define __T7XX_MODEM_OPS_H__ 20 21 #include <linux/spinlock.h> 22 #include <linux/types.h> 23 #include <linux/workqueue.h> 24 25 #include "t7xx_hif_cldma.h" 26 #include "t7xx_pci.h" 27 28 #define FEATURE_COUNT 64 29 30 /** 31 * enum hif_ex_stage - HIF exception handshake stages with the HW. 32 * @HIF_EX_INIT: Disable and clear TXQ. 33 * @HIF_EX_INIT_DONE: Polling for initialization to be done. 34 * @HIF_EX_CLEARQ_DONE: Disable RX, flush TX/RX workqueues and clear RX. 35 * @HIF_EX_ALLQ_RESET: HW is back in safe mode for re-initialization and restart. 36 */ 37 enum hif_ex_stage { 38 HIF_EX_INIT, 39 HIF_EX_INIT_DONE, 40 HIF_EX_CLEARQ_DONE, 41 HIF_EX_ALLQ_RESET, 42 }; 43 44 struct mtk_runtime_feature { 45 u8 feature_id; 46 u8 support_info; 47 u8 reserved[2]; 48 __le32 data_len; 49 __le32 data[]; 50 }; 51 52 enum md_event_id { 53 FSM_PRE_START, 54 FSM_START, 55 FSM_READY, 56 }; 57 58 struct t7xx_sys_info { 59 bool ready; 60 bool handshake_ongoing; 61 u8 feature_set[FEATURE_COUNT]; 62 struct t7xx_port *ctl_port; 63 }; 64 65 struct t7xx_modem { 66 struct cldma_ctrl *md_ctrl[CLDMA_NUM]; 67 struct t7xx_pci_dev *t7xx_dev; 68 struct t7xx_sys_info core_md; 69 struct t7xx_sys_info core_ap; 70 bool md_init_finish; 71 bool rgu_irq_asserted; 72 struct workqueue_struct *handshake_wq; 73 struct work_struct handshake_work; 74 struct work_struct ap_handshake_work; 75 struct t7xx_fsm_ctl *fsm_ctl; 76 struct port_proxy *port_prox; 77 unsigned int exp_id; 78 spinlock_t exp_lock; /* Protects exception events */ 79 }; 80 81 enum reset_type { 82 FLDR, 83 PLDR, 84 FASTBOOT, 85 }; 86 87 void t7xx_md_exception_handshake(struct t7xx_modem *md); 88 void t7xx_md_event_notify(struct t7xx_modem *md, enum md_event_id evt_id); 89 int t7xx_md_reset(struct t7xx_pci_dev *t7xx_dev); 90 int t7xx_md_init(struct t7xx_pci_dev *t7xx_dev); 91 void t7xx_md_exit(struct t7xx_pci_dev *t7xx_dev); 92 void t7xx_clear_rgu_irq(struct t7xx_pci_dev *t7xx_dev); 93 int t7xx_reset_device(struct t7xx_pci_dev *t7xx_dev, enum reset_type type); 94 int t7xx_pci_mhccif_isr(struct t7xx_pci_dev *t7xx_dev); 95 96 #endif /* __T7XX_MODEM_OPS_H__ */ 97