Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp620494img; Thu, 21 Mar 2019 05:37:27 -0700 (PDT) X-Google-Smtp-Source: APXvYqyUHTmHhUIPdvW9J5KlakbHbEoehtV04SYtUcUSXw+pN4udmA27ZPA5thZnS+8huLSyc8kj X-Received: by 2002:a62:6f06:: with SMTP id k6mr3046610pfc.257.1553171847613; Thu, 21 Mar 2019 05:37:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553171847; cv=none; d=google.com; s=arc-20160816; b=mFZcATpyaYBEoI6v/rBONEAvkapVtcKMDhtyPLW8DEw/xLAlgQ7nPhbsOQzGZAYYe2 1Q3EzBpNEZPhCCG20RLAZjuTD5urlM/ZolVGvjkw+T1Ath6m8nviTqGeY7Oi0Zr7PruA 3Jx3S0T2Pzzq3vleaiW6hgcDHEVFROzMzyQJ/kAx7k80VBhB5LRWJ8wK1q/wmFaj3UW8 jC0NVJ6TsJ+jfpmfGrLU0lN9Kvd1IVQ1NqIpWej7H6rRgJt4YzSY0STWUmLSz3lHDqJk tFDBtXjeu5em2fDeiwJbo73MUiA+R6Q1znPmZdYW86+snKQMSo9xbLzyP/PDlKEMMjq8 y8tw== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=qqM8YPlwTOG0SxZbOJgxq49GuGYwN0BjKW9OkKL29LI=; b=r+Jvk/IWq9RpUDQLB5ngobYtpnt9Mxb08QQaBxcvWoZxSGi5qBSLAla/plAy37qyGz 4rO8wSnhqF+S1DTwEGXdrzhZWgJUeZv0Iqq4sVapblgBA36ttxGVaivc8qr7zCPvk4Lj 7mDJk7FUCf8Cn4XHYUjMtEkL2ktJVvwgGdznb6LAtybK112t0e5ZVph+cJ3l2G+ytJqe lmkwt49Ta9pQ2K8GarmG017cVavSR7NAnjEIJ3Y/opQ82KPSpZXHMrTScAsnZERiWgWl hawsmMRRtyWH92c1Ldw8qcDg3z5kpRmdC2ZVb9Wh5wARiNSzHODBaANHUPTlaG+Pi1pg ZPiQ== 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 q9si3977774pgq.173.2019.03.21.05.37.09; Thu, 21 Mar 2019 05:37:27 -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 S1728093AbfCUMg1 (ORCPT + 99 others); Thu, 21 Mar 2019 08:36:27 -0400 Received: from foss.arm.com ([217.140.101.70]:55382 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727986AbfCUMg1 (ORCPT ); Thu, 21 Mar 2019 08:36:27 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4F49D80D; Thu, 21 Mar 2019 05:36:26 -0700 (PDT) Received: from [10.1.196.75] (e110467-lin.cambridge.arm.com [10.1.196.75]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C1FFE3F614; Thu, 21 Mar 2019 05:36:23 -0700 (PDT) Subject: Re: [PATCH v6 4/4] perf/smmuv3_pmu: Enable HiSilicon Erratum 162001800 quirk To: Shameer Kolothum , lorenzo.pieralisi@arm.com Cc: andrew.murray@arm.com, jean-philippe.brucker@arm.com, will.deacon@arm.com, mark.rutland@arm.com, guohanjun@huawei.com, john.garry@huawei.com, pabba@codeaurora.org, vkilari@codeaurora.org, rruigrok@codeaurora.org, linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxarm@huawei.com, neil.m.leeder@gmail.com References: <20190204121324.11460-1-shameerali.kolothum.thodi@huawei.com> <20190204121324.11460-5-shameerali.kolothum.thodi@huawei.com> From: Robin Murphy Message-ID: Date: Thu, 21 Mar 2019 12:36:22 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1 MIME-Version: 1.0 In-Reply-To: <20190204121324.11460-5-shameerali.kolothum.thodi@huawei.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/02/2019 12:13, Shameer Kolothum wrote: > HiSilicon erratum 162001800 describes the limitation of > SMMUv3 PMCG implementation on HiSilicon Hip08 platforms. > > On these platforms, the PMCG event counter registers > (SMMU_PMCG_EVCNTRn) are read only and as a result it > is not possible to set the initial counter period value > on event monitor start. > > To work around this, the current value of the counter > is read and used for delta calculations. OEM information > from ACPI header is used to identify the affected hardware > platforms. > > Signed-off-by: Shameer Kolothum > --- > drivers/acpi/arm64/iort.c | 16 ++++++++++++++- > drivers/perf/arm_smmuv3_pmu.c | 48 ++++++++++++++++++++++++++++++++++++------- > include/linux/acpi_iort.h | 1 + > 3 files changed, 57 insertions(+), 8 deletions(-) > > diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c > index e2c9b26..4dc68de 100644 > --- a/drivers/acpi/arm64/iort.c > +++ b/drivers/acpi/arm64/iort.c > @@ -1366,9 +1366,23 @@ static void __init arm_smmu_v3_pmcg_init_resources(struct resource *res, > ACPI_EDGE_SENSITIVE, &res[2]); > } > > +static struct acpi_platform_list pmcg_plat_info[] __initdata = { > + /* HiSilicon Hip08 Platform */ > + {"HISI ", "HIP08 ", 0, ACPI_SIG_IORT, greater_than_or_equal, 0, > + IORT_SMMU_V3_PMCG_HISI_HIP08}, > + { } > +}; > + > static int __init arm_smmu_v3_pmcg_add_platdata(struct platform_device *pdev) > { > - u32 model = IORT_SMMU_V3_PMCG_GENERIC; > + u32 model; > + int idx; > + > + idx = acpi_match_platform_list(pmcg_plat_info); > + if (idx >= 0) > + model = pmcg_plat_info[idx].data; > + else > + model = IORT_SMMU_V3_PMCG_GENERIC; > > return platform_device_add_data(pdev, &model, sizeof(model)); > } > diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c > index eeb9dee..95a3ed0 100644 > --- a/drivers/perf/arm_smmuv3_pmu.c > +++ b/drivers/perf/arm_smmuv3_pmu.c > @@ -35,6 +35,7 @@ > */ > > #include > +#include > #include > #include > #include > @@ -93,6 +94,8 @@ > > #define SMMU_PMCG_PA_SHIFT 12 > > +#define SMMU_PMCG_EVCNTR_RDONLY BIT(0) > + > static int cpuhp_state_num; > > struct smmu_pmu { > @@ -107,6 +110,7 @@ struct smmu_pmu { > struct device *dev; > void __iomem *reg_base; > void __iomem *reloc_base; > + u32 options; Super-nit: can we put options the other side of counter_mask so as to not waste 8 whole bytes on padding? ;) Otherwise, nothing stands out to my eye, so Reviewed-by: Robin Murphy Cheers, Robin. > u64 counter_mask; > bool global_filter; > u32 global_filter_span; > @@ -222,15 +226,27 @@ static void smmu_pmu_set_period(struct smmu_pmu *smmu_pmu, > u32 idx = hwc->idx; > u64 new; > > - /* > - * We limit the max period to half the max counter value of the counter > - * size, so that even in the case of extreme interrupt latency the > - * counter will (hopefully) not wrap past its initial value. > - */ > - new = smmu_pmu->counter_mask >> 1; > + if (smmu_pmu->options & SMMU_PMCG_EVCNTR_RDONLY) { > + /* > + * On platforms that require this quirk, if the counter starts > + * at < half_counter value and wraps, the current logic of > + * handling the overflow may not work. It is expected that, > + * those platforms will have full 64 counter bits implemented > + * so that such a possibility is remote(eg: HiSilicon HIP08). > + */ > + new = smmu_pmu_counter_get_value(smmu_pmu, idx); > + } else { > + /* > + * We limit the max period to half the max counter value > + * of the counter size, so that even in the case of extreme > + * interrupt latency the counter will (hopefully) not wrap > + * past its initial value. > + */ > + new = smmu_pmu->counter_mask >> 1; > + smmu_pmu_counter_set_value(smmu_pmu, idx, new); > + } > > local64_set(&hwc->prev_count, new); > - smmu_pmu_counter_set_value(smmu_pmu, idx, new); > } > > static void smmu_pmu_set_event_filter(struct perf_event *event, > @@ -674,6 +690,22 @@ static void smmu_pmu_reset(struct smmu_pmu *smmu_pmu) > smmu_pmu->reloc_base + SMMU_PMCG_OVSCLR0); > } > > +static void smmu_pmu_get_acpi_options(struct smmu_pmu *smmu_pmu) > +{ > + u32 model; > + > + model = *(u32 *)dev_get_platdata(smmu_pmu->dev); > + > + switch (model) { > + case IORT_SMMU_V3_PMCG_HISI_HIP08: > + /* HiSilicon Erratum 162001800 */ > + smmu_pmu->options |= SMMU_PMCG_EVCNTR_RDONLY; > + break; > + } > + > + dev_notice(smmu_pmu->dev, "option mask 0x%x\n", smmu_pmu->options); > +} > + > static int smmu_pmu_probe(struct platform_device *pdev) > { > struct smmu_pmu *smmu_pmu; > @@ -752,6 +784,8 @@ static int smmu_pmu_probe(struct platform_device *pdev) > return -EINVAL; > } > > + smmu_pmu_get_acpi_options(smmu_pmu); > + > /* Pick one CPU to be the preferred one to use */ > smmu_pmu->on_cpu = get_cpu(); > WARN_ON(irq_set_affinity(smmu_pmu->irq, cpumask_of(smmu_pmu->on_cpu))); > diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h > index 832bd6a..bdb6912 100644 > --- a/include/linux/acpi_iort.h > +++ b/include/linux/acpi_iort.h > @@ -31,6 +31,7 @@ > * that, this is not part of the IORT specification. > */ > #define IORT_SMMU_V3_PMCG_GENERIC 0x00000000 /* Generic SMMUv3 PMCG */ > +#define IORT_SMMU_V3_PMCG_HISI_HIP08 0x00000001 /* HiSilicon HIP08 PMCG */ > > int iort_register_domain_token(int trans_id, phys_addr_t base, > struct fwnode_handle *fw_node); >