From patchwork Tue Nov 12 09:13:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nandor Han X-Patchwork-Id: 1193377 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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=none (p=none dis=none) header.from=vaisala.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=vaisala.com header.i=@vaisala.com header.b="rVeIivqD"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47C29x6kLbz9sNH for ; Tue, 12 Nov 2019 20:14:13 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 9BEEFC21E56; Tue, 12 Nov 2019 09:13:39 +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=RCVD_IN_MSPIKE_H2, 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 A324CC21C8B; Tue, 12 Nov 2019 09:13:25 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id E9444C21C8B; Tue, 12 Nov 2019 09:13:23 +0000 (UTC) Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40055.outbound.protection.outlook.com [40.107.4.55]) by lists.denx.de (Postfix) with ESMTPS id 8D87EC21CB1 for ; Tue, 12 Nov 2019 09:13:23 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gE7fQ4k7bCrSWPo9UggpSJ9Lbv1FLniFC5qzpPdDoff5vm7BeU4SzliZyXJuVp6KCpaiZwp4m1COK3hjoJ1wCI0LhGC9ZQ6rfR3kULNnu0r44OI3l+xoRReatEe5LFss+cIMVnABr6agYsMmZYm8zpN8m6BvRVMr1SIDLciKn5Yyzrku+qxl2/CPXQw7W0Jy4Gnw2ZBwOgS5Ns4J1ASGfJZsBPLvhFnHsrw5Wh7uOA/XMMBTov6Oq0kNZf6oZOH38TOmtCzmbpuW7qbVKwKHvv+T16xvY5MTy+QFSqIObxN3HrYxTh7o2dhNtDQqYz8WbCl1GyF3EBo4m+dq6ukeMQ== 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=7o43DSbK5uhjA3uNGD3DeVPr1deT6/vZMSr8ieaSchU=; b=Xzp2foRaMsvljnsE2G3XIT9eL0nmKnAZKtMY+DKs+xh6NP/PiZ1aQQt0M/ycntt4nwSkBEPNDCDfXiImdeGMBzc0RaQPov7OnziuHarEPlzNLWmydAid82OEvXWKsEgDbHJ9DV8kTHBb2pzQNsQB4dnNniMBGRIL48vgaMLYbZZdRFxRWjtQrLtjwTclG+BIPvJbFGMnF5WqEKkrrrVHOZk2jdDhPx+kh2eP1eXlKCKG4isV6351P/MehGhluRkE1UK7YjLlLCyszpHgdp9X5pU116/j9sLozC4cL6jXSLaFYuA+TtXQzat+/oUOqh+bDvltsSea5fKQVkWXbOyLWg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=vaisala.com; dmarc=pass action=none header.from=vaisala.com; dkim=pass header.d=vaisala.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vaisala.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7o43DSbK5uhjA3uNGD3DeVPr1deT6/vZMSr8ieaSchU=; b=rVeIivqD+tUHvNfdkBOlIBNc1fvrHpxHmTkB285fuUe+1HsOwHoB3eUUonHD45VdDBlwodjxblq8fl15mPcDby2zi1jfREANYmNUVrZpW16BRhnBU6puOyGJnJikYWSVHCr+9p3NNqIG2xRaJr20x1GJiPBK8S1T8hAtkM1RL30= Received: from AM6PR06MB6263.eurprd06.prod.outlook.com (20.179.247.144) by AM6PR06MB4182.eurprd06.prod.outlook.com (20.177.39.92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2430.24; Tue, 12 Nov 2019 09:13:22 +0000 Received: from AM6PR06MB6263.eurprd06.prod.outlook.com ([fe80::b027:3f98:12c7:613a]) by AM6PR06MB6263.eurprd06.prod.outlook.com ([fe80::b027:3f98:12c7:613a%2]) with mapi id 15.20.2430.027; Tue, 12 Nov 2019 09:13:22 +0000 From: Han Nandor To: "u-boot@lists.denx.de" Thread-Topic: [PATCH 1/3] reboot-mode: add support for reboot mode control Thread-Index: AQHVmTlu1kNh/VgQoUe3OhEEAjvQAg== Date: Tue, 12 Nov 2019 09:13:22 +0000 Message-ID: <20191112091255.28149-2-nandor.han@vaisala.com> References: <20191112091255.28149-1-nandor.han@vaisala.com> In-Reply-To: <20191112091255.28149-1-nandor.han@vaisala.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: MR2P264CA0116.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:33::32) To AM6PR06MB6263.eurprd06.prod.outlook.com (2603:10a6:20b:ff::16) authentication-results: spf=none (sender IP is ) smtp.mailfrom=nandor.han@vaisala.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.20.1 x-originating-ip: [193.143.230.131] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 29ff1d90-1232-4fd3-c306-08d767509106 x-ms-traffictypediagnostic: AM6PR06MB4182: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-tenant-id: 6d7393e0-41f5-4c2e-9b12-4c2be5da5c57 x-ms-oob-tlc-oobclassifiers: OLM:243; x-forefront-prvs: 021975AE46 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(136003)(39850400004)(396003)(346002)(376002)(366004)(189003)(199004)(2906002)(36756003)(2616005)(76176011)(7736002)(14454004)(305945005)(5640700003)(6486002)(25786009)(486006)(81156014)(50226002)(8676002)(81166006)(86362001)(52116002)(476003)(446003)(11346002)(8936002)(4326008)(2351001)(386003)(316002)(66476007)(6916009)(6506007)(26005)(6512007)(1076003)(66446008)(66556008)(54906003)(66946007)(64756008)(99286004)(71190400001)(71200400001)(66066001)(6436002)(2501003)(6116002)(3846002)(478600001)(186003)(14444005)(5660300002)(102836004)(256004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM6PR06MB4182; H:AM6PR06MB6263.eurprd06.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: vaisala.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: AYX6BoBiL19Mrn8JJjZtF2Thkj4UVhVUvxKwbj+fYPR1bbD1n1z4tS93RQFy2gaI7QrqooDhXezziEURyJXR2Vw+yZt4mEhLyMWKyVoz6K62475lVN3T01RSJD8Em9aU0cB0tWN9VkytNV9SGvWB6gHF1fIcviAoFsIj3bEt/2z1ru1eD5w5SfuyWWzemuBiPDkw4Gbq9XKs5dwKCTRPnah4frAmVLR2+TC7I7tvx1FjlPEzPlQS50vgHKIoVT+pM8Hy2y5mIe4QbAvZj849XbOa6H1FTILqrQ75TX64vqD77cipUW7SywB73dcPpxlcpQyk7nGafaqreuIQxwmJdAzbl96SsFgZBEKrFiVbWbraNb0gWeZVSLve/llJoshYWyUMw3twKOCCGbdiRjy6McfX0BCu18EhwwzPCBaEkcPx5LSzJ6tOOcuIpCo+JUZk MIME-Version: 1.0 X-OriginatorOrg: vaisala.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29ff1d90-1232-4fd3-c306-08d767509106 X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Nov 2019 09:13:22.7137 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 6d7393e0-41f5-4c2e-9b12-4c2be5da5c57 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ojXmUrpcU2WdZKcP5xYDSDgiVYXmh2YX+ZhJbfgMThvhyrs9jCY0oTSq3h9OLAs0bAb6IHvv0fdzEuFdD0RX3w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR06MB4182 Cc: "trini@konsulko.com" Subject: [U-Boot] [PATCH 1/3] reboot-mode: add support for reboot mode control 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" A new driver uclass is created to handle the reboot mode control. The new uclass driver is updating an environment variable with the configured reboot mode. The mode is extracted from a map provided at initialization time. The map contains a list of modes and associated ids. Signed-off-by: Nandor Han --- drivers/Kconfig | 2 + drivers/Makefile | 1 + drivers/reboot-mode/Kconfig | 18 ++++ drivers/reboot-mode/Makefile | 7 ++ drivers/reboot-mode/reboot-mode-uclass.c | 132 +++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/reboot-mode/reboot-mode.h | 56 ++++++++++ 7 files changed, 217 insertions(+) create mode 100644 drivers/reboot-mode/Kconfig create mode 100644 drivers/reboot-mode/Makefile create mode 100644 drivers/reboot-mode/reboot-mode-uclass.c create mode 100644 include/reboot-mode/reboot-mode.h diff --git a/drivers/Kconfig b/drivers/Kconfig index 9d99ce0226..aa7c35331e 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -86,6 +86,8 @@ source "drivers/qe/Kconfig" source "drivers/ram/Kconfig" +source "drivers/reboot-mode/Kconfig" + source "drivers/remoteproc/Kconfig" source "drivers/reset/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index 0befeddfcb..6435bac2db 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -92,6 +92,7 @@ obj-y += dfu/ obj-$(CONFIG_PCH) += pch/ obj-y += phy/allwinner/ obj-y += phy/marvell/ +obj-$(CONFIG_DM_REBOOT_MODE) += reboot-mode/ obj-y += rtc/ obj-y += scsi/ obj-y += sound/ diff --git a/drivers/reboot-mode/Kconfig b/drivers/reboot-mode/Kconfig new file mode 100644 index 0000000000..0edc3209d7 --- /dev/null +++ b/drivers/reboot-mode/Kconfig @@ -0,0 +1,18 @@ +# +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c), Vaisala Oyj +# + +menu "Reboot Mode Support" + +config DM_REBOOT_MODE + bool "Enable reboot mode using Driver Model" + depends on DM + default n + help + Enable support for reboot mode control. This will allow users to + adjust the boot process based on reboot mode parameter + passed to U-Boot. + +endmenu diff --git a/drivers/reboot-mode/Makefile b/drivers/reboot-mode/Makefile new file mode 100644 index 0000000000..2ab0fddac9 --- /dev/null +++ b/drivers/reboot-mode/Makefile @@ -0,0 +1,7 @@ +# +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c), Vaisala Oyj +# + +obj-$(CONFIG_DM_REBOOT_MODE) += reboot-mode-uclass.o diff --git a/drivers/reboot-mode/reboot-mode-uclass.c b/drivers/reboot-mode/reboot-mode-uclass.c new file mode 100644 index 0000000000..78b54836df --- /dev/null +++ b/drivers/reboot-mode/reboot-mode-uclass.c @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c), Vaisala Oyj + */ + +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +int dm_reboot_mode_update(struct udevice *dev) +{ + struct reboot_mode_ops *ops = reboot_mode_get_ops(dev); + u32 rebootmode; + int ret, i; + + assert(ops); + + if (!ops->get) + return -ENOSYS; + + ret = ops->get(dev, &rebootmode); + if (ret < 0) { + dev_err(dev, "Failed to retrieve the reboot mode value\n"); + return ret; + } + + const struct reboot_mode_uclass_platdata *plat_data = + dev_get_uclass_platdata(dev); + + for (i = 0; i < plat_data->count; i++) { + if (plat_data->modes[i].mode_id == rebootmode) { + ret = env_set(plat_data->env_variable, + plat_data->modes[i].mode_name); + if (ret) { + dev_err(dev, "Failed to set env: %s\n", + plat_data->env_variable); + return ret; + } + } + } + + if (ops->set) { + /* Clear the value */ + rebootmode = 0; + ret = ops->set(dev, rebootmode); + if (ret) { + dev_err(dev, "Failed to clear the reboot mode\n"); + return ret; + } + } + + return 0; +} + +int dm_reboot_mode_pre_probe(struct udevice *dev) +{ + struct reboot_mode_uclass_platdata *plat_data; + + plat_data = dev_get_uclass_platdata(dev); + if (!plat_data) + return -EINVAL; + +#if CONFIG_IS_ENABLED(OF_CONTROL) + const int node = dev_of_offset(dev); + const char *mode_prefix = "mode-"; + const int mode_prefix_len = strlen(mode_prefix); + int property; + const u32 *propvalue; + const char *propname; + + plat_data->env_variable = fdt_getprop(gd->fdt_blob, + node, + "u-boot,env-variable", + NULL); + if (!plat_data->env_variable) + plat_data->env_variable = "reboot-mode"; + + plat_data->count = 0; + + fdt_for_each_property_offset(property, gd->fdt_blob, node) { + propvalue = fdt_getprop_by_offset(gd->fdt_blob, + property, &propname, NULL); + if (!propvalue) { + dev_err(dev, "Could not get the value for property %s\n", + propname); + return -EINVAL; + } + + if (!strncmp(propname, mode_prefix, mode_prefix_len)) + plat_data->count++; + } + + plat_data->modes = devm_kcalloc(dev, plat_data->count, + sizeof(struct reboot_mode_mode), 0); + + struct reboot_mode_mode *next = plat_data->modes; + + fdt_for_each_property_offset(property, gd->fdt_blob, node) { + propvalue = fdt_getprop_by_offset(gd->fdt_blob, + property, &propname, NULL); + if (!propvalue) { + dev_err(dev, "Could not get the value for property %s\n", + propname); + return -EINVAL; + } + + if (!strncmp(propname, mode_prefix, mode_prefix_len)) { + next->mode_name = &propname[mode_prefix_len]; + next->mode_id = fdt32_to_cpu(*propvalue); + + next++; + } + } +#else + if (!plat_data->env_variable) + plat_data->env_variable = "reboot-mode"; + +#endif + + return 0; +} + +UCLASS_DRIVER(reboot_mode) = { + .name = "reboot-mode", + .id = UCLASS_REBOOT_MODE, + .pre_probe = dm_reboot_mode_pre_probe, + .per_device_platdata_auto_alloc_size = + sizeof(struct reboot_mode_uclass_platdata), +}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 0c563d898b..7f5605504c 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -83,6 +83,7 @@ enum uclass_id { UCLASS_PWM, /* Pulse-width modulator */ UCLASS_PWRSEQ, /* Power sequence device */ UCLASS_RAM, /* RAM controller */ + UCLASS_REBOOT_MODE, /* Reboot mode */ UCLASS_REGULATOR, /* Regulator device */ UCLASS_REMOTEPROC, /* Remote Processor device */ UCLASS_RESET, /* Reset controller device */ diff --git a/include/reboot-mode/reboot-mode.h b/include/reboot-mode/reboot-mode.h new file mode 100644 index 0000000000..86b51f881c --- /dev/null +++ b/include/reboot-mode/reboot-mode.h @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (c), Vaisala Oyj + */ + +#ifndef REBOOT_MODE_REBOOT_MODE_H__ +#define REBOOT_MODE_REBOOT_MODE_H__ + +#include +#include + +struct reboot_mode_mode { + const char *mode_name; + u32 mode_id; +}; + +struct reboot_mode_uclass_platdata { + struct reboot_mode_mode *modes; + u8 count; + const char *env_variable; +}; + +struct reboot_mode_ops { + /** + * get() - get the current reboot mode value + * + * Returns the current value from the reboot mode backing store. + * + * @dev: Device to read from + * @rebootmode: Address to save the current reboot mode value + */ + int (*get)(struct udevice *dev, u32 *rebootmode); + + /** + * set() - set a reboot mode value + * + * Sets the value in the reboot mode backing store. + * + * @dev: Device to read from + * @rebootmode: New reboot mode value to store + */ + int (*set)(struct udevice *dev, u32 rebootmode); +}; + +/* Access the operations for a reboot mode device */ +#define reboot_mode_get_ops(dev) ((struct reboot_mode_ops *)(dev)->driver->ops) + +/** + * dm_reboot_mode_update() - Update the reboot mode env variable. + * + * @dev: Device to read from + * @return 0 if OK, -ve on error + */ +int dm_reboot_mode_update(struct udevice *dev); + +#endif /* REBOOT_MODE_REBOOT_MODE_H__ */