Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp248949ybm; Wed, 22 May 2019 02:28:15 -0700 (PDT) X-Google-Smtp-Source: APXvYqyDjspkHvCGggnQHQxQfzlIOidtzH2Fqa6QYzEjBaZebxd+BUaGPu33gWOnIzHwTdqvINIq X-Received: by 2002:a63:a849:: with SMTP id i9mr88276846pgp.205.1558517295492; Wed, 22 May 2019 02:28:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558517295; cv=none; d=google.com; s=arc-20160816; b=dMOvGb0v6vJUY8xNzP6O9ZVTDKTZ7oIRgSGyDo4y3rRlowZdKEMvBuBhu9qCRKiIvA 8VWtalHyz1p6L5fCN/2LfeNjo3T2YNbZ6EhjGrIkdBT4uP2FkYkHbCeXb/8oMtVSJ2ju FegXSEL/RlVsoKnlfeOrL3UME9NzrZEz8qQbNxZZhSZr7PGbW9bchztdFeModabcKYRt X6gDBU7JKqGH70NDE6ymHFCq1qqPvrY2pEajYVMA4WseCIc8KsNO7kVmhUqr7Yqe7O8D cKyHVxvfpMxHYsGZGD3rH/LleLL7U4k4Tt1LMM0VuDp+W2FXzHAuE2fuqQ8HPfi5j357 KEkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from; bh=wH/DdqqZ+1/6XbOyDMae0o6VrNwK2blsmkRKtDkQmvE=; b=FvQBbjEgYlUNpd8GCoxzqolruytJ7wF1ytHOn82o+yCbFz4NFU4W/fneGZQCBMbJ4F Z2aL1gpO8dTJ8hXdTbKEm3faRgE8har6h7TtB6ayKEd+AuELm9dauSzKu4BsMbY9zymh 6JJlvOSHy0qVPnP/2uKE7HbNSUNi5IZJVsQkid/+NzSqxFZWLiwyRkAhA/M1N6ifmYmj KlfU5SvNlSmym54YlQ0TaDt0XJZ77fEgv/BwX3ArZe337QKTSJTwc84ta0MvDS3r4eNK PdggSC6BnsjD6r/UQg4j571hh49nofIvlFnJwkYvjxmRYMFLila6819xm2Bl8hOhUvNI wZkQ== ARC-Authentication-Results: i=1; mx.google.com; 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 y4si25082596plb.283.2019.05.22.02.28.00; Wed, 22 May 2019 02:28:15 -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; 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 S1729035AbfEVJ0v (ORCPT + 99 others); Wed, 22 May 2019 05:26:51 -0400 Received: from smtp2200-217.mail.aliyun.com ([121.197.200.217]:40309 "EHLO smtp2200-217.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728584AbfEVJ0t (ORCPT ); Wed, 22 May 2019 05:26:49 -0400 X-Alimail-AntiSpam: AC=CONTINUE;BC=0.07470165|-1;CH=green;DM=CONTINUE|CONTINUE|true|0.482592-0.0157801-0.501628;FP=0|0|0|0|0|-1|-1|-1;HT=e02c03278;MF=han_mao@c-sky.com;NM=1;PH=DS;RN=4;RT=4;SR=0;TI=SMTPD_---.EbU0p0f_1558517205; Received: from localhost(mailfrom:han_mao@c-sky.com fp:SMTPD_---.EbU0p0f_1558517205) by smtp.aliyun-inc.com(10.147.40.2); Wed, 22 May 2019 17:26:46 +0800 From: Mao Han To: linux-kernel@vger.kernel.org Cc: Mao Han , Guo Ren , linux-csky@vger.kernel.org Subject: [PATCH 2/5] csky: Add reg-io-width property for csky pmu Date: Wed, 22 May 2019 17:25:29 +0800 Message-Id: X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org csky pmu counter may have different io width. When the counter is smaller then 64 bits and counter value is smaller than the old value, it will result to a extremely large delta value. So the sampled value should be extend to 64 bits to avoid this, the extension bits base on the reg-io-width property from dts. Signed-off-by: Mao Han CC: Guo Ren CC: linux-csky@vger.kernel.org --- arch/csky/kernel/perf_event.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/arch/csky/kernel/perf_event.c b/arch/csky/kernel/perf_event.c index c022acc..f1b3cdf 100644 --- a/arch/csky/kernel/perf_event.c +++ b/arch/csky/kernel/perf_event.c @@ -18,6 +18,7 @@ static void (*hw_raw_write_mapping[CSKY_PMU_MAX_EVENTS])(uint64_t val); struct csky_pmu_t { struct pmu pmu; + uint32_t sign_extend; uint32_t hpcr; } csky_pmu; @@ -806,7 +807,13 @@ static void csky_perf_event_update(struct perf_event *event, struct hw_perf_event *hwc) { uint64_t prev_raw_count = local64_read(&hwc->prev_count); - uint64_t new_raw_count = hw_raw_read_mapping[hwc->idx](); + /* + * Extend count value to 64bit, otherwise delta calculation would + * be incorrect when overflow occurs. + */ + uint64_t new_raw_count = ((int64_t)hw_raw_read_mapping[hwc->idx]() + << csky_pmu.sign_extend) + >> csky_pmu.sign_extend; int64_t delta = new_raw_count - prev_raw_count; /* @@ -1037,6 +1044,7 @@ int csky_pmu_device_probe(struct platform_device *pdev, const struct of_device_id *of_id; csky_pmu_init init_fn; struct device_node *node = pdev->dev.of_node; + int cnt_width; int ret = -ENODEV; of_id = of_match_node(of_table, pdev->dev.of_node); @@ -1045,6 +1053,12 @@ int csky_pmu_device_probe(struct platform_device *pdev, ret = init_fn(&csky_pmu); } + if (!of_property_read_u32(node, "reg-io-width", &cnt_width)) { + csky_pmu.sign_extend = 64 - cnt_width; + } else { + csky_pmu.sign_extend = 16; + } + if (ret) { pr_notice("[perf] failed to probe PMU!\n"); return ret; -- 2.7.4