18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 28c2ecf20Sopenharmony_ci/* QLogic qed NIC Driver 38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017 QLogic Corporation 48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _QED_OOO_H 88c2ecf20Sopenharmony_ci#define _QED_OOO_H 98c2ecf20Sopenharmony_ci#include <linux/types.h> 108c2ecf20Sopenharmony_ci#include <linux/list.h> 118c2ecf20Sopenharmony_ci#include <linux/slab.h> 128c2ecf20Sopenharmony_ci#include "qed.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define QED_MAX_NUM_ISLES 256 158c2ecf20Sopenharmony_ci#define QED_MAX_NUM_OOO_HISTORY_ENTRIES 512 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define QED_OOO_LEFT_BUF 0 188c2ecf20Sopenharmony_ci#define QED_OOO_RIGHT_BUF 1 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct qed_ooo_buffer { 218c2ecf20Sopenharmony_ci struct list_head list_entry; 228c2ecf20Sopenharmony_ci void *rx_buffer_virt_addr; 238c2ecf20Sopenharmony_ci dma_addr_t rx_buffer_phys_addr; 248c2ecf20Sopenharmony_ci u32 rx_buffer_size; 258c2ecf20Sopenharmony_ci u16 packet_length; 268c2ecf20Sopenharmony_ci u16 parse_flags; 278c2ecf20Sopenharmony_ci u16 vlan; 288c2ecf20Sopenharmony_ci u8 placement_offset; 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct qed_ooo_isle { 328c2ecf20Sopenharmony_ci struct list_head list_entry; 338c2ecf20Sopenharmony_ci struct list_head buffers_list; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct qed_ooo_archipelago { 378c2ecf20Sopenharmony_ci struct list_head isles_list; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistruct qed_ooo_history { 418c2ecf20Sopenharmony_ci struct ooo_opaque *p_cqes; 428c2ecf20Sopenharmony_ci u32 head_idx; 438c2ecf20Sopenharmony_ci u32 num_of_cqes; 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistruct qed_ooo_info { 478c2ecf20Sopenharmony_ci struct list_head free_buffers_list; 488c2ecf20Sopenharmony_ci struct list_head ready_buffers_list; 498c2ecf20Sopenharmony_ci struct list_head free_isles_list; 508c2ecf20Sopenharmony_ci struct qed_ooo_archipelago *p_archipelagos_mem; 518c2ecf20Sopenharmony_ci struct qed_ooo_isle *p_isles_mem; 528c2ecf20Sopenharmony_ci struct qed_ooo_history ooo_history; 538c2ecf20Sopenharmony_ci u32 cur_isles_number; 548c2ecf20Sopenharmony_ci u32 max_isles_number; 558c2ecf20Sopenharmony_ci u32 gen_isles_number; 568c2ecf20Sopenharmony_ci u16 max_num_archipelagos; 578c2ecf20Sopenharmony_ci u16 cid_base; 588c2ecf20Sopenharmony_ci}; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_QED_OOO) 618c2ecf20Sopenharmony_civoid qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn, 628c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 638c2ecf20Sopenharmony_ci struct ooo_opaque *p_cqe); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ciint qed_ooo_alloc(struct qed_hwfn *p_hwfn); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_civoid qed_ooo_setup(struct qed_hwfn *p_hwfn); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_civoid qed_ooo_free(struct qed_hwfn *p_hwfn); 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_civoid qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 728c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 738c2ecf20Sopenharmony_ci u32 cid); 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_civoid qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 768c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info); 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_civoid qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn, 798c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 808c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer); 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_cistruct qed_ooo_buffer * 838c2ecf20Sopenharmony_ciqed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, 848c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info); 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_civoid qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn, 878c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 888c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer, u8 on_tail); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistruct qed_ooo_buffer * 918c2ecf20Sopenharmony_ciqed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, 928c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_civoid qed_ooo_delete_isles(struct qed_hwfn *p_hwfn, 958c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 968c2ecf20Sopenharmony_ci u32 cid, u8 drop_isle, u8 drop_size); 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_civoid qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn, 998c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1008c2ecf20Sopenharmony_ci u32 cid, 1018c2ecf20Sopenharmony_ci u8 ooo_isle, struct qed_ooo_buffer *p_buffer); 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_civoid qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn, 1048c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1058c2ecf20Sopenharmony_ci u32 cid, 1068c2ecf20Sopenharmony_ci u8 ooo_isle, 1078c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer, u8 buffer_side); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_civoid qed_ooo_join_isles(struct qed_hwfn *p_hwfn, 1108c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, u32 cid, 1118c2ecf20Sopenharmony_ci u8 left_isle); 1128c2ecf20Sopenharmony_ci#else /* IS_ENABLED(CONFIG_QED_ISCSI) */ 1138c2ecf20Sopenharmony_cistatic inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn, 1148c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1158c2ecf20Sopenharmony_ci struct ooo_opaque *p_cqe) {} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci return -EINVAL; 1208c2ecf20Sopenharmony_ci} 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistatic inline void 1278c2ecf20Sopenharmony_ciqed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 1288c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1298c2ecf20Sopenharmony_ci u32 cid) {} 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 1328c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info) 1338c2ecf20Sopenharmony_ci {} 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_cistatic inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn, 1368c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1378c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer) {} 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_cistatic inline struct qed_ooo_buffer * 1408c2ecf20Sopenharmony_ciqed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, 1418c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info) { return NULL; } 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistatic inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn, 1448c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1458c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer, 1468c2ecf20Sopenharmony_ci u8 on_tail) {} 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cistatic inline struct qed_ooo_buffer * 1498c2ecf20Sopenharmony_ciqed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, 1508c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info) { return NULL; } 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistatic inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn, 1538c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1548c2ecf20Sopenharmony_ci u32 cid, u8 drop_isle, u8 drop_size) {} 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistatic inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn, 1578c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1588c2ecf20Sopenharmony_ci u32 cid, u8 ooo_isle, 1598c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer) {} 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistatic inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn, 1628c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, 1638c2ecf20Sopenharmony_ci u32 cid, u8 ooo_isle, 1648c2ecf20Sopenharmony_ci struct qed_ooo_buffer *p_buffer, 1658c2ecf20Sopenharmony_ci u8 buffer_side) {} 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistatic inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn, 1688c2ecf20Sopenharmony_ci struct qed_ooo_info *p_ooo_info, u32 cid, 1698c2ecf20Sopenharmony_ci u8 left_isle) {} 1708c2ecf20Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_QED_ISCSI) */ 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci#endif 173