[PATCH v2 04/11] ACPI: APEI: GHES: move GHESv2 ack and alloc helpers
From: Ahmed Tiba <hidden>
Date: 2026-02-20 13:43:00
Also in:
linux-acpi, linux-devicetree, linux-doc
Subsystem:
acpi, acpi apei, the rest · Maintainers:
"Rafael J. Wysocki", Linus Torvalds
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. Signed-off-by: Ahmed Tiba <redacted> --- 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 b159dbee90ac..d562c98bff19 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(sizeof(*ghes), GFP_KERNEL); - 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 7e0015e960c1..974d5f032799 100644
--- a/drivers/acpi/apei/ghes_cper.c
+++ b/drivers/acpi/apei/ghes_cper.c@@ -59,6 +59,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(sizeof(*ghes), GFP_KERNEL); + 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