Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp493627ybl; Tue, 28 Jan 2020 06:49:54 -0800 (PST) X-Google-Smtp-Source: APXvYqw93K8s80mqQyTDqeDPplcHg6ME8TnU46Z6ZAco4GbNjseHF1GQ9+EzmLpDiQN+7swTnFT/ X-Received: by 2002:aca:d4ca:: with SMTP id l193mr3113196oig.133.1580222994414; Tue, 28 Jan 2020 06:49:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580222994; cv=none; d=google.com; s=arc-20160816; b=A+/4pIgdjdqB4qIX8M2NuaBggQ60KKSEwPRchrvOXymKJL+VqIw7wROPjK7h0x9ynO ocn+q/m2Sg3BI3OH1c40EK+r9yGNbBTvRWa2GKVWaCTPA0rpGslMn4fqdJZZSGY95NLa JGZVIg0ly8MQtA7fVEyFFYQdOxueC1IYIzYfdwK8Dkpb5A9NpwnKLXTx0ahrvM/FmqWe vE68Nbruafph8tYx5MIhDoNogvwJ9c+essScUl2c2IAqw5Kdfqfzld06umitf0LLEt3s lWpkzkV/P8QNAd41MdAAdg9T81WJYIgNnDvztkocdaTyHdMBfqwVy47mw1gm1p9cmFFR +4qg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=AzemwJCF2PINGWptuqgtMPC3w6YbkSD43o6ZfU3F59E=; b=K0Ja1WreP8So9j5cdglfoXG6J6cF4DGNIoadeS5SqVxPHTNcbxR3fg336vIWtU2PIK fR+4AY2XILFfyMzwf9xvakVZQ8dXBJvhV92TcYG53ZANh9XK0z9in/7EzccQVMTGpfqp TJprBVpjDIvKsQfCbFX2aLs1eN/JCjC2tath/ncfgvVBZPwkaGga7Oyd7RelZdHQwMl5 bXtZbIK+2B8S/b4fyFnsIMpB6/YZWQGHkErzBDyH3Kll+BlAdP12Z+7J9gWkYZ1FPluN cQh5ObBxzSQ0jBq3sPlEbAQzMxCpHoeADBagDF5yKG4sYRkUSonb4pU7qTTLA5ThOFLP HJ5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=OAb3Ncjd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g10si8987767otn.12.2020.01.28.06.49.42; Tue, 28 Jan 2020 06:49:54 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=OAb3Ncjd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729122AbgA1Oon (ORCPT + 99 others); Tue, 28 Jan 2020 09:44:43 -0500 Received: from mail.kernel.org ([198.145.29.99]:58354 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727931AbgA1OJv (ORCPT ); Tue, 28 Jan 2020 09:09:51 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 739A922522; Tue, 28 Jan 2020 14:09:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580220589; bh=1qWJPyzphTh1OOTJy5ScY1oDDqbdQp1LVK9ycxiBvGE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OAb3NcjddDkRKnq8D/7748OPHR8hzULgKOQvdEzIwxPducBmaK14mMVaK0D0RaU3M lt35Cevmjp6kJ9ulzFeayTfYi2opA4srfhHwT+p1mE/Mgeb94F/of0w1uZygsdguRU z7NG2F83JYkV8dJiNawzhfxGel5RwJh2ZNZobmhU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Finn Thain , Geert Uytterhoeven , Sasha Levin Subject: [PATCH 4.4 066/183] m68k: mac: Fix VIA timer counter accesses Date: Tue, 28 Jan 2020 15:04:45 +0100 Message-Id: <20200128135836.593132765@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135829.486060649@linuxfoundation.org> References: <20200128135829.486060649@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Finn Thain [ Upstream commit 0ca7ce7db771580433bf24454f7a1542bd326078 ] This resolves some bugs that affect VIA timer counter accesses. Avoid lost interrupts caused by reading the counter low byte register. Make allowance for the fact that the counter will be decremented to 0xFFFF before being reloaded. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Finn Thain Signed-off-by: Geert Uytterhoeven Signed-off-by: Sasha Levin --- arch/m68k/mac/via.c | 102 +++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 49 deletions(-) diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c index ce56e04386e70..2d687518c76fe 100644 --- a/arch/m68k/mac/via.c +++ b/arch/m68k/mac/via.c @@ -53,16 +53,6 @@ static __u8 rbv_clear; static int gIER,gIFR,gBufA,gBufB; -/* - * Timer defs. - */ - -#define TICK_SIZE 10000 -#define MAC_CLOCK_TICK (783300/HZ) /* ticks per HZ */ -#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF) -#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8) - - /* * On Macs with a genuine VIA chip there is no way to mask an individual slot * interrupt. This limitation also seems to apply to VIA clone logic cores in @@ -277,22 +267,6 @@ void __init via_init(void) } } -/* - * Start the 100 Hz clock - */ - -void __init via_init_clock(irq_handler_t func) -{ - via1[vACR] |= 0x40; - via1[vT1LL] = MAC_CLOCK_LOW; - via1[vT1LH] = MAC_CLOCK_HIGH; - via1[vT1CL] = MAC_CLOCK_LOW; - via1[vT1CH] = MAC_CLOCK_HIGH; - - if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func)) - pr_err("Couldn't register %s interrupt\n", "timer"); -} - /* * Debugging dump, used in various places to see what's going on. */ @@ -320,29 +294,6 @@ void via_debug_dump(void) } } -/* - * This is always executed with interrupts disabled. - * - * TBI: get time offset between scheduling timer ticks - */ - -u32 mac_gettimeoffset(void) -{ - unsigned long ticks, offset = 0; - - /* read VIA1 timer 2 current value */ - ticks = via1[vT1CL] | (via1[vT1CH] << 8); - /* The probability of underflow is less than 2% */ - if (ticks > MAC_CLOCK_TICK - MAC_CLOCK_TICK / 50) - /* Check for pending timer interrupt in VIA1 IFR */ - if (via1[vIFR] & 0x40) offset = TICK_SIZE; - - ticks = MAC_CLOCK_TICK - ticks; - ticks = ticks * 10000L / MAC_CLOCK_TICK; - - return (ticks + offset) * 1000; -} - /* * Flush the L2 cache on Macs that have it by flipping * the system into 24-bit mode for an instant. @@ -619,3 +570,56 @@ int via2_scsi_drq_pending(void) return via2[gIFR] & (1 << IRQ_IDX(IRQ_MAC_SCSIDRQ)); } EXPORT_SYMBOL(via2_scsi_drq_pending); + +/* timer and clock source */ + +#define VIA_CLOCK_FREQ 783360 /* VIA "phase 2" clock in Hz */ +#define VIA_TIMER_INTERVAL (1000000 / HZ) /* microseconds per jiffy */ +#define VIA_TIMER_CYCLES (VIA_CLOCK_FREQ / HZ) /* clock cycles per jiffy */ + +#define VIA_TC (VIA_TIMER_CYCLES - 2) /* including 0 and -1 */ +#define VIA_TC_LOW (VIA_TC & 0xFF) +#define VIA_TC_HIGH (VIA_TC >> 8) + +void __init via_init_clock(irq_handler_t timer_routine) +{ + if (request_irq(IRQ_MAC_TIMER_1, timer_routine, 0, "timer", NULL)) { + pr_err("Couldn't register %s interrupt\n", "timer"); + return; + } + + via1[vT1LL] = VIA_TC_LOW; + via1[vT1LH] = VIA_TC_HIGH; + via1[vT1CL] = VIA_TC_LOW; + via1[vT1CH] = VIA_TC_HIGH; + via1[vACR] |= 0x40; +} + +u32 mac_gettimeoffset(void) +{ + unsigned long flags; + u8 count_high; + u16 count, offset = 0; + + /* + * Timer counter wrap-around is detected with the timer interrupt flag + * but reading the counter low byte (vT1CL) would reset the flag. + * Also, accessing both counter registers is essentially a data race. + * These problems are avoided by ignoring the low byte. Clock accuracy + * is 256 times worse (error can reach 0.327 ms) but CPU overhead is + * reduced by avoiding slow VIA register accesses. + */ + + local_irq_save(flags); + count_high = via1[vT1CH]; + if (count_high == 0xFF) + count_high = 0; + if (count_high > 0 && (via1[vIFR] & VIA_TIMER_1_INT)) + offset = VIA_TIMER_CYCLES; + local_irq_restore(flags); + + count = count_high << 8; + count = VIA_TIMER_CYCLES - count + offset; + + return ((count * VIA_TIMER_INTERVAL) / VIA_TIMER_CYCLES) * 1000; +} -- 2.20.1