* Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
  */
 
-#ifndef __PPC64_FA_DUMP_H__
-#define __PPC64_FA_DUMP_H__
+#ifndef _ASM_POWERPC_FADUMP_H
+#define _ASM_POWERPC_FADUMP_H
 
 #ifdef CONFIG_FA_DUMP
 
-/* Firmware provided dump sections */
-#define FADUMP_CPU_STATE_DATA  0x0001
-#define FADUMP_HPTE_REGION     0x0002
-#define FADUMP_REAL_MODE_REGION        0x0011
-
-/* Dump request flag */
-#define FADUMP_REQUEST_FLAG    0x00000001
-
-/* Dump status flag */
-#define FADUMP_ERROR_FLAG      0x2000
-
-#define FADUMP_CPU_ID_MASK     ((1UL << 32) - 1)
-
-#define CPU_UNKNOWN            (~((u32)0))
-
-/* Utility macros */
-#define SKIP_TO_NEXT_CPU(reg_entry)                                    \
-({                                                                     \
-       while (be64_to_cpu(reg_entry->reg_id) != REG_ID("CPUEND"))      \
-               reg_entry++;                                            \
-       reg_entry++;                                                    \
-})
-
 extern int crashing_cpu;
 
-/* Kernel Dump section info */
-struct fadump_section {
-       __be32  request_flag;
-       __be16  source_data_type;
-       __be16  error_flags;
-       __be64  source_address;
-       __be64  source_len;
-       __be64  bytes_dumped;
-       __be64  destination_address;
-};
-
-/* ibm,configure-kernel-dump header. */
-struct fadump_section_header {
-       __be32  dump_format_version;
-       __be16  dump_num_sections;
-       __be16  dump_status_flag;
-       __be32  offset_first_dump_section;
-
-       /* Fields for disk dump option. */
-       __be32  dd_block_size;
-       __be64  dd_block_offset;
-       __be64  dd_num_blocks;
-       __be32  dd_offset_disk_path;
-
-       /* Maximum time allowed to prevent an automatic dump-reboot. */
-       __be32  max_time_auto;
-};
-
-/*
- * Firmware Assisted dump memory structure. This structure is required for
- * registering future kernel dump with power firmware through rtas call.
- *
- * No disk dump option. Hence disk dump path string section is not included.
- */
-struct fadump_mem_struct {
-       struct fadump_section_header    header;
-
-       /* Kernel dump sections */
-       struct fadump_section           cpu_state_data;
-       struct fadump_section           hpte_region;
-       struct fadump_section           rmr_region;
-};
-
-/*
- * Copy the ascii values for first 8 characters from a string into u64
- * variable at their respective indexes.
- * e.g.
- *  The string "FADMPINF" will be converted into 0x4641444d50494e46
- */
-static inline u64 str_to_u64(const char *str)
-{
-       u64 val = 0;
-       int i;
-
-       for (i = 0; i < sizeof(val); i++)
-               val = (*str) ? (val << 8) | *str++ : val << 8;
-       return val;
-}
-#define STR_TO_HEX(x)  str_to_u64(x)
-#define REG_ID(x)      str_to_u64(x)
-
-#define REGSAVE_AREA_MAGIC             STR_TO_HEX("REGSAVE")
-
-/* The firmware-assisted dump format.
- *
- * The register save area is an area in the partition's memory used to preserve
- * the register contents (CPU state data) for the active CPUs during a firmware
- * assisted dump. The dump format contains register save area header followed
- * by register entries. Each list of registers for a CPU starts with
- * "CPUSTRT" and ends with "CPUEND".
- */
-
-/* Register save area header. */
-struct fadump_reg_save_area_header {
-       __be64          magic_number;
-       __be32          version;
-       __be32          num_cpu_offset;
-};
-
-/* Register entry. */
-struct fadump_reg_entry {
-       __be64          reg_id;
-       __be64          reg_value;
-};
-
 extern int is_fadump_memory_area(u64 addr, ulong size);
 extern int early_init_dt_scan_fw_dump(unsigned long node,
                const char *uname, int depth, void *data);
 static inline int should_fadump_crash(void) { return 0; }
 static inline void crash_fadump(struct pt_regs *regs, const char *str) { }
 static inline void fadump_cleanup(void) { }
