1299241Sadrian/*- 2299241Sadrian * Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org> 3299241Sadrian * All rights reserved. 4299241Sadrian * 5299241Sadrian * Redistribution and use in source and binary forms, with or without 6299241Sadrian * modification, are permitted provided that the following conditions 7299241Sadrian * are met: 8299241Sadrian * 1. Redistributions of source code must retain the above copyright 9299241Sadrian * notice, this list of conditions and the following disclaimer, 10299241Sadrian * without modification. 11299241Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12299241Sadrian * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 13299241Sadrian * redistribution must be conditioned upon including a substantially 14299241Sadrian * similar Disclaimer requirement for further binary redistribution. 15299241Sadrian * 16299241Sadrian * NO WARRANTY 17299241Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18299241Sadrian * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19299241Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 20299241Sadrian * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 21299241Sadrian * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 22299241Sadrian * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23299241Sadrian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24299241Sadrian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25299241Sadrian * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26299241Sadrian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27299241Sadrian * THE POSSIBILITY OF SUCH DAMAGES. 28299241Sadrian */ 29299241Sadrian 30299241Sadrian#include <sys/cdefs.h> 31299241Sadrian__FBSDID("$FreeBSD$"); 32299241Sadrian 33299241Sadrian/* 34299241Sadrian * BHNDB PCI SPROM driver. 35299241Sadrian * 36299241Sadrian * Provides support for early PCI bridge cores that vend SPROM CSRs 37299241Sadrian * via PCI configuration space. 38299241Sadrian */ 39299241Sadrian 40299241Sadrian#include <sys/param.h> 41299241Sadrian#include <sys/kernel.h> 42299241Sadrian#include <sys/bus.h> 43299241Sadrian#include <sys/limits.h> 44299241Sadrian#include <sys/malloc.h> 45299241Sadrian#include <sys/module.h> 46299241Sadrian#include <sys/systm.h> 47299241Sadrian 48299241Sadrian#include <dev/pci/pcireg.h> 49299241Sadrian#include <dev/pci/pcivar.h> 50299241Sadrian 51299241Sadrian#include <dev/bhnd/bhnd.h> 52299241Sadrian#include <dev/bhnd/cores/pci/bhnd_pci_hostbvar.h> 53299241Sadrian#include <dev/bhnd/nvram/bhnd_spromvar.h> 54299241Sadrian 55299241Sadrian#include "bhnd_nvram_if.h" 56300548Sadrian 57299241Sadrian#include "bhndb_pcireg.h" 58299241Sadrian#include "bhndb_pcivar.h" 59299241Sadrian 60299241Sadrianstatic int 61299241Sadrianbhndb_pci_sprom_probe(device_t dev) 62299241Sadrian{ 63299241Sadrian device_t bridge, bus; 64300548Sadrian int error; 65299241Sadrian 66299241Sadrian /* Our parent must be a PCI-BHND bridge with an attached bhnd bus */ 67299241Sadrian bridge = device_get_parent(dev); 68299241Sadrian if (device_get_driver(bridge) != &bhndb_pci_driver) 69299241Sadrian return (ENXIO); 70299241Sadrian 71299241Sadrian bus = device_find_child(bridge, devclass_get_name(bhnd_devclass), 0); 72299241Sadrian if (bus == NULL) 73299241Sadrian return (ENXIO); 74299241Sadrian 75300548Sadrian /* Defer to default driver implementation */ 76300548Sadrian if ((error = bhnd_sprom_probe(dev)) > 0) 77300548Sadrian return (error); 78299241Sadrian 79299241Sadrian return (BUS_PROBE_NOWILDCARD); 80299241Sadrian} 81299241Sadrian 82299241Sadrian 83299241Sadrianstatic device_method_t bhndb_pci_sprom_methods[] = { 84299241Sadrian /* Device interface */ 85299241Sadrian DEVMETHOD(device_probe, bhndb_pci_sprom_probe), 86299241Sadrian DEVMETHOD_END 87299241Sadrian}; 88299241Sadrian 89300548SadrianDEFINE_CLASS_1(bhnd_nvram, bhndb_pci_sprom_driver, bhndb_pci_sprom_methods, sizeof(struct bhnd_sprom_softc), bhnd_sprom_driver); 90299241Sadrian 91299241SadrianDRIVER_MODULE(bhndb_pci_sprom, bhndb, bhndb_pci_sprom_driver, bhnd_nvram_devclass, NULL, NULL); 92299241SadrianMODULE_DEPEND(bhndb_pci_sprom, bhnd, 1, 1, 1); 93300548SadrianMODULE_DEPEND(bhndb_pci_sprom, bhnd_sprom, 1, 1, 1); 94299241SadrianMODULE_VERSION(bhndb_pci_sprom, 1); 95