Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
E
EtherBone Core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
EtherBone Core
Commits
cfe980d3
Commit
cfe980d3
authored
Apr 22, 2016
by
Wesley W. Terpstra
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msi: pass both first and last to callbacks
parent
bb8a0fe9
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
153 additions
and
116 deletions
+153
-116
etherbone.h
api/etherbone.h
+12
-12
sdb.c
api/glue/sdb.c
+128
-96
sdb.h
api/glue/sdb.h
+8
-4
eb-ls.c
api/tools/eb-ls.c
+5
-4
No files found.
api/etherbone.h
View file @
cfe980d3
...
...
@@ -624,9 +624,9 @@ EB_PUBLIC eb_status_t eb_device_write(eb_device_t device,
* The sdb object passed to your callback is only valid until you return.
* If you need persistent information, you must copy the memory yourself.
*/
typedef
void
(
*
sdb_callback
2_t
)(
eb_user_data_t
,
eb_device_t
device
,
const
struct
sdb_table
*
,
eb_address_t
msi_base
,
eb_status_t
);
EB_PUBLIC
eb_status_t
eb_sdb_scan_bus
2
(
eb_device_t
device
,
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_base
,
eb_user_data_t
data
,
sdb_callback2
_t
cb
);
EB_PUBLIC
eb_status_t
eb_sdb_scan_root
2
(
eb_device_t
device
,
eb_user_data_t
data
,
sdb_callback2
_t
cb
);
typedef
void
(
*
sdb_callback
_msi_t
)(
eb_user_data_t
,
eb_device_t
device
,
const
struct
sdb_table
*
,
eb_address_t
msi_first
,
eb_address_t
msi_last
,
eb_status_t
);
EB_PUBLIC
eb_status_t
eb_sdb_scan_bus
_msi
(
eb_device_t
device
,
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_first
,
eb_address_t
msi_last
,
eb_user_data_t
data
,
sdb_callback_msi
_t
cb
);
EB_PUBLIC
eb_status_t
eb_sdb_scan_root
_msi
(
eb_device_t
device
,
eb_user_data_t
data
,
sdb_callback_msi
_t
cb
);
typedef
void
(
*
sdb_callback_t
)(
eb_user_data_t
,
eb_device_t
device
,
const
struct
sdb_table
*
,
eb_status_t
);
EB_PUBLIC
eb_status_t
eb_sdb_scan_bus
(
eb_device_t
device
,
const
struct
sdb_bridge
*
bridge
,
eb_user_data_t
data
,
sdb_callback_t
cb
);
...
...
@@ -641,7 +641,7 @@ EB_PUBLIC eb_status_t eb_sdb_scan_root(eb_device_t device, eb_user_data_t data,
* On success, EB_OK is returned.
* Other failures are possible.
*/
EB_PUBLIC
eb_status_t
eb_sdb_find_by_address
2
(
eb_device_t
device
,
eb_address_t
address
,
struct
sdb_device
*
output
,
eb_address_t
*
msi_base
);
EB_PUBLIC
eb_status_t
eb_sdb_find_by_address
_msi
(
eb_device_t
device
,
eb_address_t
address
,
struct
sdb_device
*
output
,
eb_address_t
*
msi_first
,
eb_address_t
*
msi_last
);
EB_PUBLIC
eb_status_t
eb_sdb_find_by_address
(
eb_device_t
device
,
eb_address_t
address
,
struct
sdb_device
*
output
);
/* When scanning by identity, multiple devices may match.
...
...
@@ -650,7 +650,7 @@ EB_PUBLIC eb_status_t eb_sdb_find_by_address(eb_device_t device, eb_address_t ad
* If there are more records than fit in output, they are counted but unwritten.
* On success, EB_OK is returned. Do not forget to check *devices as well!
*/
EB_PUBLIC
eb_status_t
eb_sdb_find_by_identity
2
(
eb_device_t
device
,
uint64_t
vendor_id
,
uint32_t
device_id
,
struct
sdb_device
*
output
,
eb_address_t
*
output_msi
,
int
*
devices
);
EB_PUBLIC
eb_status_t
eb_sdb_find_by_identity
_msi
(
eb_device_t
device
,
uint64_t
vendor_id
,
uint32_t
device_id
,
struct
sdb_device
*
output
,
eb_address_t
*
output_msi_first
,
eb_address_t
*
output_msi_last
,
int
*
devices
);
EB_PUBLIC
eb_status_t
eb_sdb_find_by_identity
(
eb_device_t
device
,
uint64_t
vendor_id
,
uint32_t
device_id
,
struct
sdb_device
*
output
,
int
*
devices
);
...
...
@@ -658,7 +658,7 @@ EB_PUBLIC eb_status_t eb_sdb_find_by_identity(eb_device_t device, uint64_t vendo
* eb_sdb_find_by_identity now supports finding crossbars, use it to find special CBs and use them as
* root node for eb_sdb_find_by_identity_at.
*/
EB_PUBLIC
eb_status_t
eb_sdb_find_by_identity_at
2
(
eb_device_t
device
,
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_base
,
uint64_t
vendor_id
,
uint32_t
device_id
,
struct
sdb_device
*
output
,
eb_address_t
*
output_msi
,
int
*
devices
);
EB_PUBLIC
eb_status_t
eb_sdb_find_by_identity_at
_msi
(
eb_device_t
device
,
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_first
,
eb_address_t
msi_last
,
uint64_t
vendor_id
,
uint32_t
device_id
,
struct
sdb_device
*
output
,
eb_address_t
*
output_msi_first
,
eb_address_t
*
output_msi_last
,
int
*
devices
);
EB_PUBLIC
eb_status_t
eb_sdb_find_by_identity_at
(
eb_device_t
device
,
const
struct
sdb_bridge
*
bridge
,
uint64_t
vendor_id
,
uint32_t
device_id
,
struct
sdb_device
*
output
,
int
*
devices
);
#ifdef __cplusplus
...
...
@@ -752,11 +752,11 @@ class Device {
template
<
typename
T
>
EB_STATUS_OR_VOID_T
sdb_scan_bus
(
const
struct
sdb_bridge
*
bridge
,
T
*
user
,
sdb_callback_t
);
template
<
typename
T
>
EB_STATUS_OR_VOID_T
sdb_scan_bus
2
(
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_base
,
T
*
user
,
sdb_callback2
_t
);
EB_STATUS_OR_VOID_T
sdb_scan_bus
_msi
(
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_first
,
eb_address_t
msi_last
,
T
*
user
,
sdb_callback_msi
_t
);
template
<
typename
T
>
EB_STATUS_OR_VOID_T
sdb_scan_root
(
T
*
user
,
sdb_callback_t
);
template
<
typename
T
>
EB_STATUS_OR_VOID_T
sdb_scan_root
2
(
T
*
user
,
sdb_callback2
_t
);
EB_STATUS_OR_VOID_T
sdb_scan_root
_msi
(
T
*
user
,
sdb_callback_msi
_t
);
EB_STATUS_OR_VOID_T
sdb_find_by_address
(
eb_address_t
address
,
struct
sdb_device
*
output
);
EB_STATUS_OR_VOID_T
sdb_find_by_identity
(
uint64_t
vendor_id
,
uint32_t
device_id
,
std
::
vector
<
struct
sdb_device
>&
output
);
...
...
@@ -953,8 +953,8 @@ inline EB_STATUS_OR_VOID_T Device::sdb_scan_bus(const struct sdb_bridge* bridge,
}
template
<
typename
T
>
inline
EB_STATUS_OR_VOID_T
Device
::
sdb_scan_bus
2
(
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_base
,
T
*
user
,
sdb_callback2
_t
cb
)
{
EB_RETURN_OR_THROW
(
"Device::sdb_scan_bus
2"
,
eb_sdb_scan_bus2
(
device
,
bridge
,
msi_base
,
user
,
cb
));
inline
EB_STATUS_OR_VOID_T
Device
::
sdb_scan_bus
_msi
(
const
struct
sdb_bridge
*
bridge
,
eb_address_t
msi_first
,
eb_address_t
msi_last
,
T
*
user
,
sdb_callback_msi
_t
cb
)
{
EB_RETURN_OR_THROW
(
"Device::sdb_scan_bus
_msi"
,
eb_sdb_scan_bus_msi
(
device
,
bridge
,
msi_first
,
msi_last
,
user
,
cb
));
}
template
<
typename
T
>
...
...
@@ -963,8 +963,8 @@ inline EB_STATUS_OR_VOID_T Device::sdb_scan_root(T* user, sdb_callback_t cb) {
}
template
<
typename
T
>
inline
EB_STATUS_OR_VOID_T
Device
::
sdb_scan_root
2
(
T
*
user
,
sdb_callback2
_t
cb
)
{
EB_RETURN_OR_THROW
(
"Device::sdb_scan_root
2"
,
eb_sdb_scan_root2
(
device
,
user
,
cb
));
inline
EB_STATUS_OR_VOID_T
Device
::
sdb_scan_root
_msi
(
T
*
user
,
sdb_callback_msi
_t
cb
)
{
EB_RETURN_OR_THROW
(
"Device::sdb_scan_root
_msi"
,
eb_sdb_scan_root_msi
(
device
,
user
,
cb
));
}
inline
EB_STATUS_OR_VOID_T
Device
::
sdb_find_by_address
(
eb_address_t
address
,
struct
sdb_device
*
output
)
{
...
...
api/glue/sdb.c
View file @
cfe980d3
This diff is collapsed.
Click to expand it.
api/glue/sdb.h
View file @
cfe980d3
...
...
@@ -32,15 +32,19 @@
typedef
EB_POINTER
(
eb_sdb_scan_meta
)
eb_sdb_scan_meta_t
;
struct
eb_sdb_scan_meta
{
eb_address_t
msi_base
;
eb_address_t
msi_first
;
eb_address_t
msi_last
;
eb_address_t
bus_base
;
eb_user_data_t
user_data
;
};
typedef
EB_POINTER
(
eb_sdb_scan
)
eb_sdb_scan_t
;
struct
eb_sdb_scan
{
sdb_callback_t
cb1
;
sdb_callback2_t
cb2
;
union
{
sdb_callback_t
cb
;
sdb_callback_msi_t
cb_msi
;
}
un_cb
;
eb_user_data_t
user_data
;
uint16_t
cb_fmt
;
eb_sdb_scan_meta_t
meta
;
};
...
...
api/tools/eb-ls.c
View file @
cfe980d3
...
...
@@ -103,7 +103,7 @@ static void verbose_component(const struct sdb_component* component, struct bus_
}
static
int
norecurse
;
static
void
list_devices
(
eb_user_data_t
user
,
eb_device_t
dev
,
const
struct
sdb_table
*
sdb
,
eb_address_t
msi_
base
,
eb_status_t
status
)
{
static
void
list_devices
(
eb_user_data_t
user
,
eb_device_t
dev
,
const
struct
sdb_table
*
sdb
,
eb_address_t
msi_
first
,
eb_address_t
msi_last
,
eb_status_t
status
)
{
struct
bus_record
br
;
int
devices
;
...
...
@@ -120,7 +120,8 @@ static void list_devices(eb_user_data_t user, eb_device_t dev, const struct sdb_
fprintf
(
stdout
,
" sdb_magic: %08"
PRIx32
"
\n
"
,
sdb
->
interconnect
.
sdb_magic
);
fprintf
(
stdout
,
" sdb_records: %d
\n
"
,
sdb
->
interconnect
.
sdb_records
);
fprintf
(
stdout
,
" sdb_version: %d
\n
"
,
sdb
->
interconnect
.
sdb_version
);
fprintf
(
stdout
,
" bus_master_msi.addr_first:%016"
PRIx64
"
\n
"
,
msi_base
);
fprintf
(
stdout
,
" bus_master_msi.addr_first:%016"
PRIx64
"
\n
"
,
msi_first
);
fprintf
(
stdout
,
" bus_master_msi.addr_last: %016"
PRIx64
"
\n
"
,
msi_last
);
verbose_component
(
&
sdb
->
interconnect
.
sdb_component
,
&
br
);
if
(
sdb
->
interconnect
.
sdb_component
.
addr_first
>
br
.
parent
->
addr_first
)
...
...
@@ -238,7 +239,7 @@ static void list_devices(eb_user_data_t user, eb_device_t dev, const struct sdb_
br
.
addr_first
=
des
->
bridge
.
sdb_component
.
addr_first
;
br
.
addr_last
=
des
->
bridge
.
sdb_component
.
addr_last
;
eb_sdb_scan_bus
2
(
dev
,
&
des
->
bridge
,
msi_base
,
&
br
,
&
list_devices
);
eb_sdb_scan_bus
_msi
(
dev
,
&
des
->
bridge
,
msi_first
,
msi_last
,
&
br
,
&
list_devices
);
while
(
!
br
.
stop
)
eb_socket_run
(
eb_device_socket
(
dev
),
-
1
);
}
}
...
...
@@ -344,7 +345,7 @@ int main(int argc, char** argv) {
/* Find the limit of the bus space based on the address width */
br
.
addr_last
>>=
(
sizeof
(
eb_address_t
)
-
(
eb_device_width
(
device
)
>>
4
))
*
8
;
if
((
status
=
eb_sdb_scan_root
2
(
device
,
&
br
,
&
list_devices
))
!=
EB_OK
)
{
if
((
status
=
eb_sdb_scan_root
_msi
(
device
,
&
br
,
&
list_devices
))
!=
EB_OK
)
{
fprintf
(
stderr
,
"%s: failed to scan remote device: %s
\n
"
,
program
,
eb_status
(
status
));
return
1
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment