From patchwork Fri May 6 11:50:37 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hari Bathini X-Patchwork-Id: 619275 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3r1VXl5sXpz9snm for ; Fri, 6 May 2016 21:53:27 +1000 (AEST) Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3r1VXl4MQzzDqpV for ; Fri, 6 May 2016 21:53:27 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from ozlabs.org (ozlabs.org [103.22.144.67]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3r1VVf48rNzDqfM for ; Fri, 6 May 2016 21:51:38 +1000 (AEST) Received: by ozlabs.org (Postfix) id 3r1VVf3ZpCz9t3k; Fri, 6 May 2016 21:51:38 +1000 (AEST) Delivered-To: linuxppc-dev@ozlabs.org Received: from e23smtp07.au.ibm.com (e23smtp07.au.ibm.com [202.81.31.140]) (using TLSv1.2 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3r1VVf2cX6z9snm for ; Fri, 6 May 2016 21:51:38 +1000 (AEST) Received: from localhost by e23smtp07.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 6 May 2016 21:51:37 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp07.au.ibm.com (202.81.31.204) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 6 May 2016 21:51:35 +1000 X-IBM-Helo: d23dlp01.au.ibm.com X-IBM-MailFrom: hbathini@linux.vnet.ibm.com X-IBM-RcptTo: linuxppc-dev@ozlabs.org Received: from d23relay10.au.ibm.com (d23relay10.au.ibm.com [9.190.26.77]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 153342CE8046 for ; Fri, 6 May 2016 21:51:35 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay10.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u46BpRp95767640 for ; Fri, 6 May 2016 21:51:35 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u46Bp2Rm015125 for ; Fri, 6 May 2016 21:51:02 +1000 Received: from hbathini.in.ibm.com (hbathini.in.ibm.com [9.184.79.239] (may be forged)) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u46Bp2Tj014769 for ; Fri, 6 May 2016 21:51:02 +1000 Subject: [PATCH 2/3] powerpc/fadump: add support to specify memory range based size From: Hari Bathini To: linuxppc-dev Date: Fri, 06 May 2016 17:20:37 +0530 Message-ID: <20160506115037.26330.88961.stgit@hbathini.in.ibm.com> In-Reply-To: <20160506115007.26330.89135.stgit@hbathini.in.ibm.com> References: <20160506115007.26330.89135.stgit@hbathini.in.ibm.com> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16050611-0025-0000-0000-000004916E61 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Currently, memory for fadump can be specified with fadump_reserve_mem=size, where only a fixed size can be specified. This patch tries to extend this syntax to support conditional reservation based on memory size, with the below syntax: fadump_reserve_mem=:[,:,...] This syntax helps using the same commandline parameter for different system memory sizes. Signed-off-by: Hari Bathini --- arch/powerpc/kernel/fadump.c | 127 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 9 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index d0af58b..a7fef3e 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -193,6 +193,121 @@ static unsigned long init_fadump_mem_struct(struct fadump_mem_struct *fdm, return addr; } +#define FADUMP_MEM_CMDLINE_PREFIX "fadump_reserve_mem=" + +static __init char *get_last_fadump_reserve_mem(void) +{ + char *p = boot_command_line, *fadump_cmdline = NULL; + + /* find fadump_reserve_mem and use the last one if there are more */ + p = strstr(p, FADUMP_MEM_CMDLINE_PREFIX); + while (p) { + fadump_cmdline = p; + p = strstr(p+1, FADUMP_MEM_CMDLINE_PREFIX); + } + + return fadump_cmdline; +} + +#define parse_fadump_print(fmt, arg...) \ + printk(KERN_INFO "fadump_reserve_mem: " fmt, ##arg) + +/* + * This function parses command line for fadump_reserve_mem= + * + * Supports the below two syntaxes: + * 1. fadump_reserve_mem=size + * 2. fadump_reserve_mem=ramsize-range:size[,...] + * + * Sets fw_dump.reserve_bootvar with the memory size + * provided, 0 otherwise + * + * The function returns -EINVAL on failure, 0 otherwise. + */ +static int __init parse_fadump_reserve_mem(void) +{ + char *cur, *tmp; + char *first_colon, *first_space; + char *fadump_cmdline; + unsigned long long system_ram; + + fw_dump.reserve_bootvar = 0; + fadump_cmdline = get_last_fadump_reserve_mem(); + + /* when no fadump_reserve_mem= cmdline option is provided */ + if (!fadump_cmdline) + return 0; + + first_colon = strchr(fadump_cmdline, ':'); + first_space = strchr(fadump_cmdline, ' '); + cur = fadump_cmdline + strlen(FADUMP_MEM_CMDLINE_PREFIX); + + /* for fadump_reserve_mem=size cmdline syntax */ + if (!first_colon || (first_space && (first_colon > first_space))) { + fw_dump.reserve_bootvar = memparse(cur, &cur); + return 0; + } + + /* for fadump_reserve_mem=ramsize-range:size[,...] cmdline syntax */ + system_ram = memblock_phys_mem_size(); + /* for each entry of the comma-separated list */ + do { + unsigned long long start, end = ULLONG_MAX, size; + + /* get the start of the range */ + start = memparse(cur, &tmp); + if (cur == tmp) { + parse_fadump_print("Memory value expected\n"); + return -EINVAL; + } + cur = tmp; + if (*cur != '-') { + parse_fadump_print("'-' expected\n"); + return -EINVAL; + } + cur++; + + /* if no ':' is here, than we read the end */ + if (*cur != ':') { + end = memparse(cur, &tmp); + if (cur == tmp) { + parse_fadump_print("Memory value expected\n"); + return -EINVAL; + } + cur = tmp; + if (end <= start) { + parse_fadump_print("end <= start\n"); + return -EINVAL; + } + } + + if (*cur != ':') { + parse_fadump_print("':' expected\n"); + return -EINVAL; + } + cur++; + + size = memparse(cur, &tmp); + if (cur == tmp) { + parse_fadump_print("Memory value expected\n"); + return -EINVAL; + } + cur = tmp; + if (size >= system_ram) { + parse_fadump_print("invalid size\n"); + return -EINVAL; + } + + /* match ? */ + if (system_ram >= start && system_ram < end) { + fw_dump.reserve_bootvar = size; + break; + } + } while (*cur++ == ','); + + return 0; +} + /** * fadump_calculate_reserve_size(): reserve variable boot area 5% of System RAM * @@ -212,6 +327,9 @@ static inline unsigned long fadump_calculate_reserve_size(void) { unsigned long size; + /* sets fw_dump.reserve_bootvar */ + parse_fadump_reserve_mem(); + /* * Check if the size is specified through fadump_reserve_mem= cmdline * option. If yes, then use that. @@ -352,15 +470,6 @@ static int __init early_fadump_param(char *p) } early_param("fadump", early_fadump_param); -/* Look for fadump_reserve_mem= cmdline option */ -static int __init early_fadump_reserve_mem(char *p) -{ - if (p) - fw_dump.reserve_bootvar = memparse(p, &p); - return 0; -} -early_param("fadump_reserve_mem", early_fadump_reserve_mem); - static void register_fw_dump(struct fadump_mem_struct *fdm) { int rc;