From patchwork Wed Jun 29 18:15:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fu Wei Fu X-Patchwork-Id: 71202 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp2295313qgy; Wed, 29 Jun 2016 11:18:58 -0700 (PDT) X-Received: by 10.98.9.68 with SMTP id e65mr14120245pfd.121.1467224338140; Wed, 29 Jun 2016 11:18:58 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bq4si5417441pac.235.2016.06.29.11.18.57; Wed, 29 Jun 2016 11:18:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932093AbcF2SRm (ORCPT + 30 others); Wed, 29 Jun 2016 14:17:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51253 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751984AbcF2SRb (ORCPT ); Wed, 29 Jun 2016 14:17:31 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 97A147EBCC; Wed, 29 Jun 2016 18:16:54 +0000 (UTC) Received: from rei-ayanami.redhat.com (vpn1-4-13.pek2.redhat.com [10.72.4.13]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u5TIG89e019803; Wed, 29 Jun 2016 14:16:47 -0400 From: fu.wei@linaro.org To: rjw@rjwysocki.net, lenb@kernel.org, daniel.lezcano@linaro.org, tglx@linutronix.de, marc.zyngier@arm.com, hanjun.guo@linaro.org Cc: linux-arm-kernel@lists.infradead.org, linaro-acpi@lists.linaro.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, rruigrok@codeaurora.org, harba@codeaurora.org, cov@codeaurora.org, timur@codeaurora.org, graeme.gregory@linaro.org, al.stone@linaro.org, jcm@redhat.com, wei@redhat.com, arnd@arndb.de, wim@iguana.be, catalin.marinas@arm.com, will.deacon@arm.com, Suravee.Suthikulpanit@amd.com, leo.duran@amd.com, Fu Wei Subject: [PATCH v6 05/10] acpi: Add arch_timer support in GTDT table parse driver Date: Thu, 30 Jun 2016 02:15:48 +0800 Message-Id: <1467224153-22873-6-git-send-email-fu.wei@linaro.org> In-Reply-To: <1467224153-22873-1-git-send-email-fu.wei@linaro.org> References: <1467224153-22873-1-git-send-email-fu.wei@linaro.org> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 29 Jun 2016 18:16:55 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Fu Wei This patch adds support for parsing arch timer in GTDT, provides some kernel APIs to parse all the PPIs and always-on info in GTDT and export them. By this driver, we can simplify arm_arch_timer drivers, and separate the ACPI GTDT knowledge from it. Signed-off-by: Fu Wei Signed-off-by: Hanjun Guo --- drivers/acpi/acpi_gtdt.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/acpi.h | 6 +++++ 2 files changed, 76 insertions(+) -- 2.5.5 diff --git a/drivers/acpi/acpi_gtdt.c b/drivers/acpi/acpi_gtdt.c index 54d7644e..edb5a8c 100644 --- a/drivers/acpi/acpi_gtdt.c +++ b/drivers/acpi/acpi_gtdt.c @@ -16,6 +16,8 @@ #include #include +#include + #undef pr_fmt #define pr_fmt(fmt) "GTDT: " fmt @@ -83,3 +85,71 @@ static int __init acpi_gtdt_desc_init(struct acpi_table_header *table) return gtdt->platform_timer_count; } + +static int __init map_generic_timer_interrupt(u32 interrupt, u32 flags) +{ + int trigger, polarity; + + if (!interrupt) + return 0; + + trigger = (flags & ACPI_GTDT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE + : ACPI_LEVEL_SENSITIVE; + + polarity = (flags & ACPI_GTDT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW + : ACPI_ACTIVE_HIGH; + + return acpi_register_gsi(NULL, interrupt, trigger, polarity); +} + +/* + * Map the PPIs of per-cpu arch_timer. + * @type: the type of PPI + * Returns 0 if error. + */ +int __init acpi_gtdt_map_ppi(int type) +{ + struct acpi_table_gtdt *gtdt = acpi_gtdt_desc.gtdt; + + switch (type) { + case PHYS_SECURE_PPI: + return map_generic_timer_interrupt(gtdt->secure_el1_interrupt, + gtdt->secure_el1_flags); + case PHYS_NONSECURE_PPI: + return map_generic_timer_interrupt(gtdt->non_secure_el1_interrupt, + gtdt->non_secure_el1_flags); + case VIRT_PPI: + return map_generic_timer_interrupt(gtdt->virtual_timer_interrupt, + gtdt->virtual_timer_flags); + + case HYP_PPI: + return map_generic_timer_interrupt(gtdt->non_secure_el2_interrupt, + gtdt->non_secure_el2_flags); + default: + pr_err("ppi type error.\n"); + } + + return 0; +} + +/* + * acpi_gtdt_c3stop - got c3stop info from GTDT + * + * Returns 1 if the timer is powered in deep idle state, 0 otherwise. + */ +int __init acpi_gtdt_c3stop(void) +{ + struct acpi_table_gtdt *gtdt = acpi_gtdt_desc.gtdt; + + return !(gtdt->non_secure_el1_flags & ACPI_GTDT_ALWAYS_ON); +} + +int __init gtdt_arch_timer_init(struct acpi_table_header *table) +{ + if (table) + return acpi_gtdt_desc_init(table); + + pr_err("table pointer error.\n"); + + return -EINVAL; +} diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 288fac5..8439579 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -532,6 +532,12 @@ void acpi_walk_dep_device_list(acpi_handle handle); struct platform_device *acpi_create_platform_device(struct acpi_device *); #define ACPI_PTR(_ptr) (_ptr) +#ifdef CONFIG_ACPI_GTDT +int __init gtdt_arch_timer_init(struct acpi_table_header *table); +int __init acpi_gtdt_map_ppi(int type); +int __init acpi_gtdt_c3stop(void); +#endif + #else /* !CONFIG_ACPI */ #define acpi_disabled 1