All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] etrax: QDevify the Ethernet MAC.
Date: Tue, 9 Aug 2011 13:54:41 +0200	[thread overview]
Message-ID: <20110809115441.GA4516@edde.se.axis.com> (raw)

Hi,

This QDevifies the ETRAX Ethernet MAC. DMA Connections remain
adhoc..

Cheers

commit ad1a1afaa185de0ed668f9bc3fb4f3cb076b32a0
Author: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Date:   Tue Aug 9 13:24:04 2011 +0200

    etrax: QDevify the Ethernet MAC.
    
    Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>

diff --git a/hw/cris_pic_cpu.c b/hw/cris_pic_cpu.c
index a92d445..7f1e4ab 100644
--- a/hw/cris_pic_cpu.c
+++ b/hw/cris_pic_cpu.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 
+#include "sysbus.h"
 #include "hw.h"
 #include "pc.h"
 #include "etraxfs.h"
diff --git a/hw/etraxfs.h b/hw/etraxfs.h
index 5c61f1b..1554b0b 100644
--- a/hw/etraxfs.h
+++ b/hw/etraxfs.h
@@ -25,6 +25,21 @@
 #include "etraxfs_dma.h"
 
 qemu_irq *cris_pic_init_cpu(CPUState *env);
-void etraxfs_eth_init(NICInfo *nd, target_phys_addr_t base, int phyaddr,
-                      struct etraxfs_dma_client *dma_out,
-                      struct etraxfs_dma_client *dma_in);
+
+/* Instantiate an ETRAXFS Ethernet MAC.  */
+static inline DeviceState *
+etraxfs_eth_init(NICInfo *nd, target_phys_addr_t base, int phyaddr,
+                 void *dma_out, void *dma_in)
+{
+    DeviceState *dev;
+    qemu_check_nic_model(nd, "fseth");
+
+    dev = qdev_create(NULL, "etraxfs-eth");
+    qdev_set_nic_properties(dev, nd);
+    qdev_prop_set_uint32(dev, "phyaddr", phyaddr);
+    qdev_prop_set_ptr(dev, "dma_out", dma_out);
+    qdev_prop_set_ptr(dev, "dma_in", dma_in);
+    qdev_init_nofail(dev);
+    sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
+    return dev;
+}
diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c
index 6453077..92d4eca 100644
--- a/hw/etraxfs_eth.c
+++ b/hw/etraxfs_eth.c
@@ -23,7 +23,7 @@
  */
 
 #include <stdio.h>
-#include "hw.h"
+#include "sysbus.h"
 #include "net.h"
 #include "etraxfs.h"
 
@@ -319,6 +319,7 @@ static void mdio_cycle(struct qemu_mdio *bus)
 
 struct fs_eth
 {
+	SysBusDevice busdev;
 	NICState *nic;
 	NICConf conf;
 	int ethregs;
@@ -327,8 +328,14 @@ struct fs_eth
 	uint8_t macaddr[2][6];
 	uint32_t regs[FS_ETH_MAX_REGS];
 
-	struct etraxfs_dma_client *dma_out;
-	struct etraxfs_dma_client *dma_in;
+	union {
+		void *vdma_out;
+		struct etraxfs_dma_client *dma_out;
+	};
+	union {
+		void *vdma_in;
+		struct etraxfs_dma_client *dma_in;
+	};
 
 	/* MDIO bus.  */
 	struct qemu_mdio mdio_bus;
@@ -579,37 +586,50 @@ static NetClientInfo net_etraxfs_info = {
 	.link_status_changed = eth_set_link,
 };
 
-void etraxfs_eth_init(NICInfo *nd, target_phys_addr_t base, int phyaddr,
-                       struct etraxfs_dma_client *dma_out,
-                       struct etraxfs_dma_client *dma_in)
+static int fs_eth_init(SysBusDevice *dev)
 {
-	struct fs_eth *eth = NULL;
+	struct fs_eth *s = FROM_SYSBUS(typeof(*s), dev);
+	int eth_regs;
 
-	qemu_check_nic_model(nd, "fseth");
-
-	eth = qemu_mallocz(sizeof *eth);
+	if (!s->dma_out || !s->dma_in) {
+		hw_error("Unconnected ETRAX-FS Ethernet MAC.\n");
+	}
 
-	dma_out->client.push = eth_tx_push;
-	dma_out->client.opaque = eth;
-	dma_in->client.opaque = eth;
-	dma_in->client.pull = NULL;
+	s->dma_out->client.push = eth_tx_push;
+	s->dma_out->client.opaque = s;
+	s->dma_in->client.opaque = s;
+	s->dma_in->client.pull = NULL;
 
-	eth->dma_out = dma_out;
-	eth->dma_in = dma_in;
+	eth_regs = cpu_register_io_memory(eth_read, eth_write, s,
+					  DEVICE_LITTLE_ENDIAN);
+	sysbus_init_mmio(dev, 0x5c, eth_regs);
 
-	/* Connect the phy.  */
-	eth->phyaddr = phyaddr & 0x1f;
-	tdk_init(&eth->phy);
-	mdio_attach(&eth->mdio_bus, &eth->phy, eth->phyaddr);
+	qemu_macaddr_default_if_unset(&s->conf.macaddr);
+	s->nic = qemu_new_nic(&net_etraxfs_info, &s->conf,
+			      dev->qdev.info->name, dev->qdev.id, s);
+	qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a);
 
-	eth->ethregs = cpu_register_io_memory(eth_read, eth_write, eth,
-                                              DEVICE_NATIVE_ENDIAN);
-	cpu_register_physical_memory (base, 0x5c, eth->ethregs);
+	tdk_init(&s->phy);
+	mdio_attach(&s->mdio_bus, &s->phy, s->phyaddr);
+	return 0;
+}
 
-	eth->conf.macaddr = nd->macaddr;
-	eth->conf.vlan = nd->vlan;
-	eth->conf.peer = nd->netdev;
+static SysBusDeviceInfo etraxfs_eth_info = {
+	.init = fs_eth_init,
+	.qdev.name  = "etraxfs-eth",
+	.qdev.size  = sizeof(struct fs_eth),
+	.qdev.props = (Property[]) {
+		DEFINE_PROP_UINT32("phyaddr", struct fs_eth, phyaddr, 1),
+		DEFINE_PROP_PTR("dma_out", struct fs_eth, vdma_out),
+		DEFINE_PROP_PTR("dma_in", struct fs_eth, vdma_in),
+		DEFINE_NIC_PROPERTIES(struct fs_eth, conf),
+		DEFINE_PROP_END_OF_LIST(),
+	}
+};
 
-	eth->nic = qemu_new_nic(&net_etraxfs_info, &eth->conf,
-				nd->model, nd->name, eth);
+static void etraxfs_eth_register(void)
+{
+	sysbus_register_withprop(&etraxfs_eth_info);
 }
+
+device_init(etraxfs_eth_register)

                 reply	other threads:[~2011-08-09 13:52 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110809115441.GA4516@edde.se.axis.com \
    --to=edgar.iglesias@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.