Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9086638pxu; Mon, 28 Dec 2020 06:18:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJx66ZWqUbLCCJVc3YLG/OkDuETBKtxP9ZAQyoh+TVifbKAnCJEpXLCQJy8/EyMU9aOm0Gbu X-Received: by 2002:a17:906:af99:: with SMTP id mj25mr42687348ejb.414.1609165106661; Mon, 28 Dec 2020 06:18:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609165106; cv=none; d=google.com; s=arc-20160816; b=asdkMxDxtjRHYONjYKSyVWqTAduEAbi/w0vaEMP6WOPtwgLLI5p/c5hFXFfHJTM3wG FBYZ6KnSkCJCEkAgUyso7jijeI8XhSycVHnmZYE7wHjb6SU1ksUuzdLzBMNBCaRpJmSL HXStUKU6htwb1ZO4MHTwxKL36fYP/3msr8lDpso5aLpeQCBuNvlFKnBmy7zHfTLz3bJH 0Mrz7nuHZzvA6JMBbGWaXcUAPvAoz03E34GijRNgO9jjNJmOp45svY8JfIIEUpBGoZka EFxGeNDZPWV50DTwrrXFDGvHliKfUlUmS5enEIU7XoYO41h51e19zI54csmsNBEh0YDl FZKA== 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=1vaKP5JzjvbVM7qDGRsy0otXNgEcgWuOyM8yJOH5MZQ=; b=rgAiNTnBweboi3lYfT6gEjB20jc0WRGfdZdQDwcZGuRL6kDKoNga3mU5w85YoKMGzH TDppZLIrVIUiVdHA+jpvOX8d4la+8ZWBg3af6I0w3BNJM0WiTXd6O9xnSE+riFXUvc7Y Nb5eiN1RTsX+M1Ks5cd9jgp25P0zIwNathzpEYYXGBYPCPDQWPsUNZGkdp8pdmpjjy8w lMFCcDJjsd3pvhwCk0ryottWiQGiOR2VfAa3h8sCBYKilvbBDZyazqh3D1AR2JhxouM4 qLr3e65z5t/ZgyZJXm1cZZRdTbblDTnnVp3Y1nQ3MOmwzg0XkUZccVJiKeHtuY7qSLU4 Kbxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=dIjUHgmk; 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 a1si19007631ejd.577.2020.12.28.06.18.03; Mon, 28 Dec 2020 06:18:26 -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=dIjUHgmk; 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 S2440538AbgL1OO5 (ORCPT + 99 others); Mon, 28 Dec 2020 09:14:57 -0500 Received: from mail.kernel.org ([198.145.29.99]:49800 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2440508AbgL1OOv (ORCPT ); Mon, 28 Dec 2020 09:14:51 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 71541205CB; Mon, 28 Dec 2020 14:14:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609164851; bh=nDzqTCQBvYJcWljCaBjgQPs9tM8ztehQbCRDvMe8o7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dIjUHgmkx5TI1ATk929ZTLTdXK8rO1pnFjvOJHRQgnKPfslW255fDK+AiIvK9UWey GFRZtMrhwD1/9YmxOWBd5nw5yIVcheRaCvvIgvUbGNsiCNChjOjUuX3MbIly7g0pPk lUrvgTrM+MReL0hwiofPPsVuLSzQw+la7F2Kwzm4= 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 5.10 322/717] clocksource/drivers/arm_arch_timer: Correct fault programming of CNTKCTL_EL1.EVNTI Date: Mon, 28 Dec 2020 13:45:20 +0100 Message-Id: <20201228125036.454436556@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228125020.963311703@linuxfoundation.org> References: <20201228125020.963311703@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 777d38cb39b09..d0177824c518b 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -822,15 +822,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