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