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