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