-#endif
-#endif
+#endif /* !CONFIG_FA_DUMP */
+#endif /* _ASM_POWERPC_FADUMP_H */
 
 #include <asm/fadump-internal.h>
 #include <asm/setup.h>
 
+#include "../platforms/pseries/rtas-fadump.h"
+
 static struct fw_dump fw_dump;
-static struct fadump_mem_struct fdm;
-static const struct fadump_mem_struct *fdm_active;
-#ifdef CONFIG_CMA
-static struct cma *fadump_cma;
-#endif
+static struct rtas_fadump_mem_struct fdm;
+static const struct rtas_fadump_mem_struct *fdm_active;
 
 static DEFINE_MUTEX(fadump_mutex);
 struct fad_crash_memory_ranges *crash_memory_ranges;
 int max_crash_mem_ranges;
 
 #ifdef CONFIG_CMA
+static struct cma *fadump_cma;
+
 /*
  * fadump_cma_init() - Initialize CMA area from a fadump reserved memory
  *
                u32 type = (u32)of_read_number(sections, 1);
 
                switch (type) {
-               case FADUMP_CPU_STATE_DATA:
+               case RTAS_FADUMP_CPU_STATE_DATA:
                        fw_dump.cpu_state_data_size =
                                        of_read_ulong(§ions[1], 2);
                        break;
-               case FADUMP_HPTE_REGION:
+               case RTAS_FADUMP_HPTE_REGION:
                        fw_dump.hpte_region_size =
                                        of_read_ulong(§ions[1], 2);
                        break;
        pr_debug("Boot memory size  : %lx\n", fw_dump.boot_memory_size);
 }
 
-static unsigned long init_fadump_mem_struct(struct fadump_mem_struct *fdm,
+static unsigned long init_fadump_mem_struct(struct rtas_fadump_mem_struct *fdm,
                                unsigned long addr)
 {
        if (!fdm)
                return 0;
 
-       memset(fdm, 0, sizeof(struct fadump_mem_struct));
+       memset(fdm, 0, sizeof(struct rtas_fadump_mem_struct));
        addr = addr & PAGE_MASK;
 
        fdm->header.dump_format_version = cpu_to_be32(0x00000001);
        fdm->header.dump_num_sections = cpu_to_be16(3);
        fdm->header.dump_status_flag = 0;
        fdm->header.offset_first_dump_section =
-               cpu_to_be32((u32)offsetof(struct fadump_mem_struct, cpu_state_data));
+               cpu_to_be32((u32)offsetof(struct rtas_fadump_mem_struct, cpu_state_data));
 
        /*
         * Fields for disk dump option.
 
        /* Kernel dump sections */
        /* cpu state data section. */
-       fdm->cpu_state_data.request_flag = cpu_to_be32(FADUMP_REQUEST_FLAG);
-       fdm->cpu_state_data.source_data_type = cpu_to_be16(FADUMP_CPU_STATE_DATA);
+       fdm->cpu_state_data.request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);
+       fdm->cpu_state_data.source_data_type = cpu_to_be16(RTAS_FADUMP_CPU_STATE_DATA);
        fdm->cpu_state_data.source_address = 0;
        fdm->cpu_state_data.source_len = cpu_to_be64(fw_dump.cpu_state_data_size);
        fdm->cpu_state_data.destination_address = cpu_to_be64(addr);
        addr += fw_dump.cpu_state_data_size;
 
        /* hpte region section */
-       fdm->hpte_region.request_flag = cpu_to_be32(FADUMP_REQUEST_FLAG);
-       fdm->hpte_region.source_data_type = cpu_to_be16(FADUMP_HPTE_REGION);
+       fdm->hpte_region.request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);
+       fdm->hpte_region.source_data_type = cpu_to_be16(RTAS_FADUMP_HPTE_REGION);
        fdm->hpte_region.source_address = 0;
        fdm->hpte_region.source_len = cpu_to_be64(fw_dump.hpte_region_size);
        fdm->hpte_region.destination_address = cpu_to_be64(addr);
        addr += fw_dump.hpte_region_size;
 
        /* RMA region section */
