From b4b7ff4b08e691656c9d77c758fc355833128ac0 Mon Sep 17 00:00:00 2001 From: André Fabian Silva Delgado Date: Wed, 20 Jan 2016 14:01:31 -0300 Subject: Linux-libre 4.4-gnu --- drivers/staging/fsl-mc/include/dpbp-cmd.h | 2 +- drivers/staging/fsl-mc/include/dpbp.h | 303 ++++--------- drivers/staging/fsl-mc/include/dpcon-cmd.h | 62 +-- drivers/staging/fsl-mc/include/dpmng.h | 33 +- drivers/staging/fsl-mc/include/dprc.h | 638 ++++++++-------------------- drivers/staging/fsl-mc/include/mc-cmd.h | 52 ++- drivers/staging/fsl-mc/include/mc-private.h | 19 +- drivers/staging/fsl-mc/include/mc-sys.h | 55 ++- drivers/staging/fsl-mc/include/mc.h | 18 +- 9 files changed, 406 insertions(+), 776 deletions(-) (limited to 'drivers/staging/fsl-mc/include') diff --git a/drivers/staging/fsl-mc/include/dpbp-cmd.h b/drivers/staging/fsl-mc/include/dpbp-cmd.h index 1fd70a215..efa9bf33c 100644 --- a/drivers/staging/fsl-mc/include/dpbp-cmd.h +++ b/drivers/staging/fsl-mc/include/dpbp-cmd.h @@ -34,7 +34,7 @@ /* DPBP Version */ #define DPBP_VER_MAJOR 2 -#define DPBP_VER_MINOR 0 +#define DPBP_VER_MINOR 1 /* Command IDs */ #define DPBP_CMDID_CLOSE 0x800 diff --git a/drivers/staging/fsl-mc/include/dpbp.h b/drivers/staging/fsl-mc/include/dpbp.h index 5f3c8e74d..37ed95143 100644 --- a/drivers/staging/fsl-mc/include/dpbp.h +++ b/drivers/staging/fsl-mc/include/dpbp.h @@ -38,258 +38,109 @@ struct fsl_mc_io; -/** - * dpbp_open() - Open a control session for the specified object. - * @mc_io: Pointer to MC portal's I/O object - * @dpbp_id: DPBP unique ID - * @token: Returned token; use in subsequent API calls - * - * This function can be used to open a control session for an - * already created object; an object may have been declared in - * the DPL or by calling the dpbp_create function. - * This function returns a unique authentication token, - * associated with the specific object ID and the specific MC - * portal; this token must be used in all subsequent commands for - * this specific object - * - * Return: '0' on Success; Error code otherwise. - */ -int dpbp_open(struct fsl_mc_io *mc_io, int dpbp_id, uint16_t *token); +int dpbp_open(struct fsl_mc_io *mc_io, + u32 cmd_flags, + int dpbp_id, + u16 *token); -/** - * dpbp_close() - Close the control session of the object - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * - * After this function is called, no further operations are - * allowed on the object without opening a new control session. - * - * Return: '0' on Success; Error code otherwise. - */ -int dpbp_close(struct fsl_mc_io *mc_io, uint16_t token); +int dpbp_close(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token); /** - * struct dpbp_cfg() - Structure representing DPBP configuration + * struct dpbp_cfg - Structure representing DPBP configuration * @options: place holder */ struct dpbp_cfg { - uint32_t options; + u32 options; }; -/** - * dpbp_create() - Create the DPBP object. - * @mc_io: Pointer to MC portal's I/O object - * @cfg: Configuration structure - * @token: Returned token; use in subsequent API calls - * - * Create the DPBP object, allocate required resources and - * perform required initialization. - * - * The object can be created either by declaring it in the - * DPL file, or by calling this function. - * This function returns a unique authentication token, - * associated with the specific object ID and the specific MC - * portal; this token must be used in all subsequent calls to - * this specific object. For objects that are created using the - * DPL file, call dpbp_open function to get an authentication - * token first. - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_create(struct fsl_mc_io *mc_io, + u32 cmd_flags, const struct dpbp_cfg *cfg, - uint16_t *token); + u16 *token); -/** - * dpbp_destroy() - Destroy the DPBP object and release all its resources. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * - * Return: '0' on Success; error code otherwise. - */ -int dpbp_destroy(struct fsl_mc_io *mc_io, uint16_t token); +int dpbp_destroy(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token); -/** - * dpbp_enable() - Enable the DPBP. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * - * Return: '0' on Success; Error code otherwise. - */ -int dpbp_enable(struct fsl_mc_io *mc_io, uint16_t token); +int dpbp_enable(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token); -/** - * dpbp_disable() - Disable the DPBP. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * - * Return: '0' on Success; Error code otherwise. - */ -int dpbp_disable(struct fsl_mc_io *mc_io, uint16_t token); +int dpbp_disable(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token); -/** - * dpbp_is_enabled() - Check if the DPBP is enabled. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @en: Returns '1' if object is enabled; '0' otherwise - * - * Return: '0' on Success; Error code otherwise. - */ -int dpbp_is_enabled(struct fsl_mc_io *mc_io, uint16_t token, int *en); +int dpbp_is_enabled(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token, + int *en); -/** - * dpbp_reset() - Reset the DPBP, returns the object to initial state. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * - * Return: '0' on Success; Error code otherwise. - */ -int dpbp_reset(struct fsl_mc_io *mc_io, uint16_t token); +int dpbp_reset(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token); /** - * dpbp_set_irq() - Set IRQ information for the DPBP to trigger an interrupt. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP 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 + * struct dpbp_irq_cfg - IRQ configuration + * @addr: 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 - * - * Return: '0' on Success; Error code otherwise. */ +struct dpbp_irq_cfg { + u64 addr; + u32 val; + int user_irq_id; +}; + int dpbp_set_irq(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint64_t irq_addr, - uint32_t irq_val, - int user_irq_id); + u32 cmd_flags, + u16 token, + u8 irq_index, + struct dpbp_irq_cfg *irq_cfg); -/** - * dpbp_get_irq() - Get IRQ information from the DPBP. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP 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 - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_get_irq(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, + u32 cmd_flags, + u16 token, + u8 irq_index, int *type, - uint64_t *irq_addr, - uint32_t *irq_val, - int *user_irq_id); + struct dpbp_irq_cfg *irq_cfg); -/** - * dpbp_set_irq_enable() - Set overall interrupt state. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @irq_index: The interrupt index to configure - * @en: Interrupt state - enable = 1, disable = 0 - * - * Allows GPP software to control when interrupts are generated. - * Each interrupt can have up to 32 causes. The enable/disable control's the - * overall interrupt state. if the interrupt is disabled no causes will cause - * an interrupt. - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_set_irq_enable(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint8_t en); + u32 cmd_flags, + u16 token, + u8 irq_index, + u8 en); -/** - * dpbp_get_irq_enable() - Get overall interrupt state - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @irq_index: The interrupt index to configure - * @en: Returned interrupt state - enable = 1, disable = 0 - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_get_irq_enable(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint8_t *en); + u32 cmd_flags, + u16 token, + u8 irq_index, + u8 *en); -/** - * dpbp_set_irq_mask() - Set interrupt mask. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @irq_index: The interrupt index to configure - * @mask: Event mask to trigger interrupt; - * each bit: - * 0 = ignore event - * 1 = consider event for asserting IRQ - * - * Every interrupt can have up to 32 causes and the interrupt model supports - * masking/unmasking each cause independently - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_set_irq_mask(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t mask); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 mask); -/** - * dpbp_get_irq_mask() - Get interrupt mask. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @irq_index: The interrupt index to configure - * @mask: Returned event mask to trigger interrupt - * - * Every interrupt can have up to 32 causes and the interrupt model supports - * masking/unmasking each cause independently - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_get_irq_mask(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t *mask); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 *mask); -/** - * dpbp_get_irq_status() - Get the current status of any pending interrupts. - * - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @irq_index: The interrupt index to configure - * @status: Returned interrupts status - one bit per cause: - * 0 = no interrupt pending - * 1 = interrupt pending - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_get_irq_status(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t *status); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 *status); -/** - * dpbp_clear_irq_status() - Clear a pending interrupt's status - * - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @irq_index: The interrupt index to configure - * @status: Bits to clear (W1C) - one bit per cause: - * 0 = don't change - * 1 = clear status bit - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_clear_irq_status(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t status); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 status); /** * struct dpbp_attr - Structure representing DPBP attributes @@ -306,23 +157,15 @@ struct dpbp_attr { * @minor: DPBP minor version */ struct { - uint16_t major; - uint16_t minor; + u16 major; + u16 minor; } version; - uint16_t bpid; + u16 bpid; }; -/** - * dpbp_get_attributes - Retrieve DPBP attributes. - * - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPBP object - * @attr: Returned object's attributes - * - * Return: '0' on Success; Error code otherwise. - */ int dpbp_get_attributes(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, struct dpbp_attr *attr); /** @} */ diff --git a/drivers/staging/fsl-mc/include/dpcon-cmd.h b/drivers/staging/fsl-mc/include/dpcon-cmd.h index c878d33bf..536b2ef13 100644 --- a/drivers/staging/fsl-mc/include/dpcon-cmd.h +++ b/drivers/staging/fsl-mc/include/dpcon-cmd.h @@ -1,40 +1,40 @@ /* Copyright 2013-2015 Freescale Semiconductor Inc. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the above-listed copyright holders nor the -* names of any contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* -* ALTERNATIVELY, this software may be distributed under the terms of the -* GNU General Public License ("GPL") as published by the Free Software -* Foundation, either version 2 of that License or (at your option) any -* later version. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the above-listed copyright holders nor the + * names of any contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifndef _FSL_DPCON_CMD_H #define _FSL_DPCON_CMD_H /* DPCON Version */ #define DPCON_VER_MAJOR 2 -#define DPCON_VER_MINOR 0 +#define DPCON_VER_MINOR 1 /* Command IDs */ #define DPCON_CMDID_CLOSE 0x800 diff --git a/drivers/staging/fsl-mc/include/dpmng.h b/drivers/staging/fsl-mc/include/dpmng.h index 1b052b830..e5cfd017f 100644 --- a/drivers/staging/fsl-mc/include/dpmng.h +++ b/drivers/staging/fsl-mc/include/dpmng.h @@ -41,11 +41,11 @@ struct fsl_mc_io; /** * Management Complex firmware version information */ -#define MC_VER_MAJOR 6 +#define MC_VER_MAJOR 8 #define MC_VER_MINOR 0 /** - * struct mc_versoin + * struct mc_version * @major: Major version number: incremented on API compatibility changes * @minor: Minor version number: incremented on API additions (that are * backward compatible); reset when major version is incremented @@ -53,28 +53,17 @@ struct fsl_mc_io; * and/or bug fixes that have no impact on API */ struct mc_version { - uint32_t major; - uint32_t minor; - uint32_t revision; + u32 major; + u32 minor; + u32 revision; }; -/** - * mc_get_version() - Retrieves the Management Complex firmware - * version information - * @mc_io: Pointer to opaque I/O object - * @mc_ver_info: Returned version information structure - * - * Return: '0' on Success; Error code otherwise. - */ -int mc_get_version(struct fsl_mc_io *mc_io, struct mc_version *mc_ver_info); +int mc_get_version(struct fsl_mc_io *mc_io, + u32 cmd_flags, + struct mc_version *mc_ver_info); -/** - * dpmng_get_container_id() - Get container ID associated with a given portal. - * @mc_io: Pointer to MC portal's I/O object - * @container_id: Requested container ID - * - * Return: '0' on Success; Error code otherwise. - */ -int dpmng_get_container_id(struct fsl_mc_io *mc_io, int *container_id); +int dpmng_get_container_id(struct fsl_mc_io *mc_io, + u32 cmd_flags, + int *container_id); #endif /* __FSL_DPMNG_H */ diff --git a/drivers/staging/fsl-mc/include/dprc.h b/drivers/staging/fsl-mc/include/dprc.h index f1862a78a..c3152f677 100644 --- a/drivers/staging/fsl-mc/include/dprc.h +++ b/drivers/staging/fsl-mc/include/dprc.h @@ -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 */ @@ -43,7 +45,7 @@ struct fsl_mc_io; * container, in case the ICID is not selected by the user and should be * allocated by the DPRC from the pool of ICIDs. */ -#define DPRC_GET_ICID_FROM_POOL (uint16_t)(~(0)) +#define DPRC_GET_ICID_FROM_POOL (u16)(~(0)) /** * Set this value as the portal_id value in dprc_cfg structure when creating a @@ -52,29 +54,14 @@ struct fsl_mc_io; */ #define DPRC_GET_PORTAL_ID_FROM_POOL (int)(~(0)) -/** - * dprc_open() - Open DPRC object for use - * @mc_io: Pointer to MC portal's I/O object - * @container_id: Container ID to open - * @token: Returned token of DPRC object - * - * Return: '0' on Success; Error code otherwise. - * - * @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, + u32 cmd_flags, + int container_id, + u16 *token); -/** - * dprc_close() - Close the control session of the object - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * - * After this function is called, no further operations are - * allowed on the object without opening a new control session. - * - * 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, + u32 cmd_flags, + u16 token); /** * Container general options @@ -115,6 +102,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,94 +112,49 @@ 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_' options + * @label: Object's label */ struct dprc_cfg { - uint16_t icid; + u16 icid; int portal_id; - uint64_t options; + u64 options; + char label[16]; }; -/** - * dprc_create_container() - Create child container - * @mc_io: Pointer to MC portal's I/O object - * @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 - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_create_container(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, struct dprc_cfg *cfg, int *child_container_id, - uint64_t *child_portal_paddr); + u64 *child_portal_offset); -/** - * dprc_destroy_container() - Destroy child container. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @child_container_id: ID of the container to destroy - * - * This function terminates the child container, so following this call the - * child container ID becomes invalid. - * - * Notes: - * - All resources and objects of the destroyed container are returned to the - * parent container or destroyed if were created be the destroyed container. - * - This function destroy all the child containers of the specified - * container prior to destroying the container itself. - * - * warning: Only the parent container is allowed to destroy a child policy - * Container 0 can't be destroyed - * - * Return: '0' on Success; Error code otherwise. - * - */ int dprc_destroy_container(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int child_container_id); -/** - * dprc_reset_container - Reset child container. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @child_container_id: ID of the container to reset - * - * In case a software context crashes or becomes non-responsive, the parent - * may wish to reset its resources container before the software context is - * restarted. - * - * This routine informs all objects assigned to the child container that the - * container is being reset, so they may perform any cleanup operations that are - * needed. All objects handles that were owned by the child container shall be - * closed. - * - * Note that such request may be submitted even if the child software context - * has not crashed, but the resulting object cleanup operations will not be - * aware of that. - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_reset_container(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 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 @@ -225,147 +170,65 @@ int dprc_reset_container(struct fsl_mc_io *mc_io, #define DPRC_IRQ_EVENT_OBJ_CREATED 0x00000040 /** - * dprc_set_irq() - Set IRQ information for the DPRC to trigger an interrupt. - * @mc_io: Pointer to MC portal's I/O object - * @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 - * - * Return: '0' on Success; Error code otherwise. + * 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 { + u64 paddr; + u32 val; + int user_irq_id; +}; + int dprc_set_irq(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint64_t irq_addr, - uint32_t irq_val, - int user_irq_id); + u32 cmd_flags, + u16 token, + u8 irq_index, + 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 - * @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 - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_irq(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, + u32 cmd_flags, + u16 token, + u8 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 - * @token: Token of DPRC object - * @irq_index: The interrupt index to configure - * @en: Interrupt state - enable = 1, disable = 0 - * - * Allows GPP software to control when interrupts are generated. - * Each interrupt can have up to 32 causes. The enable/disable control's the - * overall interrupt state. if the interrupt is disabled no causes will cause - * an interrupt. - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_set_irq_enable(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint8_t en); + u32 cmd_flags, + u16 token, + u8 irq_index, + u8 en); -/** - * dprc_get_irq_enable() - Get overall interrupt state. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @irq_index: The interrupt index to configure - * @en: Returned interrupt state - enable = 1, disable = 0 - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_irq_enable(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint8_t *en); + u32 cmd_flags, + u16 token, + u8 irq_index, + u8 *en); -/** - * dprc_set_irq_mask() - Set interrupt mask. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @irq_index: The interrupt index to configure - * @mask: event mask to trigger interrupt; - * each bit: - * 0 = ignore event - * 1 = consider event for asserting irq - * - * Every interrupt can have up to 32 causes and the interrupt model supports - * masking/unmasking each cause independently - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_set_irq_mask(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t mask); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 mask); -/** - * dprc_get_irq_mask() - Get interrupt mask. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @irq_index: The interrupt index to configure - * @mask: Returned event mask to trigger interrupt - * - * Every interrupt can have up to 32 causes and the interrupt model supports - * masking/unmasking each cause independently - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_irq_mask(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t *mask); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 *mask); -/** - * dprc_get_irq_status() - Get the current status of any pending interrupts. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @irq_index: The interrupt index to configure - * @status: Returned interrupts status - one bit per cause: - * 0 = no interrupt pending - * 1 = interrupt pending - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_irq_status(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t *status); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 *status); -/** - * dprc_clear_irq_status() - Clear a pending interrupt's status - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @irq_index: The interrupt index to configure - * @status: bits to clear (W1C) - one bit per cause: - * 0 = don't change - * 1 = clear status bit - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_clear_irq_status(struct fsl_mc_io *mc_io, - uint16_t token, - uint8_t irq_index, - uint32_t status); + u32 cmd_flags, + u16 token, + u8 irq_index, + u32 status); /** * struct dprc_attributes - Container attributes @@ -377,81 +240,38 @@ int dprc_clear_irq_status(struct fsl_mc_io *mc_io, */ struct dprc_attributes { int container_id; - uint16_t icid; + u16 icid; int portal_id; - uint64_t options; + u64 options; /** * struct version - DPRC version * @major: DPRC major version * @minor: DPRC minor version */ struct { - uint16_t major; - uint16_t minor; + u16 major; + u16 minor; } version; }; -/** - * dprc_get_attributes() - Obtains container attributes - * @mc_io: Pointer to MC portal's I/O object - * @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, - uint16_t token, + u32 cmd_flags, + u16 token, struct dprc_attributes *attributes); -/** - * 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 - * @token: Token of DPRC object - * @child_container_id: ID of the child container - * @type: Resource/object type - * @quota: Sets the maximum number of resources of the selected type - * that the child container is allowed to allocate from its parent; - * when quota is set to -1, the policy is the same as container's - * general policy. - * - * Allocation policy determines whether or not a container may allocate - * resources from its parent. Each container has a 'global' allocation policy - * that is set when the container is created. - * - * This function sets allocation policy for a specific resource type. - * The default policy for all resource types matches the container's 'global' - * allocation policy. - * - * Return: '0' on Success; Error code otherwise. - * - * @warning Only the parent container is allowed to change a child policy. - */ int dprc_set_res_quota(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int child_container_id, char *type, - uint16_t quota); + u16 quota); -/** - * 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 - * @token: Token of DPRC object - * @child_container_id; ID of the child container - * @type: resource/object type - * @quota: Returnes the maximum number of resources of the selected type - * that the child container is allowed to allocate from the parent; - * when quota is set to -1, the policy is the same as container's - * general policy. - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_res_quota(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int child_container_id, char *type, - uint16_t *quota); + u16 *quota); /* Resource request options */ @@ -492,106 +312,38 @@ int dprc_get_res_quota(struct fsl_mc_io *mc_io, */ struct dprc_res_req { char type[16]; - uint32_t num; - uint32_t options; + u32 num; + u32 options; int id_base_align; }; -/** - * dprc_assign() - Assigns objects or resource to a child container. - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @container_id: ID of the child container - * @res_req: Describes the type and amount of resources to - * assign to the given container - * - * Assignment is usually done by a parent (this DPRC) to one of its child - * containers. - * - * According to the DPRC allocation policy, the assigned resources may be taken - * (allocated) from the container's ancestors, if not enough resources are - * available in the container itself. - * - * The type of assignment depends on the dprc_res_req options, as follows: - * - DPRC_RES_REQ_OPT_EXPLICIT: indicates that assigned resources should have - * the explicit base ID specified at the id_base_align field of res_req. - * - DPRC_RES_REQ_OPT_ALIGNED: indicates that the assigned resources should be - * aligned to the value given at id_base_align field of res_req. - * - DPRC_RES_REQ_OPT_PLUGGED: Relevant only for object assignment, - * and indicates that the object must be set to the plugged state. - * - * A container may use this function with its own ID in order to change a - * object state to plugged or unplugged. - * - * If IRQ information has been set in the child DPRC, it will signal an - * interrupt following every change in its object assignment. - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_assign(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int container_id, struct dprc_res_req *res_req); -/** - * 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 - * @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 - * the child container - * - * Un-assignment of objects can succeed only if the object is not in the - * plugged or opened state. - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_unassign(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int child_container_id, struct dprc_res_req *res_req); -/** - * dprc_get_pool_count() - Get the number of dprc's pools - * @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 - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_pool_count(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 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 - * @token: Token of DPRC object - * @pool_index; Index of the pool to be queried (< pool_count) - * @type: The type of the pool - * - * The pool types retrieved one by one by incrementing - * pool_index up to (not including) the value of pool_count returned - * from dprc_get_pool_count(). dprc_get_pool_count() must - * be called prior to dprc_get_pool(). - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_pool(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int pool_index, char *type); -/** - * dprc_get_obj_count() - Obtains the number of objects in the DPRC - * @mc_io: Pointer to MC portal's I/O object - * @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, + u32 cmd_flags, + u16 token, + int *obj_count); /* Objects Attributes Flags */ @@ -610,50 +362,53 @@ 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]; int id; - uint16_t vendor; - uint16_t ver_major; - uint16_t ver_minor; - uint8_t irq_count; - uint8_t region_count; - uint32_t state; + u16 vendor; + u16 ver_major; + u16 ver_minor; + u8 irq_count; + u8 region_count; + u32 state; + char label[16]; }; -/** - * dprc_get_obj() - Get general information on an object - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @obj_index: Index of the object to be queried (< obj_count) - * @obj_desc: Returns the requested object descriptor - * - * The object descriptors are retrieved one by one by incrementing - * obj_index up to (not including) the value of obj_count returned - * from dprc_get_obj_count(). dprc_get_obj_count() must - * be called prior to dprc_get_obj(). - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_obj(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, int obj_index, struct dprc_obj_desc *obj_desc); -/** - * 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 - * @token: Token of DPRC object - * @type: pool type - * @res_count: Returned number of free resources of the given - * resource type that are assigned to this DPRC - * - * Return: '0' on Success; Error code otherwise. - */ +int dprc_get_obj_desc(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token, + char *obj_type, + int obj_id, + struct dprc_obj_desc *obj_desc); + +int dprc_set_obj_irq(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token, + char *obj_type, + int obj_id, + u8 irq_index, + struct dprc_irq_cfg *irq_cfg); + +int dprc_get_obj_irq(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token, + char *obj_type, + int obj_id, + u8 irq_index, + int *type, + struct dprc_irq_cfg *irq_cfg); + int dprc_get_res_count(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, char *type, int *res_count); @@ -684,115 +439,98 @@ struct dprc_res_ids_range_desc { enum dprc_iter_status iter_status; }; -/** - * dprc_get_res_ids() - Obtains IDs of free resources in the container - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @type: pool type - * @range_desc: range descriptor - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_res_ids(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 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 size; + u32 base_offset; + u32 size; + u32 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 - * @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() - * @region_index: The specific region to query - * @region_desc: Returns the requested region descriptor - * - * Return: '0' on Success; Error code otherwise. - */ int dprc_get_obj_region(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 token, char *obj_type, int obj_id, - uint8_t region_index, + u8 region_index, struct dprc_region_desc *region_desc); +int dprc_set_obj_label(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 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; }; /** - * dprc_connect() - Connect two endpoints to create a network link between them - * @mc_io: Pointer to MC portal's I/O object - * @token: Token of DPRC object - * @endpoint1: Endpoint 1 configuration parameters - * @endpoint2: Endpoint 2 configuration parameters - * - * Return: '0' on Success; Error code otherwise. + * 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 { + u32 committed_rate; + u32 max_rate; +}; + int dprc_connect(struct fsl_mc_io *mc_io, - uint16_t token, + u32 cmd_flags, + u16 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 - * @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, - uint16_t token, + u32 cmd_flags, + u16 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 -* @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, - uint16_t token, + u32 cmd_flags, + u16 token, const struct dprc_endpoint *endpoint1, struct dprc_endpoint *endpoint2, int *state); diff --git a/drivers/staging/fsl-mc/include/mc-cmd.h b/drivers/staging/fsl-mc/include/mc-cmd.h index 32501e020..65277e3de 100644 --- a/drivers/staging/fsl-mc/include/mc-cmd.h +++ b/drivers/staging/fsl-mc/include/mc-cmd.h @@ -35,21 +35,21 @@ #define MC_CMD_NUM_OF_PARAMS 7 #define MAKE_UMASK64(_width) \ - ((uint64_t)((_width) < 64 ? ((uint64_t)1 << (_width)) - 1 : -1)) + ((u64)((_width) < 64 ? ((u64)1 << (_width)) - 1 : -1)) -static inline uint64_t mc_enc(int lsoffset, int width, uint64_t val) +static inline u64 mc_enc(int lsoffset, int width, u64 val) { - return (uint64_t)(((uint64_t)val & MAKE_UMASK64(width)) << lsoffset); + return (u64)(((u64)val & MAKE_UMASK64(width)) << lsoffset); } -static inline uint64_t mc_dec(uint64_t val, int lsoffset, int width) +static inline u64 mc_dec(u64 val, int lsoffset, int width) { - return (uint64_t)((val >> lsoffset) & MAKE_UMASK64(width)); + return (u64)((val >> lsoffset) & MAKE_UMASK64(width)); } struct mc_command { - uint64_t header; - uint64_t params[MC_CMD_NUM_OF_PARAMS]; + u64 header; + u64 params[MC_CMD_NUM_OF_PARAMS]; }; enum mc_cmd_status { @@ -67,24 +67,41 @@ enum mc_cmd_status { MC_CMD_STATUS_INVALID_STATE = 0xC /* Invalid state */ }; +/* + * MC command flags + */ + +/* High priority flag */ +#define MC_CMD_FLAG_PRI 0x00008000 +/* Command completion flag */ +#define MC_CMD_FLAG_INTR_DIS 0x01000000 + +/* + * TODO Remove following two defines after completion of flib 8.0.0 + * integration + */ +#define MC_CMD_PRI_LOW 0 /*!< Low Priority command indication */ +#define MC_CMD_PRI_HIGH 1 /*!< High Priority command indication */ + #define MC_CMD_HDR_CMDID_O 52 /* Command ID field offset */ #define MC_CMD_HDR_CMDID_S 12 /* Command ID field size */ #define MC_CMD_HDR_TOKEN_O 38 /* Token field offset */ #define MC_CMD_HDR_TOKEN_S 10 /* Token field size */ #define MC_CMD_HDR_STATUS_O 16 /* Status field offset */ #define MC_CMD_HDR_STATUS_S 8 /* Status field size*/ -#define MC_CMD_HDR_PRI_O 15 /* Priority field offset */ -#define MC_CMD_HDR_PRI_S 1 /* Priority field size */ +#define MC_CMD_HDR_FLAGS_O 0 /* Flags field offset */ +#define MC_CMD_HDR_FLAGS_S 32 /* Flags field size*/ +#define MC_CMD_HDR_FLAGS_MASK 0xFF00FF00 /* Command flags mask */ #define MC_CMD_HDR_READ_STATUS(_hdr) \ ((enum mc_cmd_status)mc_dec((_hdr), \ MC_CMD_HDR_STATUS_O, MC_CMD_HDR_STATUS_S)) #define MC_CMD_HDR_READ_TOKEN(_hdr) \ - ((uint16_t)mc_dec((_hdr), MC_CMD_HDR_TOKEN_O, MC_CMD_HDR_TOKEN_S)) + ((u16)mc_dec((_hdr), MC_CMD_HDR_TOKEN_O, MC_CMD_HDR_TOKEN_S)) -#define MC_CMD_PRI_LOW 0 /* Low Priority command indication */ -#define MC_CMD_PRI_HIGH 1 /* High Priority command indication */ +#define MC_CMD_HDR_READ_FLAGS(_hdr) \ + ((u32)mc_dec((_hdr), MC_CMD_HDR_FLAGS_O, MC_CMD_HDR_FLAGS_S)) #define MC_EXT_OP(_ext, _param, _offset, _width, _type, _arg) \ ((_ext)[_param] |= mc_enc((_offset), (_width), _arg)) @@ -95,15 +112,16 @@ enum mc_cmd_status { #define MC_RSP_OP(_cmd, _param, _offset, _width, _type, _arg) \ (_arg = (_type)mc_dec(_cmd.params[_param], (_offset), (_width))) -static inline uint64_t mc_encode_cmd_header(uint16_t cmd_id, - uint8_t priority, - uint16_t token) +static inline u64 mc_encode_cmd_header(u16 cmd_id, + u32 cmd_flags, + u16 token) { - uint64_t hdr; + u64 hdr; hdr = mc_enc(MC_CMD_HDR_CMDID_O, MC_CMD_HDR_CMDID_S, cmd_id); + hdr |= mc_enc(MC_CMD_HDR_FLAGS_O, MC_CMD_HDR_FLAGS_S, + (cmd_flags & MC_CMD_HDR_FLAGS_MASK)); hdr |= mc_enc(MC_CMD_HDR_TOKEN_O, MC_CMD_HDR_TOKEN_S, token); - hdr |= mc_enc(MC_CMD_HDR_PRI_O, MC_CMD_HDR_PRI_S, priority); hdr |= mc_enc(MC_CMD_HDR_STATUS_O, MC_CMD_HDR_STATUS_S, MC_CMD_STATUS_READY); diff --git a/drivers/staging/fsl-mc/include/mc-private.h b/drivers/staging/fsl-mc/include/mc-private.h index c045f49f2..c706f7786 100644 --- a/drivers/staging/fsl-mc/include/mc-private.h +++ b/drivers/staging/fsl-mc/include/mc-private.h @@ -29,25 +29,28 @@ /** * 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; - uint8_t num_translation_ranges; + u8 num_translation_ranges; struct fsl_mc_addr_translation_range *translation_ranges; }; /** * 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; + u64 start_mc_offset; + u64 end_mc_offset; phys_addr_t start_phys_addr; }; @@ -100,7 +103,7 @@ int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev); int __init dprc_driver_init(void); -void __exit dprc_driver_exit(void); +void dprc_driver_exit(void); int __init fsl_mc_allocator_driver_init(void); diff --git a/drivers/staging/fsl-mc/include/mc-sys.h b/drivers/staging/fsl-mc/include/mc-sys.h index cb3b5a296..c5038cc77 100644 --- a/drivers/staging/fsl-mc/include/mc-sys.h +++ b/drivers/staging/fsl-mc/include/mc-sys.h @@ -39,6 +39,13 @@ #include #include #include +#include +#include + +/** + * Bit masks for a MC I/O object (struct fsl_mc_io) flags + */ +#define FSL_MC_IO_ATOMIC_CONTEXT_PORTAL 0x0001 struct fsl_mc_resource; struct mc_command; @@ -50,27 +57,57 @@ struct mc_command; * @portal_size: MC command portal size in bytes * @portal_phys_addr: MC command portal physical address * @portal_virt_addr: MC command portal virtual address - * @resource: generic resource associated with the MC portal if - * the MC portal came from a resource pool, or NULL if the MC portal - * is permanently bound to a device (e.g., a DPRC) + * @dpmcp_dev: pointer to the DPMCP device associated with the MC portal. + * + * Fields are only meaningful if the FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is not + * set: + * @mutex: Mutex to serialize mc_send_command() calls that use the same MC + * portal, if the fsl_mc_io object was created with the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag off. mc_send_command() calls for this + * fsl_mc_io object must be made only from non-atomic context. + * + * Fields are only meaningful if the FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is + * set: + * @spinlock: Spinlock to serialize mc_send_command() calls that use the same MC + * portal, if the fsl_mc_io object was created with the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag on. mc_send_command() calls for this + * fsl_mc_io object can be made from atomic or non-atomic context. */ struct fsl_mc_io { struct device *dev; - uint32_t flags; - uint32_t portal_size; + u16 flags; + u16 portal_size; phys_addr_t portal_phys_addr; void __iomem *portal_virt_addr; - struct fsl_mc_resource *resource; + struct fsl_mc_device *dpmcp_dev; + union { + /* + * This field is only meaningful if the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is not set + */ + struct mutex mutex; /* serializes mc_send_command() */ + + /* + * This field is only meaningful if the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is set + */ + spinlock_t spinlock; /* serializes mc_send_command() */ + }; }; int __must_check fsl_create_mc_io(struct device *dev, phys_addr_t mc_portal_phys_addr, - uint32_t mc_portal_size, - struct fsl_mc_resource *resource, - uint32_t flags, struct fsl_mc_io **new_mc_io); + u32 mc_portal_size, + struct fsl_mc_device *dpmcp_dev, + u32 flags, struct fsl_mc_io **new_mc_io); void fsl_destroy_mc_io(struct fsl_mc_io *mc_io); +int fsl_mc_io_set_dpmcp(struct fsl_mc_io *mc_io, + struct fsl_mc_device *dpmcp_dev); + +void fsl_mc_io_unset_dpmcp(struct fsl_mc_io *mc_io); + int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd); #endif /* _FSL_MC_SYS_H */ diff --git a/drivers/staging/fsl-mc/include/mc.h b/drivers/staging/fsl-mc/include/mc.h index fa02ef052..a933291e4 100644 --- a/drivers/staging/fsl-mc/include/mc.h +++ b/drivers/staging/fsl-mc/include/mc.h @@ -59,10 +59,10 @@ struct fsl_mc_driver { * a MC object device driver. The last entry of the table has vendor set to 0x0 */ struct fsl_mc_device_match_id { - uint16_t vendor; + u16 vendor; const char obj_type[16]; - uint32_t ver_major; - uint32_t ver_minor; + u32 ver_major; + u32 ver_minor; }; /** @@ -148,10 +148,10 @@ struct fsl_mc_resource { */ struct fsl_mc_device { struct device dev; - uint64_t dma_mask; - uint16_t flags; - uint16_t icid; - uint16_t mc_handle; + u64 dma_mask; + u16 flags; + u16 icid; + u16 mc_handle; struct fsl_mc_io *mc_io; struct dprc_obj_desc obj_desc; struct resource *regions; @@ -182,8 +182,10 @@ int __must_check __fsl_mc_driver_register(struct fsl_mc_driver *fsl_mc_driver, void fsl_mc_driver_unregister(struct fsl_mc_driver *driver); +bool fsl_mc_bus_exists(void); + int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev, - uint16_t mc_io_flags, + u16 mc_io_flags, struct fsl_mc_io **new_mc_io); void fsl_mc_portal_free(struct fsl_mc_io *mc_io); -- cgit v1.2.3-54-g00ecf