diff options
author | 2018-04-09 18:35:13 +0000 | |
---|---|---|
committer | 2018-04-09 18:35:13 +0000 | |
commit | 3dd5c381ec07d6eb9dd8575c0a73780b538733dc (patch) | |
tree | 3ebf135dac3779e7c343d045854c46fa3595c187 | |
parent | Support 64 bit integers on 32 bit architectures. (diff) | |
download | wireguard-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.c | 32 | ||||
-rw-r--r-- | sys/arch/arm64/dev/pciecam.c | 5 | ||||
-rw-r--r-- | sys/arch/arm64/include/intr.h | 4 | ||||
-rw-r--r-- | sys/dev/fdt/dwpcie.c | 5 |
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)); |