Module Name:    src
Committed By:   jmcneill
Date:           Sat Apr 22 19:20:51 UTC 2017

Modified Files:
        src/sys/arch/arm/nvidia: tegra_lic.c

Log Message:
Explicitly initialize interrupt controllers and since we pass through to
GIC, don't include "LIC" in interrupt string.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_lic.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/nvidia/tegra_lic.c
diff -u src/sys/arch/arm/nvidia/tegra_lic.c:1.3 src/sys/arch/arm/nvidia/tegra_lic.c:1.4
--- src/sys/arch/arm/nvidia/tegra_lic.c:1.3	Tue Jan  5 21:53:48 2016
+++ src/sys/arch/arm/nvidia/tegra_lic.c	Sat Apr 22 19:20:51 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_lic.c,v 1.3 2016/01/05 21:53:48 marty Exp $ */
+/* $NetBSD: tegra_lic.c,v 1.4 2017/04/22 19:20:51 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_lic.c,v 1.3 2016/01/05 21:53:48 marty Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_lic.c,v 1.4 2017/04/22 19:20:51 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -44,6 +44,9 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_lic.c,
 
 #include <dev/fdt/fdtvar.h>
 
+#define	LIC_CPU_IER_CLR_REG	0x28
+#define	LIC_CPU_IEP_CLASS_REG	0x2c
+
 static int	tegra_lic_match(device_t, cfdata_t, void *);
 static void	tegra_lic_attach(device_t, device_t, void *);
 
@@ -80,7 +83,11 @@ tegra_lic_attach(device_t parent, device
 {
 	struct tegra_lic_softc * const sc = device_private(self);
 	struct fdt_attach_args * const faa = aux;
-	int error;
+	bus_space_tag_t bst;
+	bus_space_handle_t bsh;
+	bus_addr_t addr;
+	bus_size_t size;
+	int error, index;
 
 	sc->sc_dev = self;
 	sc->sc_phandle = faa->faa_phandle;
@@ -94,6 +101,27 @@ tegra_lic_attach(device_t parent, device
 
 	aprint_naive("\n");
 	aprint_normal(": LIC\n");
+
+	bst = faa->faa_bst;
+	for (index = 0; ; index++) {
+		error = fdtbus_get_reg(faa->faa_phandle, index, &addr, &size);
+		if (error != 0)
+			break;
+		error = bus_space_map(bst, addr, size, 0, &bsh);
+		if (error) {
+			aprint_error_dev(self, "can't map IC#%d: %d\n",
+			    index, error);
+			continue;
+		}
+
+		/* Clear interrupt enable for CPU */
+		bus_space_write_4(bst, bsh, LIC_CPU_IER_CLR_REG, 0xffffffff);
+
+		/* Route to IRQ */
+		bus_space_write_4(bst, bsh, LIC_CPU_IEP_CLASS_REG, 0);
+
+		bus_space_unmap(bst, bsh, size);
+	}
 }
 
 static void *
@@ -133,7 +161,7 @@ tegra_lic_intrstr(device_t dev, u_int *s
 	const u_int intr = be32toh(specifier[1]);
 	const u_int irq = type == 0 ? IRQ_SPI(intr) : IRQ_PPI(intr);
 
-	snprintf(buf, buflen, "LIC irq %d", irq);
+	snprintf(buf, buflen, "irq %d", irq);
 
 	return true;
 }

Reply via email to