Commit 661c3dd9 authored by Manohar Vanga's avatar Manohar Vanga

simulation: clean up wishbone ops

Signed-off-by: 's avatarManohar Vanga <manohar.vanga@cern.ch>
parent cfff654f
......@@ -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 */
......@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment