Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 May 2016 16:15:39 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r299072 - head/sys/arm/arm
Message-ID:  <201605041615.u44GFd3F038040@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Wed May  4 16:15:39 2016
New Revision: 299072
URL: https://svnweb.freebsd.org/changeset/base/299072

Log:
  The virtual timer is optional on ARM64. Properly handle that condition. [1]
  In case we do not have an interrupt assignment for the virtual timer,
  force the physical timer.
  Also skip resource allocation for any timer we do not have an interrupt
  assignment for.
  
  In collaboration with:	andrew
  Submitted by:		br ([1] from his gem5 arm64 work)
  Sponsored by:		DARPA/AFRL
  Reviewed by:		andrew
  MFC after:		2 weeks
  Differential Revision:	https://reviews.freebsd.org/D6203

Modified:
  head/sys/arm/arm/generic_timer.c

Modified: head/sys/arm/arm/generic_timer.c
==============================================================================
--- head/sys/arm/arm/generic_timer.c	Wed May  4 16:09:51 2016	(r299071)
+++ head/sys/arm/arm/generic_timer.c	Wed May  4 16:15:39 2016	(r299072)
@@ -100,7 +100,7 @@ static struct arm_tmr_softc *arm_tmr_sc 
 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 },	/* Virt */
+	{ SYS_RES_IRQ,		2,	RF_ACTIVE | RF_OPTIONAL }, /* Virt */
 	{ SYS_RES_IRQ,		3,	RF_ACTIVE | RF_OPTIONAL	}, /* Hyp */
 	{ -1, 0 }
 };
@@ -392,13 +392,17 @@ arm_tmr_attach(device_t dev)
 #ifdef __arm__
 	sc->physical = true;
 #else /* __aarch64__ */
-	sc->physical = false;
+	/* If we do not have a virtual timer use the physical. */
+	sc->physical = (sc->res[2] == NULL) ? true : false;
 #endif
 
 	arm_tmr_sc = sc;
 
 	/* Setup secure, non-secure and virtual IRQs handler */
 	for (i = 0; i < 3; i++) {
+		/* If we do not have the interrupt, skip it. */
+		if (sc->res[i] == NULL)
+			continue;
 		error = bus_setup_intr(dev, sc->res[i], INTR_TYPE_CLK,
 		    arm_tmr_intr, NULL, sc, &sc->ihl[i]);
 		if (error) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605041615.u44GFd3F038040>