Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/nvidia Add support for PCI_INTR_MPSAFE
details: https://anonhg.NetBSD.org/src/rev/0fd76a8d776d
branches: trunk
changeset: 823225:0fd76a8d776d
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sun Apr 16 18:05:35 2017 +0000
description:
Add support for PCI_INTR_MPSAFE
diffstat:
sys/arch/arm/nvidia/tegra_pcie.c | 34 ++++++++++++++++++++++++++++++----
1 files changed, 30 insertions(+), 4 deletions(-)
diffs (99 lines):
diff -r b51f1daf5926 -r 0fd76a8d776d sys/arch/arm/nvidia/tegra_pcie.c
--- a/sys/arch/arm/nvidia/tegra_pcie.c Sun Apr 16 18:02:50 2017 +0000
+++ b/sys/arch/arm/nvidia/tegra_pcie.c Sun Apr 16 18:05:35 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_pcie.c,v 1.15 2016/08/17 00:22:56 jakllsch Exp $ */
+/* $NetBSD: tegra_pcie.c,v 1.16 2017/04/16 18:05:35 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c,v 1.15 2016/08/17 00:22:56 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c,v 1.16 2017/04/16 18:05:35 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -62,6 +62,7 @@
int (*ih_callback)(void *);
void *ih_arg;
int ih_ipl;
+ int ih_mpsafe;
TAILQ_ENTRY(tegra_pcie_ih) ih_entry;
};
@@ -109,6 +110,8 @@
static const char *tegra_pcie_intr_string(void *, pci_intr_handle_t,
char *, size_t);
const struct evcnt *tegra_pcie_intr_evcnt(void *, pci_intr_handle_t);
+static int tegra_pcie_intr_setattr(void *, pci_intr_handle_t *, int,
+ uint64_t);
static void * tegra_pcie_intr_establish(void *, pci_intr_handle_t,
int, int (*)(void *), void *);
static void tegra_pcie_intr_disestablish(void *, void *);
@@ -181,8 +184,8 @@
return;
}
- sc->sc_ih = fdtbus_intr_establish(faa->faa_phandle, 0, IPL_VM, 0,
- tegra_pcie_intr, sc);
+ sc->sc_ih = fdtbus_intr_establish(faa->faa_phandle, 0, IPL_VM,
+ FDT_INTR_MPSAFE, tegra_pcie_intr, sc);
if (sc->sc_ih == NULL) {
aprint_error_dev(self, "failed to establish interrupt on %s\n",
intrstr);
@@ -248,8 +251,15 @@
TAILQ_FOREACH(pcie_ih, &sc->sc_intrs, ih_entry) {
int (*callback)(void *) = pcie_ih->ih_callback;
void *arg = pcie_ih->ih_arg;
+ const int mpsafe = pcie_ih->ih_mpsafe;
mutex_exit(&sc->sc_lock);
+
+ if (!mpsafe)
+ KERNEL_LOCK(1, curlwp);
rv += callback(arg);
+ if (!mpsafe)
+ KERNEL_UNLOCK_ONE(curlwp);
+
mutex_enter(&sc->sc_lock);
if (lastgen != sc->sc_intrgen)
break;
@@ -434,6 +444,7 @@
pc->pc_intr_map = tegra_pcie_intr_map;
pc->pc_intr_string = tegra_pcie_intr_string;
pc->pc_intr_evcnt = tegra_pcie_intr_evcnt;
+ pc->pc_intr_setattr = tegra_pcie_intr_setattr;
pc->pc_intr_establish = tegra_pcie_intr_establish;
pc->pc_intr_disestablish = tegra_pcie_intr_disestablish;
}
@@ -577,6 +588,20 @@
return NULL;
}
+static int
+tegra_pcie_intr_setattr(void *v, pci_intr_handle_t *ih, int attr, uint64_t data)
+{
+ struct tegra_pcie_ih *pcie_ih = (struct tegra_pcie_ih *)*ih;
+
+ switch (attr) {
+ case PCI_INTR_MPSAFE:
+ pcie_ih->ih_mpsafe = data;
+ return 0;
+ default:
+ return ENODEV;
+ }
+}
+
static void *
tegra_pcie_intr_establish(void *v, pci_intr_handle_t ih, int ipl,
int (*callback)(void *), void *arg)
@@ -591,6 +616,7 @@
pcie_ih->ih_callback = callback;
pcie_ih->ih_arg = arg;
pcie_ih->ih_ipl = ipl;
+ pcie_ih->ih_mpsafe = 0;
mutex_enter(&sc->sc_lock);
TAILQ_INSERT_TAIL(&sc->sc_intrs, pcie_ih, ih_entry);
Home |
Main Index |
Thread Index |
Old Index