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