Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/bhnd/bhnd_erom_if.m
39536 views
1
#-
2
# Copyright (c) 2016-2017 Landon Fuller <[email protected]>
3
# Copyright (c) 2017 The FreeBSD Foundation
4
# All rights reserved.
5
#
6
# Portions of this software were developed by Landon Fuller
7
# under sponsorship from the FreeBSD Foundation.
8
#
9
# Redistribution and use in source and binary forms, with or without
10
# modification, are permitted provided that the following conditions
11
# are met:
12
# 1. Redistributions of source code must retain the above copyright
13
# notice, this list of conditions and the following disclaimer.
14
# 2. Redistributions in binary form must reproduce the above copyright
15
# notice, this list of conditions and the following disclaimer in the
16
# documentation and/or other materials provided with the distribution.
17
#
18
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
# IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#
29
30
#include <sys/param.h>
31
#include <sys/bus.h>
32
33
#include <machine/bus.h>
34
#include <sys/rman.h>
35
#include <machine/resource.h>
36
37
#include <dev/bhnd/bhnd.h>
38
#include <dev/bhnd/bhnd_erom_types.h>
39
40
INTERFACE bhnd_erom;
41
42
#
43
# bhnd(4) device enumeration.
44
#
45
# Provides a common parser interface to the incompatible device enumeration
46
# tables used by bhnd(4) buses.
47
#
48
49
HEADER {
50
/* forward declarations */
51
struct bhnd_erom_io;
52
};
53
54
/**
55
* Probe to see if this device enumeration class supports the bhnd bus at
56
* @p addr, returning a standard newbus device probe result (see BUS_PROBE_*)
57
* and the probed chip identification.
58
*
59
* @param cls The erom class to probe.
60
* @param eio A bus I/O instance, configured with a mapping of
61
* the first bus core.
62
* @param base_addr Address of the first bus core.
63
* @param hint Hint used to identify the device. If chipset
64
* supports standard chip identification registers
65
* within the first core, this parameter should be
66
* NULL.
67
* @param[out] cid On success, the probed chip identifier.
68
*
69
* @retval 0 if this is the only possible device enumeration
70
* parser for the probed bus.
71
* @retval negative if the probe succeeds, a negative value should be
72
* returned; the parser returning the highest negative
73
* value will be selected to handle device enumeration.
74
* @retval ENXIO If the bhnd bus type is not handled by this parser.
75
* @retval positive if an error occurs during probing, a regular unix error
76
* code should be returned.
77
*/
78
STATICMETHOD int probe {
79
bhnd_erom_class_t *cls;
80
struct bhnd_erom_io *eio;
81
const struct bhnd_chipid *hint;
82
struct bhnd_chipid *cid;
83
};
84
85
/**
86
* Initialize a device enumeration table parser.
87
*
88
* @param erom The erom parser to initialize.
89
* @param cid The device's chip identifier.
90
* @param eio The bus I/O instance to use when reading the device
91
* enumeration table. On success, the erom parser assumes
92
* ownership of this instance.
93
* @retval 0 success
94
* @retval non-zero if an error occurs initializing the EROM parser,
95
* a regular unix error code will be returned.
96
*/
97
METHOD int init {
98
bhnd_erom_t *erom;
99
const struct bhnd_chipid *cid;
100
struct bhnd_erom_io *eio;
101
};
102
103
/**
104
* Release all resources held by @p erom.
105
*
106
* @param erom An erom parser instance previously initialized via
107
* BHND_EROM_INIT() or BHND_EROM_INIT_STATIC().
108
*/
109
METHOD void fini {
110
bhnd_erom_t *erom;
111
};
112
113
/**
114
* Parse all cores descriptors, returning the array in @p cores and the count
115
* in @p num_cores.
116
*
117
* The memory allocated for the table must be freed via
118
* BHND_EROM_FREE_CORE_TABLE().
119
*
120
* @param erom The erom parser to be queried.
121
* @param[out] cores The table of parsed core descriptors.
122
* @param[out] num_cores The number of core records in @p cores.
123
*
124
* @retval 0 success
125
* @retval non-zero if an error occurs, a regular unix error code will
126
* be returned.
127
*/
128
METHOD int get_core_table {
129
bhnd_erom_t *erom;
130
struct bhnd_core_info **cores;
131
u_int *num_cores;
132
};
133
134
/**
135
* Free any memory allocated in a previous call to BHND_EROM_GET_CORE_TABLE().
136
*
137
* @param erom The erom parser instance.
138
* @param cores A core table allocated by @p erom.
139
*/
140
METHOD void free_core_table {
141
bhnd_erom_t *erom;
142
struct bhnd_core_info *cores;
143
};
144
145
/**
146
* Locate the first core table entry in @p erom that matches @p desc.
147
*
148
* @param erom The erom parser to be queried.
149
* @param desc A core match descriptor.
150
* @param[out] core On success, the matching core info record.
151
*
152
* @retval 0 success
153
* @retval ENOENT No core matching @p desc was found.
154
* @retval non-zero Reading or parsing failed.
155
*/
156
METHOD int lookup_core {
157
bhnd_erom_t *erom;
158
const struct bhnd_core_match *desc;
159
struct bhnd_core_info *core;
160
};
161
162
/**
163
* Locate the first core table entry in @p erom that matches @p desc,
164
* and return the specified port region's base address and size.
165
*
166
* If a core matching @p desc is not found, or the requested port region
167
* is not mapped to the matching core, ENOENT is returned.
168
*
169
* @param erom The erom parser to be queried.
170
* @param desc A core match descriptor.
171
* @param type The port type to search for.
172
* @param port The port to search for.
173
* @param region The port region to search for.
174
* @param[out] core If not NULL, will be populated with the matched core
175
* info record on success.
176
* @param[out] addr On success, the base address of the port region.
177
* @param[out] size On success, the total size of the port region.
178
*
179
* @retval 0 success
180
* @retval ENOENT No core matching @p desc was found.
181
* @retval ENOENT No port region matching @p type, @p port, and @p region
182
* was found.
183
* @retval non-zero Reading or parsing failed.
184
*/
185
METHOD int lookup_core_addr {
186
bhnd_erom_t *erom;
187
const struct bhnd_core_match *desc;
188
bhnd_port_type type;
189
u_int port;
190
u_int region;
191
struct bhnd_core_info *core;
192
bhnd_addr_t *addr;
193
bhnd_size_t *size;
194
};
195
196
/**
197
* Enumerate and print all EROM table entries.
198
*
199
* @param erom The erom parser to be enumerated.
200
*
201
* @retval 0 success
202
* @retval non-zero If an error occurs reading the EROM table, a regular
203
* unix error code will be returned.
204
*/
205
METHOD int dump {
206
bhnd_erom_t *erom;
207
};
208
209