From patchwork Thu Jul 12 16:54:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Maksim E. Kozlov" X-Patchwork-Id: 170732 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 5484D2C02C1 for ; Fri, 13 Jul 2012 03:13:45 +1000 (EST) Received: from localhost ([::1]:36806 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SpMg2-0000HY-CM for incoming@patchwork.ozlabs.org; Thu, 12 Jul 2012 12:55:42 -0400 Received: from eggs.gnu.org ([208.118.235.92]:49940) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SpMfP-000722-OZ for qemu-devel@nongnu.org; Thu, 12 Jul 2012 12:55:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SpMfN-0007uO-SX for qemu-devel@nongnu.org; Thu, 12 Jul 2012 12:55:03 -0400 Received: from mailout4.w1.samsung.com ([210.118.77.14]:59241) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SpMfN-0007tl-N9 for qemu-devel@nongnu.org; Thu, 12 Jul 2012 12:55:01 -0400 Received: from eusync3.samsung.com (mailout4.w1.samsung.com [210.118.77.14]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0M7200K7Q4CR0SC0@mailout4.w1.samsung.com> for qemu-devel@nongnu.org; Thu, 12 Jul 2012 17:55:39 +0100 (BST) Received: from felix.rnd.samsung.ru ([106.109.9.187]) by eusync3.samsung.com (Oracle Communications Messaging Server 7u4-23.01 (7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0M72009E74AVG690@eusync3.samsung.com> for qemu-devel@nongnu.org; Thu, 12 Jul 2012 17:54:59 +0100 (BST) From: Maksim Kozlov To: qemu-devel@nongnu.org Date: Thu, 12 Jul 2012 20:54:27 +0400 Message-id: <1342112068-23345-4-git-send-email-m.kozlov@samsung.com> X-Mailer: git-send-email 1.7.5.4 In-reply-to: <1342112068-23345-1-git-send-email-m.kozlov@samsung.com> References: <1342112068-23345-1-git-send-email-m.kozlov@samsung.com> X-TM-AS-MML: No X-detected-operating-system: by eggs.gnu.org: Solaris 10 (1203?) X-Received-From: 210.118.77.14 Cc: peter.maydell@linaro.org, kyungmin.park@samsung.com, Maksim Kozlov , e.voevodin@samsung.com Subject: [Qemu-devel] [PATCH v2 3/4] ARM: exynos4210_pmu: Introduced exynos4210_pmu_get_register_index 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 This patch just introduces exynos4210_pmu_get_register_index function to get index of the register's value in the array on its offset. And functions _read and _write were modified accordingly. Signed-off-by: Maksim Kozlov --- hw/exynos4210_pmu.c | 56 ++++++++++++++++++++++++++++++++------------------ 1 files changed, 36 insertions(+), 20 deletions(-) diff --git a/hw/exynos4210_pmu.c b/hw/exynos4210_pmu.c index 26a726f..7f09c79 100644 --- a/hw/exynos4210_pmu.c +++ b/hw/exynos4210_pmu.c @@ -401,48 +401,64 @@ static const Exynos4210PmuReg exynos4210_pmu_regs[] = { #define PMU_NUM_OF_REGISTERS \ (sizeof(exynos4210_pmu_regs) / sizeof(Exynos4210PmuReg)) +#define PMU_UNKNOWN_OFFSET 0xFFFFFFFF + typedef struct Exynos4210PmuState { SysBusDevice busdev; MemoryRegion iomem; uint32_t reg[PMU_NUM_OF_REGISTERS]; } Exynos4210PmuState; -static uint64_t exynos4210_pmu_read(void *opaque, target_phys_addr_t offset, - unsigned size) +static uint32_t exynos4210_pmu_get_register_index(Exynos4210PmuState *s, + uint32_t offset) { - Exynos4210PmuState *s = (Exynos4210PmuState *)opaque; - unsigned i; const Exynos4210PmuReg *reg_p = exynos4210_pmu_regs; + uint32_t i; for (i = 0; i < PMU_NUM_OF_REGISTERS; i++) { if (reg_p->offset == offset) { - PRINT_DEBUG_EXTEND("%s [0x%04x] -> 0x%04x\n", reg_p->name, - (uint32_t)offset, s->reg[i]); - return s->reg[i]; + return i; } reg_p++; } - PRINT_DEBUG("QEMU PMU ERROR: bad read offset 0x%04x\n", (uint32_t)offset); - return 0; + + return PMU_UNKNOWN_OFFSET; +} + +static uint64_t exynos4210_pmu_read(void *opaque, target_phys_addr_t offset, + unsigned size) +{ + Exynos4210PmuState *s = (Exynos4210PmuState *)opaque; + uint32_t index = exynos4210_pmu_get_register_index(s, offset); + + if (index == PMU_UNKNOWN_OFFSET) { + PRINT_DEBUG("QEMU PMU ERROR: bad read offset 0x%04x\n", + (uint32_t)offset); + return 0; + } + + PRINT_DEBUG_EXTEND("%s [0x%04x] -> 0x%04x\n", + exynos4210_pmu_regs[index].name, (uint32_t)offset, s->reg[index]); + + return s->reg[index]; } static void exynos4210_pmu_write(void *opaque, target_phys_addr_t offset, uint64_t val, unsigned size) { Exynos4210PmuState *s = (Exynos4210PmuState *)opaque; - unsigned i; - const Exynos4210PmuReg *reg_p = exynos4210_pmu_regs; + uint32_t index = exynos4210_pmu_get_register_index(s, offset); - for (i = 0; i < PMU_NUM_OF_REGISTERS; i++) { - if (reg_p->offset == offset) { - PRINT_DEBUG_EXTEND("%s <0x%04x> <- 0x%04x\n", reg_p->name, - (uint32_t)offset, (uint32_t)val); - s->reg[i] = val; - return; - } - reg_p++; + if (index == PMU_UNKNOWN_OFFSET) { + PRINT_DEBUG("QEMU PMU ERROR: bad write offset 0x%04x\n", + (uint32_t)offset); + return; } - PRINT_DEBUG("QEMU PMU ERROR: bad write offset 0x%04x\n", (uint32_t)offset); + + PRINT_DEBUG_EXTEND("%s [0x%04x] <- 0x%04x\n", + exynos4210_pmu_regs[index].name, (uint32_t)offset, (uint32_t)val); + + s->reg[index] = val; } static const MemoryRegionOps exynos4210_pmu_ops = {