From patchwork Wed Sep 5 02:11:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 966167 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="kaTVRjhO"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 424nTQ1QrMz9s3Z for ; Wed, 5 Sep 2018 12:19:38 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 00C14C21DAF; Wed, 5 Sep 2018 02:13:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAD_ENC_HEADER, SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id A09C5C21DDC; Wed, 5 Sep 2018 02:07:14 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id F14F9C21E53; Wed, 5 Sep 2018 02:07:08 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0086.outbound.protection.outlook.com [104.47.2.86]) by lists.denx.de (Postfix) with ESMTPS id 9525EC21E15 for ; Wed, 5 Sep 2018 02:06:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7q0fCDmcRBZ5meWKCDIzQlb0VUrPjwMYkWBCRX03gBc=; b=kaTVRjhODsDONtKpN1WEZCvWIACEbmElVW3Q+/P76NS/b00R/tRzURn9Uuv+HCLyj/+eaBmgdHs3JJaf6rywxdqdBRe3s0w2llf8sClkyNw2tgv6oTTXsNIzj1X3La4HzJ0izhxpjQ7CAZaUkSSfaZHQ/46JDPRGgwigWAKN6uM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peng.fan@nxp.com; Received: from linux-u7w5.ap.freescale.net.net (92.121.68.129) by VI1PR04MB4496.eurprd04.prod.outlook.com (2603:10a6:803:69::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1101.18; Wed, 5 Sep 2018 02:06:55 +0000 From: Peng Fan To: sbabic@denx.de Date: Wed, 5 Sep 2018 10:11:56 +0800 Message-Id: <20180905021219.12828-10-peng.fan@nxp.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180905021219.12828-1-peng.fan@nxp.com> References: <20180905021219.12828-1-peng.fan@nxp.com> MIME-Version: 1.0 X-Originating-IP: [92.121.68.129] X-ClientProxiedBy: HK0PR03CA0022.apcprd03.prod.outlook.com (2603:1096:203:2e::34) To VI1PR04MB4496.eurprd04.prod.outlook.com (2603:10a6:803:69::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: fbe2f2b0-3d7b-4082-5879-08d612d442a2 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR04MB4496; X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB4496; 3:HvFXsRTCQQo8y3uNa7yfaMKBe2E47Hm5XayumqNlh0Q6RYm2zyohXovobF51NHQZvfCXigFLjmxzFA8Ez2lM6vt8aR8pz84LNcDqZmsx8WTOeJKOYHNJtXyXot+tIiw0UmPGu2qBQIAqwX8gsPz4fsYjk1qTR9XNGfpBnGVOt9TjYwB5WP3CyBDJXc2mQ4hcso+NxghYvVFhvLTx8VkqJiqD2RspxByLRzrhyqXfCrctJ8HKiL1//F6/IyHNjGRO; 25:vhnOeNC8rKIrYfEDPICL5BtYaSVXoLv8QOvnsfrdqOfClNiAqBITsXAuZc99qth3CNAWP9p+CG4cZrJAgVpUSgyR3WkqP9ScQz39HtaJrkR866cZkCFRE8N4hAAgIXGKPwksPPcYxxWV5oQvnBD0xt6GmpRfc9Ihl4fHW4dvK+AXQdj86dup9PvwR0RGwTrVnkeN4j+fNxNBGrh258qm+NgTte7izw1rFsG9V3m+2SsgmLeyhyytnNXqTePKZSF6gi6Qg+PhY/th8s4XWa6ttu88sVOar4ka3LqUH2bIe0E62AOYFtRYUh+LkNqe5VicgsKqLKtcCpxd4il9JXj7Ig==; 31:i/7F/jaOwUDSN/c4tACkpMUvKs66UreqEOZX82Es4qnRqZO1Nx2NQBTEvxqaxtnpZmsMAj6LIr7Pmg9xU/bTmTy7zyVNm3n8ffKWWJ+kyvSP2AFnfoXz6mGQoPTYAD4A47kZxp9cOmWwJcTWybtaYpyOVuiu3U6RqYiSmT83deLvYufE2JavpAT1VbHcw4cL8E9ClG/1oXqvaZtt8NhBJwRZC1B+1NaCY0d9FkdBTuE= X-MS-TrafficTypeDiagnostic: VI1PR04MB4496: X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB4496; 20:G7J5Q/HnTukQAgS7zrOHz+zutVwjWRbdXDRhNMf7cj3U7VKtt7ukAsbv2Z7I2qGQHHFMVzxF020ahUJbju4Y8eJR+BvCFQfuKziOyDwtnxk/E3k1/zTbd27ZmnbazN6mjkEvzh+n6VrZvSGokee1G93F118+8YU5bziP+yH2cleU3Yl6hyFkHdDZUfxRLT34N48NU2a2KIM7TfiDRUOulQ7K4wuksSl9Q2qulMvEkTqmvn8PRyvEXvbFZoeIKOunKRqih/ksAFZQDr6Dr5brh5ECAnm2DeaC7rW4aSyzlyyZqyN6zji4t7Zhr/fAzhYzRzZWngPw/cNWJ92d2DsUT8BOQQV59G+I0v8iT+xMBWstSBEkm6O/MrB0bCW/F8efcuBKCt7TjMDZzZx8YJk2WyZxKe6ssgsvZsPi5UkO2ouYzIPdroLWuQTVe8zGJQr3FIoTiUhMc+hOvsEqK9Z/9UYqesSRooyK+g6JCZ3zHN1Xkyh3vGSNOD2tGFA3cYUY; 4:NDTE7Z/ynFMA2U7yQrCVs7za5sBE533OE8fo0qQ5HnkmvZ9NsvHz2OPrULQoerC5dxWHPLtsIxV1LXCgL+xdhvC2szi79LKEGcuU+bTOlc1KyGujO/77pj82IntMFcOXGGDOIARhjNktcxCV4df4RaINu0GEVXWhEJN7U9GIndISCD2+qDIJhvIkrh4jbs1h97NcBFdKDmr2kpI+85FrPNh0H9pzzF2MFEsXWFnNQA67dn5rLuw8VZ+DglsLhZJFCUkvt+YbcE14/cD5tzzLLCooGziza4EHLl5c7n5+E41rdTT9h9fI6jFcCmVTkfXf X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(823301075)(93006095)(93001095)(3231311)(944501410)(52105095)(3002001)(10201501046)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(201708071742011)(7699016); SRVR:VI1PR04MB4496; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB4496; X-Forefront-PRVS: 078693968A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(366004)(136003)(376002)(346002)(39860400002)(189003)(199004)(11346002)(305945005)(25786009)(7736002)(386003)(8936002)(478600001)(26005)(36756003)(6116002)(1076002)(3846002)(476003)(446003)(81166006)(575784001)(50226002)(86362001)(6506007)(47776003)(50466002)(48376002)(8676002)(2616005)(81156014)(956004)(16526019)(186003)(16586007)(66066001)(53936002)(316002)(4326008)(76176011)(68736007)(5660300001)(6512007)(2361001)(51416003)(486006)(106356001)(97736004)(105586002)(14444005)(6486002)(6916009)(44832011)(2351001)(2906002)(52116002)(309714004); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB4496; H:linux-u7w5.ap.freescale.net.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR04MB4496; 23:eNEw7edDSPWEcIBcis9tVtjty85Qdkw+nGrT6X/0U?= Qo61govdArJ82L5jaXLUcwztaDAMH2F/eQ70pgA4L75Rl7DJfjM8tAd+K4HNI8xSSOsItqVmvEJ8J6xeyoYzj0rHL2iRwXLXZ2ypb5etDUO8JR11wOZTajsXJ0Nm0Yb+YjdmSYSheLWxnUZu7Eb2vJBflPSbaNpwGk8eRy9ebbjerekAuspns/IrOjBIuL7PLYGFKe2OW+6c6kd6qgKoAVcDCh9TJeES1J7fydZ3nLf6IaG1eQTRtOieSH7v8XslI8qLaqkoG2fs4k7SVfJ1rTFLVMYGTFM0CHoGPUf67mvcjwYaUsLNyqRBgfzoVGLFD85XPP4Wj8gsa0RgSv/piCJU3dr4P9L1h/SLiSM4XucLPqeO171AKEh3OJPX3s8ctb0lc846bvwsK30MlqXkWcaaKNEwjOEN4M2h+1sXN8Ga/joQ+DGGqI2N6MGk0Bqmfp5dgHzGILCiWm4EfEATud4QVyMVG6paIu7O6hQE+l78gnyuuqRPuVNvVTiX7MJCHEi6z4dCHuEdoZraLWpG6fmHVOaMNNcyC8PyzsFxFBKvfdLj+ogoao2KJ/h0WJNvKGZ5wM9VLPpf2rPssE7ZNObQbwH477pt/tlqSOj9SiLKtJ/Op98pNEc+AzhEz6NwpqDz6gUz8Sz43RmQXxutkiLJgqDhirFBDVLZwklVra5y4YfeZM+Hk91d0TfJ12sQB9cEOWctyQsW5fwXrONMj+F+i8ci0LACbtOM36rtq3lWJo3qG+ihnHrHTkCV6uZqrAacEE+zBz1DWue796OEf8REAXduakYbBPGu+nrKzR+3hKelfF09zv1A+5TbV2ucH+C58oHzmIcSw1OhdHszF2laSc/D2ee3RGp6y9iObTTpefKVL1O9fnt2Br0vVRNGG3xDcXx4DYc8EjwHtMwbtDB0vIWguECK502WvnyxbfPJUa0kCWfcvBfOIXMighBDp0ICo/cytmtz+M9HkWRvFC7ximF27XIdVKuXGe4Tso0oYo2YhtJ6h1b6rRkOO5KUl8L+Ea8WFeepiBrJnq55m4UObYi5/8BXOfXRMPcsyUAbU25T2S+9ufHFvbwB7P2vjvFzaeFXyXreXO7gtRNjmJ42R3HQYVgXwqm30onSO5P1Mtw58Jyz9S2XUfCyGp3HtoBvCeqNCKn4RIAW0xzf0EUukNnz6p2eccMqRO6SEr+VoN83AYM7CO7vP9tUwqR3fAYWjII8jBBkkHKXCx+2Q7L5xst5EHsa+zjSZE/kpKntA== X-Microsoft-Antispam-Message-Info: aSlbdjRTvEH1ySg6ec85Y/F1EZHmH6BNuOAeX45o7RxGyK7Oa1n9AClp6ZwkTTFu7TvJRybovSpUBJBADShy85caEuGmlFZIR4SDTTOi6U03UBmAA38TUPpwyyz+vZC48XMcG1/2YVaxPPLBR+j55E88tzOK8WSvqpVtTLfurr1Z5BeCs5Kn5hIH30XJzC9WmNrqIqrGMH3vlp9cRt4emCPhQ66FA8G5lTe/jWyN2oHd8wfipzlpMeWimzTRLc6dftimS4JMouXxTjAw8FEYc18pUpcBHowBrRjpzeu8DfZJVUGX0gVrqhHhacb2hCvoqUZbnVOTm3e3UjJpEP2Y6Aq2UHmc9XTnSAFvvLVTOAA= X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB4496; 6:+7x/Str3IOm5ZWCpv7wTKhYR89gOhtNd08m1B10W036f6+9MJcQSUyulB9KFK8CXHfmZ4mR/Ac34OD7Xn+UTvtmzuy8GwBde1Xm6lR+IKO1+YgdDxqxlZ0iI2XcqKr/fLPOwC0w+APgpt79EuRf9aMRiGNfG1atsyJ6v8CreRNgIlpXf8ivCnkisuYcc4Hd1GtRJaSDGw18yVDUqIFFiww5arZB05PrtpPCc7aRZW9m1bzOqSCP7/WZ30VMeVJJjC6429/ylImj9poKvMZ1ZYLBuP+RxxJTaKKjYdA5gvQ7Gm8kw7ZseGph7adDJNYTbDQcz0xUS0wAAP2LvSZT4rxStLf0VdR23SCnco260+QP+V8SJBB6qmXsKKbdcfcWRorSp6D/AAf80ZM0KiLcp3ru2RkpM31e/M9MEAdsF3ZgNhCEvWugem5WWkbAHOCgzPrtwUJQR4R9oDWa39tb8bQ==; 5:B6dTXnle9H+j+RnnEBbMRDYF+6+Pz4X0Wb2jY/aqkhWBu7aHHfM1S1IJFmhCXBinVbwb62owUsUP3sweB7hWGpPcU9OctFLFcXj5A/bv+Yhfa/Ds2at2Up78o3cVEMm0Um46M4m2+DYf7Z+1kYmVKn7QqTpHdRR9bGsCTAVKtfU=; 7:m6hmMaKzSjP3YnWJMyFfnIAThTYXpR1Mpa9HZCeTWP5iFHTFBGbq01kK9OlIGoPWYARtIrUBHJvPxM9w5hQo2D+DuFL3AdhPGWNiNSy08fjLWpZmQtDEUCTXFQl8M5DGcjln2SZ6Iq9O7DcoRJXVFt7UzOfZwREtdYx1VSL2DSoFTKv+uHSKyyz8epsSb6sdj4XMVJwUiej7nA71Q9fUhPMkel9l49OOepKahOljmVNAUEew2DgfbjkJSBGOmZNr SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2018 02:06:55.6056 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fbe2f2b0-3d7b-4082-5879-08d612d442a2 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB4496 Cc: fabio.estevam@nxp.com, u-boot@lists.denx.de Subject: [U-Boot] [PATCH V4 09/32] misc: imx8: add scfw api impementation X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Add clk/misc/pad/pm/rm scfw api implementaion for different drivers to invoke. The low level code is using misc_call to invoke imx8_scu driver. Signed-off-by: Peng Fan Cc: Stefano Babic --- arch/arm/include/asm/arch-imx8/sci/sci.h | 28 +++ drivers/misc/imx8/Makefile | 2 +- drivers/misc/imx8/scu_api.c | 316 +++++++++++++++++++++++++++++++ 3 files changed, 345 insertions(+), 1 deletion(-) create mode 100644 drivers/misc/imx8/scu_api.c diff --git a/arch/arm/include/asm/arch-imx8/sci/sci.h b/arch/arm/include/asm/arch-imx8/sci/sci.h index d0ff5c5c41..4704ba9699 100644 --- a/arch/arm/include/asm/arch-imx8/sci/sci.h +++ b/arch/arm/include/asm/arch-imx8/sci/sci.h @@ -55,4 +55,32 @@ static inline int sc_err_to_linux(sc_err_t err) return ret; } +/* PM API*/ +int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode); +int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate); +int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate); +int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate); +int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate); +int sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_bool_t enable, sc_bool_t autog); + +/* MISC API */ +int sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl, + u32 *val); +void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *boot_dev); +void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status); + +/* RM API */ +sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr); +int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start, + sc_faddr_t *addr_end); +sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource); + +/* PAD API */ +int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val); #endif diff --git a/drivers/misc/imx8/Makefile b/drivers/misc/imx8/Makefile index 3395340d22..ee05893cbb 100644 --- a/drivers/misc/imx8/Makefile +++ b/drivers/misc/imx8/Makefile @@ -1,3 +1,3 @@ # SPDX-License-Identifier: GPL-2.0+ -obj-y += scu.o +obj-y += scu_api.o scu.o diff --git a/drivers/misc/imx8/scu_api.c b/drivers/misc/imx8/scu_api.c new file mode 100644 index 0000000000..c19836e84c --- /dev/null +++ b/drivers/misc/imx8/scu_api.c @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2018 NXP + * + * Peng Fan + */ + +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* CLK and PM */ +int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM; + RPC_FUNC(&msg) = (u8)PM_FUNC_SET_CLOCK_RATE; + RPC_U32(&msg, 0U) = *(u32 *)rate; + RPC_U16(&msg, 4U) = (u16)resource; + RPC_U8(&msg, 6U) = (u8)clk; + RPC_SIZE(&msg) = 3U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: rate:%u resource:%u: clk:%u res:%d\n", + __func__, *rate, resource, clk, RPC_R8(&msg)); + + *rate = RPC_U32(&msg, 0U); + + return ret; +} + +int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_pm_clock_rate_t *rate) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM; + RPC_FUNC(&msg) = (u8)PM_FUNC_GET_CLOCK_RATE; + RPC_U16(&msg, 0U) = (u16)resource; + RPC_U8(&msg, 2U) = (u8)clk; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) { + printf("%s: resource:%d clk:%d: res:%d\n", + __func__, resource, clk, RPC_R8(&msg)); + return ret; + } + + if (rate) + *rate = RPC_U32(&msg, 0U); + + return 0; +} + +int sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk, + sc_bool_t enable, sc_bool_t autog) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM; + RPC_FUNC(&msg) = (u8)PM_FUNC_CLOCK_ENABLE; + RPC_U16(&msg, 0U) = (u16)resource; + RPC_U8(&msg, 2U) = (u8)clk; + RPC_U8(&msg, 3U) = (u8)enable; + RPC_U8(&msg, 4U) = (u8)autog; + RPC_SIZE(&msg) = 3U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: resource:%d clk:%d: enable:%d autog: %d, res:%d\n", + __func__, resource, clk, enable, autog, RPC_R8(&msg)); + + return ret; +} + +int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, + sc_pm_power_mode_t mode) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM; + RPC_FUNC(&msg) = (u8)PM_FUNC_SET_RESOURCE_POWER_MODE; + RPC_U16(&msg, 0U) = (u16)resource; + RPC_U8(&msg, 2U) = (u8)mode; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: resource:%d mode:%d: res:%d\n", + __func__, resource, mode, RPC_R8(&msg)); + + return ret; +} + +/* PAD */ +int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_PAD; + RPC_FUNC(&msg) = (u8)PAD_FUNC_SET; + RPC_U32(&msg, 0U) = (u32)val; + RPC_U16(&msg, 4U) = (u16)pad; + RPC_SIZE(&msg) = 3U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: val:%d pad:%d: res:%d\n", + __func__, val, pad, RPC_R8(&msg)); + + return ret; +} + +/* MISC */ +int sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl, + u32 *val) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC; + RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_CONTROL; + RPC_U32(&msg, 0U) = (u32)ctrl; + RPC_U16(&msg, 4U) = (u16)resource; + RPC_SIZE(&msg) = 3U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: ctrl:%d resource:%d: res:%d\n", + __func__, ctrl, resource, RPC_R8(&msg)); + + if (!val) + *val = RPC_U32(&msg, 0U); + + return ret; +} + +void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *boot_dev) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC; + RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_BOOT_DEV; + RPC_SIZE(&msg) = 1U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: res:%d\n", __func__, RPC_R8(&msg)); + + if (!boot_dev) + *boot_dev = RPC_U16(&msg, 0U); +} + +void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC; + RPC_FUNC(&msg) = (u8)MISC_FUNC_BOOT_STATUS; + RPC_U8(&msg, 0U) = (u8)status; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_TRUE, &msg, size, &msg, size); + if (ret) + printf("%s: status:%d res:%d\n", + __func__, status, RPC_R8(&msg)); +} + +/* RM */ +sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + sc_err_t result; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM; + RPC_FUNC(&msg) = (u8)RM_FUNC_IS_MEMREG_OWNED; + RPC_U8(&msg, 0U) = (u8)mr; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + result = RPC_R8(&msg); + + if (result != 0 && result != 1) { + printf("%s: mr:%d res:%d\n", __func__, mr, RPC_R8(&msg)); + if (ret) + printf("%s: mr:%d res:%d\n", __func__, mr, + RPC_R8(&msg)); + + } + + return (sc_bool_t)result; +} + +int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start, + sc_faddr_t *addr_end) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM; + RPC_FUNC(&msg) = (u8)RM_FUNC_GET_MEMREG_INFO; + RPC_U8(&msg, 0U) = (u8)mr; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: mr:%d res:%d\n", __func__, mr, RPC_R8(&msg)); + + if (addr_start) + *addr_start = ((u64)RPC_U32(&msg, 0U) << 32U) | + RPC_U32(&msg, 4U); + + if (addr_end) + *addr_end = ((u64)RPC_U32(&msg, 8U) << 32U) | + RPC_U32(&msg, 12U); + + return ret; +} + +sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource) +{ + struct udevice *dev = gd->arch.scu_dev; + int size = sizeof(struct sc_rpc_msg_s); + struct sc_rpc_msg_s msg; + int ret; + u8 result; + + if (!dev) + hang(); + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM; + RPC_FUNC(&msg) = (u8)RM_FUNC_IS_RESOURCE_OWNED; + RPC_U16(&msg, 0U) = (u16)resource; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + result = RPC_R8(&msg); + if (result != 0 && result != 1) { + printf("%s: resource:%d res:%d\n", + __func__, resource, RPC_R8(&msg)); + if (ret) + printf("%s: res:%d res:%d\n", __func__, resource, + RPC_R8(&msg)); + } + + + return !!result; +}