From patchwork Tue Oct 6 22:55:50 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 527050 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 2CA5D140D71 for ; Wed, 7 Oct 2015 09:59:23 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 0FA5A1A03CB for ; Wed, 7 Oct 2015 09:59:23 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-by2-obe.outbound.protection.outlook.com (mail-by2on0140.outbound.protection.outlook.com [207.46.100.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 9BEA21A0017 for ; Wed, 7 Oct 2015 09:56:10 +1100 (AEDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Received: from snotra.am.freescale.net (192.88.168.49) by BN3PR03MB1477.namprd03.prod.outlook.com (10.163.35.140) with Microsoft SMTP Server (TLS) id 15.1.286.20; Tue, 6 Oct 2015 22:56:03 +0000 From: Scott Wood To: Simon Horman Subject: [PATCH v2 3/3] ppc64: Add a flag to tell the kernel it's booting from kexec Date: Tue, 6 Oct 2015 17:55:50 -0500 Message-ID: <1444172150-29493-3-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1444172150-29493-1-git-send-email-scottwood@freescale.com> References: <1444172150-29493-1-git-send-email-scottwood@freescale.com> MIME-Version: 1.0 X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: BY2PR1001CA0051.namprd10.prod.outlook.com (25.164.163.19) To BN3PR03MB1477.namprd03.prod.outlook.com (25.163.35.140) X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB1477; 2:A2uYh0Pp8JfDCJ20oZy3KaVwlVwFKMHNcGuZMRXTHUCcSmsGOAteuTYqPDw5B+QBzJ5jgb2ecCvYnRrrs5VQUJX8jSRx3deru8SkioEkdLsL8p47RpXUn06xRAnmYrrg/GXWnEDVJFb4v2ml7bdbquFPTrrx7Kt712biG/IOZNw=; 3:dx8LpfGtoKstNnDYbikHqEnx77xxPJDiMA7ItOiBKoh8KGedWp0pHNxkCcvyWP0kBh8xgMKTza2SZOjrFqYiG5XPqzIpdkNT06MNCDnW4Ty/pbcieVOwKUxRH/5lG48yWiDgto7QTCA7qiwC+ZoO5Q==; 25:QhunT+9rJ9l0biYd+8OrfHibG2iTi9S7Zzv5DxxCCWdM3ZBjXtJTQ5Fd9n3A9YTzl1zT6gZaeJKaKyq6Ye36D1fwv/aZT0ZcZWKfYNYAy2c0G42xZaxpWcB4VJpIkJ7BahNp+xnGCmN9cxKg1KDlXjIQmptuzpc7qwYy/zvn3PSCJ3+Bg4r4A+/ePG5Tt9/NtxUghpeGnRezxJVFv9y2WoGZEC7hC87Z33u/KloRKTAc8+mR/+lxe4pHLgCUmtdT X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1477; X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB1477; 20:+uoKYLJHSM8wE8/RGkJ0yVEsi8FXrLSXmsy2s6A4lRKCObbmo/ieqD2ZtNz1n1pHZmSmMiba56ZlE/RuWCRcHUWlNQlytll/kYTJGN04EHkokC9QfcQq2Iq23iNjoUPQiea6LdBuAdvSplrJl46CEh6cJmOtzw7kwLPsjBMiyX2uHIs2J46LOvj+ZEgB/1a1jQ9FkhlkfKOSMgytj14/Gd8YUq5aLQAxLqNVXIsSW1RJNMlznVzCksU6Xf5zMEaVjiRRQZVApUU9kHTkd0RXhPBfDrAwRAKTDTRzWoL45J9xVaZ7eK6E4DRjpnsK2Rp8WSuKMma4bgR6WtC3/k4vU0Hwr2xdtKuOK688lY5k4MwDM1krC/VlfiHbzlvQNgsbmjkiGtejpJRezTORMxDY8tPZJTdvqdZM5xdpriwfOQLYuSft8fwdGLtYYX7pku5jBw4CDHkojJ06OJjrmpXH6UHs5Ptztn8jK4JfrrRYaeDfrD08mHbX1kXf1K+BWS21; 4:LgjZyBg1hZivVKMFoErDdqt3L+LMhhwgSV2RlVvBBNCIlKJZbrWJrgKBy5wg4OW3Jw8ruWEZ0jmxQRb1w15uKeyst9WNEXcog51OkurtGPi9M/Qkm8/nxIhCVA/jtAQ0GmDp2C++tnzUTSVc5uZb6DhqypgmZchyoYikD4rhD3xAGfqB/dr5LpkJl6ROqCec4EEg/K3NLQwjJSFczIWnFhg95uOljHW8vb9g3HBds5073ftLXLOpCn5Etan13tWXZ8KQPJVa1uX69h2QPJJkwfj4C4AvqH6fwWwi6lERTD+/msc/HzKnQ3d87BsXwHsrRdKgQU16UWlOmD7hCJyLfsQx6YIQSgVr3QwBg5K92Rs= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001); SRVR:BN3PR03MB1477; BCL:0; PCL:0; RULEID:; SRVR:BN3PR03MB1477; X-Forefront-PRVS: 07215D0470 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(189002)(199003)(50466002)(87976001)(19580405001)(77096005)(66066001)(64706001)(47776003)(110136002)(5001960100002)(105586002)(48376002)(189998001)(107886002)(46102003)(33646002)(40100003)(229853001)(5003940100001)(5008740100001)(76176999)(5004730100002)(2950100001)(122386002)(86362001)(19580395003)(106356001)(97736004)(36756003)(5001920100001)(50226001)(101416001)(81156007)(50986999)(92566002)(5007970100001)(42186005)(2004002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BN3PR03MB1477; H:snotra.am.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: freescale.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN3PR03MB1477; 23:eNhJzAEUXiXCPYF9xCXRDqXwWe3WLDCl0MPRt4O8r?= =?us-ascii?Q?tspGZhXQxGF+aTq7HC76TRyVgrK0F+7TtPnnw+sBpOgw0/YyimRoB7K/h9GP?= =?us-ascii?Q?OfJ3QQbCA4IEigaR9GF6MMkELtDu46DEXEBnOoWfVuBGUzSlG/YVwdPRBpUt?= =?us-ascii?Q?tLUPI9rRzjowwBOPGH7xdg35sdwdnfCGD5kX6q+3eIz9rc4MgbTtjPJSLnJl?= =?us-ascii?Q?M+xCrcGBAGK8DheBzLmtV+c79ORURKkwfL0Yt9v7SlSCUDFe/XXOnl3nWAJa?= =?us-ascii?Q?Nncl0G9ClD32C4kRI6jNtSvilIfAgXnTJ0LJP4iS3XPm9aX5r9FItb99ZgFF?= =?us-ascii?Q?fo5PBRPYY3KDIAaBUILPXcfkvnOxdcd1UfvdoaAnyDK+x47uj8ZxONke1CXW?= =?us-ascii?Q?avwoIlNfxZljt4i0b6ZzdbogR+xKHI0fLwglcinEzc1GdVdDVZdsEyojqpnI?= =?us-ascii?Q?4HSSerTESKy1g1TYdsgeTuIR4pD7mRjrHlSUooY/8xrI8VzFjfIK0J+wmD9r?= =?us-ascii?Q?34hOvSMULAJJeRx+PuLHfovnpJLpJiEIotOkLu7HqbiJ0D1Su1bu/HcGB98L?= =?us-ascii?Q?LKFWGKQzjLO8XbK+/IVgoUpbZrJ+5zr4uh1DhNhlrJGDswiVom/hNQ2Q1tAR?= =?us-ascii?Q?ZMZAwwztmNefrPPsWQj0wld8Gfw5q/0IR65t/aShPznceIo/qNCcReDqvCpA?= =?us-ascii?Q?a4oqMB8RVbSbgKPCtrHbh5Uq3Q389gNHkgf1YZksUPLL7u91yHxDOBlc9Dqo?= =?us-ascii?Q?dyusQGRBhMoj3qEdqDXl+YdZrMAFu8KAEBpeL84pHcvFe4zoc4mtVp1Gf8Eu?= =?us-ascii?Q?opk9q5n/Th7uPalMECOAMhZxITyjMM/cnfI/9pQJ8HxbniwT1aZJs24xab1Z?= =?us-ascii?Q?6PGo68nPbLhJeulVgKfNZ+x89P4dZFiLAdOi+aUd8YP0YsXAVVGI8jsfbmtu?= =?us-ascii?Q?ulIcy3u2ZrORDzDdMlJNJ+UzzDesGaPoPr+i7X4xp4IkAA4tLl+whrdyUDJE?= =?us-ascii?Q?BZ2BTL8BG+TdEFBQKPtj9VwUcYMh0SnQmFT9J42Q3062zRLub+n0V+lGmc7C?= =?us-ascii?Q?36IO1S9x4Kdt6lheIL8hk3uWLTnoKRzoImh3VssUhhuUqVvb2xEC5VzJL1CV?= =?us-ascii?Q?2q00fhMp08=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB1477; 5:MVd3Z1u0UBTxCJqsddmHDXXD0MuXKoCECdiLcTtBO9ctPl48VLNJuOU/5dFJmQC20O54mQpKIHsSueAmJR01LNbpihPs3qX6lCQHFNQvykAjJXnTRgFjJCmOu2ryY0Qlmfg+z6N1EeZNtd7aD3MPPQ==; 24:KDJYbKlZXMWMM90WnCYXDqhkdneRMRVpFztg5y4m5xAndgM4NFMpRu1WmOIlK7lYygzyRK741I6K8JRdZujXLZAtkBpnQ1mHWDR11xWZpBU=; 20:kBhcKOxb0NkHq9nG05uRNuQRFNFYuRwZZN6SlgRPxO0ngUx4oJlL2/e7OuS+o4P5+La5N5850uIFidex42o/cA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2015 22:56:03.7782 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB1477 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Scott Wood , linuxppc-dev@lists.ozlabs.org, kexec@lists.infradead.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" It needs to know this because the SMP release mechanism for Freescale book3e is different from when booting with normal hardware. In theory we could simulate the normal spin table mechanism, but not (easily) at the addresses U-Boot put in the device tree -- so there'd need to be even more communication between the kernel and kexec to set that up. Signed-off-by: Scott Wood Acked-by: Michael Ellerman --- v2: Use a device tree property rather than setting a flag in the kernel image, as requested by Michael Ellerman. --- kexec/arch/ppc64/Makefile | 6 +++ kexec/arch/ppc64/fdt.c | 78 +++++++++++++++++++++++++++++++++++++ kexec/arch/ppc64/include/arch/fdt.h | 9 +++++ kexec/arch/ppc64/kexec-elf-ppc64.c | 7 ++++ 4 files changed, 100 insertions(+) create mode 100644 kexec/arch/ppc64/fdt.c create mode 100644 kexec/arch/ppc64/include/arch/fdt.h diff --git a/kexec/arch/ppc64/Makefile b/kexec/arch/ppc64/Makefile index 9a6e475..37cd233 100644 --- a/kexec/arch/ppc64/Makefile +++ b/kexec/arch/ppc64/Makefile @@ -1,11 +1,15 @@ # # kexec ppc64 (linux booting linux) # +include $(srcdir)/kexec/libfdt/Makefile.libfdt + ppc64_KEXEC_SRCS = kexec/arch/ppc64/kexec-elf-rel-ppc64.c ppc64_KEXEC_SRCS += kexec/arch/ppc64/kexec-zImage-ppc64.c ppc64_KEXEC_SRCS += kexec/arch/ppc64/kexec-elf-ppc64.c ppc64_KEXEC_SRCS += kexec/arch/ppc64/kexec-ppc64.c ppc64_KEXEC_SRCS += kexec/arch/ppc64/crashdump-ppc64.c +ppc64_KEXEC_SRCS += kexec/arch/ppc64/fdt.c +ppc64_KEXEC_SRCS += $(LIBFDT_SRCS:%=kexec/libfdt/%) ppc64_ARCH_REUSE_INITRD = @@ -13,6 +17,8 @@ ppc64_FS2DT = kexec/fs2dt.c ppc64_FS2DT_INCLUDE = -include $(srcdir)/kexec/arch/ppc64/crashdump-ppc64.h \ -include $(srcdir)/kexec/arch/ppc64/kexec-ppc64.h +ppc64_CPPFLAGS = -I$(srcdir)/kexec/libfdt + dist += kexec/arch/ppc64/Makefile $(ppc64_KEXEC_SRCS) \ kexec/arch/ppc64/kexec-ppc64.h kexec/arch/ppc64/crashdump-ppc64.h \ kexec/arch/ppc64/include/arch/options.h diff --git a/kexec/arch/ppc64/fdt.c b/kexec/arch/ppc64/fdt.c new file mode 100644 index 0000000..8bc6d2d --- /dev/null +++ b/kexec/arch/ppc64/fdt.c @@ -0,0 +1,78 @@ +/* + * ppc64 fdt fixups + * + * Copyright 2015 Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation (version 2 of the License). + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include + +/* + * Let the kernel know it booted from kexec, as some things (e.g. + * secondary CPU release) may work differently. + */ +static int fixup_kexec_prop(void *fdt) +{ + int err, nodeoffset; + + nodeoffset = fdt_subnode_offset(fdt, 0, "chosen"); + if (nodeoffset < 0) + nodeoffset = fdt_add_subnode(fdt, 0, "chosen"); + if (nodeoffset < 0) { + printf("%s: add /chosen %s\n", __func__, + fdt_strerror(nodeoffset)); + return -1; + } + + err = fdt_setprop(fdt, nodeoffset, "linux,booted-from-kexec", + NULL, 0); + if (err < 0) { + printf("%s: couldn't write linux,booted-from-kexec: %s\n", + __func__, fdt_strerror(err)); + return -1; + } + + return 0; +} + + +/* + * For now, assume that the added content fits in the file. + * This should be the case when flattening from /proc/device-tree, + * and when passing in a dtb, dtc can be told to add padding. + */ +int fixup_dt(char **fdt, off_t *size) +{ + int ret; + + *size += 4096; + *fdt = realloc(*fdt, *size); + if (!*fdt) { + fprintf(stderr, "%s: out of memory\n", __func__); + return -1; + } + + ret = fdt_open_into(*fdt, *fdt, *size); + if (ret < 0) { + fprintf(stderr, "%s: fdt_open_into: %s\n", __func__, + fdt_strerror(ret)); + return -1; + } + + ret = fixup_kexec_prop(*fdt); + if (ret < 0) + return ret; + + return 0; +} diff --git a/kexec/arch/ppc64/include/arch/fdt.h b/kexec/arch/ppc64/include/arch/fdt.h new file mode 100644 index 0000000..14f8be2 --- /dev/null +++ b/kexec/arch/ppc64/include/arch/fdt.h @@ -0,0 +1,9 @@ +#ifndef KEXEC_ARCH_PPC64_FDT +#define KEXEC_ARCH_PPC64_FDT + +#include + +int fixup_dt(char **fdt, off_t *size); + +#endif + diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c index adcee4c..ddd3de8 100644 --- a/kexec/arch/ppc64/kexec-elf-ppc64.c +++ b/kexec/arch/ppc64/kexec-elf-ppc64.c @@ -37,6 +37,8 @@ #include "kexec-ppc64.h" #include "../../fs2dt.h" #include "crashdump-ppc64.h" +#include +#include #include uint64_t initrd_base, initrd_size; @@ -242,6 +244,11 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len, /* create from fs2dt */ create_flatten_tree(&seg_buf, &seg_size, cmdline); } + + result = fixup_dt(&seg_buf, &seg_size); + if (result < 0) + return result; + my_dt_offset = add_buffer(info, seg_buf, seg_size, seg_size, 0, 0, max_addr, -1);