From patchwork Tue Feb 12 01:17:12 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Crosthwaite X-Patchwork-Id: 219719 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 971BF2C0307 for ; Tue, 12 Feb 2013 12:44:57 +1100 (EST) Received: from localhost ([::1]:47790 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U54vW-0006Db-SP for incoming@patchwork.ozlabs.org; Mon, 11 Feb 2013 20:44:54 -0500 Received: from eggs.gnu.org ([208.118.235.92]:58320) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U54vN-0006Be-SU for qemu-devel@nongnu.org; Mon, 11 Feb 2013 20:44:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U54vM-00023T-DL for qemu-devel@nongnu.org; Mon, 11 Feb 2013 20:44:45 -0500 Received: from mail-ia0-x22e.google.com ([2607:f8b0:4001:c02::22e]:65393) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U54vM-00023P-7a for qemu-devel@nongnu.org; Mon, 11 Feb 2013 20:44:44 -0500 Received: by mail-ia0-f174.google.com with SMTP id o25so6952750iad.5 for ; Mon, 11 Feb 2013 17:44:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references:in-reply-to:references:x-gm-message-state; bh=i1VqsLw53mg8Lp6z9fPw8XdIGEGxLivTRB03y+WPuPM=; b=K6FnU1TcPrIt0XkrDSi6y0JbxC0SzfXOWebpLjflvyS7jtcid/2UZ4IiVVIEInG+c/ 745Mt5VDNu7nsRN8uPN3k0SDSDQM73J6GV/vyrgMsxbl52SDAvwc/lUKY0SvzNqq47iW 5FAeZD8rlBKsxfvuaIITorXw/bI31VUXhjY5JeCrB5fdj6zMWnix36W8dSFBEBFYkbt/ RpyNZgBQ0vX2akIHH+6WguK57Zgx+WL94/j9l4p/ol879ROyPl+4xLOrqu0wlkP/uuKg 7kciBuhC2+LeW7jbDPFSMa1Nhql3Cah/SVyJbOoRswXraKi+V40wwLC3O1FCpdfYnk6k PMzA== X-Received: by 10.43.9.137 with SMTP id ow9mr5317552icb.32.1360631904071; Mon, 11 Feb 2013 17:18:24 -0800 (PST) Received: from localhost ([101.168.58.94]) by mx.google.com with ESMTPS id as6sm28820059igc.8.2013.02.11.17.18.19 (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Mon, 11 Feb 2013 17:18:23 -0800 (PST) From: Peter Crosthwaite To: qemu-devel@nongnu.org Date: Tue, 12 Feb 2013 11:17:12 +1000 Message-Id: <58b0886852b27b243099cc07ef9ef4da56c01f1e.1360631576.git.peter.crosthwaite@xilinx.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: References: In-Reply-To: References: X-Gm-Message-State: ALoCoQnge3m0FmFsJV/Jk8Ak+st8l5UbuYphHKGJKiglMPTmvMKITtULWZ4f3AZjNbUOMB5ce1qH X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4001:c02::22e Cc: Peter Crosthwaite , edgar.iglesias@gmail.com, aliguori@us.ibm.com, afaerber@suse.de Subject: [Qemu-devel] [RFC PATCH v1 3/4] xilinx_axienet: Create Proxy object for stream X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- 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)