Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9044810pxu; Mon, 28 Dec 2020 05:17:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJzC8XbQHbCWmnDf3oRe4f4PsWiI6vrkT9dSQoIkGAWJ/ZA0WJeErQbpPL2Lnu1tJrPRPRE6 X-Received: by 2002:a50:fc13:: with SMTP id i19mr43295709edr.281.1609161426787; Mon, 28 Dec 2020 05:17:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609161426; cv=none; d=google.com; s=arc-20160816; b=vkl632vB7cu3/UfvrgKjS2CdPV0IXP5SURa/fQmkKGT1D2f/rxwal4vh8shVIjUP8K zq7rFW+Q3lWfIA9DUzKR9w9rFztX+lUmztpgvIABxRIGUY2VHwyDw3oqJOW4scWayrqQ sY6Exs0USWjM7+KE00eQQuJdG3IYMc2QEXwiLZacaB9RDSrQ6d2mQ5QFnLNP6Arhf7HY qcizcMaZMhpByNzv6PYO1fdE0sIDlIsdFsb18JGR4pPpnIYUnKlajrGDpP2f13gY6Itf qndozkL+Lo1jaWdQRUFHSiMXFxWyFPz0vlDOTRCMImZMbcdos1/tOp2rq3E+F3pilCwb 5q2A== 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=bPajNYA86lApWeZskpWrvVaKE7oa6yWkux1IoqKyI1E=; b=IV7O7urSl24s36H5b9P6Lmt5deqVNv2e/RBplEuDwKxUs2bX8nV4PnRbT4a7RuOnZR kdmqTH+6Yp0R35p7VyqH10YhJ5VlgOHlwu3etOI6JVNc/wOv0eeYE5f00zeDFEnmf83G FT5wkPebDgVnnTknwjZ/8n9ibGE3+DZN+r6m5m1sVs0JZDtr7Do0+i/maaYizi0Ql0R0 ZbMAPYJ/VKIS1g4tfXYcObOGSOOiWE6LPZ7TF+bzoPcQG0QBTr/tqFS5LSuqZqwm+gQR VQpvLjLf7V8YG5DHCjVlBpVhhGpZDTIF6KuDjri7Wctb0QBtobaNlPWwT8Xy72wzNhfb m8Qw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=qnOzaTOx; 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 z3si20264470eda.136.2020.12.28.05.16.44; Mon, 28 Dec 2020 05:17:06 -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=qnOzaTOx; 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 S1732542AbgL1NOm (ORCPT + 99 others); Mon, 28 Dec 2020 08:14:42 -0500 Received: from mail.kernel.org ([198.145.29.99]:42452 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732509AbgL1NOe (ORCPT ); Mon, 28 Dec 2020 08:14:34 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8B0CC2076D; Mon, 28 Dec 2020 13:14:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609161259; bh=hr/RIXSi7ckCRx6TPnC5jjk7QCnko/RVz4FSAX8Fj0g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qnOzaTOxY7IP8o3t/Fowu8JOSzchiLR82xdltas5XFdtahOmbbIbesCxmROr0GMf1 iWehTTzc7wibgXR2+PV74YKp/78don2a47L5PsIfRpXIbbwQEPrBDUVDTmhvFP0lCT qYei5do7YGiGCbsMSTvyqYq1jaKwz+pxofCIMSLM= 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.14 138/242] clocksource/drivers/arm_arch_timer: Correct fault programming of CNTKCTL_EL1.EVNTI Date: Mon, 28 Dec 2020 13:49:03 +0100 Message-Id: <20201228124911.500120023@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228124904.654293249@linuxfoundation.org> References: <20201228124904.654293249@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 14e2419063e93..2c5913057b87b 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -744,15 +744,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