Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp4563324imm; Tue, 9 Oct 2018 01:21:17 -0700 (PDT) X-Google-Smtp-Source: ACcGV62G0IwW9QNjAehSH0iXpaV0dPW1STNSESp06b87Y6HXgU7mvU1a+GZ+WmMmp5heF4sE1R01 X-Received: by 2002:a17:902:9a04:: with SMTP id v4-v6mr27223594plp.247.1539073277377; Tue, 09 Oct 2018 01:21:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539073277; cv=none; d=google.com; s=arc-20160816; b=NHpUx5ydPpgH9bB00j2UF5S0gYYoTo9smawLmC28hjhZLMuWHn9XXangbaWn9mo4N9 R2bCE4rSTFgO6z58XZYFnMwHgHoPlAZwR6vwJv92mZbsliCTdlwVWCy5I+bWtiitmCwV SO9KmKPLNsjW2ntIYduRk3eVhCa9SGtT3GBqWsQnZxgqtUU3f5KDZFXvqOKIwpY/I6Se JlhAoqKOFQhxClc+tKCAf+hGnN/lgXW+86VW5vO6Ku//8dTApNNxt2FNhg9PdEj7Y35z JzBxQ2k7FocnmoHkB25iRSIdALhcdCtJNYHd0NrZ5O9vTLcH/1qQI7/+jqEYLUaJtvEQ J4Xw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=xWLs3rgC9uuRBE4c+YLWrA9aOk61mdqWO1qhOAdlKnk=; b=AM1noR/9ylXUggaDsn/vR7aAhf4gZ5L34qfCMqDYbc0q3oFhM+GfXLrcHSHqfuohf4 veXxs+lr6iDH9HQNrYYhRWIWW2isURBWQJubSaReZ5/DxNplBmygoSOw+4YbGe5zfyL3 E8XK5z4UkQCK7kciViq1TFKaV7AykI8BudCpEcKnxuoNYVKabG3GpjnWbbkPFkRmyVLc /iMAiSU1ffC9hCGcFr3M3jezM9QT6NnQxGlzk/HNeet5sL4oNTqs62XfKaoMk/xjuxfd bagSMBc5PTZ71/xvAacC3eTfpMrySTaB3KOgN2zIpwAo2LbHjC3uLCcJIyqJjsW6n2jK xe0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=dExpgIcC; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n135-v6si23216049pfd.38.2018.10.09.01.21.02; Tue, 09 Oct 2018 01:21:17 -0700 (PDT) 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=dExpgIcC; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726613AbeJIPfG (ORCPT + 99 others); Tue, 9 Oct 2018 11:35:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:51388 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725866AbeJIPfG (ORCPT ); Tue, 9 Oct 2018 11:35:06 -0400 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 587E4214DA; Tue, 9 Oct 2018 08:19:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1539073161; bh=+8TrLxl44qZpH7Njv/jvir5YcCoI141qyw/Tb+frXI0=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=dExpgIcCn/VaHlHmFJ9CJFhgVK4mtyKoLQ7FhBre7R4oPREubWqZuwqMzqPxYHIJE cLbtCs7Mcawycv1CDsNTY6U7Iy9QPxh1eNojptlLMIUjfA9aesXwAGS5Tgsmy+B0mA WMa8uEV2OxBLRYM1xQmpaDiWFuQ87w+3kNM3ZMkY= Received: by mail-wm1-f51.google.com with SMTP id y11-v6so878797wma.3; Tue, 09 Oct 2018 01:19:21 -0700 (PDT) X-Gm-Message-State: ABuFfogtg9pGQUIijF6+fTCjIEbZafan6NQEBndMFNDpytH0VbJfl2ax xsADyeYisnfIQKHCffQrOEj+SXdMnQ5Ppi1pvB8= X-Received: by 2002:a1c:ab54:: with SMTP id u81-v6mr1021067wme.45.1539073159645; Tue, 09 Oct 2018 01:19:19 -0700 (PDT) MIME-Version: 1.0 References: <20181008125009.3721-1-m.szyprowski@samsung.com> <20181008125009.3721-3-m.szyprowski@samsung.com> In-Reply-To: <20181008125009.3721-3-m.szyprowski@samsung.com> From: Krzysztof Kozlowski Date: Tue, 9 Oct 2018 10:19:08 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 2/7] clocksource: exynos_mct: Add arch_timer cooperation mode for ARM64 To: Marek Szyprowski Cc: "linux-samsung-soc@vger.kernel.org" , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will.deacon@arm.com, catalin.marinas@arm.com, marc.zyngier@arm.com, tglx@linutronix.de, daniel.lezcano@linaro.org, Chanwoo Choi , =?UTF-8?B?QmFydMWCb21pZWogxbtvxYJuaWVya2lld2ljeg==?= , Inki Dae Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 8 Oct 2018 at 14:50, Marek Szyprowski wrote: > > To get ARM Architected Timers working on Samsung Exynos SoCs, one has to > first configure and enable Exynos Multi-Core Timer, because they both > share some common hardware blocks. This patch adds a mode of cooperation > with arch_timer driver, so kernel can use CP15 based timer interface via > arch_timer driver, which is mandatory on ARM64. In such mode driver only > configures MCT registers and starts the timer but don't register any > clocksource or events in the system. Those are left to be handled by > arch_timer driver. > > Signed-off-by: Marek Szyprowski > --- > drivers/clocksource/exynos_mct.c | 28 ++++++++++++++++++++++------ > 1 file changed, 22 insertions(+), 6 deletions(-) > > diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c > index 43b335ff4a96..05b201ed8ef5 100644 > --- a/drivers/clocksource/exynos_mct.c > +++ b/drivers/clocksource/exynos_mct.c > @@ -57,6 +57,7 @@ > #define TICK_BASE_CNT 1 > > enum { > + MCT_INT_NONE = 0, > MCT_INT_SPI, > MCT_INT_PPI > }; > @@ -238,6 +239,9 @@ static int __init exynos4_clocksource_init(void) > { > exynos4_mct_frc_start(); > > + if (!mct_int_type) > + return 0; > + > #if defined(CONFIG_ARM) > exynos4_delay_timer.read_current_timer = &exynos4_read_current_timer; > exynos4_delay_timer.freq = clk_rate; > @@ -343,6 +347,9 @@ static struct irqaction mct_comp_event_irq = { > > static int exynos4_clockevent_init(void) > { > + if (!mct_int_type) > + return 0; > + > mct_comp_device.cpumask = cpumask_of(0); > clockevents_config_and_register(&mct_comp_device, clk_rate, > 0xf, 0xffffffff); > @@ -476,12 +483,12 @@ static int exynos4_mct_starting_cpu(unsigned int cpu) > > irq_force_affinity(evt->irq, cpumask_of(cpu)); > enable_irq(evt->irq); > - } else { > + } else if (mct_int_type == MCT_INT_PPI) { > enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); > } > - clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), > - 0xf, 0x7fffffff); > - > + if (mct_int_type) > + clockevents_config_and_register(evt, > + clk_rate / (TICK_BASE_CNT + 1), 0xf, 0x7fffffff); > return 0; > } > > @@ -496,7 +503,7 @@ static int exynos4_mct_dying_cpu(unsigned int cpu) > if (evt->irq != -1) > disable_irq_nosync(evt->irq); > exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET); > - } else { > + } else if (mct_int_type == MCT_INT_PPI) { > disable_percpu_irq(mct_irqs[MCT_L0_IRQ]); > } > return 0; > @@ -529,7 +536,7 @@ static int __init exynos4_timer_resources(struct device_node *np, void __iomem * > &percpu_mct_tick); > WARN(err, "MCT: can't request IRQ %d (%d)\n", > mct_irqs[MCT_L0_IRQ], err); > - } else { > + } else if (mct_int_type == MCT_INT_SPI) { > for_each_possible_cpu(cpu) { > int mct_irq = mct_irqs[MCT_L0_IRQ + cpu]; > struct mct_clock_event_device *pcpu_mevt = The error path of cpuhp_setup_state() does not look correct because request_percpu_irq() was not called. The error path looks suspicious also for MCT_INT_SPI path - the IRQs were allocated with regular request_irq but are freed with percpu version. > @@ -573,6 +580,15 @@ static int __init mct_init_dt(struct device_node *np, unsigned int int_type) > > mct_int_type = int_type; > > + if (IS_ENABLED(CONFIG_ARM64) && IS_ENABLED(CONFIG_ARM_ARCH_TIMER)) { > + struct device_node *np = of_find_compatible_node(NULL, NULL, > + "arm,armv8-timer"); > + if (np) { > + mct_int_type = MCT_INT_NONE; > + of_node_put(np); In this case, later the mct_irqs are being assigned but totally not used. Are they needed? Best regards, Krzysztof > + } > + } > + > /* This driver uses only one global timer interrupt */ > mct_irqs[MCT_G0_IRQ] = irq_of_parse_and_map(np, MCT_G0_IRQ); > > -- > 2.17.1 >