Move the GHESv2 acknowledgment and error-source allocation helpers from ghes.c into ghes_cper.c. This is a mechanical refactor that keeps the logic unchanged while making the helpers reusable.
Reviewed-by: Jonathan Cameron <[email protected]> Signed-off-by: Ahmed Tiba <[email protected]> --- drivers/acpi/apei/ghes.c | 65 ------------------------------------------- drivers/acpi/apei/ghes_cper.c | 65 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index f74fd5de34cc..bda535224422 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -163,71 +163,6 @@ void ghes_estatus_pool_region_free(unsigned long addr, u32 size) } EXPORT_SYMBOL_GPL(ghes_estatus_pool_region_free); -static int map_gen_v2(struct ghes *ghes) -{ - return apei_map_generic_address(&ghes->generic_v2->read_ack_register); -} - -static void unmap_gen_v2(struct ghes *ghes) -{ - apei_unmap_generic_address(&ghes->generic_v2->read_ack_register); -} - -struct ghes *ghes_new(struct acpi_hest_generic *generic) -{ - struct ghes *ghes; - unsigned int error_block_length; - int rc; - - ghes = kzalloc_obj(*ghes); - if (!ghes) - return ERR_PTR(-ENOMEM); - - ghes->generic = generic; - if (is_hest_type_generic_v2(ghes)) { - rc = map_gen_v2(ghes); - if (rc) - goto err_free; - } - - rc = apei_map_generic_address(&generic->error_status_address); - if (rc) - goto err_unmap_read_ack_addr; - error_block_length = generic->error_block_length; - if (error_block_length > GHES_ESTATUS_MAX_SIZE) { - pr_warn(FW_WARN GHES_PFX - "Error status block length is too long: %u for " - "generic hardware error source: %d.\n", - error_block_length, generic->header.source_id); - error_block_length = GHES_ESTATUS_MAX_SIZE; - } - ghes->estatus = kmalloc(error_block_length, GFP_KERNEL); - ghes->estatus_length = error_block_length; - if (!ghes->estatus) { - rc = -ENOMEM; - goto err_unmap_status_addr; - } - - return ghes; - -err_unmap_status_addr: - apei_unmap_generic_address(&generic->error_status_address); -err_unmap_read_ack_addr: - if (is_hest_type_generic_v2(ghes)) - unmap_gen_v2(ghes); -err_free: - kfree(ghes); - return ERR_PTR(rc); -} - -void ghes_fini(struct ghes *ghes) -{ - kfree(ghes->estatus); - apei_unmap_generic_address(&ghes->generic->error_status_address); - if (is_hest_type_generic_v2(ghes)) - unmap_gen_v2(ghes); -} - static inline int ghes_severity(int severity) { switch (severity) { diff --git a/drivers/acpi/apei/ghes_cper.c b/drivers/acpi/apei/ghes_cper.c index 0c3f52b2d7f1..9c668725e08a 100644 --- a/drivers/acpi/apei/ghes_cper.c +++ b/drivers/acpi/apei/ghes_cper.c @@ -63,6 +63,71 @@ static void ghes_ack_error(struct acpi_hest_generic_v2 *gv2) apei_write(val, &gv2->read_ack_register); } +static int map_gen_v2(struct ghes *ghes) +{ + return apei_map_generic_address(&ghes->generic_v2->read_ack_register); +} + +static void unmap_gen_v2(struct ghes *ghes) +{ + apei_unmap_generic_address(&ghes->generic_v2->read_ack_register); +} + +struct ghes *ghes_new(struct acpi_hest_generic *generic) +{ + struct ghes *ghes; + unsigned int error_block_length; + int rc; + + ghes = kzalloc_obj(*ghes); + if (!ghes) + return ERR_PTR(-ENOMEM); + + ghes->generic = generic; + if (is_hest_type_generic_v2(ghes)) { + rc = map_gen_v2(ghes); + if (rc) + goto err_free; + } + + rc = apei_map_generic_address(&generic->error_status_address); + if (rc) + goto err_unmap_read_ack_addr; + error_block_length = generic->error_block_length; + if (error_block_length > GHES_ESTATUS_MAX_SIZE) { + pr_warn(FW_WARN GHES_PFX + "Error status block length is too long: %u for " + "generic hardware error source: %d.\n", + error_block_length, generic->header.source_id); + error_block_length = GHES_ESTATUS_MAX_SIZE; + } + ghes->estatus = kmalloc(error_block_length, GFP_KERNEL); + ghes->estatus_length = error_block_length; + if (!ghes->estatus) { + rc = -ENOMEM; + goto err_unmap_status_addr; + } + + return ghes; + +err_unmap_status_addr: + apei_unmap_generic_address(&generic->error_status_address); +err_unmap_read_ack_addr: + if (is_hest_type_generic_v2(ghes)) + unmap_gen_v2(ghes); +err_free: + kfree(ghes); + return ERR_PTR(rc); +} + +void ghes_fini(struct ghes *ghes) +{ + kfree(ghes->estatus); + apei_unmap_generic_address(&ghes->generic->error_status_address); + if (is_hest_type_generic_v2(ghes)) + unmap_gen_v2(ghes); +} + static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len, int from_phys, enum fixed_addresses fixmap_idx) -- 2.43.0
