linux/drivers/perf/dwc_pcie_pmu.c

// SPDX-License-Identifier: GPL-2.0
/*
 * Synopsys DesignWare PCIe PMU driver
 *
 * Copyright (C) 2021-2023 Alibaba Inc.
 */

#include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/cpuhotplug.h>
#include <linux/cpumask.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/perf_event.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/smp.h>
#include <linux/sysfs.h>
#include <linux/types.h>

#define DWC_PCIE_VSEC_RAS_DES_ID
#define DWC_PCIE_EVENT_CNT_CTL

/*
 * Event Counter Data Select includes two parts:
 * - 27-24: Group number(4-bit: 0..0x7)
 * - 23-16: Event number(8-bit: 0..0x13) within the Group
 *
 * Put them together as in TRM.
 */
#define DWC_PCIE_CNT_EVENT_SEL
#define DWC_PCIE_CNT_LANE_SEL
#define DWC_PCIE_CNT_STATUS
#define DWC_PCIE_CNT_ENABLE
#define DWC_PCIE_PER_EVENT_OFF
#define DWC_PCIE_PER_EVENT_ON
#define DWC_PCIE_EVENT_CLEAR
#define DWC_PCIE_EVENT_PER_CLEAR

#define DWC_PCIE_EVENT_CNT_DATA

#define DWC_PCIE_TIME_BASED_ANAL_CTL
#define DWC_PCIE_TIME_BASED_REPORT_SEL
#define DWC_PCIE_TIME_BASED_DURATION_SEL
#define DWC_PCIE_DURATION_MANUAL_CTL
#define DWC_PCIE_DURATION_1MS
#define DWC_PCIE_DURATION_10MS
#define DWC_PCIE_DURATION_100MS
#define DWC_PCIE_DURATION_1S
#define DWC_PCIE_DURATION_2S
#define DWC_PCIE_DURATION_4S
#define DWC_PCIE_DURATION_4US
#define DWC_PCIE_TIME_BASED_TIMER_START
#define DWC_PCIE_TIME_BASED_CNT_ENABLE

#define DWC_PCIE_TIME_BASED_ANAL_DATA_REG_LOW
#define DWC_PCIE_TIME_BASED_ANAL_DATA_REG_HIGH

/* Event attributes */
#define DWC_PCIE_CONFIG_EVENTID
#define DWC_PCIE_CONFIG_TYPE
#define DWC_PCIE_CONFIG_LANE

#define DWC_PCIE_EVENT_ID(event)
#define DWC_PCIE_EVENT_TYPE(event)
#define DWC_PCIE_EVENT_LANE(event)

enum dwc_pcie_event_type {};

#define DWC_PCIE_LANE_EVENT_MAX_PERIOD
#define DWC_PCIE_MAX_PERIOD

struct dwc_pcie_pmu {};

#define to_dwc_pcie_pmu(p)

static int dwc_pcie_pmu_hp_state;
static struct list_head dwc_pcie_dev_info_head =;
static bool notify;

struct dwc_pcie_dev_info {};

struct dwc_pcie_vendor_id {};

static const struct dwc_pcie_vendor_id dwc_pcie_vendor_ids[] =;

static ssize_t cpumask_show(struct device *dev,
					 struct device_attribute *attr,
					 char *buf)
{}
static DEVICE_ATTR_RO(cpumask);

static struct attribute *dwc_pcie_pmu_cpumask_attrs[] =;

static struct attribute_group dwc_pcie_cpumask_attr_group =;

struct dwc_pcie_format_attr {};

PMU_FORMAT_ATTR();
PMU_FORMAT_ATTR();
PMU_FORMAT_ATTR();

static struct attribute *dwc_pcie_format_attrs[] =;

static struct attribute_group dwc_pcie_format_attrs_group =;

struct dwc_pcie_event_attr {};

static ssize_t dwc_pcie_event_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{}

#define DWC_PCIE_EVENT_ATTR(_name, _type, _eventid, _lane)

#define DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(_name, _eventid)
#define DWC_PCIE_PMU_LANE_EVENT_ATTR(_name, _eventid)

static struct attribute *dwc_pcie_pmu_time_event_attrs[] =;

static const struct attribute_group dwc_pcie_event_attrs_group =;

static const struct attribute_group *dwc_pcie_attr_groups[] =;

static void dwc_pcie_pmu_lane_event_enable(struct dwc_pcie_pmu *pcie_pmu,
					   bool enable)
{}

static void dwc_pcie_pmu_time_based_event_enable(struct dwc_pcie_pmu *pcie_pmu,
					  bool enable)
{}

static u64 dwc_pcie_pmu_read_lane_event_counter(struct perf_event *event)
{}

static u64 dwc_pcie_pmu_read_time_based_counter(struct perf_event *event)
{}

static void dwc_pcie_pmu_event_update(struct perf_event *event)
{}

static int dwc_pcie_pmu_event_init(struct perf_event *event)
{}

static void dwc_pcie_pmu_event_start(struct perf_event *event, int flags)
{}

static void dwc_pcie_pmu_event_stop(struct perf_event *event, int flags)
{}

static int dwc_pcie_pmu_event_add(struct perf_event *event, int flags)
{}

static void dwc_pcie_pmu_event_del(struct perf_event *event, int flags)
{}

static void dwc_pcie_pmu_remove_cpuhp_instance(void *hotplug_node)
{}

/*
 * Find the binded DES capability device info of a PCI device.
 * @pdev: The PCI device.
 */
static struct dwc_pcie_dev_info *dwc_pcie_find_dev_info(struct pci_dev *pdev)
{}

static void dwc_pcie_unregister_pmu(void *data)
{}

static bool dwc_pcie_match_des_cap(struct pci_dev *pdev)
{}

static void dwc_pcie_unregister_dev(struct dwc_pcie_dev_info *dev_info)
{}

static int dwc_pcie_register_dev(struct pci_dev *pdev)
{}

static int dwc_pcie_pmu_notifier(struct notifier_block *nb,
				     unsigned long action, void *data)
{}

static struct notifier_block dwc_pcie_pmu_nb =;

static int dwc_pcie_pmu_probe(struct platform_device *plat_dev)
{}

static int dwc_pcie_pmu_online_cpu(unsigned int cpu, struct hlist_node *cpuhp_node)
{}

static int dwc_pcie_pmu_offline_cpu(unsigned int cpu, struct hlist_node *cpuhp_node)
{}

static struct platform_driver dwc_pcie_pmu_driver =;

static int __init dwc_pcie_pmu_init(void)
{}

static void __exit dwc_pcie_pmu_exit(void)
{}

module_init();
module_exit(dwc_pcie_pmu_exit);

MODULE_DESCRIPTION();
MODULE_AUTHOR();
MODULE_LICENSE();