Create macros for the Arm timer IRQ indexes

Rather than hard coding these values use a macro to document which
interrupt is being used.

Reviewed by:	emaste
Obtained from:	https://github.com/FreeBSD-UPB/freebsd-src (earlier version)
Sponsored by:	Innovate UK
Sponsored by:	The FreeBSD Foundation
Sponsored by:	University Politehnica of Bucharest
Differential Revision: https://reviews.freebsd.org/D36600
This commit is contained in:
Andrew Turner 2022-09-14 17:29:29 +01:00
parent 71f0c44a04
commit 9526031cd5

View File

@ -78,6 +78,12 @@ __FBSDID("$FreeBSD$");
#include <dev/acpica/acpivar.h>
#endif
#define GT_PHYS_SECURE 0
#define GT_PHYS_NONSECURE 1
#define GT_VIRT 2
#define GT_HYP 3
#define GT_IRQ_COUNT 4
#define GT_CTRL_ENABLE (1 << 0)
#define GT_CTRL_INT_MASK (1 << 1)
#define GT_CTRL_INT_STAT (1 << 2)
@ -93,8 +99,8 @@ __FBSDID("$FreeBSD$");
#define GT_CNTKCTL_PL0PCTEN (1 << 0) /* PL0 CNTPCT and CNTFRQ access */
struct arm_tmr_softc {
struct resource *res[4];
void *ihl[4];
struct resource *res[GT_IRQ_COUNT];
void *ihl[GT_IRQ_COUNT];
uint64_t (*get_cntxct)(bool);
uint32_t clkfreq;
struct eventtimer et;
@ -104,10 +110,10 @@ struct arm_tmr_softc {
static struct arm_tmr_softc *arm_tmr_sc = NULL;
static struct resource_spec timer_spec[] = {
{ SYS_RES_IRQ, 0, RF_ACTIVE }, /* Secure */
{ SYS_RES_IRQ, 1, RF_ACTIVE }, /* Non-secure */
{ SYS_RES_IRQ, 2, RF_ACTIVE | RF_OPTIONAL }, /* Virt */
{ SYS_RES_IRQ, 3, RF_ACTIVE | RF_OPTIONAL }, /* Hyp */
{ SYS_RES_IRQ, GT_PHYS_SECURE, RF_ACTIVE },
{ SYS_RES_IRQ, GT_PHYS_NONSECURE, RF_ACTIVE },
{ SYS_RES_IRQ, GT_VIRT, RF_ACTIVE | RF_OPTIONAL },
{ SYS_RES_IRQ, GT_HYP, RF_ACTIVE | RF_OPTIONAL },
{ -1, 0 }
};
@ -412,9 +418,12 @@ arm_tmr_acpi_identify(driver_t *driver, device_t parent)
goto out;
}
arm_tmr_acpi_add_irq(parent, dev, 0, gtdt->SecureEl1Interrupt);
arm_tmr_acpi_add_irq(parent, dev, 1, gtdt->NonSecureEl1Interrupt);
arm_tmr_acpi_add_irq(parent, dev, 2, gtdt->VirtualTimerInterrupt);
arm_tmr_acpi_add_irq(parent, dev, GT_PHYS_SECURE,
gtdt->SecureEl1Interrupt);
arm_tmr_acpi_add_irq(parent, dev, GT_PHYS_NONSECURE,
gtdt->NonSecureEl1Interrupt);
arm_tmr_acpi_add_irq(parent, dev, GT_VIRT,
gtdt->VirtualTimerInterrupt);
out:
acpi_unmap_table(gtdt);
@ -480,17 +489,17 @@ arm_tmr_attach(device_t dev)
#ifdef __aarch64__
/* Use the virtual timer if we have one. */
if (sc->res[2] != NULL) {
if (sc->res[GT_VIRT] != NULL) {
sc->physical = false;
first_timer = 2;
last_timer = 2;
first_timer = GT_VIRT;
last_timer = GT_VIRT;
} else
#endif
/* Otherwise set up the secure and non-secure physical timers. */
{
sc->physical = true;
first_timer = 0;
last_timer = 1;
first_timer = GT_PHYS_SECURE;
last_timer = GT_PHYS_NONSECURE;
}
arm_tmr_sc = sc;
@ -509,7 +518,7 @@ arm_tmr_attach(device_t dev)
}
/* Disable the virtual timer until we are ready */
if (sc->res[2] != NULL)
if (sc->res[GT_VIRT] != NULL)
arm_tmr_disable(false);
/* And the physical */
if (sc->physical)