From: "Hervé Poussineau" <hpoussin@reactos.org>
To: qemu-devel@nongnu.org
Cc: "Hervé Poussineau" <hpoussin@reactos.org>
Subject: [Qemu-devel] [PATCH 1/2] mipsnet: convert to qdev
Date: Sun, 4 Sep 2011 22:29:26 +0200 [thread overview]
Message-ID: <1315168167-10654-1-git-send-email-hpoussin@reactos.org> (raw)
Move mipsnet_init() function to mipssim machine
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/mips.h | 3 --
hw/mips_mipssim.c | 18 ++++++++++++
hw/mipsnet.c | 80 +++++++++++++++++++++++++++++++----------------------
3 files changed, 65 insertions(+), 36 deletions(-)
diff --git a/hw/mips.h b/hw/mips.h
index 472cfb0..4d4d503 100644
--- a/hw/mips.h
+++ b/hw/mips.h
@@ -8,9 +8,6 @@ PCIBus *gt64120_register(qemu_irq *pic);
/* bonito.c */
PCIBus *bonito_init(qemu_irq *pic);
-/* mipsnet.c */
-void mipsnet_init(int base, qemu_irq irq, NICInfo *nd);
-
/* rc4030.c */
typedef struct rc4030DMAState *rc4030_dma;
void rc4030_dma_memory_rw(void *opaque, target_phys_addr_t addr, uint8_t *buf, int len, int is_write);
diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c
index 0d46cc4..ac65555 100644
--- a/hw/mips_mipssim.c
+++ b/hw/mips_mipssim.c
@@ -35,6 +35,8 @@
#include "mips-bios.h"
#include "loader.h"
#include "elf.h"
+#include "sysbus.h"
+#include "exec-memory.h"
static struct _loaderparams {
int ram_size;
@@ -112,6 +114,22 @@ static void main_cpu_reset(void *opaque)
}
}
+static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
+{
+ DeviceState *dev;
+ SysBusDevice *s;
+
+ dev = qdev_create(NULL, "mipsnet");
+ qdev_set_nic_properties(dev, nd);
+ qdev_init_nofail(dev);
+
+ s = sysbus_from_qdev(dev);
+ sysbus_connect_irq(s, 0, irq);
+ memory_region_add_subregion(get_system_io(),
+ base,
+ sysbus_mmio_get_region(s, 0));
+}
+
static void
mips_mipssim_init (ram_addr_t ram_size,
const char *boot_device,
diff --git a/hw/mipsnet.c b/hw/mipsnet.c
index b889ee0..9a29ffe 100644
--- a/hw/mipsnet.c
+++ b/hw/mipsnet.c
@@ -1,7 +1,6 @@
#include "hw.h"
-#include "mips.h"
#include "net.h"
-#include "isa.h"
+#include "sysbus.h"
//#define DEBUG_MIPSNET_SEND
//#define DEBUG_MIPSNET_RECEIVE
@@ -25,6 +24,8 @@
#define MAX_ETH_FRAME_SIZE 1514
typedef struct MIPSnetState {
+ SysBusDevice busdev;
+
uint32_t busy;
uint32_t rx_count;
uint32_t rx_read;
@@ -33,7 +34,7 @@ typedef struct MIPSnetState {
uint32_t intctl;
uint8_t rx_buffer[MAX_ETH_FRAME_SIZE];
uint8_t tx_buffer[MAX_ETH_FRAME_SIZE];
- int io_base;
+ MemoryRegion io;
qemu_irq irq;
NICState *nic;
NICConf conf;
@@ -103,7 +104,8 @@ static ssize_t mipsnet_receive(VLANClientState *nc, const uint8_t *buf, size_t s
return size;
}
-static uint32_t mipsnet_ioport_read(void *opaque, uint32_t addr)
+static uint64_t mipsnet_ioport_read(void *opaque, target_phys_addr_t addr,
+ unsigned int size)
{
MIPSnetState *s = opaque;
int ret = 0;
@@ -150,7 +152,8 @@ static uint32_t mipsnet_ioport_read(void *opaque, uint32_t addr)
return ret;
}
-static void mipsnet_ioport_write(void *opaque, uint32_t addr, uint32_t val)
+static void mipsnet_ioport_write(void *opaque, target_phys_addr_t addr,
+ uint64_t val, unsigned int size)
{
MIPSnetState *s = opaque;
@@ -224,11 +227,7 @@ static void mipsnet_cleanup(VLANClientState *nc)
{
MIPSnetState *s = DO_UPCAST(NICState, nc, nc)->opaque;
- vmstate_unregister(NULL, &vmstate_mipsnet, s);
-
- isa_unassign_ioport(s->io_base, 36);
-
- g_free(s);
+ s->nic = NULL;
}
static NetClientInfo net_mipsnet_info = {
@@ -239,35 +238,50 @@ static NetClientInfo net_mipsnet_info = {
.cleanup = mipsnet_cleanup,
};
-void mipsnet_init (int base, qemu_irq irq, NICInfo *nd)
-{
- MIPSnetState *s;
-
- qemu_check_nic_model(nd, "mipsnet");
+static MemoryRegionOps mipsnet_ioport_ops = {
+ .read = mipsnet_ioport_read,
+ .write = mipsnet_ioport_write,
+ .impl.min_access_size = 1,
+ .impl.max_access_size = 4,
+};
- s = g_malloc0(sizeof(MIPSnetState));
+static int mipsnet_sysbus_init(SysBusDevice *dev)
+{
+ MIPSnetState *s = DO_UPCAST(MIPSnetState, busdev, dev);
- register_ioport_write(base, 36, 1, mipsnet_ioport_write, s);
- register_ioport_read(base, 36, 1, mipsnet_ioport_read, s);
- register_ioport_write(base, 36, 2, mipsnet_ioport_write, s);
- register_ioport_read(base, 36, 2, mipsnet_ioport_read, s);
- register_ioport_write(base, 36, 4, mipsnet_ioport_write, s);
- register_ioport_read(base, 36, 4, mipsnet_ioport_read, s);
+ memory_region_init_io(&s->io, &mipsnet_ioport_ops, s, "mipsnet-io", 36);
+ sysbus_init_mmio_region(dev, &s->io);
+ sysbus_init_irq(dev, &s->irq);
- s->io_base = base;
- s->irq = irq;
+ s->nic = qemu_new_nic(&net_mipsnet_info, &s->conf,
+ dev->qdev.info->name, dev->qdev.id, s);
+ qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a);
- if (nd) {
- s->conf.macaddr = nd->macaddr;
- s->conf.vlan = nd->vlan;
- s->conf.peer = nd->netdev;
+ return 0;
+}
- s->nic = qemu_new_nic(&net_mipsnet_info, &s->conf,
- nd->model, nd->name, s);
+static void mipsnet_sysbus_reset(DeviceState *dev)
+{
+ MIPSnetState *s = DO_UPCAST(MIPSnetState, busdev.qdev, dev);
+ mipsnet_reset(s);
+}
- qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a);
+static SysBusDeviceInfo mipsnet_info = {
+ .init = mipsnet_sysbus_init,
+ .qdev.name = "mipsnet",
+ .qdev.desc = "MIPS Simulator network device",
+ .qdev.size = sizeof(MIPSnetState),
+ .qdev.vmsd = &vmstate_mipsnet,
+ .qdev.reset = mipsnet_sysbus_reset,
+ .qdev.props = (Property[]) {
+ DEFINE_NIC_PROPERTIES(MIPSnetState, conf),
+ DEFINE_PROP_END_OF_LIST(),
}
+};
- mipsnet_reset(s);
- vmstate_register(NULL, 0, &vmstate_mipsnet, s);
+static void mipsnet_register_devices(void)
+{
+ sysbus_register_withprop(&mipsnet_info);
}
+
+device_init(mipsnet_register_devices)
--
1.7.5.4
next reply other threads:[~2011-09-04 20:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-04 20:29 Hervé Poussineau [this message]
2011-09-04 20:29 ` [Qemu-devel] [PATCH 2/2] mipsnet: use trace framework Hervé Poussineau
2011-09-12 11:34 ` Paolo Bonzini
2011-09-10 18:34 ` [Qemu-devel] [PATCH 1/2] mipsnet: convert to qdev Blue Swirl
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=1315168167-10654-1-git-send-email-hpoussin@reactos.org \
--to=hpoussin@reactos.org \
--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.