get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/1933408/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 1933408,
    "url": "http://patchwork.ozlabs.org/api/patches/1933408/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20240509115755.519982-2-hbathini@linux.ibm.com/",
    "project": {
        "id": 2,
        "url": "http://patchwork.ozlabs.org/api/projects/2/?format=api",
        "name": "Linux PPC development",
        "link_name": "linuxppc-dev",
        "list_id": "linuxppc-dev.lists.ozlabs.org",
        "list_email": "linuxppc-dev@lists.ozlabs.org",
        "web_url": "https://github.com/linuxppc/wiki/wiki",
        "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git",
        "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/",
        "list_archive_url": "https://lore.kernel.org/linuxppc-dev/",
        "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/",
        "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}"
    },
    "msgid": "<20240509115755.519982-2-hbathini@linux.ibm.com>",
    "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20240509115755.519982-2-hbathini@linux.ibm.com/",
    "date": "2024-05-09T11:57:53",
    "name": "[v2,1/3] powerpc/pseries/fadump: add support for multiple boot memory regions",
    "commit_ref": "78d5cc15fb7d1b2683f0baf418a9a870c02319fb",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "18578b5456e4a2da09ebb2982e5b84af3470f088",
    "submitter": {
        "id": 74073,
        "url": "http://patchwork.ozlabs.org/api/people/74073/?format=api",
        "name": "Hari Bathini",
        "email": "hbathini@linux.ibm.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20240509115755.519982-2-hbathini@linux.ibm.com/mbox/",
    "series": [
        {
            "id": 406156,
            "url": "http://patchwork.ozlabs.org/api/series/406156/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=406156",
            "date": "2024-05-09T11:57:52",
            "name": "powerpc/fadump: pass additional args to dump capture kernel",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/406156/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1933408/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1933408/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linuxppc-dev@lists.ozlabs.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "linuxppc-dev@lists.ozlabs.org"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=MWBmdj68;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "lists.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=MWBmdj68;\n\tdkim-atps=neutral",
            "lists.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.ibm.com",
            "lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256\n header.s=pp1 header.b=MWBmdj68;\n\tdkim-atps=neutral",
            "lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com\n (client-ip=148.163.158.5; helo=mx0b-001b2d01.pphosted.com;\n envelope-from=hbathini@linux.ibm.com; receiver=lists.ozlabs.org)"
        ],
        "Received": [
            "from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange X25519 server-signature ECDSA (secp384r1))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4VZrCG25H4z20fc\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  9 May 2024 21:59:06 +1000 (AEST)",
            "from boromir.ozlabs.org (localhost [IPv6:::1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4VZrCG0QtGz3cRR\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  9 May 2024 21:59:06 +1000 (AEST)",
            "from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com\n [148.163.158.5])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4VZrBB6nlsz3cQq\n\tfor <linuxppc-dev@lists.ozlabs.org>; Thu,  9 May 2024 21:58:10 +1000 (AEST)",
            "from pps.filterd (m0360072.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 449BQRvo032581;\n\tThu, 9 May 2024 11:58:06 GMT",
            "from ppma21.wdc07v.mail.ibm.com\n (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91])\n\tby mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3y0tfw8khr-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tThu, 09 May 2024 11:58:06 +0000",
            "from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1])\n\tby ppma21.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id\n 449BRS79009449;\n\tThu, 9 May 2024 11:58:05 GMT",
            "from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230])\n\tby ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3xysfxjne6-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);\n\tThu, 09 May 2024 11:58:05 +0000",
            "from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com\n [10.20.54.101])\n\tby smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n 449BvxkM22872366\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);\n\tThu, 9 May 2024 11:58:01 GMT",
            "from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 98B672004B;\n\tThu,  9 May 2024 11:57:59 +0000 (GMT)",
            "from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 3D53120040;\n\tThu,  9 May 2024 11:57:58 +0000 (GMT)",
            "from li-bd3f974c-2712-11b2-a85c-df1cec4d728e.in.ibm.com (unknown\n [9.203.115.195])\n\tby smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP;\n\tThu,  9 May 2024 11:57:58 +0000 (GMT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com;\n h=from : to : cc : subject\n : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding; s=pp1;\n bh=o8urI6nQ8u4yfPvGc67TixyUdHVi5+sv3SeBckC3AHQ=;\n b=MWBmdj68OEA0yu+tKT5lyww9Q5pfvh9STJcqIKMsFyT2ocXTZ1iL5r+aHn4Zad0DH+NO\n F8XX16fTUj6fD2JXkGrtCO/V1UcLRINcT6UVtA/i89nTAV+lN6gni/CutgsDXV427luE\n J58Fz+zGHprUj/4FbpKeZkhb2T8ASZ5Na6yz2fVoht+oPIba6GlveZTX2pMWPe3WopPu\n /kUtX8g4CIePb2YWUHiQOAFtc85IzCDa/aNxITdy4hCmzo6Kq5nrGrxi79+uB9MceKHH\n 3Ok6py6Vq1Y/AjC/2oIlO5rYUEaVVqMBVa9GzutjMDHNgWZkWdkeQfLjj5q7QDdsoigV Bw==",
        "From": "Hari Bathini <hbathini@linux.ibm.com>",
        "To": "Michael Ellerman <mpe@ellerman.id.au>",
        "Subject": "[PATCH v2 1/3] powerpc/pseries/fadump: add support for multiple boot\n memory regions",
        "Date": "Thu,  9 May 2024 17:27:53 +0530",
        "Message-ID": "<20240509115755.519982-2-hbathini@linux.ibm.com>",
        "X-Mailer": "git-send-email 2.45.0",
        "In-Reply-To": "<20240509115755.519982-1-hbathini@linux.ibm.com>",
        "References": "<20240509115755.519982-1-hbathini@linux.ibm.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-TM-AS-GCONF": "00",
        "X-Proofpoint-GUID": "9XtAWcsqgImrHNkxBzuqw6BFWieZS3WC",
        "X-Proofpoint-ORIG-GUID": "9XtAWcsqgImrHNkxBzuqw6BFWieZS3WC",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.11.176.26\n definitions=2024-05-09_06,2024-05-09_01,2023-05-22_02",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n mlxscore=0 impostorscore=0\n spamscore=0 priorityscore=1501 malwarescore=0 suspectscore=0\n mlxlogscore=999 clxscore=1015 adultscore=0 phishscore=0 bulkscore=0\n lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1\n engine=8.12.0-2405010000 definitions=main-2405090079",
        "X-BeenThere": "linuxppc-dev@lists.ozlabs.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "Linux on PowerPC Developers Mail List <linuxppc-dev.lists.ozlabs.org>",
        "List-Unsubscribe": "<https://lists.ozlabs.org/options/linuxppc-dev>,\n <mailto:linuxppc-dev-request@lists.ozlabs.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.ozlabs.org/pipermail/linuxppc-dev/>",
        "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>",
        "List-Help": "<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=help>",
        "List-Subscribe": "<https://lists.ozlabs.org/listinfo/linuxppc-dev>,\n <mailto:linuxppc-dev-request@lists.ozlabs.org?subject=subscribe>",
        "Cc": "linuxppc-dev <linuxppc-dev@lists.ozlabs.org>,\n Mahesh J Salgaonkar <mahesh@linux.ibm.com>,\n Sourabh Jain <sourabhjain@linux.ibm.com>",
        "Errors-To": "linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org",
        "Sender": "\"Linuxppc-dev\"\n <linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>"
    },
    "content": "Currently, fadump on pseries assumes a single boot memory region even\nthough f/w supports more than one boot memory region. Add support for\nmore boot memory regions to make the implementation flexible for any\nenhancements that introduce other region types. For this, rtas memory\nstructure for fadump is updated to have multiple boot memory regions\ninstead of just one. Additionally, methods responsible for creating\nthe fadump memory structure during both the first and second kernel\nboot have been modified to take these multiple boot memory regions\ninto account. Also, a new callback has been added to the fadump_ops\nstructure to get the maximum boot memory regions supported by the\nplatform.\n\nSigned-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>\nSigned-off-by: Hari Bathini <hbathini@linux.ibm.com>\n---\n arch/powerpc/include/asm/fadump-internal.h   |   2 +-\n arch/powerpc/kernel/fadump.c                 |  27 +-\n arch/powerpc/platforms/powernv/opal-fadump.c |   7 +\n arch/powerpc/platforms/pseries/rtas-fadump.c | 255 +++++++++++++------\n arch/powerpc/platforms/pseries/rtas-fadump.h |  26 +-\n 5 files changed, 197 insertions(+), 120 deletions(-)",
    "diff": "diff --git a/arch/powerpc/include/asm/fadump-internal.h b/arch/powerpc/include/asm/fadump-internal.h\nindex 5d706a7acc8a..35787fa1ac60 100644\n--- a/arch/powerpc/include/asm/fadump-internal.h\n+++ b/arch/powerpc/include/asm/fadump-internal.h\n@@ -156,6 +156,7 @@ struct fadump_ops {\n \t\t\t\t      struct seq_file *m);\n \tvoid\t(*fadump_trigger)(struct fadump_crash_info_header *fdh,\n \t\t\t\t  const char *msg);\n+\tint\t(*fadump_max_boot_mem_rgns)(void);\n };\n \n /* Helper functions */\n@@ -163,7 +164,6 @@ s32 __init fadump_setup_cpu_notes_buf(u32 num_cpus);\n void fadump_free_cpu_notes_buf(void);\n u32 *__init fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs);\n void __init fadump_update_elfcore_header(char *bufp);\n-bool is_fadump_boot_mem_contiguous(void);\n bool is_fadump_reserved_mem_contiguous(void);\n \n #else /* !CONFIG_PRESERVE_FA_DUMP */\ndiff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c\nindex 0b849563393e..fe6be00451b9 100644\n--- a/arch/powerpc/kernel/fadump.c\n+++ b/arch/powerpc/kernel/fadump.c\n@@ -220,28 +220,6 @@ static bool is_fadump_mem_area_contiguous(u64 d_start, u64 d_end)\n \treturn ret;\n }\n \n-/*\n- * Returns true, if there are no holes in boot memory area,\n- * false otherwise.\n- */\n-bool is_fadump_boot_mem_contiguous(void)\n-{\n-\tunsigned long d_start, d_end;\n-\tbool ret = false;\n-\tint i;\n-\n-\tfor (i = 0; i < fw_dump.boot_mem_regs_cnt; i++) {\n-\t\td_start = fw_dump.boot_mem_addr[i];\n-\t\td_end   = d_start + fw_dump.boot_mem_sz[i];\n-\n-\t\tret = is_fadump_mem_area_contiguous(d_start, d_end);\n-\t\tif (!ret)\n-\t\t\tbreak;\n-\t}\n-\n-\treturn ret;\n-}\n-\n /*\n  * Returns true, if there are no holes in reserved memory area,\n  * false otherwise.\n@@ -381,10 +359,11 @@ static unsigned long __init get_fadump_area_size(void)\n static int __init add_boot_mem_region(unsigned long rstart,\n \t\t\t\t      unsigned long rsize)\n {\n+\tint max_boot_mem_rgns = fw_dump.ops->fadump_max_boot_mem_rgns();\n \tint i = fw_dump.boot_mem_regs_cnt++;\n \n-\tif (fw_dump.boot_mem_regs_cnt > FADUMP_MAX_MEM_REGS) {\n-\t\tfw_dump.boot_mem_regs_cnt = FADUMP_MAX_MEM_REGS;\n+\tif (fw_dump.boot_mem_regs_cnt > max_boot_mem_rgns) {\n+\t\tfw_dump.boot_mem_regs_cnt = max_boot_mem_rgns;\n \t\treturn 0;\n \t}\n \ndiff --git a/arch/powerpc/platforms/powernv/opal-fadump.c b/arch/powerpc/platforms/powernv/opal-fadump.c\nindex 767a6b19e42a..5a88d7efb48a 100644\n--- a/arch/powerpc/platforms/powernv/opal-fadump.c\n+++ b/arch/powerpc/platforms/powernv/opal-fadump.c\n@@ -599,6 +599,12 @@ static void opal_fadump_trigger(struct fadump_crash_info_header *fdh,\n \t\tpr_emerg(\"No backend support for MPIPL!\\n\");\n }\n \n+/* FADUMP_MAX_MEM_REGS or lower */\n+static int opal_fadump_max_boot_mem_rgns(void)\n+{\n+\treturn FADUMP_MAX_MEM_REGS;\n+}\n+\n static struct fadump_ops opal_fadump_ops = {\n \t.fadump_init_mem_struct\t\t= opal_fadump_init_mem_struct,\n \t.fadump_get_metadata_size\t= opal_fadump_get_metadata_size,\n@@ -611,6 +617,7 @@ static struct fadump_ops opal_fadump_ops = {\n \t.fadump_process\t\t\t= opal_fadump_process,\n \t.fadump_region_show\t\t= opal_fadump_region_show,\n \t.fadump_trigger\t\t\t= opal_fadump_trigger,\n+\t.fadump_max_boot_mem_rgns\t= opal_fadump_max_boot_mem_rgns,\n };\n \n void __init opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node)\ndiff --git a/arch/powerpc/platforms/pseries/rtas-fadump.c b/arch/powerpc/platforms/pseries/rtas-fadump.c\nindex 214f37788b2d..4db78b2bb2a8 100644\n--- a/arch/powerpc/platforms/pseries/rtas-fadump.c\n+++ b/arch/powerpc/platforms/pseries/rtas-fadump.c\n@@ -29,9 +29,6 @@ static const struct rtas_fadump_mem_struct *fdm_active;\n static void rtas_fadump_update_config(struct fw_dump *fadump_conf,\n \t\t\t\t      const struct rtas_fadump_mem_struct *fdm)\n {\n-\tfadump_conf->boot_mem_dest_addr =\n-\t\tbe64_to_cpu(fdm->rmr_region.destination_address);\n-\n \tfadump_conf->fadumphdr_addr = (fadump_conf->boot_mem_dest_addr +\n \t\t\t\t       fadump_conf->boot_memory_size);\n }\n@@ -43,20 +40,53 @@ static void rtas_fadump_update_config(struct fw_dump *fadump_conf,\n static void __init rtas_fadump_get_config(struct fw_dump *fadump_conf,\n \t\t\t\t   const struct rtas_fadump_mem_struct *fdm)\n {\n-\tfadump_conf->boot_mem_addr[0] =\n-\t\tbe64_to_cpu(fdm->rmr_region.source_address);\n-\tfadump_conf->boot_mem_sz[0] = be64_to_cpu(fdm->rmr_region.source_len);\n-\tfadump_conf->boot_memory_size = fadump_conf->boot_mem_sz[0];\n+\tunsigned long base, size, last_end, hole_size;\n \n-\tfadump_conf->boot_mem_top = fadump_conf->boot_memory_size;\n-\tfadump_conf->boot_mem_regs_cnt = 1;\n+\tlast_end = 0;\n+\thole_size = 0;\n+\tfadump_conf->boot_memory_size = 0;\n+\tfadump_conf->boot_mem_regs_cnt = 0;\n+\tpr_debug(\"Boot memory regions:\\n\");\n+\tfor (int i = 0; i < be16_to_cpu(fdm->header.dump_num_sections); i++) {\n+\t\tint type = be16_to_cpu(fdm->rgn[i].source_data_type);\n+\t\tu64 addr;\n \n-\t/*\n-\t * Start address of reserve dump area (permanent reservation) for\n-\t * re-registering FADump after dump capture.\n-\t */\n-\tfadump_conf->reserve_dump_area_start =\n-\t\tbe64_to_cpu(fdm->cpu_state_data.destination_address);\n+\t\tswitch (type) {\n+\t\tcase RTAS_FADUMP_CPU_STATE_DATA:\n+\t\t\taddr = be64_to_cpu(fdm->rgn[i].destination_address);\n+\n+\t\t\tfadump_conf->cpu_state_dest_vaddr = (u64)__va(addr);\n+\t\t\t/*\n+\t\t\t * Start address of reserve dump area (permanent reservation) for\n+\t\t\t * re-registering FADump after dump capture.\n+\t\t\t */\n+\t\t\tfadump_conf->reserve_dump_area_start = addr;\n+\t\t\tbreak;\n+\t\tcase RTAS_FADUMP_HPTE_REGION:\n+\t\t\t/* Not processed currently. */\n+\t\t\tbreak;\n+\t\tcase RTAS_FADUMP_REAL_MODE_REGION:\n+\t\t\tbase = be64_to_cpu(fdm->rgn[i].source_address);\n+\t\t\tsize = be64_to_cpu(fdm->rgn[i].source_len);\n+\t\t\tpr_debug(\"\\t[%03d] base: 0x%lx, size: 0x%lx\\n\", i, base, size);\n+\t\t\tif (!base) {\n+\t\t\t\tfadump_conf->boot_mem_dest_addr =\n+\t\t\t\t\tbe64_to_cpu(fdm->rgn[i].destination_address);\n+\t\t\t}\n+\n+\t\t\tfadump_conf->boot_mem_addr[fadump_conf->boot_mem_regs_cnt] = base;\n+\t\t\tfadump_conf->boot_mem_sz[fadump_conf->boot_mem_regs_cnt] = size;\n+\t\t\tfadump_conf->boot_memory_size += size;\n+\t\t\thole_size += (base - last_end);\n+\t\t\tlast_end = base + size;\n+\t\t\tfadump_conf->boot_mem_regs_cnt++;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tpr_warn(\"Section type %d unsupported on this kernel. Ignoring!\\n\", type);\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tfadump_conf->boot_mem_top = fadump_conf->boot_memory_size + hole_size;\n \n \trtas_fadump_update_config(fadump_conf, fdm);\n }\n@@ -64,16 +94,15 @@ static void __init rtas_fadump_get_config(struct fw_dump *fadump_conf,\n static u64 rtas_fadump_init_mem_struct(struct fw_dump *fadump_conf)\n {\n \tu64 addr = fadump_conf->reserve_dump_area_start;\n+\tu16 sec_cnt = 0;\n \n \tmemset(&fdm, 0, sizeof(struct rtas_fadump_mem_struct));\n \taddr = addr & PAGE_MASK;\n \n \tfdm.header.dump_format_version = cpu_to_be32(0x00000001);\n-\tfdm.header.dump_num_sections = cpu_to_be16(3);\n \tfdm.header.dump_status_flag = 0;\n \tfdm.header.offset_first_dump_section =\n-\t\tcpu_to_be32((u32)offsetof(struct rtas_fadump_mem_struct,\n-\t\t\t\t\t  cpu_state_data));\n+\t\tcpu_to_be32((u32)offsetof(struct rtas_fadump_mem_struct, rgn));\n \n \t/*\n \t * Fields for disk dump option.\n@@ -89,25 +118,22 @@ static u64 rtas_fadump_init_mem_struct(struct fw_dump *fadump_conf)\n \n \t/* Kernel dump sections */\n \t/* cpu state data section. */\n-\tfdm.cpu_state_data.request_flag =\n-\t\tcpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);\n-\tfdm.cpu_state_data.source_data_type =\n-\t\tcpu_to_be16(RTAS_FADUMP_CPU_STATE_DATA);\n-\tfdm.cpu_state_data.source_address = 0;\n-\tfdm.cpu_state_data.source_len =\n-\t\tcpu_to_be64(fadump_conf->cpu_state_data_size);\n-\tfdm.cpu_state_data.destination_address = cpu_to_be64(addr);\n+\tfdm.rgn[sec_cnt].request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);\n+\tfdm.rgn[sec_cnt].source_data_type = cpu_to_be16(RTAS_FADUMP_CPU_STATE_DATA);\n+\tfdm.rgn[sec_cnt].source_address = 0;\n+\tfdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->cpu_state_data_size);\n+\tfdm.rgn[sec_cnt].destination_address = cpu_to_be64(addr);\n \taddr += fadump_conf->cpu_state_data_size;\n+\tsec_cnt++;\n \n \t/* hpte region section */\n-\tfdm.hpte_region.request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);\n-\tfdm.hpte_region.source_data_type =\n-\t\tcpu_to_be16(RTAS_FADUMP_HPTE_REGION);\n-\tfdm.hpte_region.source_address = 0;\n-\tfdm.hpte_region.source_len =\n-\t\tcpu_to_be64(fadump_conf->hpte_region_size);\n-\tfdm.hpte_region.destination_address = cpu_to_be64(addr);\n+\tfdm.rgn[sec_cnt].request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);\n+\tfdm.rgn[sec_cnt].source_data_type = cpu_to_be16(RTAS_FADUMP_HPTE_REGION);\n+\tfdm.rgn[sec_cnt].source_address = 0;\n+\tfdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->hpte_region_size);\n+\tfdm.rgn[sec_cnt].destination_address = cpu_to_be64(addr);\n \taddr += fadump_conf->hpte_region_size;\n+\tsec_cnt++;\n \n \t/*\n \t * Align boot memory area destination address to page boundary to\n@@ -115,15 +141,20 @@ static u64 rtas_fadump_init_mem_struct(struct fw_dump *fadump_conf)\n \t */\n \taddr = PAGE_ALIGN(addr);\n \n-\t/* RMA region section */\n-\tfdm.rmr_region.request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);\n-\tfdm.rmr_region.source_data_type =\n-\t\tcpu_to_be16(RTAS_FADUMP_REAL_MODE_REGION);\n-\tfdm.rmr_region.source_address = cpu_to_be64(0);\n-\tfdm.rmr_region.source_len = cpu_to_be64(fadump_conf->boot_memory_size);\n-\tfdm.rmr_region.destination_address = cpu_to_be64(addr);\n-\taddr += fadump_conf->boot_memory_size;\n+\t/* First boot memory region destination address */\n+\tfadump_conf->boot_mem_dest_addr = addr;\n+\tfor (int i = 0; i < fadump_conf->boot_mem_regs_cnt; i++) {\n+\t\t/* Boot memory regions */\n+\t\tfdm.rgn[sec_cnt].request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);\n+\t\tfdm.rgn[sec_cnt].source_data_type = cpu_to_be16(RTAS_FADUMP_REAL_MODE_REGION);\n+\t\tfdm.rgn[sec_cnt].source_address = cpu_to_be64(fadump_conf->boot_mem_addr[i]);\n+\t\tfdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->boot_mem_sz[i]);\n+\t\tfdm.rgn[sec_cnt].destination_address = cpu_to_be64(addr);\n+\t\taddr += fadump_conf->boot_mem_sz[i];\n+\t\tsec_cnt++;\n+\t}\n \n+\tfdm.header.dump_num_sections = cpu_to_be16(sec_cnt);\n \trtas_fadump_update_config(fadump_conf, &fdm);\n \n \treturn addr;\n@@ -136,14 +167,21 @@ static u64 rtas_fadump_get_bootmem_min(void)\n \n static int rtas_fadump_register(struct fw_dump *fadump_conf)\n {\n-\tunsigned int wait_time;\n+\tunsigned int wait_time, fdm_size;\n \tint rc, err = -EIO;\n \n+\t/*\n+\t * Platform requires the exact size of the Dump Memory Structure.\n+\t * Avoid including any unused rgns in the calculation, as this\n+\t * could result in a parameter error (-3) from the platform.\n+\t */\n+\tfdm_size = sizeof(struct rtas_fadump_section_header);\n+\tfdm_size += be16_to_cpu(fdm.header.dump_num_sections) * sizeof(struct rtas_fadump_section);\n+\n \t/* TODO: Add upper time limit for the delay */\n \tdo {\n \t\trc =  rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,\n-\t\t\t\tNULL, FADUMP_REGISTER, &fdm,\n-\t\t\t\tsizeof(struct rtas_fadump_mem_struct));\n+\t\t\t\tNULL, FADUMP_REGISTER, &fdm, fdm_size);\n \n \t\twait_time = rtas_busy_delay_time(rc);\n \t\tif (wait_time)\n@@ -161,9 +199,7 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf)\n \t\tpr_err(\"Failed to register. Hardware Error(%d).\\n\", rc);\n \t\tbreak;\n \tcase -3:\n-\t\tif (!is_fadump_boot_mem_contiguous())\n-\t\t\tpr_err(\"Can't have holes in boot memory area.\\n\");\n-\t\telse if (!is_fadump_reserved_mem_contiguous())\n+\t\tif (!is_fadump_reserved_mem_contiguous())\n \t\t\tpr_err(\"Can't have holes in reserved memory area.\\n\");\n \n \t\tpr_err(\"Failed to register. Parameter Error(%d).\\n\", rc);\n@@ -316,11 +352,9 @@ static int __init rtas_fadump_build_cpu_notes(struct fw_dump *fadump_conf)\n \tu32 num_cpus, *note_buf;\n \tint i, rc = 0, cpu = 0;\n \tstruct pt_regs regs;\n-\tunsigned long addr;\n \tvoid *vaddr;\n \n-\taddr = be64_to_cpu(fdm_active->cpu_state_data.destination_address);\n-\tvaddr = __va(addr);\n+\tvaddr = (void *)fadump_conf->cpu_state_dest_vaddr;\n \n \treg_header = vaddr;\n \tif (be64_to_cpu(reg_header->magic_number) !=\n@@ -395,18 +429,42 @@ static int __init rtas_fadump_process(struct fw_dump *fadump_conf)\n \t\treturn -EINVAL;\n \n \t/* Check if the dump data is valid. */\n-\tif ((be16_to_cpu(fdm_active->header.dump_status_flag) ==\n-\t\t\tRTAS_FADUMP_ERROR_FLAG) ||\n-\t\t\t(fdm_active->cpu_state_data.error_flags != 0) ||\n-\t\t\t(fdm_active->rmr_region.error_flags != 0)) {\n-\t\tpr_err(\"Dump taken by platform is not valid\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\tif ((fdm_active->rmr_region.bytes_dumped !=\n-\t\t\tfdm_active->rmr_region.source_len) ||\n-\t\t\t!fdm_active->cpu_state_data.bytes_dumped) {\n-\t\tpr_err(\"Dump taken by platform is incomplete\\n\");\n-\t\treturn -EINVAL;\n+\tfor (int i = 0; i < be16_to_cpu(fdm_active->header.dump_num_sections); i++) {\n+\t\tint type = be16_to_cpu(fdm_active->rgn[i].source_data_type);\n+\t\tint rc = 0;\n+\n+\t\tswitch (type) {\n+\t\tcase RTAS_FADUMP_CPU_STATE_DATA:\n+\t\tcase RTAS_FADUMP_HPTE_REGION:\n+\t\tcase RTAS_FADUMP_REAL_MODE_REGION:\n+\t\t\tif (fdm_active->rgn[i].error_flags != 0) {\n+\t\t\t\tpr_err(\"Dump taken by platform is not valid (%d)\\n\", i);\n+\t\t\t\trc = -EINVAL;\n+\t\t\t}\n+\t\t\tif (fdm_active->rgn[i].bytes_dumped != fdm_active->rgn[i].source_len) {\n+\t\t\t\tpr_err(\"Dump taken by platform is incomplete (%d)\\n\", i);\n+\t\t\t\trc = -EINVAL;\n+\t\t\t}\n+\t\t\tif (rc) {\n+\t\t\t\tpr_warn(\"Region type: %u src addr: 0x%llx dest addr: 0x%llx\\n\",\n+\t\t\t\t\tbe16_to_cpu(fdm_active->rgn[i].source_data_type),\n+\t\t\t\t\tbe64_to_cpu(fdm_active->rgn[i].source_address),\n+\t\t\t\t\tbe64_to_cpu(fdm_active->rgn[i].destination_address));\n+\t\t\t\treturn rc;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\t/*\n+\t\t\t * If the first/crashed kernel added a new region type that the\n+\t\t\t * second/fadump kernel doesn't recognize, skip it and process\n+\t\t\t * assuming backward compatibility.\n+\t\t\t */\n+\t\t\tpr_warn(\"Unknown region found: type: %u src addr: 0x%llx dest addr: 0x%llx\\n\",\n+\t\t\t\tbe16_to_cpu(fdm_active->rgn[i].source_data_type),\n+\t\t\t\tbe64_to_cpu(fdm_active->rgn[i].source_address),\n+\t\t\t\tbe64_to_cpu(fdm_active->rgn[i].destination_address));\n+\t\t\tbreak;\n+\t\t}\n \t}\n \n \treturn rtas_fadump_build_cpu_notes(fadump_conf);\n@@ -415,7 +473,6 @@ static int __init rtas_fadump_process(struct fw_dump *fadump_conf)\n static void rtas_fadump_region_show(struct fw_dump *fadump_conf,\n \t\t\t\t    struct seq_file *m)\n {\n-\tconst struct rtas_fadump_section *cpu_data_section;\n \tconst struct rtas_fadump_mem_struct *fdm_ptr;\n \n \tif (fdm_active)\n@@ -423,27 +480,42 @@ static void rtas_fadump_region_show(struct fw_dump *fadump_conf,\n \telse\n \t\tfdm_ptr = &fdm;\n \n-\tcpu_data_section = &(fdm_ptr->cpu_state_data);\n-\tseq_printf(m, \"CPU :[%#016llx-%#016llx] %#llx bytes, Dumped: %#llx\\n\",\n-\t\t   be64_to_cpu(cpu_data_section->destination_address),\n-\t\t   be64_to_cpu(cpu_data_section->destination_address) +\n-\t\t   be64_to_cpu(cpu_data_section->source_len) - 1,\n-\t\t   be64_to_cpu(cpu_data_section->source_len),\n-\t\t   be64_to_cpu(cpu_data_section->bytes_dumped));\n-\n-\tseq_printf(m, \"HPTE:[%#016llx-%#016llx] %#llx bytes, Dumped: %#llx\\n\",\n-\t\t   be64_to_cpu(fdm_ptr->hpte_region.destination_address),\n-\t\t   be64_to_cpu(fdm_ptr->hpte_region.destination_address) +\n-\t\t   be64_to_cpu(fdm_ptr->hpte_region.source_len) - 1,\n-\t\t   be64_to_cpu(fdm_ptr->hpte_region.source_len),\n-\t\t   be64_to_cpu(fdm_ptr->hpte_region.bytes_dumped));\n-\n-\tseq_printf(m, \"DUMP: Src: %#016llx, Dest: %#016llx, \",\n-\t\t   be64_to_cpu(fdm_ptr->rmr_region.source_address),\n-\t\t   be64_to_cpu(fdm_ptr->rmr_region.destination_address));\n-\tseq_printf(m, \"Size: %#llx, Dumped: %#llx bytes\\n\",\n-\t\t   be64_to_cpu(fdm_ptr->rmr_region.source_len),\n-\t\t   be64_to_cpu(fdm_ptr->rmr_region.bytes_dumped));\n+\n+\tfor (int i = 0; i < be16_to_cpu(fdm_ptr->header.dump_num_sections); i++) {\n+\t\tint type = be16_to_cpu(fdm_ptr->rgn[i].source_data_type);\n+\n+\t\tswitch (type) {\n+\t\tcase RTAS_FADUMP_CPU_STATE_DATA:\n+\t\t\tseq_printf(m, \"CPU :[%#016llx-%#016llx] %#llx bytes, Dumped: %#llx\\n\",\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].destination_address),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].destination_address) +\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].source_len) - 1,\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].source_len),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].bytes_dumped));\n+\t\t\tbreak;\n+\t\tcase RTAS_FADUMP_HPTE_REGION:\n+\t\t\tseq_printf(m, \"HPTE:[%#016llx-%#016llx] %#llx bytes, Dumped: %#llx\\n\",\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].destination_address),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].destination_address) +\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].source_len) - 1,\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].source_len),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].bytes_dumped));\n+\t\t\tbreak;\n+\t\tcase RTAS_FADUMP_REAL_MODE_REGION:\n+\t\t\tseq_printf(m, \"DUMP: Src: %#016llx, Dest: %#016llx, \",\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].source_address),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].destination_address));\n+\t\t\tseq_printf(m, \"Size: %#llx, Dumped: %#llx bytes\\n\",\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].source_len),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].bytes_dumped));\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tseq_printf(m, \"Unknown region type %d : Src: %#016llx, Dest: %#016llx, \",\n+\t\t\t\t   type, be64_to_cpu(fdm_ptr->rgn[i].source_address),\n+\t\t\t\t   be64_to_cpu(fdm_ptr->rgn[i].destination_address));\n+\t\t\tbreak;\n+\t\t}\n+\t}\n \n \t/* Dump is active. Show preserved area start address. */\n \tif (fdm_active) {\n@@ -459,6 +531,20 @@ static void rtas_fadump_trigger(struct fadump_crash_info_header *fdh,\n \trtas_os_term((char *)msg);\n }\n \n+/* FADUMP_MAX_MEM_REGS or lower */\n+static int rtas_fadump_max_boot_mem_rgns(void)\n+{\n+\t/*\n+\t * Version 1 of Kernel Assisted Dump Memory Structure (PAPR) supports 10 sections.\n+\t * With one each section taken for CPU state data & HPTE respectively, 8 sections\n+\t * can be used for boot memory regions.\n+\t *\n+\t * If new region(s) is(are) defined, maximum boot memory regions will decrease\n+\t * proportionally.\n+\t */\n+\treturn RTAS_FADUMP_MAX_BOOT_MEM_REGS;\n+}\n+\n static struct fadump_ops rtas_fadump_ops = {\n \t.fadump_init_mem_struct\t\t= rtas_fadump_init_mem_struct,\n \t.fadump_get_bootmem_min\t\t= rtas_fadump_get_bootmem_min,\n@@ -468,6 +554,7 @@ static struct fadump_ops rtas_fadump_ops = {\n \t.fadump_process\t\t\t= rtas_fadump_process,\n \t.fadump_region_show\t\t= rtas_fadump_region_show,\n \t.fadump_trigger\t\t\t= rtas_fadump_trigger,\n+\t.fadump_max_boot_mem_rgns\t= rtas_fadump_max_boot_mem_rgns,\n };\n \n void __init rtas_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node)\ndiff --git a/arch/powerpc/platforms/pseries/rtas-fadump.h b/arch/powerpc/platforms/pseries/rtas-fadump.h\nindex fd59bd7ca9c3..6740f4981bb8 100644\n--- a/arch/powerpc/platforms/pseries/rtas-fadump.h\n+++ b/arch/powerpc/platforms/pseries/rtas-fadump.h\n@@ -29,6 +29,15 @@\n /* Dump status flag */\n #define RTAS_FADUMP_ERROR_FLAG\t\t0x2000\n \n+/*\n+ * The Firmware Assisted Dump Memory structure supports a maximum of 10 sections\n+ * in the dump memory structure. Presently, first two sections are used for\n+ * CPU and HPTE data, while the remaining eight sections can be used for\n+ * boot memory regions.\n+ */\n+#define MAX_SECTIONS\t\t\t\t10\n+#define RTAS_FADUMP_MAX_BOOT_MEM_REGS\t\t8\n+\n /* Kernel Dump section info */\n struct rtas_fadump_section {\n \t__be32\trequest_flag;\n@@ -61,20 +70,15 @@ struct rtas_fadump_section_header {\n  * Firmware Assisted dump memory structure. This structure is required for\n  * registering future kernel dump with power firmware through rtas call.\n  *\n- * No disk dump option. Hence disk dump path string section is not included.\n+ * In version 1, the platform permits one section header, dump-disk path\n+ * and ten sections.\n+ *\n+ * Note: No disk dump option. Hence disk dump path string section is not\n+ * included.\n  */\n struct rtas_fadump_mem_struct {\n \tstruct rtas_fadump_section_header\theader;\n-\n-\t/* Kernel dump sections */\n-\tstruct rtas_fadump_section\t\tcpu_state_data;\n-\tstruct rtas_fadump_section\t\thpte_region;\n-\n-\t/*\n-\t * TODO: Extend multiple boot memory regions support in the kernel\n-\t *       for this platform.\n-\t */\n-\tstruct rtas_fadump_section\t\trmr_region;\n+\tstruct rtas_fadump_section\t\trgn[MAX_SECTIONS];\n };\n \n /*\n",
    "prefixes": [
        "v2",
        "1/3"
    ]
}