cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

devfreq-event.h (6095B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * devfreq-event: a framework to provide raw data and events of devfreq devices
      4 *
      5 * Copyright (C) 2014 Samsung Electronics
      6 * Author: Chanwoo Choi <cw00.choi@samsung.com>
      7 */
      8
      9#ifndef __LINUX_DEVFREQ_EVENT_H__
     10#define __LINUX_DEVFREQ_EVENT_H__
     11
     12#include <linux/device.h>
     13
     14/**
     15 * struct devfreq_event_dev - the devfreq-event device
     16 *
     17 * @node	: Contain the devfreq-event device that have been registered.
     18 * @dev		: the device registered by devfreq-event class. dev.parent is
     19 *		  the device using devfreq-event.
     20 * @lock	: a mutex to protect accessing devfreq-event.
     21 * @enable_count: the number of enable function have been called.
     22 * @desc	: the description for devfreq-event device.
     23 *
     24 * This structure contains devfreq-event device information.
     25 */
     26struct devfreq_event_dev {
     27	struct list_head node;
     28
     29	struct device dev;
     30	struct mutex lock;
     31	u32 enable_count;
     32
     33	const struct devfreq_event_desc *desc;
     34};
     35
     36/**
     37 * struct devfreq_event_data - the devfreq-event data
     38 *
     39 * @load_count	: load count of devfreq-event device for the given period.
     40 * @total_count	: total count of devfreq-event device for the given period.
     41 *		  each count may represent a clock cycle, a time unit
     42 *		  (ns/us/...), or anything the device driver wants.
     43 *		  Generally, utilization is load_count / total_count.
     44 *
     45 * This structure contains the data of devfreq-event device for polling period.
     46 */
     47struct devfreq_event_data {
     48	unsigned long load_count;
     49	unsigned long total_count;
     50};
     51
     52/**
     53 * struct devfreq_event_ops - the operations of devfreq-event device
     54 *
     55 * @enable	: Enable the devfreq-event device.
     56 * @disable	: Disable the devfreq-event device.
     57 * @reset	: Reset all setting of the devfreq-event device.
     58 * @set_event	: Set the specific event type for the devfreq-event device.
     59 * @get_event	: Get the result of the devfreq-event devie with specific
     60 *		  event type.
     61 *
     62 * This structure contains devfreq-event device operations which can be
     63 * implemented by devfreq-event device drivers.
     64 */
     65struct devfreq_event_ops {
     66	/* Optional functions */
     67	int (*enable)(struct devfreq_event_dev *edev);
     68	int (*disable)(struct devfreq_event_dev *edev);
     69	int (*reset)(struct devfreq_event_dev *edev);
     70
     71	/* Mandatory functions */
     72	int (*set_event)(struct devfreq_event_dev *edev);
     73	int (*get_event)(struct devfreq_event_dev *edev,
     74			 struct devfreq_event_data *edata);
     75};
     76
     77/**
     78 * struct devfreq_event_desc - the descriptor of devfreq-event device
     79 *
     80 * @name	: the name of devfreq-event device.
     81 * @event_type	: the type of the event determined and used by driver
     82 * @driver_data	: the private data for devfreq-event driver.
     83 * @ops		: the operation to control devfreq-event device.
     84 *
     85 * Each devfreq-event device is described with a this structure.
     86 * This structure contains the various data for devfreq-event device.
     87 * The event_type describes what is going to be counted in the register.
     88 * It might choose to count e.g. read requests, write data in bytes, etc.
     89 * The full supported list of types is present in specyfic header in:
     90 * include/dt-bindings/pmu/.
     91 */
     92struct devfreq_event_desc {
     93	const char *name;
     94	u32 event_type;
     95	void *driver_data;
     96
     97	const struct devfreq_event_ops *ops;
     98};
     99
    100#if defined(CONFIG_PM_DEVFREQ_EVENT)
    101extern int devfreq_event_enable_edev(struct devfreq_event_dev *edev);
    102extern int devfreq_event_disable_edev(struct devfreq_event_dev *edev);
    103extern bool devfreq_event_is_enabled(struct devfreq_event_dev *edev);
    104extern int devfreq_event_set_event(struct devfreq_event_dev *edev);
    105extern int devfreq_event_get_event(struct devfreq_event_dev *edev,
    106				struct devfreq_event_data *edata);
    107extern int devfreq_event_reset_event(struct devfreq_event_dev *edev);
    108extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
    109				struct device *dev,
    110				const char *phandle_name,
    111				int index);
    112extern int devfreq_event_get_edev_count(struct device *dev,
    113				const char *phandle_name);
    114extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
    115				struct devfreq_event_desc *desc);
    116extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev);
    117extern struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev,
    118				struct devfreq_event_desc *desc);
    119extern void devm_devfreq_event_remove_edev(struct device *dev,
    120				struct devfreq_event_dev *edev);
    121static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
    122{
    123	return edev->desc->driver_data;
    124}
    125#else
    126static inline int devfreq_event_enable_edev(struct devfreq_event_dev *edev)
    127{
    128	return -EINVAL;
    129}
    130
    131static inline int devfreq_event_disable_edev(struct devfreq_event_dev *edev)
    132{
    133	return -EINVAL;
    134}
    135
    136static inline bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)
    137{
    138	return false;
    139}
    140
    141static inline int devfreq_event_set_event(struct devfreq_event_dev *edev)
    142{
    143	return -EINVAL;
    144}
    145
    146static inline int devfreq_event_get_event(struct devfreq_event_dev *edev,
    147					struct devfreq_event_data *edata)
    148{
    149	return -EINVAL;
    150}
    151
    152static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev)
    153{
    154	return -EINVAL;
    155}
    156
    157static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
    158					struct device *dev,
    159					const char *phandle_name,
    160					int index)
    161{
    162	return ERR_PTR(-EINVAL);
    163}
    164
    165static inline int devfreq_event_get_edev_count(struct device *dev,
    166					const char *phandle_name)
    167{
    168	return -EINVAL;
    169}
    170
    171static inline struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
    172					struct devfreq_event_desc *desc)
    173{
    174	return ERR_PTR(-EINVAL);
    175}
    176
    177static inline int devfreq_event_remove_edev(struct devfreq_event_dev *edev)
    178{
    179	return -EINVAL;
    180}
    181
    182static inline struct devfreq_event_dev *devm_devfreq_event_add_edev(
    183					struct device *dev,
    184					struct devfreq_event_desc *desc)
    185{
    186	return ERR_PTR(-EINVAL);
    187}
    188
    189static inline void devm_devfreq_event_remove_edev(struct device *dev,
    190					struct devfreq_event_dev *edev)
    191{
    192}
    193
    194static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
    195{
    196	return NULL;
    197}
    198#endif /* CONFIG_PM_DEVFREQ_EVENT */
    199
    200#endif /* __LINUX_DEVFREQ_EVENT_H__ */