162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Interconnect framework driver for i.MX SoC
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2019, BayLibre
662306a36Sopenharmony_ci * Copyright (c) 2019-2020, NXP
762306a36Sopenharmony_ci * Author: Alexandre Bailon <abailon@baylibre.com>
862306a36Sopenharmony_ci * Author: Leonard Crestez <leonard.crestez@nxp.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#ifndef __DRIVERS_INTERCONNECT_IMX_H
1162306a36Sopenharmony_ci#define __DRIVERS_INTERCONNECT_IMX_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/interconnect-provider.h>
1462306a36Sopenharmony_ci#include <linux/kernel.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define IMX_ICC_MAX_LINKS	4
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/*
1962306a36Sopenharmony_ci * High throughput priority level in Regulator mode
2062306a36Sopenharmony_ci * Read Priority in Fixed/Limiter mode
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci#define PRIORITY0_SHIFT	0
2362306a36Sopenharmony_ci/*
2462306a36Sopenharmony_ci * Low throughput priority level in Regulator mode
2562306a36Sopenharmony_ci * Write Priority in Fixed/Limiter mode
2662306a36Sopenharmony_ci */
2762306a36Sopenharmony_ci#define PRIORITY1_SHIFT	8
2862306a36Sopenharmony_ci#define PRIORITY_MASK		0x7
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define PRIORITY_COMP_MARK	BIT(31)	/* Must set */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define IMX_NOC_MODE_FIXED		0
3362306a36Sopenharmony_ci#define IMX_NOC_MODE_LIMITER		1
3462306a36Sopenharmony_ci#define IMX_NOC_MODE_BYPASS		2
3562306a36Sopenharmony_ci#define IMX_NOC_MODE_REGULATOR		3
3662306a36Sopenharmony_ci#define IMX_NOC_MODE_UNCONFIGURED	0xFF
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define IMX_NOC_PRIO_REG	0x8
3962306a36Sopenharmony_ci#define IMX_NOC_MODE_REG	0xC
4062306a36Sopenharmony_ci#define IMX_NOC_BANDWIDTH_REG	0x10
4162306a36Sopenharmony_ci#define IMX_NOC_SATURATION	0x14
4262306a36Sopenharmony_ci#define IMX_NOC_EXT_CTL_REG	0x18
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct imx_icc_provider {
4562306a36Sopenharmony_ci	void __iomem *noc_base;
4662306a36Sopenharmony_ci	struct icc_provider provider;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/*
5062306a36Sopenharmony_ci * struct imx_icc_node_adj - Describe a dynamic adjustable node
5162306a36Sopenharmony_ci */
5262306a36Sopenharmony_cistruct imx_icc_node_adj_desc {
5362306a36Sopenharmony_ci	unsigned int bw_mul, bw_div;
5462306a36Sopenharmony_ci	const char *phandle_name;
5562306a36Sopenharmony_ci	bool main_noc;
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/*
5962306a36Sopenharmony_ci * struct imx_icc_node - Describe an interconnect node
6062306a36Sopenharmony_ci * @name: name of the node
6162306a36Sopenharmony_ci * @id: an unique id to identify the node
6262306a36Sopenharmony_ci * @links: an array of slaves' node id
6362306a36Sopenharmony_ci * @num_links: number of id defined in links
6462306a36Sopenharmony_ci */
6562306a36Sopenharmony_cistruct imx_icc_node_desc {
6662306a36Sopenharmony_ci	const char *name;
6762306a36Sopenharmony_ci	u16 id;
6862306a36Sopenharmony_ci	u16 links[IMX_ICC_MAX_LINKS];
6962306a36Sopenharmony_ci	u16 num_links;
7062306a36Sopenharmony_ci	const struct imx_icc_node_adj_desc *adj;
7162306a36Sopenharmony_ci};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/*
7462306a36Sopenharmony_ci * struct imx_icc_noc_setting - Describe an interconnect node setting
7562306a36Sopenharmony_ci * @reg: register offset inside the NoC
7662306a36Sopenharmony_ci * @prio_level: priority level
7762306a36Sopenharmony_ci * @mode: functional mode
7862306a36Sopenharmony_ci * @ext_control: external input control
7962306a36Sopenharmony_ci */
8062306a36Sopenharmony_cistruct imx_icc_noc_setting {
8162306a36Sopenharmony_ci	u32 reg;
8262306a36Sopenharmony_ci	u32 prio_level;
8362306a36Sopenharmony_ci	u32 mode;
8462306a36Sopenharmony_ci	u32 ext_control;
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define DEFINE_BUS_INTERCONNECT(_name, _id, _adj, ...)			\
8862306a36Sopenharmony_ci	{								\
8962306a36Sopenharmony_ci		.id = _id,						\
9062306a36Sopenharmony_ci		.name = _name,						\
9162306a36Sopenharmony_ci		.adj = _adj,						\
9262306a36Sopenharmony_ci		.num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })),	\
9362306a36Sopenharmony_ci		.links = { __VA_ARGS__ },				\
9462306a36Sopenharmony_ci	}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#define DEFINE_BUS_MASTER(_name, _id, _dest_id)				\
9762306a36Sopenharmony_ci	DEFINE_BUS_INTERCONNECT(_name, _id, NULL, _dest_id)
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#define DEFINE_BUS_SLAVE(_name, _id, _adj)				\
10062306a36Sopenharmony_ci	DEFINE_BUS_INTERCONNECT(_name, _id, _adj)
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciint imx_icc_register(struct platform_device *pdev,
10362306a36Sopenharmony_ci		     struct imx_icc_node_desc *nodes,
10462306a36Sopenharmony_ci		     int nodes_count,
10562306a36Sopenharmony_ci		     struct imx_icc_noc_setting *noc_settings);
10662306a36Sopenharmony_civoid imx_icc_unregister(struct platform_device *pdev);
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#endif /* __DRIVERS_INTERCONNECT_IMX_H */
109