-       fdm->rmr_region.request_flag = cpu_to_be32(FADUMP_REQUEST_FLAG);
-       fdm->rmr_region.source_data_type = cpu_to_be16(FADUMP_REAL_MODE_REGION);
+       fdm->rmr_region.request_flag = cpu_to_be32(RTAS_FADUMP_REQUEST_FLAG);
+       fdm->rmr_region.source_data_type = cpu_to_be16(RTAS_FADUMP_REAL_MODE_REGION);
        fdm->rmr_region.source_address = cpu_to_be64(RMA_START);
        fdm->rmr_region.source_len = cpu_to_be64(fw_dump.boot_memory_size);
        fdm->rmr_region.destination_address = cpu_to_be64(addr);
 }
 early_param("fadump_reserve_mem", early_fadump_reserve_mem);
 
-static int register_fw_dump(struct fadump_mem_struct *fdm)
+static int register_fw_dump(struct rtas_fadump_mem_struct *fdm)
 {
        int rc, err;
        unsigned int wait_time;
        do {
                rc = rtas_call(fw_dump.ibm_configure_kernel_dump, 3, 1, NULL,
                        FADUMP_REGISTER, fdm,
-                       sizeof(struct fadump_mem_struct));
+                       sizeof(struct rtas_fadump_mem_struct));
 
                wait_time = rtas_busy_delay_time(rc);
                if (wait_time)
        int i = -1;
        char str[3];
 
-       if ((id & GPR_MASK) == REG_ID("GPR")) {
+       if ((id & GPR_MASK) == fadump_str_to_u64("GPR")) {
                /* get the digits at the end */
                id &= ~GPR_MASK;
                id >>= 24;
        i = fadump_gpr_index(reg_id);
        if (i >= 0)
                regs->gpr[i] = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("NIA"))
+       else if (reg_id == fadump_str_to_u64("NIA"))
                regs->nip = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("MSR"))
+       else if (reg_id == fadump_str_to_u64("MSR"))
                regs->msr = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("CTR"))
+       else if (reg_id == fadump_str_to_u64("CTR"))
                regs->ctr = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("LR"))
+       else if (reg_id == fadump_str_to_u64("LR"))
                regs->link = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("XER"))
+       else if (reg_id == fadump_str_to_u64("XER"))
                regs->xer = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("CR"))
+       else if (reg_id == fadump_str_to_u64("CR"))
                regs->ccr = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("DAR"))
+       else if (reg_id == fadump_str_to_u64("DAR"))
                regs->dar = (unsigned long)reg_val;
-       else if (reg_id == REG_ID("DSISR"))
+       else if (reg_id == fadump_str_to_u64("DSISR"))
                regs->dsisr = (unsigned long)reg_val;
 }
 
