From owner-svn-src-all@freebsd.org Wed Nov 30 09:47:30 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 41114C5D3B1; Wed, 30 Nov 2016 09:47:30 +0000 (UTC) (envelope-from andrew@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 1DFDE1944; Wed, 30 Nov 2016 09:47:30 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id uAU9lTM4058214; Wed, 30 Nov 2016 09:47:29 GMT (envelope-from andrew@FreeBSD.org) Received: (from andrew@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id uAU9lTPM058212; Wed, 30 Nov 2016 09:47:29 GMT (envelope-from andrew@FreeBSD.org) Message-Id: <201611300947.uAU9lTPM058212@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: andrew set sender to andrew@FreeBSD.org using -f From: Andrew Turner Date: Wed, 30 Nov 2016 09:47:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r309323 - head/sys/arm/arm 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.23 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: Wed, 30 Nov 2016 09:47:30 -0000 Author: andrew Date: Wed Nov 30 09:47:29 2016 New Revision: 309323 URL: https://svnweb.freebsd.org/changeset/base/309323 Log: Move the FDT specific parts of the GIC diver softc to the FDT attachment. This allows the driver to be built in a kernel with no FDT support, e.g. on arm64 with just ACPI. Obtained from: ABT Systems Ltd Sponsored by: The FreeBSD Foundation Modified: head/sys/arm/arm/gic.h head/sys/arm/arm/gic_fdt.c Modified: head/sys/arm/arm/gic.h ============================================================================== --- head/sys/arm/arm/gic.h Wed Nov 30 09:45:18 2016 (r309322) +++ head/sys/arm/arm/gic.h Wed Nov 30 09:47:29 2016 (r309323) @@ -75,9 +75,6 @@ struct arm_gic_softc { #endif #ifdef INTRNG - /* FDT child data */ - pcell_t addr_cells; - pcell_t size_cells; int nranges; struct arm_gic_range * ranges; #endif Modified: head/sys/arm/arm/gic_fdt.c ============================================================================== --- head/sys/arm/arm/gic_fdt.c Wed Nov 30 09:45:18 2016 (r309322) +++ head/sys/arm/arm/gic_fdt.c Wed Nov 30 09:47:29 2016 (r309323) @@ -60,6 +60,12 @@ struct arm_gic_devinfo { }; #endif +struct arm_gic_fdt_softc { + struct arm_gic_softc base; + pcell_t addr_cells; + pcell_t size_cells; +}; + static device_probe_t gic_fdt_probe; static device_attach_t gic_fdt_attach; static ofw_bus_get_devinfo_t gic_ofw_get_devinfo; @@ -102,7 +108,7 @@ static device_method_t gic_fdt_methods[] }; DEFINE_CLASS_1(gic, gic_fdt_driver, gic_fdt_methods, - sizeof(struct arm_gic_softc), arm_gic_driver); + sizeof(struct arm_gic_fdt_softc), arm_gic_driver); static devclass_t gic_fdt_devclass; @@ -128,7 +134,7 @@ static int gic_fdt_attach(device_t dev) { #ifdef INTRNG - struct arm_gic_softc *sc = device_get_softc(dev); + struct arm_gic_fdt_softc *sc = device_get_softc(dev); phandle_t pxref; intptr_t xref; #endif @@ -164,14 +170,14 @@ gic_fdt_attach(device_t dev) goto cleanup; } } else { - if (sc->gic_res[2] == NULL) { + if (sc->base.gic_res[2] == NULL) { device_printf(dev, "not root PIC must have defined interrupt\n"); intr_pic_deregister(dev, xref); goto cleanup; } - if (bus_setup_intr(dev, sc->gic_res[2], INTR_TYPE_CLK, - arm_gic_intr, NULL, sc, &sc->gic_intrhand)) { + if (bus_setup_intr(dev, sc->base.gic_res[2], INTR_TYPE_CLK, + arm_gic_intr, NULL, sc, &sc->base.gic_intrhand)) { device_printf(dev, "could not setup irq handler\n"); intr_pic_deregister(dev, xref); goto cleanup; @@ -209,7 +215,7 @@ gic_fdt_get_resource_list(device_t bus, } static int -arm_gic_fill_ranges(phandle_t node, struct arm_gic_softc *sc) +arm_gic_fill_ranges(phandle_t node, struct arm_gic_fdt_softc *sc) { pcell_t host_cells; cell_t *base_ranges; @@ -229,42 +235,42 @@ arm_gic_fill_ranges(phandle_t node, stru nbase_ranges = OF_getproplen(node, "ranges"); if (nbase_ranges < 0) return (-1); - sc->nranges = nbase_ranges / sizeof(cell_t) / + sc->base.nranges = nbase_ranges / sizeof(cell_t) / (sc->addr_cells + host_cells + sc->size_cells); - if (sc->nranges == 0) + if (sc->base.nranges == 0) return (0); - sc->ranges = malloc(sc->nranges * sizeof(sc->ranges[0]), + sc->base.ranges = malloc(sc->base.nranges * sizeof(sc->base.ranges[0]), M_DEVBUF, M_WAITOK); base_ranges = malloc(nbase_ranges, M_DEVBUF, M_WAITOK); OF_getencprop(node, "ranges", base_ranges, nbase_ranges); - for (i = 0, j = 0; i < sc->nranges; i++) { - sc->ranges[i].bus = 0; + for (i = 0, j = 0; i < sc->base.nranges; i++) { + sc->base.ranges[i].bus = 0; for (k = 0; k < sc->addr_cells; k++) { - sc->ranges[i].bus <<= 32; - sc->ranges[i].bus |= base_ranges[j++]; + sc->base.ranges[i].bus <<= 32; + sc->base.ranges[i].bus |= base_ranges[j++]; } - sc->ranges[i].host = 0; + sc->base.ranges[i].host = 0; for (k = 0; k < host_cells; k++) { - sc->ranges[i].host <<= 32; - sc->ranges[i].host |= base_ranges[j++]; + sc->base.ranges[i].host <<= 32; + sc->base.ranges[i].host |= base_ranges[j++]; } - sc->ranges[i].size = 0; + sc->base.ranges[i].size = 0; for (k = 0; k < sc->size_cells; k++) { - sc->ranges[i].size <<= 32; - sc->ranges[i].size |= base_ranges[j++]; + sc->base.ranges[i].size <<= 32; + sc->base.ranges[i].size |= base_ranges[j++]; } } free(base_ranges, M_DEVBUF); - return (sc->nranges); + return (sc->base.nranges); } static bool arm_gic_add_children(device_t dev) { - struct arm_gic_softc *sc; + struct arm_gic_fdt_softc *sc; struct arm_gic_devinfo *dinfo; phandle_t child, node; device_t cdev;