162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2020 NXP 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * File containing client-side RPC functions for the RM service. These 662306a36Sopenharmony_ci * function are ported to clients that communicate to the SC. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/firmware/imx/svc/rm.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct imx_sc_msg_rm_rsrc_owned { 1262306a36Sopenharmony_ci struct imx_sc_rpc_msg hdr; 1362306a36Sopenharmony_ci u16 resource; 1462306a36Sopenharmony_ci} __packed __aligned(4); 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * This function check @resource is owned by current partition or not 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * @param[in] ipc IPC handle 2062306a36Sopenharmony_ci * @param[in] resource resource the control is associated with 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * @return Returns 0 for not owned and 1 for owned. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_cibool imx_sc_rm_is_resource_owned(struct imx_sc_ipc *ipc, u16 resource) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci struct imx_sc_msg_rm_rsrc_owned msg; 2762306a36Sopenharmony_ci struct imx_sc_rpc_msg *hdr = &msg.hdr; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci hdr->ver = IMX_SC_RPC_VERSION; 3062306a36Sopenharmony_ci hdr->svc = IMX_SC_RPC_SVC_RM; 3162306a36Sopenharmony_ci hdr->func = IMX_SC_RM_FUNC_IS_RESOURCE_OWNED; 3262306a36Sopenharmony_ci hdr->size = 2; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci msg.resource = resource; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci /* 3762306a36Sopenharmony_ci * SCU firmware only returns value 0 or 1 3862306a36Sopenharmony_ci * for resource owned check which means not owned or owned. 3962306a36Sopenharmony_ci * So it is always successful. 4062306a36Sopenharmony_ci */ 4162306a36Sopenharmony_ci imx_scu_call_rpc(ipc, &msg, true); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci return hdr->func; 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ciEXPORT_SYMBOL(imx_sc_rm_is_resource_owned); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistruct imx_sc_msg_rm_get_resource_owner { 4862306a36Sopenharmony_ci struct imx_sc_rpc_msg hdr; 4962306a36Sopenharmony_ci union { 5062306a36Sopenharmony_ci struct { 5162306a36Sopenharmony_ci u16 resource; 5262306a36Sopenharmony_ci } req; 5362306a36Sopenharmony_ci struct { 5462306a36Sopenharmony_ci u8 val; 5562306a36Sopenharmony_ci } resp; 5662306a36Sopenharmony_ci } data; 5762306a36Sopenharmony_ci} __packed __aligned(4); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* 6062306a36Sopenharmony_ci * This function get @resource partition number 6162306a36Sopenharmony_ci * 6262306a36Sopenharmony_ci * @param[in] ipc IPC handle 6362306a36Sopenharmony_ci * @param[in] resource resource the control is associated with 6462306a36Sopenharmony_ci * @param[out] pt pointer to return the partition number 6562306a36Sopenharmony_ci * 6662306a36Sopenharmony_ci * @return Returns 0 for success and < 0 for errors. 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ciint imx_sc_rm_get_resource_owner(struct imx_sc_ipc *ipc, u16 resource, u8 *pt) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci struct imx_sc_msg_rm_get_resource_owner msg; 7162306a36Sopenharmony_ci struct imx_sc_rpc_msg *hdr = &msg.hdr; 7262306a36Sopenharmony_ci int ret; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci hdr->ver = IMX_SC_RPC_VERSION; 7562306a36Sopenharmony_ci hdr->svc = IMX_SC_RPC_SVC_RM; 7662306a36Sopenharmony_ci hdr->func = IMX_SC_RM_FUNC_GET_RESOURCE_OWNER; 7762306a36Sopenharmony_ci hdr->size = 2; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci msg.data.req.resource = resource; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci ret = imx_scu_call_rpc(ipc, &msg, true); 8262306a36Sopenharmony_ci if (ret) 8362306a36Sopenharmony_ci return ret; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci if (pt) 8662306a36Sopenharmony_ci *pt = msg.data.resp.val; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci return 0; 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ciEXPORT_SYMBOL(imx_sc_rm_get_resource_owner); 91