Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1834067ybh; Fri, 17 Jul 2020 02:23:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqDbo0fUESwMF3XMwWe3gHq8h71qUbnYNLWSxxJbidtDL0ODh7NBa1xjnfO0AVTA4Ih17x X-Received: by 2002:a17:906:f752:: with SMTP id jp18mr7531178ejb.538.1594977836762; Fri, 17 Jul 2020 02:23:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594977836; cv=none; d=google.com; s=arc-20160816; b=cZowMIE0ISoHEqmveAvrRjsG/87rxuf0iAzmGJ11Q5NlZFpPqbJqNArXipJb9lIqqh +YzxKyEhdc+IGmLpKjOSqddxyR4ripWTubbbTPipnsGlj6Axe8qH6HQ8xuyMkTOhOjoc ZeHFwlGkaHNSZKDS/LN9Jjd0RjZ8dRnxeNsZCoy89P7tU7kX/Kjq5A4Fnc4BgCjfzufx OXHgyvRvUNvtS92XqSN+vw2BlrVYINryiDlk7AVJZeCRyaU6rAx2U9yCoH8GyG7tJs2G 9ZPKgvAXyccpTZLYLYgdXIFZORXMZgO7XUyPyLSnzWbIx35aduwnlhYbK0S8dPMznCRI /IJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from; bh=V8jYWEf7v+Tp9bkPlvZKytUZ/xLEYuehdfwgqR9SsOE=; b=fjxcJ46R3bZlBpL0yK36aN5+wmMg1Mx2h+uIX2gz4dYd/PeNah1CRdhU/E7sNX40Ju NxUWCXlKZn6Gqm2oubClR2TaBz3AVKcNvWVUBnC/LG4iC3STcOTTBvPtChPNyXKOYBS/ 4bJKOyhrtTNxdI2G4hOsrHQi5m2lbfwu8EqX+aTVVnKJ6Go6ZzAWa0jba7iCHR4wZuey fhu6mkpW2SqWhEdfK74HgdJ45jIzsD3rCqIpmB6wRB0CWNu598JyArRbGg8soDKYNASo K4ZdSma9oUc6UntnL7Xz3Z4PtloKAE63YygvW4zt0mFzftng7hhbgsI7TAPeP1T3oHDQ bYuQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k2si3325793edl.300.2020.07.17.02.23.34; Fri, 17 Jul 2020 02:23:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726238AbgGQJVX (ORCPT + 99 others); Fri, 17 Jul 2020 05:21:23 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7780 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725864AbgGQJVX (ORCPT ); Fri, 17 Jul 2020 05:21:23 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 73228D0B5AF77BBC20AC; Fri, 17 Jul 2020 17:21:21 +0800 (CST) Received: from DESKTOP-5IS4806.china.huawei.com (10.174.187.22) by DGGEMS409-HUB.china.huawei.com (10.3.19.209) with Microsoft SMTP Server id 14.3.487.0; Fri, 17 Jul 2020 17:21:12 +0800 From: Keqian Zhu To: , , , CC: Marc Zyngier , Catalin Marinas , Will Deacon , James Morse , "Suzuki K Poulose" , , Keqian Zhu Subject: [RESEND PATCH] drivers: arm arch timer: Correct fault programming of CNTKCTL_EL1.EVNTI Date: Fri, 17 Jul 2020 17:21:04 +0800 Message-ID: <20200717092104.15428-1-zhukeqian1@huawei.com> X-Mailer: git-send-email 2.8.4.windows.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.174.187.22] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ARM virtual counter supports event stream. It can only trigger an event when the trigger bit of CNTVCT_EL0 changes from 0 to 1 (or from 1 to 0), so the actual period of event stream is 2 ^ (cntkctl_evnti + 1). For example, when the trigger bit is 0, then it triggers an event for every two cycles. Signed-off-by: Keqian Zhu --- drivers/clocksource/arm_arch_timer.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index ecf7b7db2d05..06d99a4b1b9b 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -799,10 +799,20 @@ static void __arch_timer_setup(unsigned type, static void arch_timer_evtstrm_enable(int divider) { u32 cntkctl = arch_timer_get_cntkctl(); + int cntkctl_evnti; + + /* + * Note that it can only trigger an event when the trigger bit + * of CNTVCT_EL0 changes from 1 to 0 (or from 0 to 1), so the + * actual period of event stream is 2 ^ (cntkctl_evnti + 1). + */ + cntkctl_evnti = divider - 1; + cntkctl_evnti = min(cntkctl_evnti, 15); + cntkctl_evnti = max(cntkctl_evnti, 0); cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK; /* Set the divider and enable virtual event stream */ - cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT) + cntkctl |= (cntkctl_evnti << ARCH_TIMER_EVT_TRIGGER_SHIFT) | ARCH_TIMER_VIRT_EVT_EN; arch_timer_set_cntkctl(cntkctl); arch_timer_set_evtstrm_feature(); @@ -816,10 +826,11 @@ static void arch_timer_configure_evtstream(void) /* Find the closest power of two to the divisor */ evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ; pos = fls(evt_stream_div); - if (pos > 1 && !(evt_stream_div & (1 << (pos - 2)))) + if ((pos == 1) || (pos > 1 && !(evt_stream_div & (1 << (pos - 2))))) pos--; + /* enable event stream */ - arch_timer_evtstrm_enable(min(pos, 15)); + arch_timer_evtstrm_enable(pos); } static void arch_counter_set_user_access(void) -- 2.19.1