[Skiboot] [PATCH v7 21/22] hdata: Add architected register details to device tree
Michael Neuling
mikey at neuling.org
Thu May 9 14:54:15 AEST 2019
On Sat, 2019-04-13 at 14:45 +0530, Vasant Hegde wrote:
> Post MPIPL FSP/hostboot passes architected register data via HDAT. Add support
> to get architected register data from HDAT and pass it to kernel. Kernel will
> use this data to generate vmcore and opalcore.
>
> Device tree properties under /ibm,opal/dump node:
> cpu-data-version - Architected register data format version
> cpu-data-size - Per CPU register data size
> result-table - Add entry for architected register
> Based on cpu-data-size and result-table, kernel will be
> able to get data for indivisual CPU/register.
Individual
>
> Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
> ---
> hdata/spira.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 48 insertions(+), 2 deletions(-)
>
> diff --git a/hdata/spira.c b/hdata/spira.c
> index 856126844..84a0094f1 100644
> --- a/hdata/spira.c
> +++ b/hdata/spira.c
> @@ -1069,6 +1069,45 @@ static void dt_init_secureboot_node(const struct iplparams_sysparams *sysparams)
> dt_add_property_cells(node, "hw-key-hash-size", hw_key_hash_size);
> }
>
> +/* Map architected register data to result-table */
> +static int opal_dump_add_arch_regs(struct dt_node *dump_node,
> + struct fadump *result_table,
> + int *res_table_cnt)
> +{
> + const struct spira_ntuple *ntuple_proc_dump;
> + const struct proc_dump_area *arch_regs;
> + struct fadump_section *fadump_section;
> +
> + ntuple_proc_dump = &spira.ntuples.proc_dump_area;
> + arch_regs = (void *)ntuple_proc_dump->addr;
> +
> + if (arch_regs->dest_addr == 0 || arch_regs->act_size <= 0) {
> + prlog(PR_DEBUG,
> + "DUMP: Architected register data is missing\n");
> + return OPAL_HARDWARE;
> + }
> +
> + if (arch_regs->thread_size <= 0) {
> + prlog(PR_DEBUG,
> + "DUMP: Invalid architected register thread size\n");
> + return OPAL_HARDWARE;
> + }
> +
> + /* Add each thread size to device tree */
> + dt_add_property_cells(dump_node, "cpu-data-size",
> + cpu_to_be32(arch_regs->thread_size));
> +
> + fadump_section = &(result_table->section[*res_table_cnt]);
> + fadump_section->source_type = DUMP_REGION_CPU_DATA;
> + fadump_section->source_addr = arch_regs->dest_addr & ~(HRMOR_BIT);
> + fadump_section->dest_addr = arch_regs->dest_addr & ~(HRMOR_BIT);
> + fadump_section->source_size = arch_regs->act_size;
> + fadump_section->dest_size = arch_regs->act_size;
> + (*res_table_cnt)++;
Do this increment in the caller based on the errors. It seem to increment a
counter j. I'm not sure what that's doing or why it needs to be incremented at
all.
> +
> + return OPAL_SUCCESS;
> +}
> +
> static void opal_dump_add_result_table(const struct iplparams_iplparams *p)
> {
> int i, j = 0;
> @@ -1109,9 +1148,9 @@ static void opal_dump_add_result_table(const struct iplparams_iplparams *p)
>
> prlog(PR_NOTICE, "DUMP: Dump found, MDRT count = 0x%x\n", mdrt_cnt);
>
> - /* Calculcate property size */
> + /* Number of entries in MDRT table + 1 for arch register data */
> prop_size = sizeof(struct fadump) +
> - (mdrt_cnt * sizeof(struct fadump_section));
> + ((mdrt_cnt + 1) * sizeof(struct fadump_section));
> result_table = zalloc(prop_size);
> if (!result_table) {
> prlog(PR_ERR, "DUMP: Failed to allocate memory\n");
> @@ -1150,6 +1189,9 @@ static void opal_dump_add_result_table(const struct iplparams_iplparams *p)
> return;
> }
>
> + /* Add architected register data to result-table */
> + opal_dump_add_arch_regs(dump_node, result_table, &j);
This function returns errors you are ignoring
> +
> result_table->section_count = cpu_to_be16(j);
> /* Actual property size */
> prop_size = sizeof(struct fadump) + (j * sizeof(struct fadump_section));
> @@ -1175,6 +1217,10 @@ static void add_opal_dump_node(void)
> fw_load_area[2] = cpu_to_be64((u64)INITRAMFS_LOAD_BASE);
> fw_load_area[3] = cpu_to_be64(INITRAMFS_LOAD_SIZE);
> dt_add_property(node, "fw-load-area", fw_load_area, sizeof(fw_load_area));
> +
> + /* Architected register data format version */
> + dt_add_property_cells(node, "cpu-data-version",
> + PROC_DUMP_AREA_FORMAT_P9);
> }
>
> static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
More information about the Skiboot
mailing list