1 /*- 2 * Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer, 10 * without modification. 11 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12 * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 13 * redistribution must be conditioned upon including a substantially 14 * similar Disclaimer requirement for further binary redistribution. 15 * 16 * NO WARRANTY 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 20 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 21 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 22 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27 * THE POSSIBILITY OF SUCH DAMAGES. 28 * 29 * $FreeBSD$ 30 */ 31 32 #ifndef _BHND_BHND_MATCH_H_ 33 #define _BHND_BHND_MATCH_H_ 34 35 #include "bhnd_types.h" 36 37 /** 38 * A hardware revision match descriptor. 39 */ 40 struct bhnd_hwrev_match { 41 uint16_t start; /**< first revision, or BHND_HWREV_INVALID 42 to match on any revision. */ 43 uint16_t end; /**< last revision, or BHND_HWREV_INVALID 44 to match on any revision. */ 45 }; 46 47 /* Copy match field @p _name from @p _src */ 48 #define _BHND_COPY_MATCH_FIELD(_src, _name) \ 49 .m.match._name = (_src)->m.match._name, \ 50 ._name = (_src)->_name 51 52 /* Set match field @p _name with @p _value */ 53 #define _BHND_SET_MATCH_FIELD(_name, _value) \ 54 .m.match._name = 1, ._name = _value 55 56 /** 57 * Wildcard hardware revision match descriptor. 58 */ 59 #define BHND_HWREV_ANY { BHND_HWREV_INVALID, BHND_HWREV_INVALID } 60 #define BHND_HWREV_IS_ANY(_m) \ 61 ((_m)->start == BHND_HWREV_INVALID && (_m)->end == BHND_HWREV_INVALID) 62 63 /** 64 * Hardware revision match descriptor for an inclusive range. 65 * 66 * @param _start The first applicable hardware revision. 67 * @param _end The last applicable hardware revision, or BHND_HWREV_INVALID 68 * to match on any revision. 69 */ 70 #define BHND_HWREV_RANGE(_start, _end) { _start, _end } 71 72 /** 73 * Hardware revision match descriptor for a single revision. 74 * 75 * @param _hwrev The hardware revision to match on. 76 */ 77 #define BHND_HWREV_EQ(_hwrev) BHND_HWREV_RANGE(_hwrev, _hwrev) 78 79 /** 80 * Hardware revision match descriptor for any revision equal to or greater 81 * than @p _start. 82 * 83 * @param _start The first hardware revision to match on. 84 */ 85 #define BHND_HWREV_GTE(_start) BHND_HWREV_RANGE(_start, BHND_HWREV_INVALID) 86 87 /** 88 * Hardware revision match descriptor for any revision equal to or less 89 * than @p _end. 90 * 91 * @param _end The last hardware revision to match on. 92 */ 93 #define BHND_HWREV_LTE(_end) BHND_HWREV_RANGE(0, _end) 94 95 /** 96 * A bhnd(4) core match descriptor. 97 */ 98 struct bhnd_core_match { 99 /** Select fields to be matched */ 100 union { 101 uint8_t match_flags; 102 struct { 103 uint8_t 104 core_vendor:1, 105 core_id:1, 106 core_rev:1, 107 core_class:1, 108 core_idx:1, 109 core_unit:1, 110 flags_unused:2; 111 } match; 112 } m; 113 114 uint16_t core_vendor; /**< required JEP106 device vendor */ 115 uint16_t core_id; /**< required core ID */ 116 struct bhnd_hwrev_match core_rev; /**< matching core revisions. */ 117 bhnd_devclass_t core_class; /**< required bhnd class */ 118 u_int core_idx; /**< required core index */ 119 int core_unit; /**< required core unit */ 120 }; 121 122 #define _BHND_CORE_MATCH_COPY(_src) \ 123 _BHND_COPY_MATCH_FIELD(_src, core_vendor), \ 124 _BHND_COPY_MATCH_FIELD(_src, core_id), \ 125 _BHND_COPY_MATCH_FIELD(_src, core_rev), \ 126 _BHND_COPY_MATCH_FIELD(_src, core_class), \ 127 _BHND_COPY_MATCH_FIELD(_src, core_idx), \ 128 _BHND_COPY_MATCH_FIELD(_src, core_unit) \ 129 130 #define BHND_MATCH_CORE_VENDOR(_v) _BHND_SET_MATCH_FIELD(core_vendor, _v) 131 #define BHND_MATCH_CORE_ID(_id) _BHND_SET_MATCH_FIELD(core_id, _id) 132 #define BHND_MATCH_CORE_REV(_rev) _BHND_SET_MATCH_FIELD(core_rev, \ 133 BHND_ ## _rev) 134 #define BHND_MATCH_CORE_CLASS(_cls) _BHND_SET_MATCH_FIELD(core_class, _cls) 135 #define BHND_MATCH_CORE_IDX(_idx) _BHND_SET_MATCH_FIELD(core_idx, _idx) 136 #define BHND_MATCH_CORE_UNIT(_unit) _BHND_SET_MATCH_FIELD(core_unit, _unit) 137 138 /** 139 * Match against the given @p _vendor and @p _id, 140 */ 141 #define BHND_MATCH_CORE(_vendor, _id) \ 142 BHND_MATCH_CORE_VENDOR(_vendor), \ 143 BHND_MATCH_CORE_ID(_id) 144 145 /** 146 * A bhnd(4) chip match descriptor. 147 */ 148 struct bhnd_chip_match { 149 /** Select fields to be matched */ 150 union { 151 uint8_t match_flags; 152 struct { 153 uint8_t 154 chip_id:1, 155 chip_rev:1, 156 chip_pkg:1, 157 flags_unused:5; 158 } match; 159 160 } m; 161 162 uint16_t chip_id; /**< required chip id */ 163 struct bhnd_hwrev_match chip_rev; /**< matching chip revisions */ 164 uint8_t chip_pkg; /**< required package */ 165 }; 166 167 #define _BHND_CHIP_MATCH_COPY(_src) \ 168 _BHND_COPY_MATCH_FIELD(_src, chip_id), \ 169 _BHND_COPY_MATCH_FIELD(_src, chip_rev), \ 170 _BHND_COPY_MATCH_FIELD(_src, chip_pkg) \ 171 172 /** Set the required chip ID within a bhnd match descriptor */ 173 #define BHND_CHIP_ID(_cid) _BHND_SET_MATCH_FIELD(chip_id, \ 174 BHND_CHIPID_ ## _cid) 175 176 /** Set the required chip revision range within a bhnd match descriptor */ 177 #define BHND_CHIP_REV(_rev) _BHND_SET_MATCH_FIELD(chip_rev, \ 178 BHND_ ## _rev) 179 180 /** Set the required package ID within a bhnd match descriptor */ 181 #define BHND_CHIP_PKG(_pkg) _BHND_SET_MATCH_FIELD(chip_pkg, \ 182 BHND_PKGID_ ## _pkg) 183 184 /** Set the required chip and package ID within a bhnd match descriptor */ 185 #define BHND_CHIP_IP(_cid, _pkg) \ 186 BHND_CHIP_ID(_cid), BHND_CHIP_PKG(_pkg) 187 188 /** Set the required chip ID, package ID, and revision within a bhnd_device_match 189 * instance */ 190 #define BHND_CHIP_IPR(_cid, _pkg, _rev) \ 191 BHND_CHIP_ID(_cid), BHND_CHIP_PKG(_pkg), BHND_CHIP_REV(_rev) 192 193 /** Set the required chip ID and revision within a bhnd_device_match 194 * instance */ 195 #define BHND_CHIP_IR(_cid, _rev) \ 196 BHND_CHIP_ID(_cid), BHND_CHIP_REV(_rev) 197 198 /** 199 * A bhnd(4) board match descriptor. 200 */ 201 struct bhnd_board_match { 202 /** Select fields to be matched */ 203 union { 204 uint8_t match_flags; 205 struct { 206 uint8_t 207 board_vendor:1, 208 board_type:1, 209 board_rev:1, 210 board_srom_rev:1, 211 flags_unused:4; 212 } match; 213 } m; 214 215 uint16_t board_vendor; /**< required board vendor */ 216 uint16_t board_type; /**< required board type */ 217 struct bhnd_hwrev_match board_rev; /**< matching board revisions */ 218 struct bhnd_hwrev_match board_srom_rev; /**< matching board srom revisions */ 219 }; 220 221 #define _BHND_BOARD_MATCH_COPY(_src) \ 222 _BHND_COPY_MATCH_FIELD(_src, board_vendor), \ 223 _BHND_COPY_MATCH_FIELD(_src, board_type), \ 224 _BHND_COPY_MATCH_FIELD(_src, board_rev), \ 225 _BHND_COPY_MATCH_FIELD(_src, board_srom_rev) 226 227 /** Set the required board vendor within a bhnd match descriptor */ 228 #define BHND_MATCH_BOARD_VENDOR(_v) _BHND_SET_MATCH_FIELD(board_vendor, _v) 229 230 /** Set the required board type within a bhnd match descriptor */ 231 #define BHND_MATCH_BOARD_TYPE(_type) _BHND_SET_MATCH_FIELD(board_type, \ 232 BHND_BOARD_ ## _type) 233 /** Set the required SROM revision range within a bhnd match descriptor */ 234 #define BHND_MATCH_SROMREV(_rev) _BHND_SET_MATCH_FIELD(board_srom_rev, \ 235 BHND_HWREV_ ## _rev) 236 237 /** Set the required board revision range within a bhnd match descriptor */ 238 #define BHND_MATCH_BOARD_REV(_rev) _BHND_SET_MATCH_FIELD(board_rev, \ 239 BHND_ ## _rev) 240 241 /** Set the required board vendor and type within a bhnd match descriptor */ 242 #define BHND_MATCH_BOARD(_vend, _type) \ 243 BHND_MATCH_BOARD_VENDOR(_vend), BHND_MATCH_BOARD_TYPE(_type) 244 245 246 /** 247 * A bhnd(4) device match descriptor. 248 * 249 * @warning Matching on board attributes relies on NVRAM access, and will 250 * fail if a valid NVRAM device cannot be found, or is not yet attached. 251 */ 252 struct bhnd_device_match { 253 /** Select fields to be matched */ 254 union { 255 uint16_t match_flags; 256 struct { 257 uint16_t 258 core_vendor:1, 259 core_id:1, 260 core_rev:1, 261 core_class:1, 262 core_idx:1, 263 core_unit:1, 264 chip_id:1, 265 chip_rev:1, 266 chip_pkg:1, 267 board_vendor:1, 268 board_type:1, 269 board_rev:1, 270 board_srom_rev:1, 271 flags_unused:1; 272 } match; 273 } m; 274 275 uint16_t core_vendor; /**< required JEP106 device vendor */ 276 uint16_t core_id; /**< required core ID */ 277 struct bhnd_hwrev_match core_rev; /**< matching core revisions. */ 278 bhnd_devclass_t core_class; /**< required bhnd class */ 279 u_int core_idx; /**< required core index */ 280 int core_unit; /**< required core unit */ 281 282 uint16_t chip_id; /**< required chip id */ 283 struct bhnd_hwrev_match chip_rev; /**< matching chip revisions */ 284 uint8_t chip_pkg; /**< required package */ 285 286 uint16_t board_vendor; /**< required board vendor */ 287 uint16_t board_type; /**< required board type */ 288 struct bhnd_hwrev_match board_rev; /**< matching board revisions */ 289 struct bhnd_hwrev_match board_srom_rev; /**< matching board srom revisions */ 290 }; 291 292 /** Define a wildcard match requirement (matches on any device). */ 293 #define BHND_MATCH_ANY .m.match_flags = 0 294 #define BHND_MATCH_IS_ANY(_m) \ 295 ((_m)->m.match_flags == 0) 296 297 #endif /* _BHND_BHND_MATCH_H_ */ 298