Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9190456pxu; Mon, 28 Dec 2020 08:51:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJwRuaqqgvW7P+h/S0i+wPC70+iGo1Y8qf8xqShDiGvct+mvsLdivJAdF+cFiOF06e+4VXPh X-Received: by 2002:a17:906:b082:: with SMTP id x2mr39227448ejy.100.1609174287497; Mon, 28 Dec 2020 08:51:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609174287; cv=none; d=google.com; s=arc-20160816; b=G73RikKZSJ1cx7WyX21mV1VyVX0fLPyrtQYQ1AZkzXXtyuTZfaRRvJuhvWA8kSWKbJ y0lWdiVwSqNNz1ASBC9BwwrsFdBPblWwTG7+HwSNGme9JzFlAKWSMHcMzax7OLX6aub+ Yzow7cFE0HfaYJJDMVUOm56QO6j8/Il8bD6aGEh11WKZPcw3jwg5WYncvUCFQF8Mt4bK NdP0EE7q/KjAmnrsWA0h/A+Rhvv6yQtN0Y3IFmfDOFx7IOi7/tZqnOP0vEMyA9bCS8NC Ng1VNDtL+w6euwIx/dedVA+dXtx43hbJ3aZhGFv5/Hm58P5dyBRgTw4MsSfzjX+3asZA aa0Q== 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=ETkNEmi+yMaEnWwtrSck5X2XB6HhNDQi0gdQ5y5XTSs=; b=VSvoF16MiD3E4JMGH3T0rQUIwpj7FFCbAdFFzpJP40PiFBIMoF4S25alLnAPjgBQo1 0wn4J6hsQOMr+hhKt41O4nDyTf5AhVJnDusPc812DWEQf8RD80psfxVN0/janKWPcAEg Q/+v60OiWMHzS7qgelbn5kVVOgDLittOLDWnpkk9FuGGD+zeCGrSTLcRN1Gz2NOaW2MZ iVIiA4ULG6XEJxvOSf39RB1Ef1pE500pTn6KTa8t8+NEiax+mpVVWYBLf3jmMHS/KOBY 5pROmeRPekkD35B+C+TAu0at2ci+VJ855x8SqyXFa4h4Zeum10WFxhxV9gRIi6gX6Wg+ VSUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="JoB2/VHa"; 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 c20si20573032edw.222.2020.12.28.08.51.03; Mon, 28 Dec 2020 08:51:27 -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="JoB2/VHa"; 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 S2441725AbgL1Qrp (ORCPT + 99 others); Mon, 28 Dec 2020 11:47:45 -0500 Received: from mail.kernel.org ([198.145.29.99]:51530 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728064AbgL1MzL (ORCPT ); Mon, 28 Dec 2020 07:55:11 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0463B207C9; Mon, 28 Dec 2020 12:54:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609160096; bh=NcOZgAUmwTadk2VZ5sgjaOQfN3EteHVDTXXbCFU3xH4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JoB2/VHafwnxHmgF14O/jRNyuFvy5SDH851//876NqhCiLQPKIvf2AoUnYg4XHoeW Xbs0F5d3AUSnABIp5ATZR4pqtCKIvCrS+A1/ODRjo0U7x4qVCUhye+Tb4WwrCD/tIU S45KtpYvuOQELj0Tk9T71lw1N+bFOUKzmjz7lKdY= 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.4 068/132] clocksource/drivers/arm_arch_timer: Correct fault programming of CNTKCTL_EL1.EVNTI Date: Mon, 28 Dec 2020 13:49:12 +0100 Message-Id: <20201228124849.736450149@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228124846.409999325@linuxfoundation.org> References: <20201228124846.409999325@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 c64d543d64bf6..4e303c77caed5 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -310,15 +310,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