6#include "dawn/prog/gateway.hxx"
10#include "dawn/debug.hxx"
11#include "dawn/io/common.hxx"
12#include "dawn/io/ddata.hxx"
13#include "dawn/io/virt.hxx"
17void CProgGateway::io1SetCb(
CIOVirt *io,
void *priv)
19 SGatewayBind *b =
static_cast<SGatewayBind *
>(priv);
22 ret = io->getVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
25 DAWNERR(
"gateway io1SetCb getVal: %d\n", ret);
29 b->vio2->setVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
32void CProgGateway::io2SetCb(
CIOVirt *io,
void *priv)
34 SGatewayBind *b =
static_cast<SGatewayBind *
>(priv);
37 ret = io->getVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
40 DAWNERR(
"gateway io2SetCb getVal: %d\n", ret);
44 b->vio1->setVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
47void CProgGateway::io1GetCb(
CIOVirt *io,
void *priv)
49 SGatewayBind *b =
static_cast<SGatewayBind *
>(priv);
52 ret = b->vio2->getVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
55 DAWNERR(
"gateway io1GetCb getVal from io2: %d\n", ret);
59 io->setVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
62void CProgGateway::io2GetCb(
CIOVirt *io,
void *priv)
64 SGatewayBind *b =
static_cast<SGatewayBind *
>(priv);
67 ret = b->vio1->getVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
70 DAWNERR(
"gateway io2GetCb getVal from io1: %d\n", ret);
74 io->setVal(b->iodata->getDataPtr(), b->iodata->getDataSize());
77int CProgGateway::configureDesc(
const CDescObject &desc)
80 const SProgGatewayIOBind *tmp;
86 for (
size_t i = 0; i < desc.
getSize(); i++)
92 DAWNERR(
"unsupported gateway cfg 0x%08" PRIx32
"\n", item->
cfgid.
v);
98 case PROG_GATEWAY_CFG_IOBIND:
101 item->
cfgid.
s.
size % (
sizeof(SProgGatewayIOBind) / 4) != 0)
103 DAWNERR(
"invalid IOBIND size %d\n", item->
cfgid.
s.
size);
107 nbinds = item->
cfgid.
s.
size / (
sizeof(SProgGatewayIOBind) / 4);
109 tmp =
reinterpret_cast<const SProgGatewayIOBind *
>(item->
data);
111 for (j = 0; j < nbinds; j++)
113 ret = allocObject(&tmp[j]);
125 DAWNERR(
"unsupported gateway cfg 0x%08" PRIx32
"\n", item->
cfgid.
v);
134int CProgGateway::allocObject(
const SProgGatewayIOBind *cfg)
141 "gateway bind 0x%" PRIx32
" <-> 0x%" PRIx32
": dim must be > 0\n", cfg->io1.v, cfg->io2.v);
145 b =
new (std::nothrow) SGatewayBind();
156 DAWNINFO(
"gateway bind 0x%" PRIx32
" <-> 0x%" PRIx32
" flags=0x%08" PRIx32
" dim=%" PRIu32
"\n",
169CProgGateway::~CProgGateway()
178 ret = configureDesc(
getDesc());
181 DAWNERR(
"gateway configure failed: %d\n", ret);
187 DAWNERR(
"gateway: no IO bindings configured\n");
198 for (i = 0; i < binds.size(); i++)
200 delete binds[i]->iodata;
215 for (i = 0; i < binds.size(); i++)
219 b->vio1 =
reinterpret_cast<CIOVirt *
>(
getIO(b->cfg.io1.v));
222 DAWNERR(
"gateway: io1[%zu] 0x%" PRIx32
" not found\n", i, b->cfg.io1.v);
226 b->vio2 =
reinterpret_cast<CIOVirt *
>(
getIO(b->cfg.io2.v));
229 DAWNERR(
"gateway: io2[%zu] 0x%" PRIx32
" not found\n", i, b->cfg.io2.v);
233 ret = prepareWritableTarget(b->vio1, b->cfg.dim,
false);
236 DAWNERR(
"gateway: vio1[%zu] initialize failed: %d\n", i, ret);
240 ret = prepareWritableTarget(b->vio2, b->cfg.dim,
false);
243 DAWNERR(
"gateway: vio2[%zu] initialize failed: %d\n", i, ret);
247 b->iodata = b->vio1->ddata_alloc(1);
263 for (i = 0; i < binds.size(); i++)
269 ret = b->vio1->setCallbackSet(io1SetCb, b);
272 DAWNERR(
"gateway[%zu]: io1 set cb failed: %d\n", i, ret);
279 ret = b->vio2->setCallbackSet(io2SetCb, b);
282 DAWNERR(
"gateway[%zu]: io2 set cb failed: %d\n", i, ret);
289 ret = b->vio1->setCallbackGet(io1GetCb, b);
292 DAWNERR(
"gateway[%zu]: io1 get cb failed: %d\n", i, ret);
299 ret = b->vio2->setCallbackGet(io2GetCb, b);
302 DAWNERR(
"gateway[%zu]: io2 get cb failed: %d\n", i, ret);
317 for (i = 0; i < binds.size(); i++)
323 ret = b->vio1->setCallbackSet(
nullptr,
nullptr);
326 DAWNERR(
"gateway[%zu]: io1 set cb clear failed: %d\n", i, ret);
333 ret = b->vio2->setCallbackSet(
nullptr,
nullptr);
336 DAWNERR(
"gateway[%zu]: io2 set cb clear failed: %d\n", i, ret);
343 ret = b->vio1->setCallbackGet(
nullptr,
nullptr);
346 DAWNERR(
"gateway[%zu]: io1 get cb clear failed: %d\n", i, ret);
353 ret = b->vio2->setCallbackGet(
nullptr,
nullptr);
356 DAWNERR(
"gateway[%zu]: io2 get cb clear failed: %d\n", i, ret);
CIOCommon * getIO(SObjectId::ObjectId id)
Get an I/O object by ID.
void setObjectMapItem(SObjectId::ObjectId id, CObject *obj)
Set an item in the object map.
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemNext(size_t &offset) const
Get config item at current offset and advance past it.
Virtual I/O type for user-provided data and callbacks.
CDescObject & getDesc()
Get descriptor object for this object.
@ PROG_CLASS_GATEWAY
Protocol-to-protocol IO gateway.
int init()
One-time initialize object after bindings are resolved.
int configure()
Configure object from descriptor data.
int deinit()
De-initialize object.
@ FLAG_IO1_WRITE
io1 set callback: propagates to io2.
@ FLAG_IO2_WRITE
io2 set callback: propagates to io1.
@ FLAG_IO2_READ
io2 get callback: fetches from io1.
@ FLAG_IO1_READ
io1 get callback: fetches from io2.
int doStart()
Start implementation hook.
int doStop()
Stop implementation hook.
Out-of-tree user-extension hooks for Dawn.
Single configuration item within object.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
uint32_t cls
Object class (bits 21-29, max 511).
uint32_t id
Configuration identifier (bits 0-4, max 31).
uint32_t size
Configuration data size in 32-bit words (bits 5-14, max 1023).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.