Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9215643pxu; Mon, 28 Dec 2020 09:30:42 -0800 (PST) X-Google-Smtp-Source: ABdhPJwz4hgOqkAJKkSl406DupIFXqi6+fDDC2QCAUgc9tuEg5dII+eOceIqyJ6sl3JA/G72A6yA X-Received: by 2002:a50:d5c1:: with SMTP id g1mr44596437edj.299.1609176642633; Mon, 28 Dec 2020 09:30:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609176642; cv=none; d=google.com; s=arc-20160816; b=t6JIE0dX7cl0Pjya8gsW/PCylydTJiRdLad5LTxENJ4NixwTaNdwuqb57jhPEOrjWo dtj7SLnK6EXGWJmi4QqqW2lGAzc+szI7rcuJBZRrtTkPKA+yfBANIamf7WpGzEC9nQHf H5XhWPnR+lGVw7imf7YxXMZFbxJ2mPTGyG1DjcX4X4hOpjWm7ObPTLn6CLWiELnZcdXV Gh96jjodUU7bwfDX+jVyADyNCqG1yW2ujE8HxKBl8rdc9TzEoUnvNy7cQQzKfdf5d7HD 3Z/meGvfD2u1D6vJAlnY/RXZOASrbTDc3UdZIPFKfJssGbTI1H4A42DAUe4kNGLh5WIA GEMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=CleiGFW1usIOqXjs0TVJPrmv2NTTt/qo5zAaYQSKFP4=; b=VxDAiaYOjttoLLvDIPVZ0/rQOReB4mOdGCplbYwFEvSSoPBFSPqQ5/mnLgj7h6woU7 vWxpbHXM+++DiYj/5jMOXrgNHF4mIVEnlW//9r39QYWRIV6K+e8tH56Lg+APQZtaJHyv 6K4IQx9dpIfQZTHH5eYSqAQGb+yk1veK83qwtEQgaubQuU4kPaNO39KfdHZfRiilsR50 7Kic8wLbW8bGgIm7IaXRjFGlyQUqM0P7xF95RmMT5KLUV85k+alfbQtvAfJoMRczWynd gYbpnbhXoJNqxDq5hgBAE6YJONji/c5WQhGilNxyY/6ZxrkML5BgkCjSGa0PPsZjr/ht JCCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Ft6XqiJG; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b13si19636276edw.300.2020.12.28.09.30.20; Mon, 28 Dec 2020 09:30:42 -0800 (PST) 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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Ft6XqiJG; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730360AbgL1NEH (ORCPT + 99 others); Mon, 28 Dec 2020 08:04:07 -0500 Received: from mail.kernel.org ([198.145.29.99]:59668 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730240AbgL1NDd (ORCPT ); Mon, 28 Dec 2020 08:03:33 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8112E22583; Mon, 28 Dec 2020 13:02:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609160573; bh=BXoseXLqsmTvoiuD9ILe66ltxgzsJ25N9S0bGuGCgns=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ft6XqiJGofcpDfa3OJUxDwSP/onf3yepal2ySsi+ellm+k2VuiObMfaZ+UpyJAx6z EfAGCwGS8vn5JBpcIlqe/Sy3uxeYcAUNenH/nbUYrSFWF17Pt1DZ2z6rOHUnmXYf54 FYaxDoiEtirlAXQlfdB85bNxyLk/f1HVbTdpv2uY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Marc Zyngier , Keqian Zhu , Daniel Lezcano , Sasha Levin Subject: [PATCH 4.9 097/175] clocksource/drivers/arm_arch_timer: Correct fault programming of CNTKCTL_EL1.EVNTI Date: Mon, 28 Dec 2020 13:49:10 +0100 Message-Id: <20201228124857.943284191@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228124853.216621466@linuxfoundation.org> References: <20201228124853.216621466@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Keqian Zhu [ Upstream commit 8b7770b877d187bfdae1eaf587bd2b792479a31c ] ARM virtual counter supports event stream, it can only trigger an event when the trigger bit (the value of CNTKCTL_EL1.EVNTI) of CNTVCT_EL0 changes, so the actual period of event stream is 2^(cntkctl_evnti + 1). For example, when the trigger bit is 0, then virtual counter trigger an event for every two cycles. While we're at it, rework the way we compute the trigger bit position by making it more obvious that when bits [n:n-1] are both set (with n being the most significant bit), we pick bit (n + 1). Fixes: 037f637767a8 ("drivers: clocksource: add support for ARM architected timer event stream") Suggested-by: Marc Zyngier Signed-off-by: Keqian Zhu Acked-by: Marc Zyngier Signed-off-by: Daniel Lezcano Link: https://lore.kernel.org/r/20201204073126.6920-3-zhukeqian1@huawei.com Signed-off-by: Sasha Levin --- drivers/clocksource/arm_arch_timer.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index a2503db7e533e..5d7f83d27093f 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -426,15 +426,24 @@ static void arch_timer_evtstrm_enable(int divider) static void arch_timer_configure_evtstream(void) { - int evt_stream_div, pos; + int evt_stream_div, lsb; + + /* + * As the event stream can at most be generated at half the frequency + * of the counter, use half the frequency when computing the divider. + */ + evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ / 2; + + /* + * Find the closest power of two to the divisor. If the adjacent bit + * of lsb (last set bit, starts from 0) is set, then we use (lsb + 1). + */ + lsb = fls(evt_stream_div) - 1; + if (lsb > 0 && (evt_stream_div & BIT(lsb - 1))) + lsb++; - /* 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)))) - pos--; /* enable event stream */ - arch_timer_evtstrm_enable(min(pos, 15)); + arch_timer_evtstrm_enable(max(0, min(lsb, 15))); } static void arch_counter_set_user_access(void) -- 2.27.0