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