-static struct fadump_reg_entry*
-fadump_read_registers(struct fadump_reg_entry *reg_entry, struct pt_regs *regs)
+static struct rtas_fadump_reg_entry*
+fadump_read_registers(struct rtas_fadump_reg_entry *reg_entry, struct pt_regs *regs)
 {
        memset(regs, 0, sizeof(struct pt_regs));
 
-       while (be64_to_cpu(reg_entry->reg_id) != REG_ID("CPUEND")) {
+       while (be64_to_cpu(reg_entry->reg_id) != fadump_str_to_u64("CPUEND")) {
                fadump_set_regval(regs, be64_to_cpu(reg_entry->reg_id),
                                        be64_to_cpu(reg_entry->reg_value));
                reg_entry++;
  * state from fadump crash info structure populated by first kernel at the
  * time of crash.
  */
-static int __init fadump_build_cpu_notes(const struct fadump_mem_struct *fdm)
+static int __init fadump_build_cpu_notes(const struct rtas_fadump_mem_struct *fdm)
 {
-       struct fadump_reg_save_area_header *reg_header;
-       struct fadump_reg_entry *reg_entry;
+       struct rtas_fadump_reg_save_area_header *reg_header;
+       struct rtas_fadump_reg_entry *reg_entry;
        struct fadump_crash_info_header *fdh = NULL;
        void *vaddr;
        unsigned long addr;
        vaddr = __va(addr);
 
        reg_header = vaddr;
-       if (be64_to_cpu(reg_header->magic_number) != REGSAVE_AREA_MAGIC) {
+       if (be64_to_cpu(reg_header->magic_number) !=
+           fadump_str_to_u64("REGSAVE")) {
                printk(KERN_ERR "Unable to read register save area.\n");
                return -ENOENT;
        }
        num_cpus = be32_to_cpu(*((__be32 *)(vaddr)));
        pr_debug("NumCpus     : %u\n", num_cpus);
        vaddr += sizeof(u32);
-       reg_entry = (struct fadump_reg_entry *)vaddr;
+       reg_entry = (struct rtas_fadump_reg_entry *)vaddr;
 
        rc = fadump_setup_cpu_notes_buf(num_cpus);
        if (rc != 0)
                fdh = __va(fw_dump.fadumphdr_addr);
 
        for (i = 0; i < num_cpus; i++) {
-               if (be64_to_cpu(reg_entry->reg_id) != REG_ID("CPUSTRT")) {
+               if (be64_to_cpu(reg_entry->reg_id) != fadump_str_to_u64("CPUSTRT")) {
                        printk(KERN_ERR "Unable to read CPU state data\n");
                        rc = -ENOENT;
                        goto error_out;
                }
                /* Lower 4 bytes of reg_value contains logical cpu id */
-               cpu = be64_to_cpu(reg_entry->reg_value) & FADUMP_CPU_ID_MASK;
+               cpu = be64_to_cpu(reg_entry->reg_value) & RTAS_FADUMP_CPU_ID_MASK;
                if (fdh && !cpumask_test_cpu(cpu, &fdh->online_mask)) {
-                       SKIP_TO_NEXT_CPU(reg_entry);
+                       RTAS_FADUMP_SKIP_TO_NEXT_CPU(reg_entry);
                        continue;
                }
                pr_debug("Reading register data for cpu %d...\n", cpu);
                if (fdh && fdh->crashing_cpu == cpu) {
                        regs = fdh->regs;
                        note_buf = fadump_regs_to_elf_notes(note_buf, ®s);
-                       SKIP_TO_NEXT_CPU(reg_entry);
+                       RTAS_FADUMP_SKIP_TO_NEXT_CPU(reg_entry);
                } else {
                        reg_entry++;
                        reg_entry = fadump_read_registers(reg_entry, ®s);
  * Validate and process the dump data stored by firmware before exporting
  * it through '/proc/vmcore'.
  */
-static int __init process_fadump(const struct fadump_mem_struct *fdm_active)
+static int __init process_fadump(const struct rtas_fadump_mem_struct *fdm_active)
 {
        struct fadump_crash_info_header *fdh;
        int rc = 0;
                return -EINVAL;
 
        /* Check if the dump data is valid. */
-       if ((be16_to_cpu(fdm_active->header.dump_status_flag) == FADUMP_ERROR_FLAG) ||
+       if ((be16_to_cpu(fdm_active->header.dump_status_flag) == RTAS_FADUMP_ERROR_FLAG) ||
                        (fdm_active->cpu_state_data.error_flags != 0) ||
                        (fdm_active->rmr_region.error_flags != 0)) {
                printk(KERN_ERR "Dump taken by platform is not valid\n");
        fdh->magic_number = FADUMP_CRASH_INFO_MAGIC;
        fdh->elfcorehdr_addr = addr;
        /* We will set the crashing cpu id in crash_fadump() during crash. */
-       fdh->crashing_cpu = CPU_UNKNOWN;
+       fdh->crashing_cpu = FADUMP_CPU_UNKNOWN;
 
        return addr;
 }
        return register_fw_dump(&fdm);
 }
 
-static int fadump_unregister_dump(struct fadump_mem_struct *fdm)
+static int fadump_unregister_dump(struct rtas_fadump_mem_struct *fdm)
 {
        int rc = 0;
        unsigned int wait_time;
        do {
                rc = rtas_call(fw_dump.ibm_configure_kernel_dump, 3, 1, NULL,
                        FADUMP_UNREGISTER, fdm,
-                       sizeof(struct fadump_mem_struct));
+                       sizeof(struct rtas_fadump_mem_struct));
 
                wait_time = rtas_busy_delay_time(rc);
                if (wait_time)
        return 0;
 }
 
-static int fadump_invalidate_dump(const struct fadump_mem_struct *fdm)
+static int fadump_invalidate_dump(const struct rtas_fadump_mem_struct *fdm)
 {
        int rc = 0;
        unsigned int wait_time;
        do {
                rc = rtas_call(fw_dump.ibm_configure_kernel_dump, 3, 1, NULL,
                        FADUMP_INVALIDATE, fdm,
-                       sizeof(struct fadump_mem_struct));
+                       sizeof(struct rtas_fadump_mem_struct));
 
                wait_time = rtas_busy_delay_time(rc);
                if (wait_time)
 
 static int fadump_region_show(struct seq_file *m, void *private)
 {
-       const struct fadump_mem_struct *fdm_ptr;
+       const struct rtas_fadump_mem_struct *fdm_ptr;
 
        if (!fw_dump.fadump_enabled)
                return 0;
 
--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Firmware-Assisted Dump support on POWERVM platform.
+ *
+ * Copyright 2011, Mahesh Salgaonkar, IBM Corporation.
+ * Copyright 2019, Hari Bathini, IBM Corporation.
+ */
+
+#ifndef _PSERIES_RTAS_FADUMP_H
+#define _PSERIES_RTAS_FADUMP_H
+
+/* Firmware provided dump sections */
+#define RTAS_FADUMP_CPU_STATE_DATA     0x0001
+#define RTAS_FADUMP_HPTE_REGION                0x0002
+#define RTAS_FADUMP_REAL_MODE_REGION   0x0011
+
+/* Dump request flag */
+#define RTAS_FADUMP_REQUEST_FLAG       0x00000001
+
+/* Dump status flag */
+#define RTAS_FADUMP_ERROR_FLAG         0x2000
+
+/* Kernel Dump section info */
+struct rtas_fadump_section {
+       __be32  request_flag;
+       __be16  source_data_type;
+       __be16  error_flags;
+       __be64  source_address;
+       __be64  source_len;
+       __be64  bytes_dumped;
+       __be64  destination_address;
+};
+
+/* ibm,configure-kernel-dump header. */
+struct rtas_fadump_section_header {
+       __be32  dump_format_version;
+       __be16  dump_num_sections;
+       __be16  dump_status_flag;
+       __be32  offset_first_dump_section;
+
+       /* Fields for disk dump option. */
+       __be32  dd_block_size;
+       __be64  dd_block_offset;
+       __be64  dd_num_blocks;
+       __be32  dd_offset_disk_path;
+
+       /* Maximum time allowed to prevent an automatic dump-reboot. */
+       __be32  max_time_auto;
+};
+
+/*
+ * Firmware Assisted dump memory structure. This structure is required for
+ * registering future kernel dump with power firmware through rtas call.
+ *
+ * No disk dump option. Hence disk dump path string section is not included.
+ */
+struct rtas_fadump_mem_struct {
+       struct rtas_fadump_section_header       header;
+
+       /* Kernel dump sections */
+       struct rtas_fadump_section              cpu_state_data;
+       struct rtas_fadump_section              hpte_region;
+       struct rtas_fadump_section              rmr_region;
+};
+
+/*
+ * The firmware-assisted dump format.
+ *
+ * The register save area is an area in the partition's memory used to preserve
+ * the register contents (CPU state data) for the active CPUs during a firmware
+ * assisted dump. The dump format contains register save area header followed
+ * by register entries. Each list of registers for a CPU starts with "CPUSTRT"
+ * and ends with "CPUEND".
+ */
+
+/* Register save area header. */
+struct rtas_fadump_reg_save_area_header {
+       __be64          magic_number;
+       __be32          version;
+       __be32          num_cpu_offset;
+};
+
+/* Register entry. */
+struct rtas_fadump_reg_entry {
+       __be64          reg_id;
+       __be64          reg_value;
+};
+
+/* Utility macros */
+#define RTAS_FADUMP_SKIP_TO_NEXT_CPU(reg_entry)                                \
+({                                                                     \
+       while (be64_to_cpu(reg_entry->reg_id) !=                        \
+              fadump_str_to_u64("CPUEND"))                             \
+               reg_entry++;                                            \
+       reg_entry++;                                                    \
+})
+
+#define RTAS_FADUMP_CPU_ID_MASK                        ((1UL << 32) - 1)
+
+#endif /* _PSERIES_RTAS_FADUMP_H */