From owner-svn-src-all@freebsd.org Sat Feb 20 20:08:20 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 0AF02AAF2D3; Sat, 20 Feb 2016 20:08:20 +0000 (UTC) (envelope-from chmeeedalf@gmail.com) Received: from mail-ob0-x231.google.com (mail-ob0-x231.google.com [IPv6:2607:f8b0:4003:c01::231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id BF6D61C28; Sat, 20 Feb 2016 20:08:19 +0000 (UTC) (envelope-from chmeeedalf@gmail.com) Received: by mail-ob0-x231.google.com with SMTP id gc3so134708445obb.3; Sat, 20 Feb 2016 12:08:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=ocTV4pM1o1GBXhpe51Y1e8PFkOm34OVuaSLlJcwE9TU=; b=jnrOnUJwNKSxejfA7g4NnbiUN0nyA54/SCVIjA7fR/ntD2/Q5fgFwBENO63YCs1sCX c++NJPMSVXkhaBjMMuKu06fwhVTFeCoDBHwIoltwfAQ7JyAYJ7rmOKeBhcJIQR1nKVDP 54VgT0XPAiTXSJbuC2IUH0mQbAdeCJB4IujekGUcW2S7DnIAiD/jsxkZgupoO1qOFrS+ InCFsPqQeRmGpdKLidEZKK/3UOeKBzfEZyFDfGJE+ARVdZv/JelKY6T6B9i0Pfa5OtdU 0LUDr1ImbxlB2iYbcPAwHEJCRiOQ4wNnvCHL+L1PbjcQ2YhUoaDw/Y4t21xNui5y5YBv MJ5Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alumni-cwru-edu.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=ocTV4pM1o1GBXhpe51Y1e8PFkOm34OVuaSLlJcwE9TU=; b=P0Ma2PounzLmZtDzfQ1F7z2yjI1xjvwFkDWCDndp4CMCcbm6whT6V1r0F5Pol6W1J8 miL6akeIoJIGtn8lxxAGarAPzTmOevA3FstUEjEMi2aR2NoNdVXY4jo7c7CrLVDcX93j WZ75soJZpfGYWsjCXCbWY5oUuV+C9P5/1cAveQHERQVh3z04uuOlrLjSksARjefb23/K gFa+Fe5hLgFkxwVVTeauHHjg3CBSRFtgYh5xaa2+3Xizme6y9SxLsN+wNr+5HSnH9dhY ZcJjBYgCuDefMbfDg2hFUMCQbCcJJn0MD1f43n20wGbB7ASK61iXPivZPzoY4qlswLR2 2Nbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=ocTV4pM1o1GBXhpe51Y1e8PFkOm34OVuaSLlJcwE9TU=; b=SnrdqMLYTpUdxrJv6lxbZlpUnB0XxED/taZc/P/urHEbg9xfS8p8sVJgWyfhy59yS6 WIhMSSFyC9Tv7++pLZIrJIzYgR2C8hZOr6NeMhExczrF44LXLJlBIQwAK3BtdLOc3MCl WXC2gErjOa2AMiK/kZ3C9cm4n97otlrcDd5VFDyRcE13UDhbjsbsrtwO1/V2w0/F3ydm RRnhZA99ubOLJwD4cf+D8JC9GLPlDJw8vq5lUKSHbhnRuIk0LwaclkBay6mCwUAEOw8p IFcS25bMbIWWqN6jJq/XrLl6lEyMyx2yzWZHgBEBF7oj5+emCJp0P1n/4YycTB8gkxJZ FxIw== X-Gm-Message-State: AG10YOSmUr1G5YyVqtT7EoRUXH/TyGPHDMosOIGd4Xxx1w/lSkPT1O7DyoRCsKoa4HIH8DhgF4SWi66Y3MaNYA== MIME-Version: 1.0 X-Received: by 10.60.116.35 with SMTP id jt3mr17636394oeb.79.1455998899050; Sat, 20 Feb 2016 12:08:19 -0800 (PST) Sender: chmeeedalf@gmail.com Received: by 10.182.33.8 with HTTP; Sat, 20 Feb 2016 12:08:18 -0800 (PST) In-Reply-To: References: <201602181307.u1ID7MeN059064@repo.freebsd.org> Date: Sat, 20 Feb 2016 14:08:18 -0600 X-Google-Sender-Auth: ZypAK6kBWPTTPHup7eEaJFDBAf4 Message-ID: Subject: Re: svn commit: r295756 - in head/sys: conf dev/ofw powerpc/mpc85xx powerpc/powermac powerpc/pseries From: Justin Hibbits To: Zbigniew Bodek Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Type: text/plain; charset=UTF-8 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 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: Sat, 20 Feb 2016 20:08:20 -0000 Thank you, zbb. - Justin On 2/20/16, Zbigniew Bodek wrote: > Hello Justin, > > Reverted in 295837. > I am very sorry for trouble. This will need to return to the drawing > board and I will double check the patch next time. > > Best regards > zbb > > 2016-02-20 5:48 GMT+01:00 Justin Hibbits : >> This was not tinderboxed. I'm getting build failures for powerpc and >> sparc64. Please revert or fix. >> >> Least of which: sys/dev/ofw/ofw_pci.c conflicts with >> sys/powerpc/ofw/ofw_pci.c, which I mentioned in phabricator long ago. >> >> Additionally, several files are missing includes of >> dev/ofw/ofw_bus_subr.h. >> >> One example from tinderbox: >> >> make[5]: >> "/scratch/tmp/jhibbits/obj/powerpc.powerpc/home/jhibbits/head/sys/GENERIC/Makefile" >> line 7308: warning: duplicate script for target "ofw_pci.ln" ignored >> make[5]: >> "/scratch/tmp/jhibbits/obj/powerpc.powerpc/home/jhibbits/head/sys/GENERIC/Makefile" >> line 2150: warning: using previous script for "ofw_pci.ln" defined >> here >> make[5]: >> "/scratch/tmp/jhibbits/obj/powerpc.powerpc/home/jhibbits/head/sys/GENERIC/Makefile" >> line 7311: warning: duplicate script for target "ofw_pci.o" ignored >> make[5]: >> "/scratch/tmp/jhibbits/obj/powerpc.powerpc/home/jhibbits/head/sys/GENERIC/Makefile" >> line 2154: warning: using previous script for "ofw_pci.o" defined here >> make[5]: >> "/scratch/tmp/jhibbits/obj/powerpc.powerpc/home/jhibbits/head/sys/GENERIC/Makefile" >> line 7312: warning: duplicate script for target "ofw_pci.o" ignored >> make[5]: >> "/scratch/tmp/jhibbits/obj/powerpc.powerpc/home/jhibbits/head/sys/GENERIC/Makefile" >> line 2154: warning: using previous script for "ofw_pci.o" defined here >> In file included from >> /home/jhibbits/head/sys/powerpc/powermac/uninorth.c:36: >> /home/jhibbits/head/sys/dev/ofw/ofw_pci.h:144: error: field >> 'sc_pci_iinfo' has incomplete type >> >> >> - Justin >> >> On 2/18/16, Zbigniew Bodek wrote: >>> Author: zbb >>> Date: Thu Feb 18 13:07:21 2016 >>> New Revision: 295756 >>> URL: https://svnweb.freebsd.org/changeset/base/295756 >>> >>> Log: >>> Extract common code from PowerPC's ofw_pci >>> >>> Import portions of the PowerPC OF PCI implementation into >>> new file "ofw_pci.c", common for other platforms. The files ofw_pci.c >>> and >>> ofw_pci.h from sys/powerpc/ofw no longer exist. All required >>> declarations >>> are moved to sys/dev/ofw/ofw_pci.h. >>> >>> This creates a new ofw_pci_write_ivar() function and modifies >>> ofw_pci_nranges(), ofw_pci_read_ivar(), ofw_pci_route_interrupt() >>> methods. >>> Most functions contain existing ppc implementations in the majority >>> unchanged. Now there is no need to have multiple identical copies >>> of methods for various architectures. >>> >>> Submitted by: Marcin Mazurek >>> Obtained from: Semihalf >>> Sponsored by: Annapurna Labs >>> Reviewed by: jhibbits, mmel >>> Differential Revision: https://reviews.freebsd.org/D4879 >>> >>> Added: >>> head/sys/dev/ofw/ofw_pci.c (contents, props changed) >>> Modified: >>> head/sys/conf/files >>> head/sys/dev/ofw/ofw_pci.h >>> head/sys/dev/ofw/ofw_subr.c >>> head/sys/powerpc/mpc85xx/pci_mpc85xx.c >>> head/sys/powerpc/powermac/cpcht.c >>> head/sys/powerpc/powermac/grackle.c >>> head/sys/powerpc/powermac/uninorthpci.c >>> head/sys/powerpc/powermac/uninorthvar.h >>> head/sys/powerpc/pseries/rtas_pci.c >>> >>> Modified: head/sys/conf/files >>> ============================================================================== >>> --- head/sys/conf/files Thu Feb 18 13:00:04 2016 (r295755) >>> +++ head/sys/conf/files Thu Feb 18 13:07:21 2016 (r295756) >>> @@ -2108,6 +2108,7 @@ dev/ofw/ofw_subr.c optional fdt >>> dev/ofw/ofwbus.c optional fdt >>> dev/ofw/openfirm.c optional fdt >>> dev/ofw/openfirmio.c optional fdt >>> +dev/ofw/ofw_pci.c optional fdt pci >>> dev/ow/ow.c optional ow \ >>> dependency "owll_if.h" \ >>> dependency "own_if.h" >>> >>> Added: head/sys/dev/ofw/ofw_pci.c >>> ============================================================================== >>> --- /dev/null 00:00:00 1970 (empty, because file is newly added) >>> +++ head/sys/dev/ofw/ofw_pci.c Thu Feb 18 13:07:21 2016 >>> (r295756) >>> @@ -0,0 +1,622 @@ >>> +/*- >>> + * Copyright (c) 2011 Nathan Whitehorn >>> + * All rights reserved. >>> + * >>> + * Redistribution and use in source and binary forms, with or without >>> + * modification, are permitted provided that the following conditions >>> + * are met: >>> + * 1. Redistributions of source code must retain the above copyright >>> + * notice, this list of conditions and the following disclaimer. >>> + * 2. Redistributions in binary form must reproduce the above copyright >>> + * notice, this list of conditions and the following disclaimer in >>> the >>> + * documentation and/or other materials provided with the >>> distribution. >>> + * >>> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' >>> AND >>> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >>> THE >>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >>> PURPOSE >>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE >>> LIABLE >>> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >>> CONSEQUENTIAL >>> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE >>> GOODS >>> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >>> INTERRUPTION) >>> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, >>> STRICT >>> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN >>> ANY >>> WAY >>> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY >>> OF >>> + * SUCH DAMAGE. >>> + */ >>> + >>> +#include >>> +__FBSDID("$FreeBSD$"); >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include >>> +#include >>> + >>> +#include >>> +#include >>> +#include >>> + >>> +#include >>> +#include >>> + >>> +#include "pcib_if.h" >>> + >>> +/* >>> + * If it is necessary to set another value of this for >>> + * some platforms it should be set at fdt.h file >>> + */ >>> +#ifndef PCI_MAP_INTR >>> +#define PCI_MAP_INTR 4 >>> +#endif >>> + >>> +#define PCI_INTR_PINS 4 >>> + >>> +/* >>> + * bus interface. >>> + */ >>> +static struct resource * ofw_pci_alloc_resource(device_t, device_t, >>> + int, int *, u_long, u_long, u_long, u_int); >>> +static int ofw_pci_release_resource(device_t, device_t, int, int, >>> + struct resource *); >>> +static int ofw_pci_activate_resource(device_t, device_t, int, int, >>> + struct resource *); >>> +static int ofw_pci_deactivate_resource(device_t, device_t, int, int, >>> + struct resource *); >>> +static int ofw_pci_adjust_resource(device_t, device_t, int, >>> + struct resource *, u_long, u_long); >>> + >>> +/* >>> + * pcib interface >>> + */ >>> +static int ofw_pci_maxslots(device_t); >>> + >>> +/* >>> + * ofw_bus interface >>> + */ >>> +static phandle_t ofw_pci_get_node(device_t, device_t); >>> + >>> +/* >>> + * local methods >>> + */ >>> +static int ofw_pci_fill_ranges(phandle_t, struct ofw_pci_range *); >>> + >>> +/* >>> + * Driver methods. >>> + */ >>> +static device_method_t ofw_pci_methods[] = { >>> + >>> + /* Device interface */ >>> + DEVMETHOD(device_attach, ofw_pci_attach), >>> + >>> + /* Bus interface */ >>> + DEVMETHOD(bus_print_child, bus_generic_print_child), >>> + DEVMETHOD(bus_read_ivar, ofw_pci_read_ivar), >>> + DEVMETHOD(bus_write_ivar, ofw_pci_write_ivar), >>> + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), >>> + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), >>> + DEVMETHOD(bus_alloc_resource, ofw_pci_alloc_resource), >>> + DEVMETHOD(bus_release_resource, ofw_pci_release_resource), >>> + DEVMETHOD(bus_activate_resource, >>> ofw_pci_activate_resource), >>> + DEVMETHOD(bus_deactivate_resource, >>> ofw_pci_deactivate_resource), >>> + DEVMETHOD(bus_adjust_resource, ofw_pci_adjust_resource), >>> +#ifdef __powerpc__ >>> + DEVMETHOD(bus_get_bus_tag, ofw_pci_bus_get_bus_tag), >>> +#endif >>> + >>> + /* pcib interface */ >>> + DEVMETHOD(pcib_maxslots, ofw_pci_maxslots), >>> + DEVMETHOD(pcib_route_interrupt, ofw_pci_route_interrupt), >>> + >>> + /* ofw_bus interface */ >>> + DEVMETHOD(ofw_bus_get_node, ofw_pci_get_node), >>> + >>> + DEVMETHOD_END >>> +}; >>> + >>> +DEFINE_CLASS_0(ofw_pci, ofw_pci_driver, ofw_pci_methods, 0); >>> + >>> +int >>> +ofw_pci_init(device_t dev) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + phandle_t node; >>> + u_int32_t busrange[2]; >>> + struct ofw_pci_range *rp; >>> + int error; >>> + struct ofw_pci_cell_info *cell_info; >>> + >>> + node = ofw_bus_get_node(dev); >>> + sc = device_get_softc(dev); >>> + sc->sc_initialized = 1; >>> + sc->sc_range = NULL; >>> + >>> + cell_info = (struct ofw_pci_cell_info *)malloc(sizeof(*cell_info), >>> + M_DEVBUF, M_WAITOK | M_ZERO); >>> + >>> + sc->sc_cell_info = cell_info; >>> + >>> + if (OF_getencprop(node, "bus-range", busrange, sizeof(busrange)) != >>> 8) >>> + busrange[0] = 0; >>> + >>> + sc->sc_dev = dev; >>> + sc->sc_node = node; >>> + sc->sc_bus = busrange[0]; >>> + >>> + if (sc->sc_quirks & OFW_PCI_QUIRK_RANGES_ON_CHILDREN) { >>> + phandle_t c; >>> + int n, i; >>> + >>> + sc->sc_nrange = 0; >>> + for (c = OF_child(node); c != 0; c = OF_peer(c)) { >>> + n = ofw_pci_nranges(c, cell_info); >>> + if (n > 0) >>> + sc->sc_nrange += n; >>> + } >>> + if (sc->sc_nrange == 0) { >>> + error = ENXIO; >>> + goto out; >>> + } >>> + sc->sc_range = malloc(sc->sc_nrange * >>> sizeof(sc->sc_range[0]), >>> + M_DEVBUF, M_WAITOK); >>> + i = 0; >>> + for (c = OF_child(node); c != 0; c = OF_peer(c)) { >>> + n = ofw_pci_fill_ranges(c, &sc->sc_range[i]); >>> + if (n > 0) >>> + i += n; >>> + } >>> + KASSERT(i == sc->sc_nrange, ("range count mismatch")); >>> + } else { >>> + sc->sc_nrange = ofw_pci_nranges(node, cell_info); >>> + if (sc->sc_nrange <= 0) { >>> + device_printf(dev, "could not getranges\n"); >>> + error = ENXIO; >>> + goto out; >>> + } >>> + sc->sc_range = malloc(sc->sc_nrange * >>> sizeof(sc->sc_range[0]), >>> + M_DEVBUF, M_WAITOK); >>> + ofw_pci_fill_ranges(node, sc->sc_range); >>> + } >>> + >>> + sc->sc_io_rman.rm_type = RMAN_ARRAY; >>> + sc->sc_io_rman.rm_descr = "PCI I/O Ports"; >>> + error = rman_init(&sc->sc_io_rman); >>> + if (error) { >>> + device_printf(dev, "rman_init() failed. error = %d\n", >>> error); >>> + goto out; >>> + } >>> + >>> + sc->sc_mem_rman.rm_type = RMAN_ARRAY; >>> + sc->sc_mem_rman.rm_descr = "PCI Memory"; >>> + error = rman_init(&sc->sc_mem_rman); >>> + if (error) { >>> + device_printf(dev, "rman_init() failed. error = %d\n", >>> error); >>> + goto out; >>> + } >>> + >>> + for (rp = sc->sc_range; rp < sc->sc_range + sc->sc_nrange && >>> + rp->pci_hi != 0; rp++) { >>> + error = 0; >>> + >>> + switch (rp->pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) { >>> + case OFW_PCI_PHYS_HI_SPACE_CONFIG: >>> + break; >>> + case OFW_PCI_PHYS_HI_SPACE_IO: >>> + error = rman_manage_region(&sc->sc_io_rman, >>> rp->pci, >>> + rp->pci + rp->size - 1); >>> + break; >>> + case OFW_PCI_PHYS_HI_SPACE_MEM32: >>> + case OFW_PCI_PHYS_HI_SPACE_MEM64: >>> + error = rman_manage_region(&sc->sc_mem_rman, >>> rp->pci, >>> + rp->pci + rp->size - 1); >>> + break; >>> + } >>> + >>> + if (error) { >>> + device_printf(dev, >>> + "rman_manage_region(%x, %#jx, %#jx) failed. " >>> + "error = %d\n", rp->pci_hi & >>> + OFW_PCI_PHYS_HI_SPACEMASK, rp->pci, >>> + rp->pci + rp->size - 1, error); >>> + goto out; >>> + } >>> + } >>> + >>> + ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(cell_t)); >>> + >>> +out: >>> + free(cell_info, M_DEVBUF); >>> + free(sc->sc_range, M_DEVBUF); >>> + rman_fini(&sc->sc_io_rman); >>> + rman_fini(&sc->sc_mem_rman); >>> + >>> + return (error); >>> +} >>> + >>> +int >>> +ofw_pci_attach(device_t dev) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + int error; >>> + >>> + sc = device_get_softc(dev); >>> + if (!sc->sc_initialized) { >>> + error = ofw_pci_init(dev); >>> + if (error) >>> + return (error); >>> + } >>> + >>> + device_add_child(dev, "pci", -1); >>> + return (bus_generic_attach(dev)); >>> +} >>> + >>> +static int >>> +ofw_pci_maxslots(device_t dev) >>> +{ >>> + >>> + return (PCI_SLOTMAX); >>> +} >>> + >>> +int >>> +ofw_pci_route_interrupt(device_t bus, device_t dev, int pin) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + struct ofw_pci_register reg; >>> + uint32_t pintr, mintr[PCI_MAP_INTR]; >>> + int intrcells; >>> + phandle_t iparent; >>> + >>> + sc = device_get_softc(bus); >>> + pintr = pin; >>> + >>> + /* Fabricate imap information in case this isn't an OFW device */ >>> + bzero(®, sizeof(reg)); >>> + reg.phys_hi = (pci_get_bus(dev) << OFW_PCI_PHYS_HI_BUSSHIFT) | >>> + (pci_get_slot(dev) << OFW_PCI_PHYS_HI_DEVICESHIFT) | >>> + (pci_get_function(dev) << OFW_PCI_PHYS_HI_FUNCTIONSHIFT); >>> + >>> + intrcells = ofw_bus_lookup_imap(ofw_bus_get_node(dev), >>> + &sc->sc_pci_iinfo, ®, sizeof(reg), &pintr, sizeof(pintr), >>> + mintr, sizeof(mintr), &iparent); >>> + if (intrcells != 0) { >>> + pintr = ofw_bus_map_intr(dev, iparent, intrcells, mintr); >>> + return (pintr); >>> + } >>> + >>> + /* >>> + * Maybe it's a real interrupt, not an intpin >>> + */ >>> + if (pin > PCI_INTR_PINS) >>> + return (pin); >>> + >>> + device_printf(bus, "could not route pin %d for device %d.%d\n", >>> + pin, pci_get_slot(dev), pci_get_function(dev)); >>> + return (PCI_INVALID_IRQ); >>> +} >>> + >>> +int >>> +ofw_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t >>> *result) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + >>> + sc = device_get_softc(dev); >>> + >>> + switch (which) { >>> + case PCIB_IVAR_DOMAIN: >>> + *result = device_get_unit(dev); >>> + return (0); >>> + case PCIB_IVAR_BUS: >>> + *result = sc->sc_bus; >>> + return (0); >>> + default: >>> + break; >>> + } >>> + >>> + return (ENOENT); >>> +} >>> + >>> +int >>> +ofw_pci_write_ivar(device_t dev, device_t child, int which, uintptr_t >>> value) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + >>> + sc = device_get_softc(dev); >>> + >>> + switch (which) { >>> + case PCIB_IVAR_BUS: >>> + sc->sc_bus = value; >>> + return (0); >>> + default: >>> + break; >>> + } >>> + >>> + return (ENOENT); >>> +} >>> + >>> +int >>> +ofw_pci_nranges(phandle_t node, struct ofw_pci_cell_info *info) >>> +{ >>> + ssize_t nbase_ranges; >>> + >>> + if (info == NULL) >>> + return (-1); >>> + >>> + info->host_address_cells = 1; >>> + info->size_cells = 2; >>> + info->pci_address_cell = 3; >>> + >>> + OF_getencprop(OF_parent(node), "#address-cells", >>> + &(info->host_address_cells), >>> sizeof(info->host_address_cells)); >>> + OF_getencprop(node, "#address-cells", >>> + &(info->pci_address_cell), sizeof(info->pci_address_cell)); >>> + OF_getencprop(node, "#size-cells", &(info->size_cells), >>> + sizeof(info->size_cells)); >>> + >>> + nbase_ranges = OF_getproplen(node, "ranges"); >>> + if (nbase_ranges <= 0) >>> + return (-1); >>> + >>> + return (nbase_ranges / sizeof(cell_t) / >>> + (info->pci_address_cell + info->host_address_cells + >>> + info->size_cells)); >>> +} >>> + >>> +static struct resource * >>> +ofw_pci_alloc_resource(device_t bus, device_t child, int type, int >>> *rid, >>> + rman_res_t start, rman_res_t end, rman_res_t count, u_int flags) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + struct resource *rv; >>> + struct rman *rm; >>> + int needactivate; >>> + >>> + needactivate = flags & RF_ACTIVE; >>> + flags &= ~RF_ACTIVE; >>> + >>> + sc = device_get_softc(bus); >>> + >>> + switch (type) { >>> + case SYS_RES_MEMORY: >>> + rm = &sc->sc_mem_rman; >>> + break; >>> + >>> + case SYS_RES_IOPORT: >>> + rm = &sc->sc_io_rman; >>> + break; >>> + >>> + case SYS_RES_IRQ: >>> + return (bus_alloc_resource(bus, type, rid, start, end, >>> count, >>> + flags)); >>> + >>> + default: >>> + device_printf(bus, "unknown resource request from %s\n", >>> + device_get_nameunit(child)); >>> + return (NULL); >>> + } >>> + >>> + rv = rman_reserve_resource(rm, start, end, count, flags, child); >>> + if (rv == NULL) { >>> + device_printf(bus, "failed to reserve resource for %s\n", >>> + device_get_nameunit(child)); >>> + return (NULL); >>> + } >>> + >>> + rman_set_rid(rv, *rid); >>> + >>> + if (needactivate) { >>> + if (bus_activate_resource(child, type, *rid, rv) != 0) { >>> + device_printf(bus, >>> + "failed to activate resource for %s\n", >>> + device_get_nameunit(child)); >>> + rman_release_resource(rv); >>> + return (NULL); >>> + } >>> + } >>> + >>> + return (rv); >>> +} >>> + >>> +static int >>> +ofw_pci_release_resource(device_t bus, device_t child, int type, int >>> rid, >>> + struct resource *res) >>> +{ >>> + >>> + if (rman_get_flags(res) & RF_ACTIVE) { >>> + int error = bus_deactivate_resource(child, type, rid, >>> res); >>> + if (error) >>> + return error; >>> + } >>> + >>> + return (rman_release_resource(res)); >>> +} >>> + >>> +static int >>> +ofw_pci_activate_resource(device_t bus, device_t child, int type, int >>> rid, >>> + struct resource *res) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + bus_space_handle_t handle; >>> + bus_space_tag_t tag; >>> + int rv; >>> + >>> + sc = device_get_softc(bus); >>> + >>> + if (type == SYS_RES_IRQ) { >>> + return (bus_activate_resource(bus, type, rid, res)); >>> + } >>> + if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { >>> + struct ofw_pci_range *rp; >>> + vm_offset_t start; >>> + int space; >>> + >>> + start = (vm_offset_t)rman_get_start(res); >>> + >>> + /* >>> + * Map this through the ranges list >>> + */ >>> + for (rp = sc->sc_range; rp < sc->sc_range + sc->sc_nrange >>> && >>> + rp->pci_hi != 0; rp++) { >>> + if (start < rp->pci || start >= rp->pci + >>> rp->size) >>> + continue; >>> + >>> + switch (rp->pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) { >>> + case OFW_PCI_PHYS_HI_SPACE_IO: >>> + space = SYS_RES_IOPORT; >>> + break; >>> + case OFW_PCI_PHYS_HI_SPACE_MEM32: >>> + case OFW_PCI_PHYS_HI_SPACE_MEM64: >>> + space = SYS_RES_MEMORY; >>> + break; >>> + default: >>> + space = -1; >>> + } >>> + >>> + if (type == space) { >>> + start += (rp->host - rp->pci); >>> + break; >>> + } >>> + } >>> + >>> + if (bootverbose) >>> + printf("ofw_pci mapdev: start %zx, len %ld\n", >>> start, >>> + rman_get_size(res)); >>> + >>> + tag = BUS_GET_BUS_TAG(child, child); >>> + if (tag == NULL) >>> + return (ENOMEM); >>> + >>> + rman_set_bustag(res, tag); >>> + rv = bus_space_map(tag, start, >>> + rman_get_size(res), 0, &handle); >>> + if (rv != 0) >>> + return (ENOMEM); >>> + >>> + rman_set_bushandle(res, handle); >>> + rman_set_virtual(res, (void *)handle); /* XXX for powerpc >>> only ? */ >>> + } >>> + >>> + return (rman_activate_resource(res)); >>> +} >>> + >>> +#ifdef __powerpc__ >>> +static bus_space_tag_t >>> +ofw_pci_bus_get_bus_tag(device_t bus, device_t child) >>> +{ >>> + >>> + return (&bs_le_tag) >>> +} >>> +#endif >>> + >>> +static int >>> +ofw_pci_deactivate_resource(device_t bus, device_t child, int type, int >>> rid, >>> + struct resource *res) >>> +{ >>> + >>> + /* >>> + * If this is a memory resource, unmap it. >>> + */ >>> + if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) { >>> + u_int32_t psize; >>> + >>> + psize = rman_get_size(res); >>> + pmap_unmapdev((vm_offset_t)rman_get_virtual(res), psize); >>> + } >>> + >>> + return (rman_deactivate_resource(res)); >>> +} >>> + >>> +static int >>> +ofw_pci_adjust_resource(device_t bus, device_t child, int type, >>> + struct resource *res, rman_res_t start, rman_res_t end) >>> +{ >>> + struct rman *rm = NULL; >>> + struct ofw_pci_softc *sc = device_get_softc(bus); >>> + >>> + KASSERT(!(rman_get_flags(res) & RF_ACTIVE), >>> + ("active resources cannot be adjusted")); >>> + if (rman_get_flags(res) & RF_ACTIVE) >>> + return (EINVAL); >>> + >>> + switch (type) { >>> + case SYS_RES_MEMORY: >>> + rm = &sc->sc_mem_rman; >>> + break; >>> + case SYS_RES_IOPORT: >>> + rm = &sc->sc_io_rman; >>> + break; >>> + default: >>> + return (ENXIO); >>> + } >>> + >>> + if (!rman_is_region_manager(res, rm)) >>> + return (EINVAL); >>> + >>> + return (rman_adjust_resource(res, start, end)); >>> +} >>> + >>> +static phandle_t >>> +ofw_pci_get_node(device_t bus, device_t dev) >>> +{ >>> + struct ofw_pci_softc *sc; >>> + >>> + sc = device_get_softc(bus); >>> + /* We only have one child, the PCI bus, which needs our own node. >>> */ >>> + >>> + return (sc->sc_node); >>> +} >>> + >>> +static int >>> +ofw_pci_fill_ranges(phandle_t node, struct ofw_pci_range *ranges) >>> +{ >>> + int host_address_cells = 1, pci_address_cells = 3, size_cells = 2; >>> + cell_t *base_ranges; >>> + ssize_t nbase_ranges; >>> + int nranges; >>> + int i, j, k; >>> + >>> + OF_getencprop(OF_parent(node), "#address-cells", >>> &host_address_cells, >>> + sizeof(host_address_cells)); >>> + OF_getencprop(node, "#address-cells", &pci_address_cells, >>> + sizeof(pci_address_cells)); >>> + OF_getencprop(node, "#size-cells", &size_cells, >>> sizeof(size_cells)); >>> + >>> + nbase_ranges = OF_getproplen(node, "ranges"); >>> + if (nbase_ranges <= 0) >>> + return (-1); >>> + nranges = nbase_ranges / sizeof(cell_t) / >>> + (pci_address_cells + host_address_cells + size_cells); >>> + >>> + base_ranges = malloc(nbase_ranges, M_DEVBUF, M_WAITOK); >>> + OF_getencprop(node, "ranges", base_ranges, nbase_ranges); >>> + >>> + for (i = 0, j = 0; i < nranges; i++) { >>> + ranges[i].pci_hi = base_ranges[j++]; >>> + ranges[i].pci = 0; >>> + for (k = 0; k < pci_address_cells - 1; k++) { >>> + ranges[i].pci <<= 32; >>> + ranges[i].pci |= base_ranges[j++]; >>> + } >>> + ranges[i].host = 0; >>> + for (k = 0; k < host_address_cells; k++) { >>> + ranges[i].host <<= 32; >>> + ranges[i].host |= base_ranges[j++]; >>> + } >>> + ranges[i].size = 0; >>> + for (k = 0; k < size_cells; k++) { >>> + ranges[i].size <<= 32; >>> + ranges[i].size |= base_ranges[j++]; >>> + } >>> + } >>> + >>> + free(base_ranges, M_DEVBUF); >>> + return (nranges); >>> +} >>> >>> Modified: head/sys/dev/ofw/ofw_pci.h >>> ============================================================================== >>> --- head/sys/dev/ofw/ofw_pci.h Thu Feb 18 13:00:04 2016 >>> (r295755) >>> +++ head/sys/dev/ofw/ofw_pci.h Thu Feb 18 13:07:21 2016 >>> (r295756) >>> @@ -82,14 +82,19 @@ >>> #define OFW_PCI_PHYS_HI_SPACE_MEM32 0x02000000 >>> #define OFW_PCI_PHYS_HI_SPACE_MEM64 0x03000000 >>> >>> -#define OFW_PCI_PHYS_HI_BUS(hi) \ >>> +#define OFW_PCI_PHYS_HI_BUS(hi) \ >>> (((hi) & OFW_PCI_PHYS_HI_BUSMASK) >> OFW_PCI_PHYS_HI_BUSSHIFT) >>> -#define OFW_PCI_PHYS_HI_DEVICE(hi) \ >>> +#define OFW_PCI_PHYS_HI_DEVICE(hi) \ >>> (((hi) & OFW_PCI_PHYS_HI_DEVICEMASK) >> >>> OFW_PCI_PHYS_HI_DEVICESHIFT) >>> -#define OFW_PCI_PHYS_HI_FUNCTION(hi) \ >>> +#define OFW_PCI_PHYS_HI_FUNCTION(hi) \ >>> (((hi) & OFW_PCI_PHYS_HI_FUNCTIONMASK) >> >>> OFW_PCI_PHYS_HI_FUNCTIONSHIFT) >>> >>> /* >>> + * Export class definition for inheritance purposes >>> + */ >>> +DECLARE_CLASS(ofw_pci_driver); >>> + >>> +/* >>> * This has the 3 32bit cell values, plus 2 more to make up a 64-bit >>> size. >>> */ >>> struct ofw_pci_register { >>> @@ -100,4 +105,50 @@ struct ofw_pci_register { >>> u_int32_t size_lo; >>> }; >>> >>> +struct ofw_pci_cell_info { >>> + pcell_t host_address_cells; >>> + pcell_t pci_address_cell; >>> + pcell_t size_cells; >>> + }; >>> + >>> +struct ofw_pci_range { >>> + uint32_t pci_hi; >>> + uint64_t pci; >>> + uint64_t host; >>> + uint64_t size; >>> +}; >>> + >>> +/* >>> + * Quirks for some adapters >>> + */ >>> +enum { >>> + OFW_PCI_QUIRK_RANGES_ON_CHILDREN = 1, >>> +}; >>> + >>> +struct ofw_pci_softc { >>> + device_t sc_dev; >>> + phandle_t sc_node; >>> + int sc_bus; >>> + int sc_initialized; >>> + int sc_quirks; >>> + >>> + struct ofw_pci_range *sc_range; >>> + int sc_nrange; >>> + struct ofw_pci_cell_info *sc_cell_info; >>> + >>> + struct rman sc_io_rman; >>> + struct rman sc_mem_rman; >>> + bus_space_tag_t sc_memt; >>> + bus_dma_tag_t sc_dmat; >>> + >>> + struct ofw_bus_iinfo sc_pci_iinfo; >>> +}; >>> + >>> +int ofw_pci_init(device_t); >>> +int ofw_pci_attach(device_t); >>> +int ofw_pci_read_ivar(device_t, device_t, int, uintptr_t *); >>> +int ofw_pci_write_ivar(device_t, device_t, int, uintptr_t); >>> +int ofw_pci_route_interrupt(device_t, device_t, int); >>> +int ofw_pci_nranges(phandle_t, struct ofw_pci_cell_info *); >>> + >>> #endif /* _DEV_OFW_OFW_PCI_H_ */ >>> >>> Modified: head/sys/dev/ofw/ofw_subr.c >>> ============================================================================== >>> --- head/sys/dev/ofw/ofw_subr.c Thu Feb 18 13:00:04 2016 >>> (r295755) >>> +++ head/sys/dev/ofw/ofw_subr.c Thu Feb 18 13:07:21 2016 >>> (r295756) >>> @@ -38,8 +38,9 @@ __FBSDID("$FreeBSD$"); >>> #include >>> >>> #include >>> -#include >>> #include >>> +#include >>> +#include >>> >>> static void >>> get_addr_props(phandle_t node, uint32_t *addrp, uint32_t *sizep, int >>> *pcip) >>> >>> Modified: head/sys/powerpc/mpc85xx/pci_mpc85xx.c >>> ============================================================================== >>> --- head/sys/powerpc/mpc85xx/pci_mpc85xx.c Thu Feb 18 13:00:04 >>> 2016 (r295755) >>> +++ head/sys/powerpc/mpc85xx/pci_mpc85xx.c Thu Feb 18 13:07:21 >>> 2016 (r295756) >>> @@ -55,15 +55,13 @@ __FBSDID("$FreeBSD$"); >>> #include >>> #include >>> >>> -#include >>> #include >>> #include >>> +#include >>> #include >>> #include >>> #include >>> >>> -#include >>> - >>> #include "ofw_bus_if.h" >>> #include "pcib_if.h" >>> >>> >>> Modified: head/sys/powerpc/powermac/cpcht.c >>> ============================================================================== >>> --- head/sys/powerpc/powermac/cpcht.c Thu Feb 18 13:00:04 2016 >>> (r295755) >>> +++ head/sys/powerpc/powermac/cpcht.c Thu Feb 18 13:07:21 2016 >>> (r295756) >>> @@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$"); >>> #include >>> >>> #include >>> -#include >>> >>> #include >>> #include >>> @@ -51,7 +50,7 @@ __FBSDID("$FreeBSD$"); >>> >>> #include >>> #include >>> -#include >>> +#include >>> >>> #include >>> #include >>> >>> Modified: head/sys/powerpc/powermac/grackle.c >>> ============================================================================== >>> --- head/sys/powerpc/powermac/grackle.c Thu Feb 18 13:00:04 2016 >>> (r295755) >>> +++ head/sys/powerpc/powermac/grackle.c Thu Feb 18 13:07:21 2016 >>> (r295756) >>> @@ -37,9 +37,9 @@ __FBSDID("$FreeBSD$"); >>> #include >>> >>> #include >>> -#include >>> #include >>> #include >>> +#include >>> >>> #include >>> #include >>> @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); >>> >>> #include >>> >>> -#include >>> #include >>> >>> #include >>> >>> Modified: head/sys/powerpc/powermac/uninorthpci.c >>> ============================================================================== >>> --- head/sys/powerpc/powermac/uninorthpci.c Thu Feb 18 13:00:04 >>> 2016 (r295755) >>> +++ head/sys/powerpc/powermac/uninorthpci.c Thu Feb 18 13:07:21 >>> 2016 (r295756) >>> @@ -34,9 +34,9 @@ __FBSDID("$FreeBSD$"); >>> #include >>> >>> #include >>> -#include >>> #include >>> #include >>> +#include >>> >>> #include >>> #include >>> @@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$"); >>> >>> #include >>> >>> -#include >>> #include >>> >>> #include >>> >>> Modified: head/sys/powerpc/powermac/uninorthvar.h >>> ============================================================================== >>> --- head/sys/powerpc/powermac/uninorthvar.h Thu Feb 18 13:00:04 >>> 2016 (r295755) >>> +++ head/sys/powerpc/powermac/uninorthvar.h Thu Feb 18 13:07:21 >>> 2016 (r295756) >>> @@ -30,7 +30,6 @@ >>> >>> #include >>> #include >>> -#include >>> >>> struct uninorth_softc { >>> struct ofw_pci_softc pci_sc; >>> >>> Modified: head/sys/powerpc/pseries/rtas_pci.c >>> ============================================================================== >>> --- head/sys/powerpc/pseries/rtas_pci.c Thu Feb 18 13:00:04 2016 >>> (r295755) >>> +++ head/sys/powerpc/pseries/rtas_pci.c Thu Feb 18 13:07:21 2016 >>> (r295756) >>> @@ -34,9 +34,9 @@ __FBSDID("$FreeBSD$"); >>> #include >>> >>> #include >>> -#include >>> #include >>> #include >>> +#include >>> >>> #include >>> #include >>> @@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$"); >>> #include >>> #include >>> >>> -#include >>> #include >>> >>> #include "pcib_if.h" >>> >>> >