Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp993881rwl; Wed, 29 Mar 2023 11:03:17 -0700 (PDT) X-Google-Smtp-Source: AKy350Zff1Z1FItDukBjpE3vWDF648Cn5AdcnNVw2yL5sSwLyB3kfIPUeqFYFvcOuv6FyLvJL3dF X-Received: by 2002:a17:902:d2c9:b0:19e:6700:174 with SMTP id n9-20020a170902d2c900b0019e67000174mr24591448plc.25.1680112996933; Wed, 29 Mar 2023 11:03:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680112996; cv=none; d=google.com; s=arc-20160816; b=qg1kRdedjcsheeVe2kfztsa5q5i+AeGVAA7qwEfZQCRw0JLEN9k1j/KeHz2Dkte+oL Bw5wLpmqf4GgdsrFDCQBcShx1k6AO7nK71o4H3ZhUwnteX+nUChLwhS9clJxA4P5Xb7a essUcnZbyawFGv52ev5q1jpukwxXyoA5bsfocI5+f+X6k0HmHU+f6xKAIsDPrYlv7tF4 1LcQl4G4SYMygKsaGShbsp83mPxkklx/3K5TQyKRmdclnW6or/NoKyubKDhA+p8hdQx3 +GUVjxtRRkLG8Q0zNtE5QdBzm4r44aw0SgaZb4b4WJ3YDR61EjAxvKv6n62veUQK946a bnSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=OJ9nha7AgNmpmpnP4RutaTZzBRrwel6kV4lGuwfHlf8=; b=x+s/qnRhMllu2UxhcFQQcL2JNBdy5WDWVVnc+ZSWA6djxTwQPhV3hPmeWSb+gZKpCg Atx9lnYrwcU8XQGbUlzqKX3AQmeNVjfq4GnYQ39uHxzQGC43QJRXsGFYJ7ZQQlem8No4 NPcrNpR4ZnNnkMpamp829OIZe2gou1t6g5WugmXxSmtNGZ48CH65BuzSp3sLJ1x53XBD O8SUA6vRnlv8tc5PCPc8CzGf5XZZUGq14afdxPRrlfYHHA06djY2x+75vmqN0DWS0iXq sWlLwAMFEzTdUXphUpLSumzoluLLihzrXC8oI98BkalRTbTOQfCDgRHJA/mBlTFKObGc KQJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="aLjxdVe/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u12-20020a170902a60c00b0019ca806fc81si30972339plq.89.2023.03.29.11.03.02; Wed, 29 Mar 2023 11:03:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="aLjxdVe/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229835AbjC2R72 (ORCPT + 99 others); Wed, 29 Mar 2023 13:59:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53018 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229810AbjC2R70 (ORCPT ); Wed, 29 Mar 2023 13:59:26 -0400 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 372A54202 for ; Wed, 29 Mar 2023 10:59:22 -0700 (PDT) Received: by mail-wr1-x42c.google.com with SMTP id l12so16613161wrm.10 for ; Wed, 29 Mar 2023 10:59:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1680112760; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=OJ9nha7AgNmpmpnP4RutaTZzBRrwel6kV4lGuwfHlf8=; b=aLjxdVe/40YaHJHwB6i2tMNnpYc9l4e81zyuv2IPGWApYcCl/erSxKBA2of1bZBHSZ UXzeAjnb1qRkpNRTSjcO0qJ1SrrLsImL1FV2ltdJA66H0R9FFrnTOlufw5jfVbbWj4ls AahADSqGwloxFoHk+PS66/3/6lM0SD9rW8QvEuMILlXm3F8tanC8E2ZjxUCFFanEpa7r YEfVQbaqrqtzv7TfZbLbHdIpq/9Q4+QCC2q5QqBrZXEyPISFLZoBYpL5SzNUlScgqutK F4OpjyeZCMugC0eWcNDcDKMkzY4EXZP0Fshf/4PPBcbQ1PkXLJXg8EIFw4hOJBeVgRjh BX3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680112760; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=OJ9nha7AgNmpmpnP4RutaTZzBRrwel6kV4lGuwfHlf8=; b=HJA6tWSA1UpDUL+hVjC8BQF8nml9f7k+haBQsrvL0o8tO3DC4IAgxYX6xirFOL/kKd 3JEc/RCTaVk9ZpiwGNdBcfWNFgf9UEYvp/9Xr8sSN9coGNietjnhXyufwaAhnK3ni98L 6P0ceaA4ey06bvMUt38Igxw+TOVFc3UWTSyRnqdoE1NmGpjWThd//Ahp/m+VYNSvxs0/ AXLWeK8E3hoBWzvUfZ8tb+1FuClRjVQxcLs59TTZetdnlP2Er4Eaxemx8QUhVqdyDRIa lv6z0BaVC1/vE1xFUAoUD8Yje+0q6jJ2SE0sLitLI1PgGtoD0pW+0ckXbB3dWE9O+iBp GZvQ== X-Gm-Message-State: AAQBX9cig3B++9SA0gnW+2GVJ5puiIRcic6KLd6yT2TTvZ3GnmTwNGKK nFTb1vR/FHaJPBJjo+9yFTao0bG4GVqqQgj1BQDyuQ== X-Received: by 2002:adf:ec82:0:b0:2d4:167e:854d with SMTP id z2-20020adfec82000000b002d4167e854dmr4219882wrn.2.1680112760643; Wed, 29 Mar 2023 10:59:20 -0700 (PDT) MIME-Version: 1.0 References: <20230323062451.2925996-1-danishanwar@ti.com> <20230323062451.2925996-2-danishanwar@ti.com> <20230327205841.GA3158115@p14s> <9d4c7762-615b-0fbd-76d2-87156e691928@ti.com> In-Reply-To: <9d4c7762-615b-0fbd-76d2-87156e691928@ti.com> From: Mathieu Poirier Date: Wed, 29 Mar 2023 11:59:09 -0600 Message-ID: Subject: Re: [EXTERNAL] Re: [PATCH v5 1/5] soc: ti: pruss: Add pruss_get()/put() API To: Md Danish Anwar Cc: MD Danish Anwar , "Andrew F. Davis" , Suman Anna , Roger Quadros , Vignesh Raghavendra , Tero Kristo , Bjorn Andersson , Santosh Shilimkar , Nishanth Menon , linux-remoteproc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, srk@ti.com, devicetree@vger.kernel.org, netdev@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 27 Mar 2023 at 23:42, Md Danish Anwar wrote: > > Hi Mathieu, > > On 28/03/23 02:28, Mathieu Poirier wrote: > > Hi Danish > > > > On Thu, Mar 23, 2023 at 11:54:47AM +0530, MD Danish Anwar wrote: > >> From: Tero Kristo > >> > >> Add two new get and put API, pruss_get() and pruss_put() to the > >> PRUSS platform driver to allow client drivers to request a handle > >> to a PRUSS device. This handle will be used by client drivers to > >> request various operations of the PRUSS platform driver through > >> additional API that will be added in the following patches. > >> > >> The pruss_get() function returns the pruss handle corresponding > >> to a PRUSS device referenced by a PRU remoteproc instance. The > >> pruss_put() is the complimentary function to pruss_get(). > >> > >> Co-developed-by: Suman Anna > >> Signed-off-by: Suman Anna > >> Signed-off-by: Tero Kristo > >> Co-developed-by: Grzegorz Jaszczyk > >> Signed-off-by: Grzegorz Jaszczyk > >> Signed-off-by: Puranjay Mohan > >> Signed-off-by: MD Danish Anwar > >> Reviewed-by: Roger Quadros > >> --- > >> drivers/remoteproc/pru_rproc.c | 2 +- > >> drivers/soc/ti/pruss.c | 60 ++++++++++++++++++- > >> .../{pruss_driver.h => pruss_internal.h} | 7 ++- > >> include/linux/remoteproc/pruss.h | 19 ++++++ > >> 4 files changed, 83 insertions(+), 5 deletions(-) > >> rename include/linux/{pruss_driver.h => pruss_internal.h} (90%) > >> > >> diff --git a/drivers/remoteproc/pru_rproc.c b/drivers/remoteproc/pru_rproc.c > >> index b76db7fa693d..4ddd5854d56e 100644 > >> --- a/drivers/remoteproc/pru_rproc.c > >> +++ b/drivers/remoteproc/pru_rproc.c > >> @@ -19,7 +19,7 @@ > >> #include > >> #include > >> #include > >> -#include > >> +#include > >> #include > >> > >> #include "remoteproc_internal.h" > >> diff --git a/drivers/soc/ti/pruss.c b/drivers/soc/ti/pruss.c > >> index 6882c86b3ce5..6c2bb02a521d 100644 > >> --- a/drivers/soc/ti/pruss.c > >> +++ b/drivers/soc/ti/pruss.c > >> @@ -6,6 +6,7 @@ > >> * Author(s): > >> * Suman Anna > >> * Andrew F. Davis > >> + * Tero Kristo > >> */ > >> > >> #include > >> @@ -16,8 +17,9 @@ > >> #include > >> #include > >> #include > >> -#include > >> +#include > >> #include > >> +#include > >> #include > >> > >> /** > >> @@ -30,6 +32,62 @@ struct pruss_private_data { > >> bool has_core_mux_clock; > >> }; > >> > >> +/** > >> + * pruss_get() - get the pruss for a given PRU remoteproc > >> + * @rproc: remoteproc handle of a PRU instance > >> + * > >> + * Finds the parent pruss device for a PRU given the @rproc handle of the > >> + * PRU remote processor. This function increments the pruss device's refcount, > >> + * so always use pruss_put() to decrement it back once pruss isn't needed > >> + * anymore. > >> + * > >> + * Return: pruss handle on success, and an ERR_PTR on failure using one > >> + * of the following error values > >> + * -EINVAL if invalid parameter > >> + * -ENODEV if PRU device or PRUSS device is not found > >> + */ > >> +struct pruss *pruss_get(struct rproc *rproc) > >> +{ > >> + struct pruss *pruss; > >> + struct device *dev; > >> + struct platform_device *ppdev; > >> + > >> + if (IS_ERR_OR_NULL(rproc)) > >> + return ERR_PTR(-EINVAL); > >> + > > > > There is no guarantee that @rproc is valid without calling rproc_get_by_handle() > > or pru_rproc_get(). > > > > Here in this API, we are checking if rproc is NULL or not. Also we are checking > is_pru_rproc() to make sure this rproc is pru-rproc only and not some other rproc. > > This API will be called from driver (icssg_prueth.c) which I'll post once this > series is merged. > > In the driver we are doing, > > prueth->pru[slice] = pru_rproc_get(np, pru, &pruss_id); > > pruss = pruss_get(prueth->pru[slice]); > > So, before calling pruss_get() we are in fact calling pru_rproc_get() to make > sure it's a valid rproc. > You are doing the right thing but because pruss_get() is exported globally, other people eventually using the interface may not be so rigorous. Add a comment to the pruss_get() function documentation clearly mentioning it is expected the caller will have done a pru_rproc_get() on @rproc. > I think in this API, these two checks (NULL check and is_pru_rproc) should be > OK as the driver is already calling pru_rproc_get() before this API. > > The only way to get a "pru-rproc" is by calling pru_rproc_get(), now the check > is_pru_rproc() will only be true if it is a "pru-rproc" implying > pru_rproc_get() was called before calling this API. > > Please let me know if this is OK or if any change is required. > > >> + dev = &rproc->dev; > >> + > >> + /* make sure it is PRU rproc */ > >> + if (!dev->parent || !is_pru_rproc(dev->parent)) > >> + return ERR_PTR(-ENODEV); > >> + > >> + ppdev = to_platform_device(dev->parent->parent); > >> + pruss = platform_get_drvdata(ppdev); > >> + if (!pruss) > >> + return ERR_PTR(-ENODEV); > >> + > >> + get_device(pruss->dev); > >> + > >> + return pruss; > >> +} > >> +EXPORT_SYMBOL_GPL(pruss_get); > >> + > >> +/** > >> + * pruss_put() - decrement pruss device's usecount > >> + * @pruss: pruss handle > >> + * > >> + * Complimentary function for pruss_get(). Needs to be called > >> + * after the PRUSS is used, and only if the pruss_get() succeeds. > >> + */ > >> +void pruss_put(struct pruss *pruss) > >> +{ > >> + if (IS_ERR_OR_NULL(pruss)) > >> + return; > >> + > >> + put_device(pruss->dev); > >> +} > >> +EXPORT_SYMBOL_GPL(pruss_put); > >> + > >> static void pruss_of_free_clk_provider(void *data) > >> { > >> struct device_node *clk_mux_np = data; > >> diff --git a/include/linux/pruss_driver.h b/include/linux/pruss_internal.h > >> similarity index 90% > >> rename from include/linux/pruss_driver.h > >> rename to include/linux/pruss_internal.h > >> index ecfded30ed05..8f91cb164054 100644 > >> --- a/include/linux/pruss_driver.h > >> +++ b/include/linux/pruss_internal.h > >> @@ -6,9 +6,10 @@ > >> * Suman Anna > >> */ > >> > >> -#ifndef _PRUSS_DRIVER_H_ > >> -#define _PRUSS_DRIVER_H_ > >> +#ifndef _PRUSS_INTERNAL_H_ > >> +#define _PRUSS_INTERNAL_H_ > >> > >> +#include > >> #include > >> > >> /* > >> @@ -51,4 +52,4 @@ struct pruss { > >> struct clk *iep_clk_mux; > >> }; > >> > >> -#endif /* _PRUSS_DRIVER_H_ */ > >> +#endif /* _PRUSS_INTERNAL_H_ */ > >> diff --git a/include/linux/remoteproc/pruss.h b/include/linux/remoteproc/pruss.h > >> index 039b50d58df2..93a98cac7829 100644 > >> --- a/include/linux/remoteproc/pruss.h > >> +++ b/include/linux/remoteproc/pruss.h > >> @@ -4,12 +4,14 @@ > >> * > >> * Copyright (C) 2015-2022 Texas Instruments Incorporated - http://www.ti.com > >> * Suman Anna > >> + * Tero Kristo > >> */ > >> > >> #ifndef __LINUX_PRUSS_H > >> #define __LINUX_PRUSS_H > >> > >> #include > >> +#include > >> #include > >> > >> #define PRU_RPROC_DRVNAME "pru-rproc" > >> @@ -44,6 +46,23 @@ enum pru_ctable_idx { > >> > >> struct device_node; > >> struct rproc; > >> +struct pruss; > >> + > >> +#if IS_ENABLED(CONFIG_TI_PRUSS) > >> + > >> +struct pruss *pruss_get(struct rproc *rproc); > >> +void pruss_put(struct pruss *pruss); > >> + > >> +#else > >> + > >> +static inline struct pruss *pruss_get(struct rproc *rproc) > >> +{ > >> + return ERR_PTR(-EOPNOTSUPP); > >> +} > >> + > >> +static inline void pruss_put(struct pruss *pruss) { } > >> + > >> +#endif /* CONFIG_TI_PRUSS */ > >> > >> #if IS_ENABLED(CONFIG_PRU_REMOTEPROC) > >> > >> -- > >> 2.25.1 > >> > > -- > Thanks and Regards, > Danish.