linux/arch/powerpc/include/asm/fadump-internal.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Firmware-Assisted Dump internal code.
   4 *
   5 * Copyright 2011, Mahesh Salgaonkar, IBM Corporation.
   6 * Copyright 2019, Hari Bathini, IBM Corporation.
   7 */
   8
   9#ifndef _ASM_POWERPC_FADUMP_INTERNAL_H
  10#define _ASM_POWERPC_FADUMP_INTERNAL_H
  11
  12/* Maximum number of memory regions kernel supports */
  13#define FADUMP_MAX_MEM_REGS                     128
  14
  15#ifndef CONFIG_PRESERVE_FA_DUMP
  16
  17/* The upper limit percentage for user specified boot memory size (25%) */
  18#define MAX_BOOT_MEM_RATIO                      4
  19
  20#define memblock_num_regions(memblock_type)     (memblock.memblock_type.cnt)
  21
  22/* Alignment per CMA requirement. */
  23#define FADUMP_CMA_ALIGNMENT    (PAGE_SIZE <<                           \
  24                                 max_t(unsigned long, MAX_ORDER - 1,    \
  25                                 pageblock_order))
  26
  27/* FAD commands */
  28#define FADUMP_REGISTER                 1
  29#define FADUMP_UNREGISTER               2
  30#define FADUMP_INVALIDATE               3
  31
  32/*
  33 * Copy the ascii values for first 8 characters from a string into u64
  34 * variable at their respective indexes.
  35 * e.g.
  36 *  The string "FADMPINF" will be converted into 0x4641444d50494e46
  37 */
  38static inline u64 fadump_str_to_u64(const char *str)
  39{
  40        u64 val = 0;
  41        int i;
  42
  43        for (i = 0; i < sizeof(val); i++)
  44                val = (*str) ? (val << 8) | *str++ : val << 8;
  45        return val;
  46}
  47
  48#define FADUMP_CPU_UNKNOWN              (~((u32)0))
  49
  50#define FADUMP_CRASH_INFO_MAGIC         fadump_str_to_u64("FADMPINF")
  51
  52/* fadump crash info structure */
  53struct fadump_crash_info_header {
  54        u64             magic_number;
  55        u64             elfcorehdr_addr;
  56        u32             crashing_cpu;
  57        struct pt_regs  regs;
  58        struct cpumask  online_mask;
  59};
  60
  61struct fadump_memory_range {
  62        u64     base;
  63        u64     size;
  64};
  65
  66/* fadump memory ranges info */
  67#define RNG_NAME_SZ                     16
  68struct fadump_mrange_info {
  69        char                            name[RNG_NAME_SZ];
  70        struct fadump_memory_range      *mem_ranges;
  71        u32                             mem_ranges_sz;
  72        u32                             mem_range_cnt;
  73        u32                             max_mem_ranges;
  74        bool                            is_static;
  75};
  76
  77/* Platform specific callback functions */
  78struct fadump_ops;
  79
  80/* Firmware-assisted dump configuration details. */
  81struct fw_dump {
  82        unsigned long   reserve_dump_area_start;
  83        unsigned long   reserve_dump_area_size;
  84        /* cmd line option during boot */
  85        unsigned long   reserve_bootvar;
  86
  87        unsigned long   cpu_state_data_size;
  88        u64             cpu_state_dest_vaddr;
  89        u32             cpu_state_data_version;
  90        u32             cpu_state_entry_size;
  91
  92        unsigned long   hpte_region_size;
  93
  94        unsigned long   boot_memory_size;
  95        u64             boot_mem_dest_addr;
  96        u64             boot_mem_addr[FADUMP_MAX_MEM_REGS];
  97        u64             boot_mem_sz[FADUMP_MAX_MEM_REGS];
  98        u64             boot_mem_top;
  99        u64             boot_mem_regs_cnt;
 100
 101        unsigned long   fadumphdr_addr;
 102        unsigned long   cpu_notes_buf_vaddr;
 103        unsigned long   cpu_notes_buf_size;
 104
 105        /*
 106         * Maximum size supported by firmware to copy from source to
 107         * destination address per entry.
 108         */
 109        u64             max_copy_size;
 110        u64             kernel_metadata;
 111
 112        int             ibm_configure_kernel_dump;
 113
 114        unsigned long   fadump_enabled:1;
 115        unsigned long   fadump_supported:1;
 116        unsigned long   dump_active:1;
 117        unsigned long   dump_registered:1;
 118        unsigned long   nocma:1;
 119
 120        struct fadump_ops       *ops;
 121};
 122
 123struct fadump_ops {
 124        u64     (*fadump_init_mem_struct)(struct fw_dump *fadump_conf);
 125        u64     (*fadump_get_metadata_size)(void);
 126        int     (*fadump_setup_metadata)(struct fw_dump *fadump_conf);
 127        u64     (*fadump_get_bootmem_min)(void);
 128        int     (*fadump_register)(struct fw_dump *fadump_conf);
 129        int     (*fadump_unregister)(struct fw_dump *fadump_conf);
 130        int     (*fadump_invalidate)(struct fw_dump *fadump_conf);
 131        void    (*fadump_cleanup)(struct fw_dump *fadump_conf);
 132        int     (*fadump_process)(struct fw_dump *fadump_conf);
 133        void    (*fadump_region_show)(struct fw_dump *fadump_conf,
 134                                      struct seq_file *m);
 135        void    (*fadump_trigger)(struct fadump_crash_info_header *fdh,
 136                                  const char *msg);
 137};
 138
 139/* Helper functions */
 140s32 fadump_setup_cpu_notes_buf(u32 num_cpus);
 141void fadump_free_cpu_notes_buf(void);
 142u32 *fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs);
 143void fadump_update_elfcore_header(char *bufp);
 144bool is_fadump_boot_mem_contiguous(void);
 145bool is_fadump_reserved_mem_contiguous(void);
 146
 147#else /* !CONFIG_PRESERVE_FA_DUMP */
 148
 149/* Firmware-assisted dump configuration details. */
 150struct fw_dump {
 151        u64     boot_mem_top;
 152        u64     dump_active;
 153};
 154
 155#endif /* CONFIG_PRESERVE_FA_DUMP */
 156
 157#ifdef CONFIG_PPC_PSERIES
 158extern void rtas_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node);
 159#else
 160static inline void
 161rtas_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) { }
 162#endif
 163
 164#ifdef CONFIG_PPC_POWERNV
 165extern void opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node);
 166#else
 167static inline void
 168opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) { }
 169#endif
 170
 171#endif /* _ASM_POWERPC_FADUMP_INTERNAL_H */
 172