Lines Matching +full:boot +full:- +full:pages
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Firmware-Assisted Dump support on POWER platform (OPAL).
20 #include <asm/fadump-internal.h>
22 #include "opal-fadump.h"
29 * preserving kernel boot is going to process this crash data.
40 if (dn == -FDT_ERR_NOTFOUND) in opal_fadump_dt_scan()
46 prop = of_get_flat_dt_prop(dn, "mpipl-boot", NULL); in opal_fadump_dt_scan()
63 if (be16_to_cpu(opal_fdm_active->registered_regions) == 0) in opal_fadump_dt_scan()
68 pr_err("Failed to get boot memory tag (%lld)\n", ret); in opal_fadump_dt_scan()
77 fadump_conf->boot_mem_top = be64_to_cpu(addr); in opal_fadump_dt_scan()
78 pr_debug("Preserve everything above %llx\n", fadump_conf->boot_mem_top); in opal_fadump_dt_scan()
80 pr_info("Firmware-assisted dump is active.\n"); in opal_fadump_dt_scan()
81 fadump_conf->dump_active = 1; in opal_fadump_dt_scan()
98 pr_debug("Boot memory regions count: %d\n", be16_to_cpu(fdm->region_cnt)); in opal_fadump_update_config()
101 * The destination address of the first boot memory region is the in opal_fadump_update_config()
102 * destination address of boot memory regions. in opal_fadump_update_config()
104 fadump_conf->boot_mem_dest_addr = be64_to_cpu(fdm->rgn[0].dest); in opal_fadump_update_config()
105 pr_debug("Destination address of boot memory regions: %#016llx\n", in opal_fadump_update_config()
106 fadump_conf->boot_mem_dest_addr); in opal_fadump_update_config()
108 fadump_conf->fadumphdr_addr = be64_to_cpu(fdm->fadumphdr_addr); in opal_fadump_update_config()
121 if (!fadump_conf->dump_active) in opal_fadump_get_config()
126 fadump_conf->boot_memory_size = 0; in opal_fadump_get_config()
128 pr_debug("Boot memory regions:\n"); in opal_fadump_get_config()
129 for (i = 0; i < be16_to_cpu(fdm->region_cnt); i++) { in opal_fadump_get_config()
130 base = be64_to_cpu(fdm->rgn[i].src); in opal_fadump_get_config()
131 size = be64_to_cpu(fdm->rgn[i].size); in opal_fadump_get_config()
134 fadump_conf->boot_mem_addr[i] = base; in opal_fadump_get_config()
135 fadump_conf->boot_mem_sz[i] = size; in opal_fadump_get_config()
136 fadump_conf->boot_memory_size += size; in opal_fadump_get_config()
137 hole_size += (base - last_end); in opal_fadump_get_config()
144 * re-registering FADump after dump capture. in opal_fadump_get_config()
146 fadump_conf->reserve_dump_area_start = be64_to_cpu(fdm->rgn[0].dest); in opal_fadump_get_config()
150 * boot memory regions are registered for MPIPL. In such in opal_fadump_get_config()
152 * anyway as that is the best bet considering free pages, cache in opal_fadump_get_config()
153 * pages, user pages, etc are usually filtered out. in opal_fadump_get_config()
155 * Hope the memory that could not be preserved only has pages in opal_fadump_get_config()
158 if (be16_to_cpu(fdm->region_cnt) > be16_to_cpu(fdm->registered_regions)) { in opal_fadump_get_config()
161 i = be16_to_cpu(fdm->registered_regions); in opal_fadump_get_config()
162 while (i < be16_to_cpu(fdm->region_cnt)) { in opal_fadump_get_config()
164 i, be64_to_cpu(fdm->rgn[i].src), in opal_fadump_get_config()
165 be64_to_cpu(fdm->rgn[i].size)); in opal_fadump_get_config()
169 …pr_warn("If the unsaved regions only contain pages that are filtered out (eg. free/user pages), th… in opal_fadump_get_config()
170 pr_warn("WARNING: If the unsaved regions contain kernel pages, the vmcore will be corrupted.\n"); in opal_fadump_get_config()
173 fadump_conf->boot_mem_top = (fadump_conf->boot_memory_size + hole_size); in opal_fadump_get_config()
174 fadump_conf->boot_mem_regs_cnt = be16_to_cpu(fdm->region_cnt); in opal_fadump_get_config()
181 fdm->version = OPAL_FADUMP_VERSION; in opal_fadump_init_metadata()
182 fdm->region_cnt = cpu_to_be16(0); in opal_fadump_init_metadata()
183 fdm->registered_regions = cpu_to_be16(0); in opal_fadump_init_metadata()
184 fdm->fadumphdr_addr = cpu_to_be64(0); in opal_fadump_init_metadata()
189 u64 addr = fadump_conf->reserve_dump_area_start; in opal_fadump_init_mem_struct()
193 opal_fdm = __va(fadump_conf->kernel_metadata); in opal_fadump_init_mem_struct()
196 /* Boot memory regions */ in opal_fadump_init_mem_struct()
197 reg_cnt = be16_to_cpu(opal_fdm->region_cnt); in opal_fadump_init_mem_struct()
198 for (i = 0; i < fadump_conf->boot_mem_regs_cnt; i++) { in opal_fadump_init_mem_struct()
199 opal_fdm->rgn[i].src = cpu_to_be64(fadump_conf->boot_mem_addr[i]); in opal_fadump_init_mem_struct()
200 opal_fdm->rgn[i].dest = cpu_to_be64(addr); in opal_fadump_init_mem_struct()
201 opal_fdm->rgn[i].size = cpu_to_be64(fadump_conf->boot_mem_sz[i]); in opal_fadump_init_mem_struct()
204 addr += fadump_conf->boot_mem_sz[i]; in opal_fadump_init_mem_struct()
206 opal_fdm->region_cnt = cpu_to_be16(reg_cnt); in opal_fadump_init_mem_struct()
212 opal_fdm->fadumphdr_addr = cpu_to_be64(be64_to_cpu(opal_fdm->rgn[0].dest) + in opal_fadump_init_mem_struct()
213 fadump_conf->boot_memory_size); in opal_fadump_init_mem_struct()
234 fadump_conf->kernel_metadata = (fadump_conf->reserve_dump_area_start + in opal_fadump_setup_metadata()
235 fadump_conf->reserve_dump_area_size - in opal_fadump_setup_metadata()
237 pr_info("Kernel metadata addr: %llx\n", fadump_conf->kernel_metadata); in opal_fadump_setup_metadata()
240 opal_fdm = __va(fadump_conf->kernel_metadata); in opal_fadump_setup_metadata()
248 fadump_conf->kernel_metadata); in opal_fadump_setup_metadata()
251 err = -EPERM; in opal_fadump_setup_metadata()
255 * Register boot memory top address with f/w. Should be retrieved in opal_fadump_setup_metadata()
259 fadump_conf->boot_mem_top); in opal_fadump_setup_metadata()
261 pr_err("Failed to set boot memory tag!\n"); in opal_fadump_setup_metadata()
262 err = -EPERM; in opal_fadump_setup_metadata()
277 int i, err = -EIO; in opal_fadump_register()
279 registered_regs = be16_to_cpu(opal_fdm->registered_regions); in opal_fadump_register()
280 for (i = 0; i < be16_to_cpu(opal_fdm->region_cnt); i++) { in opal_fadump_register()
282 be64_to_cpu(opal_fdm->rgn[i].src), in opal_fadump_register()
283 be64_to_cpu(opal_fdm->rgn[i].dest), in opal_fadump_register()
284 be64_to_cpu(opal_fdm->rgn[i].size)); in opal_fadump_register()
290 opal_fdm->registered_regions = cpu_to_be16(registered_regs); in opal_fadump_register()
295 fadump_conf->dump_registered = 1; in opal_fadump_register()
301 (be16_to_cpu(opal_fdm->region_cnt) - in opal_fadump_register()
302 be16_to_cpu(opal_fdm->registered_regions))); in opal_fadump_register()
303 fadump_conf->dump_registered = 1; in opal_fadump_register()
311 fadump_conf->fadump_supported = 0; in opal_fadump_register()
312 fadump_conf->fadump_enabled = 0; in opal_fadump_register()
323 if ((err < 0) && (be16_to_cpu(opal_fdm->registered_regions) > 0)) in opal_fadump_register()
335 pr_err("Failed to un-register - unexpected Error(%lld).\n", rc); in opal_fadump_unregister()
336 return -EIO; in opal_fadump_unregister()
339 opal_fdm->registered_regions = cpu_to_be16(0); in opal_fadump_unregister()
340 fadump_conf->dump_registered = 0; in opal_fadump_unregister()
350 pr_err("Failed to invalidate - unexpected Error(%lld).\n", rc); in opal_fadump_invalidate()
351 return -EIO; in opal_fadump_invalidate()
354 fadump_conf->dump_active = 0; in opal_fadump_invalidate()
377 fadump_conf->cpu_state_data_version = in is_opal_fadump_cpu_data_valid()
378 be32_to_cpu(opal_cpu_metadata->cpu_data_version); in is_opal_fadump_cpu_data_valid()
379 fadump_conf->cpu_state_entry_size = in is_opal_fadump_cpu_data_valid()
380 be32_to_cpu(opal_cpu_metadata->cpu_data_size); in is_opal_fadump_cpu_data_valid()
381 fadump_conf->cpu_state_dest_vaddr = in is_opal_fadump_cpu_data_valid()
382 (u64)__va(be64_to_cpu(opal_cpu_metadata->region[0].dest)); in is_opal_fadump_cpu_data_valid()
383 fadump_conf->cpu_state_data_size = in is_opal_fadump_cpu_data_valid()
384 be64_to_cpu(opal_cpu_metadata->region[0].size); in is_opal_fadump_cpu_data_valid()
386 if (fadump_conf->cpu_state_data_version != HDAT_FADUMP_CPU_DATA_VER) { in is_opal_fadump_cpu_data_valid()
389 fadump_conf->cpu_state_data_version); in is_opal_fadump_cpu_data_valid()
393 if ((fadump_conf->cpu_state_dest_vaddr == 0) || in is_opal_fadump_cpu_data_valid()
394 (fadump_conf->cpu_state_entry_size == 0) || in is_opal_fadump_cpu_data_valid()
395 (fadump_conf->cpu_state_entry_size > in is_opal_fadump_cpu_data_valid()
396 fadump_conf->cpu_state_data_size)) { in is_opal_fadump_cpu_data_valid()
429 size_per_thread = fadump_conf->cpu_state_entry_size; in opal_fadump_build_cpu_notes()
430 num_cpus = (fadump_conf->cpu_state_data_size / size_per_thread); in opal_fadump_build_cpu_notes()
431 bufp = __va(fadump_conf->cpu_state_dest_vaddr); in opal_fadump_build_cpu_notes()
439 note_buf = (u32 *)fadump_conf->cpu_notes_buf_vaddr; in opal_fadump_build_cpu_notes()
450 be32_to_cpu(thdr->offset)); in opal_fadump_build_cpu_notes()
451 reg_esize = be32_to_cpu(thdr->esize); in opal_fadump_build_cpu_notes()
452 regs_cnt = be32_to_cpu(thdr->ecnt); in opal_fadump_build_cpu_notes()
454 pr_debug("--------CPU State Data------------\n"); in opal_fadump_build_cpu_notes()
462 thread_pir = be32_to_cpu(thdr->pir); in opal_fadump_build_cpu_notes()
464 i, thread_pir, thdr->core_state); in opal_fadump_build_cpu_notes()
473 if (fdh->crashing_cpu == thread_pir) { in opal_fadump_build_cpu_notes()
475 &fdh->regs); in opal_fadump_build_cpu_notes()
476 pr_debug("Crashing CPU PIR: 0x%x - R1 : 0x%lx, NIP : 0x%lx\n", in opal_fadump_build_cpu_notes()
477 fdh->crashing_cpu, fdh->regs.gpr[1], in opal_fadump_build_cpu_notes()
478 fdh->regs.nip); in opal_fadump_build_cpu_notes()
488 if (thdr->core_state == HDAT_FADUMP_CORE_INACTIVE) in opal_fadump_build_cpu_notes()
494 pr_debug("CPU PIR: 0x%x - R1 : 0x%lx, NIP : 0x%lx\n", in opal_fadump_build_cpu_notes()
503 if (fadump_conf->cpu_notes_buf_vaddr == (u64)note_buf) { in opal_fadump_build_cpu_notes()
504 if (fdh->crashing_cpu == FADUMP_CPU_UNKNOWN) { in opal_fadump_build_cpu_notes()
506 return -ENODEV; in opal_fadump_build_cpu_notes()
510 note_buf = fadump_regs_to_elf_notes(note_buf, &(fdh->regs)); in opal_fadump_build_cpu_notes()
516 fadump_conf->elfcorehdr_addr); in opal_fadump_build_cpu_notes()
517 fadump_update_elfcore_header((char *)fadump_conf->elfcorehdr_addr); in opal_fadump_build_cpu_notes()
524 int rc = -EINVAL; in opal_fadump_process()
526 if (!opal_fdm_active || !fadump_conf->fadumphdr_addr) in opal_fadump_process()
529 fdh = __va(fadump_conf->fadumphdr_addr); in opal_fadump_process()
539 if (fdh->crashing_cpu != FADUMP_CPU_UNKNOWN) in opal_fadump_process()
553 if (fadump_conf->dump_active) in opal_fadump_region_show()
558 for (i = 0; i < be16_to_cpu(fdm_ptr->region_cnt); i++) { in opal_fadump_region_show()
563 if ((fadump_conf->dump_active) && in opal_fadump_region_show()
564 (i < be16_to_cpu(fdm_ptr->registered_regions))) in opal_fadump_region_show()
565 dumped_bytes = be64_to_cpu(fdm_ptr->rgn[i].size); in opal_fadump_region_show()
568 be64_to_cpu(fdm_ptr->rgn[i].src), in opal_fadump_region_show()
569 be64_to_cpu(fdm_ptr->rgn[i].dest)); in opal_fadump_region_show()
571 be64_to_cpu(fdm_ptr->rgn[i].size), dumped_bytes); in opal_fadump_region_show()
575 if (fadump_conf->dump_active) { in opal_fadump_region_show()
577 fadump_conf->boot_mem_top); in opal_fadump_region_show()
592 fdh->crashing_cpu = (u32)mfspr(SPRN_PIR); in opal_fadump_trigger()
633 * Check if Firmware-Assisted Dump is supported. if yes, check in opal_fadump_dt_scan()
637 if (dn == -FDT_ERR_NOTFOUND) { in opal_fadump_dt_scan()
642 if (!of_flat_dt_is_compatible(dn, "ibm,opal-dump")) { in opal_fadump_dt_scan()
647 prop = of_get_flat_dt_prop(dn, "fw-load-area", &len); in opal_fadump_dt_scan()
660 pr_err("F/W load area: 0x%llx-0x%llx\n", in opal_fadump_dt_scan()
668 fadump_conf->ops = &opal_fadump_ops; in opal_fadump_dt_scan()
669 fadump_conf->fadump_supported = 1; in opal_fadump_dt_scan()
671 fadump_conf->param_area_supported = 0; in opal_fadump_dt_scan()
674 * Firmware supports 32-bit field for size. Align it to PAGE_SIZE in opal_fadump_dt_scan()
675 * and request firmware to copy multiple kernel boot memory regions. in opal_fadump_dt_scan()
677 fadump_conf->max_copy_size = ALIGN_DOWN(U32_MAX, PAGE_SIZE); in opal_fadump_dt_scan()
682 prop = of_get_flat_dt_prop(dn, "mpipl-boot", NULL); in opal_fadump_dt_scan()
696 if (opal_fdm_active->version != OPAL_FADUMP_VERSION) { in opal_fadump_dt_scan()
698 OPAL_FADUMP_VERSION, opal_fdm_active->version); in opal_fadump_dt_scan()
703 if (be16_to_cpu(opal_fdm_active->registered_regions) == 0) { in opal_fadump_dt_scan()
715 pr_info("Firmware-assisted dump is active.\n"); in opal_fadump_dt_scan()
716 fadump_conf->dump_active = 1; in opal_fadump_dt_scan()