Ping! Any further review on this? Id like to drop patch 8 (at it is proof-of-concept only) and merge up to and including this. Andreas has put RB to patches 1-6 already.
Regards, Peter On Mon, Feb 25, 2013 at 6:50 PM, Peter Crosthwaite <peter.crosthwa...@xilinx.com> wrote: > Create a separate child object to proxy the stream slave connection. This is > setup for future work where a second stream slave connection is needed. The > new child object is created at qdev init time and is linked back to the parent > (the ethernet device itself) automatically. > > Stream slave masters differentiate which slave connection they are connected > to > by linking to the proxy object rather than the parent. > > Signed-off-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com> > --- > change from v1: > renamed data-stream proxy link to "axistream-connected-target" > rebased ontop of realize conversion > reworked error return mechanism (Andreas review) > inlined child device state struct into parents (Andreas review) > replaced object_new() -> object_initialize() (Andreas review) > > hw/petalogix_ml605_mmu.c | 6 ++++- > hw/xilinx_axienet.c | 60 ++++++++++++++++++++++++++++++++++++++++++--- > 2 files changed, 61 insertions(+), 5 deletions(-) > > diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c > index e3528c0..4223173 100644 > --- a/hw/petalogix_ml605_mmu.c > +++ b/hw/petalogix_ml605_mmu.c > @@ -79,6 +79,7 @@ petalogix_ml605_init(QEMUMachineInitArgs *args) > const char *cpu_model = args->cpu_model; > MemoryRegion *address_space_mem = get_system_memory(); > DeviceState *dev, *dma, *eth0; > + Object *peer; > MicroBlazeCPU *cpu; > SysBusDevice *busdev; > CPUMBState *env; > @@ -142,7 +143,10 @@ petalogix_ml605_init(QEMUMachineInitArgs *args) > xilinx_axiethernet_init(eth0, &nd_table[0], STREAM_SLAVE(dma), > 0x82780000, irq[3], 0x1000, 0x1000); > > - xilinx_axidma_init(dma, STREAM_SLAVE(eth0), 0x84600000, irq[1], irq[0], > + peer = object_property_get_link(OBJECT(eth0), "data-stream", NULL); > + assert(peer); > + > + xilinx_axidma_init(dma, STREAM_SLAVE(peer), 0x84600000, irq[1], irq[0], > 100 * 1000000); > > { > diff --git a/hw/xilinx_axienet.c b/hw/xilinx_axienet.c > index 27d94bd..a4ec1d8 100644 > --- a/hw/xilinx_axienet.c > +++ b/hw/xilinx_axienet.c > @@ -32,10 +32,15 @@ > #define DPHY(x) > > #define TYPE_XILINX_AXI_ENET "xlnx.axi-ethernet" > +#define TYPE_XILINX_AXI_ENET_DATA_STREAM "xilinx-axienet-data-stream" > > #define XILINX_AXI_ENET(obj) \ > OBJECT_CHECK(XilinxAXIEnet, (obj), TYPE_XILINX_AXI_ENET) > > +#define XILINX_AXI_ENET_DATA_STREAM(obj) \ > + OBJECT_CHECK(XilinxAXIEnetStreamSlave, (obj),\ > + TYPE_XILINX_AXI_ENET_DATA_STREAM) > + > /* Advertisement control register. */ > #define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ > #define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ > @@ -310,13 +315,21 @@ struct TEMAC { > void *parent; > }; > > +typedef struct XilinxAXIEnetStreamSlave XilinxAXIEnetStreamSlave; > typedef struct XilinxAXIEnet XilinxAXIEnet; > > +struct XilinxAXIEnetStreamSlave { > + Object parent; > + > + struct XilinxAXIEnet *enet; > +} ; > + > struct XilinxAXIEnet { > SysBusDevice busdev; > MemoryRegion iomem; > qemu_irq irq; > StreamSlave *tx_dev; > + XilinxAXIEnetStreamSlave rx_data_dev; > NICState *nic; > NICConf conf; > > @@ -800,9 +813,11 @@ static void eth_cleanup(NetClientState *nc) > } > > static void > -axienet_stream_push(StreamSlave *obj, uint8_t *buf, size_t size, uint32_t > *hdr) > +axienet_data_stream_push(StreamSlave *obj, uint8_t *buf, size_t size, > + uint32_t *hdr) > { > - XilinxAXIEnet *s = FROM_SYSBUS(typeof(*s), SYS_BUS_DEVICE(obj)); > + XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(obj); > + XilinxAXIEnet *s = ds->enet; > > /* TX enable ? */ > if (!(s->tc & TC_TX)) { > @@ -853,6 +868,18 @@ static NetClientInfo net_xilinx_enet_info = { > static void xilinx_enet_realize(DeviceState *dev, Error **errp) > { > XilinxAXIEnet *s = XILINX_AXI_ENET(dev); > + XilinxAXIEnetStreamSlave *ds = > XILINX_AXI_ENET_DATA_STREAM(&s->rx_data_dev); > + Error *local_errp = NULL; > + > + object_property_add_link(OBJECT(ds), "enet", "xlnx.axi-ethernet", > + (Object **) &ds->enet, &local_errp); > + if (local_errp) { > + goto xilinx_enet_realize_fail; > + } > + object_property_set_link(OBJECT(ds), OBJECT(s), "enet", &local_errp); > + if (local_errp) { > + goto xilinx_enet_realize_fail; > + } > > qemu_macaddr_default_if_unset(&s->conf.macaddr); > s->nic = qemu_new_nic(&net_xilinx_enet_info, &s->conf, > @@ -865,6 +892,12 @@ static void xilinx_enet_realize(DeviceState *dev, Error > **errp) > s->TEMAC.parent = s; > > s->rxmem = g_malloc(s->c_rxmem); > + return; > + > +xilinx_enet_realize_fail: > + if (!*errp) { > + *errp = local_errp; > + } > } > > static void xilinx_enet_init(Object *obj) > @@ -877,6 +910,11 @@ static void xilinx_enet_init(Object *obj) > (Object **) &s->tx_dev, &errp); > assert_no_error(errp); > > + object_initialize(&s->rx_data_dev, TYPE_XILINX_AXI_ENET_DATA_STREAM); > + object_property_add_child(OBJECT(s), "axistream-connected-target", > + (Object *)&s->rx_data_dev, &errp); > + assert_no_error(errp); > + > sysbus_init_irq(sbd, &s->irq); > > memory_region_init_io(&s->iomem, &enet_ops, s, "enet", 0x40000); > @@ -894,12 +932,17 @@ static Property xilinx_enet_properties[] = { > static void xilinx_enet_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > - StreamSlaveClass *ssc = STREAM_SLAVE_CLASS(klass); > > dc->realize = xilinx_enet_realize; > dc->props = xilinx_enet_properties; > dc->reset = xilinx_axienet_reset; > - ssc->push = axienet_stream_push; > +} > + > +static void xilinx_enet_stream_class_init(ObjectClass *klass, void *data) > +{ > + StreamSlaveClass *ssc = STREAM_SLAVE_CLASS(klass); > + > + ssc->push = data; > } > > static const TypeInfo xilinx_enet_info = { > @@ -908,6 +951,14 @@ static const TypeInfo xilinx_enet_info = { > .instance_size = sizeof(XilinxAXIEnet), > .class_init = xilinx_enet_class_init, > .instance_init = xilinx_enet_init, > +}; > + > +static const TypeInfo xilinx_enet_data_stream_info = { > + .name = TYPE_XILINX_AXI_ENET_DATA_STREAM, > + .parent = TYPE_OBJECT, > + .instance_size = sizeof(struct XilinxAXIEnetStreamSlave), > + .class_init = xilinx_enet_stream_class_init, > + .class_data = axienet_data_stream_push, > .interfaces = (InterfaceInfo[]) { > { TYPE_STREAM_SLAVE }, > { } > @@ -917,6 +968,7 @@ static const TypeInfo xilinx_enet_info = { > static void xilinx_enet_register_types(void) > { > type_register_static(&xilinx_enet_info); > + type_register_static(&xilinx_enet_data_stream_info); > } > > type_init(xilinx_enet_register_types) > -- > 1.7.0.4 >