1a4511307SFan Gong /* SPDX-License-Identifier: GPL-2.0 */ 2a4511307SFan Gong /* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */ 3a4511307SFan Gong 4a4511307SFan Gong #ifndef _HINIC3_EQS_H_ 5a4511307SFan Gong #define _HINIC3_EQS_H_ 6a4511307SFan Gong 7a4511307SFan Gong #include <linux/interrupt.h> 8a4511307SFan Gong 9a4511307SFan Gong #include "hinic3_hw_cfg.h" 10a4511307SFan Gong #include "hinic3_queue_common.h" 11a4511307SFan Gong 12a4511307SFan Gong #define HINIC3_MAX_AEQS 4 13*c4bbfd9bSFan Gong #define HINIC3_MAX_CEQS 32 14a4511307SFan Gong 15a4511307SFan Gong #define HINIC3_AEQ_MAX_PAGES 4 16*c4bbfd9bSFan Gong #define HINIC3_CEQ_MAX_PAGES 8 17a4511307SFan Gong 18a4511307SFan Gong #define HINIC3_AEQE_SIZE 64 19*c4bbfd9bSFan Gong #define HINIC3_CEQE_SIZE 4 20a4511307SFan Gong 21a4511307SFan Gong #define HINIC3_AEQE_DESC_SIZE 4 22a4511307SFan Gong #define HINIC3_AEQE_DATA_SIZE (HINIC3_AEQE_SIZE - HINIC3_AEQE_DESC_SIZE) 23a4511307SFan Gong 24a4511307SFan Gong #define HINIC3_DEFAULT_AEQ_LEN 0x10000 25*c4bbfd9bSFan Gong #define HINIC3_DEFAULT_CEQ_LEN 0x10000 26a4511307SFan Gong 27a4511307SFan Gong #define HINIC3_EQ_IRQ_NAME_LEN 64 28a4511307SFan Gong 29a4511307SFan Gong #define HINIC3_EQ_USLEEP_LOW_BOUND 900 30a4511307SFan Gong #define HINIC3_EQ_USLEEP_HIGH_BOUND 1000 31a4511307SFan Gong 32a4511307SFan Gong enum hinic3_eq_type { 33a4511307SFan Gong HINIC3_AEQ = 0, 34*c4bbfd9bSFan Gong HINIC3_CEQ = 1, 35a4511307SFan Gong }; 36a4511307SFan Gong 37a4511307SFan Gong enum hinic3_eq_intr_mode { 38a4511307SFan Gong HINIC3_INTR_MODE_ARMED = 0, 39a4511307SFan Gong HINIC3_INTR_MODE_ALWAYS = 1, 40a4511307SFan Gong }; 41a4511307SFan Gong 42a4511307SFan Gong enum hinic3_eq_ci_arm_state { 43a4511307SFan Gong HINIC3_EQ_NOT_ARMED = 0, 44a4511307SFan Gong HINIC3_EQ_ARMED = 1, 45a4511307SFan Gong }; 46a4511307SFan Gong 47a4511307SFan Gong struct hinic3_eq { 48a4511307SFan Gong struct hinic3_hwdev *hwdev; 49a4511307SFan Gong struct hinic3_queue_pages qpages; 50a4511307SFan Gong u16 q_id; 51a4511307SFan Gong enum hinic3_eq_type type; 52a4511307SFan Gong u32 eq_len; 53a4511307SFan Gong u32 cons_idx; 54a4511307SFan Gong u8 wrapped; 55a4511307SFan Gong u32 irq_id; 56a4511307SFan Gong u16 msix_entry_idx; 57a4511307SFan Gong char irq_name[HINIC3_EQ_IRQ_NAME_LEN]; 58a4511307SFan Gong struct work_struct aeq_work; 59a4511307SFan Gong }; 60a4511307SFan Gong 61a4511307SFan Gong struct hinic3_aeq_elem { 62a4511307SFan Gong u8 aeqe_data[HINIC3_AEQE_DATA_SIZE]; 63a4511307SFan Gong __be32 desc; 64a4511307SFan Gong }; 65a4511307SFan Gong 66a4511307SFan Gong enum hinic3_aeq_type { 67a4511307SFan Gong HINIC3_HW_INTER_INT = 0, 68a4511307SFan Gong HINIC3_MBX_FROM_FUNC = 1, 69a4511307SFan Gong HINIC3_MSG_FROM_FW = 2, 70a4511307SFan Gong HINIC3_MAX_AEQ_EVENTS = 6, 71a4511307SFan Gong }; 72a4511307SFan Gong 73a4511307SFan Gong typedef void (*hinic3_aeq_event_cb)(struct hinic3_hwdev *hwdev, u8 *data, 74a4511307SFan Gong u8 size); 75a4511307SFan Gong 76a4511307SFan Gong struct hinic3_aeqs { 77a4511307SFan Gong struct hinic3_hwdev *hwdev; 78a4511307SFan Gong hinic3_aeq_event_cb aeq_cb[HINIC3_MAX_AEQ_EVENTS]; 79a4511307SFan Gong struct hinic3_eq aeq[HINIC3_MAX_AEQS]; 80a4511307SFan Gong u16 num_aeqs; 81a4511307SFan Gong struct workqueue_struct *workq; 82a4511307SFan Gong /* lock for aeq event flag */ 83a4511307SFan Gong spinlock_t aeq_lock; 84a4511307SFan Gong }; 85a4511307SFan Gong 86*c4bbfd9bSFan Gong enum hinic3_ceq_event { 87*c4bbfd9bSFan Gong HINIC3_CMDQ = 3, 88*c4bbfd9bSFan Gong HINIC3_MAX_CEQ_EVENTS = 6, 89*c4bbfd9bSFan Gong }; 90*c4bbfd9bSFan Gong 91*c4bbfd9bSFan Gong typedef void (*hinic3_ceq_event_cb)(struct hinic3_hwdev *hwdev, 92*c4bbfd9bSFan Gong __le32 ceqe_data); 93*c4bbfd9bSFan Gong 94*c4bbfd9bSFan Gong struct hinic3_ceqs { 95*c4bbfd9bSFan Gong struct hinic3_hwdev *hwdev; 96*c4bbfd9bSFan Gong 97*c4bbfd9bSFan Gong hinic3_ceq_event_cb ceq_cb[HINIC3_MAX_CEQ_EVENTS]; 98*c4bbfd9bSFan Gong 99*c4bbfd9bSFan Gong struct hinic3_eq ceq[HINIC3_MAX_CEQS]; 100*c4bbfd9bSFan Gong u16 num_ceqs; 101*c4bbfd9bSFan Gong /* lock for ceq event flag */ 102*c4bbfd9bSFan Gong spinlock_t ceq_lock; 103*c4bbfd9bSFan Gong }; 104*c4bbfd9bSFan Gong 105a4511307SFan Gong int hinic3_aeqs_init(struct hinic3_hwdev *hwdev, u16 num_aeqs, 106a4511307SFan Gong struct msix_entry *msix_entries); 107a4511307SFan Gong void hinic3_aeqs_free(struct hinic3_hwdev *hwdev); 108a4511307SFan Gong int hinic3_aeq_register_cb(struct hinic3_hwdev *hwdev, 109a4511307SFan Gong enum hinic3_aeq_type event, 110a4511307SFan Gong hinic3_aeq_event_cb hwe_cb); 111a4511307SFan Gong void hinic3_aeq_unregister_cb(struct hinic3_hwdev *hwdev, 112a4511307SFan Gong enum hinic3_aeq_type event); 113*c4bbfd9bSFan Gong int hinic3_ceqs_init(struct hinic3_hwdev *hwdev, u16 num_ceqs, 114*c4bbfd9bSFan Gong struct msix_entry *msix_entries); 115*c4bbfd9bSFan Gong void hinic3_ceqs_free(struct hinic3_hwdev *hwdev); 116*c4bbfd9bSFan Gong int hinic3_ceq_register_cb(struct hinic3_hwdev *hwdev, 117*c4bbfd9bSFan Gong enum hinic3_ceq_event event, 118*c4bbfd9bSFan Gong hinic3_ceq_event_cb callback); 119*c4bbfd9bSFan Gong void hinic3_ceq_unregister_cb(struct hinic3_hwdev *hwdev, 120*c4bbfd9bSFan Gong enum hinic3_ceq_event event); 121a4511307SFan Gong 122a4511307SFan Gong #endif 123