Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
SDB - Self-describing Bus
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
SDB - Self-describing Bus
Commits
661c3dd9
Commit
661c3dd9
authored
Nov 07, 2011
by
Manohar Vanga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simulation: clean up wishbone ops
Signed-off-by:
Manohar Vanga
<
manohar.vanga@cern.ch
>
parent
cfff654f
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
42 additions
and
142 deletions
+42
-142
wishbone.h
simulation/include/linux/wishbone.h
+34
-30
wishbone.c
simulation/wishbone.c
+8
-112
No files found.
simulation/include/linux/wishbone.h
View file @
661c3dd9
...
...
@@ -34,6 +34,26 @@
#define WB_ANY_DEVICE ((uint32_t)(~0))
#define WB_NO_CLASS ((uint32_t)(~0))
/* Wishbone I/O operations */
#define wb_readb(bus, addr) bus->ops->read8(addr)
#define wb_readw(bus, addr) bus->ops->read16(addr)
#define wb_readl(bus, addr) bus->ops->read32(addr)
#define wb_readll(bus, addr) bus->ops->read64(addr)
#define wb_writeb(bus, addr, val) bus->ops->write8(addr, val)
#define wb_writew(bus, addr, val) bus->ops->write16(addr, val)
#define wb_writel(bus, addr, val) bus->ops->write32(addr, val)
#define wb_writell(bus, addr, val) bus->ops->write64(addr, val)
#define memcpy_from_wb(bus, addr, buf, len) \
bus->ops->memcpy_from_wb(addr, buf, len)
#define memcpy_to_wb(bus, addr, buf, len) \
bus->ops->memcpy_to_wb(addr, buf, len)
#define wb_read_cfg(bus, addr, buf, len) \
bus->ops->read_cfg(addr, buf, len)
struct
wb_device
;
struct
wb_device_id
{
...
...
@@ -81,20 +101,20 @@ struct wb_device {
#define to_wb_device(dev) container_of(dev, struct wb_device, dev);
struct
wb_ops
{
int
(
*
read8
)(
uint64_t
,
uint8_t
*
);
int
(
*
read16
)(
uint64_t
,
uint16_t
*
);
int
(
*
read32
)(
uint64_t
,
uint32_t
*
);
int
(
*
read64
)(
uint64_t
,
uint64_t
*
);
int
(
*
write8
)(
uint64_t
,
uint8_t
);
int
(
*
write16
)(
uint64_t
,
uint16_t
);
int
(
*
write32
)(
uint64_t
,
uint32_t
);
int
(
*
write64
)(
uint64_t
,
uint64_t
);
int
(
*
memcpy_from_wb
)
(
uint64_t
addr
,
size_t
len
,
size_t
*
retlen
,
uint8_t
*
buf
);
int
(
*
memcpy_to_wb
)
(
uint64_t
addr
,
size_t
len
,
size_t
*
retlen
,
const
uint8_t
*
buf
);
uint8_t
(
*
read8
)(
uint64_t
);
uint16_t
(
*
read16
)(
uint64_t
);
uint32_t
(
*
read32
)(
uint64_t
);
uint64_t
(
*
read64
)(
uint64_t
);
void
(
*
write8
)(
uint64_t
,
uint8_t
);
void
(
*
write16
)(
uint64_t
,
uint16_t
);
void
(
*
write32
)(
uint64_t
,
uint32_t
);
void
(
*
write64
)(
uint64_t
,
uint64_t
);
void
*
(
*
memcpy_from_wb
)
(
uint64_t
addr
,
void
*
buf
,
size_t
len
);
void
*
(
*
memcpy_to_wb
)
(
uint64_t
addr
,
const
void
*
buf
,
size_t
len
);
void
*
(
*
read_cfg
)(
uint64_t
addr
,
void
*
buf
,
size_t
len
);
};
struct
wb_bus
{
...
...
@@ -116,21 +136,5 @@ void wb_unregister_bus(struct wb_bus *bus);
int
wb_register_device
(
struct
wb_device
*
wbdev
);
void
wb_unregister_device
(
struct
wb_device
*
wbdev
);
/* Wishbone I/O operations */
int
wb_read8
(
struct
wb_bus
*
,
uint64_t
,
uint8_t
*
);
int
wb_read16
(
struct
wb_bus
*
,
uint64_t
,
uint16_t
*
);
int
wb_read32
(
struct
wb_bus
*
,
uint64_t
,
uint32_t
*
);
int
wb_read64
(
struct
wb_bus
*
,
uint64_t
,
uint64_t
*
);
int
wb_write8
(
struct
wb_bus
*
,
uint64_t
,
uint8_t
);
int
wb_write16
(
struct
wb_bus
*
,
uint64_t
,
uint16_t
);
int
wb_write32
(
struct
wb_bus
*
,
uint64_t
,
uint32_t
);
int
wb_write64
(
struct
wb_bus
*
,
uint64_t
,
uint64_t
);
int
memcpy_from_wb
(
struct
wb_bus
*
,
uint64_t
addr
,
size_t
len
,
uint8_t
*
buf
);
int
memcpy_to_wb
(
struct
wb_bus
*
,
uint64_t
addr
,
size_t
len
,
const
uint8_t
*
buf
);
#endif
/* _LINUX_WISHBONE_H */
simulation/wishbone.c
View file @
661c3dd9
...
...
@@ -48,93 +48,6 @@ static struct bus_type wb_bus_type = {
.
remove
=
wb_drv_remove
,
};
int
wb_read8
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint8_t
*
val
)
{
if
(
bus
&&
bus
->
ops
->
read8
)
return
bus
->
ops
->
read8
(
addr
,
val
);
return
-
EIO
;
}
int
wb_read16
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint16_t
*
val
)
{
if
(
bus
&&
bus
->
ops
->
read16
)
return
bus
->
ops
->
read16
(
addr
,
val
);
return
-
EIO
;
}
int
wb_read32
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint32_t
*
val
)
{
if
(
bus
&&
bus
->
ops
->
read32
)
return
bus
->
ops
->
read32
(
addr
,
val
);
return
-
EIO
;
}
int
wb_read64
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint64_t
*
val
)
{
if
(
bus
&&
bus
->
ops
->
read64
)
return
bus
->
ops
->
read64
(
addr
,
val
);
return
-
EIO
;
}
int
wb_write8
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint8_t
val
)
{
if
(
bus
&&
bus
->
ops
->
write8
)
return
bus
->
ops
->
write8
(
addr
,
val
);
return
-
EIO
;
}
int
wb_write16
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint16_t
val
)
{
if
(
bus
&&
bus
->
ops
->
write16
)
return
bus
->
ops
->
write16
(
addr
,
val
);
return
-
EIO
;
}
int
wb_write32
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint32_t
val
)
{
if
(
bus
&&
bus
->
ops
->
write32
)
return
bus
->
ops
->
write32
(
addr
,
val
);
return
-
EIO
;
}
int
wb_write64
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
uint64_t
val
)
{
if
(
bus
&&
bus
->
ops
->
write64
)
return
bus
->
ops
->
write64
(
addr
,
val
);
return
-
EIO
;
}
int
memcpy_from_wb
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
size_t
len
,
uint8_t
*
buf
)
{
int
ret
;
int
retlen
;
if
(
bus
&&
bus
->
ops
->
memcpy_from_wb
)
{
ret
=
bus
->
ops
->
memcpy_from_wb
(
addr
,
len
,
&
retlen
,
buf
);
if
(
retlen
!=
len
)
ret
=
-
EIO
;
return
ret
;
}
return
-
EIO
;
}
int
memcpy_to_wb
(
struct
wb_bus
*
bus
,
uint64_t
addr
,
size_t
len
,
const
uint8_t
*
buf
)
{
int
ret
;
int
retlen
;
if
(
bus
&&
bus
->
ops
->
memcpy_to_wb
)
{
ret
=
bus
->
ops
->
memcpy_to_wb
(
addr
,
len
,
&
retlen
,
buf
);
if
(
retlen
!=
len
)
ret
=
-
EIO
;
return
ret
;
}
return
-
EIO
;
}
static
void
wb_dev_release
(
struct
device
*
dev
)
{
struct
wb_device
*
wb_dev
;
...
...
@@ -221,13 +134,8 @@ int wb_register_bus(struct wb_bus *bus)
* Wishbone devices' 'bus' field to this bus.
*/
ret
=
memcpy_from_wb
(
bus
,
bus
->
sdwb_header_base
,
sizeof
(
struct
sdwb_head
),
(
uint8_t
*
)
&
head
);
if
(
ret
<
0
)
{
pr_err
(
KBUILD_MODNAME
": SDWB header read failed
\n
"
);
return
ret
;
}
memcpy_from_wb
(
bus
,
bus
->
sdwb_header_base
,
(
void
*
)
&
head
,
sizeof
(
struct
sdwb_head
));
/* verify our header using the magic field */
if
(
head
.
magic
!=
SDWB_HEAD_MAGIC
)
{
pr_err
(
KBUILD_MODNAME
": invalid sdwb header at %llx "
...
...
@@ -235,22 +143,13 @@ int wb_register_bus(struct wb_bus *bus)
return
-
EFAULT
;
}
ret
=
memcpy_from_wb
(
bus
,
head
.
wbid_address
,
sizeof
(
struct
sdwb_wbid
),
(
uint8_t
*
)
&
wbid
);
if
(
ret
<
0
)
{
pr_err
(
KBUILD_MODNAME
": SDWB ID read failed
\n
"
);
return
ret
;
}
memcpy_from_wb
(
bus
,
head
.
wbid_address
,
(
void
*
)
&
wbid
,
sizeof
(
struct
sdwb_wbid
));
pr_info
(
KBUILD_MODNAME
": found sdwb bistream: 0x%llx
\n
"
,
wbid
.
bstream_type
);
ret
=
memcpy_from_wb
(
bus
,
head
.
wbd_address
,
sizeof
(
struct
sdwb_wbd
),
(
uint8_t
*
)
&
wbd
);
if
(
ret
<
0
)
{
pr_err
(
KBUILD_MODNAME
": SDWB dev read failed
\n
"
);
return
ret
;
}
memcpy_from_wb
(
bus
,
head
.
wbd_address
,
(
void
*
)
&
wbd
,
sizeof
(
struct
sdwb_wbd
));
while
(
wbd
.
wbd_magic
==
SDWB_WBD_MAGIC
)
{
wbdev
=
kzalloc
(
sizeof
(
struct
wb_device
),
...
...
@@ -270,11 +169,9 @@ int wb_register_bus(struct wb_bus *bus)
list_add
(
&
wbdev
->
list
,
&
bus
->
devices
);
bus
->
ndev
++
;
mutex_unlock
(
&
bus
->
dev_lock
);
ret
=
memcpy_from_wb
(
bus
,
memcpy_from_wb
(
bus
,
head
.
wbd_address
+
sizeof
(
struct
sdwb_wbd
)
*
i
,
sizeof
(
struct
sdwb_wbd
),
(
uint8_t
*
)
&
wbd
);
if
(
ret
<
0
)
goto
err_wbdev_read
;
(
void
*
)
&
wbd
,
sizeof
(
struct
sdwb_wbd
));
}
pr_info
(
KBUILD_MODNAME
...
...
@@ -283,7 +180,6 @@ int wb_register_bus(struct wb_bus *bus)
return
0
;
err_wbdev_read:
err_wbdev_register:
kfree
(
wbdev
);
err_wbdev_alloc:
...
...
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