From nobody Sat Nov 23 19:35:19 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8612518A6D7 for ; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; cv=none; b=JmWuhmmHWYpLH+xaZ48BBmAqmvSwVxpBd8uYaHJjsPvMjuFDBzQB/UMHR9YOw3TynGf8ukItMEXZ1mfHIRbMmY90ZB3fXqxBjApvPBeAp9QZGm0w1tPXslTBI5q66VJUyjD4sVd7wV8Zo7+Y7cE6g44prQ89BgEO2eclvjNiQjk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; c=relaxed/simple; bh=iYqmM8v4SY8PhF7Q4dFS3Q5bFkEFL90wD/jM7X2IIRs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ci4l2RH0MT3xwZdMl78WFV+4iEpq2RKrwcLGOk0gwUiiaBomfHJy8U3iPXIHV9ivpUb4ZaTus/diwNuyeG5aDIO/MgtPdNx4X9VoKkBEoMyMVJegBgL//FhiLEzMBhgP51wfU+ZUiXBWAv1aJ2Y0UIy4FBz5EkCOGDWSRGKoJcM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BNaPcyyM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BNaPcyyM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09722C4CED0; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1731487058; bh=iYqmM8v4SY8PhF7Q4dFS3Q5bFkEFL90wD/jM7X2IIRs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BNaPcyyMWzqq9L5Yfo3QOgu+BnqZCPwoIX5TCblY1FjMlpUJaUGXFCeo0cjQVrFCa VA1dKcFFBk9oR2/LnjD6v6YoSXmYkXi+utOdBqblXp3P4hw6BrfzvkpoqqTOUtMy8z pgOTcVtmbIijafm54jYgjzOM+67z5gjwL3wTuyZFqqfK8eKxXNvn/g8hq+aVnUbK88 +oTKYXpMGn9G3yTCjsqIRFjhL49pIC29rYs57CFgMpyNNtiKaXcxDl/1Wzwtvg/EmB tZZJZiGswoildLMVT4Gr8I0tHfFPu9hRxdp/3gnF1WgbuShSNwHW8qgqoTGGI5BuPU bd4/2wgzhBLFw== Received: from mchehab by mail.kernel.org with local (Exim 4.98) (envelope-from ) id 1tB8sZ-00000001Kw1-3GwP; Wed, 13 Nov 2024 09:37:35 +0100 From: Mauro Carvalho Chehab To: Igor Mammedov Cc: Jonathan Cameron , Shiju Jose , Mauro Carvalho Chehab , "Michael S. Tsirkin" , Ani Sinha , Dongjiu Geng , Peter Maydell , Shannon Zhao , linux-kernel@vger.kernel.org, qemu-arm@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH 1/6] acpi/ghes: Prepare to support multiple sources on ghes Date: Wed, 13 Nov 2024 09:36:58 +0100 Message-ID: <3f6b7e8499bf5911de9b1533e4b2a4addc207536.1731486604.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.47.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: Mauro Carvalho Chehab Content-Type: text/plain; charset="utf-8" The current code is actually dependent on having just one error structure with a single source. As the number of sources should be arch-dependent, as it will depend on what kind of synchronous/assynchronous notifications will exist, change the logic to dynamically build the table. Yet, for a proper support, we need to get the number of sources by reading the number from the HEST table. However, bios currently doesn't store a pointer to it. For now just change the logic at table build time, while enforcing that it will behave like before with a single source ID. A future patch will add a HEST table bios pointer and change the logic at acpi_ghes_record_errors() to dynamically use the new size. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- hw/acpi/ghes.c | 43 ++++++++++++++++++++++++++-------------- hw/arm/virt-acpi-build.c | 5 +++++ include/hw/acpi/ghes.h | 21 +++++++++++++------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index e7de3b302602..a590b0f6f85f 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -212,17 +212,26 @@ ghes_gen_err_data_uncorrectable_recoverable(GArray *b= lock, * Initialize "etc/hardware_errors" and "etc/hardware_errors_addr" fw_cfg = blobs. * See docs/specs/acpi_hest_ghes.rst for blobs format. */ -static void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *li= nker) +static void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *li= nker, + int num_sources) { int i, error_status_block_offset; =20 + /* + * TODO: Current version supports only one source. + * A further patch will drop this check, after adding a proper migrati= on + * code, as, for the code to work, we need to store a bios pointer to = the + * HEST table. + */ + assert(num_sources =3D=3D 1); + /* Build error_block_address */ - for (i =3D 0; i < ACPI_GHES_ERROR_SOURCE_COUNT; i++) { + for (i =3D 0; i < num_sources; i++) { build_append_int_noprefix(hardware_errors, 0, sizeof(uint64_t)); } =20 /* Build read_ack_register */ - for (i =3D 0; i < ACPI_GHES_ERROR_SOURCE_COUNT; i++) { + for (i =3D 0; i < num_sources; i++) { /* * Initialize the value of read_ack_register to 1, so GHES can be * writable after (re)boot. @@ -237,13 +246,13 @@ static void build_ghes_error_table(GArray *hardware_e= rrors, BIOSLinker *linker) =20 /* Reserve space for Error Status Data Block */ acpi_data_push(hardware_errors, - ACPI_GHES_MAX_RAW_DATA_LENGTH * ACPI_GHES_ERROR_SOURCE_COUNT); + ACPI_GHES_MAX_RAW_DATA_LENGTH * num_sources); =20 /* Tell guest firmware to place hardware_errors blob into RAM */ bios_linker_loader_alloc(linker, ACPI_HW_ERROR_FW_CFG_FILE, hardware_errors, sizeof(uint64_t), false); =20 - for (i =3D 0; i < ACPI_GHES_ERROR_SOURCE_COUNT; i++) { + for (i =3D 0; i < num_sources; i++) { /* * Tell firmware to patch error_block_address entries to point to * corresponding "Generic Error Status Block" @@ -269,10 +278,12 @@ static void build_ghes_error_table(GArray *hardware_e= rrors, BIOSLinker *linker) /* Build Generic Hardware Error Source version 2 (GHESv2) */ static void build_ghes_v2(GArray *table_data, BIOSLinker *linker, - enum AcpiGhesNotifyType notify, - uint16_t source_id) + const AcpiNotificationSourceId *notif_src, + uint16_t index, int num_sources) { uint64_t address_offset; + const uint16_t notify =3D notif_src->notify; + const uint16_t source_id =3D notif_src->source_id; =20 /* * Type: @@ -303,7 +314,7 @@ static void build_ghes_v2(GArray *table_data, address_offset + GAS_ADDR_OFFSET, sizeof(uint64_t), ACPI_HW_ERROR_FW_CFG_FILE, - source_id * sizeof(uint64_t)); + index * sizeof(uint64_t)); =20 /* Notification Structure */ build_ghes_hw_error_notification(table_data, notify); @@ -323,8 +334,7 @@ static void build_ghes_v2(GArray *table_data, address_offset + GAS_ADDR_OFFSET, sizeof(uint64_t), ACPI_HW_ERROR_FW_CFG_FILE, - (ACPI_GHES_ERROR_SOURCE_COUNT + source_= id) - * sizeof(uint64_t)); + (num_sources + index) * sizeof(uint64_t= )); =20 /* * Read Ack Preserve field @@ -339,19 +349,23 @@ static void build_ghes_v2(GArray *table_data, /* Build Hardware Error Source Table */ void acpi_build_hest(GArray *table_data, GArray *hardware_errors, BIOSLinker *linker, + const AcpiNotificationSourceId * const notif_source, + int num_sources, const char *oem_id, const char *oem_table_id) { AcpiTable table =3D { .sig =3D "HEST", .rev =3D 1, .oem_id =3D oem_id, .oem_table_id =3D oem_table_id= }; + int i; =20 - build_ghes_error_table(hardware_errors, linker); + build_ghes_error_table(hardware_errors, linker, num_sources); =20 acpi_table_begin(&table, table_data); =20 /* Error Source Count */ - build_append_int_noprefix(table_data, ACPI_GHES_ERROR_SOURCE_COUNT, 4); - build_ghes_v2(table_data, linker, - ACPI_GHES_NOTIFY_SEA, ACPI_HEST_SRC_ID_SEA); + build_append_int_noprefix(table_data, num_sources, 4); + for (i =3D 0; i < num_sources; i++) { + build_ghes_v2(table_data, linker, ¬if_source[i], i, num_sources= ); + } =20 acpi_table_end(linker, &table); } @@ -416,7 +430,6 @@ void ghes_record_cper_errors(const void *cper, size_t l= en, } ags =3D &acpi_ged_state->ghes_state; =20 - assert(ACPI_GHES_ERROR_SOURCE_COUNT =3D=3D 1); get_ghes_offsets(le64_to_cpu(ags->hw_error_le), &cper_addr, &read_ack_= register_addr); =20 cper_addr =3D le64_to_cpu(cper_addr); diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index e059317b002e..40f66792570c 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -889,6 +889,10 @@ static void acpi_align_size(GArray *blob, unsigned ali= gn) g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align)); } =20 +static const AcpiNotificationSourceId hest_ghes_notify[] =3D { + {ACPI_HEST_SRC_ID_SYNC, ACPI_GHES_NOTIFY_SEA}, +}; + static void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) { @@ -944,6 +948,7 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTa= bles *tables) if (vms->ras) { acpi_add_table(table_offsets, tables_blob); acpi_build_hest(tables_blob, tables->hardware_errors, tables->link= er, + hest_ghes_notify, ARRAY_SIZE(hest_ghes_notify), vms->oem_id, vms->oem_table_id); } =20 diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h index 9a765edb27ef..e47ffacbb5c9 100644 --- a/include/hw/acpi/ghes.h +++ b/include/hw/acpi/ghes.h @@ -57,20 +57,27 @@ enum AcpiGhesNotifyType { ACPI_GHES_NOTIFY_RESERVED =3D 12 }; =20 -enum { - ACPI_HEST_SRC_ID_SEA =3D 0, - /* future ids go here */ - - ACPI_GHES_ERROR_SOURCE_COUNT -}; - typedef struct AcpiGhesState { uint64_t hw_error_le; bool present; /* True if GHES is present at all on this board */ } AcpiGhesState; =20 +/* + * ID numbers used to fill HEST source ID field + */ +enum AcpiGhesSourceID { + ACPI_HEST_SRC_ID_SYNC, +}; + +typedef struct AcpiNotificationSourceId { + enum AcpiGhesSourceID source_id; + enum AcpiGhesNotifyType notify; +} AcpiNotificationSourceId; + void acpi_build_hest(GArray *table_data, GArray *hardware_errors, BIOSLinker *linker, + const AcpiNotificationSourceId * const notif_source, + int num_sources, const char *oem_id, const char *oem_table_id); void acpi_ghes_add_fw_cfg(AcpiGhesState *vms, FWCfgState *s, GArray *hardware_errors); --=20 2.47.0 From nobody Sat Nov 23 19:35:19 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3ADDA185955 for ; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; cv=none; b=HSB4n+s8T7Z7Z3ThBPsnRZN2kDffG/lxhNT+lqj3JrfksrT2ILRZFKvfniamhDTK9zkDrBh/Fb0h4sOylz4k2B2vlJVX4pA7YDDenf7znOS8OgnpCTOhzI6nEdjQ/9hH/BKrQ1V/TdGOcf3mBDDwO4CQT8/X79xt2XT4RSyt/qU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; c=relaxed/simple; bh=gdndAQElEiSThiB//XhZPACDqXwEeg2bg8wCE0V83R8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b7bJvGGJ+cP17t2FjKdU8EZZ6QkfqJSJ+7HV0TK6q3glbAR8pyGZcAITmgzs3IyVoTZFjqsHDjPoZhqEd7gRGxfeXaZKpqmyi5cDnTK0jHqwihWg8O+1Swqh8br2p1j86ATi2kYIzvKnJWGQOMGFNNr8J7oiNDVQTUSBnSk801A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=r5yRAwye; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="r5yRAwye" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0E6FFC4CED7; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1731487058; bh=gdndAQElEiSThiB//XhZPACDqXwEeg2bg8wCE0V83R8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r5yRAwyebzBUhOkPtoDH9K23cWIL+KHQUO6K94YStAx2L/TyYgU7keJ3JrTDXX2Ve q6UwkNlc+rw98DRS+HUIJH2oOipUWTiodERASFGxxcNTa0Y++9i1DskqXybQxbbIty ppgu95tihrelKLVJ1/+1UE01E03GpoSM1OoukrAgaXJrv09x5bjUL4/ApzxImNQP99 CtJYgcsIOOCOnK5yMu1ENTgrHBrZI4e01/y4HTzSeWOFpHzNDCWDac5DF2E45xeaTu Fai9nmXH8ZpbNesyB36yHge6YTPEULrFQjOB0EVj2aBdVt8w1PzMYXZr+c3J7FbG8F mdeTharkEtXVQ== Received: from mchehab by mail.kernel.org with local (Exim 4.98) (envelope-from ) id 1tB8sZ-00000001Kw4-3OzK; Wed, 13 Nov 2024 09:37:35 +0100 From: Mauro Carvalho Chehab To: Igor Mammedov Cc: Jonathan Cameron , Shiju Jose , Mauro Carvalho Chehab , "Michael S. Tsirkin" , Ani Sinha , Dongjiu Geng , linux-kernel@vger.kernel.org, qemu-arm@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH 2/6] acpi/ghes: add a firmware file with HEST address Date: Wed, 13 Nov 2024 09:36:59 +0100 Message-ID: <70ed97b5b335a3e399121be988bf37136aaaa7fd.1731486604.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.47.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: Mauro Carvalho Chehab Content-Type: text/plain; charset="utf-8" Store HEST table address at GPA, placing its content at hest_addr_le variable. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- Change from v8: - hest_addr_lr is now pointing to the error source size and data. Signed-off-by: Mauro Carvalho Chehab --- hw/acpi/ghes.c | 15 +++++++++++++++ include/hw/acpi/ghes.h | 1 + 2 files changed, 16 insertions(+) diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index a590b0f6f85f..4cd79d42cd04 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -30,6 +30,7 @@ =20 #define ACPI_HW_ERROR_FW_CFG_FILE "etc/hardware_errors" #define ACPI_HW_ERROR_ADDR_FW_CFG_FILE "etc/hardware_errors_addr" +#define ACPI_HEST_ADDR_FW_CFG_FILE "etc/acpi_table_hest_addr" =20 /* The max size in bytes for one error block */ #define ACPI_GHES_MAX_RAW_DATA_LENGTH (1 * KiB) @@ -361,6 +362,8 @@ void acpi_build_hest(GArray *table_data, GArray *hardwa= re_errors, =20 acpi_table_begin(&table, table_data); =20 + int hest_offset =3D table_data->len; + /* Error Source Count */ build_append_int_noprefix(table_data, num_sources, 4); for (i =3D 0; i < num_sources; i++) { @@ -368,6 +371,15 @@ void acpi_build_hest(GArray *table_data, GArray *hardw= are_errors, } =20 acpi_table_end(linker, &table); + + /* + * tell firmware to write into GPA the address of HEST via fw_cfg, + * once initialized. + */ + bios_linker_loader_write_pointer(linker, + ACPI_HEST_ADDR_FW_CFG_FILE, 0, + sizeof(uint64_t), + ACPI_BUILD_TABLE_FILE, hest_offset); } =20 void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s, @@ -381,6 +393,9 @@ void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgStat= e *s, fw_cfg_add_file_callback(s, ACPI_HW_ERROR_ADDR_FW_CFG_FILE, NULL, NULL, NULL, &(ags->hw_error_le), sizeof(ags->hw_error_le), false); =20 + fw_cfg_add_file_callback(s, ACPI_HEST_ADDR_FW_CFG_FILE, NULL, NULL, + NULL, &(ags->hest_addr_le), sizeof(ags->hest_addr_le), false); + ags->present =3D true; } =20 diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h index e47ffacbb5c9..a07c30ef13b7 100644 --- a/include/hw/acpi/ghes.h +++ b/include/hw/acpi/ghes.h @@ -58,6 +58,7 @@ enum AcpiGhesNotifyType { }; =20 typedef struct AcpiGhesState { + uint64_t hest_addr_le; uint64_t hw_error_le; bool present; /* True if GHES is present at all on this board */ } AcpiGhesState; --=20 2.47.0 From nobody Sat Nov 23 19:35:19 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D143189F33 for ; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; cv=none; b=dowThznZ5S2xcbZOpUfDvloh3UPS7BnGB59WHcuLoo48JIXEAjXrdM3SA3d3wbzY7VYmmzfsQrfTHYt4XI1ejDaWlIFGbUPtfBDiuSTseE0Di4SuFkwotVN8ZSbPWSKqMi9ss0Yz3yzBOeV2pl8uV4i1vcsHfn55Pq250Qrtr3E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; c=relaxed/simple; bh=lwZ1IuYRe5DepXtgbkyvIhp+Y4LghKbMjDoi/VUdCE0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=trT+wkNZ2J2g3c2RzqOJGJQJWQEartvLsBhLsn0388H//YohUkHCnn2kUZje7JrAEk9QyP5etpeOpdoR+nt4x1+2IH9aewSujti0TU4FjJiP7JpcVwigVHVvj0Vj3JdbKsi9GqRk1Z/xFccsmt1OKBm1y09T1FGFkh41CfvLopY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DHZPti3N; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DHZPti3N" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0B5FFC4CED2; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1731487058; bh=lwZ1IuYRe5DepXtgbkyvIhp+Y4LghKbMjDoi/VUdCE0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DHZPti3NrNr/nB9WNK34DSpnoerejVPDIZd8LPTwgfyh5EE1e2a6R/FJl34ek9DHq 2YxxlABSLWXNG1lnI6HM1V1ONtK8+ikIbqUAP7+I6mXGX3tMWf6M9cegfDp19MJAvz td32tEJWZdeqHLHAeg6TsbSFjZLbQN9nK7TaummK93APgOI1rGve8yfWJEihIuDb+J whRl9ThXVg9+oe3m8pVoeKMdx3UJ+0pGFVq2otWojx/y7lUCPK5vVFdiGMK5N10Zq9 dsGNvded3W7dQFG4puOuEa5ZIi0IUMHbtq0NNNSy6H/XUhKtmbRHySnXkHRf4vRBmP AvwY5tNHE6I6g== Received: from mchehab by mail.kernel.org with local (Exim 4.98) (envelope-from ) id 1tB8sZ-00000001Kw7-3WGE; Wed, 13 Nov 2024 09:37:35 +0100 From: Mauro Carvalho Chehab To: Igor Mammedov Cc: Jonathan Cameron , Shiju Jose , Mauro Carvalho Chehab , "Michael S. Tsirkin" , Ani Sinha , Dongjiu Geng , linux-kernel@vger.kernel.org, qemu-arm@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH 3/6] acpi/ghes: rename the function which gets hw error offsets Date: Wed, 13 Nov 2024 09:37:00 +0100 Message-ID: <3dccd08b82755bd42ab61408d5d86b2bfe2f2f01.1731486604.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.47.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: Mauro Carvalho Chehab Content-Type: text/plain; charset="utf-8" Rename: get_ghes_offsets->get_hw_error_offsets to make clear that this function return offsets based on the hardware error firmware. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- hw/acpi/ghes.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index 4cd79d42cd04..c93bbaf1994a 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -399,9 +399,9 @@ void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgStat= e *s, ags->present =3D true; } =20 -static void get_ghes_offsets(uint64_t ghes_addr, - uint64_t *cper_addr, - uint64_t *read_ack_register_addr) +static void get_hw_error_offsets(uint64_t ghes_addr, + uint64_t *cper_addr, + uint64_t *read_ack_register_addr) { if (!ghes_addr) { return; @@ -445,7 +445,8 @@ void ghes_record_cper_errors(const void *cper, size_t l= en, } ags =3D &acpi_ged_state->ghes_state; =20 - get_ghes_offsets(le64_to_cpu(ags->hw_error_le), &cper_addr, &read_ack_= register_addr); + get_hw_error_offsets(le64_to_cpu(ags->hw_error_le), + &cper_addr, &read_ack_register_addr); =20 cper_addr =3D le64_to_cpu(cper_addr); if (!cper_addr) { --=20 2.47.0 From nobody Sat Nov 23 19:35:19 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A49A318A94C for ; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; cv=none; b=Vj7B0KrAwtAGYL25tqIA1FVJD2tUFwvOewcdCzrFJ0caQeJjBk4Hh9F3ixiqD1TJQ3sMMdRRn1yUYu9VQWqoTME3oMpPA+YN8OjcHIR+KvLef/S0tXO3pEHtlVylOCAurhr7nHARYmIzFhnFbNYXy0rxv8mq31Xm4/gTKHJw+4w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; c=relaxed/simple; bh=8qim0oXtsrKwoB2KDVZMyLso0M4oIrQlnS9SZWFYKkM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b0G8w30Hof2W0mH4NYzaBDCfVFx9eTs4qubA2KzAh7nDUVRVWsA5X9tHY2vRuF32lMdbUf/1D/Ipujk7OL8jpolxTJLuMnCjaRagMV0j6J82kz/q5J5RQ79RFPAd1QRevbX1dI+v6fju7ZEVPAVwAN51gWJpofQ1R5jyXGEVSjE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CPgju8VN; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CPgju8VN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 59221C4AF09; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1731487058; bh=8qim0oXtsrKwoB2KDVZMyLso0M4oIrQlnS9SZWFYKkM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CPgju8VNDSvgnfyFzlFHosYG3OgKweljhKDybtP7tjmWHUGoN4SyFt2HHOd2LR3lo StNu6oGLOnSKNJOkoHLSbAyl70zad0u6i0drhhFESMsI+xMCibVxutwSXXXtiyPCEv Ist0f6XQPybEaDYys7OgNPUZhGoinu4ydXhwCpYV0KUFstJujT/jCDzL3Ko47fgr7+ 1UnbMLTQXA7M1aie7X2O4sGWXInSLu3LqKtW07zqSTOMiJ9OSI6fXFLrjxortsyeUk BXvCkhvFvCckbMvNDS9VGn+WPGqg3yv0warXdnqM3VjzmDbRqNtNCBvczGDEsjoc0S w2WvanPkrm4Vg== Received: from mchehab by mail.kernel.org with local (Exim 4.98) (envelope-from ) id 1tB8sZ-00000001KwA-3dKi; Wed, 13 Nov 2024 09:37:35 +0100 From: Mauro Carvalho Chehab To: Igor Mammedov Cc: Jonathan Cameron , Shiju Jose , Mauro Carvalho Chehab , "Michael S. Tsirkin" , Ani Sinha , Dongjiu Geng , linux-kernel@vger.kernel.org, qemu-arm@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH 4/6] acpi/ghes: Use HEST table offsets when preparing GHES records Date: Wed, 13 Nov 2024 09:37:01 +0100 Message-ID: X-Mailer: git-send-email 2.47.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: Mauro Carvalho Chehab Content-Type: text/plain; charset="utf-8" There are two pointers that are needed during error injection: 1. The start address of the CPER block to be stored; 2. The address of the ack, which needs a reset before next error. Calculate them preferrable from the HEST table, as this allows checking the source ID, the size of the table and the type of HEST error block structures. Yet, keep the old code, as this is needed for migration purposes. Signed-off-by: Mauro Carvalho Chehab --- hw/acpi/ghes.c | 98 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 88 insertions(+), 10 deletions(-) diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index c93bbaf1994a..9ee25efe8abf 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -61,6 +61,23 @@ */ #define ACPI_GHES_GESB_SIZE 20 =20 +/* + * Offsets with regards to the start of the HEST table stored at + * ags->hest_addr_le, according with the memory layout map at + * docs/specs/acpi_hest_ghes.rst. + */ + +/* ACPI 6.2: 18.3.2.8 Generic Hardware Error Source version 2 + * Table 18-382 Generic Hardware Error Source version 2 (GHESv2) Structure + */ +#define HEST_GHES_V2_TABLE_SIZE 92 +#define GHES_ACK_OFFSET (64 + GAS_ADDR_OFFSET) + +/* ACPI 6.2: 18.3.2.7: Generic Hardware Error Source + * Table 18-380: 'Error Status Address' field + */ +#define GHES_ERR_ST_ADDR_OFFSET (20 + GAS_ADDR_OFFSET) + /* * Values for error_severity field */ @@ -218,14 +235,6 @@ static void build_ghes_error_table(GArray *hardware_er= rors, BIOSLinker *linker, { int i, error_status_block_offset; =20 - /* - * TODO: Current version supports only one source. - * A further patch will drop this check, after adding a proper migrati= on - * code, as, for the code to work, we need to store a bios pointer to = the - * HEST table. - */ - assert(num_sources =3D=3D 1); - /* Build error_block_address */ for (i =3D 0; i < num_sources; i++) { build_append_int_noprefix(hardware_errors, 0, sizeof(uint64_t)); @@ -425,6 +434,70 @@ static void get_hw_error_offsets(uint64_t ghes_addr, *read_ack_register_addr =3D ghes_addr + sizeof(uint64_t); } =20 +static void get_ghes_source_offsets(uint16_t source_id, uint64_t hest_addr, + uint64_t *cper_addr, + uint64_t *read_ack_start_addr, + Error **errp) +{ + uint64_t hest_err_block_addr, hest_read_ack_addr; + uint64_t err_source_struct, error_block_addr; + uint32_t num_sources, i; + + if (!hest_addr) { + return; + } + + cpu_physical_memory_read(hest_addr, &num_sources, sizeof(num_sources)); + num_sources =3D le32_to_cpu(num_sources); + + err_source_struct =3D hest_addr + sizeof(num_sources); + + /* + * Currently, HEST Error source navigates only for GHESv2 tables + */ + + for (i =3D 0; i < num_sources; i++) { + uint64_t addr =3D err_source_struct; + uint16_t type, src_id; + + cpu_physical_memory_read(addr, &type, sizeof(type)); + type =3D le16_to_cpu(type); + + /* For now, we only know the size of GHESv2 table */ + if (type !=3D ACPI_GHES_SOURCE_GENERIC_ERROR_V2) { + error_setg(errp, "HEST: type %d not supported.", type); + return; + } + + /* It is GHES. Compare CPER source address */ + addr +=3D sizeof(type); + cpu_physical_memory_read(addr, &src_id, sizeof(src_id)); + + if (src_id =3D=3D source_id) { + break; + } + + err_source_struct +=3D HEST_GHES_V2_TABLE_SIZE; + } + if (i =3D=3D num_sources) { + error_setg(errp, "HEST: Source %d not found.", source_id); + return; + } + + /* Navigate though table address pointers */ + hest_err_block_addr =3D err_source_struct + GHES_ERR_ST_ADDR_OFFSET; + hest_read_ack_addr =3D err_source_struct + GHES_ACK_OFFSET; + + cpu_physical_memory_read(hest_err_block_addr, &error_block_addr, + sizeof(error_block_addr)); + + cpu_physical_memory_read(error_block_addr, cper_addr, + sizeof(*cper_addr)); + + cpu_physical_memory_read(hest_read_ack_addr, read_ack_start_addr, + sizeof(*read_ack_start_addr)); +} + void ghes_record_cper_errors(const void *cper, size_t len, uint16_t source_id, Error **errp) { @@ -445,8 +518,13 @@ void ghes_record_cper_errors(const void *cper, size_t = len, } ags =3D &acpi_ged_state->ghes_state; =20 - get_hw_error_offsets(le64_to_cpu(ags->hw_error_le), - &cper_addr, &read_ack_register_addr); + if (!ags->hest_addr_le) { + get_hw_error_offsets(le64_to_cpu(ags->hw_error_le), + &cper_addr, &read_ack_register_addr); + } else { + get_ghes_source_offsets(source_id, le64_to_cpu(ags->hest_addr_le), + &cper_addr, &read_ack_register_addr, errp); + } =20 cper_addr =3D le64_to_cpu(cper_addr); if (!cper_addr) { --=20 2.47.0 From nobody Sat Nov 23 19:35:19 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D18B189F5A for ; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; cv=none; b=tkq5aglsVwdmxjaAiFITvtYaVWtRVg4E1V/kAS8XSLljHZJDA2tZMrYPFkhizZj9dDnqMasAoeAdLM/dzInJr2UgfDhsSWlyDy1DtMPV9X6Llhil6Ueqa6xQmWfRt+/4SnAiA4hAZtFWYZsvt4Sy28Q2Xo+cNaYVFpBA4jcY8lg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; c=relaxed/simple; bh=odJOZG7yNovZKCssQmjOTgaaR33S7IrbHrH+B011h6s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IkPXEEkUnRqRz6UAryN5/tHc+kGDJzO1BBKQcNSqMw6MOGlbjr7flQRfnm/TOZDLSsy95HHiMC9BfWhPBMLZjTGBP8BQqABbc8cpeytCq1NAdi+bF5Ag4bCp2RLvPZ50dn61LN7Em6Fi09s9yQWPAezxneMFWGwDdB81uB/2Q70= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VRGETCq4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VRGETCq4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 11389C4CED8; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1731487058; bh=odJOZG7yNovZKCssQmjOTgaaR33S7IrbHrH+B011h6s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VRGETCq42M0V3Ais3xXC3y8kQ46dfX6xhuY0CSNYnZp59Y/0MXzQAUle+xqdirKxu MkQ8MiT5xFj7/A2CKjwnrtpx8BVfPx57+ns++G929VxUuvXjMk4aLSHK0x0YZzr/o4 PuIOIk+ExeUeQFAdOzJnXCnNr9NuAJvMmpyhr6pJkdRwLogkhR+OARandTVqTCjuPH yCJfXNmMXVMyBw2HeXdSPf00jyRiX8iAcrbhgbkD8HjjV4vhG2buUSgOUKQUqajyNH jaIwmw+AxqAYz0hEeMEVoXT7t96mkY7D7ixQEjUQKPgFx3C67k9i4hdEBoUtIrfaIH 1TcN8I9xdL3DQ== Received: from mchehab by mail.kernel.org with local (Exim 4.98) (envelope-from ) id 1tB8sZ-00000001KwD-3kqP; Wed, 13 Nov 2024 09:37:35 +0100 From: Mauro Carvalho Chehab To: Igor Mammedov Cc: Jonathan Cameron , Shiju Jose , Mauro Carvalho Chehab , "Michael S. Tsirkin" , Ani Sinha , linux-kernel@vger.kernel.org, qemu-devel@nongnu.org Subject: [PATCH 5/6] acpi/generic_event_device: Update GHES migration to cover hest addr Date: Wed, 13 Nov 2024 09:37:02 +0100 Message-ID: <6391dfec0a26b83641c2b2062115b839490cc902.1731486604.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.47.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: Mauro Carvalho Chehab Content-Type: text/plain; charset="utf-8" The GHES migration logic at GED should now support HEST table location too. Increase migration version and change needed to check for both ghes_addr_le and hest_addr_le. Signed-off-by: Mauro Carvalho Chehab --- hw/acpi/generic_event_device.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c index 17baf36132a8..c1116dd8d7ae 100644 --- a/hw/acpi/generic_event_device.c +++ b/hw/acpi/generic_event_device.c @@ -387,6 +387,34 @@ static const VMStateDescription vmstate_ghes_state =3D= { } }; =20 +static const VMStateDescription vmstate_hest =3D { + .name =3D "acpi-hest", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT64(hest_addr_le, AcpiGhesState), + VMSTATE_END_OF_LIST() + }, +}; + +static bool hest_needed(void *opaque) +{ + AcpiGedState *s =3D opaque; + return s->ghes_state.hest_addr_le; +} + +static const VMStateDescription vmstate_hest_state =3D { + .name =3D "acpi-ged/hest", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D hest_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_STRUCT(ghes_state, AcpiGedState, 1, + vmstate_hest, AcpiGhesState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_acpi_ged =3D { .name =3D "acpi-ged", .version_id =3D 1, @@ -399,6 +427,7 @@ static const VMStateDescription vmstate_acpi_ged =3D { &vmstate_memhp_state, &vmstate_cpuhp_state, &vmstate_ghes_state, + &vmstate_hest_state, NULL } }; --=20 2.47.0 From nobody Sat Nov 23 19:35:19 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A495B18A947 for ; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; cv=none; b=nlU8X9pLXsrhaPew0AXB662tCuGYsuhG1n354rhH+U33eyjeB+zbteXGfr5hcLrZ+y/u9wQAjcG94AztkJe6LQHOoDYbu+FkYwSq89NLgB5YXCLcZtogDRrYFdmihg/sH5HuvqrYA7rOrVg8ULEjPnRiDsGCuoNq8lm4/XZZuXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731487058; c=relaxed/simple; bh=/iAxRTnw7vCpxt41/a6sF+wbxF47+a06+AruAFNnzSg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O0WImVe9uGNgKlejtHHOXiYigzgZSkUXG/NQaZKSzMSqiWVTUWBSb29IOrgTJpg167MqCVen2ifzlKE6Lv9Etz6zz85HUxidVVRgYOtVc4iWv+hS/0TpvM8RDZoJq4j2LnGLKWaJnr6nqx9rjkJMiXC+LxHhDjGYHunvN2n1XAQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NypOU/VA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NypOU/VA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 59183C4CEDE; Wed, 13 Nov 2024 08:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1731487058; bh=/iAxRTnw7vCpxt41/a6sF+wbxF47+a06+AruAFNnzSg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NypOU/VAZkWbjlGShSU5D6T9SfMSDZylNBKKldk9mxYWIA0O32AWZqsLkhCpCUoxC yOrxQooMkmxpvZY3dTrz2SVmQKW6VdL+Z6V3u7icsby+45VF3qbfQS9E0AmHEgO78R G4AGA3Mab3+dBkJcu/cTOdqv1ZirxVwCF+3WgWR8Cdlb8PvtPWHIGhs4qb3rKZyzxq kWcdNJ5apcm+hyOuBPP7ZxABw+zHcwOkaVs9gHrVo6gJv15JOYJAFWW5tsYfZvvs5W QuK1sFMmHmoHSi1Xf04H6Slal1LFe3nKlnMAmP3dZYLGB2Kxyt4zwcIOWiRBjd0Poz aTZl+O/SsXlUA== Received: from mchehab by mail.kernel.org with local (Exim 4.98) (envelope-from ) id 1tB8sZ-00000001KwG-3tFT; Wed, 13 Nov 2024 09:37:35 +0100 From: Mauro Carvalho Chehab To: Igor Mammedov Cc: Jonathan Cameron , Shiju Jose , Mauro Carvalho Chehab , "Michael S. Tsirkin" , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Ani Sinha , Dongjiu Geng , Eduardo Habkost , Marcel Apfelbaum , Peter Maydell , Shannon Zhao , Yanan Wang , Zhao Liu , linux-kernel@vger.kernel.org, qemu-arm@nongnu.org, qemu-devel@nongnu.org Subject: [PATCH 6/6] acpi/generic_event_device: add logic to detect if HEST addr is available Date: Wed, 13 Nov 2024 09:37:03 +0100 Message-ID: <92fdd4cbfb0b52450cd0a2abac0a3227458c9618.1731486604.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.47.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: Mauro Carvalho Chehab Content-Type: text/plain; charset="utf-8" Create a new property (x-has-hest-addr) and use it to detect if the GHES table offsets can be calculated from the HEST address (qemu 9.2 and upper) or via the legacy way via an offset obtained from the hardware_errors firmware file. Signed-off-by: Mauro Carvalho Chehab --- hw/acpi/generic_event_device.c | 1 + hw/acpi/ghes.c | 27 ++++++++++++++++++++------- hw/arm/virt-acpi-build.c | 30 ++++++++++++++++++++++++++---- hw/core/machine.c | 2 ++ include/hw/acpi/ghes.h | 1 + 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c index c1116dd8d7ae..df6b4fab2d30 100644 --- a/hw/acpi/generic_event_device.c +++ b/hw/acpi/generic_event_device.c @@ -318,6 +318,7 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, Acp= iEventStatusBits ev) =20 static Property acpi_ged_properties[] =3D { DEFINE_PROP_UINT32("ged-event", AcpiGedState, ged_event_bitmap, 0), + DEFINE_PROP_BOOL("x-has-hest-addr", AcpiGedState, ghes_state.hest_look= up, true), DEFINE_PROP_END_OF_LIST(), }; =20 diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index 9ee25efe8abf..2d34a6ddf133 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -365,6 +365,8 @@ void acpi_build_hest(GArray *table_data, GArray *hardwa= re_errors, { AcpiTable table =3D { .sig =3D "HEST", .rev =3D 1, .oem_id =3D oem_id, .oem_table_id =3D oem_table_id= }; + AcpiGedState *acpi_ged_state; + AcpiGhesState *ags =3D NULL; int i; =20 build_ghes_error_table(hardware_errors, linker, num_sources); @@ -385,10 +387,19 @@ void acpi_build_hest(GArray *table_data, GArray *hard= ware_errors, * tell firmware to write into GPA the address of HEST via fw_cfg, * once initialized. */ - bios_linker_loader_write_pointer(linker, - ACPI_HEST_ADDR_FW_CFG_FILE, 0, - sizeof(uint64_t), - ACPI_BUILD_TABLE_FILE, hest_offset); + + acpi_ged_state =3D ACPI_GED(object_resolve_path_type("", TYPE_ACPI_GED, + NULL)); + if (acpi_ged_state) { + ags =3D &acpi_ged_state->ghes_state; + } + + if (ags->hest_lookup) { + bios_linker_loader_write_pointer(linker, + ACPI_HEST_ADDR_FW_CFG_FILE, 0, + sizeof(uint64_t), + ACPI_BUILD_TABLE_FILE, hest_offse= t); + } } =20 void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s, @@ -402,8 +413,10 @@ void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgSta= te *s, fw_cfg_add_file_callback(s, ACPI_HW_ERROR_ADDR_FW_CFG_FILE, NULL, NULL, NULL, &(ags->hw_error_le), sizeof(ags->hw_error_le), false); =20 - fw_cfg_add_file_callback(s, ACPI_HEST_ADDR_FW_CFG_FILE, NULL, NULL, - NULL, &(ags->hest_addr_le), sizeof(ags->hest_addr_le), false); + if (ags && ags->hest_lookup) { + fw_cfg_add_file_callback(s, ACPI_HEST_ADDR_FW_CFG_FILE, NULL, NULL, + NULL, &(ags->hest_addr_le), sizeof(ags->hest_addr_le), false); + } =20 ags->present =3D true; } @@ -518,7 +531,7 @@ void ghes_record_cper_errors(const void *cper, size_t l= en, } ags =3D &acpi_ged_state->ghes_state; =20 - if (!ags->hest_addr_le) { + if (!ags->hest_lookup) { get_hw_error_offsets(le64_to_cpu(ags->hw_error_le), &cper_addr, &read_ack_register_addr); } else { diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 40f66792570c..930ba9e0a14c 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -893,6 +893,10 @@ static const AcpiNotificationSourceId hest_ghes_notify= [] =3D { {ACPI_HEST_SRC_ID_SYNC, ACPI_GHES_NOTIFY_SEA}, }; =20 +static const AcpiNotificationSourceId hest_ghes_notify_9_1[] =3D { + {ACPI_HEST_SRC_ID_SYNC, ACPI_GHES_NOTIFY_SEA}, +}; + static void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) { @@ -946,10 +950,28 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuild= Tables *tables) build_dbg2(tables_blob, tables->linker, vms); =20 if (vms->ras) { - acpi_add_table(table_offsets, tables_blob); - acpi_build_hest(tables_blob, tables->hardware_errors, tables->link= er, - hest_ghes_notify, ARRAY_SIZE(hest_ghes_notify), - vms->oem_id, vms->oem_table_id); + AcpiGhesState *ags; + AcpiGedState *acpi_ged_state; + + acpi_ged_state =3D ACPI_GED(object_resolve_path_type("", TYPE_ACPI= _GED, + NULL)); + if (acpi_ged_state) { + ags =3D &acpi_ged_state->ghes_state; + + acpi_add_table(table_offsets, tables_blob); + + if (!ags->hest_lookup) { + acpi_build_hest(tables_blob, tables->hardware_errors, + tables->linker, hest_ghes_notify_9_1, + ARRAY_SIZE(hest_ghes_notify_9_1), + vms->oem_id, vms->oem_table_id); + } else { + acpi_build_hest(tables_blob, tables->hardware_errors, + tables->linker, hest_ghes_notify, + ARRAY_SIZE(hest_ghes_notify), + vms->oem_id, vms->oem_table_id); + } + } } =20 if (ms->numa_state->num_nodes > 0) { diff --git a/hw/core/machine.c b/hw/core/machine.c index a35c4a8faecb..00521a1963ba 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -34,10 +34,12 @@ #include "hw/virtio/virtio-pci.h" #include "hw/virtio/virtio-net.h" #include "hw/virtio/virtio-iommu.h" +#include "hw/acpi/generic_event_device.h" #include "audio/audio.h" =20 GlobalProperty hw_compat_9_1[] =3D { { TYPE_PCI_DEVICE, "x-pcie-ext-tag", "false" }, + { TYPE_ACPI_GED, "x-has-hest-addr", "false" }, }; const size_t hw_compat_9_1_len =3D G_N_ELEMENTS(hw_compat_9_1); =20 diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h index a07c30ef13b7..040d6ee366b2 100644 --- a/include/hw/acpi/ghes.h +++ b/include/hw/acpi/ghes.h @@ -61,6 +61,7 @@ typedef struct AcpiGhesState { uint64_t hest_addr_le; uint64_t hw_error_le; bool present; /* True if GHES is present at all on this board */ + bool hest_lookup; /* True if HEST address is present */ } AcpiGhesState; =20 /* --=20 2.47.0