1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019-2023 Broadcom 3 * All rights reserved. 4 */ 5 6 #ifndef _TF_EXT_FLOW_HANDLE_H_ 7 #define _TF_EXT_FLOW_HANDLE_H_ 8 9 #define TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK 0x00000000F0000000ULL 10 #define TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT 28 11 #define TF_FLOW_TYPE_FLOW_HANDLE_MASK 0x00000000000000F0ULL 12 #define TF_FLOW_TYPE_FLOW_HANDLE_SFT 4 13 #define TF_FLAGS_FLOW_HANDLE_MASK 0x000000000000000FULL 14 #define TF_FLAGS_FLOW_HANDLE_SFT 0 15 #define TF_INDEX_FLOW_HANDLE_MASK 0xFFFFFFF000000000ULL 16 #define TF_INDEX_FLOW_HANDLE_SFT 36 17 #define TF_ENTRY_NUM_FLOW_HANDLE_MASK 0x0000000E00000000ULL 18 #define TF_ENTRY_NUM_FLOW_HANDLE_SFT 33 19 #define TF_HASH_TYPE_FLOW_HANDLE_MASK 0x0000000100000000ULL 20 #define TF_HASH_TYPE_FLOW_HANDLE_SFT 32 21 22 #define TF_FLAGS_FLOW_HANDLE_INTERNAL 0x2 23 #define TF_FLAGS_FLOW_HANDLE_EXTERNAL 0x0 24 25 #define TF_FLOW_HANDLE_MASK (TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK | \ 26 TF_FLOW_TYPE_FLOW_HANDLE_MASK | \ 27 TF_FLAGS_FLOW_HANDLE_MASK | \ 28 TF_INDEX_FLOW_HANDLE_MASK | \ 29 TF_ENTRY_NUM_FLOW_HANDLE_MASK | \ 30 TF_HASH_TYPE_FLOW_HANDLE_MASK) 31 32 #define TF_GET_FIELDS_FROM_FLOW_HANDLE(flow_handle, \ 33 num_key_entries, \ 34 flow_type, \ 35 flags, \ 36 index, \ 37 entry_num, \ 38 hash_type) \ 39 do { \ 40 (num_key_entries) = \ 41 (((flow_handle) & TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK) >> \ 42 TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT); \ 43 (flow_type) = (((flow_handle) & TF_FLOW_TYPE_FLOW_HANDLE_MASK) >> \ 44 TF_FLOW_TYPE_FLOW_HANDLE_SFT); \ 45 (flags) = (((flow_handle) & TF_FLAGS_FLOW_HANDLE_MASK) >> \ 46 TF_FLAGS_FLOW_HANDLE_SFT); \ 47 (index) = (((flow_handle) & TF_INDEX_FLOW_HANDLE_MASK) >> \ 48 TF_INDEX_FLOW_HANDLE_SFT); \ 49 (entry_num) = (((flow_handle) & TF_ENTRY_NUM_FLOW_HANDLE_MASK) >> \ 50 TF_ENTRY_NUM_FLOW_HANDLE_SFT); \ 51 (hash_type) = (((flow_handle) & TF_HASH_TYPE_FLOW_HANDLE_MASK) >> \ 52 TF_HASH_TYPE_FLOW_HANDLE_SFT); \ 53 } while (0) 54 55 #define TF_SET_FIELDS_IN_FLOW_HANDLE(flow_handle, \ 56 num_key_entries, \ 57 flow_type, \ 58 flags, \ 59 index, \ 60 entry_num, \ 61 hash_type) \ 62 do { \ 63 (flow_handle) &= ~TF_FLOW_HANDLE_MASK; \ 64 (flow_handle) |= \ 65 (((num_key_entries) << TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT) & \ 66 TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK); \ 67 (flow_handle) |= (((flow_type) << TF_FLOW_TYPE_FLOW_HANDLE_SFT) & \ 68 TF_FLOW_TYPE_FLOW_HANDLE_MASK); \ 69 (flow_handle) |= (((flags) << TF_FLAGS_FLOW_HANDLE_SFT) & \ 70 TF_FLAGS_FLOW_HANDLE_MASK); \ 71 (flow_handle) |= ((((uint64_t)index) << TF_INDEX_FLOW_HANDLE_SFT) & \ 72 TF_INDEX_FLOW_HANDLE_MASK); \ 73 (flow_handle) |= \ 74 ((((uint64_t)entry_num) << TF_ENTRY_NUM_FLOW_HANDLE_SFT) & \ 75 TF_ENTRY_NUM_FLOW_HANDLE_MASK); \ 76 (flow_handle) |= \ 77 ((((uint64_t)hash_type) << TF_HASH_TYPE_FLOW_HANDLE_SFT) & \ 78 TF_HASH_TYPE_FLOW_HANDLE_MASK); \ 79 } while (0) 80 #define TF_SET_FIELDS_IN_WH_FLOW_HANDLE TF_SET_FIELDS_IN_FLOW_HANDLE 81 82 #define TF_GET_INDEX_FROM_FLOW_HANDLE(flow_handle, \ 83 index) \ 84 do { \ 85 index = (((flow_handle) & TF_INDEX_FLOW_HANDLE_MASK) >> \ 86 TF_INDEX_FLOW_HANDLE_SFT); \ 87 } while (0) 88 89 #define TF_GET_HASH_TYPE_FROM_FLOW_HANDLE(flow_handle, \ 90 hash_type) \ 91 do { \ 92 hash_type = (((flow_handle) & TF_HASH_TYPE_FLOW_HANDLE_MASK) >> \ 93 TF_HASH_TYPE_FLOW_HANDLE_SFT); \ 94 } while (0) 95 96 #define TF_GET_NUM_KEY_ENTRIES_FROM_FLOW_HANDLE(flow_handle, \ 97 num_key_entries) \ 98 do { \ 99 (num_key_entries = \ 100 (((flow_handle) & TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK) >> \ 101 TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT)); \ 102 } while (0) 103 104 #define TF_GET_ENTRY_NUM_FROM_FLOW_HANDLE(flow_handle, \ 105 entry_num) \ 106 do { \ 107 (entry_num = \ 108 (((flow_handle) & TF_ENTRY_NUM_FLOW_HANDLE_MASK) >> \ 109 TF_ENTRY_NUM_FLOW_HANDLE_SFT)); \ 110 } while (0) 111 112 #define TF_GET_FLAG_FROM_FLOW_HANDLE(flow_handle, flag) \ 113 (flag = (((flow_handle) & TF_FLAGS_FLOW_HANDLE_MASK) >>\ 114 TF_FLAGS_FLOW_HANDLE_SFT)) 115 116 /* 117 * 32 bit Flow ID handlers 118 */ 119 #define TF_GFID_FLOW_ID_MASK 0xFFFFFFF0UL 120 #define TF_GFID_FLOW_ID_SFT 4 121 #define TF_FLAG_FLOW_ID_MASK 0x00000002UL 122 #define TF_FLAG_FLOW_ID_SFT 1 123 #define TF_DIR_FLOW_ID_MASK 0x00000001UL 124 #define TF_DIR_FLOW_ID_SFT 0 125 126 #define TF_SET_FLOW_ID(flow_id, gfid, flag, dir) \ 127 do { \ 128 (flow_id) &= ~(TF_GFID_FLOW_ID_MASK | \ 129 TF_FLAG_FLOW_ID_MASK | \ 130 TF_DIR_FLOW_ID_MASK); \ 131 (flow_id) |= (((gfid) << TF_GFID_FLOW_ID_SFT) & \ 132 TF_GFID_FLOW_ID_MASK) | \ 133 (((flag) << TF_FLAG_FLOW_ID_SFT) & \ 134 TF_FLAG_FLOW_ID_MASK) | \ 135 (((dir) << TF_DIR_FLOW_ID_SFT) & \ 136 TF_DIR_FLOW_ID_MASK); \ 137 } while (0) 138 139 #define TF_GET_GFID_FROM_FLOW_ID(flow_id, gfid) \ 140 do { \ 141 gfid = (((flow_id) & TF_GFID_FLOW_ID_MASK) >> \ 142 TF_GFID_FLOW_ID_SFT); \ 143 } while (0) 144 145 #define TF_GET_DIR_FROM_FLOW_ID(flow_id, dir) \ 146 do { \ 147 dir = (((flow_id) & TF_DIR_FLOW_ID_MASK) >> \ 148 TF_DIR_FLOW_ID_SFT); \ 149 } while (0) 150 151 #define TF_GET_FLAG_FROM_FLOW_ID(flow_id, flag) \ 152 do { \ 153 flag = (((flow_id) & TF_FLAG_FLOW_ID_MASK) >> \ 154 TF_FLAG_FLOW_ID_SFT); \ 155 } while (0) 156 157 /* 158 * 32 bit GFID handlers 159 */ 160 #define TF_HASH_INDEX_GFID_MASK 0x07FFFFFFUL 161 #define TF_HASH_INDEX_GFID_SFT 0 162 #define TF_HASH_TYPE_GFID_MASK 0x08000000UL 163 #define TF_HASH_TYPE_GFID_SFT 27 164 165 #define TF_GFID_TABLE_INTERNAL 0 166 #define TF_GFID_TABLE_EXTERNAL 1 167 168 #define TF_SET_GFID(gfid, index, type) \ 169 do { \ 170 gfid = (((index) << TF_HASH_INDEX_GFID_SFT) & \ 171 TF_HASH_INDEX_GFID_MASK) | \ 172 (((type) << TF_HASH_TYPE_GFID_SFT) & \ 173 TF_HASH_TYPE_GFID_MASK); \ 174 } while (0) 175 176 #define TF_GET_HASH_INDEX_FROM_GFID(gfid, index) \ 177 do { \ 178 index = (((gfid) & TF_HASH_INDEX_GFID_MASK) >> \ 179 TF_HASH_INDEX_GFID_SFT); \ 180 } while (0) 181 182 #define TF_GET_HASH_TYPE_FROM_GFID(gfid, type) \ 183 do { \ 184 type = (((gfid) & TF_HASH_TYPE_GFID_MASK) >> \ 185 TF_HASH_TYPE_GFID_SFT); \ 186 } while (0) 187 #endif /* _TF_EXT_FLOW_HANDLE_H_ */ 188