[Feature] add GA346 baseline version
Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/kernel/linux/v4.19/drivers/interconnect/mediatek/mmqos-mtk.h b/src/kernel/linux/v4.19/drivers/interconnect/mediatek/mmqos-mtk.h
new file mode 100644
index 0000000..c6ebf33
--- /dev/null
+++ b/src/kernel/linux/v4.19/drivers/interconnect/mediatek/mmqos-mtk.h
@@ -0,0 +1,108 @@
+/* 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 list_head comm_port_list;
+};
+
+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 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 */