From patchwork Mon Apr 6 11:33:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikita Shubin X-Patchwork-Id: 11475297 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 61F2F112C for ; Mon, 6 Apr 2020 11:32:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 408BA2072A for ; Mon, 6 Apr 2020 11:32:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=maquefel.me header.i=@maquefel.me header.b="qWUrR2VS" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727181AbgDFLcN (ORCPT ); Mon, 6 Apr 2020 07:32:13 -0400 Received: from forward103p.mail.yandex.net ([77.88.28.106]:42809 "EHLO forward103p.mail.yandex.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726858AbgDFLcN (ORCPT ); Mon, 6 Apr 2020 07:32:13 -0400 Received: from mxback8g.mail.yandex.net (mxback8g.mail.yandex.net [IPv6:2a02:6b8:0:1472:2741:0:8b7:169]) by forward103p.mail.yandex.net (Yandex) with ESMTP id 76EF718C041F; Mon, 6 Apr 2020 14:32:10 +0300 (MSK) Received: from iva6-add863d6e49c.qloud-c.yandex.net (iva6-add863d6e49c.qloud-c.yandex.net [2a02:6b8:c0c:7ea0:0:640:add8:63d6]) by mxback8g.mail.yandex.net (mxback/Yandex) with ESMTP id N5wck4Svr5-WA8eClK8; Mon, 06 Apr 2020 14:32:10 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maquefel.me; s=mail; t=1586172730; bh=gn4X4dwb/lGc1aff1jWlSmhgRv7I3Jq+82nqfbVnrDA=; h=In-Reply-To:Subject:To:From:Cc:References:Date:Message-Id; b=qWUrR2VSCnrWGTRWQGPGQAw6W6+Aq9M0i/MerQPIsUY5nyH33Sdp+3qw7WGMpjxeU BYYs6faqIwlD/cdSBngdUpIMoluVQCgNF1NJC+aX/mJtY9wnan4VwMHxjuXVP7FCts KAHBOITctctnR3pSW3FH5BUq6moTJyxpWFGkjC7U= Authentication-Results: mxback8g.mail.yandex.net; dkim=pass header.i=@maquefel.me Received: by iva6-add863d6e49c.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id CHTIIrjdik-W92uoY3j; Mon, 06 Apr 2020 14:32:09 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) From: nikita.shubin@maquefel.me To: nikita.shubin@maquefel.me Cc: Nikita Shubin , Ohad Ben-Cohen , Bjorn Andersson , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , linux-remoteproc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] remoteproc: imx_rproc: set pc on start Date: Mon, 6 Apr 2020 14:33:08 +0300 Message-Id: <20200406113310.3041-2-nikita.shubin@maquefel.me> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200406113310.3041-1-nikita.shubin@maquefel.me> References: <20200304142628.8471-1-NShubin@topcon.com> <20200406113310.3041-1-nikita.shubin@maquefel.me> MIME-Version: 1.0 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org In case elf file interrupt vector is not supposed to be at OCRAM_S, it is needed to write elf entry point to OCRAM_S + 0x4, to boot M4 firmware. Otherwise firmware located anywhere besides OCRAM_S won't boot. The firmware must set stack poiner as first instruction: Reset_Handler: ldr sp, = __stack /* set stack pointer */ Signed-off-by: Nikita Shubin --- drivers/remoteproc/imx_rproc.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c index 3e72b6f38d4b..bebc58d0f711 100644 --- a/drivers/remoteproc/imx_rproc.c +++ b/drivers/remoteproc/imx_rproc.c @@ -45,6 +45,8 @@ #define IMX7D_RPROC_MEM_MAX 8 +#define IMX_BOOT_PC 0x4 + /** * struct imx_rproc_mem - slim internal memory structure * @cpu_addr: MPU virtual address of the memory region @@ -85,6 +87,7 @@ struct imx_rproc { const struct imx_rproc_dcfg *dcfg; struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX]; struct clk *clk; + void __iomem *bootreg; }; static const struct imx_rproc_att imx_rproc_att_imx7d[] = { @@ -162,11 +165,16 @@ static int imx_rproc_start(struct rproc *rproc) struct device *dev = priv->dev; int ret; + /* write entry point to program counter */ + writel(rproc->bootaddr, priv->bootreg); + ret = regmap_update_bits(priv->regmap, dcfg->src_reg, dcfg->src_mask, dcfg->src_start); if (ret) dev_err(dev, "Failed to enable M4!\n"); + dev_info(&rproc->dev, "Started from 0x%x\n", rproc->bootaddr); + return ret; } @@ -182,6 +190,9 @@ static int imx_rproc_stop(struct rproc *rproc) if (ret) dev_err(dev, "Failed to stop M4!\n"); + /* clear entry points */ + writel(0, priv->bootreg); + return ret; } @@ -243,7 +254,8 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, int len) static const struct rproc_ops imx_rproc_ops = { .start = imx_rproc_start, .stop = imx_rproc_stop, - .da_to_va = imx_rproc_da_to_va, + .da_to_va = imx_rproc_da_to_va, + .get_boot_addr = rproc_elf_get_boot_addr, }; static int imx_rproc_addr_init(struct imx_rproc *priv, @@ -360,6 +372,8 @@ static int imx_rproc_probe(struct platform_device *pdev) goto err_put_rproc; } + priv->bootreg = imx_rproc_da_to_va(rproc, IMX_BOOT_PC, sizeof(u32)); + /* * clk for M4 block including memory. Should be * enabled before .start for FW transfer.