From 7a9a56be67b2ae4c9af943a5696c4fff309cc14f Mon Sep 17 00:00:00 2001 From: "J. German Rivera" Date: Wed, 23 Sep 2015 16:11:01 -0500 Subject: [PATCH] staging: fsl-mc: up-rev dpmcp binary interface to v2.0 Add cmd_flags parameter to all dpbp APIs to comply with the dpmcp 2.0 MC interface. Updated version major number. Pass irq args in struct instead of separate args. Signed-off-by: J. German Rivera Signed-off-by: Greg Kroah-Hartman --- drivers/staging/fsl-mc/bus/dpmcp-cmd.h | 2 +- drivers/staging/fsl-mc/bus/dpmcp.c | 111 ++++++++++++---------- drivers/staging/fsl-mc/bus/dpmcp.h | 83 +++++++++++----- drivers/staging/fsl-mc/bus/mc-allocator.c | 6 +- 4 files changed, 124 insertions(+), 78 deletions(-) diff --git a/drivers/staging/fsl-mc/bus/dpmcp-cmd.h b/drivers/staging/fsl-mc/bus/dpmcp-cmd.h index 57f326b60b76..6cc0fedd802f 100644 --- a/drivers/staging/fsl-mc/bus/dpmcp-cmd.h +++ b/drivers/staging/fsl-mc/bus/dpmcp-cmd.h @@ -34,7 +34,7 @@ /* DPMCP Version */ #define DPMCP_VER_MAJOR 2 -#define DPMCP_VER_MINOR 0 +#define DPMCP_VER_MINOR 1 /* Command IDs */ #define DPMCP_CMDID_CLOSE 0x800 diff --git a/drivers/staging/fsl-mc/bus/dpmcp.c b/drivers/staging/fsl-mc/bus/dpmcp.c index 6b9da5b7fd00..ce5fd315aa40 100644 --- a/drivers/staging/fsl-mc/bus/dpmcp.c +++ b/drivers/staging/fsl-mc/bus/dpmcp.c @@ -34,14 +34,17 @@ #include "dpmcp.h" #include "dpmcp-cmd.h" -int dpmcp_open(struct fsl_mc_io *mc_io, int dpmcp_id, uint16_t *token) +int dpmcp_open(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + int dpmcp_id, + uint16_t *token) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_CMDID_OPEN, - MC_CMD_PRI_LOW, 0); + cmd_flags, 0); cmd.params[0] |= mc_enc(0, 32, dpmcp_id); /* send command to mc*/ @@ -55,28 +58,31 @@ int dpmcp_open(struct fsl_mc_io *mc_io, int dpmcp_id, uint16_t *token) return err; } -int dpmcp_close(struct fsl_mc_io *mc_io, uint16_t token) +int dpmcp_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(DPMCP_CMDID_CLOSE, MC_CMD_PRI_HIGH, - token); + cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CLOSE, + cmd_flags, token); /* send command to mc*/ return mc_send_command(mc_io, &cmd); } int dpmcp_create(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, const struct dpmcp_cfg *cfg, - uint16_t *token) + uint16_t *token) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CREATE, - MC_CMD_PRI_LOW, 0); + cmd_flags, 0); cmd.params[0] |= mc_enc(0, 32, cfg->portal_id); /* send command to mc*/ @@ -90,65 +96,67 @@ int dpmcp_create(struct fsl_mc_io *mc_io, return 0; } -int dpmcp_destroy(struct fsl_mc_io *mc_io, uint16_t token) +int dpmcp_destroy(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(DPMCP_CMDID_DESTROY, - MC_CMD_PRI_LOW, token); + cmd_flags, token); /* send command to mc*/ return mc_send_command(mc_io, &cmd); } -int dpmcp_reset(struct fsl_mc_io *mc_io, uint16_t token) +int dpmcp_reset(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(DPMCP_CMDID_RESET, - MC_CMD_PRI_LOW, token); + cmd_flags, token); /* send command to mc*/ return mc_send_command(mc_io, &cmd); } int dpmcp_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) + uint8_t irq_index, + struct dpmcp_irq_cfg *irq_cfg) { struct mc_command cmd = { 0 }; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_CMDID_SET_IRQ, - MC_CMD_PRI_LOW, token); + cmd_flags, token); cmd.params[0] |= mc_enc(0, 8, irq_index); - cmd.params[0] |= mc_enc(32, 32, irq_val); - cmd.params[1] |= mc_enc(0, 64, irq_addr); - cmd.params[2] |= mc_enc(0, 32, user_irq_id); + cmd.params[0] |= mc_enc(32, 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 dpmcp_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) + uint8_t irq_index, + int *type, + struct dpmcp_irq_cfg *irq_cfg) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_IRQ, - MC_CMD_PRI_LOW, token); + cmd_flags, token); cmd.params[0] |= mc_enc(32, 8, irq_index); /* send command to mc*/ @@ -157,23 +165,24 @@ int dpmcp_get_irq(struct fsl_mc_io *mc_io, return err; /* retrieve response parameters */ - *irq_val = (uint32_t)mc_dec(cmd.params[0], 0, 32); - *irq_addr = (uint64_t)mc_dec(cmd.params[1], 0, 64); - *user_irq_id = (int)mc_dec(cmd.params[2], 0, 32); + 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; } int dpmcp_set_irq_enable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - uint8_t irq_index, - uint8_t en) + uint8_t irq_index, + uint8_t en) { struct mc_command cmd = { 0 }; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_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); @@ -182,16 +191,17 @@ int dpmcp_set_irq_enable(struct fsl_mc_io *mc_io, } int dpmcp_get_irq_enable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - uint8_t irq_index, - uint8_t *en) + uint8_t irq_index, + uint8_t *en) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_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*/ @@ -205,15 +215,16 @@ int dpmcp_get_irq_enable(struct fsl_mc_io *mc_io, } int dpmcp_set_irq_mask(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - uint8_t irq_index, - uint32_t mask) + uint8_t irq_index, + uint32_t mask) { struct mc_command cmd = { 0 }; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_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); @@ -222,16 +233,17 @@ int dpmcp_set_irq_mask(struct fsl_mc_io *mc_io, } int dpmcp_get_irq_mask(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - uint8_t irq_index, - uint32_t *mask) + uint8_t irq_index, + uint32_t *mask) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_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*/ @@ -245,16 +257,17 @@ int dpmcp_get_irq_mask(struct fsl_mc_io *mc_io, } int dpmcp_get_irq_status(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - uint8_t irq_index, - uint32_t *status) + uint8_t irq_index, + uint32_t *status) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_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*/ @@ -268,15 +281,16 @@ int dpmcp_get_irq_status(struct fsl_mc_io *mc_io, } int dpmcp_clear_irq_status(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - uint8_t irq_index, - uint32_t status) + uint8_t irq_index, + uint32_t status) { struct mc_command cmd = { 0 }; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_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); @@ -285,15 +299,16 @@ int dpmcp_clear_irq_status(struct fsl_mc_io *mc_io, } int dpmcp_get_attributes(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, - struct dpmcp_attr *attr) + struct dpmcp_attr *attr) { struct mc_command cmd = { 0 }; int err; /* prepare command */ cmd.header = mc_encode_cmd_header(DPMCP_CMDID_GET_ATTR, - MC_CMD_PRI_LOW, token); + cmd_flags, token); /* send command to mc*/ err = mc_send_command(mc_io, &cmd); diff --git a/drivers/staging/fsl-mc/bus/dpmcp.h b/drivers/staging/fsl-mc/bus/dpmcp.h index 5e7c21952ce5..19dadd8246e4 100644 --- a/drivers/staging/fsl-mc/bus/dpmcp.h +++ b/drivers/staging/fsl-mc/bus/dpmcp.h @@ -41,6 +41,7 @@ struct fsl_mc_io; /** * dpmcp_open() - Open a control session for the specified object. * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' * @dpmcp_id: DPMCP unique ID * @token: Returned token; use in subsequent API calls * @@ -54,7 +55,10 @@ struct fsl_mc_io; * * Return: '0' on Success; Error code otherwise. */ -int dpmcp_open(struct fsl_mc_io *mc_io, int dpmcp_id, uint16_t *token); +int dpmcp_open(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + int dpmcp_id, + uint16_t *token); /* Get portal ID from pool */ #define DPMCP_GET_PORTAL_ID_FROM_POOL (-1) @@ -62,6 +66,7 @@ int dpmcp_open(struct fsl_mc_io *mc_io, int dpmcp_id, uint16_t *token); /** * dpmcp_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 DPMCP object * * After this function is called, no further operations are @@ -69,10 +74,12 @@ int dpmcp_open(struct fsl_mc_io *mc_io, int dpmcp_id, uint16_t *token); * * Return: '0' on Success; Error code otherwise. */ -int dpmcp_close(struct fsl_mc_io *mc_io, uint16_t token); +int dpmcp_close(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); /** - * struct dpmcp_cfg() - Structure representing DPMCP configuration + * struct dpmcp_cfg - Structure representing DPMCP configuration * @portal_id: Portal ID; 'DPMCP_GET_PORTAL_ID_FROM_POOL' to get the portal ID * from pool */ @@ -83,6 +90,7 @@ struct dpmcp_cfg { /** * dpmcp_create() - Create the DPMCP object. * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' * @cfg: Configuration structure * @token: Returned token; use in subsequent API calls * @@ -101,81 +109,91 @@ struct dpmcp_cfg { * Return: '0' on Success; Error code otherwise. */ int dpmcp_create(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, const struct dpmcp_cfg *cfg, uint16_t *token); /** * dpmcp_destroy() - Destroy the DPMCP object and release all its resources. * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' * @token: Token of DPMCP object * * Return: '0' on Success; error code otherwise. */ -int dpmcp_destroy(struct fsl_mc_io *mc_io, uint16_t token); +int dpmcp_destroy(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); /** * dpmcp_reset() - Reset the DPMCP, returns the object to initial 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 DPMCP object * * Return: '0' on Success; Error code otherwise. */ -int dpmcp_reset(struct fsl_mc_io *mc_io, uint16_t token); +int dpmcp_reset(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token); /* IRQ */ -/*! - * @name dpmcp IRQ Index and Events - */ +/* IRQ Index */ #define DPMCP_IRQ_INDEX 0 -/*!< Irq index */ +/* irq event - Indicates that the link state changed */ #define DPMCP_IRQ_EVENT_CMD_DONE 0x00000001 -/*!< irq event - Indicates that the link state changed */ -/* @} */ + +/** + * struct dpmcp_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 dpmcp_irq_cfg { + uint64_t paddr; + uint32_t val; + int user_irq_id; +}; /** * dpmcp_set_irq() - Set IRQ information for the DPMCP 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 DPMCP 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: A user defined number associated with this IRQ + * @irq_cfg: IRQ configuration * * Return: '0' on Success; Error code otherwise. */ int dpmcp_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 dpmcp_irq_cfg *irq_cfg); /** * dpmcp_get_irq() - Get IRQ information from the DPMCP. * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' * @token: Token of DPMCP object * @irq_index: The interrupt index to configure * @type: 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 (both irq_addr and irq_val are valid) + * @irq_cfg: IRQ attributes * * Return: '0' on Success; Error code otherwise. */ int dpmcp_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 dpmcp_irq_cfg *irq_cfg); /** * dpmcp_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 DPMCP object * @irq_index: The interrupt index to configure * @en: Interrupt state - enable = 1, disable = 0 @@ -188,6 +206,7 @@ int dpmcp_get_irq(struct fsl_mc_io *mc_io, * Return: '0' on Success; Error code otherwise. */ int dpmcp_set_irq_enable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, uint8_t irq_index, uint8_t en); @@ -195,6 +214,7 @@ int dpmcp_set_irq_enable(struct fsl_mc_io *mc_io, /** * dpmcp_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 DPMCP object * @irq_index: The interrupt index to configure * @en: Returned interrupt state - enable = 1, disable = 0 @@ -202,6 +222,7 @@ int dpmcp_set_irq_enable(struct fsl_mc_io *mc_io, * Return: '0' on Success; Error code otherwise. */ int dpmcp_get_irq_enable(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, uint8_t irq_index, uint8_t *en); @@ -209,6 +230,7 @@ int dpmcp_get_irq_enable(struct fsl_mc_io *mc_io, /** * dpmcp_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 DPMCP object * @irq_index: The interrupt index to configure * @mask: Event mask to trigger interrupt; @@ -222,6 +244,7 @@ int dpmcp_get_irq_enable(struct fsl_mc_io *mc_io, * Return: '0' on Success; Error code otherwise. */ int dpmcp_set_irq_mask(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, uint8_t irq_index, uint32_t mask); @@ -229,6 +252,7 @@ int dpmcp_set_irq_mask(struct fsl_mc_io *mc_io, /** * dpmcp_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 DPMCP object * @irq_index: The interrupt index to configure * @mask: Returned event mask to trigger interrupt @@ -239,6 +263,7 @@ int dpmcp_set_irq_mask(struct fsl_mc_io *mc_io, * Return: '0' on Success; Error code otherwise. */ int dpmcp_get_irq_mask(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, uint8_t irq_index, uint32_t *mask); @@ -247,6 +272,7 @@ int dpmcp_get_irq_mask(struct fsl_mc_io *mc_io, * dpmcp_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 DPMCP object * @irq_index: The interrupt index to configure * @status: Returned interrupts status - one bit per cause: @@ -256,6 +282,7 @@ int dpmcp_get_irq_mask(struct fsl_mc_io *mc_io, * Return: '0' on Success; Error code otherwise. */ int dpmcp_get_irq_status(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, uint8_t irq_index, uint32_t *status); @@ -264,6 +291,7 @@ int dpmcp_get_irq_status(struct fsl_mc_io *mc_io, * dpmcp_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 DPMCP object * @irq_index: The interrupt index to configure * @status: Bits to clear (W1C) - one bit per cause: @@ -273,6 +301,7 @@ int dpmcp_get_irq_status(struct fsl_mc_io *mc_io, * Return: '0' on Success; Error code otherwise. */ int dpmcp_clear_irq_status(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, uint8_t irq_index, uint32_t status); @@ -299,12 +328,14 @@ struct dpmcp_attr { * dpmcp_get_attributes - Retrieve DPMCP 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 DPMCP object * @attr: Returned object's attributes * * Return: '0' on Success; Error code otherwise. */ int dpmcp_get_attributes(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, uint16_t token, struct dpmcp_attr *attr); diff --git a/drivers/staging/fsl-mc/bus/mc-allocator.c b/drivers/staging/fsl-mc/bus/mc-allocator.c index e36235ddbe3e..376ce8089d8a 100644 --- a/drivers/staging/fsl-mc/bus/mc-allocator.c +++ b/drivers/staging/fsl-mc/bus/mc-allocator.c @@ -373,19 +373,19 @@ int fsl_mc_portal_reset(struct fsl_mc_io *mc_io) if (WARN_ON(!mc_dev)) return -EINVAL; - error = dpmcp_open(mc_io, mc_dev->obj_desc.id, &token); + error = dpmcp_open(mc_io, 0, mc_dev->obj_desc.id, &token); if (error < 0) { dev_err(&mc_dev->dev, "dpmcp_open() failed: %d\n", error); return error; } - error = dpmcp_reset(mc_io, token); + error = dpmcp_reset(mc_io, 0, token); if (error < 0) { dev_err(&mc_dev->dev, "dpmcp_reset() failed: %d\n", error); return error; } - error = dpmcp_close(mc_io, token); + error = dpmcp_close(mc_io, 0, token); if (error < 0) { dev_err(&mc_dev->dev, "dpmcp_close() failed: %d\n", error); return error; -- 2.39.5