[PATCH v3 02/17] ACPI: GTDT: Parse information related to the EL2 virtual timer
Hanjun Guo
guohanjun at huawei.com
Mon May 25 19:14:26 PDT 2026
On 2026/5/23 22:02, Marc Zyngier wrote:
> Now that we have a way to identify GTDTv3, allow the information
> related to the EL2 virtual timer to be retrieved by the interface
> used by the architected timer driver.
>
> Reviewed-by: Sudeep Holla <sudeep.holla at kernel.org>
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> ---
> drivers/acpi/arm64/gtdt.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/drivers/acpi/arm64/gtdt.c b/drivers/acpi/arm64/gtdt.c
> index 950d5efdf85ea..00158c8aa6d90 100644
> --- a/drivers/acpi/arm64/gtdt.c
> +++ b/drivers/acpi/arm64/gtdt.c
> @@ -41,6 +41,14 @@ struct gtdt_v3 {
>
> static struct acpi_gtdt_descriptor acpi_gtdt_desc __initdata;
>
> +static __init struct acpi_gtdt_el2 *gtdt_to_el2_vtimer(struct acpi_table_gtdt *gtdt)
> +{
> + if (gtdt->header.revision < 3)
> + return NULL;
> +
> + return &container_of(gtdt, struct gtdt_v3, gtdt_v2)->el2_vtimer;
> +}
> +
> static __init bool platform_timer_valid(void *platform_timer)
> {
> struct acpi_gtdt_header *gh = platform_timer;
> @@ -112,6 +120,7 @@ static int __init map_gt_gsi(u32 interrupt, u32 flags)
> int __init acpi_gtdt_map_ppi(int type)
> {
> struct acpi_table_gtdt *gtdt = acpi_gtdt_desc.gtdt;
> + struct acpi_gtdt_el2 *el2_vtimer = gtdt_to_el2_vtimer(gtdt);
>
> switch (type) {
> case ARCH_TIMER_PHYS_NONSECURE_PPI:
> @@ -124,6 +133,12 @@ int __init acpi_gtdt_map_ppi(int type)
> case ARCH_TIMER_HYP_PPI:
> return map_gt_gsi(gtdt->non_secure_el2_interrupt,
> gtdt->non_secure_el2_flags);
> + case ARCH_TIMER_HYP_VIRT_PPI:
> + if (el2_vtimer && el2_vtimer->virtual_el2_timer_gsiv)
> + return map_gt_gsi(el2_vtimer->virtual_el2_timer_gsiv,
> + el2_vtimer->virtual_el2_timer_flags);
> +
> + return 0;
> default:
> pr_err("Failed to map timer interrupt: invalid type.\n");
> }
> @@ -141,6 +156,7 @@ int __init acpi_gtdt_map_ppi(int type)
> bool __init acpi_gtdt_c3stop(int type)
> {
> struct acpi_table_gtdt *gtdt = acpi_gtdt_desc.gtdt;
> + struct acpi_gtdt_el2 *el2_vtimer = gtdt_to_el2_vtimer(gtdt);
>
> switch (type) {
> case ARCH_TIMER_PHYS_NONSECURE_PPI:
> @@ -152,6 +168,10 @@ bool __init acpi_gtdt_c3stop(int type)
> case ARCH_TIMER_HYP_PPI:
> return !(gtdt->non_secure_el2_flags & ACPI_GTDT_ALWAYS_ON);
>
> + case ARCH_TIMER_HYP_VIRT_PPI:
> + return el2_vtimer && el2_vtimer->virtual_el2_timer_gsiv &&
> + !(el2_vtimer->virtual_el2_timer_flags & ACPI_GTDT_ALWAYS_ON);
> +
> default:
> pr_err("Failed to get c3stop info: invalid type.\n");
> }
Reviewed-by: Hanjun Guo <guohanjun at huawei.com>
Thanks
Hanjun
More information about the linux-arm-kernel
mailing list