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