summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2018-04-09 18:35:13 +0000
committerkettenis <kettenis@openbsd.org>2018-04-09 18:35:13 +0000
commit3dd5c381ec07d6eb9dd8575c0a73780b538733dc (patch)
tree3ebf135dac3779e7c343d045854c46fa3595c187
parentSupport 64 bit integers on 32 bit architectures. (diff)
downloadwireguard-openbsd-3dd5c381ec07d6eb9dd8575c0a73780b538733dc.tar.xz
wireguard-openbsd-3dd5c381ec07d6eb9dd8575c0a73780b538733dc.zip
The Open Firmware Interrupt Mapping "recommendation" says that the number
of address celss in the child unit specifier should be fetched from the interrupt controller node. Fix this as the current code doesn't work on the MACCHIATObin for example. ok patrick@
-rw-r--r--sys/arch/arm64/arm64/intr.c32
-rw-r--r--sys/arch/arm64/dev/pciecam.c5
-rw-r--r--sys/arch/arm64/include/intr.h4
-rw-r--r--sys/dev/fdt/dwpcie.c5
4 files changed, 20 insertions, 26 deletions
diff --git a/sys/arch/arm64/arm64/intr.c b/sys/arch/arm64/arm64/intr.c
index cea77df5cb1..574e3cc0d0f 100644
--- a/sys/arch/arm64/arm64/intr.c
+++ b/sys/arch/arm64/arm64/intr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.c,v 1.10 2018/01/31 10:52:12 kettenis Exp $ */
+/* $OpenBSD: intr.c,v 1.11 2018/04/09 18:35:13 kettenis Exp $ */
/*
* Copyright (c) 2011 Dale Rahn <drahn@openbsd.org>
*
@@ -309,14 +309,14 @@ arm_intr_establish_fdt_idx(int node, int idx, int level, int (*func)(void *),
}
void *
-arm_intr_establish_fdt_imap(int node, int *reg, int nreg, int acells,
- int level, int (*func)(void *), void *cookie, char *name)
+arm_intr_establish_fdt_imap(int node, int *reg, int nreg, int level,
+ int (*func)(void *), void *cookie, char *name)
{
struct interrupt_controller *ic;
struct arm_intr_handle *ih;
- uint32_t *cell, phandle;
- int map_mask[4], *map, map_len;
- int i, len, ncells;
+ uint32_t *cell;
+ uint32_t map_mask[4], *map;
+ int i, len, acells, ncells;
void *val = NULL;
if (nreg != sizeof(map_mask))
@@ -326,19 +326,15 @@ arm_intr_establish_fdt_imap(int node, int *reg, int nreg, int acells,
sizeof(map_mask)) != sizeof(map_mask))
return NULL;
- map_len = OF_getproplen(node, "interrupt-map");
- if (map_len <= 0)
+ len = OF_getproplen(node, "interrupt-map");
+ if (len <= 0)
return NULL;
- map = malloc(map_len, M_DEVBUF, M_WAITOK);
- len = OF_getpropintarray(node, "interrupt-map", map, map_len);
- if (len != map_len) {
- free(map, M_DEVBUF, map_len);
- return NULL;
- }
+ map = malloc(len, M_DEVBUF, M_WAITOK);
+ OF_getpropintarray(node, "interrupt-map", map, len);
cell = map;
- ncells = map_len / sizeof(uint32_t);
+ ncells = len / sizeof(uint32_t);
for (i = 0; ncells > 0; i++) {
LIST_FOREACH(ic, &interrupt_controllers, ic_list) {
if (ic->ic_phandle == cell[4])
@@ -348,13 +344,13 @@ arm_intr_establish_fdt_imap(int node, int *reg, int nreg, int acells,
if (ic == NULL)
break;
+ acells = OF_getpropint(ic->ic_node, "#address-cells", 0);
if (ncells >= (5 + acells + ic->ic_cells) &&
(reg[0] & map_mask[0]) == cell[0] &&
(reg[1] & map_mask[1]) == cell[1] &&
(reg[2] & map_mask[2]) == cell[2] &&
(reg[3] & map_mask[3]) == cell[3] &&
ic->ic_establish) {
- phandle = cell[4];
val = ic->ic_establish(ic->ic_cookie, &cell[5 + acells],
level, func, cookie, name);
break;
@@ -365,7 +361,7 @@ arm_intr_establish_fdt_imap(int node, int *reg, int nreg, int acells,
}
if (val == NULL) {
- free(map, M_DEVBUF, map_len);
+ free(map, M_DEVBUF, len);
return NULL;
}
@@ -373,7 +369,7 @@ arm_intr_establish_fdt_imap(int node, int *reg, int nreg, int acells,
ih->ih_ic = ic;
ih->ih_ih = val;
- free(map, M_DEVBUF, map_len);
+ free(map, M_DEVBUF, len);
return ih;
}
diff --git a/sys/arch/arm64/dev/pciecam.c b/sys/arch/arm64/dev/pciecam.c
index 93bdb15be3b..3d68b9d33a6 100644
--- a/sys/arch/arm64/dev/pciecam.c
+++ b/sys/arch/arm64/dev/pciecam.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pciecam.c,v 1.2 2017/04/08 22:38:17 kettenis Exp $ */
+/* $OpenBSD: pciecam.c,v 1.3 2018/04/09 18:35:13 kettenis Exp $ */
/*
* Copyright (c) 2013,2017 Patrick Wildt <patrick@blueri.se>
*
@@ -416,8 +416,7 @@ pciecam_intr_establish(void *self, pci_intr_handle_t ihp, int level,
reg[3] = ih->ih_intrpin;
cookie = arm_intr_establish_fdt_imap(sc->sc_node, reg,
- sizeof(reg), sc->sc_pacells, level, func, arg,
- (void *)name);
+ sizeof(reg), level, func, arg, name);
}
free(ih, M_DEVBUF, sizeof(struct pciecam_intr_handle));
diff --git a/sys/arch/arm64/include/intr.h b/sys/arch/arm64/include/intr.h
index 1c478b6b38e..45c740648ac 100644
--- a/sys/arch/arm64/include/intr.h
+++ b/sys/arch/arm64/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.9 2018/01/31 10:52:12 kettenis Exp $ */
+/* $OpenBSD: intr.h,v 1.10 2018/04/09 18:35:13 kettenis Exp $ */
/*
* Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -156,7 +156,7 @@ void *arm_intr_establish_fdt(int, int, int (*)(void *),
void *, char *);
void *arm_intr_establish_fdt_idx(int, int, int, int (*)(void *),
void *, char *);
-void *arm_intr_establish_fdt_imap(int, int *, int, int, int, int (*)(void *),
+void *arm_intr_establish_fdt_imap(int, int *, int, int, int (*)(void *),
void *, char *);
void *arm_intr_establish_fdt_msi(int, uint64_t *, uint64_t *, int ,
int (*)(void *), void *, char *);
diff --git a/sys/dev/fdt/dwpcie.c b/sys/dev/fdt/dwpcie.c
index a19ef86f149..f0cb1e80774 100644
--- a/sys/dev/fdt/dwpcie.c
+++ b/sys/dev/fdt/dwpcie.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwpcie.c,v 1.3 2018/04/05 21:41:49 kettenis Exp $ */
+/* $OpenBSD: dwpcie.c,v 1.4 2018/04/09 18:35:13 kettenis Exp $ */
/*
* Copyright (c) 2018 Mark Kettenis <kettenis@openbsd.org>
*
@@ -580,8 +580,7 @@ dwpcie_intr_establish(void *v, pci_intr_handle_t ihp, int level,
reg[3] = ih->ih_intrpin;
cookie = arm_intr_establish_fdt_imap(sc->sc_node, reg,
- sizeof(reg), sc->sc_pacells, level, func, arg,
- (void *)name);
+ sizeof(reg), level, func, arg, name);
}
free(ih, M_DEVBUF, sizeof(struct dwpcie_intr_handle));