From patchwork Tue Aug 11 03:32:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Levinsky X-Patchwork-Id: 11708503 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 E7224618 for ; Tue, 11 Aug 2020 03:32:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CA6E2206DA for ; Tue, 11 Aug 2020 03:32:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="Wlb5z7Ci" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727951AbgHKDcj (ORCPT ); Mon, 10 Aug 2020 23:32:39 -0400 Received: from mail-dm6nam11on2081.outbound.protection.outlook.com ([40.107.223.81]:43232 "EHLO NAM11-DM6-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727901AbgHKDcZ (ORCPT ); Mon, 10 Aug 2020 23:32:25 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iRKCBlylXWtqWGYrZqBqR/Szl2O61pJzPoy+DrsSx0Lj+7YUNHZdNtvvULvDo1BgrGtLrHN4f/tPHg3JbUNiRBSqeNNNPdGXvF48E9zs5Y3v7X34PgUBLayzShmimv+KkwQOgWYncW1lAMiPYgnCg5i2vnuR15YnBHwIyouRu8Qisz2kbztRXoTI3MyY+9PAeAv0T2IwcC/Jh3R79Fowjq+qlsPMInQ0/Lh/FnuHUqgcl9GpKe9EXT4sUAlBZ12RNbOVyTJU6YwVsJsT8NrvGb4i/LKDGomJ28ZlZ1kl0+y9f2//O4d0GGsPyLH8IvOqFXCgRrBYCmecRpIuQJ70YQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bvpATgbAlOU7ZYV6eeiVH6RiPk6bYsAaWIhuUVinaak=; b=LEMkDwBlBYFCr1ogXBNkjwegM2jRrAl+jP7eN03lQoURITFcPWEd23lYUjoyeFPI6JDxZ/9VDyUGBXJIevj/Pfn18RiubRWOVLo5veV/cZvi/wzVrWZrwyfCXR+Fd6KbLnqg8hy/Xe4cbAe5jJM6ti6V1HUMvKyUQC194DdrDoiQrlirwCn7W2Z+qk2a1e+gUlIvwa+iymZrzZg2oX/OYeqwyhEWkPXzZFPDAxaDgAZLKFC2SNsvS3aPyZZosBvx2IVvKs3CPK6TSEG+FxFqjQGuvU6PfUn2HQkGrDtSSeAIX/ymBBjBDjrLn8zuCcsxFOL+7yVo7+uR7Umc+YFLnA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bvpATgbAlOU7ZYV6eeiVH6RiPk6bYsAaWIhuUVinaak=; b=Wlb5z7CiemcvfqeMj1RkUuQnxx7cJpX8MkPyv96zVxE4YdxKuDocngQwa8dkZ9Jx/07RN/5YwbH2fgggjIrHThCn2l+gpKu8FZSpLsKMRtwrzYT7U+oFmCIS4Y+KAfqS0bZR4rdHqVodLqrPDbrSIDatOt64R3DKEODdM0L2lvg= Received: from DM6PR06CA0015.namprd06.prod.outlook.com (2603:10b6:5:120::28) by MW2PR02MB3898.namprd02.prod.outlook.com (2603:10b6:907:9::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.20; Tue, 11 Aug 2020 03:32:22 +0000 Received: from CY1NAM02FT055.eop-nam02.prod.protection.outlook.com (2603:10b6:5:120:cafe::e9) by DM6PR06CA0015.outlook.office365.com (2603:10b6:5:120::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.20 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT055.mail.protection.outlook.com (10.152.74.80) with Microsoft SMTP Server id 15.20.3261.19 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 Received: from [149.199.38.66] (port=60899 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1k5L1K-0000i8-QD; Mon, 10 Aug 2020 20:32:14 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1k5L1R-0004hE-Cd; Mon, 10 Aug 2020 20:32:21 -0700 Received: from [172.19.2.206] (helo=xsjblevinsk50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1k5L1J-0004gc-4L; Mon, 10 Aug 2020 20:32:13 -0700 From: Ben Levinsky To: stefanos@xilinx.com, michals@xilinx.com Cc: devicetree@vger.kernel.org, mathieu.poirier@linaro.org, ed.mooring@xilinx.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, wendy.liang@xilinx.com, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v8 1/5] firmware: xilinx: Add ZynqMP firmware ioctl enums for RPU configuration. Date: Mon, 10 Aug 2020 20:32:09 -0700 Message-Id: <20200811033213.20088-2-ben.levinsky@xilinx.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200811033213.20088-1-ben.levinsky@xilinx.com> References: <20200811033213.20088-1-ben.levinsky@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: c747d442-96c4-4ce4-88c2-08d83da72832 X-MS-TrafficTypeDiagnostic: MW2PR02MB3898: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:565; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: mxmBLzBzK9hJ9QPK+5lllj/8eAeY3niWh5f0nW54Wmj4wnT2Li1Y4IzTXkgDcG9iF6SIVX3ytPwvsvo03APQm2FW4X8/Hv+7G/9fmfHc+qFiNdD1hE1SspLf5KMzaz0O5XkoedBE/hsY5iBDmG/v9K5aRksE4i5MOHDweacUmKjfJ9MUUZdUG+hUPYVhaQxWe4BLVytkw8SqrBsaacrmcqbH0YzWzl+SX/5fM4DYJB+Uk0yMKQVipi4+/mWwlPjHjDHnAqsGYiuKunay13QE7K/YwWLQVY+wEO5v9LQXkOTE2XnHT+C8c49dozt0DKX4uwPtuEPIEQRZnAal7hnBVELQZeoL1N+ZeYJeGL+V3ADhdizA2QYSGCEiFLtJ8JvqdbHAuMtQQ5bSqcdX92AISA== X-Forefront-Antispam-Report: CIP:149.199.60.83;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:xsj-pvapsmtpgw01;PTR:unknown-60-83.xilinx.com;CAT:NONE;SFTY:;SFS:(39860400002)(396003)(376002)(346002)(136003)(46966005)(356005)(186003)(7696005)(70206006)(336012)(81166007)(478600001)(70586007)(26005)(36756003)(82740400003)(4326008)(82310400002)(2616005)(8676002)(316002)(5660300002)(8936002)(2906002)(6666004)(83380400001)(1076003)(9786002)(426003)(6636002)(47076004)(44832011);DIR:OUT;SFP:1101; X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Aug 2020 03:32:21.6078 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c747d442-96c4-4ce4-88c2-08d83da72832 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: CY1NAM02FT055.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW2PR02MB3898 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Add ZynqMP firmware ioctl enums for RPU configuration. Signed-off-by: Ben Levinsky --- v3: - add xilinx-related platform mgmt fn's instead of wrapping around function pointer in xilinx eemi ops struct v4: - add default values for enums --- include/linux/firmware/xlnx-zynqmp.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 5968df82b991..bb347dfe4ba4 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -104,6 +104,10 @@ enum pm_ret_status { }; enum pm_ioctl_id { + IOCTL_GET_RPU_OPER_MODE = 0, + IOCTL_SET_RPU_OPER_MODE = 1, + IOCTL_RPU_BOOT_ADDR_CONFIG = 2, + IOCTL_TCM_COMB_CONFIG = 3, IOCTL_SD_DLL_RESET = 6, IOCTL_SET_SD_TAPDELAY, IOCTL_SET_PLL_FRAC_MODE, @@ -129,6 +133,21 @@ enum pm_query_id { PM_QID_CLOCK_GET_MAX_DIVISOR, }; +enum rpu_oper_mode { + PM_RPU_MODE_LOCKSTEP = 0, + PM_RPU_MODE_SPLIT = 1, +}; + +enum rpu_boot_mem { + PM_RPU_BOOTMEM_LOVEC = 0, + PM_RPU_BOOTMEM_HIVEC = 1, +}; + +enum rpu_tcm_comb { + PM_RPU_TCM_SPLIT = 0, + PM_RPU_TCM_COMB = 1, +}; + enum zynqmp_pm_reset_action { PM_RESET_ACTION_RELEASE, PM_RESET_ACTION_ASSERT, From patchwork Tue Aug 11 03:32:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Levinsky X-Patchwork-Id: 11708495 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 964EE618 for ; Tue, 11 Aug 2020 03:32:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 75EAF20756 for ; Tue, 11 Aug 2020 03:32:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="j7aItKRo" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727819AbgHKDc1 (ORCPT ); Mon, 10 Aug 2020 23:32:27 -0400 Received: from mail-dm6nam10on2056.outbound.protection.outlook.com ([40.107.93.56]:40289 "EHLO NAM10-DM6-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727900AbgHKDc0 (ORCPT ); Mon, 10 Aug 2020 23:32:26 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Zlp0axv1HjqQzp5yIcPJnyAySjBnEKkfQzL8nn5cOoX5WnZY9G6e4wJ+KkPnAEzdOIwLbGGIGuvSetuosOowwD6LZ4DjfpOQmIYeH+eiLYekPt7jBuzwK9Jr7P1uNd8Ug55yQBUskma5Houb3qtO89qYDRXgxxmf3ioycCPCYF1af3kiMuo7J86Wzk0LBCaDySVZH424LiUAvIXOcJkHnKJPzCUbKcT3pkRpiJIOKCzM+OddCNfUpl6lc2VI+4hKYUx8tDXtN4nl7AfsvtPacCDOAM8gwWgto9ccr97IXRihEVSIAGE6i/+cfrHl1mNkfEf9CdlD4etgmcQQHHGOjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9EychP24slpzsuKCLoFzJ9w+7fq5GOtH1Dn4VKU/9Hw=; b=Z7nxj77zBU4eKIIRGfl+ZQcPJh7k40LZ2jDFb0MpmWSemk1Fzj5zv1OtZ334K7Aw7ps+/zwfitGRNtwd5ODBq/6rUd1QvWInp6e9nI4lKNcYgglA/pTDsXoRjGglnFEw70WzQ8azSySAoAFnrdF9t7XFrDfXlNjnds8L5DpYCJmVzzwg/Wm/SjgsSiVOR4VK5Ky/JNVcupB0IjVqpBpGg9bgpH9bD77R8ApfNKWJyn97cN9Al78O+YWYG2SNodmSyodR1Qe+ivoA12HZuZLoV5u6rY7mrwF0EiblKdg2xSD9OCS+4aDrgyfE45D5FZim55DMTaEygYk/KqpOKanCZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9EychP24slpzsuKCLoFzJ9w+7fq5GOtH1Dn4VKU/9Hw=; b=j7aItKRoMBWFJsxOpV67SptXFmXYMV45RuvGXr33tY/8Nf8FrPrLMuynoELrcHxxgmxym25UFEopT9rsXpvjUyZcaKs9t+6w61OSnxzYNjGLviDChD93rBNiPfkXuONzEr7ZCFZvXWPs1/0cyIn1zNUs7QEJs9Yvni45KsRTS9s= Received: from DM6PR02CA0043.namprd02.prod.outlook.com (2603:10b6:5:177::20) by MW2PR02MB3884.namprd02.prod.outlook.com (2603:10b6:907:4::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.19; Tue, 11 Aug 2020 03:32:21 +0000 Received: from CY1NAM02FT009.eop-nam02.prod.protection.outlook.com (2603:10b6:5:177:cafe::c2) by DM6PR02CA0043.outlook.office365.com (2603:10b6:5:177::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.18 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT009.mail.protection.outlook.com (10.152.75.12) with Microsoft SMTP Server id 15.20.3261.19 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 Received: from [149.199.38.66] (port=60893 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1k5L1K-0000i2-La; Mon, 10 Aug 2020 20:32:14 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1k5L1R-0004hE-84; Mon, 10 Aug 2020 20:32:21 -0700 Received: from [172.19.2.206] (helo=xsjblevinsk50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1k5L1J-0004gc-63; Mon, 10 Aug 2020 20:32:13 -0700 From: Ben Levinsky To: stefanos@xilinx.com, michals@xilinx.com Cc: devicetree@vger.kernel.org, mathieu.poirier@linaro.org, ed.mooring@xilinx.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, wendy.liang@xilinx.com, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v8 2/5] firmware: xilinx: Add shutdown/wakeup APIs Date: Mon, 10 Aug 2020 20:32:10 -0700 Message-Id: <20200811033213.20088-3-ben.levinsky@xilinx.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200811033213.20088-1-ben.levinsky@xilinx.com> References: <20200811033213.20088-1-ben.levinsky@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 40123812-2e5b-4978-8a48-08d83da72827 X-MS-TrafficTypeDiagnostic: MW2PR02MB3884: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:4125; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: A0Huj5GOyMoNh1YWXT0E4KxJzWnJtqZi+nL3q8Xx3FVUBMaEniYxucuqi3r28vywmU9PqJpMCvbG40d49CKRegNRB2mkvq0vyaHVbkkTEMsQhtYFAU0pFdmddJhvoyBHxU/OowmTPi7k28dfdyQfRNOHeSbVpliaZCMh7K612N19Uu+wobEDDEAqTuejPmDJbQa+LKFzEknDFf7YZ4K6fjtKruGKGqRBTomaipH4RCrQYVWIYkesy41aOk80BOv7Ch34oP/yJz0RUcgQ7bPErrb6vn4x5lrmi/N/LWm9C/FzT2/wPMECKHD6CdOfCSLucOCkpvfKt70jmFvV1wndwRQ2Ulq39m0BzF3A8nEx3Kv5NuDnabsQtr3wTjzUR0GTKC0t39QQ9FnNifGmP/OV3g== X-Forefront-Antispam-Report: CIP:149.199.60.83;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:xsj-pvapsmtpgw01;PTR:unknown-60-83.xilinx.com;CAT:NONE;SFTY:;SFS:(136003)(39860400002)(346002)(396003)(376002)(46966005)(6636002)(8936002)(336012)(83380400001)(82740400003)(9786002)(82310400002)(5660300002)(81166007)(47076004)(356005)(2906002)(426003)(70206006)(2616005)(70586007)(44832011)(7696005)(478600001)(8676002)(186003)(1076003)(316002)(36756003)(4326008)(26005);DIR:OUT;SFP:1101; X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Aug 2020 03:32:21.5357 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 40123812-2e5b-4978-8a48-08d83da72827 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: CY1NAM02FT009.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW2PR02MB3884 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Add shutdown/wakeup a resource eemi operations to shutdown or bringup a resource. Signed-off-by: Ben Levinsky --- v3: - add xilinx-related platform mgmt fn's instead of wrapping around function pointer in xilinx eemi ops struct - fix formatting v4: - add default values for enumv3: - add xilinx-related platform mgmt fn's instead of wrapping around function pointer in xilinx eemi ops struct - fix formatting v4: - add default values for enum --- drivers/firmware/xilinx/zynqmp.c | 35 ++++++++++++++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 22 +++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 8d1ff2454e2e..f1a0bd35deeb 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -846,6 +846,41 @@ int zynqmp_pm_release_node(const u32 node) } EXPORT_SYMBOL_GPL(zynqmp_pm_release_node); +/** + * zynqmp_pm_force_powerdown - PM call to request for another PU or subsystem to + * be powered down forcefully + * @target: Node ID of the targeted PU or subsystem + * @ack: Flag to specify whether acknowledge is requested + * + * Return: status, either success or error+reason + */ +int zynqmp_pm_force_powerdown(const u32 target, + const enum zynqmp_pm_request_ack ack) +{ + return zynqmp_pm_invoke_fn(PM_FORCE_POWERDOWN, target, ack, 0, 0, NULL); +} +EXPORT_SYMBOL_GPL(zynqmp_pm_force_powerdown); + +/** + * zynqmp_pm_request_wakeup - PM call to wake up selected master or subsystem + * @node: Node ID of the master or subsystem + * @set_addr: Specifies whether the address argument is relevant + * @address: Address from which to resume when woken up + * @ack: Flag to specify whether acknowledge requested + * + * Return: status, either success or error+reason + */ +int zynqmp_pm_request_wakeup(const u32 node, + const bool set_addr, + const u64 address, + const enum zynqmp_pm_request_ack ack) +{ + /* set_addr flag is encoded into 1st bit of address */ + return zynqmp_pm_invoke_fn(PM_REQUEST_WAKEUP, node, address | set_addr, + address >> 32, ack, NULL); +} +EXPORT_SYMBOL_GPL(zynqmp_pm_request_wakeup); + /** * zynqmp_pm_set_requirement() - PM call to set requirement for PM slaves * @node: Node ID of the slave diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index bb347dfe4ba4..4d83a7d69c4c 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -64,6 +64,8 @@ enum pm_api_id { PM_GET_API_VERSION = 1, + PM_FORCE_POWERDOWN = 8, + PM_REQUEST_WAKEUP = 10, PM_SYSTEM_SHUTDOWN = 12, PM_REQUEST_NODE = 13, PM_RELEASE_NODE, @@ -376,6 +378,12 @@ int zynqmp_pm_write_pggs(u32 index, u32 value); int zynqmp_pm_read_pggs(u32 index, u32 *value); int zynqmp_pm_system_shutdown(const u32 type, const u32 subtype); int zynqmp_pm_set_boot_health_status(u32 value); +int zynqmp_pm_force_powerdown(const u32 target, + const enum zynqmp_pm_request_ack ack); +int zynqmp_pm_request_wakeup(const u32 node, + const bool set_addr, + const u64 address, + const enum zynqmp_pm_request_ack ack); #else static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void) { @@ -526,6 +534,20 @@ static inline int zynqmp_pm_set_boot_health_status(u32 value) { return -ENODEV; } + +static inline int zynqmp_pm_force_powerdown(const u32 target, + const enum zynqmp_pm_request_ack ack) +{ + return -ENODEV; +} + +static inline int zynqmp_pm_request_wakeup(const u32 node, + const bool set_addr, + const u64 address, + const enum zynqmp_pm_request_ack ack) +{ + return -ENODEV; +} #endif #endif /* __FIRMWARE_ZYNQMP_H__ */ From patchwork Tue Aug 11 03:32:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Levinsky X-Patchwork-Id: 11708497 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 97BE713A4 for ; Tue, 11 Aug 2020 03:32:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 72FC0206DA for ; Tue, 11 Aug 2020 03:32:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="hw14WBPC" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728246AbgHKDc1 (ORCPT ); Mon, 10 Aug 2020 23:32:27 -0400 Received: from mail-dm6nam11on2050.outbound.protection.outlook.com ([40.107.223.50]:21472 "EHLO NAM11-DM6-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727951AbgHKDc0 (ORCPT ); Mon, 10 Aug 2020 23:32:26 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Krt3met7FdpDjCBdxM9CxIFdl0CRZp9OjLaQy/MfYc8ChjeiNi8hdhNxfR1R8jaEm8SLFrQOOnXZwKLaISG5QdZ8VNqW3QoS/MKcTpt2cFb41BGxMtNOX3uIp2KDba2JBOFvKFU/z8+qdPMbKaqT7CKOWceM435ybFJYVjpcvLXIIHpAfcaQul6XAHUNVZzTSFwTqO1oppGenIuYdaw0OpZitb8UiMRl6qew7B5gseMgk88XrUsZaxYChrDmvlRqGP0OQsDZukjTcyELs49Yw0vLg82Ny5aDbVC4YWcEtBD70cKEv8PY1W10kbJWKHXdAywayLM8lTOKcqr2hdFb9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SEdA5MsFpqG5rs1CAktgtjDjK9YRV5hVDrmuPPYU0C8=; b=mS9WJFoyuGNikxRrjZNpcDSziK6jUy2DjI9fAbZAgHvJX7n7xSn1wVjmGkoZWXCddJrnWNd+1JrLCECku8o7D/+8A4AgsM1gzK2TKaAnXOGCakuDl5C/4qNICMTeAWge7SGtXY/qsJ/0F++mIpsZ1JmPuyRrQA3Da2+82eL4SSY7AalWXfKQruiPCvZOz71LJCoqOt3ff5H5m52XJ7rCIg7yGkbLtVLrq0Qn7Ot/lWWabGdZsbnlz7ZqSNYnKv2fvK9gUimrAM2Emp24mXyDuPkoeCy5T425yiFuhzt5tA0oomaeq9HokxPzA8CPid+WaTjHorOTGTM43Eh8V/TeHg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SEdA5MsFpqG5rs1CAktgtjDjK9YRV5hVDrmuPPYU0C8=; b=hw14WBPCKnxp1sHGoOQBvl3bfDh6QSzSQNzikHzju0pJGr/ScX4s8I4LEbN/Z2m4W3x9tJvrAgTeVK+09G0RQFLrWPPKn8C/xH2XjU3FQRYzusDA+OKZUaofKvq07AS70tz1IsK+IZFeqvntXDjzvvSjhwbzXScxiRMgDyPJXb4= Received: from CY4PR08CA0045.namprd08.prod.outlook.com (2603:10b6:903:151::31) by BYAPR02MB5575.namprd02.prod.outlook.com (2603:10b6:a03:a6::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.22; Tue, 11 Aug 2020 03:32:21 +0000 Received: from CY1NAM02FT028.eop-nam02.prod.protection.outlook.com (2603:10b6:903:151:cafe::66) by CY4PR08CA0045.outlook.office365.com (2603:10b6:903:151::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.18 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT028.mail.protection.outlook.com (10.152.75.132) with Microsoft SMTP Server id 15.20.3261.19 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 Received: from [149.199.38.66] (port=60887 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1k5L1K-0000hw-H4; Mon, 10 Aug 2020 20:32:14 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1k5L1R-0004hE-3a; Mon, 10 Aug 2020 20:32:21 -0700 Received: from [172.19.2.206] (helo=xsjblevinsk50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1k5L1J-0004gc-7n; Mon, 10 Aug 2020 20:32:13 -0700 From: Ben Levinsky To: stefanos@xilinx.com, michals@xilinx.com Cc: devicetree@vger.kernel.org, mathieu.poirier@linaro.org, ed.mooring@xilinx.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, wendy.liang@xilinx.com, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v8 3/5] firmware: xilinx: Add RPU configuration APIs Date: Mon, 10 Aug 2020 20:32:11 -0700 Message-Id: <20200811033213.20088-4-ben.levinsky@xilinx.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200811033213.20088-1-ben.levinsky@xilinx.com> References: <20200811033213.20088-1-ben.levinsky@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: ef34c190-f547-4af6-0b56-08d83da72809 X-MS-TrafficTypeDiagnostic: BYAPR02MB5575: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:2089; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4SK3ES24WSe1HOav1uLarPCuvl+PB8M6BFnFIu34wn61b+Y2cwsIVFG8Gg/V386mT3hhm5EbgwHH35AUejRBZJDtq0lmtCe0YZOF7lH5DghE+bln72iLADhfSZ3/4JK61f4irgFI550I+PPReG41cPSoLxCCcbpKLKeiL2CiXRFe6Y23lKzrauH8Yte7hGf1Yvz9DeAiaJvzqqHfv+5c3/7s6kLAEcgSYWt7kbngzgFPfCcF7k0+0GyDQIaODCaJ3VBX7kT/QSnSSwNIDc4xEwK9/BtrjX6aA1WGPkMSr18ywdGXa9MY2RzHyWjxtFrz01QUZWQOkvDV2tB2IHI0goRu2P1+vXFeXz82mhpOJWtsoKWfR6JMlMU5oRcK2pmxFZ/bvFzth1iUA/kjZfYRRQ== X-Forefront-Antispam-Report: CIP:149.199.60.83;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:xsj-pvapsmtpgw01;PTR:unknown-60-83.xilinx.com;CAT:NONE;SFTY:;SFS:(39860400002)(346002)(376002)(136003)(396003)(46966005)(81166007)(356005)(6636002)(1076003)(8936002)(82310400002)(2906002)(70206006)(47076004)(478600001)(2616005)(316002)(36756003)(186003)(26005)(5660300002)(426003)(44832011)(70586007)(82740400003)(7696005)(4326008)(83380400001)(8676002)(336012)(9786002);DIR:OUT;SFP:1101; X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Aug 2020 03:32:21.3369 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ef34c190-f547-4af6-0b56-08d83da72809 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: CY1NAM02FT028.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR02MB5575 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org This patch adds APIs to provide access and a configuration interface to the current power state of a sub-system on Zynqmp sub-system. Signed-off-by: Ben Levinsky --- v3: - add xilinx-related platform mgmt fn's instead of wrapping around function pointer in xilinx eemi ops struct v4: - add default values for enums --- drivers/firmware/xilinx/zynqmp.c | 99 ++++++++++++++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 34 ++++++++++ 2 files changed, 133 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index f1a0bd35deeb..fdd61d258e55 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -846,6 +846,61 @@ int zynqmp_pm_release_node(const u32 node) } EXPORT_SYMBOL_GPL(zynqmp_pm_release_node); +/** + * zynqmp_pm_get_rpu_mode() - Get RPU mode + * @node_id: Node ID of the device + * @arg1: Argument 1 to requested IOCTL call + * @arg2: Argument 2 to requested IOCTL call + * @out: Returned output value + * + * Return: RPU mode + */ +int zynqmp_pm_get_rpu_mode(u32 node_id, + u32 arg1, u32 arg2, u32 *out) +{ + return zynqmp_pm_invoke_fn(PM_IOCTL, node_id, + IOCTL_GET_RPU_OPER_MODE, 0, 0, out); +} +EXPORT_SYMBOL_GPL(zynqmp_pm_get_rpu_mode); + +/** + * zynqmp_pm_set_rpu_mode() - Set RPU mode + * @node_id: Node ID of the device + * @ioctl_id: ID of the requested IOCTL + * @arg2: Argument 2 to requested IOCTL call + * @out: Returned output value + * + * This function is used to set RPU mode. + * + * Return: Returns status, either success or error+reason + */ +int zynqmp_pm_set_rpu_mode(u32 node_id, + u32 arg1, u32 arg2, u32 *out) +{ + return zynqmp_pm_invoke_fn(PM_IOCTL, node_id, + IOCTL_SET_RPU_OPER_MODE, 0, 0, out); +} +EXPORT_SYMBOL_GPL(zynqmp_pm_set_rpu_mode); + +/** + * zynqmp_pm_tcm_comb_config - configure TCM + * @node_id: Node ID of the device + * @arg1: Argument 1 to requested IOCTL call + * @arg2: Argument 2 to requested IOCTL call + * @out: Returned output value + * + * This function is used to set RPU mode. + * + * Return: Returns status, either success or error+reason + */ +int zynqmp_pm_set_tcm_config(u32 node_id, + u32 arg1, u32 arg2, u32 *out) +{ + return zynqmp_pm_invoke_fn(PM_IOCTL, node_id, + IOCTL_TCM_COMB_CONFIG, 0, 0, out); +} +EXPORT_SYMBOL_GPL(zynqmp_pm_set_tcm_config); + /** * zynqmp_pm_force_powerdown - PM call to request for another PU or subsystem to * be powered down forcefully @@ -881,6 +936,50 @@ int zynqmp_pm_request_wakeup(const u32 node, } EXPORT_SYMBOL_GPL(zynqmp_pm_request_wakeup); +/** + * zynqmp_pm_get_node_status - PM call to request a node's current power state + * @node: ID of the component or sub-system in question + * @status: Current operating state of the requested node + * @requirements: Current requirements asserted on the node, + * used for slave nodes only. + * @usage: Usage information, used for slave nodes only: + * PM_USAGE_NO_MASTER - No master is currently using + * the node + * PM_USAGE_CURRENT_MASTER - Only requesting master is + * currently using the node + * PM_USAGE_OTHER_MASTER - Only other masters are + * currently using the node + * PM_USAGE_BOTH_MASTERS - Both the current and at least + * one other master is currently + * using the node + * + * Return: status, either success or error+reason + */ +int zynqmp_pm_get_node_status(const u32 node, + u32 *status, u32 *requirements, + u32 *usage) + +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + if (!status) + return -EINVAL; + + ret = zynqmp_pm_invoke_fn(PM_GET_NODE_STATUS, node, 0, 0, 0, + ret_payload); + if (ret_payload[0] == XST_PM_SUCCESS) { + *status = ret_payload[1]; + if (requirements) + *requirements = ret_payload[2]; + if (usage) + *usage = ret_payload[3]; + } + + return ret; +} +EXPORT_SYMBOL_GPL(zynqmp_pm_get_node_status); + /** * zynqmp_pm_set_requirement() - PM call to set requirement for PM slaves * @node: Node ID of the slave diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 4d83a7d69c4c..0caca9e2223a 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -64,6 +64,7 @@ enum pm_api_id { PM_GET_API_VERSION = 1, + PM_GET_NODE_STATUS = 3, PM_FORCE_POWERDOWN = 8, PM_REQUEST_WAKEUP = 10, PM_SYSTEM_SHUTDOWN = 12, @@ -384,6 +385,14 @@ int zynqmp_pm_request_wakeup(const u32 node, const bool set_addr, const u64 address, const enum zynqmp_pm_request_ack ack); +int zynqmp_pm_get_node_status(const u32 node, u32 *status, + u32 *requirements, u32 *usage); +int zynqmp_pm_get_rpu_mode(u32 node_id, + u32 arg1, u32 arg2, u32 *out); +int zynqmp_pm_set_rpu_mode(u32 node_id, + u32 arg1, u32 arg2, u32 *out); +int zynqmp_pm_set_tcm_config(u32 node_id, + u32 arg1, u32 arg2, u32 *out); #else static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void) { @@ -548,6 +557,31 @@ static inline int zynqmp_pm_request_wakeup(const u32 node, { return -ENODEV; } + +static inline int zynqmp_pm_get_node_status(const u32 node, + u32 *status, u32 *requirements, + u32 *usage) +{ + return -ENODEV; +} + +static inline int zynqmp_pm_get_rpu_mode(u32 node_id, + u32 arg1, u32 arg2, u32 *out) +{ + return -ENODEV; +} + +static inline int zynqmp_pm_set_rpu_mode(u32 node_id, + u32 arg1, u32 arg2, u32 *out) +{ + return -ENODEV; +} + +static inline int zynqmp_pm_set_tcm_config(u32 node_id, + u32 arg1, u32 arg2, u32 *out) +{ + return -ENODEV; +} #endif #endif /* __FIRMWARE_ZYNQMP_H__ */ From patchwork Tue Aug 11 03:32:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Levinsky X-Patchwork-Id: 11708499 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 B3EC6618 for ; Tue, 11 Aug 2020 03:32:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 95F082075F for ; Tue, 11 Aug 2020 03:32:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="rAetCOA6" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728228AbgHKDc1 (ORCPT ); Mon, 10 Aug 2020 23:32:27 -0400 Received: from mail-dm6nam11on2068.outbound.protection.outlook.com ([40.107.223.68]:36015 "EHLO NAM11-DM6-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728030AbgHKDc0 (ORCPT ); Mon, 10 Aug 2020 23:32:26 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mFOr6h4Jw0t6Vqog77k9fE4V09U3xIM3haRZO/5st/RjHk/Ho22VjICJicXeHEHHffvdksS6eblrO7ZzY2K7kH2SRq5NPxL1lw9+pDfqYqmEBj2HGsuLaYIUXVw/sMT35Wlk5U+OdBNFa+N/JYLvd2x5tvrtVBsfqe70zSn6GiIXRyagjWGN5YzVhfA53PRlinLj7aFMX1pBjU5vfTe2UF4qTkcsU1xErKYvrfg4s25hySlGSq+E3LX8fRmGynQLytCgsfVVqI0AwrHZEg36R9niA+EITORqGViXr4Wum2/6UgPhBD13F2pv0eYDaYONBS+wucQlWzwapsLOjZNXbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OMLYYk1qe+9AcIay1ZsWUGOoEnqLvJKC7DYYvsREHPU=; b=aWINK5kWnQMjyLOY2J0+B1n/D94gmBn8RzZbgZsdYkNv0PLbM+Ez61bKIHBbdGlksm5uzI85eclnrxTvRRLqgdvzdWxAHvCfCWBRBueBlaby0jWDa+dKux3zHiA0n/kSNJlQk6/gWl/vLrKGdWl5Vbuo6K+CPPzzYinrifu7r6/b2Tlnq/YI1Sc7UD7jhEGmVRybVZKkaOFt/2/1Gv8zzI66WBt1cjLrqRJoiwHunP/aXGMDsP2v9cE4oyGXALQq6JXNCHS0z7XZEJbuxZwLKT9jGInQqyUOtdhzyKicEayPefTQTfsfZk+M9sjKwPny3hvtOd33JE8QkBBB3k6YyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OMLYYk1qe+9AcIay1ZsWUGOoEnqLvJKC7DYYvsREHPU=; b=rAetCOA6HdoS/2U1vzcbcPhSZZohCIzlQ5C6raTTBw9FAUgmrH8Cc3bzB/2+xAmKABgV8FsLhA8ZPJztq5k6zWOzomeCpkGWzZgCwZsi7XTpBhOh8kXFyn0VpzVp+KCOZK/ayl4IGb6SiaXgmEScbMrg719n8H/4oQ73M59twTY= Received: from MN2PR15CA0044.namprd15.prod.outlook.com (2603:10b6:208:237::13) by BN7PR02MB4148.namprd02.prod.outlook.com (2603:10b6:406:f6::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.22; Tue, 11 Aug 2020 03:32:21 +0000 Received: from BL2NAM02FT053.eop-nam02.prod.protection.outlook.com (2603:10b6:208:237:cafe::57) by MN2PR15CA0044.outlook.office365.com (2603:10b6:208:237::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.19 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by BL2NAM02FT053.mail.protection.outlook.com (10.152.76.225) with Microsoft SMTP Server id 15.20.3261.19 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 Received: from [149.199.38.66] (port=60901 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1k5L1K-0000iB-Rl; Mon, 10 Aug 2020 20:32:14 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1k5L1R-0004hE-EE; Mon, 10 Aug 2020 20:32:21 -0700 Received: from [172.19.2.206] (helo=xsjblevinsk50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1k5L1J-0004gc-9d; Mon, 10 Aug 2020 20:32:13 -0700 From: Ben Levinsky To: stefanos@xilinx.com, michals@xilinx.com Cc: devicetree@vger.kernel.org, mathieu.poirier@linaro.org, ed.mooring@xilinx.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, wendy.liang@xilinx.com, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org, Jason Wu , Wendy Liang , Michal Simek Subject: [PATCH v8 4/5] dt-bindings: remoteproc: Add documentation for ZynqMP R5 rproc bindings Date: Mon, 10 Aug 2020 20:32:12 -0700 Message-Id: <20200811033213.20088-5-ben.levinsky@xilinx.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200811033213.20088-1-ben.levinsky@xilinx.com> References: <20200811033213.20088-1-ben.levinsky@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: eca04453-661a-4dff-cfe9-08d83da7284c X-MS-TrafficTypeDiagnostic: BN7PR02MB4148: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: UxqcvaKSHVV5MAPpqU5wXZ1pWnJElKpz+ELDefha7B/HnsdNGLtddXQt9w3RWYOa2tIKnrKA0+QFffHSuQERHnHDyggsx6+oq1o2PgN1UbRqQff+XGzAA9Id7H0FLc9SgvQQJ03WCtvzmYtB5JsSkmvGy0b+7fS0x/NoaXqVIJym6c9kbK5XCWlulKzWi2/d9Z4a62k69EXM//PgBKqHvVJEo0Z8//NR10sDzFvTlrW89JAQ+cxOthD+0CAbY9CtzYR6rnn3FBlzkA5PCZjraGSf2jpYH6SU5CDKzGqscqrrcr+uOk4IcAeTVktS87ClqGwSosXj1nB4KvemhQd1a8+T7593R4BWCJVgWqTx6zJlMVkCe1CynKlq/7ssa9zrb2FRVJbHIKAd+SVBbdSWrh6zIGvagMu+FV+0lfCSQdP0uMwe+dYS4u1JSbwaHMj3KJmjKhrFSRHJqTTcBo0qMLktf4F7AN2iIkd4nnp78zM= X-Forefront-Antispam-Report: CIP:149.199.60.83;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:xsj-pvapsmtpgw01;PTR:unknown-60-83.xilinx.com;CAT:NONE;SFTY:;SFS:(396003)(346002)(136003)(39860400002)(376002)(46966005)(5660300002)(83380400001)(9786002)(8936002)(36756003)(82740400003)(8676002)(7696005)(4326008)(47076004)(82310400002)(6636002)(1076003)(70586007)(316002)(70206006)(356005)(81166007)(2616005)(54906003)(2906002)(478600001)(426003)(26005)(44832011)(107886003)(186003)(336012);DIR:OUT;SFP:1101; X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Aug 2020 03:32:21.7800 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: eca04453-661a-4dff-cfe9-08d83da7284c X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: BL2NAM02FT053.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN7PR02MB4148 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Add binding for ZynqMP R5 OpenAMP. Represent the RPU domain resources in one device node. Each RPU processor is a subnode of the top RPU domain node. Signed-off-by: Ben Levinsky Signed-off-by: Jason Wu Signed-off-by: Wendy Liang Signed-off-by: Michal Simek --- v3: - update zynqmp_r5 yaml parsing to not raise warnings for extra information in children of R5 node. The warning "node has a unit name, but no reg or ranges property" will still be raised though as this particular node is needed to describe the '#address-cells' and '#size-cells' information. v4:: - remove warning '/example-0/rpu@ff9a0000/r5@0: node has a unit name, but no reg or ranges property' by adding reg to r5 node. v5: - update device tree sample and yaml parsing to not raise any warnings - description for memory-region in yaml parsing - compatible string in yaml parsing for TCM v6: - remove coupling TCM nodes with remoteproc - remove mailbox as it is optional not needed v7: - change lockstep-mode to xlnx,cluster-mode --- .../xilinx,zynqmp-r5-remoteproc.yaml | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Documentation/devicetree/bindings/remoteproc/xilinx,zynqmp-r5-remoteproc.yaml diff --git a/Documentation/devicetree/bindings/remoteproc/xilinx,zynqmp-r5-remoteproc.yaml b/Documentation/devicetree/bindings/remoteproc/xilinx,zynqmp-r5-remoteproc.yaml new file mode 100644 index 000000000000..54f916d9b037 --- /dev/null +++ b/Documentation/devicetree/bindings/remoteproc/xilinx,zynqmp-r5-remoteproc.yaml @@ -0,0 +1,73 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: "http://devicetree.org/schemas/remoteproc/xilinx,zynqmp-r5-remoteproc.yaml#" +$schema: "http://devicetree.org/meta-schemas/core.yaml#" + +title: Xilinx R5 remote processor controller bindings + +description: + This document defines the binding for the remoteproc component that loads and + boots firmwares on the Xilinx Zynqmp and Versal family chipset. + + Note that the Linux has global addressing view of the R5-related memory (TCM) + so the absolute address ranges are provided in TCM reg's. +maintainers: + - Ed Mooring + - Ben Levinsky + +properties: + compatible: + const: "xlnx,zynqmp-r5-remoteproc-1.0" + + lockstep-mode: + description: + R5 core configuration (split is 0 or lock-step and 1) + maxItems: 1 + + interrupts: + description: + Interrupt mapping for remoteproc IPI. It is required if the + user uses the remoteproc driver with the RPMsg kernel driver. + maxItems: 6 + + memory-region: + description: + collection of memory carveouts used for elf-loading and inter-processor + communication. + maxItems: 4 + minItems: 4 + pnode-id: + maxItems: 1 + mboxes: + maxItems: 2 + mbox-names: + maxItems: 2 + +examples: + - | + reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + elf_load: rproc@3ed000000 { + no-map; + reg = <0x3ed00000 0x40000>; + }; + }; + rpu { + compatible = "xlnx,zynqmp-r5-remoteproc-1.0"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + lockstep-mode = <0>; + r5_0 { + ranges; + #address-cells = <1>; + #size-cells = <1>; + memory-region = <&elf_load>; + pnode-id = <0x7>; + }; + }; + +... From patchwork Tue Aug 11 03:32:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Levinsky X-Patchwork-Id: 11708501 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 19E2A618 for ; Tue, 11 Aug 2020 03:32:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DF9B920756 for ; Tue, 11 Aug 2020 03:32:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="R9hVpY6e" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728291AbgHKDcm (ORCPT ); Mon, 10 Aug 2020 23:32:42 -0400 Received: from mail-bn8nam11on2041.outbound.protection.outlook.com ([40.107.236.41]:14624 "EHLO NAM11-BN8-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728214AbgHKDcl (ORCPT ); Mon, 10 Aug 2020 23:32:41 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CHV3kSJwHnRMa/AtZ/vwI7diCPwP3QKPJJvhDBP7LMm9tMrGJIp+6dYgP2OXSPYKntp6CnwgCK5f8CyTBOOTNJCwVZ6lbXLOeptFT/MbUkJnG1e5gLrDqYG0Lt9Fcod6SpXipZd8yLeCpGfwMW177Le+JHFnmuduauN/A1s53FNF3qDrZuNKEAhzO00WWhmNmnSLY5RpAhh7pC7RWzC3YpmAVfo+nSDQ7SVP3hqC3gnkEdQvkCzKn8aBee3FioEOJLopQclwxsnuUuRwq+WTYUReaTfNstbjLFXVZ3vWXMB/nY353tu9c4Pph4lDgUAtfNlh0uS2HlRhBZksXaFYPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=H142F0y++O4CHXJIZSVlqp5Gj6YydcCsLHTBiEpOwY0=; b=OIIsaU61cOX6aOGGd5q+LBqxQSLaikBEY/9gyNncs4EnOhdYhcy+696VE525uBoOtQ0KZS11tw0cx7a9Z42FjQXo0QpIjm3N3EHdtT6Q61pqs5vOg/drBV6lIr244NMYyi0iCgxcyoqfvqjiyCbT3r3CqfTOM5HrjkzzcBfzGUB+BZn6bRzlAsB+341Ov8G6wRoy6FCqi6uMoEh4KbGqd5CvwDM7eXp9TPEggW0OLYAcW+pR+4Qe2JJsvgkEzOtYDC7bgByzXFZ+a200BXeyBzc/BKmbXuR4JkXXMcieBwtNXewa8jYXiCkLFWxDOuFHF+7tQJG1nH9x3biiKzoAgA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.199.60.83) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=xilinx.com; dmarc=bestguesspass action=none header.from=xilinx.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector2-xilinx-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=H142F0y++O4CHXJIZSVlqp5Gj6YydcCsLHTBiEpOwY0=; b=R9hVpY6eqHFLbRqKmlRCttw9nMqvL3l9b0FVZBcuweuTBhT2/10KoyGCXOXeCeqipZeOFS1W4FuxTav9X95HXKRvnod9ksCy/gDvsNzt0EEquip20l9ZtGSsNb187cjXSPF1SGlfW2cTr4imJXUg18b9CCygICtyG12Z8/DGIEQ= Received: from BL0PR05CA0020.namprd05.prod.outlook.com (2603:10b6:208:91::30) by BYAPR02MB4086.namprd02.prod.outlook.com (2603:10b6:a02:f9::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.20; Tue, 11 Aug 2020 03:32:21 +0000 Received: from BL2NAM02FT034.eop-nam02.prod.protection.outlook.com (2603:10b6:208:91:cafe::f7) by BL0PR05CA0020.outlook.office365.com (2603:10b6:208:91::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.5 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by BL2NAM02FT034.mail.protection.outlook.com (10.152.77.161) with Microsoft SMTP Server id 15.20.3261.19 via Frontend Transport; Tue, 11 Aug 2020 03:32:21 +0000 Received: from [149.199.38.66] (port=60889 helo=smtp.xilinx.com) by xsj-pvapsmtpgw01 with esmtp (Exim 4.90) (envelope-from ) id 1k5L1K-0000hz-Ic; Mon, 10 Aug 2020 20:32:14 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1k5L1R-0004hE-54; Mon, 10 Aug 2020 20:32:21 -0700 Received: from [172.19.2.206] (helo=xsjblevinsk50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1k5L1J-0004gc-BO; Mon, 10 Aug 2020 20:32:13 -0700 From: Ben Levinsky To: stefanos@xilinx.com, michals@xilinx.com Cc: devicetree@vger.kernel.org, mathieu.poirier@linaro.org, ed.mooring@xilinx.com, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, wendy.liang@xilinx.com, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org, Michal Simek , Jason Wu Subject: [PATCH v8 5/5] remoteproc: Add initial zynqmp R5 remoteproc driver Date: Mon, 10 Aug 2020 20:32:13 -0700 Message-Id: <20200811033213.20088-6-ben.levinsky@xilinx.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200811033213.20088-1-ben.levinsky@xilinx.com> References: <20200811033213.20088-1-ben.levinsky@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-MS-PublicTrafficType: Email MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 55c5f1f9-ce3b-4de7-9140-08d83da7281c X-MS-TrafficTypeDiagnostic: BYAPR02MB4086: X-Microsoft-Antispam-PRVS: X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-MS-Oob-TLC-OOBClassifiers: OLM:86; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PbV9/i9keWlKWBFSSVWg5dP5CRp4p0Cecpf0yOdbEOMB7m5/K6Lvdt7hdJKe1kREa3TsslsGOOAawmSDKhpGGST1BLDNJi6q/H10oFpIDuEC7oOeKfj2JBLaPHEddSlV71DzTesXJ31fXrXjtj3srKg+INkzCyeoXdDQfC36bZ4geadzC467msTf52Hlimpor/t2t0/4/nRZ2bVJ80d2t6l8tdUuF4yp4VJXIReTo8DwsdEpQZ2WwdfGqVv6Dsen/Yo9P6ckr6XT5BPhLRs4kcYkgerPDdqa580OSMiesmDJjWq4lcrdzIWv8Ju4odZNJ9h180fb1eEzvU9ja5JwXwWjvcwsNq3/OzoJeXUFDmYZssz4znF9GP7LeEqxhISOKAG/4LVyYFqQlBKvaED++g== X-Forefront-Antispam-Report: CIP:149.199.60.83;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:xsj-pvapsmtpgw01;PTR:unknown-60-83.xilinx.com;CAT:NONE;SFTY:;SFS:(396003)(376002)(39860400002)(346002)(136003)(46966005)(30864003)(4326008)(5660300002)(36756003)(9786002)(44832011)(2616005)(8936002)(426003)(478600001)(1076003)(26005)(6636002)(107886003)(186003)(70206006)(7696005)(83380400001)(356005)(81166007)(82310400002)(70586007)(316002)(336012)(8676002)(82740400003)(2906002)(47076004)(54906003);DIR:OUT;SFP:1101; X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Aug 2020 03:32:21.4638 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 55c5f1f9-ce3b-4de7-9140-08d83da7281c X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-AuthSource: BL2NAM02FT034.eop-nam02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR02MB4086 Sender: linux-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org R5 is included in Xilinx Zynq UltraScale MPSoC so by adding this remotproc driver, we can boot the R5 sub-system in different configurations. Signed-off-by: Ben Levinsky Signed-off-by: Wendy Liang Signed-off-by: Michal Simek Signed-off-by: Ed Mooring Signed-off-by: Jason Wu --- v2: - remove domain struct as per review from Mathieu v3: - add xilinx-related platform mgmt fn's instead of wrapping around function pointer in xilinx eemi ops struct v4: - add default values for enums - fix formatting as per checkpatch.pl --strict. Note that 1 warning and 1 check are still raised as each is due to fixing the warning results in that particular line going over 80 characters. v5: - parse_fw change from use of rproc_of_resm_mem_entry_init to rproc_mem_entry_init and use of alloc/release - var's of type zynqmp_r5_pdata all have same local variable name - use dev_dbg instead of dev_info v6: - adding memory carveouts is handled much more similarly. All mem carveouts are now described in reserved memory as needed. That is, TCM nodes are not coupled to remoteproc anymore. This is reflected in the remoteproc R5 driver and the device tree binding. - remove mailbox from device tree binding as it is not necessary for elf loading - use lockstep-mode property for configuring RPU v7: - remove unused headers - change u32 *lockstep_mode -> u32 lockstep_mode; - change device-tree binding "lockstep-mode" to xlnx,cluster-mode - remove zynqmp_r5_mem_probe and loop to Probe R5 memory devices at remoteproc-probe time - remove is_r5_mode_set from zynqmp rpu remote processor private data - do not error out if no mailbox is provided - remove zynqmp_r5_remoteproc_probe call of platform_set_drvdata as pdata is handled in zynqmp_r5_remoteproc_remove v8: - remove old acks, reviewed-by's in commit message --- drivers/remoteproc/Kconfig | 10 + drivers/remoteproc/Makefile | 1 + drivers/remoteproc/zynqmp_r5_remoteproc.c | 911 ++++++++++++++++++++++ 3 files changed, 922 insertions(+) create mode 100644 drivers/remoteproc/zynqmp_r5_remoteproc.c diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index c4d1731295eb..342a7e668636 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -249,6 +249,16 @@ config STM32_RPROC This can be either built-in or a loadable module. +config ZYNQMP_R5_REMOTEPROC + tristate "ZynqMP_R5 remoteproc support" + depends on ARM64 && PM && ARCH_ZYNQMP + select RPMSG_VIRTIO + select MAILBOX + select ZYNQMP_IPI_MBOX + help + Say y here to support ZynqMP R5 remote processors via the remote + processor framework. + endif # REMOTEPROC endmenu diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index e8b886e511f0..04d1c95d06d7 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -28,5 +28,6 @@ obj-$(CONFIG_QCOM_WCNSS_PIL) += qcom_wcnss_pil.o qcom_wcnss_pil-y += qcom_wcnss.o qcom_wcnss_pil-y += qcom_wcnss_iris.o obj-$(CONFIG_ST_REMOTEPROC) += st_remoteproc.o +obj-$(CONFIG_ZYNQMP_R5_REMOTEPROC) += zynqmp_r5_remoteproc.o obj-$(CONFIG_ST_SLIM_REMOTEPROC) += st_slim_rproc.o obj-$(CONFIG_STM32_RPROC) += stm32_rproc.o diff --git a/drivers/remoteproc/zynqmp_r5_remoteproc.c b/drivers/remoteproc/zynqmp_r5_remoteproc.c new file mode 100644 index 000000000000..b600759e257e --- /dev/null +++ b/drivers/remoteproc/zynqmp_r5_remoteproc.c @@ -0,0 +1,911 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zynq R5 Remote Processor driver + * + * Copyright (C) 2019, 2020 Xilinx Inc. Ben Levinsky + * Copyright (C) 2015 - 2018 Xilinx Inc. + * Copyright (C) 2015 Jason Wu + * + * Based on origin OMAP and Zynq Remote Processor driver + * + * Copyright (C) 2012 Michal Simek + * Copyright (C) 2012 PetaLogix + * Copyright (C) 2011 Texas Instruments, Inc. + * Copyright (C) 2011 Google, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "remoteproc_internal.h" + +#define MAX_RPROCS 2 /* Support up to 2 RPU */ +#define MAX_MEM_PNODES 4 /* Max power nodes for one RPU memory instance */ + +#define DEFAULT_FIRMWARE_NAME "rproc-rpu-fw" + +/* PM proc states */ +#define PM_PROC_STATE_ACTIVE 1U + +/* IPI buffer MAX length */ +#define IPI_BUF_LEN_MAX 32U +/* RX mailbox client buffer max length */ +#define RX_MBOX_CLIENT_BUF_MAX (IPI_BUF_LEN_MAX + \ + sizeof(struct zynqmp_ipi_message)) + +#define ZYNQMP_R5_NUM_TCM_BANKS 4 + +/* lookup table mapping power-node-ID of TCM bank to absolute base address */ +static unsigned long tcm_addr_to_pnode[ZYNQMP_R5_NUM_TCM_BANKS][2] = { + {0xFFE00000, 0xF }, + {0xFFE20000, 0x10}, + {0xFFE90000, 0x10}, + {0xFFEB0000, 0x11}, +}; + +static bool autoboot __read_mostly; + +/** + * struct zynqmp_r5_mem - zynqmp rpu memory data + * @pnode_id: TCM power domain ids + * @res: memory resource + * @node: list node + */ +struct zynqmp_r5_mem { + u32 pnode_id[MAX_MEM_PNODES]; + struct resource res; + struct list_head node; +}; + +/** + * struct zynqmp_r5_pdata - zynqmp rpu remote processor private data + * @dev: device of RPU instance + * @rproc: rproc handle + * @pnode_id: RPU CPU power domain id + * @mems: memory resources + * @is_r5_mode_set: indicate if r5 operation mode is set + * @tx_mc: tx mailbox client + * @rx_mc: rx mailbox client + * @tx_chan: tx mailbox channel + * @rx_chan: rx mailbox channel + * @mbox_work: mbox_work for the RPU remoteproc + * @tx_mc_skbs: socket buffers for tx mailbox client + * @rx_mc_buf: rx mailbox client buffer to save the rx message + */ +struct zynqmp_r5_pdata { + struct device dev; + struct rproc *rproc; + u32 pnode_id; + struct list_head mems; + bool is_r5_mode_set; + struct mbox_client tx_mc; + struct mbox_client rx_mc; + struct mbox_chan *tx_chan; + struct mbox_chan *rx_chan; + struct work_struct mbox_work; + struct sk_buff_head tx_mc_skbs; + unsigned char rx_mc_buf[RX_MBOX_CLIENT_BUF_MAX]; +}; + +/** + * table of RPUs + */ +struct zynqmp_r5_pdata rpus[MAX_RPROCS]; +/** + * RPU core configuration + */ +enum rpu_oper_mode rpu_mode; + +/* + * r5_set_mode - set RPU operation mode + * @pdata: Remote processor private data + * + * set RPU oepration mode + * + * Return: 0 for success, negative value for failure + */ +static int r5_set_mode(struct zynqmp_r5_pdata *pdata) +{ + u32 val[PAYLOAD_ARG_CNT] = {0}, expect, tcm_mode; + struct device *dev = &pdata->dev; + int ret; + + expect = (u32)rpu_mode; + ret = zynqmp_pm_get_rpu_mode(pdata->pnode_id, 0, 0, val); + if (ret < 0) { + dev_err(dev, "failed to get RPU oper mode.\n"); + return ret; + } + if (val[0] == expect) { + dev_dbg(dev, "RPU mode matches: %x\n", val[0]); + } else { + ret = zynqmp_pm_set_rpu_mode(pdata->pnode_id, + expect, 0, val); + if (ret < 0) { + dev_err(dev, + "failed to set RPU oper mode.\n"); + return ret; + } + } + + tcm_mode = (expect == (u32)PM_RPU_MODE_LOCKSTEP) ? + PM_RPU_TCM_COMB : PM_RPU_TCM_SPLIT; + ret = zynqmp_pm_set_tcm_config(pdata->pnode_id, tcm_mode, 0, val); + if (ret < 0) { + dev_err(dev, "failed to config TCM to %x.\n", + expect); + return ret; + } + pdata->is_r5_mode_set = true; + return 0; +} + +/* + * ZynqMP R5 remoteproc memory release function + */ +static int zynqmp_r5_mem_release(struct rproc *rproc, + struct rproc_mem_entry *mem) +{ + struct zynqmp_r5_mem *priv; + int i, ret; + struct device *dev = &rproc->dev; + + priv = mem->priv; + if (!priv) + return 0; + for (i = 0; i < MAX_MEM_PNODES; i++) { + if (priv->pnode_id[i]) { + dev_dbg(dev, "%s, pnode %d\n", + __func__, priv->pnode_id[i]); + ret = zynqmp_pm_release_node(priv->pnode_id[i]); + if (ret < 0) { + dev_err(dev, + "failed to release power node: %u\n", + priv->pnode_id[i]); + return ret; + } + } else { + break; + } + } + return 0; +} + +/* + * ZynqMP R5 remoteproc operations + */ +static int zynqmp_r5_rproc_start(struct rproc *rproc) +{ + struct device *dev = rproc->dev.parent; + struct zynqmp_r5_pdata *pdata = rproc->priv; + enum rpu_boot_mem bootmem; + int ret; + + if ((rproc->bootaddr & 0xF0000000) == 0xF0000000) + bootmem = PM_RPU_BOOTMEM_HIVEC; + else + bootmem = PM_RPU_BOOTMEM_LOVEC; + dev_dbg(dev, "RPU boot from %s.", + bootmem == PM_RPU_BOOTMEM_HIVEC ? "OCM" : "TCM"); + ret = zynqmp_pm_request_wakeup(pdata->pnode_id, 1, + bootmem, ZYNQMP_PM_REQUEST_ACK_NO); + if (ret < 0) { + dev_err(dev, "failed to boot R5.\n"); + return ret; + } + return 0; +} + +static int zynqmp_r5_rproc_stop(struct rproc *rproc) +{ + struct zynqmp_r5_pdata *pdata = rproc->priv; + int ret; + + ret = zynqmp_pm_force_powerdown(pdata->pnode_id, + ZYNQMP_PM_REQUEST_ACK_BLOCKING); + if (ret < 0) { + dev_err(&pdata->dev, "failed to shutdown R5.\n"); + return ret; + } + return 0; +} + +static int zynqmp_r5_rproc_mem_alloc(struct rproc *rproc, + struct rproc_mem_entry *mem) +{ + struct device *dev = rproc->dev.parent; + void *va; + + dev_dbg(rproc->dev.parent, "map memory: %pa\n", &mem->dma); + va = ioremap_wc(mem->dma, mem->len); + if (IS_ERR_OR_NULL(va)) { + dev_err(dev, "Unable to map memory region: %pa+%lx\n", + &mem->dma, mem->len); + return -ENOMEM; + } + + /* Update memory entry va */ + mem->va = va; + + return 0; +} + +static int zynqmp_r5_rproc_mem_release(struct rproc *rproc, + struct rproc_mem_entry *mem) +{ + dev_dbg(rproc->dev.parent, "unmap memory: %pa\n", &mem->dma); + iounmap(mem->va); + + return 0; +} + +/* + * TCM needs mapping to R5 relative address and xilinx platform mgmt call + */ +struct rproc_mem_entry *handle_tcm_parsing(struct device *dev, + struct reserved_mem *rmem, + struct device_node *node, + int lookup_idx) +{ + void *va; + dma_addr_t dma; + resource_size_t size; + int ret; + u32 pnode_id; + struct resource rsc; + struct rproc_mem_entry *mem; + + pnode_id = tcm_addr_to_pnode[lookup_idx][1]; + ret = zynqmp_pm_request_node(pnode_id, + ZYNQMP_PM_CAPABILITY_ACCESS, 0, + ZYNQMP_PM_REQUEST_ACK_BLOCKING); + if (ret < 0) { + dev_err(dev, "failed to request power node: %u\n", pnode_id); + return -EINVAL; + } + + ret = of_address_to_resource(node, 0, &rsc); + if (ret < 0) { + dev_err(dev, "failed to get resource of memory %s", + of_node_full_name(node)); + return -EINVAL; + } + size = resource_size(&rsc); + va = devm_ioremap_wc(dev, rsc.start, size); + if (!va) + return -ENOMEM; + + /* zero out tcm base address */ + if (rsc.start & 0xffe00000) { + /* R5 can't see anything past 0xfffff so wipe it */ + rsc.start &= 0x000fffff; + /* + * handle tcm banks 1 a and b (0xffe9000 and + * 0xffeb0000) + */ + if (rsc.start & 0x80000) + rsc.start -= 0x90000; + } + + dma = (dma_addr_t)rsc.start; + mem = rproc_mem_entry_init(dev, va, dma, (int)size, rsc.start, + NULL, zynqmp_r5_mem_release, + rsc.name); + if (!mem) + return -ENOMEM; + + return mem; +} + +static int parse_mem_regions(struct rproc *rproc) +{ + int num_mems, i; + struct zynqmp_r5_pdata *pdata = rproc->priv; + struct device *dev = &pdata->dev; + struct device_node *np = dev->of_node; + struct rproc_mem_entry *mem; + + num_mems = of_count_phandle_with_args(np, "memory-region", NULL); + if (num_mems <= 0) + return 0; + for (i = 0; i < num_mems; i++) { + struct device_node *node; + struct reserved_mem *rmem; + + node = of_parse_phandle(np, "memory-region", i); + rmem = of_reserved_mem_lookup(node); + if (!rmem) { + dev_err(dev, "unable to acquire memory-region\n"); + return -EINVAL; + } + + if (strstr(node->name, "vdev0buffer")) { + /* Register DMA region */ + mem = rproc_mem_entry_init(dev, NULL, + (dma_addr_t)rmem->base, + rmem->size, rmem->base, + NULL, NULL, + "vdev0buffer"); + if (!mem) { + dev_err(dev, "unable to initialize memory-region %s\n", + node->name); + return -ENOMEM; + } + dev_dbg(dev, "parsed %s at %llx\r\n", mem->name, + mem->dma); + } else if (strstr(node->name, "vdev0vring")) { + int vring_id; + char name[16]; + + /* + * can be 1 of multiple vring IDs per IPC channel + * e.g. 'vdev0vring0' and 'vdev0vring1' + */ + vring_id = node->name[14] - '0'; + snprintf(name, sizeof(name), "vdev0vring%d", vring_id); + /* Register vring */ + mem = rproc_mem_entry_init(dev, NULL, + (dma_addr_t)rmem->base, + rmem->size, rmem->base, + zynqmp_r5_rproc_mem_alloc, + zynqmp_r5_rproc_mem_release, + name); + dev_dbg(dev, "parsed %s at %llx\r\n", mem->name, + mem->dma); + } else { + int idx; + + /* + * if TCM update address space for R5 and + * make xilinx platform mgmt call + */ + for (idx = 0; idx < ZYNQMP_R5_NUM_TCM_BANKS; idx++) { + if (tcm_addr_to_pnode[idx][0] == rmem->base) + break; + } + + if (idx != ZYNQMP_R5_NUM_TCM_BANKS) { + mem = handle_tcm_parsing(dev, rmem, node, idx); + } else { + mem = rproc_mem_entry_init(dev, NULL, + (dma_addr_t)rmem->base, + rmem->size, rmem->base, + zynqmp_r5_rproc_mem_alloc, + zynqmp_r5_rproc_mem_release, + node->name); + } + + if (!mem) { + dev_err(dev, + "unable to init memory-region %s\n", + node->name); + return -ENOMEM; + } + } + rproc_add_carveout(rproc, mem); + } + + return 0; +} + +static int zynqmp_r5_parse_fw(struct rproc *rproc, const struct firmware *fw) +{ + int ret; + struct zynqmp_r5_pdata *pdata = rproc->priv; + struct device *dev = &pdata->dev; + + ret = parse_mem_regions(rproc); + if (ret) { + dev_err(dev, "parse_mem_regions failed %x\n", ret); + return ret; + } + + ret = rproc_elf_load_rsc_table(rproc, fw); + if (ret == -EINVAL) { + dev_info(dev, "no resource table found.\n"); + ret = 0; + } + return ret; +} + +/* kick a firmware */ +static void zynqmp_r5_rproc_kick(struct rproc *rproc, int vqid) +{ + struct device *dev = rproc->dev.parent; + struct zynqmp_r5_pdata *pdata = rproc->priv; + + dev_dbg(dev, "KICK Firmware to start send messages vqid %d\n", vqid); + + if (vqid < 0) { + /* If vqid is negative, does not pass the vqid to + * mailbox. As vqid is supposed to be 0 or possive. + * It also gives a way to just kick instead but + * not use the IPI buffer. It is better to provide + * a proper way to pass the short message, which will + * need to sync to upstream first, for now, + * use negative vqid to assume no message will be + * passed with IPI buffer, but just raise interrupt. + * This will be faster as it doesn't need to copy the + * message to the IPI buffer. + * + * It will ignore the return, as failure is due to + * there already kicks in the mailbox queue. + */ + (void)mbox_send_message(pdata->tx_chan, NULL); + } else { + struct sk_buff *skb; + unsigned int skb_len; + struct zynqmp_ipi_message *mb_msg; + int ret; + + skb_len = (unsigned int)(sizeof(vqid) + sizeof(mb_msg)); + skb = alloc_skb(skb_len, GFP_ATOMIC); + if (!skb) { + dev_err(dev, + "Failed to allocate skb to kick remote.\n"); + return; + } + mb_msg = (struct zynqmp_ipi_message *)skb_put(skb, skb_len); + mb_msg->len = sizeof(vqid); + memcpy(mb_msg->data, &vqid, sizeof(vqid)); + skb_queue_tail(&pdata->tx_mc_skbs, skb); + ret = mbox_send_message(pdata->tx_chan, mb_msg); + if (ret < 0) { + dev_warn(dev, "Failed to kick remote.\n"); + skb_dequeue_tail(&pdata->tx_mc_skbs); + kfree_skb(skb); + } + } +} + +static struct rproc_ops zynqmp_r5_rproc_ops = { + .start = zynqmp_r5_rproc_start, + .stop = zynqmp_r5_rproc_stop, + .load = rproc_elf_load_segments, + .parse_fw = zynqmp_r5_parse_fw, + .find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table, + .sanity_check = rproc_elf_sanity_check, + .get_boot_addr = rproc_elf_get_boot_addr, + .kick = zynqmp_r5_rproc_kick, +}; + +/* zynqmp_r5_mem_probe() - probes RPU TCM memory device + * @pdata: pointer to the RPU remoteproc private data + * @node: pointer to the memory node + * + * Function to retrieve resources for RPU TCM memory device. + */ +static int zynqmp_r5_mem_probe(struct zynqmp_r5_pdata *pdata, + struct device_node *node) +{ + struct device *dev; + struct zynqmp_r5_mem *mem; + int ret; + struct property *prop; + const __be32 *cur; + u32 val; + int i; + + dev = &pdata->dev; + mem = devm_kzalloc(dev, sizeof(*mem), GFP_KERNEL); + if (!mem) + return -ENOMEM; + ret = of_address_to_resource(node, 0, &mem->res); + if (ret < 0) { + dev_err(dev, "failed to get resource of memory %s", + of_node_full_name(node)); + return -EINVAL; + } + + /* Get the power domain id */ + i = 0; + if (of_find_property(node, "pnode-id", NULL)) { + of_property_for_each_u32(node, "pnode-id", prop, cur, val) + mem->pnode_id[i++] = val; + } + list_add_tail(&mem->node, &pdata->mems); + return 0; +} + +/** + * zynqmp_r5_release() - ZynqMP R5 device release function + * @dev: pointer to the device struct of ZynqMP R5 + * + * Function to release ZynqMP R5 device. + */ +static void zynqmp_r5_release(struct device *dev) +{ + struct zynqmp_r5_pdata *pdata; + struct rproc *rproc; + struct sk_buff *skb; + + pdata = dev_get_drvdata(dev); + rproc = pdata->rproc; + if (rproc) { + rproc_del(rproc); + rproc_free(rproc); + } + if (pdata->tx_chan) + mbox_free_channel(pdata->tx_chan); + if (pdata->rx_chan) + mbox_free_channel(pdata->rx_chan); + /* Discard all SKBs */ + while (!skb_queue_empty(&pdata->tx_mc_skbs)) { + skb = skb_dequeue(&pdata->tx_mc_skbs); + kfree_skb(skb); + } + + put_device(dev->parent); +} + +/** + * event_notified_idr_cb() - event notified idr callback + * @id: idr id + * @ptr: pointer to idr private data + * @data: data passed to idr_for_each callback + * + * Pass notification to remoteproc virtio + * + * Return: 0. having return is to satisfy the idr_for_each() function + * pointer input argument requirement. + **/ +static int event_notified_idr_cb(int id, void *ptr, void *data) +{ + struct rproc *rproc = data; + + (void)rproc_vq_interrupt(rproc, id); + return 0; +} + +/** + * handle_event_notified() - remoteproc notification work funciton + * @work: pointer to the work structure + * + * It checks each registered remoteproc notify IDs. + */ +static void handle_event_notified(struct work_struct *work) +{ + struct rproc *rproc; + struct zynqmp_r5_pdata *pdata; + + pdata = container_of(work, struct zynqmp_r5_pdata, mbox_work); + + (void)mbox_send_message(pdata->rx_chan, NULL); + rproc = pdata->rproc; + /* + * We only use IPI for interrupt. The firmware side may or may + * not write the notifyid when it trigger IPI. + * And thus, we scan through all the registered notifyids. + */ + idr_for_each(&rproc->notifyids, event_notified_idr_cb, rproc); +} + +/** + * zynqmp_r5_mb_rx_cb() - Receive channel mailbox callback + * @cl: mailbox client + * @mssg: message pointer + * + * It will schedule the R5 notification work. + */ +static void zynqmp_r5_mb_rx_cb(struct mbox_client *cl, void *mssg) +{ + struct zynqmp_r5_pdata *pdata; + + pdata = container_of(cl, struct zynqmp_r5_pdata, rx_mc); + if (mssg) { + struct zynqmp_ipi_message *ipi_msg, *buf_msg; + size_t len; + + ipi_msg = (struct zynqmp_ipi_message *)mssg; + buf_msg = (struct zynqmp_ipi_message *)pdata->rx_mc_buf; + len = (ipi_msg->len >= IPI_BUF_LEN_MAX) ? + IPI_BUF_LEN_MAX : ipi_msg->len; + buf_msg->len = len; + memcpy(buf_msg->data, ipi_msg->data, len); + } + schedule_work(&pdata->mbox_work); +} + +/** + * zynqmp_r5_mb_tx_done() - Request has been sent to the remote + * @cl: mailbox client + * @mssg: pointer to the message which has been sent + * @r: status of last TX - OK or error + * + * It will be called by the mailbox framework when the last TX has done. + */ +static void zynqmp_r5_mb_tx_done(struct mbox_client *cl, void *mssg, int r) +{ + struct zynqmp_r5_pdata *pdata; + struct sk_buff *skb; + + if (!mssg) + return; + pdata = container_of(cl, struct zynqmp_r5_pdata, tx_mc); + skb = skb_dequeue(&pdata->tx_mc_skbs); + kfree_skb(skb); +} + +/** + * zynqmp_r5_setup_mbox() - Setup mailboxes + * + * @pdata: pointer to the ZynqMP R5 processor platform data + * @node: pointer of the device node + * + * Function to setup mailboxes to talk to RPU. + * + * Return: 0 for success, negative value for failure. + */ +static int zynqmp_r5_setup_mbox(struct zynqmp_r5_pdata *pdata, + struct device_node *node) +{ + struct device *dev = &pdata->dev; + struct mbox_client *mclient; + + /* Setup TX mailbox channel client */ + mclient = &pdata->tx_mc; + mclient->dev = dev; + mclient->rx_callback = NULL; + mclient->tx_block = false; + mclient->knows_txdone = false; + mclient->tx_done = zynqmp_r5_mb_tx_done; + + /* Setup TX mailbox channel client */ + mclient = &pdata->rx_mc; + mclient->dev = dev; + mclient->rx_callback = zynqmp_r5_mb_rx_cb; + mclient->tx_block = false; + mclient->knows_txdone = false; + + INIT_WORK(&pdata->mbox_work, handle_event_notified); + + /* Request TX and RX channels */ + pdata->tx_chan = mbox_request_channel_byname(&pdata->tx_mc, "tx"); + if (IS_ERR(pdata->tx_chan)) { + dev_err(dev, "failed to request mbox tx channel.\n"); + pdata->tx_chan = NULL; + return -EINVAL; + } + pdata->rx_chan = mbox_request_channel_byname(&pdata->rx_mc, "rx"); + if (IS_ERR(pdata->rx_chan)) { + dev_err(dev, "failed to request mbox rx channel.\n"); + pdata->rx_chan = NULL; + return -EINVAL; + } + skb_queue_head_init(&pdata->tx_mc_skbs); + return 0; +} + +/** + * zynqmp_r5_probe() - Probes ZynqMP R5 processor device node + * @pdata: pointer to the ZynqMP R5 processor platform data + * @pdev: parent RPU domain platform device + * @node: pointer of the device node + * + * Function to retrieve the information of the ZynqMP R5 device node. + * + * Return: 0 for success, negative value for failure. + */ +static int zynqmp_r5_probe(struct zynqmp_r5_pdata *pdata, + struct platform_device *pdev, + struct device_node *node) +{ + struct device *dev = &pdata->dev; + struct rproc *rproc; + struct device_node *nc; + int ret; + + /* Create device for ZynqMP R5 device */ + dev->parent = &pdev->dev; + dev->release = zynqmp_r5_release; + dev->of_node = node; + dev_set_name(dev, "%s", of_node_full_name(node)); + dev_set_drvdata(dev, pdata); + ret = device_register(dev); + if (ret) { + dev_err(dev, "failed to register device.\n"); + return ret; + } + get_device(&pdev->dev); + + /* Allocate remoteproc instance */ + rproc = rproc_alloc(dev, dev_name(dev), &zynqmp_r5_rproc_ops, NULL, 0); + if (!rproc) { + dev_err(dev, "rproc allocation failed.\n"); + ret = -ENOMEM; + goto error; + } + rproc->auto_boot = autoboot; + pdata->rproc = rproc; + rproc->priv = pdata; + + /* + * The device has not been spawned from a device tree, so + * arch_setup_dma_ops has not been called, thus leaving + * the device with dummy DMA ops. + * Fix this by inheriting the parent's DMA ops and mask. + */ + rproc->dev.dma_mask = pdev->dev.dma_mask; + set_dma_ops(&rproc->dev, get_dma_ops(&pdev->dev)); + + /* Probe R5 memory devices */ + INIT_LIST_HEAD(&pdata->mems); + for_each_available_child_of_node(node, nc) { + ret = zynqmp_r5_mem_probe(pdata, nc); + if (ret) { + dev_err(dev, "failed to probe memory %s.\n", + of_node_full_name(nc)); + goto error; + } + } + + /* Set up DMA mask */ + ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); + if (ret) { + dev_warn(dev, "dma_set_coherent_mask failed: %d\n", ret); + /* If DMA is not configured yet, try to configure it. */ + ret = of_dma_configure(dev, node, true); + if (ret) { + dev_err(dev, "failed to configure DMA.\n"); + goto error; + } + } + + /* Get R5 power domain node */ + ret = of_property_read_u32(node, "pnode-id", &pdata->pnode_id); + if (ret) { + dev_err(dev, "failed to get power node id.\n"); + goto error; + } + + /* TODO Check if R5 is running */ + + /* Set up R5 if not already setup */ + ret = pdata->is_r5_mode_set ? 0 : r5_set_mode(pdata); + if (ret) { + dev_err(dev, "failed to set R5 operation mode.\n"); + return ret; + } + + if (!of_get_property(dev->of_node, "mboxes", NULL)) { + dev_dbg(dev, "no mailboxes.\n"); + goto error; + } else { + ret = zynqmp_r5_setup_mbox(pdata, node); + if (ret < 0) + goto error; + } + + /* Add R5 remoteproc */ + ret = rproc_add(rproc); + if (ret) { + dev_err(dev, "rproc registration failed\n"); + goto error; + } + return 0; +error: + if (pdata->rproc) + rproc_free(pdata->rproc); + pdata->rproc = NULL; + device_unregister(dev); + put_device(&pdev->dev); + return ret; +} + +static int zynqmp_r5_remoteproc_probe(struct platform_device *pdev) +{ + int ret, i = 0; + u32 *lockstep_mode; + struct device *dev = &pdev->dev; + struct device_node *nc; + struct zynqmp_r5_pdata *pdata; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + lockstep_mode = devm_kzalloc(dev, sizeof(u32 *), GFP_KERNEL); + if (!pdata || !lockstep_mode) + return -ENOMEM; + + platform_set_drvdata(pdev, pdata); + + of_property_read_u32(dev->of_node, "lockstep-mode", lockstep_mode); + + if (!(*lockstep_mode)) { + rpu_mode = PM_RPU_MODE_SPLIT; + } else if (*lockstep_mode == 1) { + rpu_mode = PM_RPU_MODE_LOCKSTEP; + } else { + dev_err(dev, + "Invalid lockstep-mode mode provided - %x %d\n", + *lockstep_mode, rpu_mode); + return -EINVAL; + } + dev_dbg(dev, "RPU configuration: %s\r\n", + (*lockstep_mode) ? "lockstep" : "split"); + + for_each_available_child_of_node(dev->of_node, nc) { + ret = zynqmp_r5_probe(&rpus[i], pdev, nc); + if (ret) { + dev_err(dev, "failed to probe rpu %s.\n", + of_node_full_name(nc)); + return ret; + } + i++; + } + + return 0; +} + +static int zynqmp_r5_remoteproc_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_RPROCS; i++) { + struct zynqmp_r5_pdata *pdata = &rpus[i]; + struct rproc *rproc; + + rproc = pdata->rproc; + if (rproc) { + rproc_del(rproc); + rproc_free(rproc); + pdata->rproc = NULL; + } + if (pdata->tx_chan) { + mbox_free_channel(pdata->tx_chan); + pdata->tx_chan = NULL; + } + if (pdata->rx_chan) { + mbox_free_channel(pdata->rx_chan); + pdata->rx_chan = NULL; + } + + device_unregister(&pdata->dev); + } + + return 0; +} + +/* Match table for OF platform binding */ +static const struct of_device_id zynqmp_r5_remoteproc_match[] = { + { .compatible = "xlnx,zynqmp-r5-remoteproc-1.0", }, + { /* end of list */ }, +}; +MODULE_DEVICE_TABLE(of, zynqmp_r5_remoteproc_match); + +static struct platform_driver zynqmp_r5_remoteproc_driver = { + .probe = zynqmp_r5_remoteproc_probe, + .remove = zynqmp_r5_remoteproc_remove, + .driver = { + .name = "zynqmp_r5_remoteproc", + .of_match_table = zynqmp_r5_remoteproc_match, + }, +}; +module_platform_driver(zynqmp_r5_remoteproc_driver); + +module_param_named(autoboot, autoboot, bool, 0444); +MODULE_PARM_DESC(autoboot, + "enable | disable autoboot. (default: false)"); + +MODULE_AUTHOR("Ben Levinsky "); +MODULE_LICENSE("GPL v2");