From patchwork Fri Apr 5 08:43:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Crosthwaite X-Patchwork-Id: 234068 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 E4BE52C00A3 for ; Fri, 5 Apr 2013 19:55:40 +1100 (EST) Received: from localhost ([::1]:54389 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UO2Qt-0000FZ-86 for incoming@patchwork.ozlabs.org; Fri, 05 Apr 2013 04:55:39 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48789) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UO2QY-0000F3-VH for qemu-devel@nongnu.org; Fri, 05 Apr 2013 04:55:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UO2QT-0001Ye-Ql for qemu-devel@nongnu.org; Fri, 05 Apr 2013 04:55:18 -0400 Received: from mail-pa0-f42.google.com ([209.85.220.42]:38753) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UO2HQ-0006F1-Su for qemu-devel@nongnu.org; Fri, 05 Apr 2013 04:45:53 -0400 Received: by mail-pa0-f42.google.com with SMTP id kq13so1936663pab.29 for ; Fri, 05 Apr 2013 01:45:52 -0700 (PDT) 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=l7EXkt4LTNw6WnJGmlOHViaK3JQrnZeic2QxySbiEe0=; b=PMyn5FTWJ/adnUdCZc0spjiZUEbPbm/yKf+pTLIKpExkZTmEfK0D1plkIo2h8ZElTE f090TXWegTyrZUJWk9yn2dOPIw/mlMbJy7h9eE97eA3CJ2K0HLP6sAPXCjlRBvFBhQX3 hsoCTXAPoj84t4EVz5v2f7FJtrVuciyb0g1MRxzXz0VldcdrRAN7pBHdiA53e2r3ZrQe Jz8u3jK0wJPkgzI6NT71TUbP3c7+6KtlfHEDt6meKHG3OfFlM7jVPCO6ts6Gv1oJ6ceP c3/JflbWEjNyUsRDHrP5lVl8ZARYdb8ojCf6K1H/eXqrXfwyGbfjkATnZxax2GXp/MDx GlYQ== X-Received: by 10.66.170.176 with SMTP id an16mr14141869pac.24.1365151552126; Fri, 05 Apr 2013 01:45:52 -0700 (PDT) Received: from localhost ([149.199.62.254]) by mx.google.com with ESMTPS id mz8sm13648416pbc.9.2013.04.05.01.45.49 (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Fri, 05 Apr 2013 01:45:51 -0700 (PDT) From: Peter Crosthwaite To: qemu-devel@nongnu.org Date: Fri, 5 Apr 2013 18:43:42 +1000 Message-Id: <7ac19859ba3aed6c19c5f0645ae8f588c9e6a47c.1365151096.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: ALoCoQlnjhvKF8etp/GeotjYZSs01QRqOoigRFnV02SUtZzLnoHue8WNB7IRQWIfXvhRw5bpsEW8 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.220.42 Cc: peter.maydell@linaro.org, Peter Crosthwaite , mst@redhat.com, blauwirbel@gmail.com, kraxel@redhat.com, edgar.iglesias@gmail.com Subject: [Qemu-devel] [PATCH v2 3/5] register: Add Memory API glue 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 Add memory io handlers that glue the register API to the memory API. Just translation functions at this stage. Although it does allow for devices to be created without all-in-one mmio r/w handlers. Signed-off-by: Peter Crosthwaite --- include/exec/register.h | 13 +++++++++++++ register.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 0 deletions(-) diff --git a/include/exec/register.h b/include/exec/register.h index 0b05439..f30c98e 100644 --- a/include/exec/register.h +++ b/include/exec/register.h @@ -13,6 +13,7 @@ #include #include +#include "exec/memory.h" typedef struct RegisterInfo RegisterInfo; typedef struct RegisterAccessInfo RegisterAccessInfo; @@ -92,6 +93,8 @@ struct RegisterAccessInfo { * @prefix: String prefix for log and debug messages * * @opaque: Opaque data for the register + * + * @mem: optional Memory region for the register */ struct RegisterInfo { @@ -105,6 +108,8 @@ struct RegisterInfo { const char *prefix; void *opaque; + + MemoryRegion mem; }; /** @@ -131,4 +136,12 @@ uint64_t register_read(RegisterInfo *reg); void register_reset(RegisterInfo *reg); +void register_write_memory_be(void *opaque, hwaddr addr, uint64_t value, + unsigned size); +void register_write_memory_le(void *opaque, hwaddr addr, uint64_t value, + unsigned size); + +uint64_t register_read_memory_be(void *opaque, hwaddr addr, unsigned size); +uint64_t register_read_memory_le(void *opaque, hwaddr addr, unsigned size); + #endif diff --git a/register.c b/register.c index 439f2f2..7b7b6df 100644 --- a/register.c +++ b/register.c @@ -162,3 +162,46 @@ void register_reset(RegisterInfo *reg) register_write_val(reg, reg->access->reset); } + +static inline void register_write_memory(void *opaque, hwaddr addr, + uint64_t value, unsigned size, bool be) +{ + RegisterInfo *reg = opaque; + uint64_t we = (size == 8) ? ~0ull : (1ull << size * 8) - 1; + int shift = 8 * (be ? reg->data_size - size - addr : addr); + + assert(size + addr <= reg->data_size); + register_write(reg, value << shift, we << shift); +} + +void register_write_memory_be(void *opaque, hwaddr addr, uint64_t value, + unsigned size) +{ + register_write_memory(opaque, addr, value, size, true); +} + + +void register_write_memory_le(void *opaque, hwaddr addr, uint64_t value, + unsigned size) +{ + register_write_memory(opaque, addr, value, size, false); +} + +static inline uint64_t register_read_memory(void *opaque, hwaddr addr, + unsigned size, bool be) +{ + RegisterInfo *reg = opaque; + int shift = 8 * (be ? reg->data_size - size - addr : addr); + + return register_read(reg) >> shift; +} + +uint64_t register_read_memory_be(void *opaque, hwaddr addr, unsigned size) +{ + return register_read_memory(opaque, addr, size, true); +} + +uint64_t register_read_memory_le(void *opaque, hwaddr addr, unsigned size) +{ + return register_read_memory(opaque, addr, size, false); +}