Received: by 2002:ab2:6d45:0:b0:1fb:d597:ff75 with SMTP id d5csp41906lqr; Tue, 4 Jun 2024 20:19:12 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVbXIB5rUVxNHf2CIeL133VPcZEbFd2wogZErTl02lepiV29GytWZ027D6sF7QUK2wJsQrGH3v6DKdnBbW8u+XL+xK4J6SG6l2v6HjyMQ== X-Google-Smtp-Source: AGHT+IF+qKDpwB+NLHNe9OJNazUCFtTavdD3RnTbbR8JHgesOUoALX+jKl+jaeNuMz6aQr2F6bil X-Received: by 2002:a17:902:e0cd:b0:1f4:6c83:23df with SMTP id d9443c01a7336-1f6a5a20625mr10190235ad.33.1717557551851; Tue, 04 Jun 2024 20:19:11 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717557551; cv=pass; d=google.com; s=arc-20160816; b=JwgJJrihHmsUe7uKsqYPcjVFsWsn+VmyYzdC2z+ho7omagASM1MEFjoujzmfbLgNGI R2CgcDK5WlaeTIf64teX4J8R2nH230SDHLejEcloYHpVyr6rSJn5zTnjAbzZxLAHhOC4 nhq8rbHhmMBTsKRpJckkQQnFzjWJrqWNH67SZohqXCs4uNyavSvlDMldP64S1n2/ffm1 fp1hgubFnfRT1JGaM4FxuPkffnwRmw3GqnqU94BPGNk9qApxxOakjJG5rqhN8e98bLbY yTMx8bPexb7hQD+O3lvrIA2Tk8wMJlJ3HV42zYQlRS0SC6BIEUYpOoFnwAe3RdyEvxTj qeMw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :dkim-signature; bh=JqWWhco0dPRwv8s9y+uizWbrW3o5dwpgbW/xuzuerC0=; fh=JbtHMc1jr5nbHgNNMzMY+9CFw4YoaP5x9kmROrQ98J8=; b=dfL2TmPopYmgKLTpeIauSpyROvZDmgL1gY12NWb30C/cDRT4FyrFGO+06T7/C3beUn 79golaYAVjUWWtp9wGFH20qrEpe+/4rEZitr8CQf5mhr7DBzIQ7eGFV1BKdGD3dcgKkp FEykkoZnDB5RDZl14Su1OWB3wkezPPQr6Dc9lMoLGgQYJ5Qcaj9Zv83uMSlGAgtbH3gX c7PZiq+aY41RTEQQuf6KP3NrTdJ+8gkWgAQuhuyUYB5+tsCiSin0C+YLZmq6EY0EaE6s +BAnSmgxun0H2aQ7lQKWmp6fEA2++YgW1ZViO6E199nL8sCceGi0J4dciaBpVNLQehtH P3BA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=cmNEdt4k; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-201716-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-201716-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id d9443c01a7336-1f6914194c6si29248785ad.530.2024.06.04.20.19.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Jun 2024 20:19:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-201716-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=cmNEdt4k; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-201716-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-201716-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id BBA1DB24F38 for ; Wed, 5 Jun 2024 03:16:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9195D73457; Wed, 5 Jun 2024 03:16:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cmNEdt4k" Received: from mail-oa1-f52.google.com (mail-oa1-f52.google.com [209.85.160.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2ECDB61FD6; Wed, 5 Jun 2024 03:16:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.52 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717557396; cv=none; b=CwyCkLKnibylpZNoxJUgYU83t/4I+z14QqmUTrykh44txiD45EDtjUkWclf3FHS1CL1DyDE+ljgoa1SZmRsT6Vv01GLT+73jbbjcbthj/Yrb0jsYKn4reIlNoZ/A60ZPfVnJq7abKxDqkykItd2v4JiyRlKeEWaMI/go5HpmS20= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717557396; c=relaxed/simple; bh=v7bqHyIO4iVfIbMVo+iH1Ip0qC3Cf0C2y0KTaHyA00s=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=pCYRjHMEnwUuCHgwGfb1xbY2wpSsImSSfahivPsNEMhpiaA/yEy3gxSasOm1DS64qx3MlQGN4uCE9DnFmuN/fZyYJ67uEnWB5Ibs14ayva2ZY4yptdLYhxy6hn4A1VUFh9U7Lw6KoUIgtti4fSqRxXY1XtEW4kCOFWohtPfQuKE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cmNEdt4k; arc=none smtp.client-ip=209.85.160.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-oa1-f52.google.com with SMTP id 586e51a60fabf-250671a1bc7so2390200fac.3; Tue, 04 Jun 2024 20:16:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1717557394; x=1718162194; darn=vger.kernel.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=JqWWhco0dPRwv8s9y+uizWbrW3o5dwpgbW/xuzuerC0=; b=cmNEdt4kEsuUA6mErsmB4tHHI5otb7eDFPhHKzozNByspCo4MTz+5/qJJmvLVwjO1Q LLs9o+8aJ1JWdENSH0AM4z5U7WWCdNf/m5EooMsuM61SOvtdHABoPSOgVxHmMh+RuY/3 E20TTN2Z3BJV5AzPugibiCANerJUxZP/IYrqqY4sDK679mrnzE2amf46u2d97PotV0yp q5DkyBEX2CDAj80xR4cxm4g0Ow/N58ovt83JUaz/d+uq6wY/T9MAmd1J0r7xdW9D31LN kAo5PETiENk4apA2c+z2wv5zbUjLqIgII7/3SRSFtqUi0J5vOYVSvupTS//N3YVVjhuo KPag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717557394; x=1718162194; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JqWWhco0dPRwv8s9y+uizWbrW3o5dwpgbW/xuzuerC0=; b=RxMbpZjFHC7mwf2zgWxyupVzYcFym3T8a+fAGIldECWWS4SJII0lyfmb6f2Kf3kUZf evr52VYtpkBlaBLstZXH1iMgiDO7/MM/xbVEKfoKxMVS/4bxvYhGRC885KlWTlTiNkjN s/1bX/YqGboA1rdA+ujiI5gHBSyij6ONzu8ReAeXN7jVgNMKCOYnvbKX7SPQrfYQ4AJJ v7AyQnIqcTC2WVVH9JAdWy8ZT7/KIPy1GVeEAMQLaRD01YdZ6XxPFx6bDDrF+UFYn0UM vetKaVzXvF+LRKRHUFMG9sMji2y6VxJ5sfOjTw4zMZLQfgdtrEztbUiTku/s7jGVr9Rz M8WQ== X-Forwarded-Encrypted: i=1; AJvYcCUcP51Vrp19QzMqi+GvdniCj8/tM80/YCMKsO5BnOJrtLQ8a8b667YsIoEjvqMSLA8LRHmE61yUAkpSoWc9UtVSJrwBEXP2lLvOjr8NqArCcA9wy34J4x93yhnDGuL+yKLzD6Kgc27PAGXCYdN6 X-Gm-Message-State: AOJu0YxIAOJ8+SfoH5iLJfVYlbAwZtDlBvEWRVm0r0AVC9Q7DjqCqL5Q I7bvJxaNWFf2XKEYFBIGgxWgcuSViBhHncLbIMHTLv2xOpA6U3wodb5ji3rW3gOW2CECEeyRZrz eo+7HyEhvV94JmV1WI2OmQSkM1OMVLlRUC8W+yEqpfM0= X-Received: by 2002:a05:6870:a446:b0:24f:c715:a4d4 with SMTP id 586e51a60fabf-25121fec152mr1756596fac.40.1717557394043; Tue, 04 Jun 2024 20:16:34 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: In-Reply-To: From: Chunyan Zhang Date: Wed, 5 Jun 2024 11:15:59 +0800 Message-ID: Subject: Re: [PATCH] clocksource/drivers/sprd: Enable register for timer counter from 32 bit to 64 bit To: Enlin Mu Cc: orsonzhai@gmail.com, baolin.wang@linux.alibaba.com, tglx@linutronix.de, enlin.mu@unisoc.com, enlinmu@gmail.com, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Hi Enlin, On Wed, 22 May 2024 at 16:15, Enlin Mu wrote: > > From: Enlin Mu > > Using 32 bit for suspend compensation, the max compensation time is 36 > hours(working clock is 32k).In some IOT devices, the suspend time may > be long, even exceeding 36 hours. Therefore, a 64 bit timer counter > is needed for counting. > > Signed-off-by: Enlin Mu > --- > drivers/clocksource/timer-sprd.c | 29 ++++++++++++++++++++--------- > 1 file changed, 20 insertions(+), 9 deletions(-) > > diff --git a/drivers/clocksource/timer-sprd.c b/drivers/clocksource/timer-sprd.c > index 430cb99d8d79..936691e27f8b 100644 > --- a/drivers/clocksource/timer-sprd.c > +++ b/drivers/clocksource/timer-sprd.c > @@ -30,6 +30,7 @@ > #define TIMER_VALUE_SHDW_HI 0x1c > > #define TIMER_VALUE_LO_MASK GENMASK(31, 0) > +#define TIMER_VALUE_HI_MASK GENMASK(31, 0) > > static void sprd_timer_enable(void __iomem *base, u32 flag) > { > @@ -57,10 +58,11 @@ static void sprd_timer_disable(void __iomem *base) > writel_relaxed(val, base + TIMER_CTL); > } > > -static void sprd_timer_update_counter(void __iomem *base, unsigned long cycles) > +static void sprd_timer_update_counter(void __iomem *base, unsigned long cycles_lo, > + unsigned long cycles_hi) I would suggest using u64 rather than adding a new parameter. In this way we can avoid some of the changes below. > { > - writel_relaxed(cycles & TIMER_VALUE_LO_MASK, base + TIMER_LOAD_LO); > - writel_relaxed(0, base + TIMER_LOAD_HI); > + writel_relaxed(cycles_lo & TIMER_VALUE_LO_MASK, base + TIMER_LOAD_LO); > + writel_relaxed(cycles_hi, base + TIMER_LOAD_HI); > } > > static void sprd_timer_enable_interrupt(void __iomem *base) > @@ -82,7 +84,8 @@ static int sprd_timer_set_next_event(unsigned long cycles, > struct timer_of *to = to_timer_of(ce); > > sprd_timer_disable(timer_of_base(to)); > - sprd_timer_update_counter(timer_of_base(to), cycles); > + sprd_timer_update_counter(timer_of_base(to), cycles, > + (u64)cycles >> 32); On 32-bit systems, TIMER_LOAD_HI is still 0. > sprd_timer_enable(timer_of_base(to), 0); > > return 0; > @@ -93,7 +96,8 @@ static int sprd_timer_set_periodic(struct clock_event_device *ce) > struct timer_of *to = to_timer_of(ce); > > sprd_timer_disable(timer_of_base(to)); > - sprd_timer_update_counter(timer_of_base(to), timer_of_period(to)); > + sprd_timer_update_counter(timer_of_base(to), timer_of_period(to), > + (u64)timer_of_period(to) >> 32); Same here, so do you need to consider 32-bit systems? > sprd_timer_enable(timer_of_base(to), TIMER_CTL_PERIOD_MODE); > > return 0; > @@ -162,14 +166,21 @@ static struct timer_of suspend_to = { > > static u64 sprd_suspend_timer_read(struct clocksource *cs) > { > - return ~(u64)readl_relaxed(timer_of_base(&suspend_to) + > - TIMER_VALUE_SHDW_LO) & cs->mask; > + u32 hi, lo; > + > + lo = readl_relaxed(timer_of_base(&suspend_to) + > + TIMER_VALUE_SHDW_LO); > + hi = readl_relaxed(timer_of_base(&suspend_to) + > + TIMER_VALUE_SHDW_HI); > + > + return ~((u64)hi << 32 | lo); > } > > static int sprd_suspend_timer_enable(struct clocksource *cs) > { > sprd_timer_update_counter(timer_of_base(&suspend_to), > - TIMER_VALUE_LO_MASK); > + TIMER_VALUE_LO_MASK, > + TIMER_VALUE_HI_MASK); Like I suggested above, not add a new parameter, then pass CLOCKSOURCE_MASK(64) as the cycles, that would avoid wrongly setting TIMER_LOAD_HI for 32-bit systems based on the current implementations. Thanks, Chunyan > sprd_timer_enable(timer_of_base(&suspend_to), TIMER_CTL_PERIOD_MODE); > > return 0; > @@ -186,7 +197,7 @@ static struct clocksource suspend_clocksource = { > .read = sprd_suspend_timer_read, > .enable = sprd_suspend_timer_enable, > .disable = sprd_suspend_timer_disable, > - .mask = CLOCKSOURCE_MASK(32), > + .mask = CLOCKSOURCE_MASK(64), > .flags = CLOCK_SOURCE_IS_CONTINUOUS | CLOCK_SOURCE_SUSPEND_NONSTOP, > }; > > -- > 2.39.2 >