From patchwork Mon Apr 12 12:12:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Peng Fan (OSS)" X-Patchwork-Id: 1465206 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=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-NXP1-onmicrosoft-com header.b=Bt3E12XF; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FJnYl4F8fz9sVq for ; Mon, 12 Apr 2021 22:07:55 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id D5C1481ECA; Mon, 12 Apr 2021 14:07:42 +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="Bt3E12XF"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 37C2C81E81; Mon, 12 Apr 2021 14:07:33 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-db5eur03on0608.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0a::608]) (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 6997981F97 for ; Mon, 12 Apr 2021 13:41:58 +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=PbvnlcP7NNP9KRFVj+vjRcUPeHNY+7duIsnwxeFrHYM3ST9Nf11C11aGwtWN3kEVZPP6URqKeqXzKMOENgJG8SbrKkbvgwtjGG9i0jrxN1l3B2RCXCGtR1WpxLSBtKU76uVMrS2pUtkbYUrtF1uJjEpUOQWDsdDli6lQX/froHUlLG/4bUjoQQuk7uEqxIbqZF5ibWXjWXFyk7zi3PzxuP3D63pqUQLRpw+k8Ge85MtFiEU110WgGCwLaSVZA+RPFM9GMBFWDi8TatrPH0eeQ2C9Mw18SX+w66lF6vImLJn8xjgMBJreDwGk2LXhzEHiX/r43fIl+/qQEMtorPshSQ== 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=lTLwjXEg51CwoDSc5bnL7sqdH84XWVN2NG6rHIk/tHs=; b=flhQUvdiM4nfvBHiG4sqwBZk4lgOn23c0G1QoHPS9WHsU3QIGBGfSV+3yERMVFax3S4F4shykYRcKeepVic8U6/SLAMACZBwHVQh4pCcnyqparf5kzdCNpE+1QgXNIhFXf9V3ciLdTYzspfPx4A5bCY8pAkUzr5E1AzWT/EVdt5nvNHmZCTF2t+gJXlzzlhurtKXKNVggwT+9nxUSY/O2O49D9kRl2oryiCvdn9i8Xk5MbPf+aUpJ4DgPDLwXbc1mTscV2SN0bMYRF5ArfAL+gHm9IwGlEaINeBKbImsa9lLLKx7CCp1G+ksVxORj0TyTeratNfXsi84oPGcyeq4kg== 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=lTLwjXEg51CwoDSc5bnL7sqdH84XWVN2NG6rHIk/tHs=; b=Bt3E12XFdUL5oEbOIIX/0zOOIG+IytNY1H10vyUFCObLexDzvpwK9sWdyuDWCm8i9pOnZqA/Vb/bqNIy8baZRoMAeetooTeIyzsKg4KGtlXLle5Cz1BPMH1Zk2ohgi9CVsYkUl/AP2BbtSxkXsRj0C7J7bc9WnCrpV4+MqMSxcU= 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 DB7PR04MB4233.eurprd04.prod.outlook.com (2603:10a6:5:25::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4020.22; Mon, 12 Apr 2021 11:41:56 +0000 Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::c57a:6964:f72c:21cf]) by DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::c57a:6964:f72c:21cf%11]) with mapi id 15.20.3999.032; Mon, 12 Apr 2021 11:41:56 +0000 From: "Peng Fan (OSS)" To: sbabic@denx.de, festevam@gmail.com Cc: u-boot@lists.denx.de, uboot-imx@nxp.com, Ye Li Subject: [PATCH 12/37] driver: misc: Add MU and S400 API to communicate with Sentinel Date: Mon, 12 Apr 2021 20:12:41 +0800 Message-Id: <20210412121306.11484-13-peng.fan@oss.nxp.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210412121306.11484-1-peng.fan@oss.nxp.com> References: <20210412121306.11484-1-peng.fan@oss.nxp.com> X-Originating-IP: [119.31.174.71] X-ClientProxiedBy: HK2PR0401CA0009.apcprd04.prod.outlook.com (2603:1096:202:2::19) 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 HK2PR0401CA0009.apcprd04.prod.outlook.com (2603:1096:202:2::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4020.16 via Frontend Transport; Mon, 12 Apr 2021 11:41:54 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d07b0cdd-b7f0-4ef8-23cc-08d8fda7f99f X-MS-TrafficTypeDiagnostic: DB7PR04MB4233: 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: FQJZ/oo1icyEM0QMNrBQrCs/ASBfWqZ08Qtrr9kYKdFYH3OK/rJj1VxGGRyzyKTGJ4kBJed0oRMnxDvttGdBhlwnUrSWBkIJrP3OFiU96jJ8BPz1Tkr2fuea+0H3uaynWyfUQbVJb8S0zekdLgXZtDrXB2iJlvEASMnyimJms3MrCoMtCmqdSupYRkC3ORi1XrrDuE3L/5mW8kfmw5YCQIxtQoKv+791zZO6Pm2HJx0xRC7oeJyNtuHFdiuTkVqnH1LPXpYlapth7pl1tAiP3CnYtqtIo6GGivq3PqU1XiDp/7QRY5RtST/fIn9hqg5ASueRN41YqM8/5ptrWrEpX2ERLMGe5TOGoHy3oh9MO5CUplG8QhB1mm+lCgHNVUcdD74aSSGdScS9l7GPXD+eIQpQk41kA75quAbZqaJEdWDvHljvuQz30fdFzCt6Um5sE5bk4f0b/is7Q3ZA49bvGZIHvqqmjDncIJ7CRMfpsyFfdyZjHBWIAMILlIysBZMjjzqdL6alWnjb71kA5J/CaLcn8gTP+3v+NNFXWPBAwwQ7lLQd8kl4kIwfLeQ/sijHw/tTeLXEl74DqxVmG8H902EQHvp8K16Kv7y5v8+2V1nWQTTRqrTvIkFXNVT6M+J00GZkF3A4dd0knaoAKr/qMu6oI8W2bpBGzm3/bk8TY+M= 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)(376002)(396003)(39860400002)(136003)(346002)(366004)(52116002)(83380400001)(956004)(86362001)(2616005)(6506007)(66476007)(8676002)(66556008)(1076003)(2906002)(4326008)(16526019)(316002)(26005)(5660300002)(6512007)(186003)(8936002)(38350700002)(38100700002)(478600001)(6666004)(6486002)(66946007); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: dIRlYVPWXUEKtSfRlSspqTWebzI+m8J5VB4SQVLHuJhT6k5W5k89um8xkAZxgDDr1uMhKHSRfENkhLmQp+E1l2FGKsSrWPUzi46OywqYAbXX7uyR7GmjwZsnhGcT3nnBSKzmENER1AgOiGDEP01YG6NgFkJ6lSgaMYo8tNwBwoEVHkBJ015JqrGA0g8HefBQJGVvTy5/D818FM/ukAgPMTp4xr1VZk60iZ1dNc7naO+mA4nKYUTlvxbnFmO24SC02L3/smeyYZdyCYTapRqenwFZn+0zm95qHpSebFzZGSvr0/fflPhpEOOrBCkuKSS4YjAVtXPucXD/BbMlsS9Hf7rYSJSwajUCZFyyxUwsGnlztq7c95kVRiS1/DhEyxu2UtZSlDBBHLZ5RS+GaSIuDXFiMYRx0QEPtUlOHExMvIdf10A2qoK9XGt++SM6JkXeiPUHBtIpr4RDL2mZv6obygSKbxePG5oAnIWgyCKq09qTTvU3STbGTq6BYbZObKCSbgyesrCcnhJ+iOgTh0VeATmbcLGf71etTuOhtUBfHBRUGwbLKQ8PCfsVS0Z2BVISwU8LmtpOvWSw7yfWKV3OqWZToxIPHa8YjPcvBWcshkIqJf4/j4nTSIsIO3HWMMA37tpx/sAsCCJu0OCv/oJBHY/AfsPTtsKuwM29C7DPP3zuQ6CZNwSh1tFbOCD3W8wL0QQD5zvDdyREDleLG8Ob54r2hn7WBgeY1MY6mEb0wd/d1JrrBwsw7LOfXHIpJGOP2m0oX/aAcX1RF3fWlTgLeF7kbgncOHXEqP3aczXpvO0wgobAO/2aQrGgDFjdwuf4W8X04T1QrJDj3s8F+0CAZsEXgkji5emBnWLDUxZhdBhj6dfowXInH+6FQWAy1C+yHeTdFKOI6l/lm2p1f8+9pPIR125gHn2loveyTxbM6vW9zPO3jkzjw+Fsd1HIRwml0S3XIazr5LacHmKovU4wln93LH6P3RjWBpKv2Pu8ju8KO5klfjyDRVns5VIcskrMG/XWNYA92vXFiAaCj2kppxYCx7SXqTQxVgCe1DdJmjRSIKCG1Kk0aA1wHpeEJgo8QJSYs7PcKxFS56yTBUnrWHkLP2gl9xnep1I2onygUGczp/QXYXhSIzKAcZMoaihc5GzDACeN7ODpxSZj+5pqjDASSbl2SoClJQpuF1NbjOlkklrVCn6P1lenKk3FAIk+DKdsaoVwaBR3OFFr5dmWm3Q76xFwS5RHYu4a4xlZ8UWWWvx7I1TO66s8llWEpyDHkScXgqDZXCcpOUs6/ZN8tYDq3bGlHlaTffOO+az4xFyykEkAJUa/5ZFpK+PjX9befoVpwCFrPir8unTfKvlYBA== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: d07b0cdd-b7f0-4ef8-23cc-08d8fda7f99f X-MS-Exchange-CrossTenant-AuthSource: DB6PR0402MB2760.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Apr 2021 11:41:56.5535 (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: Ay/eReAGlO7lJ30Zg/YSGouMIzG1MZKIIR2byT72yKoS/lhHXfc+rnEq2AF21XVhADY6EXVLbcxQSFXc7M9Grw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR04MB4233 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.102.4 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 fba655f3b9..d0f0ffb9c7 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 1a49396007..19a499ee29 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; +}