162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * Copyright 2020 NXP 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/kernel.h> 862306a36Sopenharmony_ci#include <linux/fsl/mc.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "fsl-mc-private.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * cache the DPRC version to reduce the number of commands 1462306a36Sopenharmony_ci * towards the mc firmware 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_cistatic u16 dprc_major_ver; 1762306a36Sopenharmony_cistatic u16 dprc_minor_ver; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/** 2062306a36Sopenharmony_ci * dprc_open() - Open DPRC object for use 2162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 2262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 2362306a36Sopenharmony_ci * @container_id: Container ID to open 2462306a36Sopenharmony_ci * @token: Returned token of DPRC object 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * @warning Required before any operation on the object. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ciint dprc_open(struct fsl_mc_io *mc_io, 3162306a36Sopenharmony_ci u32 cmd_flags, 3262306a36Sopenharmony_ci int container_id, 3362306a36Sopenharmony_ci u16 *token) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3662306a36Sopenharmony_ci struct dprc_cmd_open *cmd_params; 3762306a36Sopenharmony_ci int err; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci /* prepare command */ 4062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, cmd_flags, 4162306a36Sopenharmony_ci 0); 4262306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_open *)cmd.params; 4362306a36Sopenharmony_ci cmd_params->container_id = cpu_to_le32(container_id); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci /* send command to mc*/ 4662306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 4762306a36Sopenharmony_ci if (err) 4862306a36Sopenharmony_ci return err; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci /* retrieve response parameters */ 5162306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci return 0; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_open); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/** 5862306a36Sopenharmony_ci * dprc_close() - Close the control session of the object 5962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 6062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 6162306a36Sopenharmony_ci * @token: Token of DPRC object 6262306a36Sopenharmony_ci * 6362306a36Sopenharmony_ci * After this function is called, no further operations are 6462306a36Sopenharmony_ci * allowed on the object without opening a new control session. 6562306a36Sopenharmony_ci * 6662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ciint dprc_close(struct fsl_mc_io *mc_io, 6962306a36Sopenharmony_ci u32 cmd_flags, 7062306a36Sopenharmony_ci u16 token) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* prepare command */ 7562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, cmd_flags, 7662306a36Sopenharmony_ci token); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci /* send command to mc*/ 7962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_close); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/** 8462306a36Sopenharmony_ci * dprc_reset_container - Reset child container. 8562306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 8662306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 8762306a36Sopenharmony_ci * @token: Token of DPRC object 8862306a36Sopenharmony_ci * @child_container_id: ID of the container to reset 8962306a36Sopenharmony_ci * @options: 32 bit options: 9062306a36Sopenharmony_ci * - 0 (no bits set) - all the objects inside the container are 9162306a36Sopenharmony_ci * reset. The child containers are entered recursively and the 9262306a36Sopenharmony_ci * objects reset. All the objects (including the child containers) 9362306a36Sopenharmony_ci * are closed. 9462306a36Sopenharmony_ci * - bit 0 set - all the objects inside the container are reset. 9562306a36Sopenharmony_ci * However the child containers are not entered recursively. 9662306a36Sopenharmony_ci * This option is supported for API versions >= 6.5 9762306a36Sopenharmony_ci * In case a software context crashes or becomes non-responsive, the parent 9862306a36Sopenharmony_ci * may wish to reset its resources container before the software context is 9962306a36Sopenharmony_ci * restarted. 10062306a36Sopenharmony_ci * 10162306a36Sopenharmony_ci * This routine informs all objects assigned to the child container that the 10262306a36Sopenharmony_ci * container is being reset, so they may perform any cleanup operations that are 10362306a36Sopenharmony_ci * needed. All objects handles that were owned by the child container shall be 10462306a36Sopenharmony_ci * closed. 10562306a36Sopenharmony_ci * 10662306a36Sopenharmony_ci * Note that such request may be submitted even if the child software context 10762306a36Sopenharmony_ci * has not crashed, but the resulting object cleanup operations will not be 10862306a36Sopenharmony_ci * aware of that. 10962306a36Sopenharmony_ci * 11062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_ciint dprc_reset_container(struct fsl_mc_io *mc_io, 11362306a36Sopenharmony_ci u32 cmd_flags, 11462306a36Sopenharmony_ci u16 token, 11562306a36Sopenharmony_ci int child_container_id, 11662306a36Sopenharmony_ci u32 options) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 11962306a36Sopenharmony_ci struct dprc_cmd_reset_container *cmd_params; 12062306a36Sopenharmony_ci u32 cmdid = DPRC_CMDID_RESET_CONT; 12162306a36Sopenharmony_ci int err; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci /* 12462306a36Sopenharmony_ci * If the DPRC object version was not yet cached, cache it now. 12562306a36Sopenharmony_ci * Otherwise use the already cached value. 12662306a36Sopenharmony_ci */ 12762306a36Sopenharmony_ci if (!dprc_major_ver && !dprc_minor_ver) { 12862306a36Sopenharmony_ci err = dprc_get_api_version(mc_io, 0, 12962306a36Sopenharmony_ci &dprc_major_ver, 13062306a36Sopenharmony_ci &dprc_minor_ver); 13162306a36Sopenharmony_ci if (err) 13262306a36Sopenharmony_ci return err; 13362306a36Sopenharmony_ci } 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci /* 13662306a36Sopenharmony_ci * MC API 6.5 introduced a new field in the command used to pass 13762306a36Sopenharmony_ci * some flags. 13862306a36Sopenharmony_ci * Bit 0 indicates that the child containers are not recursively reset. 13962306a36Sopenharmony_ci */ 14062306a36Sopenharmony_ci if (dprc_major_ver > 6 || (dprc_major_ver == 6 && dprc_minor_ver >= 5)) 14162306a36Sopenharmony_ci cmdid = DPRC_CMDID_RESET_CONT_V2; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci /* prepare command */ 14462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(cmdid, cmd_flags, token); 14562306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_reset_container *)cmd.params; 14662306a36Sopenharmony_ci cmd_params->child_container_id = cpu_to_le32(child_container_id); 14762306a36Sopenharmony_ci cmd_params->options = cpu_to_le32(options); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* send command to mc*/ 15062306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_reset_container); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/** 15562306a36Sopenharmony_ci * dprc_set_irq() - Set IRQ information for the DPRC to trigger an interrupt. 15662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 15762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15862306a36Sopenharmony_ci * @token: Token of DPRC object 15962306a36Sopenharmony_ci * @irq_index: Identifies the interrupt index to configure 16062306a36Sopenharmony_ci * @irq_cfg: IRQ configuration 16162306a36Sopenharmony_ci * 16262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_ciint dprc_set_irq(struct fsl_mc_io *mc_io, 16562306a36Sopenharmony_ci u32 cmd_flags, 16662306a36Sopenharmony_ci u16 token, 16762306a36Sopenharmony_ci u8 irq_index, 16862306a36Sopenharmony_ci struct dprc_irq_cfg *irq_cfg) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 17162306a36Sopenharmony_ci struct dprc_cmd_set_irq *cmd_params; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci /* prepare command */ 17462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ, 17562306a36Sopenharmony_ci cmd_flags, 17662306a36Sopenharmony_ci token); 17762306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_set_irq *)cmd.params; 17862306a36Sopenharmony_ci cmd_params->irq_val = cpu_to_le32(irq_cfg->val); 17962306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 18062306a36Sopenharmony_ci cmd_params->irq_addr = cpu_to_le64(irq_cfg->paddr); 18162306a36Sopenharmony_ci cmd_params->irq_num = cpu_to_le32(irq_cfg->irq_num); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci /* send command to mc*/ 18462306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/** 18862306a36Sopenharmony_ci * dprc_set_irq_enable() - Set overall interrupt state. 18962306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 19062306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 19162306a36Sopenharmony_ci * @token: Token of DPRC object 19262306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 19362306a36Sopenharmony_ci * @en: Interrupt state - enable = 1, disable = 0 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci * Allows GPP software to control when interrupts are generated. 19662306a36Sopenharmony_ci * Each interrupt can have up to 32 causes. The enable/disable control's the 19762306a36Sopenharmony_ci * overall interrupt state. if the interrupt is disabled no causes will cause 19862306a36Sopenharmony_ci * an interrupt. 19962306a36Sopenharmony_ci * 20062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 20162306a36Sopenharmony_ci */ 20262306a36Sopenharmony_ciint dprc_set_irq_enable(struct fsl_mc_io *mc_io, 20362306a36Sopenharmony_ci u32 cmd_flags, 20462306a36Sopenharmony_ci u16 token, 20562306a36Sopenharmony_ci u8 irq_index, 20662306a36Sopenharmony_ci u8 en) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 20962306a36Sopenharmony_ci struct dprc_cmd_set_irq_enable *cmd_params; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci /* prepare command */ 21262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ_ENABLE, 21362306a36Sopenharmony_ci cmd_flags, token); 21462306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_set_irq_enable *)cmd.params; 21562306a36Sopenharmony_ci cmd_params->enable = en & DPRC_ENABLE; 21662306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* send command to mc*/ 21962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 22062306a36Sopenharmony_ci} 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci/** 22362306a36Sopenharmony_ci * dprc_set_irq_mask() - Set interrupt mask. 22462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 22562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 22662306a36Sopenharmony_ci * @token: Token of DPRC object 22762306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 22862306a36Sopenharmony_ci * @mask: event mask to trigger interrupt; 22962306a36Sopenharmony_ci * each bit: 23062306a36Sopenharmony_ci * 0 = ignore event 23162306a36Sopenharmony_ci * 1 = consider event for asserting irq 23262306a36Sopenharmony_ci * 23362306a36Sopenharmony_ci * Every interrupt can have up to 32 causes and the interrupt model supports 23462306a36Sopenharmony_ci * masking/unmasking each cause independently 23562306a36Sopenharmony_ci * 23662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 23762306a36Sopenharmony_ci */ 23862306a36Sopenharmony_ciint dprc_set_irq_mask(struct fsl_mc_io *mc_io, 23962306a36Sopenharmony_ci u32 cmd_flags, 24062306a36Sopenharmony_ci u16 token, 24162306a36Sopenharmony_ci u8 irq_index, 24262306a36Sopenharmony_ci u32 mask) 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 24562306a36Sopenharmony_ci struct dprc_cmd_set_irq_mask *cmd_params; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci /* prepare command */ 24862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_IRQ_MASK, 24962306a36Sopenharmony_ci cmd_flags, token); 25062306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_set_irq_mask *)cmd.params; 25162306a36Sopenharmony_ci cmd_params->mask = cpu_to_le32(mask); 25262306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci /* send command to mc*/ 25562306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci/** 25962306a36Sopenharmony_ci * dprc_get_irq_status() - Get the current status of any pending interrupts. 26062306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 26162306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 26262306a36Sopenharmony_ci * @token: Token of DPRC object 26362306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 26462306a36Sopenharmony_ci * @status: Returned interrupts status - one bit per cause: 26562306a36Sopenharmony_ci * 0 = no interrupt pending 26662306a36Sopenharmony_ci * 1 = interrupt pending 26762306a36Sopenharmony_ci * 26862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 26962306a36Sopenharmony_ci */ 27062306a36Sopenharmony_ciint dprc_get_irq_status(struct fsl_mc_io *mc_io, 27162306a36Sopenharmony_ci u32 cmd_flags, 27262306a36Sopenharmony_ci u16 token, 27362306a36Sopenharmony_ci u8 irq_index, 27462306a36Sopenharmony_ci u32 *status) 27562306a36Sopenharmony_ci{ 27662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 27762306a36Sopenharmony_ci struct dprc_cmd_get_irq_status *cmd_params; 27862306a36Sopenharmony_ci struct dprc_rsp_get_irq_status *rsp_params; 27962306a36Sopenharmony_ci int err; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci /* prepare command */ 28262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_STATUS, 28362306a36Sopenharmony_ci cmd_flags, token); 28462306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_get_irq_status *)cmd.params; 28562306a36Sopenharmony_ci cmd_params->status = cpu_to_le32(*status); 28662306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci /* send command to mc*/ 28962306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 29062306a36Sopenharmony_ci if (err) 29162306a36Sopenharmony_ci return err; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci /* retrieve response parameters */ 29462306a36Sopenharmony_ci rsp_params = (struct dprc_rsp_get_irq_status *)cmd.params; 29562306a36Sopenharmony_ci *status = le32_to_cpu(rsp_params->status); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci return 0; 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/** 30162306a36Sopenharmony_ci * dprc_clear_irq_status() - Clear a pending interrupt's status 30262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 30362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 30462306a36Sopenharmony_ci * @token: Token of DPRC object 30562306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 30662306a36Sopenharmony_ci * @status: bits to clear (W1C) - one bit per cause: 30762306a36Sopenharmony_ci * 0 = don't change 30862306a36Sopenharmony_ci * 1 = clear status bit 30962306a36Sopenharmony_ci * 31062306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 31162306a36Sopenharmony_ci */ 31262306a36Sopenharmony_ciint dprc_clear_irq_status(struct fsl_mc_io *mc_io, 31362306a36Sopenharmony_ci u32 cmd_flags, 31462306a36Sopenharmony_ci u16 token, 31562306a36Sopenharmony_ci u8 irq_index, 31662306a36Sopenharmony_ci u32 status) 31762306a36Sopenharmony_ci{ 31862306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 31962306a36Sopenharmony_ci struct dprc_cmd_clear_irq_status *cmd_params; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci /* prepare command */ 32262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLEAR_IRQ_STATUS, 32362306a36Sopenharmony_ci cmd_flags, token); 32462306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_clear_irq_status *)cmd.params; 32562306a36Sopenharmony_ci cmd_params->status = cpu_to_le32(status); 32662306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci /* send command to mc*/ 32962306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci/** 33362306a36Sopenharmony_ci * dprc_get_attributes() - Obtains container attributes 33462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 33562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 33662306a36Sopenharmony_ci * @token: Token of DPRC object 33762306a36Sopenharmony_ci * @attr: Returned container attributes 33862306a36Sopenharmony_ci * 33962306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 34062306a36Sopenharmony_ci */ 34162306a36Sopenharmony_ciint dprc_get_attributes(struct fsl_mc_io *mc_io, 34262306a36Sopenharmony_ci u32 cmd_flags, 34362306a36Sopenharmony_ci u16 token, 34462306a36Sopenharmony_ci struct dprc_attributes *attr) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 34762306a36Sopenharmony_ci struct dprc_rsp_get_attributes *rsp_params; 34862306a36Sopenharmony_ci int err; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci /* prepare command */ 35162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR, 35262306a36Sopenharmony_ci cmd_flags, 35362306a36Sopenharmony_ci token); 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci /* send command to mc*/ 35662306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 35762306a36Sopenharmony_ci if (err) 35862306a36Sopenharmony_ci return err; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci /* retrieve response parameters */ 36162306a36Sopenharmony_ci rsp_params = (struct dprc_rsp_get_attributes *)cmd.params; 36262306a36Sopenharmony_ci attr->container_id = le32_to_cpu(rsp_params->container_id); 36362306a36Sopenharmony_ci attr->icid = le32_to_cpu(rsp_params->icid); 36462306a36Sopenharmony_ci attr->options = le32_to_cpu(rsp_params->options); 36562306a36Sopenharmony_ci attr->portal_id = le32_to_cpu(rsp_params->portal_id); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci return 0; 36862306a36Sopenharmony_ci} 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci/** 37162306a36Sopenharmony_ci * dprc_get_obj_count() - Obtains the number of objects in the DPRC 37262306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 37362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 37462306a36Sopenharmony_ci * @token: Token of DPRC object 37562306a36Sopenharmony_ci * @obj_count: Number of objects assigned to the DPRC 37662306a36Sopenharmony_ci * 37762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 37862306a36Sopenharmony_ci */ 37962306a36Sopenharmony_ciint dprc_get_obj_count(struct fsl_mc_io *mc_io, 38062306a36Sopenharmony_ci u32 cmd_flags, 38162306a36Sopenharmony_ci u16 token, 38262306a36Sopenharmony_ci int *obj_count) 38362306a36Sopenharmony_ci{ 38462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 38562306a36Sopenharmony_ci struct dprc_rsp_get_obj_count *rsp_params; 38662306a36Sopenharmony_ci int err; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci /* prepare command */ 38962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT, 39062306a36Sopenharmony_ci cmd_flags, token); 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* send command to mc*/ 39362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 39462306a36Sopenharmony_ci if (err) 39562306a36Sopenharmony_ci return err; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci /* retrieve response parameters */ 39862306a36Sopenharmony_ci rsp_params = (struct dprc_rsp_get_obj_count *)cmd.params; 39962306a36Sopenharmony_ci *obj_count = le32_to_cpu(rsp_params->obj_count); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci return 0; 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_get_obj_count); 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci/** 40662306a36Sopenharmony_ci * dprc_get_obj() - Get general information on an object 40762306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 40862306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 40962306a36Sopenharmony_ci * @token: Token of DPRC object 41062306a36Sopenharmony_ci * @obj_index: Index of the object to be queried (< obj_count) 41162306a36Sopenharmony_ci * @obj_desc: Returns the requested object descriptor 41262306a36Sopenharmony_ci * 41362306a36Sopenharmony_ci * The object descriptors are retrieved one by one by incrementing 41462306a36Sopenharmony_ci * obj_index up to (not including) the value of obj_count returned 41562306a36Sopenharmony_ci * from dprc_get_obj_count(). dprc_get_obj_count() must 41662306a36Sopenharmony_ci * be called prior to dprc_get_obj(). 41762306a36Sopenharmony_ci * 41862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 41962306a36Sopenharmony_ci */ 42062306a36Sopenharmony_ciint dprc_get_obj(struct fsl_mc_io *mc_io, 42162306a36Sopenharmony_ci u32 cmd_flags, 42262306a36Sopenharmony_ci u16 token, 42362306a36Sopenharmony_ci int obj_index, 42462306a36Sopenharmony_ci struct fsl_mc_obj_desc *obj_desc) 42562306a36Sopenharmony_ci{ 42662306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 42762306a36Sopenharmony_ci struct dprc_cmd_get_obj *cmd_params; 42862306a36Sopenharmony_ci struct dprc_rsp_get_obj *rsp_params; 42962306a36Sopenharmony_ci int err; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci /* prepare command */ 43262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ, 43362306a36Sopenharmony_ci cmd_flags, 43462306a36Sopenharmony_ci token); 43562306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_get_obj *)cmd.params; 43662306a36Sopenharmony_ci cmd_params->obj_index = cpu_to_le32(obj_index); 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci /* send command to mc*/ 43962306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 44062306a36Sopenharmony_ci if (err) 44162306a36Sopenharmony_ci return err; 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci /* retrieve response parameters */ 44462306a36Sopenharmony_ci rsp_params = (struct dprc_rsp_get_obj *)cmd.params; 44562306a36Sopenharmony_ci obj_desc->id = le32_to_cpu(rsp_params->id); 44662306a36Sopenharmony_ci obj_desc->vendor = le16_to_cpu(rsp_params->vendor); 44762306a36Sopenharmony_ci obj_desc->irq_count = rsp_params->irq_count; 44862306a36Sopenharmony_ci obj_desc->region_count = rsp_params->region_count; 44962306a36Sopenharmony_ci obj_desc->state = le32_to_cpu(rsp_params->state); 45062306a36Sopenharmony_ci obj_desc->ver_major = le16_to_cpu(rsp_params->version_major); 45162306a36Sopenharmony_ci obj_desc->ver_minor = le16_to_cpu(rsp_params->version_minor); 45262306a36Sopenharmony_ci obj_desc->flags = le16_to_cpu(rsp_params->flags); 45362306a36Sopenharmony_ci strncpy(obj_desc->type, rsp_params->type, 16); 45462306a36Sopenharmony_ci obj_desc->type[15] = '\0'; 45562306a36Sopenharmony_ci strncpy(obj_desc->label, rsp_params->label, 16); 45662306a36Sopenharmony_ci obj_desc->label[15] = '\0'; 45762306a36Sopenharmony_ci return 0; 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_get_obj); 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci/** 46262306a36Sopenharmony_ci * dprc_set_obj_irq() - Set IRQ information for object to trigger an interrupt. 46362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 46462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 46562306a36Sopenharmony_ci * @token: Token of DPRC object 46662306a36Sopenharmony_ci * @obj_type: Type of the object to set its IRQ 46762306a36Sopenharmony_ci * @obj_id: ID of the object to set its IRQ 46862306a36Sopenharmony_ci * @irq_index: The interrupt index to configure 46962306a36Sopenharmony_ci * @irq_cfg: IRQ configuration 47062306a36Sopenharmony_ci * 47162306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 47262306a36Sopenharmony_ci */ 47362306a36Sopenharmony_ciint dprc_set_obj_irq(struct fsl_mc_io *mc_io, 47462306a36Sopenharmony_ci u32 cmd_flags, 47562306a36Sopenharmony_ci u16 token, 47662306a36Sopenharmony_ci char *obj_type, 47762306a36Sopenharmony_ci int obj_id, 47862306a36Sopenharmony_ci u8 irq_index, 47962306a36Sopenharmony_ci struct dprc_irq_cfg *irq_cfg) 48062306a36Sopenharmony_ci{ 48162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 48262306a36Sopenharmony_ci struct dprc_cmd_set_obj_irq *cmd_params; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci /* prepare command */ 48562306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_SET_OBJ_IRQ, 48662306a36Sopenharmony_ci cmd_flags, 48762306a36Sopenharmony_ci token); 48862306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_set_obj_irq *)cmd.params; 48962306a36Sopenharmony_ci cmd_params->irq_val = cpu_to_le32(irq_cfg->val); 49062306a36Sopenharmony_ci cmd_params->irq_index = irq_index; 49162306a36Sopenharmony_ci cmd_params->irq_addr = cpu_to_le64(irq_cfg->paddr); 49262306a36Sopenharmony_ci cmd_params->irq_num = cpu_to_le32(irq_cfg->irq_num); 49362306a36Sopenharmony_ci cmd_params->obj_id = cpu_to_le32(obj_id); 49462306a36Sopenharmony_ci strncpy(cmd_params->obj_type, obj_type, 16); 49562306a36Sopenharmony_ci cmd_params->obj_type[15] = '\0'; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci /* send command to mc*/ 49862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 49962306a36Sopenharmony_ci} 50062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_set_obj_irq); 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci/** 50362306a36Sopenharmony_ci * dprc_get_obj_region() - Get region information for a specified object. 50462306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 50562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 50662306a36Sopenharmony_ci * @token: Token of DPRC object 50762306a36Sopenharmony_ci * @obj_type: Object type as returned in dprc_get_obj() 50862306a36Sopenharmony_ci * @obj_id: Unique object instance as returned in dprc_get_obj() 50962306a36Sopenharmony_ci * @region_index: The specific region to query 51062306a36Sopenharmony_ci * @region_desc: Returns the requested region descriptor 51162306a36Sopenharmony_ci * 51262306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 51362306a36Sopenharmony_ci */ 51462306a36Sopenharmony_ciint dprc_get_obj_region(struct fsl_mc_io *mc_io, 51562306a36Sopenharmony_ci u32 cmd_flags, 51662306a36Sopenharmony_ci u16 token, 51762306a36Sopenharmony_ci char *obj_type, 51862306a36Sopenharmony_ci int obj_id, 51962306a36Sopenharmony_ci u8 region_index, 52062306a36Sopenharmony_ci struct dprc_region_desc *region_desc) 52162306a36Sopenharmony_ci{ 52262306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 52362306a36Sopenharmony_ci struct dprc_cmd_get_obj_region *cmd_params; 52462306a36Sopenharmony_ci struct dprc_rsp_get_obj_region *rsp_params; 52562306a36Sopenharmony_ci int err; 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci /* 52862306a36Sopenharmony_ci * If the DPRC object version was not yet cached, cache it now. 52962306a36Sopenharmony_ci * Otherwise use the already cached value. 53062306a36Sopenharmony_ci */ 53162306a36Sopenharmony_ci if (!dprc_major_ver && !dprc_minor_ver) { 53262306a36Sopenharmony_ci err = dprc_get_api_version(mc_io, 0, 53362306a36Sopenharmony_ci &dprc_major_ver, 53462306a36Sopenharmony_ci &dprc_minor_ver); 53562306a36Sopenharmony_ci if (err) 53662306a36Sopenharmony_ci return err; 53762306a36Sopenharmony_ci } 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci if (dprc_major_ver > 6 || (dprc_major_ver == 6 && dprc_minor_ver >= 6)) { 54062306a36Sopenharmony_ci /* 54162306a36Sopenharmony_ci * MC API version 6.6 changed the size of the MC portals and software 54262306a36Sopenharmony_ci * portals to 64K (as implemented by hardware). If older API is in use the 54362306a36Sopenharmony_ci * size reported is less (64 bytes for mc portals and 4K for software 54462306a36Sopenharmony_ci * portals). 54562306a36Sopenharmony_ci */ 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG_V3, 54862306a36Sopenharmony_ci cmd_flags, token); 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci } else if (dprc_major_ver == 6 && dprc_minor_ver >= 3) { 55162306a36Sopenharmony_ci /* 55262306a36Sopenharmony_ci * MC API version 6.3 introduced a new field to the region 55362306a36Sopenharmony_ci * descriptor: base_address. If the older API is in use then the base 55462306a36Sopenharmony_ci * address is set to zero to indicate it needs to be obtained elsewhere 55562306a36Sopenharmony_ci * (typically the device tree). 55662306a36Sopenharmony_ci */ 55762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG_V2, 55862306a36Sopenharmony_ci cmd_flags, token); 55962306a36Sopenharmony_ci } else { 56062306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG, 56162306a36Sopenharmony_ci cmd_flags, token); 56262306a36Sopenharmony_ci } 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_get_obj_region *)cmd.params; 56562306a36Sopenharmony_ci cmd_params->obj_id = cpu_to_le32(obj_id); 56662306a36Sopenharmony_ci cmd_params->region_index = region_index; 56762306a36Sopenharmony_ci strncpy(cmd_params->obj_type, obj_type, 16); 56862306a36Sopenharmony_ci cmd_params->obj_type[15] = '\0'; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci /* send command to mc*/ 57162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 57262306a36Sopenharmony_ci if (err) 57362306a36Sopenharmony_ci return err; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci /* retrieve response parameters */ 57662306a36Sopenharmony_ci rsp_params = (struct dprc_rsp_get_obj_region *)cmd.params; 57762306a36Sopenharmony_ci region_desc->base_offset = le64_to_cpu(rsp_params->base_offset); 57862306a36Sopenharmony_ci region_desc->size = le32_to_cpu(rsp_params->size); 57962306a36Sopenharmony_ci region_desc->type = rsp_params->type; 58062306a36Sopenharmony_ci region_desc->flags = le32_to_cpu(rsp_params->flags); 58162306a36Sopenharmony_ci if (dprc_major_ver > 6 || (dprc_major_ver == 6 && dprc_minor_ver >= 3)) 58262306a36Sopenharmony_ci region_desc->base_address = le64_to_cpu(rsp_params->base_addr); 58362306a36Sopenharmony_ci else 58462306a36Sopenharmony_ci region_desc->base_address = 0; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci return 0; 58762306a36Sopenharmony_ci} 58862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dprc_get_obj_region); 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_ci/** 59162306a36Sopenharmony_ci * dprc_get_api_version - Get Data Path Resource Container API version 59262306a36Sopenharmony_ci * @mc_io: Pointer to Mc portal's I/O object 59362306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 59462306a36Sopenharmony_ci * @major_ver: Major version of Data Path Resource Container API 59562306a36Sopenharmony_ci * @minor_ver: Minor version of Data Path Resource Container API 59662306a36Sopenharmony_ci * 59762306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 59862306a36Sopenharmony_ci */ 59962306a36Sopenharmony_ciint dprc_get_api_version(struct fsl_mc_io *mc_io, 60062306a36Sopenharmony_ci u32 cmd_flags, 60162306a36Sopenharmony_ci u16 *major_ver, 60262306a36Sopenharmony_ci u16 *minor_ver) 60362306a36Sopenharmony_ci{ 60462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 60562306a36Sopenharmony_ci int err; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci /* prepare command */ 60862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_API_VERSION, 60962306a36Sopenharmony_ci cmd_flags, 0); 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci /* send command to mc */ 61262306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 61362306a36Sopenharmony_ci if (err) 61462306a36Sopenharmony_ci return err; 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci /* retrieve response parameters */ 61762306a36Sopenharmony_ci mc_cmd_read_api_version(&cmd, major_ver, minor_ver); 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci return 0; 62062306a36Sopenharmony_ci} 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci/** 62362306a36Sopenharmony_ci * dprc_get_container_id - Get container ID associated with a given portal. 62462306a36Sopenharmony_ci * @mc_io: Pointer to Mc portal's I/O object 62562306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 62662306a36Sopenharmony_ci * @container_id: Requested container id 62762306a36Sopenharmony_ci * 62862306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 62962306a36Sopenharmony_ci */ 63062306a36Sopenharmony_ciint dprc_get_container_id(struct fsl_mc_io *mc_io, 63162306a36Sopenharmony_ci u32 cmd_flags, 63262306a36Sopenharmony_ci int *container_id) 63362306a36Sopenharmony_ci{ 63462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 63562306a36Sopenharmony_ci int err; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci /* prepare command */ 63862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONT_ID, 63962306a36Sopenharmony_ci cmd_flags, 64062306a36Sopenharmony_ci 0); 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci /* send command to mc*/ 64362306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 64462306a36Sopenharmony_ci if (err) 64562306a36Sopenharmony_ci return err; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci /* retrieve response parameters */ 64862306a36Sopenharmony_ci *container_id = (int)mc_cmd_read_object_id(&cmd); 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci return 0; 65162306a36Sopenharmony_ci} 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci/** 65462306a36Sopenharmony_ci * dprc_get_connection() - Get connected endpoint and link status if connection 65562306a36Sopenharmony_ci * exists. 65662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 65762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 65862306a36Sopenharmony_ci * @token: Token of DPRC object 65962306a36Sopenharmony_ci * @endpoint1: Endpoint 1 configuration parameters 66062306a36Sopenharmony_ci * @endpoint2: Returned endpoint 2 configuration parameters 66162306a36Sopenharmony_ci * @state: Returned link state: 66262306a36Sopenharmony_ci * 1 - link is up; 66362306a36Sopenharmony_ci * 0 - link is down; 66462306a36Sopenharmony_ci * -1 - no connection (endpoint2 information is irrelevant) 66562306a36Sopenharmony_ci * 66662306a36Sopenharmony_ci * Return: '0' on Success; -ENOTCONN if connection does not exist. 66762306a36Sopenharmony_ci */ 66862306a36Sopenharmony_ciint dprc_get_connection(struct fsl_mc_io *mc_io, 66962306a36Sopenharmony_ci u32 cmd_flags, 67062306a36Sopenharmony_ci u16 token, 67162306a36Sopenharmony_ci const struct dprc_endpoint *endpoint1, 67262306a36Sopenharmony_ci struct dprc_endpoint *endpoint2, 67362306a36Sopenharmony_ci int *state) 67462306a36Sopenharmony_ci{ 67562306a36Sopenharmony_ci struct dprc_cmd_get_connection *cmd_params; 67662306a36Sopenharmony_ci struct dprc_rsp_get_connection *rsp_params; 67762306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 67862306a36Sopenharmony_ci int err, i; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci /* prepare command */ 68162306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION, 68262306a36Sopenharmony_ci cmd_flags, 68362306a36Sopenharmony_ci token); 68462306a36Sopenharmony_ci cmd_params = (struct dprc_cmd_get_connection *)cmd.params; 68562306a36Sopenharmony_ci cmd_params->ep1_id = cpu_to_le32(endpoint1->id); 68662306a36Sopenharmony_ci cmd_params->ep1_interface_id = cpu_to_le16(endpoint1->if_id); 68762306a36Sopenharmony_ci for (i = 0; i < 16; i++) 68862306a36Sopenharmony_ci cmd_params->ep1_type[i] = endpoint1->type[i]; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci /* send command to mc */ 69162306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 69262306a36Sopenharmony_ci if (err) 69362306a36Sopenharmony_ci return -ENOTCONN; 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci /* retrieve response parameters */ 69662306a36Sopenharmony_ci rsp_params = (struct dprc_rsp_get_connection *)cmd.params; 69762306a36Sopenharmony_ci endpoint2->id = le32_to_cpu(rsp_params->ep2_id); 69862306a36Sopenharmony_ci endpoint2->if_id = le16_to_cpu(rsp_params->ep2_interface_id); 69962306a36Sopenharmony_ci *state = le32_to_cpu(rsp_params->state); 70062306a36Sopenharmony_ci for (i = 0; i < 16; i++) 70162306a36Sopenharmony_ci endpoint2->type[i] = rsp_params->ep2_type[i]; 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci return 0; 70462306a36Sopenharmony_ci} 705