Received: by 2002:a05:6500:1b8f:b0:1fa:5c73:8e2d with SMTP id df15csp560783lqb; Wed, 29 May 2024 04:22:19 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUlbCxWB1OSjSnSYLJcbWfvywPtIld/lTL052UqICFzwJln8/dF04oTtqhJg2zSWrIVLZkSrFbrmMCu3LJiBD3X+KQIn+QJJ9xNeHt9FA== X-Google-Smtp-Source: AGHT+IFGqamkL6oD8kJ30G9a1cn20RySgi4aK+nZmOCZXKrFP2aoKf+K0WDLiwbwcOtcVADlgGr4 X-Received: by 2002:a17:90b:3144:b0:2bd:ef6b:c33b with SMTP id 98e67ed59e1d1-2bf5e098717mr15739014a91.0.1716981739430; Wed, 29 May 2024 04:22:19 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1716981739; cv=pass; d=google.com; s=arc-20160816; b=iIAlVPRLqAbzYaR00ZPIRrUq4l1RA/EUPOS1LUO8OJDFpMG9tJP7Y9WyF4SUnDOiCg aFTcTT28lGwYE6EjXXvhPrNXFHK8UOlKPBtASCgaLgQHPOrRxUsXpWzwsir4doQPQEcp dYOIf81INO4qEicInmqTRXuhp4iq4inFelekLfeYyzdIXZ/uIQkP3ltn270FaSHyuBO5 a2XFqryovyl35AJJ1mu82IFdvv28JQOpgoj2XkjzZ/6M0cMqBSG3FD3M6VIW3gmKY7cJ hLNGuluOI1abTdKdPlO5lvRzHNOYv/tvmQL7M2OkQUckHgPwskXNgr6P+IEpT+L0II38 NawA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:date:message-id:dkim-signature; bh=Akh6nSIhH2KG7d3Ytl0qqKOGBU87zdV2TT7beBLijPk=; fh=iQcb+FK+xAsbnT58MtqwKGrfRh6jE2ug2QBuLkEwVcY=; b=b/+CzywDNYFREeT9Uv498HC6w308HygfahkfjBwPxxJ6XFll+mvUJQfWwIjPkoLTYG Q4rjwWRw6/jzqCSvZKX96Qf9TvaD+jyMcMUTKyhbaDm07HFyHxS2ahoYaE6Vuunr4X+/ e6rBQ9DBCktPFE7olvwiE9pnCTWhRwFXlHdHR9J1GuK36MAaP69mxAACPZlgDVhh75Ux KfpS2JeR1HESnycU5UpkDaQmWhJcXPAww4RkIF4jbIsQERb1ZZxowRkk+J2rW71GaqnJ MUdxk9jI+dTYtPDLEDANji5JVYKbkPjVySjSpnsPIB0KebRLroiiVA+Fj0Pwxl1tqwAI sbfg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=MNppgc6S; arc=pass (i=1 spf=pass spfdomain=quicinc.com dkim=pass dkdomain=quicinc.com dmarc=pass fromdomain=quicinc.com); spf=pass (google.com: domain of linux-kernel+bounces-193995-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-193995-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id 98e67ed59e1d1-2c19763acadsi231911a91.146.2024.05.29.04.22.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 04:22:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-193995-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=MNppgc6S; arc=pass (i=1 spf=pass spfdomain=quicinc.com dkim=pass dkdomain=quicinc.com dmarc=pass fromdomain=quicinc.com); spf=pass (google.com: domain of linux-kernel+bounces-193995-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-193995-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 18C7628AD3B for ; Wed, 29 May 2024 11:12:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A9BBB169397; Wed, 29 May 2024 11:12:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="MNppgc6S" Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A20653802; Wed, 29 May 2024 11:12:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716981124; cv=none; b=uLlu9FRdNtBe4kVccdUP4THnUcwXlJgU/Bty2E8xJiI8Ae7tPnRk9t1WuddB7LU9a4K6Q/u9S1new1mxwa4354AdgS1PDBbLAKNfNwRNKcCcwlCe2DGO71F3R5AzhYkR8p3hWTDquqYwSFX4YXguqpgNRElxNYfz8w4dmr2oc48= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716981124; c=relaxed/simple; bh=BeaxTfvZ2BbAq+uY+YxSG3gMh781auGMVkjq9or3THE=; h=Message-ID:Date:MIME-Version:Subject:To:CC:References:From: In-Reply-To:Content-Type; b=YI2e9tqLB+o//G6O0Fw8FSoI3KipeKPh+UgEKWngOZGu3EIcEbmpwtwCtyZ2MLOFaXjGvfcHPKv9hlNktLQhTkgI2jFTdJa9KtDb7NbpMkFl4TZkBNBSEKMs+imxrs6x/EFQubgTH0aH2KxFx43pmnoM9UFIgvbJGVkNvjVRKuE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=MNppgc6S; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 44T9tcDI025517; Wed, 29 May 2024 11:11:58 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= Akh6nSIhH2KG7d3Ytl0qqKOGBU87zdV2TT7beBLijPk=; b=MNppgc6SryqknaCR z2aKwDVLFrtH7HUPh3ioufNsHlTCh8ZhOPmjGFOLNoEBLo6yQ4RTK+aP4QMnyrXE /6+32f+QLZoB12QznVBYOmHPmetPWjjPV48nDkk5liRLSSOrl9Mc5GDO9pgpsMqO UKR6n6Hkz3SCaIscvlYs8a5EkeRTz4JYoYnG64G53JCGbDPMkY8E2SWbCfveIoXT ScONaziuInmNn2oE7+VUxNgozA5eP7IWfYOzV/g3cxKEUFBBLEHeIfA1o37cJpWb /FsTG+f2IxGLP4leaJl2OJKfynvu26SdH/U/xJMyhRRSn4XCjG3f77OGvGmOCdYm d5Z8Sw== Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3yba2prtty-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 29 May 2024 11:11:58 +0000 (GMT) Received: from nalasex01b.na.qualcomm.com (nalasex01b.na.qualcomm.com [10.47.209.197]) by NALASPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 44TBBvlh011484 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 29 May 2024 11:11:57 GMT Received: from [10.204.67.150] (10.80.80.8) by nalasex01b.na.qualcomm.com (10.47.209.197) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Wed, 29 May 2024 04:11:54 -0700 Message-ID: <51facf80-2490-4533-8ba1-584769e1ca79@quicinc.com> Date: Wed, 29 May 2024 16:41:51 +0530 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 4/8] misc: fastrpc: Add static PD restart support To: Dmitry Baryshkov CC: , , , , , References: <20240528112956.5979-1-quic_ekangupt@quicinc.com> <20240528112956.5979-5-quic_ekangupt@quicinc.com> Content-Language: en-US From: Ekansh Gupta In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01b.na.qualcomm.com (10.47.209.197) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: Jwm-RJWs-_VIVCVkVYkD_jliIyllM1oJ X-Proofpoint-ORIG-GUID: Jwm-RJWs-_VIVCVkVYkD_jliIyllM1oJ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-05-29_07,2024-05-28_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 malwarescore=0 spamscore=0 adultscore=0 clxscore=1011 bulkscore=0 mlxscore=0 suspectscore=0 priorityscore=1501 phishscore=0 mlxlogscore=999 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2405290075 On 5/28/2024 6:03 PM, Dmitry Baryshkov wrote: > On Tue, May 28, 2024 at 04:59:50PM +0530, Ekansh Gupta wrote: >> Static PDs on the audio and sensor domains are expected to support >> PD restart. The kernel resource handling for the PDs are expected >> to be handled by fastrpc driver. For this, there is a requirement >> of PD service locator to get the event notifications for static PD >> services. Also when events are received, the driver needs to handle >> based on PD states. Added changes to add service locator for audio >> and sensor domain static PDs and handle the PD restart sequence. >> >> Signed-off-by: Ekansh Gupta >> --- >> drivers/misc/Kconfig | 2 + >> drivers/misc/fastrpc.c | 205 ++++++++++++++++++++++++++++++++++++++--- >> 2 files changed, 195 insertions(+), 12 deletions(-) >> >> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig >> index faf983680040..e2d83cd085b5 100644 >> --- a/drivers/misc/Kconfig >> +++ b/drivers/misc/Kconfig >> @@ -280,8 +280,10 @@ config QCOM_FASTRPC >> tristate "Qualcomm FastRPC" >> depends on ARCH_QCOM || COMPILE_TEST >> depends on RPMSG >> + depends on NET >> select DMA_SHARED_BUFFER >> select QCOM_SCM >> + select QCOM_PDR_HELPERS >> help >> Provides a communication mechanism that allows for clients to >> make remote method invocations across processor boundary to >> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c >> index 6556c63c4ad7..7796b743cc45 100644 >> --- a/drivers/misc/fastrpc.c >> +++ b/drivers/misc/fastrpc.c >> @@ -22,6 +22,7 @@ >> #include >> #include >> #include >> +#include >> >> #define ADSP_DOMAIN_ID (0) >> #define MDSP_DOMAIN_ID (1) >> @@ -29,6 +30,7 @@ >> #define CDSP_DOMAIN_ID (3) >> #define FASTRPC_DEV_MAX 4 /* adsp, mdsp, slpi, cdsp*/ >> #define FASTRPC_MAX_SESSIONS 14 >> +#define FASTRPC_MAX_SPD 4 >> #define FASTRPC_MAX_VMIDS 16 >> #define FASTRPC_ALIGN 128 >> #define FASTRPC_MAX_FDLIST 16 >> @@ -105,6 +107,18 @@ >> >> #define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev) >> >> +#define AUDIO_PDR_SERVICE_LOCATION_CLIENT_NAME "audio_pdr_adsp" >> +#define AUDIO_PDR_ADSP_SERVICE_NAME "avs/audio" >> +#define ADSP_AUDIOPD_NAME "msm/adsp/audio_pd" >> + >> +#define SENSORS_PDR_ADSP_SERVICE_LOCATION_CLIENT_NAME "sensors_pdr_adsp" >> +#define SENSORS_PDR_ADSP_SERVICE_NAME "tms/servreg" >> +#define ADSP_SENSORPD_NAME "msm/adsp/sensor_pd" >> + >> +#define SENSORS_PDR_SLPI_SERVICE_LOCATION_CLIENT_NAME "sensors_pdr_slpi" >> +#define SENSORS_PDR_SLPI_SERVICE_NAME SENSORS_PDR_ADSP_SERVICE_NAME >> +#define SLPI_SENSORPD_NAME "msm/slpi/sensor_pd" >> + >> static const char *domains[FASTRPC_DEV_MAX] = { "adsp", "mdsp", >> "sdsp", "cdsp"}; >> struct fastrpc_phy_page { >> @@ -258,6 +272,15 @@ struct fastrpc_session_ctx { >> bool valid; >> }; >> >> +struct fastrpc_static_pd { >> + char *servloc_name; >> + char *spdname; >> + void *pdrhandle; >> + struct fastrpc_channel_ctx *cctx; >> + struct fastrpc_user *fl; >> + bool ispdup; >> +}; >> + >> struct fastrpc_channel_ctx { >> int domain_id; >> int sesscount; >> @@ -265,6 +288,7 @@ struct fastrpc_channel_ctx { >> struct qcom_scm_vmperm vmperms[FASTRPC_MAX_VMIDS]; >> struct rpmsg_device *rpdev; >> struct fastrpc_session_ctx session[FASTRPC_MAX_SESSIONS]; >> + struct fastrpc_static_pd spd[FASTRPC_MAX_SPD]; >> spinlock_t lock; >> struct idr ctx_idr; >> struct list_head users; >> @@ -296,10 +320,12 @@ struct fastrpc_user { >> struct fastrpc_channel_ctx *cctx; >> struct fastrpc_session_ctx *sctx; >> struct fastrpc_buf *init_mem; >> + struct fastrpc_static_pd *spd; >> >> int tgid; >> int pd; >> bool is_secure_dev; >> + char *servloc_name; >> /* Lock for lists */ >> spinlock_t lock; >> /* lock for allocations */ >> @@ -1257,12 +1283,33 @@ static bool is_session_rejected(struct fastrpc_user *fl, bool unsigned_pd_reques >> return false; >> } >> >> +static struct fastrpc_static_pd *fastrpc_get_spd_session( >> + struct fastrpc_user *fl) >> +{ >> + int i; >> + struct fastrpc_static_pd *spd = NULL; >> + struct fastrpc_channel_ctx *cctx = fl->cctx; >> + >> + for (i = 0; i < FASTRPC_MAX_SPD ; i++) { >> + if (!cctx->spd[i].servloc_name) >> + continue; >> + if (!strcmp(fl->servloc_name, cctx->spd[i].servloc_name)) { >> + spd = &cctx->spd[i]; >> + spd->fl = fl; >> + break; >> + } >> + } >> + >> + return spd; >> +} >> + >> static int fastrpc_init_create_static_process(struct fastrpc_user *fl, >> char __user *argp) >> { >> struct fastrpc_init_create_static init; >> struct fastrpc_invoke_args *args; >> struct fastrpc_phy_page pages[1]; >> + struct fastrpc_static_pd *spd = NULL; >> char *name; >> int err; >> struct { >> @@ -1297,6 +1344,19 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl, >> goto err_name; >> } >> >> + fl->servloc_name = AUDIO_PDR_SERVICE_LOCATION_CLIENT_NAME; > Why are the audio and sensors sessions handled at different places? > What about the MDSP or CDSP restarts? Thanks for reviewing the patches, Dmitry. The remote methods for audio and sensors PD attach are different and that is why both are handled in different places. As for MDSP and CDSP, no static PDs are supported, hence, there is no requirement to handle static PD restarts there. Please let me know if you have any other queries. --Ekansh > >> + >> + spd = fastrpc_get_spd_session(fl); >> + if (!spd) { >> + err = -EUSERS; >> + goto err_name; >> + } >> + >> + if (!spd->ispdup) { >> + err = -ENOTCONN; >> + goto err_name; >> + } >> + fl->spd = spd; >> if (!fl->cctx->remote_heap) { >> err = fastrpc_remote_heap_alloc(fl, fl->sctx->dev, init.memlen, >> &fl->cctx->remote_heap); >> @@ -1688,6 +1748,7 @@ static int fastrpc_dmabuf_alloc(struct fastrpc_user *fl, char __user *argp) >> static int fastrpc_init_attach(struct fastrpc_user *fl, int pd) >> { >> struct fastrpc_invoke_args args[1]; >> + struct fastrpc_static_pd *spd = NULL; >> int tgid = fl->tgid; >> u32 sc; >> >> @@ -1697,6 +1758,22 @@ static int fastrpc_init_attach(struct fastrpc_user *fl, int pd) >> sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_ATTACH, 1, 0); >> fl->pd = pd; >> >> + if (pd == SENSORS_PD) { >> + if (fl->cctx->domain_id == ADSP_DOMAIN_ID) >> + fl->servloc_name = SENSORS_PDR_ADSP_SERVICE_LOCATION_CLIENT_NAME; >> + else if (fl->cctx->domain_id == SDSP_DOMAIN_ID) >> + fl->servloc_name = SENSORS_PDR_SLPI_SERVICE_LOCATION_CLIENT_NAME; >> + >> + spd = fastrpc_get_spd_session(fl); >> + if (!spd) >> + return -EUSERS; >> + >> + if (!spd->ispdup) >> + return -ENOTCONN; >> + >> + fl->spd = spd; >> + } >> + >> return fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, >> sc, &args[0]); >> } >> @@ -2172,6 +2249,64 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int cmd, >> return err; >> } >> >> +static void fastrpc_notify_users(struct fastrpc_user *user) >> +{ >> + struct fastrpc_invoke_ctx *ctx; >> + >> + spin_lock(&user->lock); >> + list_for_each_entry(ctx, &user->pending, node) { >> + ctx->retval = -EPIPE; >> + complete(&ctx->work); >> + } >> + spin_unlock(&user->lock); >> +} >> + >> +static void fastrpc_notify_pdr_drivers(struct fastrpc_channel_ctx *cctx, >> + char *servloc_name) >> +{ >> + struct fastrpc_user *fl; >> + unsigned long flags; >> + >> + spin_lock_irqsave(&cctx->lock, flags); >> + list_for_each_entry(fl, &cctx->users, user) { >> + if (fl->servloc_name && !strcmp(servloc_name, fl->servloc_name)) >> + fastrpc_notify_users(fl); >> + } >> + spin_unlock_irqrestore(&cctx->lock, flags); >> +} >> + >> +static void fastrpc_pdr_cb(int state, char *service_path, void *priv) >> +{ >> + struct fastrpc_static_pd *spd = (struct fastrpc_static_pd *)priv; >> + struct fastrpc_channel_ctx *cctx; >> + >> + if (!spd) >> + return; >> + >> + cctx = spd->cctx; >> + switch (state) { >> + case SERVREG_SERVICE_STATE_DOWN: >> + dev_info(&cctx->rpdev->dev, >> + "%s: %s (%s) is down for PDR on %s\n", >> + __func__, spd->spdname, >> + spd->servloc_name, >> + domains[cctx->domain_id]); >> + spd->ispdup = false; >> + fastrpc_notify_pdr_drivers(cctx, spd->servloc_name); >> + break; >> + case SERVREG_SERVICE_STATE_UP: >> + dev_info(&cctx->rpdev->dev, >> + "%s: %s (%s) is up for PDR on %s\n", >> + __func__, spd->spdname, >> + spd->servloc_name, >> + domains[cctx->domain_id]); >> + spd->ispdup = true; >> + break; >> + default: >> + break; >> + } >> +} >> + >> static const struct file_operations fastrpc_fops = { >> .open = fastrpc_device_open, >> .release = fastrpc_device_release, >> @@ -2291,6 +2426,39 @@ static int fastrpc_device_register(struct device *dev, struct fastrpc_channel_ct >> return err; >> } >> >> +static int fastrpc_setup_service_locator(struct fastrpc_channel_ctx *cctx, char *client_name, >> + char *service_name, char *service_path, int domain, int spd_session) >> +{ >> + int err = 0; >> + struct pdr_handle *handle = NULL; >> + struct pdr_service *service = NULL; >> + >> + /* Register the service locator's callback function */ >> + handle = pdr_handle_alloc(fastrpc_pdr_cb, &cctx->spd[spd_session]); >> + if (IS_ERR(handle)) { >> + err = PTR_ERR(handle); >> + goto bail; >> + } >> + cctx->spd[spd_session].pdrhandle = handle; >> + cctx->spd[spd_session].servloc_name = client_name; >> + cctx->spd[spd_session].spdname = service_path; >> + cctx->spd[spd_session].cctx = cctx; >> + service = pdr_add_lookup(handle, service_name, service_path); >> + if (IS_ERR(service)) { >> + err = PTR_ERR(service); >> + goto bail; >> + } >> + pr_info("fastrpc: %s: pdr_add_lookup enabled for %s (%s, %s)\n", >> + __func__, service_name, client_name, service_path); >> + >> +bail: >> + if (err) { >> + pr_warn("fastrpc: %s: failed for %s (%s, %s)with err %d\n", >> + __func__, service_name, client_name, service_path, err); >> + } >> + return err; >> +} >> + >> static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) >> { >> struct device *rdev = &rpdev->dev; >> @@ -2369,6 +2537,25 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) >> goto fdev_error; >> } >> >> + if (domain_id == ADSP_DOMAIN_ID) { >> + err = fastrpc_setup_service_locator(data, AUDIO_PDR_SERVICE_LOCATION_CLIENT_NAME, >> + AUDIO_PDR_ADSP_SERVICE_NAME, ADSP_AUDIOPD_NAME, domain_id, 0); >> + if (err) >> + goto populate_error; >> + >> + err = fastrpc_setup_service_locator(data, >> + SENSORS_PDR_ADSP_SERVICE_LOCATION_CLIENT_NAME, >> + SENSORS_PDR_ADSP_SERVICE_NAME, ADSP_SENSORPD_NAME, domain_id, 1); >> + if (err) >> + goto populate_error; >> + } else if (domain_id == SDSP_DOMAIN_ID) { >> + err = fastrpc_setup_service_locator(data, >> + SENSORS_PDR_SLPI_SERVICE_LOCATION_CLIENT_NAME, >> + SENSORS_PDR_SLPI_SERVICE_NAME, SLPI_SENSORPD_NAME, domain_id, 0); >> + if (err) >> + goto populate_error; >> + } >> + >> kref_init(&data->refcount); >> >> dev_set_drvdata(&rpdev->dev, data); >> @@ -2397,23 +2584,12 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) >> return err; >> } >> >> -static void fastrpc_notify_users(struct fastrpc_user *user) >> -{ >> - struct fastrpc_invoke_ctx *ctx; >> - >> - spin_lock(&user->lock); >> - list_for_each_entry(ctx, &user->pending, node) { >> - ctx->retval = -EPIPE; >> - complete(&ctx->work); >> - } >> - spin_unlock(&user->lock); >> -} >> - >> static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev) >> { >> struct fastrpc_channel_ctx *cctx = dev_get_drvdata(&rpdev->dev); >> struct fastrpc_user *user; >> unsigned long flags; >> + int i; >> >> /* No invocations past this point */ >> spin_lock_irqsave(&cctx->lock, flags); >> @@ -2431,6 +2607,11 @@ static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev) >> if (cctx->remote_heap) >> fastrpc_buf_free(cctx->remote_heap); >> >> + for (i = 0; i < FASTRPC_MAX_SPD; i++) { >> + if (cctx->spd[i].pdrhandle) >> + pdr_handle_release(cctx->spd[i].pdrhandle); >> + } >> + >> of_platform_depopulate(&rpdev->dev); >> >> fastrpc_channel_ctx_put(cctx); >> -- >> 2.43.0 >>