Received: by 2002:a05:7412:251c:b0:e2:908c:2ebd with SMTP id w28csp962304rda; Sun, 22 Oct 2023 19:06:03 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEA6tllNB7kc9nDRvWDPMcMGySDbsOulN8osULO6fQbf2f4xjlLmGX0aq/aZS0ExYAEtyu4 X-Received: by 2002:a67:c217:0:b0:452:856c:471f with SMTP id i23-20020a67c217000000b00452856c471fmr7220381vsj.35.1698026763632; Sun, 22 Oct 2023 19:06:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698026763; cv=none; d=google.com; s=arc-20160816; b=nms2BJY5bnTIKym/l6F8Jnvf8T7WAR6SpwrqrFMLgXSkqXy7gerjxl9RU+9ileVjz3 QIgD5Vp21ZmSij8Of9sbXmDzU8yv32LZeRJCGz3n0EV9gEanPEH7oU+P9yc3uHy1wC1B jtY5CHR5iTDpd5Vd3HvitjeY0AcD21d4siCmcOZ5v5a5qeOQrkGlVNKvvpr6k66aDiao 8hJEahFhn4WyvTM/JGNxG+Y+B9w+SsQkdCw+tAAh9ZS376/UHrGHDOn2xeR+lGYnYNYr AHlvLdKziS6dWrfLDh02ewUZIxPKl23uDNxdDmAcncdPcPY/KJzoDOZyHKhn75yxR+Lw 5sNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:subject:user-agent:mime-version:date:message-id; bh=E62tpIjJrNHodIzqMObQ1M0PxZpDGHzDxb1hta5t5fI=; fh=fsAX4kwFIHhsjh4Fbch4SG01/WnIpq1SsJHtpJDCbNU=; b=AgFs1wr4mUl+cBsnSnxKem/tKQmLuemFiRtEZ1Meh1kFyOkw+kZBCiYAtO/w2F6ooQ 0wAhP5hV9S5QkMxpVb2XgFWsvWWdgBKphK2xWum1Nwt0j27HCNdXtLTaUJx/KYXszCQh +ns85xjYN7Vxoc1f+npPzAoBEbLTXSdpzdYRPkb0exvCeK80NxZahinkmc9IhGDr4y5N 4H4JvgJNq6A9VT5Fp690TlQRD6b6q7wMoDJ7S9UNv471oCwSH1ye5Ri67FnhlgA8v/XB LGHQiLnIPabYjg9bKH+wQCDrKochq9+PmrcGYNVxMKgL+b0FscKtK7c5e+ba2c3aivz3 1pqA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id s15-20020a63770f000000b005ac08e723f0si5783478pgc.10.2023.10.22.19.06.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Oct 2023 19:06:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 3606B8065CCA; Sun, 22 Oct 2023 19:06:00 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232910AbjJWCFo (ORCPT + 99 others); Sun, 22 Oct 2023 22:05:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54964 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229484AbjJWCFo (ORCPT ); Sun, 22 Oct 2023 22:05:44 -0400 Received: from out30-133.freemail.mail.aliyun.com (out30-133.freemail.mail.aliyun.com [115.124.30.133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 56C8E107; Sun, 22 Oct 2023 19:05:39 -0700 (PDT) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R181e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046051;MF=baolin.wang@linux.alibaba.com;NM=1;PH=DS;RN=15;SR=0;TI=SMTPD_---0Vud2pUO_1698026734; Received: from 30.97.48.63(mailfrom:baolin.wang@linux.alibaba.com fp:SMTPD_---0Vud2pUO_1698026734) by smtp.aliyun-inc.com; Mon, 23 Oct 2023 10:05:36 +0800 Message-ID: <539dade7-c349-33c3-cb9e-8a795de28041@linux.alibaba.com> Date: Mon, 23 Oct 2023 10:05:51 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.15.1 Subject: Re: [PATCH v9 3/4] drivers/perf: add DesignWare PCIe PMU driver To: Shuai Xue Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, rdunlap@infradead.org, mark.rutland@arm.com, zhuo.song@linux.alibaba.com, renyu.zj@linux.alibaba.com, chengyou@linux.alibaba.com, kaishen@linux.alibaba.com, helgaas@kernel.org, yangyicong@huawei.com, will@kernel.org, Jonathan.Cameron@huawei.com, robin.murphy@arm.com References: <20231020134230.53342-1-xueshuai@linux.alibaba.com> <20231020134230.53342-4-xueshuai@linux.alibaba.com> <8c6a480e-41d2-43f7-952e-4f4e691e700f@linux.alibaba.com> From: Baolin Wang In-Reply-To: <8c6a480e-41d2-43f7-952e-4f4e691e700f@linux.alibaba.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.1 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, UNPARSEABLE_RELAY autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Sun, 22 Oct 2023 19:06:00 -0700 (PDT) On 10/22/2023 3:47 PM, Shuai Xue wrote: > Hi, Baolin, > > I droped your Revivewed-by tag due to that I made significant changes to this > patch previously, please explicty give me Revivewed-by tag again if you are > happy with the changes. Yes, I am happy with this version (just some nits as below), and thanks for the review from other guys. Please feel free to add: Reviewed-by: Baolin Wang > On 2023/10/20 21:42, Shuai Xue wrote: >> This commit adds the PCIe Performance Monitoring Unit (PMU) driver support >> for T-Head Yitian SoC chip. Yitian is based on the Synopsys PCI Express >> Core controller IP which provides statistics feature. The PMU is a PCIe >> configuration space register block provided by each PCIe Root Port in a >> Vendor-Specific Extended Capability named RAS D.E.S (Debug, Error >> injection, and Statistics). >> >> To facilitate collection of statistics the controller provides the >> following two features for each Root Port: >> >> - one 64-bit counter for Time Based Analysis (RX/TX data throughput and >> time spent in each low-power LTSSM state) and >> - one 32-bit counter for Event Counting (error and non-error events for >> a specified lane) >> >> Note: There is no interrupt for counter overflow. >> >> This driver adds PMU devices for each PCIe Root Port. And the PMU device is >> named based the BDF of Root Port. For example, >> >> 30:03.0 PCI bridge: Device 1ded:8000 (rev 01) >> >> the PMU device name for this Root Port is dwc_rootport_3018. >> >> Example usage of counting PCIe RX TLP data payload (Units of bytes):: >> >> $# perf stat -a -e dwc_rootport_3018/Rx_PCIe_TLP_Data_Payload/ >> >> average RX bandwidth can be calculated like this: >> >> PCIe TX Bandwidth = Rx_PCIe_TLP_Data_Payload / Measure_Time_Window >> >> Signed-off-by: Shuai Xue >> --- [snip] >> +static u64 dwc_pcie_pmu_read_time_based_counter(struct perf_event *event) >> +{ >> + struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu); >> + struct pci_dev *pdev = pcie_pmu->pdev; >> + int event_id = DWC_PCIE_EVENT_ID(event); >> + u16 ras_des_offset = pcie_pmu->ras_des_offset; >> + u32 lo, hi, ss; >> + >> + /* >> + * The 64-bit value of the data counter is spread across two >> + * registers that are not synchronized. In order to read them >> + * atomically, ensure that the high 32 bits match before and after >> + * reading the low 32 bits. >> + */ >> + pci_read_config_dword(pdev, ras_des_offset + >> + DWC_PCIE_TIME_BASED_ANAL_DATA_REG_HIGH, &hi); >> + do { >> + /* snapshot the high 32 bits */ >> + ss = hi; >> + >> + pci_read_config_dword( >> + pdev, ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_DATA_REG_LOW, >> + &lo); >> + pci_read_config_dword( >> + pdev, ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_DATA_REG_HIGH, >> + &hi); >> + } while (hi != ss); >> + >> + /* >> + * The Group#1 event measures the amount of data processed in 16-byte >> + * units. Simplify the end-user interface by multiplying the counter >> + * at the point of read. >> + */ >> + if (event_id >= 0x20 && event_id <= 0x23) >> + return (((u64)hi << 32) | lo) << 4; >> + else You can drop the 'else'. >> + return (((u64)hi << 32) | lo); >> +} >> + >> +static void dwc_pcie_pmu_event_update(struct perf_event *event) >> +{ >> + struct hw_perf_event *hwc = &event->hw; >> + enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event); >> + u64 delta, prev, now; >> + >> + do { >> + prev = local64_read(&hwc->prev_count); >> + >> + if (type == DWC_PCIE_LANE_EVENT) >> + now = dwc_pcie_pmu_read_lane_event_counter(event); >> + else if (type == DWC_PCIE_TIME_BASE_EVENT) >> + now = dwc_pcie_pmu_read_time_based_counter(event); >> + >> + } while (local64_cmpxchg(&hwc->prev_count, prev, now) != prev); >> + >> + if (type == DWC_PCIE_LANE_EVENT) >> + delta = (now - prev) & DWC_PCIE_LANE_EVENT_MAX_PERIOD; >> + else if (type == DWC_PCIE_TIME_BASE_EVENT) >> + delta = (now - prev) & DWC_PCIE_TIME_BASED_EVENT_MAX_PERIOD; >> + >> + local64_add(delta, &event->count); >> +} >> + >> +static int dwc_pcie_pmu_event_init(struct perf_event *event) >> +{ >> + struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu); >> + enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event); >> + struct perf_event *sibling; >> + u32 lane; >> + >> + if (event->attr.type != event->pmu->type) >> + return -ENOENT; >> + >> + /* We don't support sampling */ >> + if (is_sampling_event(event)) >> + return -EINVAL; >> + >> + /* We cannot support task bound events */ >> + if (event->cpu < 0 || event->attach_state & PERF_ATTACH_TASK) >> + return -EINVAL; >> + >> + if (event->group_leader != event && >> + !is_software_event(event->group_leader)) >> + return -EINVAL; >> + >> + for_each_sibling_event(sibling, event->group_leader) { >> + if (sibling->pmu != event->pmu && !is_software_event(sibling)) >> + return -EINVAL; >> + } >> + >> + if (type == DWC_PCIE_LANE_EVENT) { >> + lane = DWC_PCIE_EVENT_LANE(event); >> + if (lane < 0 || lane >= pcie_pmu->nr_lanes) >> + return -EINVAL; >> + } >> + >> + event->cpu = pcie_pmu->on_cpu; >> + >> + return 0; >> +} >> + >> +static void dwc_pcie_pmu_set_period(struct hw_perf_event *hwc) >> +{ >> + local64_set(&hwc->prev_count, 0); >> +} Only dwc_pcie_pmu_event_start() will call this small function, why just remove this function and move local64_set() into dwc_pcie_pmu_event_start()? >> + >> +static void dwc_pcie_pmu_event_start(struct perf_event *event, int flags) >> +{ >> + struct hw_perf_event *hwc = &event->hw; >> + struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu); >> + enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event); >> + >> + hwc->state = 0; >> + dwc_pcie_pmu_set_period(hwc); >> + >> + if (type == DWC_PCIE_LANE_EVENT) >> + dwc_pcie_pmu_lane_event_enable(pcie_pmu, true); >> + else if (type == DWC_PCIE_TIME_BASE_EVENT) >> + dwc_pcie_pmu_time_based_event_enable(pcie_pmu, true); >> +} >> +