1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* Copyright (C) 2024 Intel Corporation */ 3 4 #ifndef _IDPF_VIRTCHNL_H_ 5 #define _IDPF_VIRTCHNL_H_ 6 7 #include <linux/net/intel/virtchnl2.h> 8 9 #define IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC (60 * 1000) 10 11 struct idpf_adapter; 12 struct idpf_netdev_priv; 13 struct idpf_vec_regs; 14 struct idpf_vport; 15 struct idpf_vport_max_q; 16 struct idpf_vport_config; 17 struct idpf_vport_user_config_data; 18 19 int idpf_init_dflt_mbx(struct idpf_adapter *adapter); 20 void idpf_deinit_dflt_mbx(struct idpf_adapter *adapter); 21 int idpf_vc_core_init(struct idpf_adapter *adapter); 22 void idpf_vc_core_deinit(struct idpf_adapter *adapter); 23 24 int idpf_get_reg_intr_vecs(struct idpf_adapter *adapter, 25 struct idpf_vec_regs *reg_vals, int num_vecs); 26 int idpf_queue_reg_init(struct idpf_vport *vport, 27 struct idpf_q_vec_rsrc *rsrc, 28 struct idpf_queue_id_reg_info *chunks); 29 int idpf_vport_queue_ids_init(struct idpf_vport *vport, 30 struct idpf_q_vec_rsrc *rsrc, 31 struct idpf_queue_id_reg_info *chunks); 32 static inline void 33 idpf_vport_deinit_queue_reg_chunks(struct idpf_vport_config *vport_cfg) 34 { 35 kfree(vport_cfg->qid_reg_info.queue_chunks); 36 vport_cfg->qid_reg_info.queue_chunks = NULL; 37 } 38 39 bool idpf_vport_is_cap_ena(struct idpf_vport *vport, u16 flag); 40 bool idpf_sideband_flow_type_ena(struct idpf_vport *vport, u32 flow_type); 41 bool idpf_sideband_action_ena(struct idpf_vport *vport, 42 struct ethtool_rx_flow_spec *fsp); 43 unsigned int idpf_fsteer_max_rules(struct idpf_vport *vport); 44 45 void idpf_recv_event_msg(struct libie_ctlq_ctx *ctx, 46 struct libie_ctlq_msg *ctlq_msg); 47 int idpf_send_mb_msg(struct idpf_adapter *adapter, 48 struct libie_ctlq_xn_send_params *xn_params, 49 void *send_buf, size_t send_buf_size); 50 int idpf_send_mb_msg_kfree(struct idpf_adapter *adapter, 51 struct libie_ctlq_xn_send_params *xn_params, 52 void *send_buf, size_t send_buf_size); 53 void idpf_send_vf_reset_msg(struct idpf_adapter *adapter); 54 bool idpf_mmio_region_non_static(struct libie_mmio_info *mmio_info, 55 struct libie_pci_mmio_region *reg); 56 57 /** 58 * idpf_send_mb_msg_stack - send a mailbox message from an on-stack buffer 59 * @adapter: driver specific private structure 60 * @xn_params: Xn send parameters to fill 61 * @ptr: pointer to the on-stack message object to send 62 * 63 * Send size is deduced based on the pointer type. 64 * 65 * Return: %0 on success, -%errno on failure. 66 */ 67 #define idpf_send_mb_msg_stack(adapter, xn_params, ptr) \ 68 ({ \ 69 typeof(ptr) __ptr = (ptr); \ 70 \ 71 static_assert(sizeof(*__ptr) <= LIBIE_CP_TX_COPYBREAK); \ 72 idpf_send_mb_msg(adapter, xn_params, __ptr, sizeof(*__ptr)); \ 73 }) 74 75 struct idpf_queue_ptr { 76 enum virtchnl2_queue_type type; 77 union { 78 struct idpf_rx_queue *rxq; 79 struct idpf_tx_queue *txq; 80 struct idpf_buf_queue *bufq; 81 struct idpf_compl_queue *complq; 82 }; 83 }; 84 85 struct idpf_queue_set { 86 struct idpf_adapter *adapter; 87 struct idpf_q_vec_rsrc *qv_rsrc; 88 u32 vport_id; 89 90 u32 num; 91 struct idpf_queue_ptr qs[] __counted_by(num); 92 }; 93 94 struct idpf_queue_set *idpf_alloc_queue_set(struct idpf_adapter *adapter, 95 struct idpf_q_vec_rsrc *rsrc, 96 u32 vport_id, u32 num); 97 98 int idpf_send_enable_queue_set_msg(const struct idpf_queue_set *qs); 99 int idpf_send_disable_queue_set_msg(const struct idpf_queue_set *qs); 100 int idpf_send_config_queue_set_msg(const struct idpf_queue_set *qs); 101 102 int idpf_send_disable_queues_msg(struct idpf_vport *vport); 103 int idpf_send_enable_queues_msg(struct idpf_vport *vport); 104 int idpf_send_config_queues_msg(struct idpf_adapter *adapter, 105 struct idpf_q_vec_rsrc *rsrc, 106 u32 vport_id); 107 108 int idpf_vport_init(struct idpf_vport *vport, struct idpf_vport_max_q *max_q); 109 u32 idpf_get_vport_id(struct idpf_vport *vport); 110 int idpf_send_create_vport_msg(struct idpf_adapter *adapter, 111 struct idpf_vport_max_q *max_q); 112 int idpf_send_destroy_vport_msg(struct idpf_adapter *adapter, u32 vport_id); 113 int idpf_send_enable_vport_msg(struct idpf_adapter *adapter, u32 vport_id); 114 int idpf_send_disable_vport_msg(struct idpf_adapter *adapter, u32 vport_id); 115 116 int idpf_vport_adjust_qs(struct idpf_vport *vport, 117 struct idpf_q_vec_rsrc *rsrc); 118 int idpf_vport_alloc_max_qs(struct idpf_adapter *adapter, 119 struct idpf_vport_max_q *max_q); 120 void idpf_vport_dealloc_max_qs(struct idpf_adapter *adapter, 121 struct idpf_vport_max_q *max_q); 122 int idpf_send_add_queues_msg(struct idpf_adapter *adapter, 123 struct idpf_vport_config *vport_config, 124 struct idpf_q_vec_rsrc *rsrc, 125 u32 vport_id); 126 int idpf_send_delete_queues_msg(struct idpf_adapter *adapter, 127 struct idpf_queue_id_reg_info *chunks, 128 u32 vport_id); 129 130 int idpf_vport_alloc_vec_indexes(struct idpf_vport *vport, 131 struct idpf_q_vec_rsrc *rsrc); 132 int idpf_get_vec_ids(struct idpf_adapter *adapter, 133 u16 *vecids, int num_vecids, 134 struct virtchnl2_vector_chunks *chunks); 135 int idpf_send_alloc_vectors_msg(struct idpf_adapter *adapter, u16 num_vectors); 136 int idpf_send_dealloc_vectors_msg(struct idpf_adapter *adapter); 137 int idpf_send_map_unmap_queue_vector_msg(struct idpf_adapter *adapter, 138 struct idpf_q_vec_rsrc *rsrc, 139 u32 vport_id, 140 bool map); 141 142 int idpf_add_del_mac_filters(struct idpf_adapter *adapter, 143 struct idpf_vport_config *vport_config, 144 const u8 *default_mac_addr, u32 vport_id, 145 bool add, bool async); 146 int idpf_set_promiscuous(struct idpf_adapter *adapter, 147 struct idpf_vport_user_config_data *config_data, 148 u32 vport_id); 149 int idpf_check_supported_desc_ids(struct idpf_vport *vport); 150 int idpf_send_ena_dis_loopback_msg(struct idpf_adapter *adapter, u32 vport_id, 151 bool loopback_ena); 152 int idpf_send_get_stats_msg(struct idpf_netdev_priv *np, 153 struct idpf_port_stats *port_stats); 154 int idpf_send_set_sriov_vfs_msg(struct idpf_adapter *adapter, u16 num_vfs); 155 int idpf_send_set_rss_key_msg(struct idpf_adapter *adapter, 156 struct idpf_rss_data *rss_data, u32 vport_id); 157 int idpf_send_set_rss_lut_msg(struct idpf_adapter *adapter, 158 struct idpf_rss_data *rss_data, u32 vport_id); 159 int idpf_idc_rdma_vc_send_sync(struct iidc_rdma_core_dev_info *cdev_info, 160 u8 *send_msg, u16 msg_size, 161 u8 *recv_msg, u16 *recv_len); 162 163 #endif /* _IDPF_VIRTCHNL_H_ */ 164