From patchwork Sat Jan 30 01:00:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 8169221 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3A0899F6DA for ; Sat, 30 Jan 2016 01:05:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8730920382 for ; Sat, 30 Jan 2016 01:05:39 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A00CC20380 for ; Sat, 30 Jan 2016 01:05:38 +0000 (UTC) Received: from localhost ([::1]:37202 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPJyr-00082I-V0 for patchwork-qemu-devel@patchwork.kernel.org; Fri, 29 Jan 2016 20:05:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54927) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPJws-0004Y2-FC for qemu-devel@nongnu.org; Fri, 29 Jan 2016 20:03:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aPJwn-000827-KP for qemu-devel@nongnu.org; Fri, 29 Jan 2016 20:03:34 -0500 Received: from mail-bl2nam02on0040.outbound.protection.outlook.com ([104.47.38.40]:32896 helo=NAM02-BL2-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPJwn-00081p-EF for qemu-devel@nongnu.org; Fri, 29 Jan 2016 20:03:29 -0500 Received: from CY1NAM02FT007.eop-nam02.prod.protection.outlook.com (10.152.74.58) by CY1NAM02HT174.eop-nam02.prod.protection.outlook.com (10.152.74.216) with Microsoft SMTP Server (TLS) id 15.1.355.15; Sat, 30 Jan 2016 01:03:27 +0000 Authentication-Results: spf=fail (sender IP is 149.199.60.96) smtp.mailfrom=xilinx.com; suse.de; dkim=none (message not signed) header.d=none; suse.de; dmarc=none action=none header.from=xilinx.com; Received-SPF: Fail (protection.outlook.com: domain of xilinx.com does not designate 149.199.60.96 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.96; helo=xsj-tvapsmtpgw01; Received: from xsj-tvapsmtpgw01 (149.199.60.96) by CY1NAM02FT007.mail.protection.outlook.com (10.152.75.5) with Microsoft SMTP Server (TLS) id 15.1.355.15 via Frontend Transport; Sat, 30 Jan 2016 01:03:26 +0000 Received: from 172-16-1-203.xilinx.com ([172.16.1.203]:45446 helo=xsj-tvapsmtp02.xilinx.com) by xsj-tvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1aPJwk-0002NN-7p; Fri, 29 Jan 2016 17:03:26 -0800 Received: from [127.0.0.1] (port=52664 helo=tsj-smtp-dlp1.xlnx.xilinx.com) by xsj-tvapsmtp02.xilinx.com with esmtp (Exim 4.63) (envelope-from ) id 1aPJwk-0002sz-1m; Fri, 29 Jan 2016 17:03:26 -0800 Received: from xsj-tvapsmtp02 (xsj-tvapsmtp02.xilinx.com [172.16.1.203]) by tsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id u0U0vnxI022008; Fri, 29 Jan 2016 16:57:49 -0800 Received: from [172.19.74.182] (port=49968 helo=xsjalistai50.xlnx.xilinx.com) by xsj-tvapsmtp02 with esmtp (Exim 4.63) (envelope-from ) id 1aPJwj-0002sw-8l; Fri, 29 Jan 2016 17:03:25 -0800 From: Alistair Francis To: , , Date: Fri, 29 Jan 2016 17:00:49 -0800 Message-ID: <2710489c4ec6bf99fa4d0c1b018b167d9b513b88.1454115217.git.alistair.francis@xilinx.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: References: X-RCIS-Action: ALLOW X-TM-AS-MML: disable X-TM-AS-Product-Ver: IMSS-7.1.0.1679-8.0.0.1202-22054.006 X-TM-AS-Result: No--7.930-7.0-31-10 X-imss-scan-details: No--7.930-7.0-31-10 X-TMASE-MatchedRID: TXpevnfF2xz/uyguzMmOKFz+axQLnAVBPZmbnY2qDInI9EDAP/dptibX zlOExFTakZ3T6ylBNAWvXn8ZlTtgDIRSqwm2ppCS3fn7n/ZHGqY7r2Gtb9iBYfFJXtgF4GFL3oz JRX7b4NmOACjEIVDcsUh/KIDtn07sgVDJ+NS/WkBQiFNNqFvt1cCY5/Mqi1OiwDR44lliPu1Wie 6ItM9+JwNmGucldpE6gDLqnrRlXrZ8nn9tnqel2DsAVzN+Ov/so2CFLFdDXrowl4zF6Cqo191IJ cbG5oO/qnMvujLrQHxruEaiCF1GHA== X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:149.199.60.96; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(76176999)(4326007)(5003940100001)(2201001)(33646002)(87936001)(64026002)(118296001)(36756003)(50226001)(19580405001)(50986999)(86362001)(2906002)(586003)(50466002)(1096002)(85426001)(71366001)(11100500001)(48376002)(77096005)(5001960100002)(92566002)(575784001)(2950100001)(1220700001)(5008740100001)(189998001)(5003600100002)(3470700001)(6806005)(47776003)(105606002)(106466001)(229853001)(19580395003)(5001770100001)(107986001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1NAM02HT174; H:xsj-tvapsmtpgw01; FPR:; SPF:Fail; MLV:sfv; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 57d38d93-a1ce-4b39-ad30-08d329112939 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1NAM02HT174; X-Microsoft-Antispam-PRVS: <330174ae703440b1890631c6462caf4f@CY1NAM02HT174.eop-nam02.prod.protection.outlook.com> X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13017025)(13018025)(5005006)(13024025)(13023025)(13015025)(8121501046)(10201501046)(3002001); SRVR:CY1NAM02HT174; BCL:0; PCL:0; RULEID:; SRVR:CY1NAM02HT174; X-Forefront-PRVS: 083751FCA6 X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2016 01:03:26.7981 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.96]; Helo=[xsj-tvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1NAM02HT174 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.38.40 Cc: edgar.iglesias@xilinx.com, edgar.iglesias@gmail.com, crosthwaitepeter@gmail.com, afaerber@suse.de, alistair.francis@xilinx.com Subject: [Qemu-devel] [PATCH v3 03/16] 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Peter Crosthwaite 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 Signed-off-by: Alistair Francis --- hw/core/register.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/register.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/hw/core/register.c b/hw/core/register.c index f0fc39c..e696c43 100644 --- a/hw/core/register.c +++ b/hw/core/register.c @@ -187,3 +187,51 @@ 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 = ~0; + int shift = 0; + + if (reg->data_size != size) { + we = (size == 8) ? ~0ull : (1ull << size * 8) - 1; + 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); +} diff --git a/include/hw/register.h b/include/hw/register.h index a80427b..285d4a3 100644 --- a/include/hw/register.h +++ b/include/hw/register.h @@ -86,6 +86,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 { @@ -93,6 +95,8 @@ struct RegisterInfo { bool read_lite; bool write_lite; + MemoryRegion mem; + /* */ void *data; int data_size; @@ -129,4 +133,30 @@ uint64_t register_read(RegisterInfo *reg); void register_reset(RegisterInfo *reg); +/** + * Memory API MMIO write handler that will write to a Register API register. + * _be for big endian variant and _le for little endian. + * @opaque: RegisterInfo to write to + * @addr: Address to write + * @value: Value to write + * @size: Number of bytes to write + */ + +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); + +/** + * Memory API MMIO read handler that will read from a Register API register. + * _be for big endian variant and _le for little endian. + * @opaque: RegisterInfo to read from + * @addr: Address to read + * @size: Number of bytes to read + * returns: Value read from register + */ + +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