From patchwork Wed Nov 13 21:29:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Pallardy X-Patchwork-Id: 179351 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp10166223ilf; Wed, 13 Nov 2019 13:29:21 -0800 (PST) X-Google-Smtp-Source: APXvYqz1Wdp40FlZIBS7IHWWW/Kcw7FPruFl0ppSDBdqpqbU14P3aeI68+3IUOjb9gEoT/jFU/9n X-Received: by 2002:a50:898a:: with SMTP id g10mr6122525edg.191.1573680561511; Wed, 13 Nov 2019 13:29:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573680561; cv=none; d=google.com; s=arc-20160816; b=nEFrDks95qSaxNPEArV/f1YYUWDpy5tvvMohmQBxr9C0oU4cJyHBlTbIKBEA7GInzB 4A0R9OKyOry+ElrGiBTWw2hyU3X9EbNrMn3Fu2gXJRy8+oxFgDz3wUZuyfwyqOpxthoZ PiJqK00tDiKDcsDM6zVeWdIKMu6QC7cj1bwWcEyF73ABQc02NXrvlqfAGmZ6LhpgzXlf tpND3/wdAyiewLWeZEImyH71gyzhW5E4OIN6m0byGLQG7lJwv9en/k05SpHOLQOruNYU Yns5Xa4GNfKxQ+rg8JZf44tB1qczXcPQAVt5WBo+fVE3XoORrIeEmlc7h1yxJt/BjGLC 3S9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:dkim-signature; bh=UYdORNaeQGoQRwSYl88Q/xJPX8aHa8RKojqFS2T62x4=; b=e69FwNNOaRBBbIB7xPWk2cfD/KDCX0eXa/2v6WVPgGAQchx1AoceuWWiX/DJTkxJEI Amt1MFyFYxzzFjhNjPj1ZP5DSWoEdjjC31C5F5VF+c+cy+1bGHoaUOVld/qZcw2D9w1B dDhpUKqWJdu88UzDwpkK54f2kK5XnMwS1Bgww0fKQQevJYLb8vCCBBzRO7SPZY5JH0xF aNMYbH36RRqnQNByIQGx0Fc18VJyEZhTtDcCxJkl24OGl8zZJfkj5iD2t0KwQqUsiPQJ MBMTfF5oCzd74cEj5FLRLH2hPjgTepVAlLbVVhk74ZoY9HmKz27ibhoVCXEh00Bp0OGi AgHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@st.com header.s=STMicroelectronics header.b=FIQeyhOX; 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=st.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d51si2293426ede.168.2019.11.13.13.29.21; Wed, 13 Nov 2019 13:29:21 -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=@st.com header.s=STMicroelectronics header.b=FIQeyhOX; 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=st.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726980AbfKMV3R (ORCPT + 26 others); Wed, 13 Nov 2019 16:29:17 -0500 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:59458 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726162AbfKMV3R (ORCPT ); Wed, 13 Nov 2019 16:29:17 -0500 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id xADLRpxg019835; Wed, 13 Nov 2019 22:29:10 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=st.com; h=from : to : cc : subject : date : message-id : mime-version : content-type; s=STMicroelectronics; bh=UYdORNaeQGoQRwSYl88Q/xJPX8aHa8RKojqFS2T62x4=; b=FIQeyhOXR32FbT/TSLLePxluV2Aj/rP86ZAP2GqOfXW6SIRCiu3Ta9jNGi0B/e8RFtkd SPxgUtxZ950xGdx6+76ZNu7dCbpzODYKX/mPiAH359ZWXjcO7TQlbzC79qCR9W2a6sxe jNVxuK1Wgjn5VLvvNf601JdK7Nb/EkH88ZEqNglTzHkIe4uKn3UWmQ2hwYTSkKEGnYDs sFce304RlCmnotgx9yaUQDj/zRRKnVteK044C2LlQeW+5WTg09fpEO8C5R6hDR3egccg 2HuLSijTjq5D2K67PpouesOyuVLL5VOpWyCCj3xzsSuS2rKkQz/ZLQXX5Gw4V9oaOGHY VA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 2w7psjtbac-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 13 Nov 2019 22:29:10 +0100 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 3D21E10002A; Wed, 13 Nov 2019 22:29:09 +0100 (CET) Received: from Webmail-eu.st.com (sfhdag7node2.st.com [10.75.127.20]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 28C792062B8; Wed, 13 Nov 2019 22:29:09 +0100 (CET) Received: from localhost (10.75.127.47) by SFHDAG7NODE2.st.com (10.75.127.20) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Wed, 13 Nov 2019 22:29:08 +0100 From: Loic Pallardy To: , CC: , , , , , , Loic Pallardy Subject: [PATCH v3 1/1] remoteproc: add support for co-processor loaded and booted before kernel Date: Wed, 13 Nov 2019 22:29:03 +0100 Message-ID: <1573680543-39086-1-git-send-email-loic.pallardy@st.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 X-Originating-IP: [10.75.127.47] X-ClientProxiedBy: SFHDAG7NODE1.st.com (10.75.127.19) To SFHDAG7NODE2.st.com (10.75.127.20) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.95, 18.0.572 definitions=2019-11-13_05:2019-11-13, 2019-11-13 signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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(-) -- 2.7.4 Acked-by: Mathieu Poirier 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"); /* * 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; };