From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E50C9C11F64 for ; Tue, 29 Jun 2021 02:01:55 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6BA7161CDD for ; Tue, 29 Jun 2021 02:01:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6BA7161CDD Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oss.nxp.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 8DF6782F00; Tue, 29 Jun 2021 03:59:55 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=oss.nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="jLWzRTdS"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id EF8C082EA8; Tue, 29 Jun 2021 03:59:46 +0200 (CEST) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04on0620.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0e::620]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 18D7E82EE6 for ; Tue, 29 Jun 2021 03:59:43 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=oss.nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=peng.fan@oss.nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IS2o0t3w8c/kvq9DcTYwuj6/+dj/UmV164EFpbFk5xpvGjwDPUbgmW8s4HKo6Q83GpEQqhGC6n/WQxFlXA/nfK1rpZmsRkpvIVmi7uk9M0+eoj8L0QiJlgBdiJXk3nbSMv33RnirYqzBVTZ/tMtCegE8K9Yq0gMVsIPaKEQVZHJeekQ4qpmQRiFGjV2JaiI02OgxT/poY6Ho8yz3SewsYxks4FMlQk6yOGcJckRvoQ2nASah/tLKSJ35JOUz1zLija5AUsb1TyI0SprV+Pp421tB5zdvkbiNyjj2MkGc/ogNVeiguwzNmu+W1K3/HFTUcwGMuwdmkgG0S+yd0weRjQ== 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=XAcm6AOqn8mkVlzKxdrn4DkCzC8zAQYHngntoVIefD8=; b=aXl2PZrjc0JW5VdVCiMC2itYQ6B34lsjvlYNe4F12jHe/zTcewrlowbzj7bHaCcb/Lrbi8c8eD8V/w+crxs/bWsP287Hpn7nChlNxHZRT8T0fRt3UYbGEMiprRZpJDK0bdc11G7bvqsY+/qpt9+j+4F4A2ijk8tMBrYn0s6WkPVYBr+g3JNB1d/8+1HLmULA/G6LqPRSde4+zCr34gZvEXl7DxnxKOnL2i5ueACOindOMjdqoqZ2KLQUAJ+l+uA+nAexOFFQht4ayhERRMRDeP/zvQWn0qKt97IlVkG9xQNRPFeXTf2+yCGcS9iaEx4GVV7WH8hwDng3bnQIwTdwBg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XAcm6AOqn8mkVlzKxdrn4DkCzC8zAQYHngntoVIefD8=; b=jLWzRTdSyueZwqNSOJZA/H6Vt1+QEW3r5ya8xoXaEIjpEdN/mXEhLY14LMO8gNojmQM4KaDv2FmhWSkYkGJHmjyDc8uYhyBPCfgQPuVOukdK1J6sd9BGt/JkYhZFKyH2lU9cdv53h08uYMAtZt1ogvvXlJKGhODQl8dbE1gzLSg= Authentication-Results: denx.de; dkim=none (message not signed) header.d=none;denx.de; dmarc=none action=none header.from=oss.nxp.com; Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) by DB7PR04MB4633.eurprd04.prod.outlook.com (2603:10a6:5:36::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.19; Tue, 29 Jun 2021 01:59:41 +0000 Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::c445:d742:eb76:86dd]) by DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::c445:d742:eb76:86dd%9]) with mapi id 15.20.4264.026; Tue, 29 Jun 2021 01:59:41 +0000 From: "Peng Fan (OSS)" To: sbabic@denx.de, festevam@gmail.com Cc: uboot-imx@nxp.com, u-boot@lists.denx.de, Ye Li Subject: [PATCH V2 12/46] driver: misc: Add MU and S400 API to communicate with Sentinel Date: Tue, 29 Jun 2021 10:32:06 +0800 Message-Id: <20210629023240.22394-13-peng.fan@oss.nxp.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210629023240.22394-1-peng.fan@oss.nxp.com> References: <20210629023240.22394-1-peng.fan@oss.nxp.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [119.31.174.71] X-ClientProxiedBy: SG2PR06CA0088.apcprd06.prod.outlook.com (2603:1096:3:14::14) To DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from linux-1xn6.ap.freescale.net (119.31.174.71) by SG2PR06CA0088.apcprd06.prod.outlook.com (2603:1096:3:14::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.19 via Frontend Transport; Tue, 29 Jun 2021 01:59:39 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6be2b353-b90e-4b7f-696b-08d93aa18ecb X-MS-TrafficTypeDiagnostic: DB7PR04MB4633: X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:167; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: zGvQApgL4b5arrjQjLsjWef+4k0Z9+G2AXguMjMlS/pWMcbicm68lW3X3SlZ+NCNgjUAgY1p2cfetnev219pdO5XeCMqEb8EETFHhdXTeshwGCZK6GEMFeXqBT4WQSJCPQYLIozgncNl0eJSh8bkQCBVzfW7OzLcTr/i+ZDelGXPb/3wkEbET3FxRFN7ng/p7E4rHYyJcGBqwlpyXYEY7ptVJ7LpP05DsaceVWoJo/s3p7zbPkO0f5U7Dz53OcKoXPj5QQPwuKhJHAvFkmdB994AmOmlLJoQBJdcZ5soL5CtkQ276HrmD21W5xYu1R/T/Q5HZfa03oEwBKfAUfEUJ7XpG+Hw4hQD6M+z2F+cq1/XVjMfBTwrTsw5MX5/oQOZ+ImXubT4xGttqkiDT5yX2harm7xwXk9ec+BlmW8zOo+/FCaDujVfbXA3FAlhgqKgMmnap6pubNmHJuJ73faVW4J8qASG8qO1dRKxgB78qCktS/BO4op4G2ekrj8Amys07gaAaoLhme+tsWegLvkRMVBJVHlHQ93qcKqZDW1gq5PI9DMZBxxbnpHalP15oqKrwgu+NAKo7qaVtJdCge7KnxzzRtNdyCEsQQgxxrgnK9suEsJ6TRWoLuWZHq1iIT2pbEi7+jE7P91wtoW5xKpSyZ6+6AWehtKR6r9ZU3/92LvWQh3cccgATCDVAwFvyPEiAUKaslV7KmgKrQ4P0GKinA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB6PR0402MB2760.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(346002)(376002)(39860400002)(136003)(366004)(396003)(16526019)(66946007)(38100700002)(38350700002)(8936002)(6666004)(4326008)(26005)(83380400001)(6506007)(1076003)(186003)(8676002)(2906002)(478600001)(6486002)(2616005)(956004)(5660300002)(52116002)(86362001)(66476007)(6512007)(316002)(66556008); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?v1UPFVsgF9+cz4zZogDcExvT0sjb2aZDFYoWOL6DKHKmNk6ZikU6vSYj2DBP?= =?us-ascii?Q?IJCTh0I5IawS2IcoW9mkMbS8YaCMFgLjxnEaFW4XHN8AxulSJEirglDGJhpW?= =?us-ascii?Q?t9d1dZjV3j/bGh9GKNMO/QBtIp4YQtV1/LQCUfq7setkmYxUB/JxZXcb+gc7?= =?us-ascii?Q?XYKnISyZK4OfUyZhhSS/U/CKLT5PeGMgPEu4XTlefnUBoPEc2o3NxoPF/2Md?= =?us-ascii?Q?pW0dhDcAktk3jwMteHY4N2nFrfixmiyGaFR9vw3lVJ8c9ToxWdOMdK3sP4Ej?= =?us-ascii?Q?qs+EdGhpDtCPg7FaIo/H00jBaFTUFz2/BBuEo2X8DzIS1cy6pLBSzim7C3Uj?= =?us-ascii?Q?jtN41Qmhn5uJSvHh1LwKAtSFG60WgIcoVwlmQdU3pLF4ldWgEtKIKI0rNd42?= =?us-ascii?Q?POoZ/eiIm7LEO2UsJ3M/eIMCe0l4JFxtkJ4mf49LfPbCT37kDD+cj/PyfX+H?= =?us-ascii?Q?u3GGBQCwgaI+gRClIqlQQRfBLKG/8TAzJ4Dc/qOM72ZPJ4OdJoEOkNzdF2XQ?= =?us-ascii?Q?y3KFMzbV3SF4f8qSbZ2xI/l2U3NLMufVALNrwJq3aemTchevu8cXmkzSNTDx?= =?us-ascii?Q?RL61mTKduU+wLDD12F22vF+XhZkrw6nQZDWWTKjM7LvkV/ioHzGCaMILIFjJ?= =?us-ascii?Q?MknKbeFBfdAc57jmIdI9IhyzUwqny7dR/fypPGJaea2YyWt3Kt1GwBdeQIL7?= =?us-ascii?Q?rGNqIF3zwX2kY13mxaFG79dR9fRs4iZm3bKeXGIqGZMBqaNtoKGjUOhZv8r4?= =?us-ascii?Q?c2+Ticy3xo8+L7tq545X7MmTI3f7SzSyc87C5HC0I30AVyfLIg0fURKXMkV1?= =?us-ascii?Q?t61iKUvr7bH2BIQXwRqmUDBlcXQS7/dkw2JWWfT5B5lnVeMLsSQhuRyPArZC?= =?us-ascii?Q?0A3QSCIOfjBDS0xjvk/sC7Nm/qrzgYWk1fn3ODpRLcknXHXGZmQe7R3mNG8Y?= =?us-ascii?Q?Vf7X+bTGroQSQmZVbRBRsTrGJn0fxc/sXsQtDC0iFvUTXrsPXWnEpXYC7qn1?= =?us-ascii?Q?a2IdE3mCMAY4BfUFQ40raXY+TtMFsUCLI9nS7IZpoe+EF0EslHDQKlXBDb69?= =?us-ascii?Q?aNvRE3Tsh/AmxmPo5W0oTiYMiamKbUsdiJnmKKu6VpnjyNRT0GeM3h4SFcPY?= =?us-ascii?Q?wQcokPETkDtuKd9BsxXsyNfV7cYg49VMX9uIM46FpdKU6v95Lh/yktGRytVH?= =?us-ascii?Q?/QAeEkQuLBXXdLkUp39bCw/U/hu3y/L7tTLumJPlc0jH/ygapq6khOm22rqH?= =?us-ascii?Q?9zVfLIFHjP0kwWqIo1KpMEW7MM7q9mjRV8ttXBoCbElzh9aLAQSbZy59PBAd?= =?us-ascii?Q?OKAytBYvTorNuH3zPPyKoV9B?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6be2b353-b90e-4b7f-696b-08d93aa18ecb X-MS-Exchange-CrossTenant-AuthSource: DB6PR0402MB2760.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jun 2021 01:59:41.2535 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ipoQZiQKOuL/P3q6a7OpH/UElyaflnZH9DhQbzKFd+giwGGgoQPO4L0gF5GgrhasfCxWhU3uWg5KtX5c+2xWZg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR04MB4633 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean From: Ye Li Add MU driver and S400 API. Need enable MISC driver to work Signed-off-by: Ye Li --- arch/arm/include/asm/arch-imx8ulp/s400_api.h | 30 +++ arch/arm/include/asm/global_data.h | 5 + drivers/misc/Makefile | 1 + drivers/misc/imx8ulp/Makefile | 3 + drivers/misc/imx8ulp/imx8ulp_mu.c | 247 +++++++++++++++++++ drivers/misc/imx8ulp/s400_api.c | 41 +++ 6 files changed, 327 insertions(+) create mode 100644 arch/arm/include/asm/arch-imx8ulp/s400_api.h create mode 100644 drivers/misc/imx8ulp/Makefile create mode 100644 drivers/misc/imx8ulp/imx8ulp_mu.c create mode 100644 drivers/misc/imx8ulp/s400_api.c diff --git a/arch/arm/include/asm/arch-imx8ulp/s400_api.h b/arch/arm/include/asm/arch-imx8ulp/s400_api.h new file mode 100644 index 0000000000..3ba6b525c5 --- /dev/null +++ b/arch/arm/include/asm/arch-imx8ulp/s400_api.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2021 NXP + */ + +#ifndef __S400_API_H__ +#define __S400_API_H__ + +#define AHAB_VERSION 0x6 +#define AHAB_CMD_TAG 0x17 +#define AHAB_RESP_TAG 0xe1 + +#define AHAB_LOG_CID 0x21 +#define AHAB_AUTH_OEM_CTNR_CID 0x87 +#define AHAB_VERIFY_IMG_CID 0x88 +#define AHAB_RELEASE_CTNR_CID 0x89 +#define AHAB_RELEASE_RDC_REQ_CID 0xC4 + +#define S400_MAX_MSG 8U + +struct imx8ulp_s400_msg { + u8 version; + u8 size; + u8 command; + u8 tag; + u32 data[(S400_MAX_MSG - 1U)]; +}; + +int ahab_release_rdc(u8 core_id); +#endif diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h index 2aff1c467c..cfedae05ea 100644 --- a/arch/arm/include/asm/global_data.h +++ b/arch/arm/include/asm/global_data.h @@ -87,6 +87,11 @@ struct arch_global_data { #ifdef CONFIG_ARCH_IMX8 struct udevice *scu_dev; #endif + +#ifdef CONFIG_ARCH_IMX8ULP + struct udevice *s400_dev; +#endif + }; #include diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 0c67d43a5d..b64cd2a4de 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -46,6 +46,7 @@ obj-$(CONFIG_SANDBOX) += irq_sandbox.o obj-$(CONFIG_$(SPL_)I2C_EEPROM) += i2c_eeprom.o obj-$(CONFIG_IHS_FPGA) += ihs_fpga.o obj-$(CONFIG_IMX8) += imx8/ +obj-$(CONFIG_IMX8ULP) += imx8ulp/ obj-$(CONFIG_LED_STATUS) += status_led.o obj-$(CONFIG_LED_STATUS_GPIO) += gpio_led.o obj-$(CONFIG_MPC83XX_SERDES) += mpc83xx_serdes.o diff --git a/drivers/misc/imx8ulp/Makefile b/drivers/misc/imx8ulp/Makefile new file mode 100644 index 0000000000..1d792415d2 --- /dev/null +++ b/drivers/misc/imx8ulp/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0+ + +obj-y += s400_api.o imx8ulp_mu.o diff --git a/drivers/misc/imx8ulp/imx8ulp_mu.c b/drivers/misc/imx8ulp/imx8ulp_mu.c new file mode 100644 index 0000000000..3f6dd558e6 --- /dev/null +++ b/drivers/misc/imx8ulp/imx8ulp_mu.c @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2020 NXP + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +struct mu_type { + u32 ver; + u32 par; + u32 cr; + u32 sr; + u32 reserved0[68]; + u32 tcr; + u32 tsr; + u32 rcr; + u32 rsr; + u32 reserved1[52]; + u32 tr[16]; + u32 reserved2[16]; + u32 rr[16]; + u32 reserved4[14]; + u32 mu_attr; +}; + +struct imx8ulp_mu { + struct mu_type *base; +}; + +#define MU_SR_TE0_MASK BIT(0) +#define MU_SR_RF0_MASK BIT(0) +#define MU_TR_COUNT 4 +#define MU_RR_COUNT 4 + +static inline void mu_hal_init(struct mu_type *base) +{ + writel(0, &base->tcr); + writel(0, &base->rcr); +} + +static int mu_hal_sendmsg(struct mu_type *base, u32 reg_index, u32 msg) +{ + u32 mask = MU_SR_TE0_MASK << reg_index; + u32 val; + int ret; + + assert(reg_index < MU_TR_COUNT); + + debug("sendmsg sr 0x%x\n", readl(&base->sr)); + + /* Wait TX register to be empty. */ + ret = readl_poll_timeout(&base->tsr, val, val & mask, 10000); + if (ret < 0) { + debug("%s timeout\n", __func__); + return -ETIMEDOUT; + } + + debug("tr[%d] 0x%x\n", reg_index, msg); + + writel(msg, &base->tr[reg_index]); + + return 0; +} + +static int mu_hal_receivemsg(struct mu_type *base, u32 reg_index, u32 *msg) +{ + u32 mask = MU_SR_RF0_MASK << reg_index; + u32 val; + int ret; + + assert(reg_index < MU_TR_COUNT); + + debug("receivemsg sr 0x%x\n", readl(&base->sr)); + + /* Wait RX register to be full. */ + ret = readl_poll_timeout(&base->rsr, val, val & mask, 10000); + if (ret < 0) { + debug("%s timeout\n", __func__); + return -ETIMEDOUT; + } + + *msg = readl(&base->rr[reg_index]); + + debug("rr[%d] 0x%x\n", reg_index, *msg); + + return 0; +} + +static int imx8ulp_mu_read(struct mu_type *base, void *data) +{ + struct imx8ulp_s400_msg *msg = (struct imx8ulp_s400_msg *)data; + int ret; + u8 count = 0; + + if (!msg) + return -EINVAL; + + /* Read first word */ + ret = mu_hal_receivemsg(base, 0, (u32 *)msg); + if (ret) + return ret; + count++; + + /* Check size */ + if (msg->size > S400_MAX_MSG) { + *((u32 *)msg) = 0; + return -EINVAL; + } + + /* Read remaining words */ + while (count < msg->size) { + ret = mu_hal_receivemsg(base, count % MU_RR_COUNT, + &msg->data[count - 1]); + if (ret) + return ret; + count++; + } + + return 0; +} + +static int imx8ulp_mu_write(struct mu_type *base, void *data) +{ + struct imx8ulp_s400_msg *msg = (struct imx8ulp_s400_msg *)data; + int ret; + u8 count = 0; + + if (!msg) + return -EINVAL; + + /* Check size */ + if (msg->size > S400_MAX_MSG) + return -EINVAL; + + /* Write first word */ + ret = mu_hal_sendmsg(base, 0, *((u32 *)msg)); + if (ret) + return ret; + count++; + + /* Write remaining words */ + while (count < msg->size) { + ret = mu_hal_sendmsg(base, count % MU_TR_COUNT, + msg->data[count - 1]); + if (ret) + return ret; + count++; + } + + return 0; +} + +/* + * Note the function prototype use msgid as the 2nd parameter, here + * we take it as no_resp. + */ +static int imx8ulp_mu_call(struct udevice *dev, int no_resp, void *tx_msg, + int tx_size, void *rx_msg, int rx_size) +{ + struct imx8ulp_mu *priv = dev_get_priv(dev); + u32 result; + int ret; + + /* Expect tx_msg, rx_msg are the same value */ + if (rx_msg && tx_msg != rx_msg) + printf("tx_msg %p, rx_msg %p\n", tx_msg, rx_msg); + + ret = imx8ulp_mu_write(priv->base, tx_msg); + if (ret) + return ret; + if (!no_resp) { + ret = imx8ulp_mu_read(priv->base, rx_msg); + if (ret) + return ret; + } + + result = ((struct imx8ulp_s400_msg *)rx_msg)->data[0]; + if ((result & 0xff) == 0) + return 0; + + return -EIO; +} + +static int imx8ulp_mu_probe(struct udevice *dev) +{ + struct imx8ulp_mu *priv = dev_get_priv(dev); + fdt_addr_t addr; + + debug("%s(dev=%p) (priv=%p)\n", __func__, dev, priv); + + addr = devfdt_get_addr(dev); + if (addr == FDT_ADDR_T_NONE) + return -EINVAL; + + priv->base = (struct mu_type *)addr; + + debug("mu base 0x%lx\n", (ulong)priv->base); + + /* U-Boot not enable interrupts, so need to enable RX interrupts */ + mu_hal_init(priv->base); + + gd->arch.s400_dev = dev; + + return 0; +} + +static int imx8ulp_mu_remove(struct udevice *dev) +{ + return 0; +} + +static int imx8ulp_mu_bind(struct udevice *dev) +{ + debug("%s(dev=%p)\n", __func__, dev); + + return 0; +} + +static struct misc_ops imx8ulp_mu_ops = { + .call = imx8ulp_mu_call, +}; + +static const struct udevice_id imx8ulp_mu_ids[] = { + { .compatible = "fsl,imx8ulp-mu" }, + { } +}; + +U_BOOT_DRIVER(imx8ulp_mu) = { + .name = "imx8ulp_mu", + .id = UCLASS_MISC, + .of_match = imx8ulp_mu_ids, + .probe = imx8ulp_mu_probe, + .bind = imx8ulp_mu_bind, + .remove = imx8ulp_mu_remove, + .ops = &imx8ulp_mu_ops, + .priv_auto = sizeof(struct imx8ulp_mu), +}; diff --git a/drivers/misc/imx8ulp/s400_api.c b/drivers/misc/imx8ulp/s400_api.c new file mode 100644 index 0000000000..82fd3117a4 --- /dev/null +++ b/drivers/misc/imx8ulp/s400_api.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2020 NXP + * + */ + +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +int ahab_release_rdc(u8 core_id) +{ + struct udevice *dev = gd->arch.s400_dev; + int size = sizeof(struct imx8ulp_s400_msg); + struct imx8ulp_s400_msg msg; + int ret; + + if (!dev) { + printf("s400 dev is not initialized\n"); + return -ENODEV; + } + + msg.version = AHAB_VERSION; + msg.tag = AHAB_CMD_TAG; + msg.size = 2; + msg.command = AHAB_RELEASE_RDC_REQ_CID; + msg.data[0] = core_id; + + ret = misc_call(dev, false, &msg, size, &msg, size); + if (ret) + printf("Error: %s: ret %d, core id %u, response 0x%x\n", + __func__, ret, core_id, msg.data[0]); + + return ret; +} -- 2.30.0