1 /* 2 * Freescale Layerscape MC I/O wrapper 3 * 4 * Copyright (C) 2013-2015 Freescale Semiconductor, Inc. 5 * Author: German Rivera <German.Rivera@freescale.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 #ifndef _FSL_DPRC_H 10 #define _FSL_DPRC_H 11 12 /* DPRC Version */ 13 #define DPRC_VER_MAJOR 5 14 #define DPRC_VER_MINOR 0 15 16 /* Command IDs */ 17 #define DPRC_CMDID_CLOSE 0x800 18 #define DPRC_CMDID_OPEN 0x805 19 20 #define DPRC_CMDID_GET_ATTR 0x004 21 #define DPRC_CMDID_RESET_CONT 0x005 22 23 #define DPRC_CMDID_GET_CONT_ID 0x830 24 #define DPRC_CMDID_GET_OBJ_COUNT 0x159 25 #define DPRC_CMDID_GET_OBJ 0x15A 26 #define DPRC_CMDID_GET_RES_COUNT 0x15B 27 #define DPRC_CMDID_GET_RES_IDS 0x15C 28 #define DPRC_CMDID_GET_OBJ_REG 0x15E 29 30 #define DPRC_CMDID_CONNECT 0x167 31 #define DPRC_CMDID_DISCONNECT 0x168 32 #define DPRC_CMDID_GET_CONNECTION 0x16C 33 34 /* cmd, param, offset, width, type, arg_name */ 35 #define DPRC_RSP_GET_CONTAINER_ID(cmd, container_id) \ 36 MC_RSP_OP(cmd, 0, 0, 32, int, container_id) 37 38 /* cmd, param, offset, width, type, arg_name */ 39 #define DPRC_CMD_OPEN(cmd, container_id) \ 40 MC_CMD_OP(cmd, 0, 0, 32, int, container_id) 41 42 /* cmd, param, offset, width, type, arg_name */ 43 #define DPRC_CMD_RESET_CONTAINER(cmd, child_container_id) \ 44 MC_CMD_OP(cmd, 0, 0, 32, int, child_container_id) 45 46 /* cmd, param, offset, width, type, arg_name */ 47 #define DPRC_RSP_GET_ATTRIBUTES(cmd, attr) \ 48 do { \ 49 MC_RSP_OP(cmd, 0, 0, 32, int, attr->container_id); \ 50 MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->icid); \ 51 MC_RSP_OP(cmd, 1, 0, 32, uint32_t, attr->options);\ 52 MC_RSP_OP(cmd, 1, 32, 32, int, attr->portal_id); \ 53 MC_RSP_OP(cmd, 2, 0, 16, uint16_t, attr->version.major);\ 54 MC_RSP_OP(cmd, 2, 16, 16, uint16_t, attr->version.minor);\ 55 } while (0) 56 57 /* cmd, param, offset, width, type, arg_name */ 58 #define DPRC_RSP_GET_OBJ_COUNT(cmd, obj_count) \ 59 MC_RSP_OP(cmd, 0, 32, 32, int, obj_count) 60 61 /* cmd, param, offset, width, type, arg_name */ 62 #define DPRC_CMD_GET_OBJ(cmd, obj_index) \ 63 MC_CMD_OP(cmd, 0, 0, 32, int, obj_index) 64 65 /* cmd, param, offset, width, type, arg_name */ 66 #define DPRC_RSP_GET_OBJ(cmd, obj_desc) \ 67 do { \ 68 MC_RSP_OP(cmd, 0, 32, 32, int, obj_desc->id); \ 69 MC_RSP_OP(cmd, 1, 0, 16, uint16_t, obj_desc->vendor); \ 70 MC_RSP_OP(cmd, 1, 16, 8, uint8_t, obj_desc->irq_count); \ 71 MC_RSP_OP(cmd, 1, 24, 8, uint8_t, obj_desc->region_count); \ 72 MC_RSP_OP(cmd, 1, 32, 32, uint32_t, obj_desc->state);\ 73 MC_RSP_OP(cmd, 2, 0, 16, uint16_t, obj_desc->ver_major);\ 74 MC_RSP_OP(cmd, 2, 16, 16, uint16_t, obj_desc->ver_minor);\ 75 MC_RSP_OP(cmd, 3, 0, 8, char, obj_desc->type[0]);\ 76 MC_RSP_OP(cmd, 3, 8, 8, char, obj_desc->type[1]);\ 77 MC_RSP_OP(cmd, 3, 16, 8, char, obj_desc->type[2]);\ 78 MC_RSP_OP(cmd, 3, 24, 8, char, obj_desc->type[3]);\ 79 MC_RSP_OP(cmd, 3, 32, 8, char, obj_desc->type[4]);\ 80 MC_RSP_OP(cmd, 3, 40, 8, char, obj_desc->type[5]);\ 81 MC_RSP_OP(cmd, 3, 48, 8, char, obj_desc->type[6]);\ 82 MC_RSP_OP(cmd, 3, 56, 8, char, obj_desc->type[7]);\ 83 MC_RSP_OP(cmd, 4, 0, 8, char, obj_desc->type[8]);\ 84 MC_RSP_OP(cmd, 4, 8, 8, char, obj_desc->type[9]);\ 85 MC_RSP_OP(cmd, 4, 16, 8, char, obj_desc->type[10]);\ 86 MC_RSP_OP(cmd, 4, 24, 8, char, obj_desc->type[11]);\ 87 MC_RSP_OP(cmd, 4, 32, 8, char, obj_desc->type[12]);\ 88 MC_RSP_OP(cmd, 4, 40, 8, char, obj_desc->type[13]);\ 89 MC_RSP_OP(cmd, 4, 48, 8, char, obj_desc->type[14]);\ 90 MC_RSP_OP(cmd, 4, 56, 8, char, obj_desc->type[15]);\ 91 MC_RSP_OP(cmd, 5, 0, 8, char, obj_desc->label[0]);\ 92 MC_RSP_OP(cmd, 5, 8, 8, char, obj_desc->label[1]);\ 93 MC_RSP_OP(cmd, 5, 16, 8, char, obj_desc->label[2]);\ 94 MC_RSP_OP(cmd, 5, 24, 8, char, obj_desc->label[3]);\ 95 MC_RSP_OP(cmd, 5, 32, 8, char, obj_desc->label[4]);\ 96 MC_RSP_OP(cmd, 5, 40, 8, char, obj_desc->label[5]);\ 97 MC_RSP_OP(cmd, 5, 48, 8, char, obj_desc->label[6]);\ 98 MC_RSP_OP(cmd, 5, 56, 8, char, obj_desc->label[7]);\ 99 MC_RSP_OP(cmd, 6, 0, 8, char, obj_desc->label[8]);\ 100 MC_RSP_OP(cmd, 6, 8, 8, char, obj_desc->label[9]);\ 101 MC_RSP_OP(cmd, 6, 16, 8, char, obj_desc->label[10]);\ 102 MC_RSP_OP(cmd, 6, 24, 8, char, obj_desc->label[11]);\ 103 MC_RSP_OP(cmd, 6, 32, 8, char, obj_desc->label[12]);\ 104 MC_RSP_OP(cmd, 6, 40, 8, char, obj_desc->label[13]);\ 105 MC_RSP_OP(cmd, 6, 48, 8, char, obj_desc->label[14]);\ 106 MC_RSP_OP(cmd, 6, 56, 8, char, obj_desc->label[15]);\ 107 } while (0) 108 109 /* cmd, param, offset, width, type, arg_name */ 110 #define DPRC_CMD_GET_RES_COUNT(cmd, type) \ 111 do { \ 112 MC_CMD_OP(cmd, 1, 0, 8, char, type[0]);\ 113 MC_CMD_OP(cmd, 1, 8, 8, char, type[1]);\ 114 MC_CMD_OP(cmd, 1, 16, 8, char, type[2]);\ 115 MC_CMD_OP(cmd, 1, 24, 8, char, type[3]);\ 116 MC_CMD_OP(cmd, 1, 32, 8, char, type[4]);\ 117 MC_CMD_OP(cmd, 1, 40, 8, char, type[5]);\ 118 MC_CMD_OP(cmd, 1, 48, 8, char, type[6]);\ 119 MC_CMD_OP(cmd, 1, 56, 8, char, type[7]);\ 120 MC_CMD_OP(cmd, 2, 0, 8, char, type[8]);\ 121 MC_CMD_OP(cmd, 2, 8, 8, char, type[9]);\ 122 MC_CMD_OP(cmd, 2, 16, 8, char, type[10]);\ 123 MC_CMD_OP(cmd, 2, 24, 8, char, type[11]);\ 124 MC_CMD_OP(cmd, 2, 32, 8, char, type[12]);\ 125 MC_CMD_OP(cmd, 2, 40, 8, char, type[13]);\ 126 MC_CMD_OP(cmd, 2, 48, 8, char, type[14]);\ 127 MC_CMD_OP(cmd, 2, 56, 8, char, type[15]);\ 128 } while (0) 129 130 /* cmd, param, offset, width, type, arg_name */ 131 #define DPRC_RSP_GET_RES_COUNT(cmd, res_count) \ 132 MC_RSP_OP(cmd, 0, 0, 32, int, res_count) 133 134 /* cmd, param, offset, width, type, arg_name */ 135 #define DPRC_CMD_GET_RES_IDS(cmd, range_desc, type) \ 136 do { \ 137 MC_CMD_OP(cmd, 0, 42, 7, enum dprc_iter_status, \ 138 range_desc->iter_status); \ 139 MC_CMD_OP(cmd, 1, 0, 32, int, range_desc->base_id); \ 140 MC_CMD_OP(cmd, 1, 32, 32, int, range_desc->last_id);\ 141 MC_CMD_OP(cmd, 2, 0, 8, char, type[0]);\ 142 MC_CMD_OP(cmd, 2, 8, 8, char, type[1]);\ 143 MC_CMD_OP(cmd, 2, 16, 8, char, type[2]);\ 144 MC_CMD_OP(cmd, 2, 24, 8, char, type[3]);\ 145 MC_CMD_OP(cmd, 2, 32, 8, char, type[4]);\ 146 MC_CMD_OP(cmd, 2, 40, 8, char, type[5]);\ 147 MC_CMD_OP(cmd, 2, 48, 8, char, type[6]);\ 148 MC_CMD_OP(cmd, 2, 56, 8, char, type[7]);\ 149 MC_CMD_OP(cmd, 3, 0, 8, char, type[8]);\ 150 MC_CMD_OP(cmd, 3, 8, 8, char, type[9]);\ 151 MC_CMD_OP(cmd, 3, 16, 8, char, type[10]);\ 152 MC_CMD_OP(cmd, 3, 24, 8, char, type[11]);\ 153 MC_CMD_OP(cmd, 3, 32, 8, char, type[12]);\ 154 MC_CMD_OP(cmd, 3, 40, 8, char, type[13]);\ 155 MC_CMD_OP(cmd, 3, 48, 8, char, type[14]);\ 156 MC_CMD_OP(cmd, 3, 56, 8, char, type[15]);\ 157 } while (0) 158 159 /* cmd, param, offset, width, type, arg_name */ 160 #define DPRC_RSP_GET_RES_IDS(cmd, range_desc) \ 161 do { \ 162 MC_RSP_OP(cmd, 0, 42, 7, enum dprc_iter_status, \ 163 range_desc->iter_status);\ 164 MC_RSP_OP(cmd, 1, 0, 32, int, range_desc->base_id); \ 165 MC_RSP_OP(cmd, 1, 32, 32, int, range_desc->last_id);\ 166 } while (0) 167 168 /* cmd, param, offset, width, type, arg_name */ 169 #define DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index) \ 170 do { \ 171 MC_CMD_OP(cmd, 0, 0, 32, int, obj_id); \ 172 MC_CMD_OP(cmd, 0, 48, 8, uint8_t, region_index);\ 173 MC_CMD_OP(cmd, 3, 0, 8, char, obj_type[0]);\ 174 MC_CMD_OP(cmd, 3, 8, 8, char, obj_type[1]);\ 175 MC_CMD_OP(cmd, 3, 16, 8, char, obj_type[2]);\ 176 MC_CMD_OP(cmd, 3, 24, 8, char, obj_type[3]);\ 177 MC_CMD_OP(cmd, 3, 32, 8, char, obj_type[4]);\ 178 MC_CMD_OP(cmd, 3, 40, 8, char, obj_type[5]);\ 179 MC_CMD_OP(cmd, 3, 48, 8, char, obj_type[6]);\ 180 MC_CMD_OP(cmd, 3, 56, 8, char, obj_type[7]);\ 181 MC_CMD_OP(cmd, 4, 0, 8, char, obj_type[8]);\ 182 MC_CMD_OP(cmd, 4, 8, 8, char, obj_type[9]);\ 183 MC_CMD_OP(cmd, 4, 16, 8, char, obj_type[10]);\ 184 MC_CMD_OP(cmd, 4, 24, 8, char, obj_type[11]);\ 185 MC_CMD_OP(cmd, 4, 32, 8, char, obj_type[12]);\ 186 MC_CMD_OP(cmd, 4, 40, 8, char, obj_type[13]);\ 187 MC_CMD_OP(cmd, 4, 48, 8, char, obj_type[14]);\ 188 MC_CMD_OP(cmd, 4, 56, 8, char, obj_type[15]);\ 189 } while (0) 190 191 /* param, offset, width, type, arg_name */ 192 #define DPRC_RSP_GET_OBJ_REGION(cmd, region_desc) \ 193 do { \ 194 MC_RSP_OP(cmd, 1, 0, 32, uint32_t, region_desc->base_offset);\ 195 MC_RSP_OP(cmd, 2, 0, 32, uint32_t, region_desc->size); \ 196 MC_RSP_OP(cmd, 2, 32, 4, enum dprc_region_type, region_desc->type);\ 197 MC_RSP_OP(cmd, 3, 0, 32, uint32_t, region_desc->flags);\ 198 } while (0) 199 200 /* cmd, param, offset, width, type, arg_name */ 201 #define DPRC_CMD_SET_OBJ_LABEL(cmd, obj_type, obj_id, label) \ 202 do { \ 203 MC_CMD_OP(cmd, 0, 0, 32, int, obj_id); \ 204 MC_CMD_OP(cmd, 1, 0, 8, char, label[0]);\ 205 MC_CMD_OP(cmd, 1, 8, 8, char, label[1]);\ 206 MC_CMD_OP(cmd, 1, 16, 8, char, label[2]);\ 207 MC_CMD_OP(cmd, 1, 24, 8, char, label[3]);\ 208 MC_CMD_OP(cmd, 1, 32, 8, char, label[4]);\ 209 MC_CMD_OP(cmd, 1, 40, 8, char, label[5]);\ 210 MC_CMD_OP(cmd, 1, 48, 8, char, label[6]);\ 211 MC_CMD_OP(cmd, 1, 56, 8, char, label[7]);\ 212 MC_CMD_OP(cmd, 2, 0, 8, char, label[8]);\ 213 MC_CMD_OP(cmd, 2, 8, 8, char, label[9]);\ 214 MC_CMD_OP(cmd, 2, 16, 8, char, label[10]);\ 215 MC_CMD_OP(cmd, 2, 24, 8, char, label[11]);\ 216 MC_CMD_OP(cmd, 2, 32, 8, char, label[12]);\ 217 MC_CMD_OP(cmd, 2, 40, 8, char, label[13]);\ 218 MC_CMD_OP(cmd, 2, 48, 8, char, label[14]);\ 219 MC_CMD_OP(cmd, 2, 56, 8, char, label[15]);\ 220 MC_CMD_OP(cmd, 3, 0, 8, char, obj_type[0]);\ 221 MC_CMD_OP(cmd, 3, 8, 8, char, obj_type[1]);\ 222 MC_CMD_OP(cmd, 3, 16, 8, char, obj_type[2]);\ 223 MC_CMD_OP(cmd, 3, 24, 8, char, obj_type[3]);\ 224 MC_CMD_OP(cmd, 3, 32, 8, char, obj_type[4]);\ 225 MC_CMD_OP(cmd, 3, 40, 8, char, obj_type[5]);\ 226 MC_CMD_OP(cmd, 3, 48, 8, char, obj_type[6]);\ 227 MC_CMD_OP(cmd, 3, 56, 8, char, obj_type[7]);\ 228 MC_CMD_OP(cmd, 4, 0, 8, char, obj_type[8]);\ 229 MC_CMD_OP(cmd, 4, 8, 8, char, obj_type[9]);\ 230 MC_CMD_OP(cmd, 4, 16, 8, char, obj_type[10]);\ 231 MC_CMD_OP(cmd, 4, 24, 8, char, obj_type[11]);\ 232 MC_CMD_OP(cmd, 4, 32, 8, char, obj_type[12]);\ 233 MC_CMD_OP(cmd, 4, 40, 8, char, obj_type[13]);\ 234 MC_CMD_OP(cmd, 4, 48, 8, char, obj_type[14]);\ 235 MC_CMD_OP(cmd, 4, 56, 8, char, obj_type[15]);\ 236 } while (0) 237 238 /* cmd, param, offset, width, type, arg_name */ 239 #define DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2, cfg) \ 240 do { \ 241 MC_CMD_OP(cmd, 0, 0, 32, int, endpoint1->id); \ 242 MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint1->if_id); \ 243 MC_CMD_OP(cmd, 1, 0, 32, int, endpoint2->id); \ 244 MC_CMD_OP(cmd, 1, 32, 16, uint16_t, endpoint2->if_id); \ 245 MC_CMD_OP(cmd, 2, 0, 8, char, endpoint1->type[0]); \ 246 MC_CMD_OP(cmd, 2, 8, 8, char, endpoint1->type[1]); \ 247 MC_CMD_OP(cmd, 2, 16, 8, char, endpoint1->type[2]); \ 248 MC_CMD_OP(cmd, 2, 24, 8, char, endpoint1->type[3]); \ 249 MC_CMD_OP(cmd, 2, 32, 8, char, endpoint1->type[4]); \ 250 MC_CMD_OP(cmd, 2, 40, 8, char, endpoint1->type[5]); \ 251 MC_CMD_OP(cmd, 2, 48, 8, char, endpoint1->type[6]); \ 252 MC_CMD_OP(cmd, 2, 56, 8, char, endpoint1->type[7]); \ 253 MC_CMD_OP(cmd, 3, 0, 8, char, endpoint1->type[8]); \ 254 MC_CMD_OP(cmd, 3, 8, 8, char, endpoint1->type[9]); \ 255 MC_CMD_OP(cmd, 3, 16, 8, char, endpoint1->type[10]); \ 256 MC_CMD_OP(cmd, 3, 24, 8, char, endpoint1->type[11]); \ 257 MC_CMD_OP(cmd, 3, 32, 8, char, endpoint1->type[12]); \ 258 MC_CMD_OP(cmd, 3, 40, 8, char, endpoint1->type[13]); \ 259 MC_CMD_OP(cmd, 3, 48, 8, char, endpoint1->type[14]); \ 260 MC_CMD_OP(cmd, 3, 56, 8, char, endpoint1->type[15]); \ 261 MC_CMD_OP(cmd, 4, 0, 32, uint32_t, cfg->max_rate); \ 262 MC_CMD_OP(cmd, 4, 32, 32, uint32_t, cfg->committed_rate); \ 263 MC_CMD_OP(cmd, 5, 0, 8, char, endpoint2->type[0]); \ 264 MC_CMD_OP(cmd, 5, 8, 8, char, endpoint2->type[1]); \ 265 MC_CMD_OP(cmd, 5, 16, 8, char, endpoint2->type[2]); \ 266 MC_CMD_OP(cmd, 5, 24, 8, char, endpoint2->type[3]); \ 267 MC_CMD_OP(cmd, 5, 32, 8, char, endpoint2->type[4]); \ 268 MC_CMD_OP(cmd, 5, 40, 8, char, endpoint2->type[5]); \ 269 MC_CMD_OP(cmd, 5, 48, 8, char, endpoint2->type[6]); \ 270 MC_CMD_OP(cmd, 5, 56, 8, char, endpoint2->type[7]); \ 271 MC_CMD_OP(cmd, 6, 0, 8, char, endpoint2->type[8]); \ 272 MC_CMD_OP(cmd, 6, 8, 8, char, endpoint2->type[9]); \ 273 MC_CMD_OP(cmd, 6, 16, 8, char, endpoint2->type[10]); \ 274 MC_CMD_OP(cmd, 6, 24, 8, char, endpoint2->type[11]); \ 275 MC_CMD_OP(cmd, 6, 32, 8, char, endpoint2->type[12]); \ 276 MC_CMD_OP(cmd, 6, 40, 8, char, endpoint2->type[13]); \ 277 MC_CMD_OP(cmd, 6, 48, 8, char, endpoint2->type[14]); \ 278 MC_CMD_OP(cmd, 6, 56, 8, char, endpoint2->type[15]); \ 279 } while (0) 280 281 /* cmd, param, offset, width, type, arg_name */ 282 #define DPRC_CMD_DISCONNECT(cmd, endpoint) \ 283 do { \ 284 MC_CMD_OP(cmd, 0, 0, 32, int, endpoint->id); \ 285 MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint->if_id); \ 286 MC_CMD_OP(cmd, 1, 0, 8, char, endpoint->type[0]); \ 287 MC_CMD_OP(cmd, 1, 8, 8, char, endpoint->type[1]); \ 288 MC_CMD_OP(cmd, 1, 16, 8, char, endpoint->type[2]); \ 289 MC_CMD_OP(cmd, 1, 24, 8, char, endpoint->type[3]); \ 290 MC_CMD_OP(cmd, 1, 32, 8, char, endpoint->type[4]); \ 291 MC_CMD_OP(cmd, 1, 40, 8, char, endpoint->type[5]); \ 292 MC_CMD_OP(cmd, 1, 48, 8, char, endpoint->type[6]); \ 293 MC_CMD_OP(cmd, 1, 56, 8, char, endpoint->type[7]); \ 294 MC_CMD_OP(cmd, 2, 0, 8, char, endpoint->type[8]); \ 295 MC_CMD_OP(cmd, 2, 8, 8, char, endpoint->type[9]); \ 296 MC_CMD_OP(cmd, 2, 16, 8, char, endpoint->type[10]); \ 297 MC_CMD_OP(cmd, 2, 24, 8, char, endpoint->type[11]); \ 298 MC_CMD_OP(cmd, 2, 32, 8, char, endpoint->type[12]); \ 299 MC_CMD_OP(cmd, 2, 40, 8, char, endpoint->type[13]); \ 300 MC_CMD_OP(cmd, 2, 48, 8, char, endpoint->type[14]); \ 301 MC_CMD_OP(cmd, 2, 56, 8, char, endpoint->type[15]); \ 302 } while (0) 303 304 /* cmd, param, offset, width, type, arg_name */ 305 #define DPRC_CMD_GET_CONNECTION(cmd, endpoint1) \ 306 do { \ 307 MC_CMD_OP(cmd, 0, 0, 32, int, endpoint1->id); \ 308 MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint1->if_id); \ 309 MC_CMD_OP(cmd, 1, 0, 8, char, endpoint1->type[0]); \ 310 MC_CMD_OP(cmd, 1, 8, 8, char, endpoint1->type[1]); \ 311 MC_CMD_OP(cmd, 1, 16, 8, char, endpoint1->type[2]); \ 312 MC_CMD_OP(cmd, 1, 24, 8, char, endpoint1->type[3]); \ 313 MC_CMD_OP(cmd, 1, 32, 8, char, endpoint1->type[4]); \ 314 MC_CMD_OP(cmd, 1, 40, 8, char, endpoint1->type[5]); \ 315 MC_CMD_OP(cmd, 1, 48, 8, char, endpoint1->type[6]); \ 316 MC_CMD_OP(cmd, 1, 56, 8, char, endpoint1->type[7]); \ 317 MC_CMD_OP(cmd, 2, 0, 8, char, endpoint1->type[8]); \ 318 MC_CMD_OP(cmd, 2, 8, 8, char, endpoint1->type[9]); \ 319 MC_CMD_OP(cmd, 2, 16, 8, char, endpoint1->type[10]); \ 320 MC_CMD_OP(cmd, 2, 24, 8, char, endpoint1->type[11]); \ 321 MC_CMD_OP(cmd, 2, 32, 8, char, endpoint1->type[12]); \ 322 MC_CMD_OP(cmd, 2, 40, 8, char, endpoint1->type[13]); \ 323 MC_CMD_OP(cmd, 2, 48, 8, char, endpoint1->type[14]); \ 324 MC_CMD_OP(cmd, 2, 56, 8, char, endpoint1->type[15]); \ 325 } while (0) 326 327 /* cmd, param, offset, width, type, arg_name */ 328 #define DPRC_RSP_GET_CONNECTION(cmd, endpoint2, state) \ 329 do { \ 330 MC_RSP_OP(cmd, 3, 0, 32, int, endpoint2->id); \ 331 MC_RSP_OP(cmd, 3, 32, 16, uint16_t, endpoint2->if_id); \ 332 MC_RSP_OP(cmd, 4, 0, 8, char, endpoint2->type[0]); \ 333 MC_RSP_OP(cmd, 4, 8, 8, char, endpoint2->type[1]); \ 334 MC_RSP_OP(cmd, 4, 16, 8, char, endpoint2->type[2]); \ 335 MC_RSP_OP(cmd, 4, 24, 8, char, endpoint2->type[3]); \ 336 MC_RSP_OP(cmd, 4, 32, 8, char, endpoint2->type[4]); \ 337 MC_RSP_OP(cmd, 4, 40, 8, char, endpoint2->type[5]); \ 338 MC_RSP_OP(cmd, 4, 48, 8, char, endpoint2->type[6]); \ 339 MC_RSP_OP(cmd, 4, 56, 8, char, endpoint2->type[7]); \ 340 MC_RSP_OP(cmd, 5, 0, 8, char, endpoint2->type[8]); \ 341 MC_RSP_OP(cmd, 5, 8, 8, char, endpoint2->type[9]); \ 342 MC_RSP_OP(cmd, 5, 16, 8, char, endpoint2->type[10]); \ 343 MC_RSP_OP(cmd, 5, 24, 8, char, endpoint2->type[11]); \ 344 MC_RSP_OP(cmd, 5, 32, 8, char, endpoint2->type[12]); \ 345 MC_RSP_OP(cmd, 5, 40, 8, char, endpoint2->type[13]); \ 346 MC_RSP_OP(cmd, 5, 48, 8, char, endpoint2->type[14]); \ 347 MC_RSP_OP(cmd, 5, 56, 8, char, endpoint2->type[15]); \ 348 MC_RSP_OP(cmd, 6, 0, 32, int, state); \ 349 } while (0) 350 351 /* Data Path Resource Container API 352 * Contains DPRC API for managing and querying DPAA resources 353 */ 354 355 struct fsl_mc_io; 356 357 /** 358 * Set this value as the icid value in dprc_cfg structure when creating a 359 * container, in case the ICID is not selected by the user and should be 360 * allocated by the DPRC from the pool of ICIDs. 361 */ 362 #define DPRC_GET_ICID_FROM_POOL (uint16_t)(~(0)) 363 364 /** 365 * Set this value as the portal_id value in dprc_cfg structure when creating a 366 * container, in case the portal ID is not specifically selected by the 367 * user and should be allocated by the DPRC from the pool of portal ids. 368 */ 369 #define DPRC_GET_PORTAL_ID_FROM_POOL (int)(~(0)) 370 371 /** 372 * dprc_get_container_id() - Get container ID associated with a given portal. 373 * @mc_io: Pointer to MC portal's I/O object 374 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 375 * @container_id: Requested container ID 376 * 377 * Return: '0' on Success; Error code otherwise. 378 */ 379 int dprc_get_container_id(struct fsl_mc_io *mc_io, 380 uint32_t cmd_flags, 381 int *container_id); 382 383 /** 384 * dprc_open() - Open DPRC object for use 385 * @mc_io: Pointer to MC portal's I/O object 386 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 387 * @container_id: Container ID to open 388 * @token: Returned token of DPRC object 389 * 390 * Return: '0' on Success; Error code otherwise. 391 * 392 * @warning Required before any operation on the object. 393 */ 394 int dprc_open(struct fsl_mc_io *mc_io, 395 uint32_t cmd_flags, 396 int container_id, 397 uint16_t *token); 398 399 /** 400 * dprc_close() - Close the control session of the object 401 * @mc_io: Pointer to MC portal's I/O object 402 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 403 * @token: Token of DPRC object 404 * 405 * After this function is called, no further operations are 406 * allowed on the object without opening a new control session. 407 * 408 * Return: '0' on Success; Error code otherwise. 409 */ 410 int dprc_close(struct fsl_mc_io *mc_io, 411 uint32_t cmd_flags, 412 uint16_t token); 413 414 /** 415 * Container general options 416 * 417 * These options may be selected at container creation by the container creator 418 * and can be retrieved using dprc_get_attributes() 419 */ 420 421 /* Spawn Policy Option allowed - Indicates that the new container is allowed 422 * to spawn and have its own child containers. 423 */ 424 #define DPRC_CFG_OPT_SPAWN_ALLOWED 0x00000001 425 426 /* General Container allocation policy - Indicates that the new container is 427 * allowed to allocate requested resources from its parent container; if not 428 * set, the container is only allowed to use resources in its own pools; Note 429 * that this is a container's global policy, but the parent container may 430 * override it and set specific quota per resource type. 431 */ 432 #define DPRC_CFG_OPT_ALLOC_ALLOWED 0x00000002 433 434 /* Object initialization allowed - software context associated with this 435 * container is allowed to invoke object initialization operations. 436 */ 437 #define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED 0x00000004 438 439 /* Topology change allowed - software context associated with this 440 * container is allowed to invoke topology operations, such as attach/detach 441 * of network objects. 442 */ 443 #define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED 0x00000008 444 445 /* IOMMU bypass - indicates whether objects of this container are permitted 446 * to bypass the IOMMU. 447 */ 448 #define DPRC_CFG_OPT_IOMMU_BYPASS 0x00000010 449 450 /* AIOP - Indicates that container belongs to AIOP. */ 451 #define DPRC_CFG_OPT_AIOP 0x00000020 452 453 /** 454 * struct dprc_cfg - Container configuration options 455 * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free 456 * ICID value is allocated by the DPRC 457 * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free 458 * portal ID is allocated by the DPRC 459 * @options: Combination of 'DPRC_CFG_OPT_<X>' options 460 * @label: Object's label 461 */ 462 struct dprc_cfg { 463 uint16_t icid; 464 int portal_id; 465 uint64_t options; 466 char label[16]; 467 }; 468 469 /** 470 * dprc_reset_container - Reset child container. 471 * @mc_io: Pointer to MC portal's I/O object 472 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 473 * @token: Token of DPRC object 474 * @child_container_id: ID of the container to reset 475 * 476 * In case a software context crashes or becomes non-responsive, the parent 477 * may wish to reset its resources container before the software context is 478 * restarted. 479 * 480 * This routine informs all objects assigned to the child container that the 481 * container is being reset, so they may perform any cleanup operations that are 482 * needed. All objects handles that were owned by the child container shall be 483 * closed. 484 * 485 * Note that such request may be submitted even if the child software context 486 * has not crashed, but the resulting object cleanup operations will not be 487 * aware of that. 488 * 489 * Return: '0' on Success; Error code otherwise. 490 */ 491 int dprc_reset_container(struct fsl_mc_io *mc_io, 492 uint32_t cmd_flags, 493 uint16_t token, 494 int child_container_id); 495 496 /** 497 * struct dprc_attributes - Container attributes 498 * @container_id: Container's ID 499 * @icid: Container's ICID 500 * @portal_id: Container's portal ID 501 * @options: Container's options as set at container's creation 502 * @version: DPRC version 503 */ 504 struct dprc_attributes { 505 int container_id; 506 uint16_t icid; 507 int portal_id; 508 uint64_t options; 509 /** 510 * struct version - DPRC version 511 * @major: DPRC major version 512 * @minor: DPRC minor version 513 */ 514 struct { 515 uint16_t major; 516 uint16_t minor; 517 } version; 518 }; 519 520 /** 521 * dprc_get_attributes() - Obtains container attributes 522 * @mc_io: Pointer to MC portal's I/O object 523 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 524 * @token: Token of DPRC object 525 * @attributes: Returned container attributes 526 * 527 * Return: '0' on Success; Error code otherwise. 528 */ 529 int dprc_get_attributes(struct fsl_mc_io *mc_io, 530 uint32_t cmd_flags, 531 uint16_t token, 532 struct dprc_attributes *attributes); 533 534 /** 535 * dprc_get_obj_count() - Obtains the number of objects in the DPRC 536 * @mc_io: Pointer to MC portal's I/O object 537 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 538 * @token: Token of DPRC object 539 * @obj_count: Number of objects assigned to the DPRC 540 * 541 * Return: '0' on Success; Error code otherwise. 542 */ 543 int dprc_get_obj_count(struct fsl_mc_io *mc_io, 544 uint32_t cmd_flags, 545 uint16_t token, 546 int *obj_count); 547 548 /* Objects Attributes Flags */ 549 550 /* Opened state - Indicates that an object is open by at least one owner */ 551 #define DPRC_OBJ_STATE_OPEN 0x00000001 552 /* Plugged state - Indicates that the object is plugged */ 553 #define DPRC_OBJ_STATE_PLUGGED 0x00000002 554 555 /** 556 * struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj() 557 * @type: Type of object: NULL terminated string 558 * @id: ID of logical object resource 559 * @vendor: Object vendor identifier 560 * @ver_major: Major version number 561 * @ver_minor: Minor version number 562 * @irq_count: Number of interrupts supported by the object 563 * @region_count: Number of mappable regions supported by the object 564 * @state: Object state: combination of DPRC_OBJ_STATE_ states 565 * @label: Object label 566 */ 567 struct dprc_obj_desc { 568 char type[16]; 569 int id; 570 uint16_t vendor; 571 uint16_t ver_major; 572 uint16_t ver_minor; 573 uint8_t irq_count; 574 uint8_t region_count; 575 uint32_t state; 576 char label[16]; 577 }; 578 579 /** 580 * dprc_get_obj() - Get general information on an object 581 * @mc_io: Pointer to MC portal's I/O object 582 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 583 * @token: Token of DPRC object 584 * @obj_index: Index of the object to be queried (< obj_count) 585 * @obj_desc: Returns the requested object descriptor 586 * 587 * The object descriptors are retrieved one by one by incrementing 588 * obj_index up to (not including) the value of obj_count returned 589 * from dprc_get_obj_count(). dprc_get_obj_count() must 590 * be called prior to dprc_get_obj(). 591 * 592 * Return: '0' on Success; Error code otherwise. 593 */ 594 int dprc_get_obj(struct fsl_mc_io *mc_io, 595 uint32_t cmd_flags, 596 uint16_t token, 597 int obj_index, 598 struct dprc_obj_desc *obj_desc); 599 600 /** 601 * dprc_get_res_count() - Obtains the number of free resources that are 602 * assigned to this container, by pool type 603 * @mc_io: Pointer to MC portal's I/O object 604 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 605 * @token: Token of DPRC object 606 * @type: pool type 607 * @res_count: Returned number of free resources of the given 608 * resource type that are assigned to this DPRC 609 * 610 * Return: '0' on Success; Error code otherwise. 611 */ 612 int dprc_get_res_count(struct fsl_mc_io *mc_io, 613 uint32_t cmd_flags, 614 uint16_t token, 615 char *type, 616 int *res_count); 617 618 /** 619 * enum dprc_iter_status - Iteration status 620 * @DPRC_ITER_STATUS_FIRST: Perform first iteration 621 * @DPRC_ITER_STATUS_MORE: Indicates more/next iteration is needed 622 * @DPRC_ITER_STATUS_LAST: Indicates last iteration 623 */ 624 enum dprc_iter_status { 625 DPRC_ITER_STATUS_FIRST = 0, 626 DPRC_ITER_STATUS_MORE = 1, 627 DPRC_ITER_STATUS_LAST = 2 628 }; 629 630 /** 631 * struct dprc_res_ids_range_desc - Resource ID range descriptor 632 * @base_id: Base resource ID of this range 633 * @last_id: Last resource ID of this range 634 * @iter_status: Iteration status - should be set to DPRC_ITER_STATUS_FIRST at 635 * first iteration; while the returned marker is DPRC_ITER_STATUS_MORE, 636 * additional iterations are needed, until the returned marker is 637 * DPRC_ITER_STATUS_LAST 638 */ 639 struct dprc_res_ids_range_desc { 640 int base_id; 641 int last_id; 642 enum dprc_iter_status iter_status; 643 }; 644 645 /** 646 * dprc_get_res_ids() - Obtains IDs of free resources in the container 647 * @mc_io: Pointer to MC portal's I/O object 648 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 649 * @token: Token of DPRC object 650 * @type: pool type 651 * @range_desc: range descriptor 652 * 653 * Return: '0' on Success; Error code otherwise. 654 */ 655 int dprc_get_res_ids(struct fsl_mc_io *mc_io, 656 uint32_t cmd_flags, 657 uint16_t token, 658 char *type, 659 struct dprc_res_ids_range_desc *range_desc); 660 661 /* Region flags */ 662 /* Cacheable - Indicates that region should be mapped as cacheable */ 663 #define DPRC_REGION_CACHEABLE 0x00000001 664 665 /** 666 * enum dprc_region_type - Region type 667 * @DPRC_REGION_TYPE_MC_PORTAL: MC portal region 668 * @DPRC_REGION_TYPE_QBMAN_PORTAL: Qbman portal region 669 */ 670 enum dprc_region_type { 671 DPRC_REGION_TYPE_MC_PORTAL, 672 DPRC_REGION_TYPE_QBMAN_PORTAL 673 }; 674 675 /** 676 * struct dprc_region_desc - Mappable region descriptor 677 * @base_offset: Region offset from region's base address. 678 * For DPMCP and DPRC objects, region base is offset from SoC MC portals 679 * base address; For DPIO, region base is offset from SoC QMan portals 680 * base address 681 * @size: Region size (in bytes) 682 * @flags: Region attributes 683 * @type: Portal region type 684 */ 685 struct dprc_region_desc { 686 uint32_t base_offset; 687 uint32_t size; 688 uint32_t flags; 689 enum dprc_region_type type; 690 }; 691 692 /** 693 * dprc_get_obj_region() - Get region information for a specified object. 694 * @mc_io: Pointer to MC portal's I/O object 695 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 696 * @token: Token of DPRC object 697 * @obj_type: Object type as returned in dprc_get_obj() 698 * @obj_id: Unique object instance as returned in dprc_get_obj() 699 * @region_index: The specific region to query 700 * @region_desc: Returns the requested region descriptor 701 * 702 * Return: '0' on Success; Error code otherwise. 703 */ 704 int dprc_get_obj_region(struct fsl_mc_io *mc_io, 705 uint32_t cmd_flags, 706 uint16_t token, 707 char *obj_type, 708 int obj_id, 709 uint8_t region_index, 710 struct dprc_region_desc *region_desc); 711 /** 712 * struct dprc_endpoint - Endpoint description for link connect/disconnect 713 * operations 714 * @type: Endpoint object type: NULL terminated string 715 * @id: Endpoint object ID 716 * @if_id: Interface ID; should be set for endpoints with multiple 717 * interfaces ("dpsw", "dpdmux"); for others, always set to 0 718 */ 719 struct dprc_endpoint { 720 char type[16]; 721 int id; 722 uint16_t if_id; 723 }; 724 725 /** 726 * struct dprc_connection_cfg - Connection configuration. 727 * Used for virtual connections only 728 * @committed_rate: Committed rate (Mbits/s) 729 * @max_rate: Maximum rate (Mbits/s) 730 */ 731 struct dprc_connection_cfg { 732 uint32_t committed_rate; 733 uint32_t max_rate; 734 }; 735 736 /** 737 * dprc_connect() - Connect two endpoints to create a network link between them 738 * @mc_io: Pointer to MC portal's I/O object 739 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 740 * @token: Token of DPRC object 741 * @endpoint1: Endpoint 1 configuration parameters 742 * @endpoint2: Endpoint 2 configuration parameters 743 * @cfg: Connection configuration. The connection configuration is ignored for 744 * connections made to DPMAC objects, where rate is retrieved from the 745 * MAC configuration. 746 * 747 * Return: '0' on Success; Error code otherwise. 748 */ 749 int dprc_connect(struct fsl_mc_io *mc_io, 750 uint32_t cmd_flags, 751 uint16_t token, 752 const struct dprc_endpoint *endpoint1, 753 const struct dprc_endpoint *endpoint2, 754 const struct dprc_connection_cfg *cfg); 755 756 /** 757 * dprc_disconnect() - Disconnect one endpoint to remove its network connection 758 * @mc_io: Pointer to MC portal's I/O object 759 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 760 * @token: Token of DPRC object 761 * @endpoint: Endpoint configuration parameters 762 * 763 * Return: '0' on Success; Error code otherwise. 764 */ 765 int dprc_disconnect(struct fsl_mc_io *mc_io, 766 uint32_t cmd_flags, 767 uint16_t token, 768 const struct dprc_endpoint *endpoint); 769 770 /** 771 * dprc_get_connection() - Get connected endpoint and link status if connection 772 * exists. 773 * @mc_io: Pointer to MC portal's I/O object 774 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 775 * @token: Token of DPRC object 776 * @endpoint1: Endpoint 1 configuration parameters 777 * @endpoint2: Returned endpoint 2 configuration parameters 778 * @state: Returned link state: 1 - link is up, 0 - link is down 779 * 780 * Return: '0' on Success; -ENAVAIL if connection does not exist. 781 */ 782 int dprc_get_connection(struct fsl_mc_io *mc_io, 783 uint32_t cmd_flags, 784 uint16_t token, 785 const struct dprc_endpoint *endpoint1, 786 struct dprc_endpoint *endpoint2, 787 int *state); 788 789 #endif /* _FSL_DPRC_H */ 790