Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3437895pxj; Mon, 7 Jun 2021 10:33:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwKcNTzQKRDyf8GxDaQAbG4wKPosSd4TAFp9oxlc2HBg3gfbD/BpkFJ518R2WUHBRy2EmHa X-Received: by 2002:a17:906:606:: with SMTP id s6mr18693210ejb.206.1623087216071; Mon, 07 Jun 2021 10:33:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623087216; cv=none; d=google.com; s=arc-20160816; b=XtI2CwTj1yjFs/+UKqaaAUbz/SPs16DgA1NK+NbDXiOjlNNLf9gFLPSE38Ake0q7fc LMUDdHqZxpocJEOz7v++lstPo1WDG5pYmgocOuckJVkrHT2hMcTb+IsPG+mTg0OFIt32 K9IxofXfgf3Rykn3zJcN/QfDkwNY59KTEky4JZlKHm6scOP4fhHr/blgPZnPuLWiKrKP JY2qOW1vJUsnW8Vm2OKjZCs2Q9FlkzeP9bgi2Kyon7HPI8fSd5Qer6aTTgjHANt+0xnt 8Qk6CihP9vRCbb9En4fZlN9xjS3BB1mg6u/BVXwJC8h/B1hvhy1NWCSM+tfR7HgRpiqt 4nzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=DTPxou9O3x4hpFIhF9potn4n7ONthxykZAX9naEsmZA=; b=tkLNovYgK1r33nBYLS8Z6Lovs+04hGKSXJ8p8j8UChemiI2Q9rP8zCOSBZiR8Z75zn BNDL0iWVlJ4PNVrTokTZJ2cRq4AKWFI2eeGVx5I7yutXOZGEVu2ukcZSNW0te1J2H18h RXwMKzGX6ogfKE83kEfX6vlMDtmRxcCUhEC1pHrhdIG5QLS5eW4Sdlw0lYhNS1X4Kp83 Jjs7x/InJ1NJAT9Sg3xechLtMpQroWMk8fSKr+zPdCvbUbNWuRyT2RdSHh2tw2fN81y0 syJcp1bJ3g3wiKhTx/nwcjaTDfl0bIv0i2lNGGdvK7lEselByvmHtNEBhEkQLL3DRjKO Qw8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=sbXmaJN8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=foss.st.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e27si14045859ejl.653.2021.06.07.10.33.11; Mon, 07 Jun 2021 10:33:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=sbXmaJN8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=foss.st.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231542AbhFGRcw (ORCPT + 99 others); Mon, 7 Jun 2021 13:32:52 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:1100 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230458AbhFGRcn (ORCPT ); Mon, 7 Jun 2021 13:32:43 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 157HM92X016569; Mon, 7 Jun 2021 19:30:40 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=DTPxou9O3x4hpFIhF9potn4n7ONthxykZAX9naEsmZA=; b=sbXmaJN8YRLwosnEiafg9uyyVxqsrGYG5CSjbc9PbwvxJdzUngaqzg9TIaAY/VQku8KV PNGoIwvcKX9oS2TT9sz+QfRsUb3Nhn3cwa5ylytjNsnrwFmxroKQHqXDilssXtGTeZ45 F/5H5KTCaTpbZFz0qFRg/SCV1Ux25qSv+u7hxGAykfA7x249z6k2b2YGZVDlScHxDTga Ovq2jao7vJQyGSeoS0sxkw8fxVaVbLYXxxoG0sEnxlHJUpr8tDjXYdXZ8S3Kw1S7HzH4 yPHABuKIKlo2HJ0Yay9cnRvnvYljW50JG3D9gT9Fc8AQ7DA57uROjX2WD+aXzTf0Ym7W 6g== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 391evfbb28-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 07 Jun 2021 19:30:40 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 49C46100034; Mon, 7 Jun 2021 19:30:38 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node3.st.com [10.75.127.6]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 29CDD21986D; Mon, 7 Jun 2021 19:30:38 +0200 (CEST) Received: from localhost (10.75.127.51) by SFHDAG2NODE3.st.com (10.75.127.6) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 7 Jun 2021 19:30:37 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , , Subject: [PATCH 1/4] rpmsg: Introduce rpmsg_create_default_ept function Date: Mon, 7 Jun 2021 19:30:29 +0200 Message-ID: <20210607173032.30133-2-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210607173032.30133-1-arnaud.pouliquen@foss.st.com> References: <20210607173032.30133-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.75.127.51] X-ClientProxiedBy: SFHDAG2NODE1.st.com (10.75.127.4) To SFHDAG2NODE3.st.com (10.75.127.6) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.761 definitions=2021-06-07_14:2021-06-04,2021-06-07 signatures=0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The rpmsg devices can be probed without default endpoint. This function provides the capability for rpmsg drivers to create a default endpoint on runtime. For example, a driver might want the rpmsg core dispatcher to drop its messages until it is ready to process them. In this case, the driver will create the default endpoint when the conditions are met to process the messages. Signed-off-by: Arnaud Pouliquen --- drivers/rpmsg/rpmsg_core.c | 51 ++++++++++++++++++++++++++++++++++++++ include/linux/rpmsg.h | 14 +++++++++++ 2 files changed, 65 insertions(+) diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c index e5daee4f9373..07b680bda61f 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/rpmsg_core.c @@ -115,6 +115,57 @@ struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev, } EXPORT_SYMBOL(rpmsg_create_ept); +/** + * rpmsg_create_default_ept() - create a default rpmsg_endpoint for a rpmsg device + * @rpdev: rpmsg channel device + * @cb: rx callback handler + * @priv: private data for the driver's use + * @chinfo: channel_info with the local rpmsg address to bind with @cb + * + * On register_rpmsg_driver if no callback is provided in the rpmsg_driver structure, + * no endpoint is created when the device is probed by the rpmsg bus. + * + * This function returns a pointer to the default endpoint if already created or creates + * a endpoint and assign it as the default endpoint of the rpmsg device. + * + * Drivers should provide their @rpdev channel (so the new endpoint would belong + * to the same remote processor their channel belongs to), an rx callback + * function, an optional private data (which is provided back when the + * rx callback is invoked), and an address they want to bind with the + * callback. If @addr is RPMSG_ADDR_ANY, then rpmsg_create_ept will + * dynamically assign them an available rpmsg address (drivers should have + * a very good reason why not to always use RPMSG_ADDR_ANY here). + * + * Returns a pointer to the endpoint on success, or NULL on error. + */ +struct rpmsg_endpoint *rpmsg_create_default_ept(struct rpmsg_device *rpdev, + rpmsg_rx_cb_t cb, void *priv, + struct rpmsg_channel_info chinfo) +{ + struct rpmsg_endpoint *ept; + + if (WARN_ON(!rpdev)) + return NULL; + + /* It does not make sense to create a default endpoint without a callback. */ + if (!cb) + return NULL; + + if (rpdev->ept) + return rpdev->ept; + + ept = rpdev->ops->create_ept(rpdev, cb, priv, chinfo); + if (!ept) + return NULL; + + /* Assign the new endpoint as default endpoint */ + rpdev->ept = ept; + rpdev->src = ept->addr; + + return ept; +} +EXPORT_SYMBOL(rpmsg_create_default_ept); + /** * rpmsg_destroy_ept() - destroy an existing rpmsg endpoint * @ept: endpoing to destroy diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h index d97dcd049f18..ab034061722c 100644 --- a/include/linux/rpmsg.h +++ b/include/linux/rpmsg.h @@ -172,6 +172,9 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *); struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *, rpmsg_rx_cb_t cb, void *priv, struct rpmsg_channel_info chinfo); +struct rpmsg_endpoint *rpmsg_create_default_ept(struct rpmsg_device *rpdev, + rpmsg_rx_cb_t cb, void *priv, + struct rpmsg_channel_info chinfo); int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len); int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst); @@ -234,6 +237,17 @@ static inline struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev return ERR_PTR(-ENXIO); } +static inline struct rpmsg_endpoint *rpmsg_create_default_ept(struct rpmsg_device *rpdev, + rpmsg_rx_cb_t cb, + void *priv, + struct rpmsg_channel_info chinfo) +{ + /* This shouldn't be possible */ + WARN_ON(1); + + return NULL; +} + static inline int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len) { /* This shouldn't be possible */ -- 2.17.1