Message ID | 20230606074938.97724-1-xueshuai@linux.alibaba.com |
---|---|
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp3225531vqr; Tue, 6 Jun 2023 01:06:37 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ45MGYrpe+Wx0WU2nWlAPPZPJ7jSP9Pf3YrGSSnfZueaeiRSZ6ta3XGuPDjKWIhPV9Ynr3S X-Received: by 2002:a92:d48b:0:b0:32f:80a1:2e44 with SMTP id p11-20020a92d48b000000b0032f80a12e44mr1959823ilg.9.1686038797010; Tue, 06 Jun 2023 01:06:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686038796; cv=none; d=google.com; s=arc-20160816; b=jJ7ITzvNbi2rtuqp4XMn6/Il/pyPMvuZGM4JUSfF1LF3OsHH62B4yseq4iKAp+PjtD By0azc53yynB6UzLS5TJPgqf0vPSo+G3CA5dgXgAf3T+E2cduYSe762dUp35c3B1MY6w +POkpnKQW/ukTzYRWJ+76a5tVNZbIR/9SszLBza/NV9X20lnJbsrLXPSye35/Q1MTW6j k8rSR68J1P6puAFhcg7zIx29deXTWMrwtJhgl97sJCtrrOd4nMOu7IKi12JzhPi6+0sy nPRM1tizNAUzejHAR/+yE0Lt6NcWbngiTVjwfotfpuLWI34/uE0SNqt5pxGp08jzrp3O I1rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=K1rIQnykxGkVmhdwo5vrJfCkv68v9Lq9jjQSfl9PVeA=; b=kaAepGhC6sNjMx0FGagbRDr2TsqHI1HHfQb78pqNaYZdCmv2iJ/iy9WYFPr5iKMr0B n3p5XAVSRFhoXiBmi9lYVN5E+dZBUtEBa0zG04TxkpI8PwuVn7pcKcI78ILZrH15zoFT FWG36PJA6ZTWDjHCGQW3++2ykdL+f5FDzQ8hqAbEN39YWfJ5+9qM+ct9JnTjmf1O/rm5 QpeanlMle2EEDX1n0bRKayo5hVDqNpOZ31PLGqwvS6BQPFaUOzBs2hgqBzsLKnP5gsje xWG0hq8WK23lm5iQtNuBDsOAufmw6A10OPRcdIVvjJN+kSd4kL1kgd31qjKDCL7OtbXO PeYA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h62-20020a638341000000b00543a89c95bdsi3546245pge.66.2023.06.06.01.06.24; Tue, 06 Jun 2023 01:06:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233988AbjFFHyC (ORCPT <rfc822;xxoosimple@gmail.com> + 99 others); Tue, 6 Jun 2023 03:54:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58114 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234697AbjFFHxZ (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 6 Jun 2023 03:53:25 -0400 Received: from out30-131.freemail.mail.aliyun.com (out30-131.freemail.mail.aliyun.com [115.124.30.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 657CB19B1; Tue, 6 Jun 2023 00:49:48 -0700 (PDT) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R921e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046060;MF=xueshuai@linux.alibaba.com;NM=1;PH=DS;RN=15;SR=0;TI=SMTPD_---0VkVT159_1686037781; Received: from localhost.localdomain(mailfrom:xueshuai@linux.alibaba.com fp:SMTPD_---0VkVT159_1686037781) by smtp.aliyun-inc.com; Tue, 06 Jun 2023 15:49:44 +0800 From: Shuai Xue <xueshuai@linux.alibaba.com> To: chengyou@linux.alibaba.com, kaishen@linux.alibaba.com, helgaas@kernel.org, yangyicong@huawei.com, will@kernel.org, Jonathan.Cameron@huawei.com, baolin.wang@linux.alibaba.com, robin.murphy@arm.com 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, xueshuai@linux.alibaba.com Subject: [PATCH v6 0/4] drivers/perf: add Synopsys DesignWare PCIe PMU driver support Date: Tue, 6 Jun 2023 15:49:34 +0800 Message-Id: <20230606074938.97724-1-xueshuai@linux.alibaba.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1767939817771627539?= X-GMAIL-MSGID: =?utf-8?q?1767939817771627539?= |
Series |
drivers/perf: add Synopsys DesignWare PCIe PMU driver support
|
|
Message
Shuai Xue
June 6, 2023, 7:49 a.m. UTC
changes since v5: - Rewrite the commit log to follow policy in pci_ids.h (Bjorn Helgaas) - return error code when __dwc_pcie_pmu_probe failed (Baolin Wang) - call 'cpuhp_remove_multi_state()' when exiting the driver. (Baolin Wang) - pick up Review-by tag from Baolin for Patch 1 and 3 changes since v4: 1. addressing commens from Bjorn Helgaas: - reorder the includes by alpha - change all macros with upper-case hex - change ras_des type into u16 - remove unnecessary outer "()" - minor format changes 2. Address commensts from Jonathan Cameron: - rewrite doc and add a example to show how to use lane event 3. fix compile error reported by: kernel test robot - remove COMPILE_TEST and add depend on PCI in kconfig - add Reported-by: kernel test robot <lkp@intel.com> Changes since v3: 1. addressing comments from Robin Murphy: - add a prepare patch to define pci id in linux/pci_ids.h - remove unnecessary 64BIT dependency - fix DWC_PCIE_PER_EVENT_OFF/ON macro - remove dwc_pcie_pmu struct and move all its fileds into dwc_pcie_rp_info - remove unnecessary format field show - use sysfs_emit() instead of all the assorted sprintf() and snprintf() calls. - remove unnecessary spaces and remove unnecessary cast to follow event show convention - remove pcie_pmu_event_attr_is_visible - fix a refcout leak on error branch when walk pci device in for_each_pci_dev - remove bdf field from dwc_pcie_rp_info and calculate it at runtime - finish all the checks before allocating rp_info to avoid hanging wasted memory - remove some unused fields - warp out control register configuration from sub function to .add() - make function return type with a proper signature - fix lane event count enable by clear DWC_PCIE_CNT_ENABLE field first - pass rp_info directly to the read_*_counter helpers and in start, stop and add callbacks - move event type validtion into .event_init() - use is_sampling_event() to be consistent with everything else of pmu drivers - remove unnecessary dev_err message in .event_init() - return EINVAL instead EOPNOTSUPP for not a valid event - finish all the checks before start modifying the event - fix sibling event check by comparing event->pmu with sibling->pmu - probe PMU for each rootport independently - use .update() as .read() directly - remove dynamically generating symbolic name of lane event - redefine static symbolic name of lane event and leave lane filed to user - add CPU hotplug support 2. addressing comments from Baolin: - add a mask to avoid possible overflow Changes since v2 addressing comments from Baolin: - remove redundant macro definitions - use dev_err to print error message - change pmu_is_register to boolean - use PLATFORM_DEVID_NONE macro - fix module author format Changes since v1: 1. address comments from Jonathan: - drop marco for PMU name and VSEC version - simplify code with PCI standard marco - simplify code with FIELD_PREP()/FIELD_GET() to replace shift marco - name register filed with single _ instead double - wrap dwc_pcie_pmu_{write}_dword out and drop meaningless snaity check - check vendor id while matching vesc with pci_find_vsec_capability() - remove RP_NUM_MAX and use a list to organize PMU devices for rootports - replace DWC_PCIE_CREATE_BDF with standard PCI_DEVID - comments on riping register together 2. address comments from Bjorn: - rename DWC_PCIE_VSEC_ID to DWC_PCIE_VSEC_RAS_DES_ID - rename cap_pos to ras_des - simplify declare of device_attribute with DEVICE_ATTR_RO - simplify code with PCI standard macro and API like pcie_get_width_cap() - fix some code style problem and typo - drop meaningless snaity check of container_of 3. address comments from Yicong: - use sysfs_emit() to replace sprintf() - simplify iteration of pci device with for_each_pci_dev - pick preferred CPUs on a near die and add comments - unregister PMU drivers only for failed ones - log on behalf PMU device and give more hint - fix some code style problem (Thanks for all comments and they are very valuable to me) This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express Core controller IP which provides statistics feature. Shuai Xue (4): docs: perf: Add description for Synopsys DesignWare PCIe PMU driver PCI: Add Alibaba Vendor ID to linux/pci_ids.h drivers/perf: add DesignWare PCIe PMU driver MAINTAINERS: add maintainers for DesignWare PCIe PMU driver .../admin-guide/perf/dwc_pcie_pmu.rst | 97 +++ Documentation/admin-guide/perf/index.rst | 1 + MAINTAINERS | 6 + drivers/infiniband/hw/erdma/erdma_hw.h | 2 - drivers/perf/Kconfig | 7 + drivers/perf/Makefile | 1 + drivers/perf/dwc_pcie_pmu.c | 706 ++++++++++++++++++ include/linux/pci_ids.h | 2 + 8 files changed, 820 insertions(+), 2 deletions(-) create mode 100644 Documentation/admin-guide/perf/dwc_pcie_pmu.rst create mode 100644 drivers/perf/dwc_pcie_pmu.c
Comments
On 2023/6/6 15:49, Shuai Xue wrote: > changes since v5: > - Rewrite the commit log to follow policy in pci_ids.h (Bjorn Helgaas) > - return error code when __dwc_pcie_pmu_probe failed (Baolin Wang) > - call 'cpuhp_remove_multi_state()' when exiting the driver. (Baolin Wang) > - pick up Review-by tag from Baolin for Patch 1 and 3 > > changes since v4: > > 1. addressing commens from Bjorn Helgaas: > - reorder the includes by alpha > - change all macros with upper-case hex > - change ras_des type into u16 > - remove unnecessary outer "()" > - minor format changes > > 2. Address commensts from Jonathan Cameron: > - rewrite doc and add a example to show how to use lane event > > 3. fix compile error reported by: kernel test robot > - remove COMPILE_TEST and add depend on PCI in kconfig > - add Reported-by: kernel test robot <lkp@intel.com> > > Changes since v3: > > 1. addressing comments from Robin Murphy: > - add a prepare patch to define pci id in linux/pci_ids.h > - remove unnecessary 64BIT dependency > - fix DWC_PCIE_PER_EVENT_OFF/ON macro > - remove dwc_pcie_pmu struct and move all its fileds into dwc_pcie_rp_info > - remove unnecessary format field show > - use sysfs_emit() instead of all the assorted sprintf() and snprintf() calls. > - remove unnecessary spaces and remove unnecessary cast to follow event show convention > - remove pcie_pmu_event_attr_is_visible > - fix a refcout leak on error branch when walk pci device in for_each_pci_dev > - remove bdf field from dwc_pcie_rp_info and calculate it at runtime > - finish all the checks before allocating rp_info to avoid hanging wasted memory > - remove some unused fields > - warp out control register configuration from sub function to .add() > - make function return type with a proper signature > - fix lane event count enable by clear DWC_PCIE_CNT_ENABLE field first > - pass rp_info directly to the read_*_counter helpers and in start, stop and add callbacks > - move event type validtion into .event_init() > - use is_sampling_event() to be consistent with everything else of pmu drivers > - remove unnecessary dev_err message in .event_init() > - return EINVAL instead EOPNOTSUPP for not a valid event > - finish all the checks before start modifying the event > - fix sibling event check by comparing event->pmu with sibling->pmu > - probe PMU for each rootport independently > - use .update() as .read() directly > - remove dynamically generating symbolic name of lane event > - redefine static symbolic name of lane event and leave lane filed to user > - add CPU hotplug support > > 2. addressing comments from Baolin: > - add a mask to avoid possible overflow > > Changes since v2 addressing comments from Baolin: > - remove redundant macro definitions > - use dev_err to print error message > - change pmu_is_register to boolean > - use PLATFORM_DEVID_NONE macro > - fix module author format > > Changes since v1: > > 1. address comments from Jonathan: > - drop marco for PMU name and VSEC version > - simplify code with PCI standard marco > - simplify code with FIELD_PREP()/FIELD_GET() to replace shift marco > - name register filed with single _ instead double > - wrap dwc_pcie_pmu_{write}_dword out and drop meaningless snaity check > - check vendor id while matching vesc with pci_find_vsec_capability() > - remove RP_NUM_MAX and use a list to organize PMU devices for rootports > - replace DWC_PCIE_CREATE_BDF with standard PCI_DEVID > - comments on riping register together > > 2. address comments from Bjorn: > - rename DWC_PCIE_VSEC_ID to DWC_PCIE_VSEC_RAS_DES_ID > - rename cap_pos to ras_des > - simplify declare of device_attribute with DEVICE_ATTR_RO > - simplify code with PCI standard macro and API like pcie_get_width_cap() > - fix some code style problem and typo > - drop meaningless snaity check of container_of > > 3. address comments from Yicong: > - use sysfs_emit() to replace sprintf() > - simplify iteration of pci device with for_each_pci_dev > - pick preferred CPUs on a near die and add comments > - unregister PMU drivers only for failed ones > - log on behalf PMU device and give more hint > - fix some code style problem > > (Thanks for all comments and they are very valuable to me) > > This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support > for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express > Core controller IP which provides statistics feature. > > Shuai Xue (4): > docs: perf: Add description for Synopsys DesignWare PCIe PMU driver > PCI: Add Alibaba Vendor ID to linux/pci_ids.h > drivers/perf: add DesignWare PCIe PMU driver > MAINTAINERS: add maintainers for DesignWare PCIe PMU driver > > .../admin-guide/perf/dwc_pcie_pmu.rst | 97 +++ > Documentation/admin-guide/perf/index.rst | 1 + > MAINTAINERS | 6 + > drivers/infiniband/hw/erdma/erdma_hw.h | 2 - > drivers/perf/Kconfig | 7 + > drivers/perf/Makefile | 1 + > drivers/perf/dwc_pcie_pmu.c | 706 ++++++++++++++++++ > include/linux/pci_ids.h | 2 + > 8 files changed, 820 insertions(+), 2 deletions(-) > create mode 100644 Documentation/admin-guide/perf/dwc_pcie_pmu.rst > create mode 100644 drivers/perf/dwc_pcie_pmu.c > Hi, all, Gently ping. Any comments are welcomed. Thank you. Best Regards, Shuai
On 2023/6/16 16:39, Shuai Xue wrote: > > > On 2023/6/6 15:49, Shuai Xue wrote: >> changes since v5: >> - Rewrite the commit log to follow policy in pci_ids.h (Bjorn Helgaas) >> - return error code when __dwc_pcie_pmu_probe failed (Baolin Wang) >> - call 'cpuhp_remove_multi_state()' when exiting the driver. (Baolin Wang) >> - pick up Review-by tag from Baolin for Patch 1 and 3 >> >> changes since v4: >> >> 1. addressing commens from Bjorn Helgaas: >> - reorder the includes by alpha >> - change all macros with upper-case hex >> - change ras_des type into u16 >> - remove unnecessary outer "()" >> - minor format changes >> >> 2. Address commensts from Jonathan Cameron: >> - rewrite doc and add a example to show how to use lane event >> >> 3. fix compile error reported by: kernel test robot >> - remove COMPILE_TEST and add depend on PCI in kconfig >> - add Reported-by: kernel test robot <lkp@intel.com> >> >> Changes since v3: >> >> 1. addressing comments from Robin Murphy: >> - add a prepare patch to define pci id in linux/pci_ids.h >> - remove unnecessary 64BIT dependency >> - fix DWC_PCIE_PER_EVENT_OFF/ON macro >> - remove dwc_pcie_pmu struct and move all its fileds into dwc_pcie_rp_info >> - remove unnecessary format field show >> - use sysfs_emit() instead of all the assorted sprintf() and snprintf() calls. >> - remove unnecessary spaces and remove unnecessary cast to follow event show convention >> - remove pcie_pmu_event_attr_is_visible >> - fix a refcout leak on error branch when walk pci device in for_each_pci_dev >> - remove bdf field from dwc_pcie_rp_info and calculate it at runtime >> - finish all the checks before allocating rp_info to avoid hanging wasted memory >> - remove some unused fields >> - warp out control register configuration from sub function to .add() >> - make function return type with a proper signature >> - fix lane event count enable by clear DWC_PCIE_CNT_ENABLE field first >> - pass rp_info directly to the read_*_counter helpers and in start, stop and add callbacks >> - move event type validtion into .event_init() >> - use is_sampling_event() to be consistent with everything else of pmu drivers >> - remove unnecessary dev_err message in .event_init() >> - return EINVAL instead EOPNOTSUPP for not a valid event >> - finish all the checks before start modifying the event >> - fix sibling event check by comparing event->pmu with sibling->pmu >> - probe PMU for each rootport independently >> - use .update() as .read() directly >> - remove dynamically generating symbolic name of lane event >> - redefine static symbolic name of lane event and leave lane filed to user >> - add CPU hotplug support >> >> 2. addressing comments from Baolin: >> - add a mask to avoid possible overflow >> >> Changes since v2 addressing comments from Baolin: >> - remove redundant macro definitions >> - use dev_err to print error message >> - change pmu_is_register to boolean >> - use PLATFORM_DEVID_NONE macro >> - fix module author format >> >> Changes since v1: >> >> 1. address comments from Jonathan: >> - drop marco for PMU name and VSEC version >> - simplify code with PCI standard marco >> - simplify code with FIELD_PREP()/FIELD_GET() to replace shift marco >> - name register filed with single _ instead double >> - wrap dwc_pcie_pmu_{write}_dword out and drop meaningless snaity check >> - check vendor id while matching vesc with pci_find_vsec_capability() >> - remove RP_NUM_MAX and use a list to organize PMU devices for rootports >> - replace DWC_PCIE_CREATE_BDF with standard PCI_DEVID >> - comments on riping register together >> >> 2. address comments from Bjorn: >> - rename DWC_PCIE_VSEC_ID to DWC_PCIE_VSEC_RAS_DES_ID >> - rename cap_pos to ras_des >> - simplify declare of device_attribute with DEVICE_ATTR_RO >> - simplify code with PCI standard macro and API like pcie_get_width_cap() >> - fix some code style problem and typo >> - drop meaningless snaity check of container_of >> >> 3. address comments from Yicong: >> - use sysfs_emit() to replace sprintf() >> - simplify iteration of pci device with for_each_pci_dev >> - pick preferred CPUs on a near die and add comments >> - unregister PMU drivers only for failed ones >> - log on behalf PMU device and give more hint >> - fix some code style problem >> >> (Thanks for all comments and they are very valuable to me) >> >> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support >> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express >> Core controller IP which provides statistics feature. >> >> Shuai Xue (4): >> docs: perf: Add description for Synopsys DesignWare PCIe PMU driver >> PCI: Add Alibaba Vendor ID to linux/pci_ids.h >> drivers/perf: add DesignWare PCIe PMU driver >> MAINTAINERS: add maintainers for DesignWare PCIe PMU driver >> >> .../admin-guide/perf/dwc_pcie_pmu.rst | 97 +++ >> Documentation/admin-guide/perf/index.rst | 1 + >> MAINTAINERS | 6 + >> drivers/infiniband/hw/erdma/erdma_hw.h | 2 - >> drivers/perf/Kconfig | 7 + >> drivers/perf/Makefile | 1 + >> drivers/perf/dwc_pcie_pmu.c | 706 ++++++++++++++++++ >> include/linux/pci_ids.h | 2 + >> 8 files changed, 820 insertions(+), 2 deletions(-) >> create mode 100644 Documentation/admin-guide/perf/dwc_pcie_pmu.rst >> create mode 100644 drivers/perf/dwc_pcie_pmu.c >> > > Hi, all, > > Gently ping. Any comments are welcomed. Hi, all, Gentle ping. > > Thank you. > > > Best Regards, > Shuai > >
On 2023/7/10 20:04, Shuai Xue wrote: > > > On 2023/6/16 16:39, Shuai Xue wrote: >> >> >> On 2023/6/6 15:49, Shuai Xue wrote: >>> changes since v5: >>> - Rewrite the commit log to follow policy in pci_ids.h (Bjorn Helgaas) >>> - return error code when __dwc_pcie_pmu_probe failed (Baolin Wang) >>> - call 'cpuhp_remove_multi_state()' when exiting the driver. (Baolin Wang) >>> - pick up Review-by tag from Baolin for Patch 1 and 3 >>> >>> changes since v4: >>> >>> 1. addressing commens from Bjorn Helgaas: >>> - reorder the includes by alpha >>> - change all macros with upper-case hex >>> - change ras_des type into u16 >>> - remove unnecessary outer "()" >>> - minor format changes >>> >>> 2. Address commensts from Jonathan Cameron: >>> - rewrite doc and add a example to show how to use lane event >>> >>> 3. fix compile error reported by: kernel test robot >>> - remove COMPILE_TEST and add depend on PCI in kconfig >>> - add Reported-by: kernel test robot <lkp@intel.com> >>> >>> Changes since v3: >>> >>> 1. addressing comments from Robin Murphy: >>> - add a prepare patch to define pci id in linux/pci_ids.h >>> - remove unnecessary 64BIT dependency >>> - fix DWC_PCIE_PER_EVENT_OFF/ON macro >>> - remove dwc_pcie_pmu struct and move all its fileds into dwc_pcie_rp_info >>> - remove unnecessary format field show >>> - use sysfs_emit() instead of all the assorted sprintf() and snprintf() calls. >>> - remove unnecessary spaces and remove unnecessary cast to follow event show convention >>> - remove pcie_pmu_event_attr_is_visible >>> - fix a refcout leak on error branch when walk pci device in for_each_pci_dev >>> - remove bdf field from dwc_pcie_rp_info and calculate it at runtime >>> - finish all the checks before allocating rp_info to avoid hanging wasted memory >>> - remove some unused fields >>> - warp out control register configuration from sub function to .add() >>> - make function return type with a proper signature >>> - fix lane event count enable by clear DWC_PCIE_CNT_ENABLE field first >>> - pass rp_info directly to the read_*_counter helpers and in start, stop and add callbacks >>> - move event type validtion into .event_init() >>> - use is_sampling_event() to be consistent with everything else of pmu drivers >>> - remove unnecessary dev_err message in .event_init() >>> - return EINVAL instead EOPNOTSUPP for not a valid event >>> - finish all the checks before start modifying the event >>> - fix sibling event check by comparing event->pmu with sibling->pmu >>> - probe PMU for each rootport independently >>> - use .update() as .read() directly >>> - remove dynamically generating symbolic name of lane event >>> - redefine static symbolic name of lane event and leave lane filed to user >>> - add CPU hotplug support >>> >>> 2. addressing comments from Baolin: >>> - add a mask to avoid possible overflow >>> >>> Changes since v2 addressing comments from Baolin: >>> - remove redundant macro definitions >>> - use dev_err to print error message >>> - change pmu_is_register to boolean >>> - use PLATFORM_DEVID_NONE macro >>> - fix module author format >>> >>> Changes since v1: >>> >>> 1. address comments from Jonathan: >>> - drop marco for PMU name and VSEC version >>> - simplify code with PCI standard marco >>> - simplify code with FIELD_PREP()/FIELD_GET() to replace shift marco >>> - name register filed with single _ instead double >>> - wrap dwc_pcie_pmu_{write}_dword out and drop meaningless snaity check >>> - check vendor id while matching vesc with pci_find_vsec_capability() >>> - remove RP_NUM_MAX and use a list to organize PMU devices for rootports >>> - replace DWC_PCIE_CREATE_BDF with standard PCI_DEVID >>> - comments on riping register together >>> >>> 2. address comments from Bjorn: >>> - rename DWC_PCIE_VSEC_ID to DWC_PCIE_VSEC_RAS_DES_ID >>> - rename cap_pos to ras_des >>> - simplify declare of device_attribute with DEVICE_ATTR_RO >>> - simplify code with PCI standard macro and API like pcie_get_width_cap() >>> - fix some code style problem and typo >>> - drop meaningless snaity check of container_of >>> >>> 3. address comments from Yicong: >>> - use sysfs_emit() to replace sprintf() >>> - simplify iteration of pci device with for_each_pci_dev >>> - pick preferred CPUs on a near die and add comments >>> - unregister PMU drivers only for failed ones >>> - log on behalf PMU device and give more hint >>> - fix some code style problem >>> >>> (Thanks for all comments and they are very valuable to me) >>> >>> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support >>> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express >>> Core controller IP which provides statistics feature. >>> >>> Shuai Xue (4): >>> docs: perf: Add description for Synopsys DesignWare PCIe PMU driver >>> PCI: Add Alibaba Vendor ID to linux/pci_ids.h >>> drivers/perf: add DesignWare PCIe PMU driver >>> MAINTAINERS: add maintainers for DesignWare PCIe PMU driver >>> >>> .../admin-guide/perf/dwc_pcie_pmu.rst | 97 +++ >>> Documentation/admin-guide/perf/index.rst | 1 + >>> MAINTAINERS | 6 + >>> drivers/infiniband/hw/erdma/erdma_hw.h | 2 - >>> drivers/perf/Kconfig | 7 + >>> drivers/perf/Makefile | 1 + >>> drivers/perf/dwc_pcie_pmu.c | 706 ++++++++++++++++++ >>> include/linux/pci_ids.h | 2 + >>> 8 files changed, 820 insertions(+), 2 deletions(-) >>> create mode 100644 Documentation/admin-guide/perf/dwc_pcie_pmu.rst >>> create mode 100644 drivers/perf/dwc_pcie_pmu.c >>> >> >> Hi, all, >> >> Gently ping. Any comments are welcomed. > > > Hi, all, > > Gentle ping. > Hi, all Gentle reminder, thank you. >> >> Thank you. >> >> >> Best Regards, >> Shuai >> >>
On Mon, 24 Jul 2023 10:34:08 +0800 Shuai Xue <xueshuai@linux.alibaba.com> wrote: > On 2023/7/10 20:04, Shuai Xue wrote: > > > > > > On 2023/6/16 16:39, Shuai Xue wrote: > >> > >> > >> On 2023/6/6 15:49, Shuai Xue wrote: > >>> changes since v5: > >>> - Rewrite the commit log to follow policy in pci_ids.h (Bjorn Helgaas) > >>> - return error code when __dwc_pcie_pmu_probe failed (Baolin Wang) > >>> - call 'cpuhp_remove_multi_state()' when exiting the driver. (Baolin Wang) > >>> - pick up Review-by tag from Baolin for Patch 1 and 3 > >>> > >>> changes since v4: > >>> > >>> 1. addressing commens from Bjorn Helgaas: > >>> - reorder the includes by alpha > >>> - change all macros with upper-case hex > >>> - change ras_des type into u16 > >>> - remove unnecessary outer "()" > >>> - minor format changes > >>> > >>> 2. Address commensts from Jonathan Cameron: > >>> - rewrite doc and add a example to show how to use lane event > >>> > >>> 3. fix compile error reported by: kernel test robot > >>> - remove COMPILE_TEST and add depend on PCI in kconfig > >>> - add Reported-by: kernel test robot <lkp@intel.com> > >>> > >>> Changes since v3: > >>> > >>> 1. addressing comments from Robin Murphy: > >>> - add a prepare patch to define pci id in linux/pci_ids.h > >>> - remove unnecessary 64BIT dependency > >>> - fix DWC_PCIE_PER_EVENT_OFF/ON macro > >>> - remove dwc_pcie_pmu struct and move all its fileds into dwc_pcie_rp_info > >>> - remove unnecessary format field show > >>> - use sysfs_emit() instead of all the assorted sprintf() and snprintf() calls. > >>> - remove unnecessary spaces and remove unnecessary cast to follow event show convention > >>> - remove pcie_pmu_event_attr_is_visible > >>> - fix a refcout leak on error branch when walk pci device in for_each_pci_dev > >>> - remove bdf field from dwc_pcie_rp_info and calculate it at runtime > >>> - finish all the checks before allocating rp_info to avoid hanging wasted memory > >>> - remove some unused fields > >>> - warp out control register configuration from sub function to .add() > >>> - make function return type with a proper signature > >>> - fix lane event count enable by clear DWC_PCIE_CNT_ENABLE field first > >>> - pass rp_info directly to the read_*_counter helpers and in start, stop and add callbacks > >>> - move event type validtion into .event_init() > >>> - use is_sampling_event() to be consistent with everything else of pmu drivers > >>> - remove unnecessary dev_err message in .event_init() > >>> - return EINVAL instead EOPNOTSUPP for not a valid event > >>> - finish all the checks before start modifying the event > >>> - fix sibling event check by comparing event->pmu with sibling->pmu > >>> - probe PMU for each rootport independently > >>> - use .update() as .read() directly > >>> - remove dynamically generating symbolic name of lane event > >>> - redefine static symbolic name of lane event and leave lane filed to user > >>> - add CPU hotplug support > >>> > >>> 2. addressing comments from Baolin: > >>> - add a mask to avoid possible overflow > >>> > >>> Changes since v2 addressing comments from Baolin: > >>> - remove redundant macro definitions > >>> - use dev_err to print error message > >>> - change pmu_is_register to boolean > >>> - use PLATFORM_DEVID_NONE macro > >>> - fix module author format > >>> > >>> Changes since v1: > >>> > >>> 1. address comments from Jonathan: > >>> - drop marco for PMU name and VSEC version > >>> - simplify code with PCI standard marco > >>> - simplify code with FIELD_PREP()/FIELD_GET() to replace shift marco > >>> - name register filed with single _ instead double > >>> - wrap dwc_pcie_pmu_{write}_dword out and drop meaningless snaity check > >>> - check vendor id while matching vesc with pci_find_vsec_capability() > >>> - remove RP_NUM_MAX and use a list to organize PMU devices for rootports > >>> - replace DWC_PCIE_CREATE_BDF with standard PCI_DEVID > >>> - comments on riping register together > >>> > >>> 2. address comments from Bjorn: > >>> - rename DWC_PCIE_VSEC_ID to DWC_PCIE_VSEC_RAS_DES_ID > >>> - rename cap_pos to ras_des > >>> - simplify declare of device_attribute with DEVICE_ATTR_RO > >>> - simplify code with PCI standard macro and API like pcie_get_width_cap() > >>> - fix some code style problem and typo > >>> - drop meaningless snaity check of container_of > >>> > >>> 3. address comments from Yicong: > >>> - use sysfs_emit() to replace sprintf() > >>> - simplify iteration of pci device with for_each_pci_dev > >>> - pick preferred CPUs on a near die and add comments > >>> - unregister PMU drivers only for failed ones > >>> - log on behalf PMU device and give more hint > >>> - fix some code style problem > >>> > >>> (Thanks for all comments and they are very valuable to me) > >>> > >>> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support > >>> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express > >>> Core controller IP which provides statistics feature. > >>> > >>> Shuai Xue (4): > >>> docs: perf: Add description for Synopsys DesignWare PCIe PMU driver > >>> PCI: Add Alibaba Vendor ID to linux/pci_ids.h > >>> drivers/perf: add DesignWare PCIe PMU driver > >>> MAINTAINERS: add maintainers for DesignWare PCIe PMU driver > >>> > >>> .../admin-guide/perf/dwc_pcie_pmu.rst | 97 +++ > >>> Documentation/admin-guide/perf/index.rst | 1 + > >>> MAINTAINERS | 6 + > >>> drivers/infiniband/hw/erdma/erdma_hw.h | 2 - > >>> drivers/perf/Kconfig | 7 + > >>> drivers/perf/Makefile | 1 + > >>> drivers/perf/dwc_pcie_pmu.c | 706 ++++++++++++++++++ > >>> include/linux/pci_ids.h | 2 + > >>> 8 files changed, 820 insertions(+), 2 deletions(-) > >>> create mode 100644 Documentation/admin-guide/perf/dwc_pcie_pmu.rst > >>> create mode 100644 drivers/perf/dwc_pcie_pmu.c > >>> > >> > >> Hi, all, > >> > >> Gently ping. Any comments are welcomed. > > > > > > Hi, all, > > > > Gentle ping. > > > > Hi, all > > Gentle reminder, thank you. Hi Shuai, Really a question for Bjorn I think, but here is my 2 cents... The problem here is that we need to do that fundamental redesign of the way the PCI ports drivers work. I'm not sure there is a path to merging this until that is done. The bigger problem is that I'm not sure anyone is actively looking at that yet. I'd like to look at this (as I have the same problem for some other drivers), but it is behind various other things on my todo list. Bjorn might be persuaded on a temporary solution, but that would come with some maintenance problems, particularly when we try to do it 'right' in the future. Maybe adding another service driver would be a stop gap as long as we know we won't keep doing so for ever. Not sure. Jonathan > > >> > >> Thank you. > >> > >> > >> Best Regards, > >> Shuai > >> > >> >
On 2023/7/24 17:18, Jonathan Cameron wrote: > Really a question for Bjorn I think, but here is my 2 cents... > > The problem here is that we need to do that fundamental redesign of the > way the PCI ports drivers work. I'm not sure there is a path to merging > this until that is done. The bigger problem is that I'm not sure anyone > is actively looking at that yet. I'd like to look at this (as I have > the same problem for some other drivers), but it is behind various > other things on my todo list. > > Bjorn might be persuaded on a temporary solution, but that would come > with some maintenance problems, particularly when we try to do it > 'right' in the future. Maybe adding another service driver would be > a stop gap as long as we know we won't keep doing so for ever. Not sure. Thank you for your reply, and got your point, :) + Bjorn >>>> The approach used here is to separately walk the PCI topology and >>>> register the devices. It can 'maybe' get away with that because no >>>> interrupts and I assume resets have no nasty impacts on it because >>>> the device is fairly simple. In general that's not going to work. >>>> CXL does a similar trick (which I don't much like, but too late >>>> now), but we've also run into the problem of how to get interrupts >>>> if not the main driver. >>> >>> Yes, this is a real problem. I think the "walk all PCI devices >>> looking for one we like" approach is terrible because it breaks a lot >>> of driver model assumptions (no device ID to autoload module via udev, >>> hotplug doesn't work, etc), but we don't have a good alternative right >>> now. >>> >>> I think portdrv is slightly better because at least it claims the >>> device in the usual way and gives a way for service drivers to >>> register with it. But I don't really like that either because it >>> created a new weird /sys/bus/pci_express hierarchy full of these >>> sub-devices that aren't really devices, and it doesn't solve the >>> module load and hotplug issues. >>> >>> I would like to have portdrv be completely built into the PCI core and >>> not claim Root Ports or Switch Ports. Then those devices would be >>> available via the usual driver model for driver loading and binding >>> and for hotplug. >> >> Let me see if I understand this correctly as I can think of a few options >> that perhaps are inline with what you are thinking. >> >> 1) All the portdrv stuff converted to normal PCI core helper functions >> that a driver bound to the struct pci_dev can use. >> 2) Driver core itself provides a bunch of extra devices alongside the >> struct pci_dev one to which additional drivers can bind? - so kind >> of portdrv handling, but squashed into the PCI device topology? >> 3) Have portdrv operated under the hood, so all the services etc that >> it provides don't require a driver to be bound at all. Then >> allow usual VID/DID based driver binding. >> >> If 1 - we are going to run into class device restrictions and that will >> just move where we have to handle the potential vendor specific parts. >> We probably don't want that to be a hydra with all the functionality >> and lookups etc driven from there, so do we end up with sub devices >> of that new PCI port driver with a discover method based on either >> vsec + VID or DVSEC with devices created under the main pci_dev. >> That would have to include nastiness around interrupt discovery for >> those sub devices. So ends up roughly like port_drv. >> >> I don't think 2 solves anything. >> >> For 3 - interrupts and ownership of facilities is going to be tricky >> as initially those need to be owned by the PCI core (no device driver bound) >> and then I guess handed off to the driver once it shows up? Maybe that >> driver should call a pci_claim_port() that gives it control of everything >> and pci_release_port() that hands it all back to the core. That seems >> racey. > > Yes, 3 is the option I want to explore. That's what we already do for > things like ASPM. Agreed, interrupts is a potential issue. I think > the architected parts of config space should be implicitly owned by > the PCI core, with interfaces à la pci_disable_link_state() if drivers > need them. > > Bjorn > https://lore.kernel.org/lkml/ZGUAWxoEngmqFcLJ@bhelgaas/ @Bjorn Is there a path to merging this patch set until your explore is done? And are you still actively looking at that yet? I am not quite familiar with PCI core, but I would like to help work on that. Thank you. Best Regards, Shuai
On Mon, Jul 24, 2023 at 10:18:07AM +0100, Jonathan Cameron wrote: > On Mon, 24 Jul 2023 10:34:08 +0800 > Shuai Xue <xueshuai@linux.alibaba.com> wrote: > > On 2023/7/10 20:04, Shuai Xue wrote: > > > On 2023/6/16 16:39, Shuai Xue wrote: > > >> On 2023/6/6 15:49, Shuai Xue wrote: > > >>> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support > > >>> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express > > >>> Core controller IP which provides statistics feature. > ... > Really a question for Bjorn I think, but here is my 2 cents... > > The problem here is that we need to do that fundamental redesign of the > way the PCI ports drivers work. I'm not sure there is a path to merging > this until that is done. The bigger problem is that I'm not sure anyone > is actively looking at that yet. I'd like to look at this (as I have > the same problem for some other drivers), but it is behind various > other things on my todo list. > > Bjorn might be persuaded on a temporary solution, but that would come > with some maintenance problems, particularly when we try to do it > 'right' in the future. Maybe adding another service driver would be > a stop gap as long as we know we won't keep doing so for ever. Not sure. I think the question here is around the for_each_pci_dev() in __dwc_pcie_pmu_probe()? I don't *like* that because of the assumptions it breaks (autoload doesn't work, hotplug doesn't work), but: - There are several other drivers that also do this, - I don't have a better suggest for any of them, - It's not a drivers/pci thing, so not really up to me anyway, so I don't have any problem with this being merged as-is, as long as you can live with the limitations. I don't think this series does anything to work around those limitations, i.e., it doesn't make up fake device IDs for module loading or fake events for hotplug, so it seems like we could improve the implementation later if we ever have a way to do it. Bjorn
On 2023/7/26 04:59, Bjorn Helgaas wrote: > On Mon, Jul 24, 2023 at 10:18:07AM +0100, Jonathan Cameron wrote: >> On Mon, 24 Jul 2023 10:34:08 +0800 >> Shuai Xue <xueshuai@linux.alibaba.com> wrote: >>> On 2023/7/10 20:04, Shuai Xue wrote: >>>> On 2023/6/16 16:39, Shuai Xue wrote: >>>>> On 2023/6/6 15:49, Shuai Xue wrote: > >>>>>> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support >>>>>> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express >>>>>> Core controller IP which provides statistics feature. > >> ... >> Really a question for Bjorn I think, but here is my 2 cents... >> >> The problem here is that we need to do that fundamental redesign of the >> way the PCI ports drivers work. I'm not sure there is a path to merging >> this until that is done. The bigger problem is that I'm not sure anyone >> is actively looking at that yet. I'd like to look at this (as I have >> the same problem for some other drivers), but it is behind various >> other things on my todo list. >> >> Bjorn might be persuaded on a temporary solution, but that would come >> with some maintenance problems, particularly when we try to do it >> 'right' in the future. Maybe adding another service driver would be >> a stop gap as long as we know we won't keep doing so for ever. Not sure. > > I think the question here is around the for_each_pci_dev() in > __dwc_pcie_pmu_probe()? I don't *like* that because of the > assumptions it breaks (autoload doesn't work, hotplug doesn't work), > but: > > - There are several other drivers that also do this, > - I don't have a better suggest for any of them, > - It's not a drivers/pci thing, so not really up to me anyway, > > so I don't have any problem with this being merged as-is, as long as > you can live with the limitations. > > I don't think this series does anything to work around those > limitations, i.e., it doesn't make up fake device IDs for module > loading or fake events for hotplug, so it seems like we could improve > the implementation later if we ever have a way to do it. > > Bjorn + Will Ok, thank you for confirmation, Bjorn. Then it comes to perf driver parts and it is really a question for @Will I think. What's your opinion about merging this patch set, @Will? Best Regards, Shuai
On Thu, Jul 27, 2023 at 11:45:22AM +0800, Shuai Xue wrote: > > > On 2023/7/26 04:59, Bjorn Helgaas wrote: > > On Mon, Jul 24, 2023 at 10:18:07AM +0100, Jonathan Cameron wrote: > >> On Mon, 24 Jul 2023 10:34:08 +0800 > >> Shuai Xue <xueshuai@linux.alibaba.com> wrote: > >>> On 2023/7/10 20:04, Shuai Xue wrote: > >>>> On 2023/6/16 16:39, Shuai Xue wrote: > >>>>> On 2023/6/6 15:49, Shuai Xue wrote: > > > >>>>>> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support > >>>>>> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express > >>>>>> Core controller IP which provides statistics feature. > > > >> ... > >> Really a question for Bjorn I think, but here is my 2 cents... > >> > >> The problem here is that we need to do that fundamental redesign of the > >> way the PCI ports drivers work. I'm not sure there is a path to merging > >> this until that is done. The bigger problem is that I'm not sure anyone > >> is actively looking at that yet. I'd like to look at this (as I have > >> the same problem for some other drivers), but it is behind various > >> other things on my todo list. > >> > >> Bjorn might be persuaded on a temporary solution, but that would come > >> with some maintenance problems, particularly when we try to do it > >> 'right' in the future. Maybe adding another service driver would be > >> a stop gap as long as we know we won't keep doing so for ever. Not sure. > > > > I think the question here is around the for_each_pci_dev() in > > __dwc_pcie_pmu_probe()? I don't *like* that because of the > > assumptions it breaks (autoload doesn't work, hotplug doesn't work), > > but: > > > > - There are several other drivers that also do this, > > - I don't have a better suggest for any of them, > > - It's not a drivers/pci thing, so not really up to me anyway, > > > > so I don't have any problem with this being merged as-is, as long as > > you can live with the limitations. > > > > I don't think this series does anything to work around those > > limitations, i.e., it doesn't make up fake device IDs for module > > loading or fake events for hotplug, so it seems like we could improve > > the implementation later if we ever have a way to do it. > > > > Bjorn > > + Will > > Ok, thank you for confirmation, Bjorn. Then it comes to perf driver parts and > it is really a question for @Will I think. > > What's your opinion about merging this patch set, @Will? No fundamental objection from me, but I'll have a closer look when you post a version addressing the feedback from Jonathan and Yicong. Cheers, Will
On 2023/7/28 21:39, Will Deacon wrote: > On Thu, Jul 27, 2023 at 11:45:22AM +0800, Shuai Xue wrote: >> >> >> On 2023/7/26 04:59, Bjorn Helgaas wrote: >>> On Mon, Jul 24, 2023 at 10:18:07AM +0100, Jonathan Cameron wrote: >>>> On Mon, 24 Jul 2023 10:34:08 +0800 >>>> Shuai Xue <xueshuai@linux.alibaba.com> wrote: >>>>> On 2023/7/10 20:04, Shuai Xue wrote: >>>>>> On 2023/6/16 16:39, Shuai Xue wrote: >>>>>>> On 2023/6/6 15:49, Shuai Xue wrote: >>> >>>>>>>> This patchset adds the PCIe Performance Monitoring Unit (PMU) driver support >>>>>>>> for T-Head Yitian 710 SoC chip. Yitian 710 is based on the Synopsys PCI Express >>>>>>>> Core controller IP which provides statistics feature. >>> >>>> ... >>>> Really a question for Bjorn I think, but here is my 2 cents... >>>> >>>> The problem here is that we need to do that fundamental redesign of the >>>> way the PCI ports drivers work. I'm not sure there is a path to merging >>>> this until that is done. The bigger problem is that I'm not sure anyone >>>> is actively looking at that yet. I'd like to look at this (as I have >>>> the same problem for some other drivers), but it is behind various >>>> other things on my todo list. >>>> >>>> Bjorn might be persuaded on a temporary solution, but that would come >>>> with some maintenance problems, particularly when we try to do it >>>> 'right' in the future. Maybe adding another service driver would be >>>> a stop gap as long as we know we won't keep doing so for ever. Not sure. >>> >>> I think the question here is around the for_each_pci_dev() in >>> __dwc_pcie_pmu_probe()? I don't *like* that because of the >>> assumptions it breaks (autoload doesn't work, hotplug doesn't work), >>> but: >>> >>> - There are several other drivers that also do this, >>> - I don't have a better suggest for any of them, >>> - It's not a drivers/pci thing, so not really up to me anyway, >>> >>> so I don't have any problem with this being merged as-is, as long as >>> you can live with the limitations. >>> >>> I don't think this series does anything to work around those >>> limitations, i.e., it doesn't make up fake device IDs for module >>> loading or fake events for hotplug, so it seems like we could improve >>> the implementation later if we ever have a way to do it. >>> >>> Bjorn >> >> + Will >> >> Ok, thank you for confirmation, Bjorn. Then it comes to perf driver parts and >> it is really a question for @Will I think. >> >> What's your opinion about merging this patch set, @Will? > > No fundamental objection from me, but I'll have a closer look when you > post a version addressing the feedback from Jonathan and Yicong. Thanks for your input! I appreciate that you don't have any fundamental objections to merging the patch set. I'll definitely take into account the feedback from Jonathan and Yicong before posting a revised version. Best Regards, Cheers. Shuai