kernel_samsung_a34x-permissive/drivers/interconnect/mediatek/mmqos-mtk.h
2024-04-28 15:51:13 +02:00

109 lines
2.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
* Author: Ming-Fan Chen <ming-fan.chen@mediatek.com>
*/
#ifndef MMQOS_MTK_H
#define MMQOS_MTK_H
#include <linux/interconnect-provider.h>
#include <linux/notifier.h>
#include <linux/platform_device.h>
#include <linux/workqueue.h>
#include <soc/mediatek/mmqos.h>
#define MMQOS_NO_LINK (0xffffffff)
#define MMQOS_MAX_COMM_PORT_NUM (15)
struct mmqos_hrt {
u32 hrt_bw[HRT_TYPE_NUM];
u32 hrt_total_bw;
u32 cam_max_bw;
u32 cam_occu_bw;
bool blocking;
struct delayed_work work;
struct blocking_notifier_head hrt_bw_throttle_notifier;
atomic_t lock_count;
wait_queue_head_t hrt_wait;
struct mutex blocking_lock;
};
struct mmqos_base_node {
struct icc_node *icc_node;
u32 mix_bw;
};
struct common_node {
struct mmqos_base_node *base;
const char *clk_name;
struct clk *clk;
u64 freq;
struct list_head list;
struct icc_path *icc_path;
struct work_struct work;
};
struct common_port_node {
struct mmqos_base_node *base;
struct common_node *common;
struct device *larb_dev;
struct mutex bw_lock;
u32 latest_mix_bw;
u32 latest_peak_bw;
u32 latest_avg_bw;
struct list_head list;
};
struct larb_node {
struct mmqos_base_node *base;
struct device *larb_dev;
};
struct larb_port_node {
struct mmqos_base_node *base;
u16 bw_ratio;
};
struct mtk_mmqos {
struct device *dev;
struct icc_provider prov;
struct notifier_block nb;
struct list_head comm_list;
struct list_head comm_port_list;
struct workqueue_struct *wq;
u32 max_ratio;
bool qos_bound; /* Todo: Set qos_bound to true if necessary */
};
struct mtk_node_desc {
const char *name;
u32 id;
u32 link;
u16 bw_ratio;
};
struct mtk_mmqos_desc {
const struct mtk_node_desc *nodes;
const size_t num_nodes;
const char * const *comm_muxes;
const char * const *comm_icc_path_names;
const u32 max_ratio;
const struct mmqos_hrt hrt;
};
#define DEFINE_MNODE(_name, _id, _bw_ratio, _link) { \
.name = #_name, \
.id = _id, \
.bw_ratio = _bw_ratio, \
.link = _link, \
}
int mtk_mmqos_probe(struct platform_device *pdev);
int mtk_mmqos_remove(struct platform_device *pdev);
/* For HRT */
void mtk_mmqos_init_hrt(struct mmqos_hrt *hrt);
int mtk_mmqos_register_hrt_sysfs(struct device *dev);
void mtk_mmqos_unregister_hrt_sysfs(struct device *dev);
#endif /* MMQOS_MTK_H */