[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH v1 3/4] xilinx_axienet: Create Proxy object
From: |
Peter Crosthwaite |
Subject: |
Re: [Qemu-devel] [RFC PATCH v1 3/4] xilinx_axienet: Create Proxy object for stream |
Date: |
Thu, 21 Feb 2013 14:17:09 +1000 |
Ping!
Edgar merged patches 1&2 (trivials) before he went on vacation, but
left this out because he wanted to give everyone a chance to review in
the context of the active QOM discussions. I probably should have ccd
Paolo as this little sub system started way back with his refactoring
of axienet to get rid of the DEFINE_PROP_PTRs we had there.
Regards,
Peter
On Tue, Feb 12, 2013 at 11:17 AM, Peter Crosthwaite
<address@hidden> 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 <address@hidden>
> ---
>
> hw/petalogix_ml605_mmu.c | 8 ++++++-
> hw/xilinx_axienet.c | 47 ++++++++++++++++++++++++++++++++++++++++++---
> 2 files changed, 50 insertions(+), 5 deletions(-)
>
> diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c
> index 82d7183..3636993 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;
> @@ -136,11 +137,16 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
> /* FIXME: attach to the sysbus instead */
> object_property_add_child(container_get(qdev_get_machine(),
> "/unattached"),
> "xilinx-dma", OBJECT(dma), NULL);
> + object_property_add_child(container_get(qdev_get_machine(),
> "/unattached"),
> + "xilinx-eth0", OBJECT(eth0), NULL);
>
> 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 34e344c..7adb24d 100644
> --- a/hw/xilinx_axienet.c
> +++ b/hw/xilinx_axienet.c
> @@ -364,6 +364,18 @@ struct XilinxAXIEnet {
> uint8_t *rxmem;
> };
>
> +#define TYPE_XILINX_AXI_ENET_DATA_STREAM "xilinx-axienet-data-stream"
> +
> +#define XILINX_AXI_ENET_DATA_STREAM(obj) \
> + OBJECT_CHECK(XilinxAXIEnetStreamSlave, (obj),\
> + TYPE_XILINX_AXI_ENET_DATA_STREAM)
> +
> +typedef struct XilinxAXIEnetStreamSlave {
> + Object parent;
> +
> + struct XilinxAXIEnet *enet;
> +} XilinxAXIEnetStreamSlave;
> +
> static void axienet_rx_reset(struct XilinxAXIEnet *s)
> {
> s->rcw[1] = RCW1_JUM | RCW1_FCS | RCW1_RX | RCW1_VLAN;
> @@ -791,9 +803,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)
> {
> - struct XilinxAXIEnet *s = FROM_SYSBUS(typeof(*s), SYS_BUS_DEVICE(obj));
> + XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(obj);
> + struct XilinxAXIEnet *s = ds->enet;
>
> /* TX enable ? */
> if (!(s->tc & TC_TX)) {
> @@ -844,6 +858,17 @@ static NetClientInfo net_xilinx_enet_info = {
> static int xilinx_enet_init(SysBusDevice *dev)
> {
> struct XilinxAXIEnet *s = FROM_SYSBUS(typeof(*s), dev);
> + XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(
> + object_new(TYPE_XILINX_AXI_ENET_DATA_STREAM));
> + Error *errp = NULL;
> +
> + object_property_add_child(OBJECT(s), "data-stream", (Object *)ds, &errp);
> + assert_no_error(errp);
> + object_property_add_link(OBJECT(ds), "enet", "xlnx.axi-ethernet",
> + (Object **) &ds->enet, &errp);
> + assert_no_error(errp);
> + object_property_set_link(OBJECT(ds), OBJECT(s), "enet", &errp);
> + assert_no_error(errp);
>
> sysbus_init_irq(dev, &s->irq);
>
> @@ -886,11 +911,16 @@ static void xilinx_enet_class_init(ObjectClass *klass,
> void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
> - StreamSlaveClass *ssc = STREAM_SLAVE_CLASS(klass);
>
> k->init = xilinx_enet_init;
> dc->props = xilinx_enet_properties;
> - 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 = {
> @@ -899,6 +929,14 @@ static const TypeInfo xilinx_enet_info = {
> .instance_size = sizeof(struct XilinxAXIEnet),
> .class_init = xilinx_enet_class_init,
> .instance_init = xilinx_enet_initfn,
> +};
> +
> +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 },
> { }
> @@ -908,6 +946,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
>