staging: fsl-mc: up-rev dprc binary interface to v4.0
authorJ. German Rivera <German.Rivera@freescale.com>
Wed, 23 Sep 2015 21:11:03 +0000 (16:11 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 29 Sep 2015 02:23:40 +0000 (04:23 +0200)
Add cmd_flags parameter to all dprc APIs to comply
with the dprc 4.0 MC interface. Updated MC version
major number.  Pass irq args in struct instead of
separate args.

dprc 4.0 uses MC-relative offsets to specify object regions,
instead of physical addresses. So, translate_mc_addr() and
struct fsl_mc_addr_translation_range need to be updated
accordingly.

Update commands for 4.0: add new commands 'set/get
obj irq', 'set obj label', 'get obj descriptor'.
Remove 'get portal paddr'.

Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/fsl-mc/bus/dprc-cmd.h
drivers/staging/fsl-mc/bus/dprc-driver.c
drivers/staging/fsl-mc/bus/dprc.c
drivers/staging/fsl-mc/bus/mc-bus.c
drivers/staging/fsl-mc/include/dprc.h
drivers/staging/fsl-mc/include/mc-private.h

index 09202489c2b2f8cdd9bd968caced672fc1151ecb..6552c2034947ed5b9e82f70514a8e10c3e230a8c 100644 (file)
@@ -41,7 +41,7 @@
 #define _FSL_DPRC_CMD_H
 
 /* DPRC Version */
-#define DPRC_VER_MAJOR                         3
+#define DPRC_VER_MAJOR                         4
 #define DPRC_VER_MINOR                         0
 
 /* Command IDs */
 #define DPRC_CMDID_GET_RES_COUNT               0x15B
 #define DPRC_CMDID_GET_RES_IDS                 0x15C
 #define DPRC_CMDID_GET_OBJ_REG                 0x15E
+#define DPRC_CMDID_SET_OBJ_IRQ                 0x15F
+#define DPRC_CMDID_GET_OBJ_IRQ                 0x160
+#define DPRC_CMDID_SET_OBJ_LABEL               0x161
+#define DPRC_CMDID_GET_OBJ_DESC                        0x162
 
 #define DPRC_CMDID_CONNECT                     0x167
 #define DPRC_CMDID_DISCONNECT                  0x168
 #define DPRC_CMDID_GET_POOL                    0x169
 #define DPRC_CMDID_GET_POOL_COUNT              0x16A
-#define DPRC_CMDID_GET_PORTAL_PADDR            0x16B
 
 #define DPRC_CMDID_GET_CONNECTION              0x16C
 
index 35c06cff1a06ff8f3bf46e23e668afbb4a5b944b..7faf23b4538c20b5e8c9c080573b8ae289df84cb 100644 (file)
@@ -262,6 +262,7 @@ int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev)
        struct dprc_obj_desc *child_obj_desc_array = NULL;
 
        error = dprc_get_obj_count(mc_bus_dev->mc_io,
+                                  0,
                                   mc_bus_dev->mc_handle,
                                   &num_child_objects);
        if (error < 0) {
@@ -289,6 +290,7 @@ int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev)
                            &child_obj_desc_array[i];
 
                        error = dprc_get_obj(mc_bus_dev->mc_io,
+                                            0,
                                             mc_bus_dev->mc_handle,
                                             i, obj_desc);
                        if (error < 0) {
@@ -399,7 +401,7 @@ static int dprc_probe(struct fsl_mc_device *mc_dev)
                        return error;
        }
 
-       error = dprc_open(mc_dev->mc_io, mc_dev->obj_desc.id,
+       error = dprc_open(mc_dev->mc_io, 0, mc_dev->obj_desc.id,
                          &mc_dev->mc_handle);
        if (error < 0) {
                dev_err(&mc_dev->dev, "dprc_open() failed: %d\n", error);
@@ -419,7 +421,7 @@ static int dprc_probe(struct fsl_mc_device *mc_dev)
        return 0;
 
 error_cleanup_open:
-       (void)dprc_close(mc_dev->mc_io, mc_dev->mc_handle);
+       (void)dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
 
 error_cleanup_mc_io:
        fsl_destroy_mc_io(mc_dev->mc_io);
@@ -447,7 +449,7 @@ static int dprc_remove(struct fsl_mc_device *mc_dev)
 
        device_for_each_child(&mc_dev->dev, NULL, __fsl_mc_device_remove);
        dprc_cleanup_all_resource_pools(mc_dev);
-       error = dprc_close(mc_dev->mc_io, mc_dev->mc_handle);
+       error = dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
        if (error < 0)
                dev_err(&mc_dev->dev, "dprc_close() failed: %d\n", error);
 
index 19b26e630b627dc9d746c845f2467cc1e09f5dd5..db1b6bfc5a33ff5cb9050a818ad070009fe07a5b 100644 (file)
 #include "../include/dprc.h"
 #include "dprc-cmd.h"
 
-int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token)
+int dprc_open(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             int container_id,
+             uint16_t *token)
 {
        struct mc_command cmd = { 0 };
        int err;
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, MC_CMD_PRI_LOW,
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags,
                                          0);
        cmd.params[0] |= mc_enc(0, 32, container_id);
 
@@ -56,12 +59,14 @@ int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token)
 }
 EXPORT_SYMBOL(dprc_open);
 
-int dprc_close(struct fsl_mc_io *mc_io, uint16_t token)
+int dprc_close(struct fsl_mc_io *mc_io,
+              uint32_t cmd_flags,
+              uint16_t token)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, MC_CMD_PRI_HIGH,
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags,
                                          token);
 
        /* send command to mc*/
