0001
0002
0003
0004
0005
0006
0007 #ifndef _QED_OOO_H
0008 #define _QED_OOO_H
0009 #include <linux/types.h>
0010 #include <linux/list.h>
0011 #include <linux/slab.h>
0012 #include "qed.h"
0013
0014 #define QED_MAX_NUM_ISLES 256
0015 #define QED_MAX_NUM_OOO_HISTORY_ENTRIES 512
0016
0017 #define QED_OOO_LEFT_BUF 0
0018 #define QED_OOO_RIGHT_BUF 1
0019
0020 struct qed_ooo_buffer {
0021 struct list_head list_entry;
0022 void *rx_buffer_virt_addr;
0023 dma_addr_t rx_buffer_phys_addr;
0024 u32 rx_buffer_size;
0025 u16 packet_length;
0026 u16 parse_flags;
0027 u16 vlan;
0028 u8 placement_offset;
0029 };
0030
0031 struct qed_ooo_isle {
0032 struct list_head list_entry;
0033 struct list_head buffers_list;
0034 };
0035
0036 struct qed_ooo_archipelago {
0037 struct list_head isles_list;
0038 };
0039
0040 struct qed_ooo_history {
0041 struct ooo_opaque *p_cqes;
0042 u32 head_idx;
0043 u32 num_of_cqes;
0044 };
0045
0046 struct qed_ooo_info {
0047 struct list_head free_buffers_list;
0048 struct list_head ready_buffers_list;
0049 struct list_head free_isles_list;
0050 struct qed_ooo_archipelago *p_archipelagos_mem;
0051 struct qed_ooo_isle *p_isles_mem;
0052 struct qed_ooo_history ooo_history;
0053 u32 cur_isles_number;
0054 u32 max_isles_number;
0055 u32 gen_isles_number;
0056 u16 max_num_archipelagos;
0057 u16 cid_base;
0058 };
0059
0060 #if IS_ENABLED(CONFIG_QED_OOO)
0061 void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
0062 struct qed_ooo_info *p_ooo_info,
0063 struct ooo_opaque *p_cqe);
0064
0065 int qed_ooo_alloc(struct qed_hwfn *p_hwfn);
0066
0067 void qed_ooo_setup(struct qed_hwfn *p_hwfn);
0068
0069 void qed_ooo_free(struct qed_hwfn *p_hwfn);
0070
0071 void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
0072 struct qed_ooo_info *p_ooo_info,
0073 u32 cid);
0074
0075 void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
0076 struct qed_ooo_info *p_ooo_info);
0077
0078 void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
0079 struct qed_ooo_info *p_ooo_info,
0080 struct qed_ooo_buffer *p_buffer);
0081
0082 struct qed_ooo_buffer *
0083 qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
0084 struct qed_ooo_info *p_ooo_info);
0085
0086 void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
0087 struct qed_ooo_info *p_ooo_info,
0088 struct qed_ooo_buffer *p_buffer, u8 on_tail);
0089
0090 struct qed_ooo_buffer *
0091 qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
0092 struct qed_ooo_info *p_ooo_info);
0093
0094 void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
0095 struct qed_ooo_info *p_ooo_info,
0096 u32 cid, u8 drop_isle, u8 drop_size);
0097
0098 void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
0099 struct qed_ooo_info *p_ooo_info,
0100 u32 cid,
0101 u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
0102
0103 void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
0104 struct qed_ooo_info *p_ooo_info,
0105 u32 cid,
0106 u8 ooo_isle,
0107 struct qed_ooo_buffer *p_buffer, u8 buffer_side);
0108
0109 void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
0110 struct qed_ooo_info *p_ooo_info, u32 cid,
0111 u8 left_isle);
0112 #else
0113 static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
0114 struct qed_ooo_info *p_ooo_info,
0115 struct ooo_opaque *p_cqe) {}
0116
0117 static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn)
0118 {
0119 return -EINVAL;
0120 }
0121
0122 static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {}
0123
0124 static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {}
0125
0126 static inline void
0127 qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
0128 struct qed_ooo_info *p_ooo_info,
0129 u32 cid) {}
0130
0131 static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
0132 struct qed_ooo_info *p_ooo_info)
0133 {}
0134
0135 static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
0136 struct qed_ooo_info *p_ooo_info,
0137 struct qed_ooo_buffer *p_buffer) {}
0138
0139 static inline struct qed_ooo_buffer *
0140 qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
0141 struct qed_ooo_info *p_ooo_info) { return NULL; }
0142
0143 static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
0144 struct qed_ooo_info *p_ooo_info,
0145 struct qed_ooo_buffer *p_buffer,
0146 u8 on_tail) {}
0147
0148 static inline struct qed_ooo_buffer *
0149 qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
0150 struct qed_ooo_info *p_ooo_info) { return NULL; }
0151
0152 static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
0153 struct qed_ooo_info *p_ooo_info,
0154 u32 cid, u8 drop_isle, u8 drop_size) {}
0155
0156 static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
0157 struct qed_ooo_info *p_ooo_info,
0158 u32 cid, u8 ooo_isle,
0159 struct qed_ooo_buffer *p_buffer) {}
0160
0161 static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
0162 struct qed_ooo_info *p_ooo_info,
0163 u32 cid, u8 ooo_isle,
0164 struct qed_ooo_buffer *p_buffer,
0165 u8 buffer_side) {}
0166
0167 static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
0168 struct qed_ooo_info *p_ooo_info, u32 cid,
0169 u8 left_isle) {}
0170 #endif
0171
0172 #endif