diff options
author | J. German Rivera <German.Rivera@freescale.com> | 2015-09-23 16:11:03 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-09-29 04:23:40 +0200 |
commit | 1ee695fab32e25ff188c98a145cc93674f594923 (patch) | |
tree | 75fb67b71592167d0c4939b895c8a27d94999965 /drivers/staging/fsl-mc | |
parent | e1135cb669fabc5c22286faec9d3ca1f2d9594ec (diff) |
staging: fsl-mc: up-rev dprc binary interface to v4.0
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>
Diffstat (limited to 'drivers/staging/fsl-mc')
-rw-r--r-- | drivers/staging/fsl-mc/bus/dprc-cmd.h | 7 | ||||
-rw-r--r-- | drivers/staging/fsl-mc/bus/dprc-driver.c | 8 | ||||
-rw-r--r-- | drivers/staging/fsl-mc/bus/dprc.c | 426 | ||||
-rw-r--r-- | drivers/staging/fsl-mc/bus/mc-bus.c | 50 | ||||
-rw-r--r-- | drivers/staging/fsl-mc/include/dprc.h | 277 | ||||
-rw-r--r-- | drivers/staging/fsl-mc/include/mc-private.h | 15 |
6 files changed, 630 insertions, 153 deletions
diff --git a/drivers/staging/fsl-mc/bus/dprc-cmd.h b/drivers/staging/fsl-mc/bus/dprc-cmd.h index 09202489c2b2..6552c2034947 100644 --- a/drivers/staging/fsl-mc/bus/dprc-cmd.h +++ b/drivers/staging/fsl-mc/bus/dprc-cmd.h @@ -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 */ @@ -72,12 +72,15 @@ #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 diff --git a/drivers/staging/fsl-mc/bus/dprc-driver.c b/drivers/staging/fsl-mc/bus/dprc-driver.c index 35c06cff1a06..7faf23b4538c 100644 --- a/drivers/staging/fsl-mc/bus/dprc-driver.c +++ b/drivers/staging/fsl-mc/bus/dprc-driver.c @@ -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); diff --git a/drivers/staging/fsl-mc/bus/dprc.c b/drivers/staging/fsl-mc/bus/dprc.c index 19b26e630b62..db1b6bfc5a33 100644 --- a/drivers/staging/fsl-mc/bus/dprc.c +++ b/drivers/staging/fsl-mc/bus/dprc.c @@ -34,13 +34,16 @@ #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); diff --git a/drivers/staging/fsl-mc/bus/mc-bus.c b/drivers/staging/fsl-mc/bus/mc-bus.c index f3718a324662..9812af445bfe 100644 --- a/drivers/staging/fsl-mc/bus/mc-bus.c +++ b/drivers/staging/fsl-mc/bus/mc-bus.c @@ -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_a |