@@ -70,10 +75,11 @@ int dprc_close(struct fsl_mc_io *mc_io, uint16_t token)
 EXPORT_SYMBOL(dprc_close);
 
 int dprc_create_container(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
                          uint16_t token,
                          struct dprc_cfg *cfg,
                          int *child_container_id,
-                         uint64_t *child_portal_paddr)
+                         uint64_t *child_portal_offset)
 {
        struct mc_command cmd = { 0 };
        int err;
@@ -82,9 +88,25 @@ int dprc_create_container(struct fsl_mc_io *mc_io,
        cmd.params[0] |= mc_enc(32, 16, cfg->icid);
        cmd.params[0] |= mc_enc(0, 32, cfg->options);
        cmd.params[1] |= mc_enc(32, 32, cfg->portal_id);
+       cmd.params[2] |= mc_enc(0, 8, cfg->label[0]);
+       cmd.params[2] |= mc_enc(8, 8, cfg->label[1]);
+       cmd.params[2] |= mc_enc(16, 8, cfg->label[2]);
+       cmd.params[2] |= mc_enc(24, 8, cfg->label[3]);
+       cmd.params[2] |= mc_enc(32, 8, cfg->label[4]);
+       cmd.params[2] |= mc_enc(40, 8, cfg->label[5]);
+       cmd.params[2] |= mc_enc(48, 8, cfg->label[6]);
+       cmd.params[2] |= mc_enc(56, 8, cfg->label[7]);
+       cmd.params[3] |= mc_enc(0, 8, cfg->label[8]);
+       cmd.params[3] |= mc_enc(8, 8, cfg->label[9]);
+       cmd.params[3] |= mc_enc(16, 8, cfg->label[10]);
+       cmd.params[3] |= mc_enc(24, 8, cfg->label[11]);
+       cmd.params[3] |= mc_enc(32, 8, cfg->label[12]);
+       cmd.params[3] |= mc_enc(40, 8, cfg->label[13]);
+       cmd.params[3] |= mc_enc(48, 8, cfg->label[14]);
+       cmd.params[3] |= mc_enc(56, 8, cfg->label[15]);
 
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_CREATE_CONT,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
 
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
@@ -93,12 +115,13 @@ int dprc_create_container(struct fsl_mc_io *mc_io,
 
        /* retrieve response parameters */
        *child_container_id = mc_dec(cmd.params[1], 0, 32);
-       *child_portal_paddr = mc_dec(cmd.params[2], 0, 64);
+       *child_portal_offset = mc_dec(cmd.params[2], 0, 64);
 
        return 0;
 }
 
 int dprc_destroy_container(struct fsl_mc_io *mc_io,
+                          uint32_t cmd_flags,
                           uint16_t token,
                           int child_container_id)
 {
@@ -106,7 +129,7 @@ int dprc_destroy_container(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_DESTROY_CONT,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, child_container_id);
 
        /* send command to mc*/
@@ -114,6 +137,7 @@ int dprc_destroy_container(struct fsl_mc_io *mc_io,
 }
 
 int dprc_reset_container(struct fsl_mc_io *mc_io,
+                        uint32_t cmd_flags,
                         uint16_t token,
                         int child_container_id)
 {
@@ -121,7 +145,7 @@ int dprc_reset_container(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, child_container_id);
 
        /* send command to mc*/
@@ -129,19 +153,18 @@ int dprc_reset_container(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_irq(struct fsl_mc_io *mc_io,
+                uint32_t cmd_flags,
                 uint16_t token,
                 uint8_t irq_index,
                 int *type,
-                uint64_t *irq_paddr,
-                uint32_t *irq_val,
-                int *user_irq_id)
+                struct dprc_irq_cfg *irq_cfg)
 {
        struct mc_command cmd = { 0 };
        int err;
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
@@ -151,37 +174,37 @@ int dprc_get_irq(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       *irq_val = mc_dec(cmd.params[0], 0, 32);
-       *irq_paddr = mc_dec(cmd.params[1], 0, 64);
-       *user_irq_id = mc_dec(cmd.params[2], 0, 32);
+       irq_cfg->val = mc_dec(cmd.params[0], 0, 32);
+       irq_cfg->paddr = mc_dec(cmd.params[1], 0, 64);
+       irq_cfg->user_irq_id = mc_dec(cmd.params[2], 0, 32);
        *type = mc_dec(cmd.params[2], 32, 32);
 
        return 0;
 }
 
 int dprc_set_irq(struct fsl_mc_io *mc_io,
+                uint32_t cmd_flags,
                 uint16_t token,
                 uint8_t irq_index,
-                uint64_t irq_paddr,
-                uint32_t irq_val,
-                int user_irq_id)
+                struct dprc_irq_cfg *irq_cfg)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
-       cmd.params[0] |= mc_enc(0, 32, irq_val);
-       cmd.params[1] |= mc_enc(0, 64, irq_paddr);
-       cmd.params[2] |= mc_enc(0, 32, user_irq_id);
+       cmd.params[0] |= mc_enc(0, 32, irq_cfg->val);
+       cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
+       cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
 }
 
 int dprc_get_irq_enable(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
                        uint8_t irq_index,
                        uint8_t *en)
@@ -191,7 +214,7 @@ int dprc_get_irq_enable(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_ENABLE,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
        /* send command to mc*/
@@ -206,6 +229,7 @@ int dprc_get_irq_enable(struct fsl_mc_io *mc_io,
 }
 
 int dprc_set_irq_enable(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
                        uint8_t irq_index,
                        uint8_t en)
@@ -214,7 +238,7 @@ int dprc_set_irq_enable(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ_ENABLE,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 8, en);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
@@ -223,6 +247,7 @@ int dprc_set_irq_enable(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_irq_mask(struct fsl_mc_io *mc_io,
+                     uint32_t cmd_flags,
                      uint16_t token,
                      uint8_t irq_index,
                      uint32_t *mask)
@@ -232,7 +257,7 @@ int dprc_get_irq_mask(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_MASK,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
        /* send command to mc*/
@@ -247,6 +272,7 @@ int dprc_get_irq_mask(struct fsl_mc_io *mc_io,
 }
 
 int dprc_set_irq_mask(struct fsl_mc_io *mc_io,
+                     uint32_t cmd_flags,
                      uint16_t token,
                      uint8_t irq_index,
                      uint32_t mask)
@@ -255,7 +281,7 @@ int dprc_set_irq_mask(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ_MASK,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, mask);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
@@ -264,6 +290,7 @@ int dprc_set_irq_mask(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_irq_status(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
                        uint8_t irq_index,
                        uint32_t *status)
@@ -273,7 +300,7 @@ int dprc_get_irq_status(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_STATUS,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
        /* send command to mc*/
@@ -288,6 +315,7 @@ int dprc_get_irq_status(struct fsl_mc_io *mc_io,
 }
 
 int dprc_clear_irq_status(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
                          uint16_t token,
                          uint8_t irq_index,
                          uint32_t status)
@@ -296,7 +324,7 @@ int dprc_clear_irq_status(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLEAR_IRQ_STATUS,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, status);
        cmd.params[0] |= mc_enc(32, 8, irq_index);
 
@@ -305,6 +333,7 @@ int dprc_clear_irq_status(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_attributes(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
                        struct dprc_attributes *attr)
 {
@@ -313,7 +342,7 @@ int dprc_get_attributes(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
 
        /* send command to mc*/
@@ -333,6 +362,7 @@ int dprc_get_attributes(struct fsl_mc_io *mc_io,
 }
 
 int dprc_set_res_quota(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
                       uint16_t token,
                       int child_container_id,
                       char *type,
@@ -342,7 +372,7 @@ int dprc_set_res_quota(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_RES_QUOTA,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, child_container_id);
        cmd.params[0] |= mc_enc(32, 16, quota);
        cmd.params[1] |= mc_enc(0, 8, type[0]);
@@ -367,6 +397,7 @@ int dprc_set_res_quota(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_res_quota(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
                       uint16_t token,
                       int child_container_id,
                       char *type,
@@ -377,7 +408,7 @@ int dprc_get_res_quota(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_QUOTA,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, child_container_id);
        cmd.params[1] |= mc_enc(0, 8, type[0]);
        cmd.params[1] |= mc_enc(8, 8, type[1]);
@@ -408,6 +439,7 @@ int dprc_get_res_quota(struct fsl_mc_io *mc_io,
 }
 
 int dprc_assign(struct fsl_mc_io *mc_io,
+               uint32_t cmd_flags,
                uint16_t token,
                int container_id,
                struct dprc_res_req *res_req)
@@ -416,7 +448,7 @@ int dprc_assign(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_ASSIGN,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, container_id);
        cmd.params[0] |= mc_enc(32, 32, res_req->options);
        cmd.params[1] |= mc_enc(0, 32, res_req->num);
@@ -443,6 +475,7 @@ int dprc_assign(struct fsl_mc_io *mc_io,
 }
 
 int dprc_unassign(struct fsl_mc_io *mc_io,
+                 uint32_t cmd_flags,
                  uint16_t token,
                  int child_container_id,
                  struct dprc_res_req *res_req)
@@ -451,7 +484,7 @@ int dprc_unassign(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_UNASSIGN,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(0, 32, child_container_id);
        cmd.params[0] |= mc_enc(32, 32, res_req->options);
@@ -479,6 +512,7 @@ int dprc_unassign(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_pool_count(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
                        int *pool_count)
 {
@@ -487,7 +521,7 @@ int dprc_get_pool_count(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_POOL_COUNT,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
 
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
@@ -501,6 +535,7 @@ int dprc_get_pool_count(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_pool(struct fsl_mc_io *mc_io,
+                 uint32_t cmd_flags,
                  uint16_t token,
                  int pool_index,
                  char *type)
@@ -510,7 +545,7 @@ int dprc_get_pool(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_POOL,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(0, 32, pool_index);
 
@@ -540,14 +575,17 @@ int dprc_get_pool(struct fsl_mc_io *mc_io,
        return 0;
 }
 
-int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count)
+int dprc_get_obj_count(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
+                      uint16_t token,
+                      int *obj_count)
 {
        struct mc_command cmd = { 0 };
        int err;
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
 
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
@@ -562,6 +600,7 @@ int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count)
 EXPORT_SYMBOL(dprc_get_obj_count);
 
 int dprc_get_obj(struct fsl_mc_io *mc_io,
+                uint32_t cmd_flags,
                 uint16_t token,
                 int obj_index,
                 struct dprc_obj_desc *obj_desc)
@@ -571,7 +610,7 @@ int dprc_get_obj(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(0, 32, obj_index);
 
@@ -604,12 +643,201 @@ int dprc_get_obj(struct fsl_mc_io *mc_io,
        obj_desc->type[13] = mc_dec(cmd.params[4], 40, 8);
        obj_desc->type[14] = mc_dec(cmd.params[4], 48, 8);
        obj_desc->type[15] = '\0';
-
+       obj_desc->label[0] = mc_dec(cmd.params[5], 0, 8);
+       obj_desc->label[1] = mc_dec(cmd.params[5], 8, 8);
+       obj_desc->label[2] = mc_dec(cmd.params[5], 16, 8);
+       obj_desc->label[3] = mc_dec(cmd.params[5], 24, 8);
+       obj_desc->label[4] = mc_dec(cmd.params[5], 32, 8);
+       obj_desc->label[5] = mc_dec(cmd.params[5], 40, 8);
+       obj_desc->label[6] = mc_dec(cmd.params[5], 48, 8);
+       obj_desc->label[7] = mc_dec(cmd.params[5], 56, 8);
+       obj_desc->label[8] = mc_dec(cmd.params[6], 0, 8);
+       obj_desc->label[9] = mc_dec(cmd.params[6], 8, 8);
+       obj_desc->label[10] = mc_dec(cmd.params[6], 16, 8);
+       obj_desc->label[11] = mc_dec(cmd.params[6], 24, 8);
+       obj_desc->label[12] = mc_dec(cmd.params[6], 32, 8);
+       obj_desc->label[13] = mc_dec(cmd.params[6], 40, 8);
+       obj_desc->label[14] = mc_dec(cmd.params[6], 48, 8);
+       obj_desc->label[15] = '\0';
        return 0;
 }
 EXPORT_SYMBOL(dprc_get_obj);
 
+int dprc_get_obj_desc(struct fsl_mc_io *mc_io,
+                     uint32_t cmd_flags,
+                     uint16_t token,
+                     char *obj_type,
+                     int obj_id,
+                     struct dprc_obj_desc *obj_desc)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_DESC,
+                                         cmd_flags,
+                                         token);
+       cmd.params[0] |= mc_enc(0, 32, obj_id);
+       cmd.params[1] |= mc_enc(0, 8, obj_type[0]);
+       cmd.params[1] |= mc_enc(8, 8, obj_type[1]);
+       cmd.params[1] |= mc_enc(16, 8, obj_type[2]);
+       cmd.params[1] |= mc_enc(24, 8, obj_type[3]);
+       cmd.params[1] |= mc_enc(32, 8, obj_type[4]);
+       cmd.params[1] |= mc_enc(40, 8, obj_type[5]);
+       cmd.params[1] |= mc_enc(48, 8, obj_type[6]);
+       cmd.params[1] |= mc_enc(56, 8, obj_type[7]);
+       cmd.params[2] |= mc_enc(0, 8, obj_type[8]);
+       cmd.params[2] |= mc_enc(8, 8, obj_type[9]);
+       cmd.params[2] |= mc_enc(16, 8, obj_type[10]);
+       cmd.params[2] |= mc_enc(24, 8, obj_type[11]);
+       cmd.params[2] |= mc_enc(32, 8, obj_type[12]);
+       cmd.params[2] |= mc_enc(40, 8, obj_type[13]);
+       cmd.params[2] |= mc_enc(48, 8, obj_type[14]);
+       cmd.params[2] |= mc_enc(56, 8, obj_type[15]);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       obj_desc->id = (int)mc_dec(cmd.params[0], 32, 32);
+       obj_desc->vendor = (uint16_t)mc_dec(cmd.params[1], 0, 16);
+       obj_desc->vendor = (uint8_t)mc_dec(cmd.params[1], 16, 8);
+       obj_desc->region_count = (uint8_t)mc_dec(cmd.params[1], 24, 8);
+       obj_desc->state = (uint32_t)mc_dec(cmd.params[1], 32, 32);
+       obj_desc->ver_major = (uint16_t)mc_dec(cmd.params[2], 0, 16);
+       obj_desc->ver_minor = (uint16_t)mc_dec(cmd.params[2], 16, 16);
+       obj_desc->type[0] = (char)mc_dec(cmd.params[3], 0, 8);
+       obj_desc->type[1] = (char)mc_dec(cmd.params[3], 8, 8);
+       obj_desc->type[2] = (char)mc_dec(cmd.params[3], 16, 8);
+       obj_desc->type[3] = (char)mc_dec(cmd.params[3], 24, 8);
+       obj_desc->type[4] = (char)mc_dec(cmd.params[3], 32, 8);
+       obj_desc->type[5] = (char)mc_dec(cmd.params[3], 40, 8);
+       obj_desc->type[6] = (char)mc_dec(cmd.params[3], 48, 8);
+       obj_desc->type[7] = (char)mc_dec(cmd.params[3], 56, 8);
+       obj_desc->type[8] = (char)mc_dec(cmd.params[4], 0, 8);
+       obj_desc->type[9] = (char)mc_dec(cmd.params[4], 8, 8);
+       obj_desc->type[10] = (char)mc_dec(cmd.params[4], 16, 8);
+       obj_desc->type[11] = (char)mc_dec(cmd.params[4], 24, 8);
+       obj_desc->type[12] = (char)mc_dec(cmd.params[4], 32, 8);
+       obj_desc->type[13] = (char)mc_dec(cmd.params[4], 40, 8);
+       obj_desc->type[14] = (char)mc_dec(cmd.params[4], 48, 8);
+       obj_desc->type[15] = (char)mc_dec(cmd.params[4], 56, 8);
+       obj_desc->label[0] = (char)mc_dec(cmd.params[5], 0, 8);
+       obj_desc->label[1] = (char)mc_dec(cmd.params[5], 8, 8);
+       obj_desc->label[2] = (char)mc_dec(cmd.params[5], 16, 8);
+       obj_desc->label[3] = (char)mc_dec(cmd.params[5], 24, 8);
+       obj_desc->label[4] = (char)mc_dec(cmd.params[5], 32, 8);
+       obj_desc->label[5] = (char)mc_dec(cmd.params[5], 40, 8);
+       obj_desc->label[6] = (char)mc_dec(cmd.params[5], 48, 8);
+       obj_desc->label[7] = (char)mc_dec(cmd.params[5], 56, 8);
+       obj_desc->label[8] = (char)mc_dec(cmd.params[6], 0, 8);
+       obj_desc->label[9] = (char)mc_dec(cmd.params[6], 8, 8);
+       obj_desc->label[10] = (char)mc_dec(cmd.params[6], 16, 8);
+       obj_desc->label[11] = (char)mc_dec(cmd.params[6], 24, 8);
+       obj_desc->label[12] = (char)mc_dec(cmd.params[6], 32, 8);
+       obj_desc->label[13] = (char)mc_dec(cmd.params[6], 40, 8);
+       obj_desc->label[14] = (char)mc_dec(cmd.params[6], 48, 8);
+       obj_desc->label[15] = (char)mc_dec(cmd.params[6], 56, 8);
+
+       return 0;
+}
+EXPORT_SYMBOL(dprc_get_obj_desc);
+
+int dprc_set_obj_irq(struct fsl_mc_io *mc_io,
+                    uint32_t cmd_flags,
+                    uint16_t token,
+                    char *obj_type,
+                    int obj_id,
+                    uint8_t irq_index,
+                    struct dprc_irq_cfg *irq_cfg)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_OBJ_IRQ,
+                                         cmd_flags,
+                                         token);
+       cmd.params[0] |= mc_enc(32, 8, irq_index);
+       cmd.params[0] |= mc_enc(0, 32, irq_cfg->val);
+       cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
+       cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
+       cmd.params[2] |= mc_enc(32, 32, obj_id);
+       cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
+       cmd.params[3] |= mc_enc(8, 8, obj_type[1]);
+       cmd.params[3] |= mc_enc(16, 8, obj_type[2]);
+       cmd.params[3] |= mc_enc(24, 8, obj_type[3]);
+       cmd.params[3] |= mc_enc(32, 8, obj_type[4]);
+       cmd.params[3] |= mc_enc(40, 8, obj_type[5]);
+       cmd.params[3] |= mc_enc(48, 8, obj_type[6]);
+       cmd.params[3] |= mc_enc(56, 8, obj_type[7]);
+       cmd.params[4] |= mc_enc(0, 8, obj_type[8]);
+       cmd.params[4] |= mc_enc(8, 8, obj_type[9]);
+       cmd.params[4] |= mc_enc(16, 8, obj_type[10]);
+       cmd.params[4] |= mc_enc(24, 8, obj_type[11]);
+       cmd.params[4] |= mc_enc(32, 8, obj_type[12]);
+       cmd.params[4] |= mc_enc(40, 8, obj_type[13]);
+       cmd.params[4] |= mc_enc(48, 8, obj_type[14]);
+       cmd.params[4] |= mc_enc(56, 8, obj_type[15]);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+EXPORT_SYMBOL(dprc_set_obj_irq);
+
+int dprc_get_obj_irq(struct fsl_mc_io *mc_io,
+                    uint32_t cmd_flags,
+                    uint16_t token,
+                    char *obj_type,
+                    int obj_id,
+                    uint8_t irq_index,
+                    int *type,
+                    struct dprc_irq_cfg *irq_cfg)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_IRQ,
+                                         cmd_flags,
+                                         token);
+       cmd.params[0] |= mc_enc(0, 32, obj_id);
+       cmd.params[0] |= mc_enc(32, 8, irq_index);
+       cmd.params[1] |= mc_enc(0, 8, obj_type[0]);
+       cmd.params[1] |= mc_enc(8, 8, obj_type[1]);
+       cmd.params[1] |= mc_enc(16, 8, obj_type[2]);
+       cmd.params[1] |= mc_enc(24, 8, obj_type[3]);
+       cmd.params[1] |= mc_enc(32, 8, obj_type[4]);
+       cmd.params[1] |= mc_enc(40, 8, obj_type[5]);
+       cmd.params[1] |= mc_enc(48, 8, obj_type[6]);
+       cmd.params[1] |= mc_enc(56, 8, obj_type[7]);
+       cmd.params[2] |= mc_enc(0, 8, obj_type[8]);
+       cmd.params[2] |= mc_enc(8, 8, obj_type[9]);
+       cmd.params[2] |= mc_enc(16, 8, obj_type[10]);
+       cmd.params[2] |= mc_enc(24, 8, obj_type[11]);
+       cmd.params[2] |= mc_enc(32, 8, obj_type[12]);
+       cmd.params[2] |= mc_enc(40, 8, obj_type[13]);
+       cmd.params[2] |= mc_enc(48, 8, obj_type[14]);
+       cmd.params[2] |= mc_enc(56, 8, obj_type[15]);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       irq_cfg->val = (uint32_t)mc_dec(cmd.params[0], 0, 32);
+       irq_cfg->paddr = (uint64_t)mc_dec(cmd.params[1], 0, 64);
+       irq_cfg->user_irq_id = (int)mc_dec(cmd.params[2], 0, 32);
+       *type = (int)mc_dec(cmd.params[2], 32, 32);
+
+       return 0;
+}
+EXPORT_SYMBOL(dprc_get_obj_irq);
+
 int dprc_get_res_count(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
                       uint16_t token,
                       char *type,
                       int *res_count)
@@ -621,7 +849,7 @@ int dprc_get_res_count(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[1] |= mc_enc(0, 8, type[0]);
        cmd.params[1] |= mc_enc(8, 8, type[1]);
        cmd.params[1] |= mc_enc(16, 8, type[2]);
@@ -652,6 +880,7 @@ int dprc_get_res_count(struct fsl_mc_io *mc_io,
 EXPORT_SYMBOL(dprc_get_res_count);
 
 int dprc_get_res_ids(struct fsl_mc_io *mc_io,
+                    uint32_t cmd_flags,
                     uint16_t token,
                     char *type,
                     struct dprc_res_ids_range_desc *range_desc)
@@ -661,7 +890,7 @@ int dprc_get_res_ids(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(42, 7, range_desc->iter_status);
        cmd.params[1] |= mc_enc(0, 32, range_desc->base_id);
        cmd.params[1] |= mc_enc(32, 32, range_desc->last_id);
@@ -696,32 +925,8 @@ int dprc_get_res_ids(struct fsl_mc_io *mc_io,
 }
 EXPORT_SYMBOL(dprc_get_res_ids);
 
-int dprc_get_portal_paddr(struct fsl_mc_io *mc_io,
-                         uint16_t token,
-                         int portal_id,
-                         uint64_t *portal_addr)
-{
-       struct mc_command cmd = { 0 };
-       int err;
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_PORTAL_PADDR,
-                                         MC_CMD_PRI_LOW, token);
-       cmd.params[0] |= mc_enc(0, 32, portal_id);
-
-       /* send command to mc*/
-       err = mc_send_command(mc_io, &cmd);
-       if (err)
-               return err;
-
-       /* retrieve response parameters */
-       *portal_addr = mc_dec(cmd.params[1], 0, 64);
-
-       return 0;
-}
-EXPORT_SYMBOL(dprc_get_portal_paddr);
-
 int dprc_get_obj_region(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
                        char *obj_type,
                        int obj_id,
@@ -733,7 +938,7 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
-                                         MC_CMD_PRI_LOW, token);
+                                         cmd_flags, token);
        cmd.params[0] |= mc_enc(0, 32, obj_id);
        cmd.params[0] |= mc_enc(48, 8, region_index);
        cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
@@ -759,28 +964,83 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       region_desc->base_paddr = mc_dec(cmd.params[1], 0, 64);
+       region_desc->base_offset = mc_dec(cmd.params[1], 0, 64);
        region_desc->size = mc_dec(cmd.params[2], 0, 32);
 
        return 0;
 }
 EXPORT_SYMBOL(dprc_get_obj_region);
 
+int dprc_set_obj_label(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
+                      uint16_t  token,
+                      char *obj_type,
+                      int  obj_id,
+                      char *label)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_OBJ_LABEL,
+                                         cmd_flags,
+                                         token);
+
+       cmd.params[0] |= mc_enc(0, 32, obj_id);
+       cmd.params[1] |= mc_enc(0, 8, label[0]);
+       cmd.params[1] |= mc_enc(8, 8, label[1]);
+       cmd.params[1] |= mc_enc(16, 8, label[2]);
+       cmd.params[1] |= mc_enc(24, 8, label[3]);
+       cmd.params[1] |= mc_enc(32, 8, label[4]);
+       cmd.params[1] |= mc_enc(40, 8, label[5]);
+       cmd.params[1] |= mc_enc(48, 8, label[6]);
+       cmd.params[1] |= mc_enc(56, 8, label[7]);
+       cmd.params[2] |= mc_enc(0, 8, label[8]);
+       cmd.params[2] |= mc_enc(8, 8, label[9]);
+       cmd.params[2] |= mc_enc(16, 8, label[10]);
+       cmd.params[2] |= mc_enc(24, 8, label[11]);
+       cmd.params[2] |= mc_enc(32, 8, label[12]);
+       cmd.params[2] |= mc_enc(40, 8, label[13]);
+       cmd.params[2] |= mc_enc(48, 8, label[14]);
+       cmd.params[2] |= mc_enc(56, 8, label[15]);
+       cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
+       cmd.params[3] |= mc_enc(8, 8, obj_type[1]);
+       cmd.params[3] |= mc_enc(16, 8, obj_type[2]);
+       cmd.params[3] |= mc_enc(24, 8, obj_type[3]);
+       cmd.params[3] |= mc_enc(32, 8, obj_type[4]);
+       cmd.params[3] |= mc_enc(40, 8, obj_type[5]);
+       cmd.params[3] |= mc_enc(48, 8, obj_type[6]);
+       cmd.params[3] |= mc_enc(56, 8, obj_type[7]);
+       cmd.params[4] |= mc_enc(0, 8, obj_type[8]);
+       cmd.params[4] |= mc_enc(8, 8, obj_type[9]);
+       cmd.params[4] |= mc_enc(16, 8, obj_type[10]);
+       cmd.params[4] |= mc_enc(24, 8, obj_type[11]);
+       cmd.params[4] |= mc_enc(32, 8, obj_type[12]);
+       cmd.params[4] |= mc_enc(40, 8, obj_type[13]);
+       cmd.params[4] |= mc_enc(48, 8, obj_type[14]);
+       cmd.params[4] |= mc_enc(56, 8, obj_type[15]);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+EXPORT_SYMBOL(dprc_set_obj_label);
+
 int dprc_connect(struct fsl_mc_io *mc_io,
+                uint32_t cmd_flags,
                 uint16_t token,
                 const struct dprc_endpoint *endpoint1,
-                const struct dprc_endpoint *endpoint2)
+                const struct dprc_endpoint *endpoint2,
+                const struct dprc_connection_cfg *cfg)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(0, 32, endpoint1->id);
-       cmd.params[0] |= mc_enc(32, 32, endpoint1->interface_id);
+       cmd.params[0] |= mc_enc(32, 32, endpoint1->if_id);
        cmd.params[1] |= mc_enc(0, 32, endpoint2->id);
-       cmd.params[1] |= mc_enc(32, 32, endpoint2->interface_id);
+       cmd.params[1] |= mc_enc(32, 32, endpoint2->if_id);
        cmd.params[2] |= mc_enc(0, 8, endpoint1->type[0]);
        cmd.params[2] |= mc_enc(8, 8, endpoint1->type[1]);
        cmd.params[2] |= mc_enc(16, 8, endpoint1->type[2]);
@@ -797,6 +1057,8 @@ int dprc_connect(struct fsl_mc_io *mc_io,
        cmd.params[3] |= mc_enc(40, 8, endpoint1->type[13]);
        cmd.params[3] |= mc_enc(48, 8, endpoint1->type[14]);
        cmd.params[3] |= mc_enc(56, 8, endpoint1->type[15]);
+       cmd.params[4] |= mc_enc(0, 32, cfg->max_rate);
+       cmd.params[4] |= mc_enc(32, 32, cfg->committed_rate);
        cmd.params[5] |= mc_enc(0, 8, endpoint2->type[0]);
        cmd.params[5] |= mc_enc(8, 8, endpoint2->type[1]);
        cmd.params[5] |= mc_enc(16, 8, endpoint2->type[2]);
@@ -819,6 +1081,7 @@ int dprc_connect(struct fsl_mc_io *mc_io,
 }
 
 int dprc_disconnect(struct fsl_mc_io *mc_io,
+                   uint32_t cmd_flags,
                    uint16_t token,
                    const struct dprc_endpoint *endpoint)
 {
@@ -826,10 +1089,10 @@ int dprc_disconnect(struct fsl_mc_io *mc_io,
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(0, 32, endpoint->id);
-       cmd.params[0] |= mc_enc(32, 32, endpoint->interface_id);
+       cmd.params[0] |= mc_enc(32, 32, endpoint->if_id);
        cmd.params[1] |= mc_enc(0, 8, endpoint->type[0]);
        cmd.params[1] |= mc_enc(8, 8, endpoint->type[1]);
        cmd.params[1] |= mc_enc(16, 8, endpoint->type[2]);
@@ -852,20 +1115,21 @@ int dprc_disconnect(struct fsl_mc_io *mc_io,
 }
 
 int dprc_get_connection(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
                        uint16_t token,
-                                       const struct dprc_endpoint *endpoint1,
-                                       struct dprc_endpoint *endpoint2,
-                                       int *state)
+                       const struct dprc_endpoint *endpoint1,
+                       struct dprc_endpoint *endpoint2,
+                       int *state)
 {
        struct mc_command cmd = { 0 };
        int err;
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
-                                         MC_CMD_PRI_LOW,
+                                         cmd_flags,
                                          token);
        cmd.params[0] |= mc_enc(0, 32, endpoint1->id);
-       cmd.params[0] |= mc_enc(32, 32, endpoint1->interface_id);
+       cmd.params[0] |= mc_enc(32, 32, endpoint1->if_id);
        cmd.params[1] |= mc_enc(0, 8, endpoint1->type[0]);
        cmd.params[1] |= mc_enc(8, 8, endpoint1->type[1]);
        cmd.params[1] |= mc_enc(16, 8, endpoint1->type[2]);
@@ -890,7 +1154,7 @@ int dprc_get_connection(struct fsl_mc_io *mc_io,
 
        /* retrieve response parameters */
        endpoint2->id = mc_dec(cmd.params[3], 0, 32);
-       endpoint2->interface_id = mc_dec(cmd.params[3], 32, 32);
+       endpoint2->if_id = mc_dec(cmd.params[3], 32, 32);
        endpoint2->type[0] = mc_dec(cmd.params[4], 0, 8);
        endpoint2->type[1] = mc_dec(cmd.params[4], 8, 8);
        endpoint2->type[2] = mc_dec(cmd.params[4], 16, 8);
index f3718a324662be87e61d0afac7e0c2886fe3e92d..9812af445bfe244de5b96de9bb05f19449a42e54 100644 (file)
@@ -213,14 +213,14 @@ static int get_dprc_icid(struct fsl_mc_io *mc_io,
        struct dprc_attributes attr;
        int error;
 
-       error = dprc_open(mc_io, container_id, &dprc_handle);
+       error = dprc_open(mc_io, 0, container_id, &dprc_handle);
        if (error < 0) {
                pr_err("dprc_open() failed: %d\n", error);
                return error;
        }
 
        memset(&attr, 0, sizeof(attr));
-       error = dprc_get_attributes(mc_io, dprc_handle, &attr);
+       error = dprc_get_attributes(mc_io, 0, dprc_handle, &attr);
        if (error < 0) {
                pr_err("dprc_get_attributes() failed: %d\n", error);
                goto common_cleanup;
@@ -230,11 +230,12 @@ static int get_dprc_icid(struct fsl_mc_io *mc_io,
        error = 0;
 
 common_cleanup:
-       (void)dprc_close(mc_io, dprc_handle);
+       (void)dprc_close(mc_io, 0, dprc_handle);
        return error;
 }
 
-static int translate_mc_addr(u64 mc_addr, phys_addr_t *phys_addr)
+static int translate_mc_addr(enum dprc_region_type mc_region_type,
+                            u64 mc_offset, phys_addr_t *phys_addr)
 {
        int i;
        struct fsl_mc *mc = dev_get_drvdata(fsl_mc_bus_type.dev_root->parent);
@@ -243,7 +244,7 @@ static int translate_mc_addr(u64 mc_addr, phys_addr_t *phys_addr)
                /*
                 * Do identity mapping:
                 */
-               *phys_addr = mc_addr;
+               *phys_addr = mc_offset;
                return 0;
        }
 
@@ -251,10 +252,11 @@ static int translate_mc_addr(u64 mc_addr, phys_addr_t *phys_addr)
                struct fsl_mc_addr_translation_range *range =
                        &mc->translation_ranges[i];
 
-               if (mc_addr >= range->start_mc_addr &&
-                   mc_addr < range->end_mc_addr) {
+               if (mc_region_type == range->mc_region_type &&
+                   mc_offset >= range->start_mc_offset &&
+                   mc_offset < range->end_mc_offset) {
                        *phys_addr = range->start_phys_addr +
-                                    (mc_addr - range->start_mc_addr);
+                                    (mc_offset - range->start_mc_offset);
                        return 0;
                }
        }
@@ -270,6 +272,22 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
        struct resource *regions;
        struct dprc_obj_desc *obj_desc = &mc_dev->obj_desc;
        struct device *parent_dev = mc_dev->dev.parent;
+       enum dprc_region_type mc_region_type;
+
+       if (strcmp(obj_desc->type, "dprc") == 0 ||
+           strcmp(obj_desc->type, "dpmcp") == 0) {
+               mc_region_type = DPRC_REGION_TYPE_MC_PORTAL;
+       } else if (strcmp(obj_desc->type, "dpio") == 0) {
+               mc_region_type = DPRC_REGION_TYPE_QBMAN_PORTAL;
+       } else {
+               /*
+                * This function should not have been called for this MC object
+                * type, as this object type is not supposed to have MMIO
+                * regions
+                */
+               WARN_ON(true);
+               return -EINVAL;
+       }
 
        regions = kmalloc_array(obj_desc->region_count,
                                sizeof(regions[0]), GFP_KERNEL);
@@ -280,6 +298,7 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
                struct dprc_region_desc region_desc;
 
                error = dprc_get_obj_region(mc_bus_dev->mc_io,
+                                           0,
                                            mc_bus_dev->mc_handle,
                                            obj_desc->type,
                                            obj_desc->id, i, &region_desc);
@@ -289,14 +308,15 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
                        goto error_cleanup_regions;
                }
 
-               WARN_ON(region_desc.base_paddr == 0x0);
                WARN_ON(region_desc.size == 0);
-               error = translate_mc_addr(region_desc.base_paddr,
+               error = translate_mc_addr(mc_region_type,
+                                         region_desc.base_offset,
                                          &regions[i].start);
                if (error < 0) {
                        dev_err(parent_dev,
-                               "Invalid MC address: %#llx\n",
-                               region_desc.base_paddr);
+                               "Invalid MC offset: %#x (for %s.%d\'s region %d)\n",
+                               region_desc.base_offset,
+                               obj_desc->type, obj_desc->id, i);
                        goto error_cleanup_regions;
                }
 
@@ -574,11 +594,13 @@ static int get_mc_addr_translation_ranges(struct device *dev,
        for (i = 0; i < *num_ranges; ++i) {
                struct fsl_mc_addr_translation_range *range = &(*ranges)[i];
 
-               range->start_mc_addr = of_read_number(cell, mc_addr_cells);
+               range->mc_region_type = of_read_number(cell, 1);
+               range->start_mc_offset = of_read_number(cell + 1,
+                                                       mc_addr_cells - 1);
                cell += mc_addr_cells;
                range->start_phys_addr = of_read_number(cell, paddr_cells);
                cell += paddr_cells;
-               range->end_mc_addr = range->start_mc_addr +
+               range->end_mc_offset = range->start_mc_offset +
                                     of_read_number(cell, mc_size_cells);
 
                cell += mc_size_cells;
index f1862a78a409b1e7e7b8c0760052f19abd50c487..b0c081f7d1e3ccaeff0f45c13ba8c62830cdd01c 100644 (file)
@@ -32,6 +32,8 @@
 #ifndef _FSL_DPRC_H
 #define _FSL_DPRC_H
 
+#include "mc-cmd.h"
+
 /* Data Path Resource Container API
  * Contains DPRC API for managing and querying DPAA resources
  */
@@ -55,6 +57,7 @@ struct fsl_mc_io;
 /**
  * dprc_open() - Open DPRC object for use
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @container_id: Container ID to open
  * @token:     Returned token of DPRC object
  *
@@ -62,11 +65,15 @@ struct fsl_mc_io;
  *
  * @warning    Required before any operation on the object.
  */
-int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token);
+int dprc_open(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             int container_id,
+             uint16_t *token);
 
 /**
  * dprc_close() - Close the control session of the object
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  *
  * After this function is called, no further operations are
@@ -74,7 +81,9 @@ int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token);
  *
  * Return:     '0' on Success; Error code otherwise.
  */
-int dprc_close(struct fsl_mc_io *mc_io, uint16_t token);
+int dprc_close(struct fsl_mc_io *mc_io,
+              uint32_t cmd_flags,
+              uint16_t token);
 
 /**
  * Container general options
@@ -115,6 +124,9 @@ int dprc_close(struct fsl_mc_io *mc_io, uint16_t token);
 /* AIOP - Indicates that container belongs to AIOP.  */
 #define DPRC_CFG_OPT_AIOP                      0x00000020
 
+/* IRQ Config - Indicates that the container allowed to configure its IRQs.  */
+#define DPRC_CFG_OPT_IRQ_CFG_ALLOWED           0x00000040
+
 /**
  * struct dprc_cfg - Container configuration options
  * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free
@@ -122,33 +134,37 @@ int dprc_close(struct fsl_mc_io *mc_io, uint16_t token);
  * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free
  *             portal ID is allocated by the DPRC
  * @options: Combination of 'DPRC_CFG_OPT_<X>' options
+ * @label: Object's label
  */
 struct dprc_cfg {
        uint16_t icid;
        int portal_id;
        uint64_t options;
+       char label[16];
 };
 
 /**
  * dprc_create_container() - Create child container
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @cfg:       Child container configuration
  * @child_container_id:        Returned child container ID
- * @child_portal_paddr:        Returned base physical address of the
- *                                     child portal
+ * @child_portal_offset: Returned child portal offset from MC portal base
  *
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_create_container(struct fsl_mc_io     *mc_io,
+                         uint32_t              cmd_flags,
                          uint16_t              token,
                          struct dprc_cfg       *cfg,
                          int                   *child_container_id,
-                         uint64_t              *child_portal_paddr);
+                         uint64_t              *child_portal_offset);
 
 /**
  * dprc_destroy_container() - Destroy child container.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @child_container_id:        ID of the container to destroy
  *
@@ -168,12 +184,14 @@ int dprc_create_container(struct fsl_mc_io        *mc_io,
  *
  */
 int dprc_destroy_container(struct fsl_mc_io    *mc_io,
+                          uint32_t             cmd_flags,
                           uint16_t             token,
                           int                  child_container_id);
 
 /**
  * dprc_reset_container - Reset child container.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @child_container_id:        ID of the container to reset
  *
@@ -193,23 +211,27 @@ int dprc_destroy_container(struct fsl_mc_io       *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_reset_container(struct fsl_mc_io *mc_io,
+                        uint32_t cmd_flags,
                         uint16_t token,
                         int child_container_id);
 
 /* IRQ */
 
+/* IRQ index */
+#define DPRC_IRQ_INDEX          0
+
 /* Number of dprc's IRQs */
 #define DPRC_NUM_OF_IRQS               1
 
-/* Object irq events */
+/* DPRC IRQ events */
 
-/* IRQ event - Indicates that a new object assigned to the container */
+/* IRQ event - Indicates that a new object added to the container */
 #define DPRC_IRQ_EVENT_OBJ_ADDED               0x00000001
-/* IRQ event - Indicates that an object was unassigned from the container */
+/* IRQ event - Indicates that an object was removed from the container */
 #define DPRC_IRQ_EVENT_OBJ_REMOVED             0x00000002
-/* IRQ event - Indicates that resources assigned to the container */
+/* IRQ event - Indicates that resources added to the container */
 #define DPRC_IRQ_EVENT_RES_ADDED               0x00000004
-/* IRQ event - Indicates that resources unassigned from the container */
+/* IRQ event - Indicates that resources removed from the container */
 #define DPRC_IRQ_EVENT_RES_REMOVED             0x00000008
 /* IRQ event - Indicates that one of the descendant containers that opened by
  * this container is destroyed
@@ -224,50 +246,57 @@ int dprc_reset_container(struct fsl_mc_io *mc_io,
 /* Irq event - Indicates that object is created at the container */
 #define DPRC_IRQ_EVENT_OBJ_CREATED             0x00000040
 
+/**
+ * struct dprc_irq_cfg - IRQ configuration
+ * @paddr:     Address that must be written to signal a message-based interrupt
+ * @val:       Value to write into irq_addr address
+ * @user_irq_id: A user defined number associated with this IRQ
+ */
+struct dprc_irq_cfg {
+            uint64_t           paddr;
+            uint32_t           val;
+            int                user_irq_id;
+};
+
 /**
  * dprc_set_irq() - Set IRQ information for the DPRC to trigger an interrupt.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: Identifies the interrupt index to configure
- * @irq_addr:  Address that must be written to
- *                     signal a message-based interrupt
- * @irq_val:   Value to write into irq_addr address
- * @user_irq_id: Returned a user defined number associated with this IRQ
+ * @irq_cfg:   IRQ configuration
  *
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_set_irq(struct fsl_mc_io      *mc_io,
+                uint32_t               cmd_flags,
                 uint16_t               token,
                 uint8_t                irq_index,
-                uint64_t               irq_addr,
-                uint32_t               irq_val,
-                int                    user_irq_id);
+                struct dprc_irq_cfg    *irq_cfg);
 
 /**
  * dprc_get_irq() - Get IRQ information from the DPRC.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: The interrupt index to configure
- * @type:      Returned interrupt type: 0 represents message interrupt
- *                     type (both irq_addr and irq_val are valid)
- * @irq_addr:  Returned address that must be written to
- *                     signal the message-based interrupt
- * @irq_val:   Value to write into irq_addr address
- * @user_irq_id: A user defined number associated with this IRQ
+ * @type:      Interrupt type: 0 represents message interrupt
+ *             type (both irq_addr and irq_val are valid)
+ * @irq_cfg:   IRQ attributes
  *
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_irq(struct fsl_mc_io      *mc_io,
+                uint32_t               cmd_flags,
                 uint16_t               token,
                 uint8_t                irq_index,
                 int                    *type,
-                uint64_t               *irq_addr,
-                uint32_t               *irq_val,
-                int                    *user_irq_id);
+                struct dprc_irq_cfg    *irq_cfg);
 
 /**
  * dprc_set_irq_enable() - Set overall interrupt state.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: The interrupt index to configure
  * @en:                Interrupt state - enable = 1, disable = 0
@@ -280,6 +309,7 @@ int dprc_get_irq(struct fsl_mc_io   *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_set_irq_enable(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
                        uint16_t                token,
                        uint8_t                 irq_index,
                        uint8_t                 en);
@@ -287,6 +317,7 @@ int dprc_set_irq_enable(struct fsl_mc_io    *mc_io,
 /**
  * dprc_get_irq_enable() - Get overall interrupt state.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index:  The interrupt index to configure
  * @en:                Returned interrupt state - enable = 1, disable = 0
@@ -294,6 +325,7 @@ int dprc_set_irq_enable(struct fsl_mc_io    *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_irq_enable(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
                        uint16_t                token,
                        uint8_t                 irq_index,
                        uint8_t                 *en);
@@ -301,6 +333,7 @@ int dprc_get_irq_enable(struct fsl_mc_io    *mc_io,
 /**
  * dprc_set_irq_mask() - Set interrupt mask.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: The interrupt index to configure
  * @mask:      event mask to trigger interrupt;
@@ -314,6 +347,7 @@ int dprc_get_irq_enable(struct fsl_mc_io    *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_set_irq_mask(struct fsl_mc_io *mc_io,
+                     uint32_t          cmd_flags,
                      uint16_t          token,
                      uint8_t           irq_index,
                      uint32_t          mask);
@@ -321,6 +355,7 @@ int dprc_set_irq_mask(struct fsl_mc_io      *mc_io,
 /**
  * dprc_get_irq_mask() - Get interrupt mask.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: The interrupt index to configure
  * @mask:      Returned event mask to trigger interrupt
@@ -331,6 +366,7 @@ int dprc_set_irq_mask(struct fsl_mc_io      *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_irq_mask(struct fsl_mc_io *mc_io,
+                     uint32_t          cmd_flags,
                      uint16_t          token,
                      uint8_t           irq_index,
                      uint32_t          *mask);
@@ -338,6 +374,7 @@ int dprc_get_irq_mask(struct fsl_mc_io      *mc_io,
 /**
  * dprc_get_irq_status() - Get the current status of any pending interrupts.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: The interrupt index to configure
  * @status:    Returned interrupts status - one bit per cause:
@@ -347,6 +384,7 @@ int dprc_get_irq_mask(struct fsl_mc_io      *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_irq_status(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
                        uint16_t                token,
                        uint8_t                 irq_index,
                        uint32_t                *status);
@@ -354,6 +392,7 @@ int dprc_get_irq_status(struct fsl_mc_io    *mc_io,
 /**
  * dprc_clear_irq_status() - Clear a pending interrupt's status
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @irq_index: The interrupt index to configure
  * @status:    bits to clear (W1C) - one bit per cause:
@@ -363,6 +402,7 @@ int dprc_get_irq_status(struct fsl_mc_io    *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_clear_irq_status(struct fsl_mc_io     *mc_io,
+                         uint32_t              cmd_flags,
                          uint16_t              token,
                          uint8_t               irq_index,
                          uint32_t              status);
@@ -394,12 +434,14 @@ struct dprc_attributes {
 /**
  * dprc_get_attributes() - Obtains container attributes
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @attributes Returned container attributes
  *
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_attributes(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
                        uint16_t                token,
                        struct dprc_attributes  *attributes);
 
@@ -407,6 +449,7 @@ int dprc_get_attributes(struct fsl_mc_io    *mc_io,
  * dprc_set_res_quota() - Set allocation policy for a specific resource/object
  *             type in a child container
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @child_container_id:        ID of the child container
  * @type:      Resource/object type
@@ -428,6 +471,7 @@ int dprc_get_attributes(struct fsl_mc_io    *mc_io,
  * @warning    Only the parent container is allowed to change a child policy.
  */
 int dprc_set_res_quota(struct fsl_mc_io        *mc_io,
+                      uint32_t         cmd_flags,
                       uint16_t         token,
                       int              child_container_id,
                       char             *type,
@@ -437,6 +481,7 @@ int dprc_set_res_quota(struct fsl_mc_io     *mc_io,
  * dprc_get_res_quota() - Gets the allocation policy of a specific
  *             resource/object type in a child container
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @child_container_id;        ID of the child container
  * @type:      resource/object type
@@ -448,6 +493,7 @@ int dprc_set_res_quota(struct fsl_mc_io     *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_res_quota(struct fsl_mc_io        *mc_io,
+                      uint32_t         cmd_flags,
                       uint16_t         token,
                       int              child_container_id,
                       char             *type,
@@ -500,6 +546,7 @@ struct dprc_res_req {
 /**
  * dprc_assign() - Assigns objects or resource to a child container.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @container_id: ID of the child container
  * @res_req:   Describes the type and amount of resources to
@@ -529,6 +576,7 @@ struct dprc_res_req {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_assign(struct fsl_mc_io       *mc_io,
+               uint32_t                cmd_flags,
                uint16_t                token,
                int                     container_id,
                struct dprc_res_req     *res_req);
@@ -537,6 +585,7 @@ int dprc_assign(struct fsl_mc_io    *mc_io,
  * dprc_unassign() - Un-assigns objects or resources from a child container
  *             and moves them into this (parent) DPRC.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @child_container_id:        ID of the child container
  * @res_req:   Describes the type and amount of resources to un-assign from
@@ -548,12 +597,14 @@ int dprc_assign(struct fsl_mc_io  *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_unassign(struct fsl_mc_io     *mc_io,
+                 uint32_t              cmd_flags,
                  uint16_t              token,
                  int                   child_container_id,
                  struct dprc_res_req   *res_req);
 
 /**
  * dprc_get_pool_count() - Get the number of dprc's pools
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @mc_io:     Pointer to MC portal's I/O object
  * @token:     Token of DPRC object
  * @pool_count:        Returned number of resource pools in the dprc
@@ -561,12 +612,14 @@ int dprc_unassign(struct fsl_mc_io        *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_pool_count(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
                        uint16_t                token,
                        int                     *pool_count);
 
 /**
  * dprc_get_pool() - Get the type (string) of a certain dprc's pool
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @pool_index;        Index of the pool to be queried (< pool_count)
  * @type:      The type of the pool
@@ -579,6 +632,7 @@ int dprc_get_pool_count(struct fsl_mc_io    *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_pool(struct fsl_mc_io     *mc_io,
+                 uint32_t              cmd_flags,
                  uint16_t              token,
                  int                   pool_index,
                  char                  *type);
@@ -586,12 +640,16 @@ int dprc_get_pool(struct fsl_mc_io        *mc_io,
 /**
  * dprc_get_obj_count() - Obtains the number of objects in the DPRC
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @obj_count: Number of objects assigned to the DPRC
  *
  * Return:     '0' on Success; Error code otherwise.
  */
-int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count);
+int dprc_get_obj_count(struct fsl_mc_io *mc_io,
+                      uint32_t         cmd_flags,
+                      uint16_t         token,
+                      int              *obj_count);
 
 /* Objects Attributes Flags */
 
@@ -610,6 +668,7 @@ int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count);
  * @irq_count: Number of interrupts supported by the object
  * @region_count: Number of mappable regions supported by the object
  * @state: Object state: combination of DPRC_OBJ_STATE_ states
+ * @label: Object label
  */
 struct dprc_obj_desc {
        char type[16];
@@ -620,11 +679,13 @@ struct dprc_obj_desc {
        uint8_t irq_count;
        uint8_t region_count;
        uint32_t state;
+       char label[16];
 };
 
 /**
  * dprc_get_obj() - Get general information on an object
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @obj_index: Index of the object to be queried (< obj_count)
  * @obj_desc:  Returns the requested object descriptor
@@ -637,14 +698,79 @@ struct dprc_obj_desc {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_obj(struct fsl_mc_io      *mc_io,
+                uint32_t               cmd_flags,
                 uint16_t               token,
                 int                    obj_index,
                 struct dprc_obj_desc   *obj_desc);
 
+/**
+ * dprc_get_obj_desc() - Get object descriptor.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPRC object
+ * @obj_type:  The type of the object to get its descriptor.
+ * @obj_id:    The id of the object to get its descriptor
+ * @obj_desc:  The returned descriptor to fill and return to the user
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ */
+int dprc_get_obj_desc(struct fsl_mc_io         *mc_io,
+                     uint32_t          cmd_flags,
+                       uint16_t                token,
+                       char                    *obj_type,
+                       int                     obj_id,
+                       struct dprc_obj_desc    *obj_desc);
+
+/**
+ * dprc_set_obj_irq() - Set IRQ information for object to trigger an interrupt.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPRC object
+ * @obj_type:  Type of the object to set its IRQ
+ * @obj_id:    ID of the object to set its IRQ
+ * @irq_index: The interrupt index to configure
+ * @irq_cfg:   IRQ configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_set_obj_irq(struct fsl_mc_io          *mc_io,
+                    uint32_t                   cmd_flags,
+                    uint16_t                   token,
+                    char                       *obj_type,
+                    int                        obj_id,
+                    uint8_t                    irq_index,
+                    struct dprc_irq_cfg        *irq_cfg);
+
+/**
+ * dprc_get_obj_irq() - Get IRQ information from object.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPRC object
+ * @obj_type:  Type od the object to get its IRQ
+ * @obj_id:    ID of the object to get its IRQ
+ * @irq_index: The interrupt index to configure
+ * @type:      Interrupt type: 0 represents message interrupt
+ *             type (both irq_addr and irq_val are valid)
+ * @irq_cfg:   The returned IRQ attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_obj_irq(struct fsl_mc_io          *mc_io,
+                    uint32_t                   cmd_flags,
+                    uint16_t                   token,
+                    char                       *obj_type,
+                    int                        obj_id,
+                    uint8_t                    irq_index,
+                    int                        *type,
+                    struct dprc_irq_cfg        *irq_cfg);
+
 /**
  * dprc_get_res_count() - Obtains the number of free resources that are assigned
  *             to this container, by pool type
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @type:      pool type
  * @res_count: Returned number of free resources of the given
@@ -653,6 +779,7 @@ int dprc_get_obj(struct fsl_mc_io   *mc_io,
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_res_count(struct fsl_mc_io        *mc_io,
+                      uint32_t         cmd_flags,
                       uint16_t         token,
                       char             *type,
                       int              *res_count);
@@ -687,6 +814,7 @@ struct dprc_res_ids_range_desc {
 /**
  * dprc_get_res_ids() - Obtains IDs of free resources in the container
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @type:      pool type
  * @range_desc:        range descriptor
@@ -694,37 +822,46 @@ struct dprc_res_ids_range_desc {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_res_ids(struct fsl_mc_io                  *mc_io,
+                    uint32_t                           cmd_flags,
                     uint16_t                           token,
                     char                               *type,
                     struct dprc_res_ids_range_desc     *range_desc);
 
+/* Region flags */
+/* Cacheable - Indicates that region should be mapped as cacheable */
+#define DPRC_REGION_CACHEABLE  0x00000001
+
 /**
- * dprc_get_portal_paddr() - Get the physical address of MC portals
- * @mc_io:     Pointer to MC portal's I/O object
- * @token:     Token of DPRC object
- * @portal_id: MC portal ID
- * @portal_addr: The physical address of the MC portal ID
- *
- * Return:     '0' on Success; Error code otherwise.
+ * enum dprc_region_type - Region type
+ * @DPRC_REGION_TYPE_MC_PORTAL: MC portal region
+ * @DPRC_REGION_TYPE_QBMAN_PORTAL: Qbman portal region
  */
-int dprc_get_portal_paddr(struct fsl_mc_io     *mc_io,
-                         uint16_t              token,
-                         int                   portal_id,
-                         uint64_t              *portal_addr);
+enum dprc_region_type {
+       DPRC_REGION_TYPE_MC_PORTAL,
+       DPRC_REGION_TYPE_QBMAN_PORTAL
+};
 
 /**
  * struct dprc_region_desc - Mappable region descriptor
- * @base_paddr: Region base physical address
+ * @base_offset: Region offset from region's base address.
+ *     For DPMCP and DPRC objects, region base is offset from SoC MC portals
+ *     base address; For DPIO, region base is offset from SoC QMan portals
+ *     base address
  * @size: Region size (in bytes)
+ * @flags: Region attributes
+ * @type: Portal region type
  */
 struct dprc_region_desc {
-       uint64_t base_paddr;
+       uint32_t base_offset;
        uint32_t size;
+       uint32_t flags;
+       enum dprc_region_type type;
 };
 
 /**
  * dprc_get_obj_region() - Get region information for a specified object.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @obj_type;  Object type as returned in dprc_get_obj()
  * @obj_id:    Unique object instance as returned in dprc_get_obj()
@@ -734,64 +871,110 @@ struct dprc_region_desc {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_get_obj_region(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
                        uint16_t                token,
                        char                    *obj_type,
                        int                     obj_id,
                        uint8_t                 region_index,
                        struct dprc_region_desc *region_desc);
 
+/**
+ * dprc_set_obj_label() - Set object label.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPRC object
+ * @obj_type:  Object's type
+ * @obj_id:    Object's ID
+ * @label:     The required label. The maximum length is 16 chars.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_set_obj_label(struct fsl_mc_io        *mc_io,
+                      uint32_t         cmd_flags,
+                      uint16_t         token,
+                      char             *obj_type,
+                      int              obj_id,
+                      char             *label);
+
 /**
  * struct dprc_endpoint - Endpoint description for link connect/disconnect
  *                     operations
  * @type: Endpoint object type: NULL terminated string
  * @id: Endpoint object ID
- * @interface_id: Interface ID; should be set for endpoints with multiple
+ * @if_id: Interface ID; should be set for endpoints with multiple
  *             interfaces ("dpsw", "dpdmux"); for others, always set to 0
  */
 struct dprc_endpoint {
        char type[16];
        int id;
-       int interface_id;
+       int if_id;
+};
+
+/**
+ * struct dprc_connection_cfg - Connection configuration.
+ *                             Used for virtual connections only
+ * @committed_rate: Committed rate (Mbits/s)
+ * @max_rate: Maximum rate (Mbits/s)
+ */
+struct dprc_connection_cfg {
+       uint32_t committed_rate;
+       uint32_t max_rate;
 };
 
 /**
  * dprc_connect() - Connect two endpoints to create a network link between them
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @endpoint1: Endpoint 1 configuration parameters
  * @endpoint2: Endpoint 2 configuration parameters
+ * @cfg: Connection configuration. The connection configuration is ignored for
+ *     connections made to DPMAC objects, where rate is set according to
+ *     MAC configuration.
+ *     The committed rate is the guaranteed rate for the connection.
+ *     The maximum rate is an upper limit allowed for the connection; it is
+ *     expected to be equal or higher than the committed rate.
+ *     When committed and maximum rates are both zero, the connection is set
+ *     to "best effort" mode, having lower priority compared to connections
+ *     with committed or maximum rates.
  *
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_connect(struct fsl_mc_io              *mc_io,
+                uint32_t                       cmd_flags,
                 uint16_t                       token,
                 const struct dprc_endpoint     *endpoint1,
-                const struct dprc_endpoint     *endpoint2);
+                const struct dprc_endpoint     *endpoint2,
+                const struct dprc_connection_cfg *cfg);
 
 /**
  * dprc_disconnect() - Disconnect one endpoint to remove its network connection
  * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPRC object
  * @endpoint:  Endpoint configuration parameters
  *
  * Return:     '0' on Success; Error code otherwise.
  */
 int dprc_disconnect(struct fsl_mc_io           *mc_io,
+                   uint32_t                    cmd_flags,
                    uint16_t                    token,
                    const struct dprc_endpoint  *endpoint);
 
 /**
 * dprc_get_connection() - Get connected endpoint and link status if connection
 *                      exists.
-* @mc_io               Pointer to MC portal's I/O object
-* @token               Token of DPRC object
-* @endpoint1   Endpoint 1 configuration parameters
-* @endpoint2   Returned endpoint 2 configuration parameters
+* @mc_io:      Pointer to MC portal's I/O object
+* @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
+* @token:      Token of DPRC object
+* @endpoint1:  Endpoint 1 configuration parameters
+* @endpoint2:  Returned endpoint 2 configuration parameters
 * @state:      Returned link state: 1 - link is up, 0 - link is down
 *
 * Return:     '0' on Success; -ENAVAIL if connection does not exist.
 */
 int dprc_get_connection(struct fsl_mc_io               *mc_io,
+                       uint32_t                        cmd_flags,
                        uint16_t                        token,
                        const struct dprc_endpoint      *endpoint1,
                        struct dprc_endpoint            *endpoint2,
index c045f49f227e6a84d85b061a9347d61326d2bfad..8aef55c8dbabfa5047169e89c533a86d0a9dc899 100644 (file)
@@ -29,7 +29,8 @@
 /**
  * struct fsl_mc - Private data of a "fsl,qoriq-mc" platform device
  * @root_mc_bus_dev: MC object device representing the root DPRC
- * @addr_translation_ranges: array of bus to system address translation ranges
+ * @num_translation_ranges: number of entries in addr_translation_ranges
+ * @translation_ranges: array of bus to system address translation ranges
  */
 struct fsl_mc {
        struct fsl_mc_device *root_mc_bus_dev;
@@ -40,14 +41,16 @@ struct fsl_mc {
 /**
  * struct fsl_mc_addr_translation_range - bus to system address translation
  * range
- * @start_mc_addr: Start MC address of the range being translated
- * @end_mc_addr: MC address of the first byte after the range (last MC
- * address of the range is end_mc_addr - 1)
+ * @mc_region_type: Type of MC region for the range being translated
+ * @start_mc_offset: Start MC offset of the range being translated
+ * @end_mc_offset: MC offset of the first byte after the range (last MC
+ * offset of the range is end_mc_offset - 1)
  * @start_phys_addr: system physical address corresponding to start_mc_addr
  */
 struct fsl_mc_addr_translation_range {
-       uint64_t start_mc_addr;
-       uint64_t end_mc_addr;
+       enum dprc_region_type mc_region_type;
+       uint64_t start_mc_offset;
+       uint64_t end_mc_offset;
        phys_addr_t start_phys_addr;
 };