From owner-svn-src-all@freebsd.org Thu May 5 13:31:22 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 27ACEB2D334; Thu, 5 May 2016 13:31:22 +0000 (UTC) (envelope-from skra@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EB1DB175A; Thu, 5 May 2016 13:31:21 +0000 (UTC) (envelope-from skra@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u45DVLv4027941; Thu, 5 May 2016 13:31:21 GMT (envelope-from skra@FreeBSD.org) Received: (from skra@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u45DVJRM027921; Thu, 5 May 2016 13:31:19 GMT (envelope-from skra@FreeBSD.org) Message-Id: <201605051331.u45DVJRM027921@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: skra set sender to skra@FreeBSD.org using -f From: Svatopluk Kraus Date: Thu, 5 May 2016 13:31:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r299117 - in head/sys: arm/allwinner arm/allwinner/a10 arm/arm arm/broadcom/bcm2835 arm/freescale/imx arm/mv arm/nvidia arm/ti kern mips/mediatek mips/mips sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 May 2016 13:31:22 -0000 Author: skra Date: Thu May 5 13:31:19 2016 New Revision: 299117 URL: https://svnweb.freebsd.org/changeset/base/299117 Log: INTRNG - redefine struct intr_map_data to avoid headers pollution. Each struct associated with some type defined in enum intr_map_data_type must have struct intr_map_data on the top of its own definition now. When such structs are used, correct type and size must be filled in. There are three such structs defined in sys/intr.h now. Their definitions should be moved to corresponding headers by follow-up commits. While this change was propagated to all INTRNG like PICs, pic_map_intr() method implementations were corrected on some places. For this specific method, it's ensured by a caller that the 'data' argument passed to this method is never NULL. Also, the return error values were standardized there. Modified: head/sys/arm/allwinner/a10/a10_intc.c head/sys/arm/allwinner/aw_nmi.c head/sys/arm/arm/gic.c head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c head/sys/arm/broadcom/bcm2835/bcm2835_intr.c head/sys/arm/broadcom/bcm2835/bcm2836.c head/sys/arm/freescale/imx/imx_gpio.c head/sys/arm/mv/mpic.c head/sys/arm/nvidia/tegra_gpio.c head/sys/arm/ti/aintc.c head/sys/arm/ti/ti_gpio.c head/sys/kern/subr_intr.c head/sys/mips/mediatek/mtk_gpio_v1.c head/sys/mips/mediatek/mtk_gpio_v2.c head/sys/mips/mediatek/mtk_intr_gic.c head/sys/mips/mediatek/mtk_intr_v1.c head/sys/mips/mediatek/mtk_intr_v2.c head/sys/mips/mips/mips_pic.c head/sys/sys/intr.h Modified: head/sys/arm/allwinner/a10/a10_intc.c ============================================================================== --- head/sys/arm/allwinner/a10/a10_intc.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/allwinner/a10/a10_intc.c Thu May 5 13:31:19 2016 (r299117) @@ -298,14 +298,18 @@ static int a10_intr_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct a10_aintc_softc *sc; - if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells != 1 || - data->fdt.cells[0] >= A10_INTR_MAX_NIRQS) + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + + daf = (struct intr_map_data_fdt *)data; + if (daf->ncells != 1 || daf->cells[0] >= A10_INTR_MAX_NIRQS) return (EINVAL); sc = device_get_softc(dev); - *isrcp = &sc->isrcs[data->fdt.cells[0]].isrc; + *isrcp = &sc->isrcs[daf->cells[0]].isrc; return (0); } Modified: head/sys/arm/allwinner/aw_nmi.c ============================================================================== --- head/sys/arm/allwinner/aw_nmi.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/allwinner/aw_nmi.c Thu May 5 13:31:19 2016 (r299117) @@ -188,16 +188,18 @@ static int aw_nmi_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct aw_nmi_softc *sc; int error; u_int irq; - sc = device_get_softc(dev); if (data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); - error = aw_nmi_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq, - NULL, NULL); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; + + error = aw_nmi_map_fdt(dev, daf->ncells, daf->cells, &irq, NULL, NULL); if (error == 0) *isrcp = &sc->intr.isrc; @@ -208,6 +210,7 @@ static int aw_nmi_setup_intr(device_t dev, struct intr_irqsrc *isrc, struct resource *res, struct intr_map_data *data) { + struct intr_map_data_fdt *daf; struct aw_nmi_softc *sc; struct aw_nmi_intr *nmi_intr; int error, icfg; @@ -215,14 +218,15 @@ aw_nmi_setup_intr(device_t dev, struct i enum intr_trigger trig; enum intr_polarity pol; - sc = device_get_softc(dev); - nmi_intr = (struct aw_nmi_intr *)isrc; - /* Get config for interrupt. */ if (data == NULL || data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); - error = aw_nmi_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq, - &pol, &trig); + + sc = device_get_softc(dev); + nmi_intr = (struct aw_nmi_intr *)isrc; + daf = (struct intr_map_data_fdt *)data; + + error = aw_nmi_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol, &trig); if (error != 0) return (error); if (nmi_intr->irq != irq) Modified: head/sys/arm/arm/gic.c ============================================================================== --- head/sys/arm/arm/gic.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/arm/gic.c Thu May 5 13:31:19 2016 (r299117) @@ -1006,18 +1006,22 @@ gic_map_intr(device_t dev, struct intr_m enum intr_polarity pol; enum intr_trigger trig; struct arm_gic_softc *sc; +#ifdef FDT + struct intr_map_data_fdt *daf; +#endif sc = device_get_softc(dev); switch (data->type) { #ifdef FDT case INTR_MAP_DATA_FDT: - if (gic_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq, - &pol, &trig) != 0) + daf = (struct intr_map_data_fdt *)data; + if (gic_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol, + &trig) != 0) return (EINVAL); break; #endif default: - return (EINVAL); + return (ENOTSUP); } if (irq >= sc->nirqs) Modified: head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c ============================================================================== --- head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/broadcom/bcm2835/bcm2835_gpio.c Thu May 5 13:31:19 2016 (r299117) @@ -1078,14 +1078,16 @@ bcm_gpio_pic_map_intr(device_t dev, stru { int error; u_int irq; + struct intr_map_data_fdt *daf; struct bcm_gpio_softc *sc; if (data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); sc = device_get_softc(dev); - error = bcm_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, - &irq, NULL); + daf = (struct intr_map_data_fdt *)data; + + error = bcm_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, NULL); if (error == 0) *isrcp = &sc->sc_isrcs[irq].bgi_isrc; return (error); @@ -1127,15 +1129,17 @@ bcm_gpio_pic_setup_intr(device_t dev, st uint32_t bank, reg; struct bcm_gpio_softc *sc; struct bcm_gpio_irqsrc *bgi; + struct intr_map_data_fdt *daf; if (data == NULL || data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); sc = device_get_softc(dev); bgi = (struct bcm_gpio_irqsrc *)isrc; + daf = (struct intr_map_data_fdt *)data; /* Get and check config for an interrupt. */ - if (bcm_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, &irq, + if (bcm_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, ®) != 0 || bgi->bgi_irq != irq) return (EINVAL); Modified: head/sys/arm/broadcom/bcm2835/bcm2835_intr.c ============================================================================== --- head/sys/arm/broadcom/bcm2835/bcm2835_intr.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/broadcom/bcm2835/bcm2835_intr.c Thu May 5 13:31:19 2016 (r299117) @@ -268,14 +268,17 @@ bcm_intc_map_intr(device_t dev, struct i struct intr_irqsrc **isrcp) { u_int irq; + struct intr_map_data_fdt *daf; struct bcm_intc_softc *sc; if (data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); - if (data->fdt.ncells == 1) - irq = data->fdt.cells[0]; - else if (data->fdt.ncells == 2) - irq = data->fdt.cells[0] * 32 + data->fdt.cells[1]; + + daf = (struct intr_map_data_fdt *)data; + if (daf->ncells == 1) + irq = daf->cells[0]; + else if (daf->ncells == 2) + irq = daf->cells[0] * 32 + daf->cells[1]; else return (EINVAL); Modified: head/sys/arm/broadcom/bcm2835/bcm2836.c ============================================================================== --- head/sys/arm/broadcom/bcm2835/bcm2836.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/broadcom/bcm2835/bcm2836.c Thu May 5 13:31:19 2016 (r299117) @@ -461,15 +461,18 @@ static int bcm_lintc_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct bcm_lintc_softc *sc; if (data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); - if (data->fdt.ncells != 1 || data->fdt.cells[0] >= BCM_LINTC_NIRQS) + + daf = (struct intr_map_data_fdt *)data; + if (daf->ncells != 1 || daf->cells[0] >= BCM_LINTC_NIRQS) return (EINVAL); sc = device_get_softc(dev); - *isrcp = &sc->bls_isrcs[data->fdt.cells[0]].bli_isrc; + *isrcp = &sc->bls_isrcs[daf->cells[0]].bli_isrc; return (0); } Modified: head/sys/arm/freescale/imx/imx_gpio.c ============================================================================== --- head/sys/arm/freescale/imx/imx_gpio.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/freescale/imx/imx_gpio.c Thu May 5 13:31:19 2016 (r299117) @@ -225,13 +225,15 @@ gpio_pic_map_intr(device_t dev, struct i { int error; u_int irq; + struct intr_map_data_fdt *daf; struct imx51_gpio_softc *sc; if (data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); - error = gpio_pic_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq, - NULL, NULL); + daf = (struct intr_map_data_fdt *)data; + error = gpio_pic_map_fdt(dev, daf->ncells, daf->cells, &irq, NULL, + NULL); if (error == 0) { sc = device_get_softc(dev); *isrcp = &sc->gpio_pic_irqsrc[irq].gi_isrc; @@ -265,6 +267,7 @@ static int gpio_pic_setup_intr(device_t dev, struct intr_irqsrc *isrc, struct resource *res, struct intr_map_data *data) { + struct intr_map_data_fdt *daf; struct imx51_gpio_softc *sc; struct gpio_irqsrc *gi; int error, icfg; @@ -278,8 +281,9 @@ gpio_pic_setup_intr(device_t dev, struct /* Get config for interrupt. */ if (data == NULL || data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); - error = gpio_pic_map_fdt(dev, data->fdt.ncells, data->fdt.cells, &irq, - &pol, &trig); + daf = (struct intr_map_data_fdt *)data; + error = gpio_pic_map_fdt(dev, daf->ncells, daf->cells, &irq, &pol, + &trig); if (error != 0) return (error); if (gi->gi_irq != irq) Modified: head/sys/arm/mv/mpic.c ============================================================================== --- head/sys/arm/mv/mpic.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/mv/mpic.c Thu May 5 13:31:19 2016 (r299117) @@ -339,15 +339,19 @@ static int mpic_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct mv_mpic_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells !=1 || - data->fdt.cells[0] >= sc->nirqs) + if (daf->ncells !=1 || daf->cells[0] >= sc->nirqs) return (EINVAL); - *isrcp = &sc->mpic_isrcs[data->fdt.cells[0]].mmi_isrc; + *isrcp = &sc->mpic_isrcs[daf->cells[0]].mmi_isrc; return (0); } Modified: head/sys/arm/nvidia/tegra_gpio.c ============================================================================== --- head/sys/arm/nvidia/tegra_gpio.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/nvidia/tegra_gpio.c Thu May 5 13:31:19 2016 (r299117) @@ -579,14 +579,19 @@ tegra_gpio_pic_map_intr(device_t dev, st sc = device_get_softc(dev); - if (data->type == INTR_MAP_DATA_FDT) - rv = tegra_gpio_pic_map_fdt(sc, data->fdt.ncells, - data->fdt.cells, &irq, NULL); - else if (data->type == INTR_MAP_DATA_GPIO) - rv = tegra_gpio_pic_map_gpio(sc, data->gpio.gpio_pin_num, - data->gpio.gpio_pin_flags, data->gpio.gpio_intr_mode, - &irq, NULL); - else + if (data->type == INTR_MAP_DATA_FDT) { + struct intr_map_data_fdt *daf; + + daf = (struct intr_map_data_fdt *)data; + rv = tegra_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, + NULL); + } else if (data->type == INTR_MAP_DATA_GPIO) { + struct intr_map_data_gpio *dag; + + dag = (struct intr_map_data_gpio *)data; + rv = tegra_gpio_pic_map_gpio(sc, dag->gpio_pin_num, + dag->gpio_pin_flags, dag->gpio_intr_mode, &irq, NULL); + } else return (ENOTSUP); if (rv == 0) @@ -648,14 +653,19 @@ tegra_gpio_pic_setup_intr(device_t dev, return (ENOTSUP); /* Get and check config for an interrupt. */ - if (data->type == INTR_MAP_DATA_FDT) - rv = tegra_gpio_pic_map_fdt(sc, data->fdt.ncells, - data->fdt.cells, &irq, &cfgreg); - else if (data->type == INTR_MAP_DATA_GPIO) - rv = tegra_gpio_pic_map_gpio(sc, data->gpio.gpio_pin_num, - data->gpio.gpio_pin_flags, data->gpio.gpio_intr_mode, - &irq, &cfgreg); - else + if (data->type == INTR_MAP_DATA_FDT) { + struct intr_map_data_fdt *daf; + + daf = (struct intr_map_data_fdt *)data; + rv = tegra_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, + &cfgreg); + } else if (data->type == INTR_MAP_DATA_GPIO) { + struct intr_map_data_gpio *dag; + + dag = (struct intr_map_data_gpio *)data; + rv = tegra_gpio_pic_map_gpio(sc, dag->gpio_pin_num, + dag->gpio_pin_flags, dag->gpio_intr_mode, &irq, &cfgreg); + } else return (ENOTSUP); if (rv != 0) return (EINVAL); Modified: head/sys/arm/ti/aintc.c ============================================================================== --- head/sys/arm/ti/aintc.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/ti/aintc.c Thu May 5 13:31:19 2016 (r299117) @@ -178,14 +178,18 @@ static int ti_aintc_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct ti_aintc_softc *sc; - if (data->type != INTR_MAP_DATA_FDT || data->fdt.ncells != 1 || - data->fdt.cells[0] >= INTC_NIRQS) + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + + daf = (struct intr_map_data_fdt *)data; + if (daf->ncells != 1 || daf->cells[0] >= INTC_NIRQS) return (EINVAL); sc = device_get_softc(dev); - *isrcp = &sc->aintc_isrcs[data->fdt.cells[0]].tai_isrc; + *isrcp = &sc->aintc_isrcs[daf->cells[0]].tai_isrc; return (0); } Modified: head/sys/arm/ti/ti_gpio.c ============================================================================== --- head/sys/arm/ti/ti_gpio.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/arm/ti/ti_gpio.c Thu May 5 13:31:19 2016 (r299117) @@ -979,13 +979,15 @@ ti_gpio_pic_map_intr(device_t dev, struc int error; u_int irq; struct ti_gpio_softc *sc; + struct intr_map_data_fdt *daf; if (data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); sc = device_get_softc(dev); - error = ti_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, &irq, - NULL); + daf = (struct intr_map_data_fdt *)data; + + error = ti_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, NULL); if (error == 0) *isrcp = &sc->sc_isrcs[irq].tgi_isrc; return (error); @@ -1027,15 +1029,17 @@ ti_gpio_pic_setup_intr(device_t dev, str uint32_t cfgreg; struct ti_gpio_softc *sc; struct ti_gpio_irqsrc *tgi; + struct intr_map_data_fdt *daf; if (data == NULL || data->type != INTR_MAP_DATA_FDT) return (ENOTSUP); sc = device_get_softc(dev); tgi = (struct ti_gpio_irqsrc *)isrc; + daf = (struct intr_map_data_fdt *)data; /* Get and check config for an interrupt. */ - if (ti_gpio_pic_map_fdt(sc, data->fdt.ncells, data->fdt.cells, &irq, + if (ti_gpio_pic_map_fdt(sc, daf->ncells, daf->cells, &irq, &cfgreg) != 0 || tgi->tgi_irq != irq) return (EINVAL); Modified: head/sys/kern/subr_intr.c ============================================================================== --- head/sys/kern/subr_intr.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/kern/subr_intr.c Thu May 5 13:31:19 2016 (r299117) @@ -128,7 +128,7 @@ struct intr_dev_data { device_t idd_dev; intptr_t idd_xref; u_int idd_irq; - struct intr_map_data idd_data; + struct intr_map_data * idd_data; struct intr_irqsrc * idd_isrc; }; @@ -495,8 +495,10 @@ static struct intr_dev_data * intr_ddata_alloc(u_int extsize) { struct intr_dev_data *ddata; + size_t size; - ddata = malloc(sizeof(*ddata) + extsize, M_INTRNG, M_WAITOK | M_ZERO); + size = sizeof(*ddata); + ddata = malloc(size + extsize, M_INTRNG, M_WAITOK | M_ZERO); mtx_lock(&isrc_table_lock); if (intr_ddata_first_unused >= nitems(intr_ddata_tab)) { @@ -507,6 +509,9 @@ intr_ddata_alloc(u_int extsize) intr_ddata_tab[intr_ddata_first_unused] = ddata; ddata->idd_irq = IRQ_DDATA_BASE + intr_ddata_first_unused++; mtx_unlock(&isrc_table_lock); + + ddata->idd_data = (struct intr_map_data *)((uintptr_t)ddata + size); + ddata->idd_data->size = size; return (ddata); } @@ -534,13 +539,13 @@ intr_ddata_lookup(u_int irq, struct intr ddata = intr_ddata_tab[irq]; if (ddata->idd_isrc == NULL) { error = intr_map_irq(ddata->idd_dev, ddata->idd_xref, - &ddata->idd_data, &irq); + ddata->idd_data, &irq); if (error != 0) return (NULL); ddata->idd_isrc = isrc_lookup(irq); } if (datap != NULL) - *datap = &ddata->idd_data; + *datap = ddata->idd_data; return (ddata->idd_isrc); } @@ -554,17 +559,21 @@ u_int intr_acpi_map_irq(device_t dev, u_int irq, enum intr_polarity pol, enum intr_trigger trig) { + struct intr_map_data_acpi *daa; struct intr_dev_data *ddata; - ddata = intr_ddata_alloc(0); + ddata = intr_ddata_alloc(sizeof(struct intr_map_data_acpi)); if (ddata == NULL) return (INTR_IRQ_INVALID); /* no space left */ ddata->idd_dev = dev; - ddata->idd_data.type = INTR_MAP_DATA_ACPI; - ddata->idd_data.acpi.irq = irq; - ddata->idd_data.acpi.pol = pol; - ddata->idd_data.acpi.trig = trig; + ddata->idd_data->type = INTR_MAP_DATA_ACPI; + + daa = (struct intr_map_data_acpi *)ddata->idd_data; + daa->irq = irq; + daa->pol = pol; + daa->trig = trig; + return (ddata->idd_irq); } #endif @@ -577,19 +586,21 @@ intr_acpi_map_irq(device_t dev, u_int ir u_int intr_fdt_map_irq(phandle_t node, pcell_t *cells, u_int ncells) { + size_t cellsize; struct intr_dev_data *ddata; - u_int cellsize; + struct intr_map_data_fdt *daf; cellsize = ncells * sizeof(*cells); - ddata = intr_ddata_alloc(cellsize); + ddata = intr_ddata_alloc(sizeof(struct intr_map_data_fdt) + cellsize); if (ddata == NULL) return (INTR_IRQ_INVALID); /* no space left */ ddata->idd_xref = (intptr_t)node; - ddata->idd_data.type = INTR_MAP_DATA_FDT; - ddata->idd_data.fdt.ncells = ncells; - ddata->idd_data.fdt.cells = (pcell_t *)(ddata + 1); - memcpy(ddata->idd_data.fdt.cells, cells, cellsize); + ddata->idd_data->type = INTR_MAP_DATA_FDT; + + daf = (struct intr_map_data_fdt *)ddata->idd_data; + daf->ncells = ncells; + memcpy(daf->cells, cells, cellsize); return (ddata->idd_irq); } #endif @@ -602,16 +613,19 @@ u_int intr_gpio_map_irq(device_t dev, u_int pin_num, u_int pin_flags, u_int intr_mode) { struct intr_dev_data *ddata; + struct intr_map_data_gpio *dag; - ddata = intr_ddata_alloc(0); + ddata = intr_ddata_alloc(sizeof(struct intr_map_data_gpio)); if (ddata == NULL) return (INTR_IRQ_INVALID); /* no space left */ ddata->idd_dev = dev; - ddata->idd_data.type = INTR_MAP_DATA_GPIO; - ddata->idd_data.gpio.gpio_pin_num = pin_num; - ddata->idd_data.gpio.gpio_pin_flags = pin_flags; - ddata->idd_data.gpio.gpio_intr_mode = intr_mode; + ddata->idd_data->type = INTR_MAP_DATA_GPIO; + + dag = (struct intr_map_data_gpio *)ddata->idd_data; + dag->gpio_pin_num = pin_num; + dag->gpio_pin_flags = pin_flags; + dag->gpio_intr_mode = intr_mode; return (ddata->idd_irq); } Modified: head/sys/mips/mediatek/mtk_gpio_v1.c ============================================================================== --- head/sys/mips/mediatek/mtk_gpio_v1.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/mips/mediatek/mtk_gpio_v1.c Thu May 5 13:31:19 2016 (r299117) @@ -514,15 +514,19 @@ static int mtk_gpio_pic_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct mtk_gpio_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data == NULL || data->type != INTR_MAP_DATA_FDT || - data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->num_pins) + if (daf->ncells != 1 || daf->cells[0] >= sc->num_pins) return (EINVAL); - *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]); + *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]); return (0); } Modified: head/sys/mips/mediatek/mtk_gpio_v2.c ============================================================================== --- head/sys/mips/mediatek/mtk_gpio_v2.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/mips/mediatek/mtk_gpio_v2.c Thu May 5 13:31:19 2016 (r299117) @@ -511,15 +511,19 @@ static int mtk_gpio_pic_map_intr(device_t dev, struct intr_map_data *data, struct intr_irqsrc **isrcp) { + struct intr_map_data_fdt *daf; struct mtk_gpio_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data == NULL || data->type != INTR_MAP_DATA_FDT || - data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->num_pins) + if (daf->ncells != 1 || daf->cells[0] >= sc->num_pins) return (EINVAL); - *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]); + *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]); return (0); } Modified: head/sys/mips/mediatek/mtk_intr_gic.c ============================================================================== --- head/sys/mips/mediatek/mtk_intr_gic.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/mips/mediatek/mtk_intr_gic.c Thu May 5 13:31:19 2016 (r299117) @@ -265,18 +265,22 @@ mtk_gic_map_intr(device_t dev, struct in struct intr_irqsrc **isrcp) { #ifdef FDT + struct intr_map_data_fdt *daf; struct mtk_gic_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data == NULL || data->type != INTR_MAP_DATA_FDT || - data->fdt.ncells != 3 || data->fdt.cells[1] >= sc->nirqs) + if (daf->ncells != 3 || daf->cells[1] >= sc->nirqs) return (EINVAL); - *isrcp = GIC_INTR_ISRC(sc, data->fdt.cells[1]); + *isrcp = GIC_INTR_ISRC(sc, daf->cells[1]); return (0); #else - return (EINVAL); + return (ENOTSUP); #endif } Modified: head/sys/mips/mediatek/mtk_intr_v1.c ============================================================================== --- head/sys/mips/mediatek/mtk_intr_v1.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/mips/mediatek/mtk_intr_v1.c Thu May 5 13:31:19 2016 (r299117) @@ -275,18 +275,22 @@ mtk_pic_map_intr(device_t dev, struct in struct intr_irqsrc **isrcp) { #ifdef FDT + struct intr_map_data_fdt *daf; struct mtk_pic_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data == NULL || data->type != INTR_MAP_DATA_FDT || - data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->nirqs) + if (daf->ncells != 1 || daf->cells[0] >= sc->nirqs) return (EINVAL); - *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]); + *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]); return (0); #else - return (EINVAL); + return (ENOTSUP); #endif } Modified: head/sys/mips/mediatek/mtk_intr_v2.c ============================================================================== --- head/sys/mips/mediatek/mtk_intr_v2.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/mips/mediatek/mtk_intr_v2.c Thu May 5 13:31:19 2016 (r299117) @@ -270,18 +270,22 @@ mtk_pic_map_intr(device_t dev, struct in struct intr_irqsrc **isrcp) { #ifdef FDT + struct intr_map_data_fdt *daf; struct mtk_pic_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data == NULL || data->type != INTR_MAP_DATA_FDT || - data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->nirqs) + if (daf->ncells != 1 || daf->cells[0] >= sc->nirqs) return (EINVAL); - *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]); + *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]); return (0); #else - return (EINVAL); + return (ENOTSUP); #endif } Modified: head/sys/mips/mips/mips_pic.c ============================================================================== --- head/sys/mips/mips/mips_pic.c Thu May 5 13:23:38 2016 (r299116) +++ head/sys/mips/mips/mips_pic.c Thu May 5 13:31:19 2016 (r299117) @@ -305,18 +305,22 @@ mips_pic_map_intr(device_t dev, struct i struct intr_irqsrc **isrcp) { #ifdef FDT + struct intr_map_data_fdt *daf; struct mips_pic_softc *sc; + if (data->type != INTR_MAP_DATA_FDT) + return (ENOTSUP); + sc = device_get_softc(dev); + daf = (struct intr_map_data_fdt *)data; - if (data == NULL || data->type != INTR_MAP_DATA_FDT || - data->fdt.ncells != 1 || data->fdt.cells[0] >= sc->nirqs) + if (daf->ncells != 1 || daf->cells[0] >= sc->nirqs) return (EINVAL); - *isrcp = PIC_INTR_ISRC(sc, data->fdt.cells[0]); + *isrcp = PIC_INTR_ISRC(sc, daf->cells[0]); return (0); #else - return (EINVAL); + return (ENOTSUP); #endif } Modified: head/sys/sys/intr.h ============================================================================== --- head/sys/sys/intr.h Thu May 5 13:23:38 2016 (r299116) +++ head/sys/sys/intr.h Thu May 5 13:31:19 2016 (r299117) @@ -40,8 +40,14 @@ enum intr_map_data_type { INTR_MAP_DATA_GPIO, }; +struct intr_map_data { + enum intr_map_data_type type; + size_t size; +}; + #ifdef DEV_ACPI struct intr_map_data_acpi { + struct intr_map_data hdr; u_int irq; enum intr_polarity pol; enum intr_trigger trig; @@ -49,30 +55,19 @@ struct intr_map_data_acpi { #endif #ifdef FDT struct intr_map_data_fdt { - u_int ncells; - pcell_t *cells; + struct intr_map_data hdr; + u_int ncells; + pcell_t cells[0]; }; #endif struct intr_map_data_gpio { + struct intr_map_data hdr; u_int gpio_pin_num; u_int gpio_pin_flags; u_int gpio_intr_mode; }; -struct intr_map_data { - enum intr_map_data_type type; - union { -#ifdef DEV_ACPI - struct intr_map_data_acpi acpi; -#endif -#ifdef FDT - struct intr_map_data_fdt fdt; -#endif - struct intr_map_data_gpio gpio; - }; -}; - #ifdef notyet #define INTR_SOLO INTR_MD1 typedef int intr_irq_filter_t(void *arg, struct trapframe *tf);