Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp5000753ybc; Fri, 15 Nov 2019 13:14:38 -0800 (PST) X-Google-Smtp-Source: APXvYqxnOGbIr2jtrI0wYmspj0tBngFbmfqmzvQJD5yM/fevFZ3fsaVzYyzE/2b+Y2TMS5orOB8X X-Received: by 2002:a17:906:4e83:: with SMTP id v3mr3906196eju.246.1573852478346; Fri, 15 Nov 2019 13:14:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573852478; cv=none; d=google.com; s=arc-20160816; b=E1rMoln2sLNEqm4xfv/sIrv1AoB05Di+6T+tiWQqW6CSVqpye+hZ24ibLzWcG+TI9X vDm02sCuNCOPWbGjiAw9GQcaXmR92WAEUDLym3kybE7p9GT9Tc9hHxqJXfarc20Dm8l3 QCMyAx+Kx5R0RG8Fe/FAaX2Bt/KKn/lffAaDlB7ftLahANl8tiZ1WmKh5765+1F/G0E+ S4nyxTeG2OkaX04LMRlPtHW4w5q8bv6fTss3ejfcKFYaTUexO5G7RUISFDmRx+NksTVY vu9zK49EowqQoAAaedsUiuR1RdxvZMwZ3HvCX0uxdNqzNnubCoYq+MRPBd+5UnHZR9FE nXyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=K8qRRdDVOJ2xu8KBi98E5RGZhtFOj+R45HMgOd4adps=; b=Eak9g3alBX3U+Gyek3tEC4Rel1ACYFXkOjstSQMS+nDIFjzBn8YRQkm4oDtewym2GV Wy4vp8lxInUXF2rG00TMlrxrK3kNqNwz8ilMghF907WbfHV2jjHqvjvx4Dqdou9qpM53 ekmaWMUfjj1FTksrM/6n8N47QgY1bHRQgk9uBem+aE4dFnHY8DHBEIRVqKhRoISdgO7p QipV2aem4IbGjoThDQTfA/gHxn7eLRQknvCgb8reD+mmGa4jKwiGgkCq/IzNc13tNF6B xpVNPNbTYvoAVm2C+5nhBpL1zHxQNupQXQXCsrXA91RRhwT/hxQnjZw3Nj7CSAWhQJR3 kQYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=YTRt8W8R; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a17si6374554ejy.302.2019.11.15.13.14.13; Fri, 15 Nov 2019 13:14:38 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=YTRt8W8R; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1727306AbfKOVNC (ORCPT + 99 others); Fri, 15 Nov 2019 16:13:02 -0500 Received: from mail-io1-f68.google.com ([209.85.166.68]:35323 "EHLO mail-io1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727291AbfKOVNA (ORCPT ); Fri, 15 Nov 2019 16:13:00 -0500 Received: by mail-io1-f68.google.com with SMTP id x21so11975611ior.2 for ; Fri, 15 Nov 2019 13:13:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=K8qRRdDVOJ2xu8KBi98E5RGZhtFOj+R45HMgOd4adps=; b=YTRt8W8RB+3JupukO1+edrrdO58VVKh3lYLrAE7eOWwNB4S199kLz8esoZpXiyzd61 /caciTK/qGbwnphEaxbyTjUREegWs/rU+oOA3brfEbLDzsubl9cNsjbEM1h1YUykwwAh wTh9cxduLi20z2vlNj60xAF+zaWrEJ6v6hlVQPz+hvf6AH/QnN7YDttpJ0Wuk5NKhNfG NX8MkhsDSKMH87PKdI4ZdKtayia3H+8mqxL7Nbvm86+VMKX5bAro8LfU93KVHmN0M6GW gJ1fefJJ036dBLC3jcsrsLsCGtq0k38ANf2eY8A2t+mJas0WT75Eg7AH4LlS4eJ7iZbB t9Rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=K8qRRdDVOJ2xu8KBi98E5RGZhtFOj+R45HMgOd4adps=; b=Ik7/KFMNedkYm9BphHlo5VWXc0wFmNTCqsxE+yetxINInigOWWCTXFEgiaNDN+gVJj D1UOW7/+iEYexGSsZBewoQsq58POk75qF07MejRasdzJ+xzSuB74i2hrRi918OBQM0ad IudZsbaZVTspc/zPkYr4nIG9PZPAQ2seVOSM+OEJx1y6GV++0B8guB6ixoq3KkNjWJg/ vTCs4Lvj4SeeTSFvMCYbmKF0rX/Qy+8Kc+gI2KS2DQLrbL1MR2uuBcKEbqOZLhC+dGSg pnWetTrDD2+HGHK9uxnuMuIASMLuXw0YM8pP54jXWO5Im3a+5mVIEl7s4vnTbjh8gzBd gaYg== X-Gm-Message-State: APjAAAXgPdXykZbUL4UF5VhcSydbXRYX9kj7hLf7lp35brV8PIK93pu6 BVCryNZD54oDoS7Hsq9b0/Qs37OqijMg9EMHmLQMKg== X-Received: by 2002:a5e:9608:: with SMTP id a8mr2594936ioq.58.1573852379871; Fri, 15 Nov 2019 13:12:59 -0800 (PST) MIME-Version: 1.0 References: <1573680543-39086-1-git-send-email-loic.pallardy@st.com> <20191114181909.GA21402@xps15> <27c9d23478cf410481285182f9e42172@SFHDAG7NODE2.st.com> In-Reply-To: <27c9d23478cf410481285182f9e42172@SFHDAG7NODE2.st.com> From: Mathieu Poirier Date: Fri, 15 Nov 2019 14:12:49 -0700 Message-ID: Subject: Re: [PATCH v3 1/1] remoteproc: add support for co-processor loaded and booted before kernel To: Loic PALLARDY Cc: "bjorn.andersson@linaro.org" , "ohad@wizery.com" , "linux-remoteproc@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Arnaud POULIQUEN , "benjamin.gaignard@linaro.org" , Fabien DESSENNE , "s-anna@ti.com" Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 15 Nov 2019 at 08:27, Loic PALLARDY wrote: > > Hi Mathieu, > > > -----Original Message----- > > From: Mathieu Poirier > > Sent: jeudi 14 novembre 2019 19:19 > > To: Loic PALLARDY > > Cc: bjorn.andersson@linaro.org; ohad@wizery.com; linux- > > remoteproc@vger.kernel.org; linux-kernel@vger.kernel.org; Arnaud > > POULIQUEN ; benjamin.gaignard@linaro.org; > > Fabien DESSENNE ; s-anna@ti.com > > Subject: Re: [PATCH v3 1/1] remoteproc: add support for co-processor > > loaded and booted before kernel > > > > Hi Loic, > > > > On Wed, Nov 13, 2019 at 10:29:03PM +0100, Loic Pallardy wrote: > > > Remote processor could boot independently or be loaded/started before > > > Linux kernel by bootloader or any firmware. > > > This patch introduces a new property in rproc core, named skip_fw_load, > > > to be able to allocate resources and sub-devices like vdev and to > > > synchronize with current state without loading firmware from file system. > > > It is platform driver responsibility to implement the right firmware > > > load ops according to HW specificities. > > > > > > Signed-off-by: Loic Pallardy > > > > > > --- > > > Change from v2: > > > - rename property into skip_fw_load > > > - update rproc_boot and rproc_fw_boot description > > > - update commit message > > > Change from v1: > > > - Keep bool in struct rproc > > > --- > > > drivers/remoteproc/remoteproc_core.c | 51 > > +++++++++++++++++++++++++++--------- > > > include/linux/remoteproc.h | 2 ++ > > > 2 files changed, 40 insertions(+), 13 deletions(-) > > > > > > diff --git a/drivers/remoteproc/remoteproc_core.c > > b/drivers/remoteproc/remoteproc_core.c > > > index 3c5fbbbfb0f1..585cdca8b241 100644 > > > --- a/drivers/remoteproc/remoteproc_core.c > > > +++ b/drivers/remoteproc/remoteproc_core.c > > > @@ -1360,7 +1360,7 @@ static int rproc_start(struct rproc *rproc, const > > struct firmware *fw) > > > } > > > > > > /* > > > - * take a firmware and boot a remote processor with it. > > > + * Handle resources defined in resource table and start a remote > > processor. > > > */ > > > static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) > > > { > > > @@ -1372,7 +1372,11 @@ static int rproc_fw_boot(struct rproc *rproc, > > const struct firmware *fw) > > > if (ret) > > > return ret; > > > > > > - dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size); > > > + if (fw) > > > + dev_info(dev, "Booting fw image %s, size %zd\n", name, > > > + fw->size); > > > + else > > > + dev_info(dev, "Synchronizing with preloaded co- > > processor\n"); > > > > Here we assume that if @fw is NULL then the image is already loaded. The > > first > > question that comes to mind is if that means the ELF image has already been > > copied to the coprocessor's boot address. If that is the case it would be nice > > to make it explicit with a comment in the code. > > Yes, but will be better to test "skip_fw_load" properties to change display info message. I am good with the different dev_info() based on the value of @fw. > Anyway, agree to mention that if @fw is NULL that means fw considered as already loaded. If you have to do a respin then a clear explanation would be appreciated, especially since this is core code. If you don't go for a 4th iteration then leave it as is. > > > > Following the earlier comments made on the thread for this serie, I > > understand > > the rproc_ops fed to the core should provision for @fw being NULL. In > > this case though st_rproc_ops[1] reference a number of core operations that > > aren't tailored to handled a NULL @fw parameter. > > True, some patches will follow > > > > > I am pretty sure you're well aware of this and you have more patches to go > > with > > this one or said patches have already been published and I'm looking at the > > wrong tree. If that is the case would you mind making those patches public or > > pointing me to a repository somewhere? > > Please have a look here [1]. > The properties is named preloaded instead of skip_fw_load, but that's the same. I saw rproc::early_boot but the end result is indeed the same. > Impacted ops are working differently according to preloaded status. > > When skip_fw_load is true, no ELF image is used. Platform driver is in charge of providing resource table location somewhere in memory. > Somewhere is platform dependent. Thanks for letting me in on the bigger picture - things are much clearer now and I see where you're going. How the resource table is handled in stm32_rproc_elf_load_rsc_table() also answers my questions in that area. Acked-by: Mathieu Poirier > > Regards, > Loic > [1] https://github.com/STMicroelectronics/linux/blob/v4.19-stm32mp/drivers/remoteproc/stm32_rproc.c > > > > > I have other concerns about the specifics shared between the application > > and co > > processors using the ELF image but I'll wait for your reply to the above before > > addressing those. > > > > Regards, > > Mathieu > > > > [1]. https://elixir.bootlin.com/linux/v5.4- > > rc7/source/drivers/remoteproc/stm32_rproc.c#L470 > > > > > > > > /* > > > * if enabling an IOMMU isn't relevant for this rproc, this is > > > @@ -1719,16 +1723,22 @@ static void rproc_crash_handler_work(struct > > work_struct *work) > > > * rproc_boot() - boot a remote processor > > > * @rproc: handle of a remote processor > > > * > > > - * Boot a remote processor (i.e. load its firmware, power it on, ...). > > > + * Boot a remote processor (i.e. load its firmware, power it on, ...) from > > > + * different contexts: > > > + * - power off > > > + * - preloaded firmware > > > + * - started before kernel execution > > > + * The different operations are selected thanks to properties defined by > > > + * platform driver. > > > * > > > - * If the remote processor is already powered on, this function > > immediately > > > - * returns (successfully). > > > + * If the remote processor is already powered on at rproc level, this > > function > > > + * immediately returns (successfully). > > > * > > > * Returns 0 on success, and an appropriate error value otherwise. > > > */ > > > int rproc_boot(struct rproc *rproc) > > > { > > > - const struct firmware *firmware_p; > > > + const struct firmware *firmware_p = NULL; > > > struct device *dev; > > > int ret; > > > > > > @@ -1759,11 +1769,17 @@ int rproc_boot(struct rproc *rproc) > > > > > > dev_info(dev, "powering up %s\n", rproc->name); > > > > > > - /* load firmware */ > > > - ret = request_firmware(&firmware_p, rproc->firmware, dev); > > > - if (ret < 0) { > > > - dev_err(dev, "request_firmware failed: %d\n", ret); > > > - goto downref_rproc; > > > + if (!rproc->skip_fw_load) { > > > + /* load firmware */ > > > + ret = request_firmware(&firmware_p, rproc->firmware, > > dev); > > > + if (ret < 0) { > > > + dev_err(dev, "request_firmware failed: %d\n", ret); > > > + goto downref_rproc; > > > + } > > > + } else { > > > + /* set firmware name to null as unknown */ > > > + kfree(rproc->firmware); > > > + rproc->firmware = NULL; > > > } > > > > > > ret = rproc_fw_boot(rproc, firmware_p); > > > @@ -1917,8 +1933,17 @@ int rproc_add(struct rproc *rproc) > > > /* create debugfs entries */ > > > rproc_create_debug_dir(rproc); > > > > > > - /* if rproc is marked always-on, request it to boot */ > > > - if (rproc->auto_boot) { > > > + if (rproc->skip_fw_load) { > > > + /* > > > + * If rproc is marked already booted, no need to wait > > > + * for firmware. > > > + * Just handle associated resources and start sub devices > > > + */ > > > + ret = rproc_boot(rproc); > > > + if (ret < 0) > > > + return ret; > > > + } else if (rproc->auto_boot) { > > > + /* if rproc is marked always-on, request it to boot */ > > > ret = rproc_trigger_auto_boot(rproc); > > > if (ret < 0) > > > return ret; > > > diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h > > > index 16ad66683ad0..4fd5bedab4fa 100644 > > > --- a/include/linux/remoteproc.h > > > +++ b/include/linux/remoteproc.h > > > @@ -479,6 +479,7 @@ struct rproc_dump_segment { > > > * @table_sz: size of @cached_table > > > * @has_iommu: flag to indicate if remote processor is behind an MMU > > > * @auto_boot: flag to indicate if remote processor should be auto-started > > > + * @skip_fw_load: remote processor has been preloaded before start > > sequence > > > * @dump_segments: list of segments in the firmware > > > * @nb_vdev: number of vdev currently handled by rproc > > > */ > > > @@ -512,6 +513,7 @@ struct rproc { > > > size_t table_sz; > > > bool has_iommu; > > > bool auto_boot; > > > + bool skip_fw_load; > > > struct list_head dump_segments; > > > int nb_vdev; > > > }; > > > -- > > > 2.7.4 > > >