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


Reply via email to