Lines Matching +full:os +full:- +full:initiated
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Firmware-Assisted Dump support on POWERVM platform.
23 #include <asm/fadump-internal.h>
25 #include "rtas-fadump.h"
33 fadump_conf->fadumphdr_addr = (fadump_conf->boot_mem_dest_addr + in rtas_fadump_update_config()
34 fadump_conf->boot_memory_size); in rtas_fadump_update_config()
48 fadump_conf->boot_memory_size = 0; in rtas_fadump_get_config()
49 fadump_conf->boot_mem_regs_cnt = 0; in rtas_fadump_get_config()
51 for (int i = 0; i < be16_to_cpu(fdm->header.dump_num_sections); i++) { in rtas_fadump_get_config()
52 int type = be16_to_cpu(fdm->rgn[i].source_data_type); in rtas_fadump_get_config()
57 addr = be64_to_cpu(fdm->rgn[i].destination_address); in rtas_fadump_get_config()
59 fadump_conf->cpu_state_dest_vaddr = (u64)__va(addr); in rtas_fadump_get_config()
62 * re-registering FADump after dump capture. in rtas_fadump_get_config()
64 fadump_conf->reserve_dump_area_start = addr; in rtas_fadump_get_config()
70 base = be64_to_cpu(fdm->rgn[i].source_address); in rtas_fadump_get_config()
71 size = be64_to_cpu(fdm->rgn[i].source_len); in rtas_fadump_get_config()
74 fadump_conf->boot_mem_dest_addr = in rtas_fadump_get_config()
75 be64_to_cpu(fdm->rgn[i].destination_address); in rtas_fadump_get_config()
78 fadump_conf->boot_mem_addr[fadump_conf->boot_mem_regs_cnt] = base; in rtas_fadump_get_config()
79 fadump_conf->boot_mem_sz[fadump_conf->boot_mem_regs_cnt] = size; in rtas_fadump_get_config()
80 fadump_conf->boot_memory_size += size; in rtas_fadump_get_config()
81 hole_size += (base - last_end); in rtas_fadump_get_config()
83 fadump_conf->boot_mem_regs_cnt++; in rtas_fadump_get_config()
86 fadump_conf->param_area = be64_to_cpu(fdm->rgn[i].destination_address); in rtas_fadump_get_config()
93 fadump_conf->boot_mem_top = fadump_conf->boot_memory_size + hole_size; in rtas_fadump_get_config()
100 u64 addr = fadump_conf->reserve_dump_area_start; in rtas_fadump_init_mem_struct()
120 /* set 0 to disable an automatic dump-reboot. */ in rtas_fadump_init_mem_struct()
128 fdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->cpu_state_data_size); in rtas_fadump_init_mem_struct()
130 addr += fadump_conf->cpu_state_data_size; in rtas_fadump_init_mem_struct()
137 fdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->hpte_region_size); in rtas_fadump_init_mem_struct()
139 addr += fadump_conf->hpte_region_size; in rtas_fadump_init_mem_struct()
149 fadump_conf->boot_mem_dest_addr = addr; in rtas_fadump_init_mem_struct()
150 for (int i = 0; i < fadump_conf->boot_mem_regs_cnt; i++) { in rtas_fadump_init_mem_struct()
154 fdm.rgn[sec_cnt].source_address = cpu_to_be64(fadump_conf->boot_mem_addr[i]); in rtas_fadump_init_mem_struct()
155 fdm.rgn[sec_cnt].source_len = cpu_to_be64(fadump_conf->boot_mem_sz[i]); in rtas_fadump_init_mem_struct()
157 addr += fadump_conf->boot_mem_sz[i]; in rtas_fadump_init_mem_struct()
162 if (fadump_conf->param_area) { in rtas_fadump_init_mem_struct()
165 fdm.rgn[sec_cnt].source_address = cpu_to_be64(fadump_conf->param_area); in rtas_fadump_init_mem_struct()
167 fdm.rgn[sec_cnt].destination_address = cpu_to_be64(fadump_conf->param_area); in rtas_fadump_init_mem_struct()
185 int rc, err = -EIO; in rtas_fadump_register()
190 * could result in a parameter error (-3) from the platform. in rtas_fadump_register()
197 rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, in rtas_fadump_register()
209 fadump_conf->dump_registered = 1; in rtas_fadump_register()
212 case -1: in rtas_fadump_register()
215 case -3: in rtas_fadump_register()
220 err = -EINVAL; in rtas_fadump_register()
222 case -9: in rtas_fadump_register()
224 fadump_conf->dump_registered = 1; in rtas_fadump_register()
225 err = -EEXIST; in rtas_fadump_register()
242 rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, in rtas_fadump_unregister()
252 pr_err("Failed to un-register - unexpected error(%d).\n", rc); in rtas_fadump_unregister()
253 return -EIO; in rtas_fadump_unregister()
256 fadump_conf->dump_registered = 0; in rtas_fadump_unregister()
267 rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, in rtas_fadump_invalidate()
277 pr_err("Failed to invalidate - unexpected error (%d).\n", rc); in rtas_fadump_invalidate()
278 return -EIO; in rtas_fadump_invalidate()
281 fadump_conf->dump_active = 0; in rtas_fadump_invalidate()
290 int i = -1; in rtas_fadump_gpr_index()
300 i = -EINVAL; in rtas_fadump_gpr_index()
302 i = -1; in rtas_fadump_gpr_index()
313 regs->gpr[i] = (unsigned long)reg_val; in rtas_fadump_set_regval()
315 regs->nip = (unsigned long)reg_val; in rtas_fadump_set_regval()
317 regs->msr = (unsigned long)reg_val; in rtas_fadump_set_regval()
319 regs->ctr = (unsigned long)reg_val; in rtas_fadump_set_regval()
321 regs->link = (unsigned long)reg_val; in rtas_fadump_set_regval()
323 regs->xer = (unsigned long)reg_val; in rtas_fadump_set_regval()
325 regs->ccr = (unsigned long)reg_val; in rtas_fadump_set_regval()
327 regs->dar = (unsigned long)reg_val; in rtas_fadump_set_regval()
329 regs->dsisr = (unsigned long)reg_val; in rtas_fadump_set_regval()
338 while (be64_to_cpu(reg_entry->reg_id) != fadump_str_to_u64("CPUEND")) { in rtas_fadump_read_regs()
339 rtas_fadump_set_regval(regs, be64_to_cpu(reg_entry->reg_id), in rtas_fadump_read_regs()
340 be64_to_cpu(reg_entry->reg_value)); in rtas_fadump_read_regs()
371 vaddr = (void *)fadump_conf->cpu_state_dest_vaddr; in rtas_fadump_build_cpu_notes()
374 if (be64_to_cpu(reg_header->magic_number) != in rtas_fadump_build_cpu_notes()
377 return -ENOENT; in rtas_fadump_build_cpu_notes()
380 pr_debug("--------CPU State Data------------\n"); in rtas_fadump_build_cpu_notes()
381 pr_debug("Magic Number: %llx\n", be64_to_cpu(reg_header->magic_number)); in rtas_fadump_build_cpu_notes()
382 pr_debug("NumCpuOffset: %x\n", be32_to_cpu(reg_header->num_cpu_offset)); in rtas_fadump_build_cpu_notes()
384 vaddr += be32_to_cpu(reg_header->num_cpu_offset); in rtas_fadump_build_cpu_notes()
394 note_buf = (u32 *)fadump_conf->cpu_notes_buf_vaddr; in rtas_fadump_build_cpu_notes()
396 if (fadump_conf->fadumphdr_addr) in rtas_fadump_build_cpu_notes()
397 fdh = __va(fadump_conf->fadumphdr_addr); in rtas_fadump_build_cpu_notes()
400 if (be64_to_cpu(reg_entry->reg_id) != in rtas_fadump_build_cpu_notes()
403 rc = -ENOENT; in rtas_fadump_build_cpu_notes()
407 cpu = (be64_to_cpu(reg_entry->reg_value) & in rtas_fadump_build_cpu_notes()
409 if (fdh && !cpumask_test_cpu(cpu, &fdh->cpu_mask)) { in rtas_fadump_build_cpu_notes()
414 if (fdh && fdh->crashing_cpu == cpu) { in rtas_fadump_build_cpu_notes()
415 regs = fdh->regs; in rtas_fadump_build_cpu_notes()
426 pr_debug("Updating elfcore header (%llx) with cpu notes\n", fadump_conf->elfcorehdr_addr); in rtas_fadump_build_cpu_notes()
427 fadump_update_elfcore_header((char *)fadump_conf->elfcorehdr_addr); in rtas_fadump_build_cpu_notes()
442 if (!fdm_active || !fadump_conf->fadumphdr_addr) in rtas_fadump_process()
443 return -EINVAL; in rtas_fadump_process()
446 for (int i = 0; i < be16_to_cpu(fdm_active->header.dump_num_sections); i++) { in rtas_fadump_process()
447 int type = be16_to_cpu(fdm_active->rgn[i].source_data_type); in rtas_fadump_process()
454 if (fdm_active->rgn[i].error_flags != 0) { in rtas_fadump_process()
456 rc = -EINVAL; in rtas_fadump_process()
458 if (fdm_active->rgn[i].bytes_dumped != fdm_active->rgn[i].source_len) { in rtas_fadump_process()
460 rc = -EINVAL; in rtas_fadump_process()
464 be16_to_cpu(fdm_active->rgn[i].source_data_type), in rtas_fadump_process()
465 be64_to_cpu(fdm_active->rgn[i].source_address), in rtas_fadump_process()
466 be64_to_cpu(fdm_active->rgn[i].destination_address)); in rtas_fadump_process()
471 if (fdm_active->rgn[i].bytes_dumped != fdm_active->rgn[i].source_len || in rtas_fadump_process()
472 fdm_active->rgn[i].error_flags != 0) { in rtas_fadump_process()
474 fadump_conf->param_area = 0; in rtas_fadump_process()
484 be16_to_cpu(fdm_active->rgn[i].source_data_type), in rtas_fadump_process()
485 be64_to_cpu(fdm_active->rgn[i].source_address), in rtas_fadump_process()
486 be64_to_cpu(fdm_active->rgn[i].destination_address)); in rtas_fadump_process()
505 for (int i = 0; i < be16_to_cpu(fdm_ptr->header.dump_num_sections); i++) { in rtas_fadump_region_show()
506 int type = be16_to_cpu(fdm_ptr->rgn[i].source_data_type); in rtas_fadump_region_show()
510 seq_printf(m, "CPU :[%#016llx-%#016llx] %#llx bytes, Dumped: %#llx\n", in rtas_fadump_region_show()
511 be64_to_cpu(fdm_ptr->rgn[i].destination_address), in rtas_fadump_region_show()
512 be64_to_cpu(fdm_ptr->rgn[i].destination_address) + in rtas_fadump_region_show()
513 be64_to_cpu(fdm_ptr->rgn[i].source_len) - 1, in rtas_fadump_region_show()
514 be64_to_cpu(fdm_ptr->rgn[i].source_len), in rtas_fadump_region_show()
515 be64_to_cpu(fdm_ptr->rgn[i].bytes_dumped)); in rtas_fadump_region_show()
518 seq_printf(m, "HPTE:[%#016llx-%#016llx] %#llx bytes, Dumped: %#llx\n", in rtas_fadump_region_show()
519 be64_to_cpu(fdm_ptr->rgn[i].destination_address), in rtas_fadump_region_show()
520 be64_to_cpu(fdm_ptr->rgn[i].destination_address) + in rtas_fadump_region_show()
521 be64_to_cpu(fdm_ptr->rgn[i].source_len) - 1, in rtas_fadump_region_show()
522 be64_to_cpu(fdm_ptr->rgn[i].source_len), in rtas_fadump_region_show()
523 be64_to_cpu(fdm_ptr->rgn[i].bytes_dumped)); in rtas_fadump_region_show()
527 be64_to_cpu(fdm_ptr->rgn[i].source_address), in rtas_fadump_region_show()
528 be64_to_cpu(fdm_ptr->rgn[i].destination_address)); in rtas_fadump_region_show()
530 be64_to_cpu(fdm_ptr->rgn[i].source_len), in rtas_fadump_region_show()
531 be64_to_cpu(fdm_ptr->rgn[i].bytes_dumped)); in rtas_fadump_region_show()
534 seq_printf(m, "\n[%#016llx-%#016llx]: cmdline append: '%s'\n", in rtas_fadump_region_show()
535 be64_to_cpu(fdm_ptr->rgn[i].destination_address), in rtas_fadump_region_show()
536 be64_to_cpu(fdm_ptr->rgn[i].destination_address) + in rtas_fadump_region_show()
537 be64_to_cpu(fdm_ptr->rgn[i].source_len) - 1, in rtas_fadump_region_show()
538 (char *)__va(be64_to_cpu(fdm_ptr->rgn[i].destination_address))); in rtas_fadump_region_show()
542 type, be64_to_cpu(fdm_ptr->rgn[i].source_address), in rtas_fadump_region_show()
543 be64_to_cpu(fdm_ptr->rgn[i].destination_address)); in rtas_fadump_region_show()
551 fadump_conf->boot_mem_top); in rtas_fadump_region_show()
558 /* Call ibm,os-term rtas call to trigger firmware assisted dump */ in rtas_fadump_trigger()
596 * if dump has been initiated on last reboot. in rtas_fadump_dt_scan()
598 token = of_get_flat_dt_prop(node, "ibm,configure-kernel-dump", NULL); in rtas_fadump_dt_scan()
602 fadump_conf->ibm_configure_kernel_dump = be32_to_cpu(*token); in rtas_fadump_dt_scan()
603 fadump_conf->ops = &rtas_fadump_ops; in rtas_fadump_dt_scan()
604 fadump_conf->fadump_supported = 1; in rtas_fadump_dt_scan()
605 fadump_conf->param_area_supported = 1; in rtas_fadump_dt_scan()
607 /* Firmware supports 64-bit value for size, align it to pagesize. */ in rtas_fadump_dt_scan()
608 fadump_conf->max_copy_size = ALIGN_DOWN(U64_MAX, PAGE_SIZE); in rtas_fadump_dt_scan()
611 * The 'ibm,kernel-dump' rtas node is present only if there is in rtas_fadump_dt_scan()
614 fdm_active = of_get_flat_dt_prop(node, "ibm,kernel-dump", NULL); in rtas_fadump_dt_scan()
616 pr_info("Firmware-assisted dump is active.\n"); in rtas_fadump_dt_scan()
617 fadump_conf->dump_active = 1; in rtas_fadump_dt_scan()
627 sections = of_get_flat_dt_prop(node, "ibm,configure-kernel-dump-sizes", in rtas_fadump_dt_scan()
640 fadump_conf->cpu_state_data_size = in rtas_fadump_dt_scan()
644 fadump_conf->hpte_region_size = in rtas_fadump_dt_scan()