Patchwork [v4,16/16] e1000: implement MemoryRegionOps's ref&lock interface

login
register
mail settings
Submitter pingfank@linux.vnet.ibm.com
Date Oct. 22, 2012, 9:23 a.m.
Message ID <1350897839-29593-17-git-send-email-pingfank@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/193185/
State New
Headers show

Comments

pingfank@linux.vnet.ibm.com - Oct. 22, 2012, 9:23 a.m.
With this, e1000 tells memory core that it can be protected by
refcnt, and can protected by local lock

Signed-off-by: Liu Ping Fan <pingfank@linux.vnet.ibm.com>
---
 hw/e1000.c |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

Patch

diff --git a/hw/e1000.c b/hw/e1000.c
index 72c2324..9929fe6 100644
--- a/hw/e1000.c
+++ b/hw/e1000.c
@@ -1082,9 +1082,40 @@  e1000_mmio_read(void *opaque, target_phys_addr_t addr, unsigned size)
     return ret;
 }
 
+static void e1000_mmio_lock(MemoryRegion *mr)
+{
+    E1000State *d = container_of(mr, E1000State, mmio);
+    qemu_mutex_lock(&d->e1000_lock);
+}
+
+static void e1000_mmio_unlock(MemoryRegion *mr)
+{
+    E1000State *d = container_of(mr, E1000State, mmio);
+    qemu_mutex_unlock(&d->e1000_lock);
+}
+
+static int e1000_mmio_ref(MemoryRegion *mr)
+{
+    E1000State *e1000 = container_of(mr, E1000State, mmio);
+
+    object_ref(OBJECT(e1000));
+    return 1;
+}
+
+static void e1000_mmio_unref(MemoryRegion *mr)
+{
+    E1000State *e1000 = container_of(mr, E1000State, mmio);
+
+    object_unref(OBJECT(e1000));
+}
+
 static const MemoryRegionOps e1000_mmio_ops = {
     .read = e1000_mmio_read,
     .write = e1000_mmio_write,
+    .ref = e1000_mmio_ref,
+    .unref = e1000_mmio_unref,
+    .lock = e1000_mmio_lock,
+    .unlock = e1000_mmio_unlock,
     .endianness = DEVICE_LITTLE_ENDIAN,
     .impl = {
         .min_access_size = 4,