2018-01-17 18:36:44 +02:00
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2016-10-26 11:20:28 -05:00
/*
* Copyright 2013 - 2016 Freescale Semiconductor Inc .
2020-09-29 11:54:33 +03:00
* Copyright 2020 NXP
2016-09-30 15:01:21 +01:00
*
*/
2017-06-27 17:41:32 +03:00
# include <linux/kernel.h>
2018-02-05 08:07:42 -06:00
# include <linux/fsl/mc.h>
2018-01-16 15:19:04 +02:00
# include "fsl-mc-private.h"
2015-03-05 19:29:09 -06:00
2020-09-29 11:54:33 +03:00
/*
* cache the DPRC version to reduce the number of commands
* towards the mc firmware
*/
static u16 dprc_major_ver ;
static u16 dprc_minor_ver ;
2015-09-24 14:26:54 -05:00
/**
* dprc_open ( ) - Open DPRC object for use
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ container_id : Container ID to open
* @ token : Returned token of DPRC object
*
* Return : ' 0 ' on Success ; Error code otherwise .
*
* @ warning Required before any operation on the object .
*/
2015-09-23 16:11:03 -05:00
int dprc_open ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
2015-09-23 16:11:03 -05:00
int container_id ,
2015-09-25 11:21:01 -05:00
u16 * token )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_open * cmd_params ;
2015-03-05 19:29:09 -06:00
int err ;
/* prepare command */
2015-09-23 16:11:03 -05:00
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_OPEN , cmd_flags ,
2015-03-05 19:29:09 -06:00
0 ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_open * ) cmd . params ;
cmd_params - > container_id = cpu_to_le32 ( container_id ) ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
2016-06-22 16:40:52 -05:00
* token = mc_cmd_hdr_read_token ( & cmd ) ;
2015-03-05 19:29:09 -06:00
return 0 ;
}
2017-11-17 15:38:29 +02:00
EXPORT_SYMBOL_GPL ( dprc_open ) ;
2015-03-05 19:29:09 -06:00
2015-09-24 14:26:54 -05:00
/**
* dprc_close ( ) - Close the control session of the object
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
*
* After this function is called , no further operations are
* allowed on the object without opening a new control session .
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-09-23 16:11:03 -05:00
int dprc_close ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2015-03-05 19:29:09 -06:00
/* prepare command */
2015-09-23 16:11:03 -05:00
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_CLOSE , cmd_flags ,
2015-03-05 19:29:09 -06:00
token ) ;
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
2017-11-17 15:38:29 +02:00
EXPORT_SYMBOL_GPL ( dprc_close ) ;
2015-03-05 19:29:09 -06:00
2020-09-29 11:54:34 +03:00
/**
* dprc_reset_container - Reset child container .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ child_container_id : ID of the container to reset
* @ options : 32 bit options :
* - 0 ( no bits set ) - all the objects inside the container are
* reset . The child containers are entered recursively and the
* objects reset . All the objects ( including the child containers )
* are closed .
* - bit 0 set - all the objects inside the container are reset .
* However the child containers are not entered recursively .
* This option is supported for API versions > = 6.5
* 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 ,
u32 cmd_flags ,
u16 token ,
int child_container_id ,
u32 options )
{
struct fsl_mc_command cmd = { 0 } ;
struct dprc_cmd_reset_container * cmd_params ;
u32 cmdid = DPRC_CMDID_RESET_CONT ;
int err ;
/*
* If the DPRC object version was not yet cached , cache it now .
* Otherwise use the already cached value .
*/
if ( ! dprc_major_ver & & ! dprc_minor_ver ) {
err = dprc_get_api_version ( mc_io , 0 ,
& dprc_major_ver ,
& dprc_minor_ver ) ;
if ( err )
return err ;
}
/*
* MC API 6.5 introduced a new field in the command used to pass
* some flags .
* Bit 0 indicates that the child containers are not recursively reset .
*/
if ( dprc_major_ver > 6 | | ( dprc_major_ver = = 6 & & dprc_minor_ver > = 5 ) )
cmdid = DPRC_CMDID_RESET_CONT_V2 ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( cmdid , cmd_flags , token ) ;
cmd_params = ( struct dprc_cmd_reset_container * ) cmd . params ;
cmd_params - > child_container_id = cpu_to_le32 ( child_container_id ) ;
cmd_params - > options = cpu_to_le32 ( options ) ;
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
EXPORT_SYMBOL_GPL ( dprc_reset_container ) ;
2015-09-24 14:26:54 -05:00
/**
* dprc_set_irq ( ) - Set IRQ information for the DPRC to trigger an interrupt .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ irq_index : Identifies the interrupt index to configure
* @ irq_cfg : IRQ configuration
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-03-05 19:29:09 -06:00
int dprc_set_irq ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
u8 irq_index ,
2015-09-23 16:11:03 -05:00
struct dprc_irq_cfg * irq_cfg )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_set_irq * cmd_params ;
2015-03-05 19:29:09 -06:00
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_SET_IRQ ,
2015-09-23 16:11:03 -05:00
cmd_flags ,
2015-03-05 19:29:09 -06:00
token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_set_irq * ) cmd . params ;
cmd_params - > irq_val = cpu_to_le32 ( irq_cfg - > val ) ;
cmd_params - > irq_index = irq_index ;
cmd_params - > irq_addr = cpu_to_le64 ( irq_cfg - > paddr ) ;
cmd_params - > irq_num = cpu_to_le32 ( irq_cfg - > irq_num ) ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
2015-09-24 14:26:54 -05:00
/**
* dprc_set_irq_enable ( ) - Set overall interrupt state .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ irq_index : The interrupt index to configure
* @ en : Interrupt state - enable = 1 , disable = 0
*
* 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 .
*/
2015-03-05 19:29:09 -06:00
int dprc_set_irq_enable ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
u8 irq_index ,
u8 en )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_set_irq_enable * cmd_params ;
2015-03-05 19:29:09 -06:00
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_SET_IRQ_ENABLE ,
2015-09-23 16:11:03 -05:00
cmd_flags , token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_set_irq_enable * ) cmd . params ;
cmd_params - > enable = en & DPRC_ENABLE ;
cmd_params - > irq_index = irq_index ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
2015-09-24 14:26:54 -05:00
/**
* dprc_set_irq_mask ( ) - Set interrupt mask .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ irq_index : The interrupt index to configure
* @ mask : event mask to trigger interrupt ;
* 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 .
*/
2015-03-05 19:29:09 -06:00
int dprc_set_irq_mask ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
u8 irq_index ,
u32 mask )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_set_irq_mask * cmd_params ;
2015-03-05 19:29:09 -06:00
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_SET_IRQ_MASK ,
2015-09-23 16:11:03 -05:00
cmd_flags , token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_set_irq_mask * ) cmd . params ;
cmd_params - > mask = cpu_to_le32 ( mask ) ;
cmd_params - > irq_index = irq_index ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
2015-09-24 14:26:54 -05:00
/**
* dprc_get_irq_status ( ) - Get the current status of any pending interrupts .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ irq_index : The interrupt index to configure
* @ status : Returned interrupts status - one bit per cause :
* 0 = no interrupt pending
* 1 = interrupt pending
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-03-05 19:29:09 -06:00
int dprc_get_irq_status ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
u8 irq_index ,
u32 * status )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_get_irq_status * cmd_params ;
struct dprc_rsp_get_irq_status * rsp_params ;
2015-03-05 19:29:09 -06:00
int err ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_IRQ_STATUS ,
2015-09-23 16:11:03 -05:00
cmd_flags , token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_get_irq_status * ) cmd . params ;
cmd_params - > status = cpu_to_le32 ( * status ) ;
cmd_params - > irq_index = irq_index ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
2016-06-22 16:40:52 -05:00
rsp_params = ( struct dprc_rsp_get_irq_status * ) cmd . params ;
* status = le32_to_cpu ( rsp_params - > status ) ;
2015-03-05 19:29:09 -06:00
return 0 ;
}
2015-09-24 14:26:54 -05:00
/**
* dprc_clear_irq_status ( ) - Clear a pending interrupt ' s status
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ irq_index : The interrupt index to configure
* @ status : bits to clear ( W1C ) - one bit per cause :
* 0 = don ' t change
* 1 = clear status bit
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-03-05 19:29:09 -06:00
int dprc_clear_irq_status ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
u8 irq_index ,
u32 status )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_clear_irq_status * cmd_params ;
2015-03-05 19:29:09 -06:00
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_CLEAR_IRQ_STATUS ,
2015-09-23 16:11:03 -05:00
cmd_flags , token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_clear_irq_status * ) cmd . params ;
cmd_params - > status = cpu_to_le32 ( status ) ;
cmd_params - > irq_index = irq_index ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
2015-09-24 14:26:54 -05:00
/**
* dprc_get_attributes ( ) - Obtains container attributes
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
2021-06-17 12:04:56 +01:00
* @ attr : Returned container attributes
2015-09-24 14:26:54 -05:00
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-03-05 19:29:09 -06:00
int dprc_get_attributes ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
2015-03-05 19:29:09 -06:00
struct dprc_attributes * attr )
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_rsp_get_attributes * rsp_params ;
2015-03-05 19:29:09 -06:00
int err ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_ATTR ,
2015-09-23 16:11:03 -05:00
cmd_flags ,
2015-03-05 19:29:09 -06:00
token ) ;
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
2016-06-22 16:40:52 -05:00
rsp_params = ( struct dprc_rsp_get_attributes * ) cmd . params ;
attr - > container_id = le32_to_cpu ( rsp_params - > container_id ) ;
2020-09-29 11:54:40 +03:00
attr - > icid = le32_to_cpu ( rsp_params - > icid ) ;
2016-06-22 16:40:52 -05:00
attr - > options = le32_to_cpu ( rsp_params - > options ) ;
attr - > portal_id = le32_to_cpu ( rsp_params - > portal_id ) ;
2015-03-05 19:29:09 -06:00
return 0 ;
}
2015-09-24 14:26:54 -05:00
/**
* dprc_get_obj_count ( ) - Obtains the number of objects in the DPRC
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ obj_count : Number of objects assigned to the DPRC
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-09-23 16:11:03 -05:00
int dprc_get_obj_count ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
2015-09-23 16:11:03 -05:00
int * obj_count )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_rsp_get_obj_count * rsp_params ;
2015-03-05 19:29:09 -06:00
int err ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_OBJ_COUNT ,
2015-09-23 16:11:03 -05:00
cmd_flags , token ) ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
2016-06-22 16:40:52 -05:00
rsp_params = ( struct dprc_rsp_get_obj_count * ) cmd . params ;
* obj_count = le32_to_cpu ( rsp_params - > obj_count ) ;
2015-03-05 19:29:09 -06:00
return 0 ;
}
2017-11-17 15:38:29 +02:00
EXPORT_SYMBOL_GPL ( dprc_get_obj_count ) ;
2015-03-05 19:29:09 -06:00
2015-09-24 14:26:54 -05:00
/**
* dprc_get_obj ( ) - Get general information on an object
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ obj_index : Index of the object to be queried ( < obj_count )
* @ obj_desc : Returns the requested object descriptor
*
* 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 .
*/
2015-03-05 19:29:09 -06:00
int dprc_get_obj ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
2015-03-05 19:29:09 -06:00
int obj_index ,
2017-06-27 17:41:24 +03:00
struct fsl_mc_obj_desc * obj_desc )
2015-03-05 19:29:09 -06:00
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_get_obj * cmd_params ;
struct dprc_rsp_get_obj * rsp_params ;
2015-03-05 19:29:09 -06:00
int err ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_OBJ ,
2015-09-23 16:11:03 -05:00
cmd_flags ,
2015-03-05 19:29:09 -06:00
token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_get_obj * ) cmd . params ;
cmd_params - > obj_index = cpu_to_le32 ( obj_index ) ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
2016-06-22 16:40:52 -05:00
rsp_params = ( struct dprc_rsp_get_obj * ) cmd . params ;
obj_desc - > id = le32_to_cpu ( rsp_params - > id ) ;
obj_desc - > vendor = le16_to_cpu ( rsp_params - > vendor ) ;
obj_desc - > irq_count = rsp_params - > irq_count ;
obj_desc - > region_count = rsp_params - > region_count ;
obj_desc - > state = le32_to_cpu ( rsp_params - > state ) ;
obj_desc - > ver_major = le16_to_cpu ( rsp_params - > version_major ) ;
obj_desc - > ver_minor = le16_to_cpu ( rsp_params - > version_minor ) ;
obj_desc - > flags = le16_to_cpu ( rsp_params - > flags ) ;
strncpy ( obj_desc - > type , rsp_params - > type , 16 ) ;
2015-03-05 19:29:09 -06:00
obj_desc - > type [ 15 ] = ' \0 ' ;
2016-06-22 16:40:52 -05:00
strncpy ( obj_desc - > label , rsp_params - > label , 16 ) ;
2015-09-23 16:11:03 -05:00
obj_desc - > label [ 15 ] = ' \0 ' ;
2015-03-05 19:29:09 -06:00
return 0 ;
}
2017-11-17 15:38:29 +02:00
EXPORT_SYMBOL_GPL ( dprc_get_obj ) ;
2015-03-05 19:29:09 -06:00
2015-09-24 14:26:54 -05:00
/**
* dprc_set_obj_irq ( ) - Set IRQ information for object to trigger an interrupt .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ obj_type : Type of the object to set its IRQ
* @ obj_id : ID of the object to set its IRQ
* @ irq_index : The interrupt index to configure
* @ irq_cfg : IRQ configuration
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
2015-09-23 16:11:03 -05:00
int dprc_set_obj_irq ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
2015-09-23 16:11:03 -05:00
char * obj_type ,
int obj_id ,
2015-09-25 11:21:01 -05:00
u8 irq_index ,
2015-09-23 16:11:03 -05:00
struct dprc_irq_cfg * irq_cfg )
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_set_obj_irq * cmd_params ;
2015-09-23 16:11:03 -05:00
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_SET_OBJ_IRQ ,
cmd_flags ,
token ) ;
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_set_obj_irq * ) cmd . params ;
cmd_params - > irq_val = cpu_to_le32 ( irq_cfg - > val ) ;
cmd_params - > irq_index = irq_index ;
cmd_params - > irq_addr = cpu_to_le64 ( irq_cfg - > paddr ) ;
cmd_params - > irq_num = cpu_to_le32 ( irq_cfg - > irq_num ) ;
cmd_params - > obj_id = cpu_to_le32 ( obj_id ) ;
strncpy ( cmd_params - > obj_type , obj_type , 16 ) ;
cmd_params - > obj_type [ 15 ] = ' \0 ' ;
2015-09-23 16:11:03 -05:00
/* send command to mc*/
return mc_send_command ( mc_io , & cmd ) ;
}
2017-11-17 15:38:29 +02:00
EXPORT_SYMBOL_GPL ( dprc_set_obj_irq ) ;
2015-09-23 16:11:03 -05:00
2015-09-24 14:26:54 -05:00
/**
* dprc_get_obj_region ( ) - Get region information for a specified object .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
2021-06-17 12:04:56 +01:00
* @ obj_type : Object type as returned in dprc_get_obj ( )
2015-09-24 14:26:54 -05:00
* @ 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 .
*/
2015-03-05 19:29:09 -06:00
int dprc_get_obj_region ( struct fsl_mc_io * mc_io ,
2015-09-25 11:21:01 -05:00
u32 cmd_flags ,
u16 token ,
2015-03-05 19:29:09 -06:00
char * obj_type ,
int obj_id ,
2015-09-25 11:21:01 -05:00
u8 region_index ,
2015-03-05 19:29:09 -06:00
struct dprc_region_desc * region_desc )
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-06-22 16:40:52 -05:00
struct dprc_cmd_get_obj_region * cmd_params ;
struct dprc_rsp_get_obj_region * rsp_params ;
2015-03-05 19:29:09 -06:00
int err ;
2020-09-29 11:54:33 +03:00
/*
* If the DPRC object version was not yet cached , cache it now .
* Otherwise use the already cached value .
*/
if ( ! dprc_major_ver & & ! dprc_minor_ver ) {
err = dprc_get_api_version ( mc_io , 0 ,
& dprc_major_ver ,
& dprc_minor_ver ) ;
if ( err )
return err ;
}
2019-04-05 14:41:11 +00:00
2020-09-29 11:54:41 +03:00
if ( dprc_major_ver > 6 | | ( dprc_major_ver = = 6 & & dprc_minor_ver > = 6 ) ) {
/*
* MC API version 6.6 changed the size of the MC portals and software
* portals to 64 K ( as implemented by hardware ) . If older API is in use the
* size reported is less ( 64 bytes for mc portals and 4 K for software
* portals ) .
*/
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_OBJ_REG_V3 ,
cmd_flags , token ) ;
} else if ( dprc_major_ver = = 6 & & dprc_minor_ver > = 3 ) {
/*
* MC API version 6.3 introduced a new field to the region
* descriptor : base_address . If the older API is in use then the base
* address is set to zero to indicate it needs to be obtained elsewhere
* ( typically the device tree ) .
*/
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_OBJ_REG_V2 ,
cmd_flags , token ) ;
} else {
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_OBJ_REG ,
cmd_flags , token ) ;
}
2019-04-05 14:41:11 +00:00
2016-06-22 16:40:52 -05:00
cmd_params = ( struct dprc_cmd_get_obj_region * ) cmd . params ;
cmd_params - > obj_id = cpu_to_le32 ( obj_id ) ;
cmd_params - > region_index = region_index ;
strncpy ( cmd_params - > obj_type , obj_type , 16 ) ;
cmd_params - > obj_type [ 15 ] = ' \0 ' ;
2015-03-05 19:29:09 -06:00
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
2016-06-22 16:40:52 -05:00
rsp_params = ( struct dprc_rsp_get_obj_region * ) cmd . params ;
2019-04-05 14:41:11 +00:00
region_desc - > base_offset = le64_to_cpu ( rsp_params - > base_offset ) ;
2016-06-22 16:40:52 -05:00
region_desc - > size = le32_to_cpu ( rsp_params - > size ) ;
2020-11-24 13:12:00 +02:00
region_desc - > type = rsp_params - > type ;
region_desc - > flags = le32_to_cpu ( rsp_params - > flags ) ;
2020-09-29 11:54:33 +03:00
if ( dprc_major_ver > 6 | | ( dprc_major_ver = = 6 & & dprc_minor_ver > = 3 ) )
2019-04-05 14:41:11 +00:00
region_desc - > base_address = le64_to_cpu ( rsp_params - > base_addr ) ;
else
region_desc - > base_address = 0 ;
2015-03-05 19:29:09 -06:00
return 0 ;
}
2017-11-17 15:38:29 +02:00
EXPORT_SYMBOL_GPL ( dprc_get_obj_region ) ;
2015-03-05 19:29:09 -06:00
2016-10-26 11:20:34 -05:00
/**
* dprc_get_api_version - Get Data Path Resource Container API version
* @ mc_io : Pointer to Mc portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ major_ver : Major version of Data Path Resource Container API
* @ minor_ver : Minor version of Data Path Resource Container API
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
int dprc_get_api_version ( struct fsl_mc_io * mc_io ,
u32 cmd_flags ,
u16 * major_ver ,
u16 * minor_ver )
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-10-26 11:20:34 -05:00
int err ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_API_VERSION ,
cmd_flags , 0 ) ;
/* send command to mc */
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
mc_cmd_read_api_version ( & cmd , major_ver , minor_ver ) ;
return 0 ;
}
/**
* dprc_get_container_id - Get container ID associated with a given portal .
* @ mc_io : Pointer to Mc portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ container_id : Requested container id
*
* Return : ' 0 ' on Success ; Error code otherwise .
*/
int dprc_get_container_id ( struct fsl_mc_io * mc_io ,
u32 cmd_flags ,
int * container_id )
{
2018-03-15 12:05:31 -05:00
struct fsl_mc_command cmd = { 0 } ;
2016-10-26 11:20:34 -05:00
int err ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_CONT_ID ,
cmd_flags ,
0 ) ;
/* send command to mc*/
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return err ;
/* retrieve response parameters */
* container_id = ( int ) mc_cmd_read_object_id ( & cmd ) ;
return 0 ;
}
2019-10-31 01:18:29 +02:00
/**
* dprc_get_connection ( ) - Get connected endpoint and link status if connection
* exists .
* @ mc_io : Pointer to MC portal ' s I / O object
* @ cmd_flags : Command flags ; one or more of ' MC_CMD_FLAG_ '
* @ token : Token of DPRC object
* @ endpoint1 : Endpoint 1 configuration parameters
* @ endpoint2 : Returned endpoint 2 configuration parameters
* @ state : Returned link state :
* 1 - link is up ;
* 0 - link is down ;
* - 1 - no connection ( endpoint2 information is irrelevant )
*
* Return : ' 0 ' on Success ; - ENOTCONN if connection does not exist .
*/
int dprc_get_connection ( struct fsl_mc_io * mc_io ,
u32 cmd_flags ,
u16 token ,
const struct dprc_endpoint * endpoint1 ,
struct dprc_endpoint * endpoint2 ,
int * state )
{
struct dprc_cmd_get_connection * cmd_params ;
struct dprc_rsp_get_connection * rsp_params ;
struct fsl_mc_command cmd = { 0 } ;
int err , i ;
/* prepare command */
cmd . header = mc_encode_cmd_header ( DPRC_CMDID_GET_CONNECTION ,
cmd_flags ,
token ) ;
cmd_params = ( struct dprc_cmd_get_connection * ) cmd . params ;
cmd_params - > ep1_id = cpu_to_le32 ( endpoint1 - > id ) ;
cmd_params - > ep1_interface_id = cpu_to_le16 ( endpoint1 - > if_id ) ;
for ( i = 0 ; i < 16 ; i + + )
cmd_params - > ep1_type [ i ] = endpoint1 - > type [ i ] ;
/* send command to mc */
err = mc_send_command ( mc_io , & cmd ) ;
if ( err )
return - ENOTCONN ;
/* retrieve response parameters */
rsp_params = ( struct dprc_rsp_get_connection * ) cmd . params ;
endpoint2 - > id = le32_to_cpu ( rsp_params - > ep2_id ) ;
endpoint2 - > if_id = le16_to_cpu ( rsp_params - > ep2_interface_id ) ;
* state = le32_to_cpu ( rsp_params - > state ) ;
for ( i = 0 ; i < 16 ; i + + )
endpoint2 - > type [ i ] = rsp_params - > ep2_type [ i ] ;
return 0 ;
}