xref: /freebsd/sys/dev/bhnd/bhndb/bhndb_if.m (revision 031beb4e239bfce798af17f5fe8dba8bcaf13d99)
14ad7e9b0SAdrian Chadd#-
2*caeff9a3SLandon J. Fuller# Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org>
3*caeff9a3SLandon J. Fuller# Copyright (c) 2017 The FreeBSD Foundation
44ad7e9b0SAdrian Chadd# All rights reserved.
54ad7e9b0SAdrian Chadd#
6*caeff9a3SLandon J. Fuller# Portions of this software were developed by Landon Fuller
7*caeff9a3SLandon J. Fuller# under sponsorship from the FreeBSD Foundation.
8*caeff9a3SLandon J. Fuller#
94ad7e9b0SAdrian Chadd# Redistribution and use in source and binary forms, with or without
104ad7e9b0SAdrian Chadd# modification, are permitted provided that the following conditions
114ad7e9b0SAdrian Chadd# are met:
124ad7e9b0SAdrian Chadd# 1. Redistributions of source code must retain the above copyright
134ad7e9b0SAdrian Chadd#    notice, this list of conditions and the following disclaimer.
144ad7e9b0SAdrian Chadd# 2. Redistributions in binary form must reproduce the above copyright
154ad7e9b0SAdrian Chadd#    notice, this list of conditions and the following disclaimer in the
164ad7e9b0SAdrian Chadd#    documentation and/or other materials provided with the distribution.
174ad7e9b0SAdrian Chadd#
184ad7e9b0SAdrian Chadd# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
194ad7e9b0SAdrian Chadd# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
204ad7e9b0SAdrian Chadd# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
214ad7e9b0SAdrian Chadd# IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
224ad7e9b0SAdrian Chadd# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
234ad7e9b0SAdrian Chadd# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
244ad7e9b0SAdrian Chadd# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
254ad7e9b0SAdrian Chadd# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
264ad7e9b0SAdrian Chadd# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
274ad7e9b0SAdrian Chadd# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284ad7e9b0SAdrian Chadd#
294ad7e9b0SAdrian Chadd
304ad7e9b0SAdrian Chadd#include <sys/param.h>
314ad7e9b0SAdrian Chadd#include <sys/bus.h>
324ad7e9b0SAdrian Chadd
334ad7e9b0SAdrian Chadd#include <machine/bus.h>
344ad7e9b0SAdrian Chadd#include <sys/rman.h>
354ad7e9b0SAdrian Chadd#include <machine/resource.h>
364ad7e9b0SAdrian Chadd
374ad7e9b0SAdrian Chadd#include <dev/bhnd/bhnd.h>
384ad7e9b0SAdrian Chadd
394ad7e9b0SAdrian Chadd#
404ad7e9b0SAdrian Chadd# bhndb bridge device interface.
414ad7e9b0SAdrian Chadd#
424ad7e9b0SAdrian Chadd
434ad7e9b0SAdrian ChaddINTERFACE bhndb;
444ad7e9b0SAdrian Chadd
454ad7e9b0SAdrian ChaddHEADER {
46*caeff9a3SLandon J. Fuller	struct bhndb_intr_isrc;
474ad7e9b0SAdrian Chadd	struct bhndb_regwin;
484ad7e9b0SAdrian Chadd	struct bhndb_hw;
494ad7e9b0SAdrian Chadd	struct bhndb_hw_priority;
504ad7e9b0SAdrian Chadd}
514ad7e9b0SAdrian Chadd
524ad7e9b0SAdrian ChaddCODE {
534ad7e9b0SAdrian Chadd	#include <sys/systm.h>
544ad7e9b0SAdrian Chadd	#include <dev/bhnd/bhndb/bhndbvar.h>
554ad7e9b0SAdrian Chadd
564ad7e9b0SAdrian Chadd	static const struct bhnd_chipid *
574ad7e9b0SAdrian Chadd	bhndb_null_get_chipid(device_t dev, device_t child)
584ad7e9b0SAdrian Chadd	{
594ad7e9b0SAdrian Chadd		panic("bhndb_get_chipid unimplemented");
604ad7e9b0SAdrian Chadd	}
614ad7e9b0SAdrian Chadd
624ad7e9b0SAdrian Chadd	static int
63d567592bSAdrian Chadd	bhndb_null_populate_board_info(device_t dev, device_t child,
64d567592bSAdrian Chadd	    struct bhnd_board_info *info)
65d567592bSAdrian Chadd	{
66d567592bSAdrian Chadd		panic("bhndb_populate_board_info unimplemented");
67d567592bSAdrian Chadd	}
68d567592bSAdrian Chadd
69d567592bSAdrian Chadd	static int
7063fb0e82SLandon J. Fuller	bhndb_null_is_core_disabled(device_t dev, device_t child,
7163fb0e82SLandon J. Fuller	    struct bhnd_core_info *core)
7263fb0e82SLandon J. Fuller	{
7363fb0e82SLandon J. Fuller		panic("bhndb_is_core_disabled unimplemented");
7463fb0e82SLandon J. Fuller	}
7563fb0e82SLandon J. Fuller
7663fb0e82SLandon J. Fuller	static int
77111d7cb2SLandon J. Fuller	bhndb_null_get_hostb_core(device_t dev, device_t child,
78111d7cb2SLandon J. Fuller	    struct bhnd_core_info *core)
794ad7e9b0SAdrian Chadd	{
80111d7cb2SLandon J. Fuller		panic("bhndb_get_hostb_core unimplemented");
81d9352570SAdrian Chadd	}
82d9352570SAdrian Chadd
834ad7e9b0SAdrian Chadd	static void
844ad7e9b0SAdrian Chadd	bhndb_null_suspend_resource(device_t dev, device_t child, int type,
854ad7e9b0SAdrian Chadd	    struct resource *r)
864ad7e9b0SAdrian Chadd	{
874ad7e9b0SAdrian Chadd		panic("bhndb_suspend_resource unimplemented");
884ad7e9b0SAdrian Chadd	}
894ad7e9b0SAdrian Chadd
904ad7e9b0SAdrian Chadd	static int
914ad7e9b0SAdrian Chadd	bhndb_null_resume_resource(device_t dev, device_t child, int type,
924ad7e9b0SAdrian Chadd	    struct resource *r)
934ad7e9b0SAdrian Chadd	{
944ad7e9b0SAdrian Chadd		panic("bhndb_resume_resource unimplemented");
954ad7e9b0SAdrian Chadd	}
964ad7e9b0SAdrian Chadd
974ad7e9b0SAdrian Chadd	static int
98*caeff9a3SLandon J. Fuller	bhndb_null_route_interrupts(device_t dev, device_t child)
99*caeff9a3SLandon J. Fuller	{
100*caeff9a3SLandon J. Fuller		panic("bhndb_route_interrupts unimplemented");
101*caeff9a3SLandon J. Fuller	}
102*caeff9a3SLandon J. Fuller
103*caeff9a3SLandon J. Fuller	static int
1044ad7e9b0SAdrian Chadd	bhndb_null_set_window_addr(device_t dev,
1054ad7e9b0SAdrian Chadd	    const struct bhndb_regwin *rw, bhnd_addr_t addr)
1064ad7e9b0SAdrian Chadd	{
1074ad7e9b0SAdrian Chadd		panic("bhndb_set_window_addr unimplemented");
1084ad7e9b0SAdrian Chadd	}
109*caeff9a3SLandon J. Fuller
110*caeff9a3SLandon J. Fuller	static int
111*caeff9a3SLandon J. Fuller	bhndb_null_map_intr_isrc(device_t dev, struct resource *irq,
112*caeff9a3SLandon J. Fuller	    struct bhndb_intr_isrc **isrc)
113*caeff9a3SLandon J. Fuller	{
114*caeff9a3SLandon J. Fuller		panic("bhndb_map_intr_isrc unimplemented");
115*caeff9a3SLandon J. Fuller	}
1164ad7e9b0SAdrian Chadd}
1174ad7e9b0SAdrian Chadd
1184ad7e9b0SAdrian Chadd/**
1194ad7e9b0SAdrian Chadd * Return the chip identification information for @p child.
1204ad7e9b0SAdrian Chadd *
1214ad7e9b0SAdrian Chadd * @param dev The parent device of @p child.
1224ad7e9b0SAdrian Chadd * @param child The bhndb-attached device.
1234ad7e9b0SAdrian Chadd */
1244ad7e9b0SAdrian ChaddMETHOD const struct bhnd_chipid * get_chipid {
1254ad7e9b0SAdrian Chadd	device_t dev;
1264ad7e9b0SAdrian Chadd	device_t child;
1274ad7e9b0SAdrian Chadd} DEFAULT bhndb_null_get_chipid;
1284ad7e9b0SAdrian Chadd
1294ad7e9b0SAdrian Chadd/**
130d567592bSAdrian Chadd * Populate @p info with board info known only to the bridge,
131d567592bSAdrian Chadd * deferring to any existing initialized fields in @p info.
132d567592bSAdrian Chadd *
133d567592bSAdrian Chadd * @param dev The parent device of @p child.
134d567592bSAdrian Chadd * @param child The bhndb-attached device.
135d567592bSAdrian Chadd * @param[in,out] info A board info structure previously initialized with any
136d567592bSAdrian Chadd * information available from NVRAM.
137d567592bSAdrian Chadd */
138d567592bSAdrian ChaddMETHOD int populate_board_info {
139d567592bSAdrian Chadd	device_t dev;
140d567592bSAdrian Chadd	device_t child;
141d567592bSAdrian Chadd	struct bhnd_board_info *info;
142d567592bSAdrian Chadd} DEFAULT bhndb_null_populate_board_info;
143d567592bSAdrian Chadd
144d567592bSAdrian Chadd/**
14563fb0e82SLandon J. Fuller * Return true if the hardware required by @p core is unpopulated or
14663fb0e82SLandon J. Fuller * otherwise unusable.
14763fb0e82SLandon J. Fuller *
14863fb0e82SLandon J. Fuller * In some cases, the core's pins may be left floating, or the hardware
14963fb0e82SLandon J. Fuller * may otherwise be non-functional; this method allows the parent device
15063fb0e82SLandon J. Fuller * to explicitly specify whether @p core should be disabled.
15163fb0e82SLandon J. Fuller *
15263fb0e82SLandon J. Fuller * @param dev The parent device of @p child.
15363fb0e82SLandon J. Fuller * @param child The attached bhnd device.
15463fb0e82SLandon J. Fuller * @param core A core discovered on @p child.
15563fb0e82SLandon J. Fuller */
15663fb0e82SLandon J. FullerMETHOD bool is_core_disabled {
15763fb0e82SLandon J. Fuller	device_t dev;
15863fb0e82SLandon J. Fuller	device_t child;
15963fb0e82SLandon J. Fuller	struct bhnd_core_info *core;
16063fb0e82SLandon J. Fuller} DEFAULT bhndb_null_is_core_disabled;
16163fb0e82SLandon J. Fuller
16263fb0e82SLandon J. Fuller/**
163111d7cb2SLandon J. Fuller * Get the host bridge core info for the attached bhnd bus.
1644ad7e9b0SAdrian Chadd *
1654ad7e9b0SAdrian Chadd * @param	dev	The bridge device.
1664ad7e9b0SAdrian Chadd * @param	child	The bhnd bus device attached to @p dev.
167111d7cb2SLandon J. Fuller * @param[out]	core	Will be populated with the host bridge core info, if
168111d7cb2SLandon J. Fuller *			found.
169d9352570SAdrian Chadd *
170111d7cb2SLandon J. Fuller * @retval 0		success
171111d7cb2SLandon J. Fuller * @retval ENOENT	No host bridge core found.
172111d7cb2SLandon J. Fuller * @retval non-zero	If locating the host bridge core otherwise fails, a
173111d7cb2SLandon J. Fuller *			regular UNIX error code should be returned.
174d9352570SAdrian Chadd */
175111d7cb2SLandon J. FullerMETHOD int get_hostb_core {
176d9352570SAdrian Chadd	device_t dev;
177d9352570SAdrian Chadd	device_t child;
178111d7cb2SLandon J. Fuller	struct bhnd_core_info *core;
179111d7cb2SLandon J. Fuller} DEFAULT bhndb_null_get_hostb_core;
180d9352570SAdrian Chadd
181d9352570SAdrian Chadd/**
1824ad7e9b0SAdrian Chadd * Mark a resource as 'suspended', gauranteeing to the bridge that no
1834ad7e9b0SAdrian Chadd * further use of the resource will be made until BHNDB_RESUME_RESOURCE()
1844ad7e9b0SAdrian Chadd * is called.
1854ad7e9b0SAdrian Chadd *
1864ad7e9b0SAdrian Chadd * Bridge resources consumed by the reference may be released; these will
1874ad7e9b0SAdrian Chadd * be reacquired if BHNDB_RESUME_RESOURCE() completes successfully.
1884ad7e9b0SAdrian Chadd *
1894ad7e9b0SAdrian Chadd * Requests to suspend a suspended resource will be ignored.
1904ad7e9b0SAdrian Chadd *
1914ad7e9b0SAdrian Chadd * @param dev The bridge device.
1924ad7e9b0SAdrian Chadd * @param child The child device requesting resource suspension. This does
1934ad7e9b0SAdrian Chadd * not need to be the owner of @p r.
1944ad7e9b0SAdrian Chadd * @param type The resource type.
1954ad7e9b0SAdrian Chadd * @param r The resource to be suspended.
1964ad7e9b0SAdrian Chadd */
1974ad7e9b0SAdrian ChaddMETHOD void suspend_resource {
1984ad7e9b0SAdrian Chadd	device_t dev;
1994ad7e9b0SAdrian Chadd	device_t child;
2004ad7e9b0SAdrian Chadd	int type;
2014ad7e9b0SAdrian Chadd	struct resource *r;
2024ad7e9b0SAdrian Chadd} DEFAULT bhndb_null_suspend_resource;
2034ad7e9b0SAdrian Chadd
2044ad7e9b0SAdrian Chadd/**
2054ad7e9b0SAdrian Chadd * Attempt to re-enable a resource previously suspended by
2064ad7e9b0SAdrian Chadd * BHNDB_SUSPEND_RESOURCE().
2074ad7e9b0SAdrian Chadd *
2084ad7e9b0SAdrian Chadd * Bridge resources required by the reference may not be available, in which
2094ad7e9b0SAdrian Chadd * case an error will be returned and the resource mapped by @p r must not be
2104ad7e9b0SAdrian Chadd * used in any capacity.
2114ad7e9b0SAdrian Chadd *
2124ad7e9b0SAdrian Chadd * Requests to resume a non-suspended resource will be ignored.
2134ad7e9b0SAdrian Chadd *
2144ad7e9b0SAdrian Chadd * @param dev The bridge device.
2154ad7e9b0SAdrian Chadd * @param child The child device requesting resource suspension. This does
2164ad7e9b0SAdrian Chadd * not need to be the owner of @p r.
2174ad7e9b0SAdrian Chadd * @param type The resource type.
2184ad7e9b0SAdrian Chadd * @param r The resource to be suspended.
2194ad7e9b0SAdrian Chadd */
2204ad7e9b0SAdrian ChaddMETHOD int resume_resource {
2214ad7e9b0SAdrian Chadd	device_t dev;
2224ad7e9b0SAdrian Chadd	device_t child;
2234ad7e9b0SAdrian Chadd	int type;
2244ad7e9b0SAdrian Chadd	struct resource *r;
2254ad7e9b0SAdrian Chadd} DEFAULT bhndb_null_resume_resource;
2264ad7e9b0SAdrian Chadd
2274ad7e9b0SAdrian Chadd/**
228*caeff9a3SLandon J. Fuller * Enable bridge-level interrupt routing for @p child.
229*caeff9a3SLandon J. Fuller *
230*caeff9a3SLandon J. Fuller * @param dev The bridge device.
231*caeff9a3SLandon J. Fuller * @param child The bhnd child device for which interrupts should be routed.
232*caeff9a3SLandon J. Fuller */
233*caeff9a3SLandon J. FullerMETHOD int route_interrupts {
234*caeff9a3SLandon J. Fuller	device_t dev;
235*caeff9a3SLandon J. Fuller	device_t child;
236*caeff9a3SLandon J. Fuller} DEFAULT bhndb_null_route_interrupts;
237*caeff9a3SLandon J. Fuller
238*caeff9a3SLandon J. Fuller/**
2394ad7e9b0SAdrian Chadd * Set a given register window's base address.
2404ad7e9b0SAdrian Chadd *
2414ad7e9b0SAdrian Chadd * @param dev The bridge device.
2424ad7e9b0SAdrian Chadd * @param win The register window.
2434ad7e9b0SAdrian Chadd * @param addr The address to be configured for @p win.
2444ad7e9b0SAdrian Chadd *
2454ad7e9b0SAdrian Chadd * @retval 0 success
2464ad7e9b0SAdrian Chadd * @retval ENODEV The provided @p win is not memory-mapped on the bus or does
2474ad7e9b0SAdrian Chadd * not support setting a base address.
2484ad7e9b0SAdrian Chadd * @retval non-zero failure
2494ad7e9b0SAdrian Chadd */
2504ad7e9b0SAdrian ChaddMETHOD int set_window_addr {
2514ad7e9b0SAdrian Chadd	device_t dev;
2524ad7e9b0SAdrian Chadd	const struct bhndb_regwin *win;
2534ad7e9b0SAdrian Chadd	bhnd_addr_t addr;
2544ad7e9b0SAdrian Chadd} DEFAULT bhndb_null_set_window_addr;
255*caeff9a3SLandon J. Fuller
256*caeff9a3SLandon J. Fuller/**
257*caeff9a3SLandon J. Fuller * Map a bridged interrupt resource to its corresponding host interrupt source,
258*caeff9a3SLandon J. Fuller * if any.
259*caeff9a3SLandon J. Fuller *
260*caeff9a3SLandon J. Fuller * @param dev The bridge device.
261*caeff9a3SLandon J. Fuller * @param irq The bridged interrupt resource.
262*caeff9a3SLandon J. Fuller * @param[out] isrc The host interrupt source to which the bridged interrupt
263*caeff9a3SLandon J. Fuller * is routed.
264*caeff9a3SLandon J. Fuller *
265*caeff9a3SLandon J. Fuller * @retval 0 success
266*caeff9a3SLandon J. Fuller * @retval non-zero if mapping @p irq otherwise fails, a regular unix error code
267*caeff9a3SLandon J. Fuller * will be returned.
268*caeff9a3SLandon J. Fuller */
269*caeff9a3SLandon J. FullerMETHOD int map_intr_isrc {
270*caeff9a3SLandon J. Fuller	device_t dev;
271*caeff9a3SLandon J. Fuller	struct resource *irq;
272*caeff9a3SLandon J. Fuller	struct bhndb_intr_isrc **isrc;
273*caeff9a3SLandon J. Fuller} DEFAULT bhndb_null_map_intr_isrc;
274