[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