1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2015-2016 MediaTek Inc.
4 * Author: Yong Wu <yong.wu@mediatek.com>
7 #include <linux/component.h>
8 #include <linux/device.h>
11 #include <linux/module.h>
13 #include <linux/of_platform.h>
14 #include <linux/platform_device.h>
15 #include <linux/pm_runtime.h>
16 #include <soc/mediatek/smi.h>
17 #include <dt-bindings/memory/mt2701-larb-port.h>
20 #define SMI_LARB_MMU_EN 0xf00
23 #define REG_SMI_SECUR_CON_BASE 0x5c0
25 /* every register control 8 port, register offset 0x4 */
26 #define REG_SMI_SECUR_CON_OFFSET(id) (((id) >> 3) << 2)
27 #define REG_SMI_SECUR_CON_ADDR(id) \
28 (REG_SMI_SECUR_CON_BASE + REG_SMI_SECUR_CON_OFFSET(id))
31 * every port have 4 bit to control, bit[port + 3] control virtual or physical,
32 * bit[port + 2 : port + 1] control the domain, bit[port] control the security
35 #define SMI_SECUR_CON_VAL_MSK(id) (~(0xf << (((id) & 0x7) << 2)))
36 #define SMI_SECUR_CON_VAL_VIRT(id) BIT((((id) & 0x7) << 2) + 3)
37 /* mt2701 domain should be set to 3 */
38 #define SMI_SECUR_CON_VAL_DOMAIN(id) (0x3 << ((((id) & 0x7) << 2) + 1))
41 #define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
42 #define F_MMU_EN BIT(0)
45 #define SMI_BUS_SEL 0x220
46 #define SMI_BUS_LARB_SHIFT(larbid) ((larbid) << 1)
47 /* All are MMU0 defaultly. Only specialize mmu1 here. */
48 #define F_MMU1_LARB(larbid) (0x1 << SMI_BUS_LARB_SHIFT(larbid))
55 struct mtk_smi_common_plat
{
58 u32 bus_sel
; /* Balance some larbs to enter mmu0 or mmu1 */
61 struct mtk_smi_larb_gen
{
62 int port_in_larb
[MTK_LARB_NR_MAX
+ 1];
63 void (*config_port
)(struct device
*);
64 unsigned int larb_direct_to_common_mask
;
70 struct clk
*clk_apb
, *clk_smi
;
71 struct clk
*clk_gals0
, *clk_gals1
;
72 struct clk
*clk_async
; /*only needed by mt2701*/
74 void __iomem
*smi_ao_base
; /* only for gen1 */
75 void __iomem
*base
; /* only for gen2 */
77 const struct mtk_smi_common_plat
*plat
;
80 struct mtk_smi_larb
{ /* larb: local arbiter */
83 struct device
*smi_common_dev
;
84 const struct mtk_smi_larb_gen
*larb_gen
;
89 static int mtk_smi_clk_enable(const struct mtk_smi
*smi
)
93 ret
= clk_prepare_enable(smi
->clk_apb
);
97 ret
= clk_prepare_enable(smi
->clk_smi
);
101 ret
= clk_prepare_enable(smi
->clk_gals0
);
103 goto err_disable_smi
;
105 ret
= clk_prepare_enable(smi
->clk_gals1
);
107 goto err_disable_gals0
;
112 clk_disable_unprepare(smi
->clk_gals0
);
114 clk_disable_unprepare(smi
->clk_smi
);
116 clk_disable_unprepare(smi
->clk_apb
);
120 static void mtk_smi_clk_disable(const struct mtk_smi
*smi
)
122 clk_disable_unprepare(smi
->clk_gals1
);
123 clk_disable_unprepare(smi
->clk_gals0
);
124 clk_disable_unprepare(smi
->clk_smi
);
125 clk_disable_unprepare(smi
->clk_apb
);
128 int mtk_smi_larb_get(struct device
*larbdev
)
130 int ret
= pm_runtime_get_sync(larbdev
);
132 return (ret
< 0) ? ret
: 0;
134 EXPORT_SYMBOL_GPL(mtk_smi_larb_get
);
136 void mtk_smi_larb_put(struct device
*larbdev
)
138 pm_runtime_put_sync(larbdev
);
140 EXPORT_SYMBOL_GPL(mtk_smi_larb_put
);
143 mtk_smi_larb_bind(struct device
*dev
, struct device
*master
, void *data
)
145 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
146 struct mtk_smi_larb_iommu
*larb_mmu
= data
;
149 for (i
= 0; i
< MTK_LARB_NR_MAX
; i
++) {
150 if (dev
== larb_mmu
[i
].dev
) {
152 larb
->mmu
= &larb_mmu
[i
].mmu
;
159 static void mtk_smi_larb_config_port_gen2_general(struct device
*dev
)
161 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
165 if (BIT(larb
->larbid
) & larb
->larb_gen
->larb_direct_to_common_mask
)
168 for_each_set_bit(i
, (unsigned long *)larb
->mmu
, 32) {
169 reg
= readl_relaxed(larb
->base
+ SMI_LARB_NONSEC_CON(i
));
171 writel(reg
, larb
->base
+ SMI_LARB_NONSEC_CON(i
));
175 static void mtk_smi_larb_config_port_mt8173(struct device
*dev
)
177 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
179 writel(*larb
->mmu
, larb
->base
+ SMI_LARB_MMU_EN
);
182 static void mtk_smi_larb_config_port_gen1(struct device
*dev
)
184 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
185 const struct mtk_smi_larb_gen
*larb_gen
= larb
->larb_gen
;
186 struct mtk_smi
*common
= dev_get_drvdata(larb
->smi_common_dev
);
187 int i
, m4u_port_id
, larb_port_num
;
188 u32 sec_con_val
, reg_val
;
190 m4u_port_id
= larb_gen
->port_in_larb
[larb
->larbid
];
191 larb_port_num
= larb_gen
->port_in_larb
[larb
->larbid
+ 1]
192 - larb_gen
->port_in_larb
[larb
->larbid
];
194 for (i
= 0; i
< larb_port_num
; i
++, m4u_port_id
++) {
195 if (*larb
->mmu
& BIT(i
)) {
196 /* bit[port + 3] controls the virtual or physical */
197 sec_con_val
= SMI_SECUR_CON_VAL_VIRT(m4u_port_id
);
199 /* do not need to enable m4u for this port */
202 reg_val
= readl(common
->smi_ao_base
203 + REG_SMI_SECUR_CON_ADDR(m4u_port_id
));
204 reg_val
&= SMI_SECUR_CON_VAL_MSK(m4u_port_id
);
205 reg_val
|= sec_con_val
;
206 reg_val
|= SMI_SECUR_CON_VAL_DOMAIN(m4u_port_id
);
209 + REG_SMI_SECUR_CON_ADDR(m4u_port_id
));
214 mtk_smi_larb_unbind(struct device
*dev
, struct device
*master
, void *data
)
216 /* Do nothing as the iommu is always enabled. */
219 static const struct component_ops mtk_smi_larb_component_ops
= {
220 .bind
= mtk_smi_larb_bind
,
221 .unbind
= mtk_smi_larb_unbind
,
224 static const struct mtk_smi_larb_gen mtk_smi_larb_mt8173
= {
225 /* mt8173 do not need the port in larb */
226 .config_port
= mtk_smi_larb_config_port_mt8173
,
229 static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701
= {
231 LARB0_PORT_OFFSET
, LARB1_PORT_OFFSET
,
232 LARB2_PORT_OFFSET
, LARB3_PORT_OFFSET
234 .config_port
= mtk_smi_larb_config_port_gen1
,
237 static const struct mtk_smi_larb_gen mtk_smi_larb_mt2712
= {
238 .config_port
= mtk_smi_larb_config_port_gen2_general
,
239 .larb_direct_to_common_mask
= BIT(8) | BIT(9), /* bdpsys */
242 static const struct mtk_smi_larb_gen mtk_smi_larb_mt8183
= {
244 .config_port
= mtk_smi_larb_config_port_gen2_general
,
245 .larb_direct_to_common_mask
= BIT(2) | BIT(3) | BIT(7),
246 /* IPU0 | IPU1 | CCU */
249 static const struct of_device_id mtk_smi_larb_of_ids
[] = {
251 .compatible
= "mediatek,mt8173-smi-larb",
252 .data
= &mtk_smi_larb_mt8173
255 .compatible
= "mediatek,mt2701-smi-larb",
256 .data
= &mtk_smi_larb_mt2701
259 .compatible
= "mediatek,mt2712-smi-larb",
260 .data
= &mtk_smi_larb_mt2712
263 .compatible
= "mediatek,mt8183-smi-larb",
264 .data
= &mtk_smi_larb_mt8183
269 static int mtk_smi_larb_probe(struct platform_device
*pdev
)
271 struct mtk_smi_larb
*larb
;
272 struct resource
*res
;
273 struct device
*dev
= &pdev
->dev
;
274 struct device_node
*smi_node
;
275 struct platform_device
*smi_pdev
;
277 larb
= devm_kzalloc(dev
, sizeof(*larb
), GFP_KERNEL
);
281 larb
->larb_gen
= of_device_get_match_data(dev
);
282 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
283 larb
->base
= devm_ioremap_resource(dev
, res
);
284 if (IS_ERR(larb
->base
))
285 return PTR_ERR(larb
->base
);
287 larb
->smi
.clk_apb
= devm_clk_get(dev
, "apb");
288 if (IS_ERR(larb
->smi
.clk_apb
))
289 return PTR_ERR(larb
->smi
.clk_apb
);
291 larb
->smi
.clk_smi
= devm_clk_get(dev
, "smi");
292 if (IS_ERR(larb
->smi
.clk_smi
))
293 return PTR_ERR(larb
->smi
.clk_smi
);
295 if (larb
->larb_gen
->has_gals
) {
296 /* The larbs may still haven't gals even if the SoC support.*/
297 larb
->smi
.clk_gals0
= devm_clk_get(dev
, "gals");
298 if (PTR_ERR(larb
->smi
.clk_gals0
) == -ENOENT
)
299 larb
->smi
.clk_gals0
= NULL
;
300 else if (IS_ERR(larb
->smi
.clk_gals0
))
301 return PTR_ERR(larb
->smi
.clk_gals0
);
305 smi_node
= of_parse_phandle(dev
->of_node
, "mediatek,smi", 0);
309 smi_pdev
= of_find_device_by_node(smi_node
);
310 of_node_put(smi_node
);
312 if (!platform_get_drvdata(smi_pdev
))
313 return -EPROBE_DEFER
;
314 larb
->smi_common_dev
= &smi_pdev
->dev
;
316 dev_err(dev
, "Failed to get the smi_common device\n");
320 pm_runtime_enable(dev
);
321 platform_set_drvdata(pdev
, larb
);
322 return component_add(dev
, &mtk_smi_larb_component_ops
);
325 static int mtk_smi_larb_remove(struct platform_device
*pdev
)
327 pm_runtime_disable(&pdev
->dev
);
328 component_del(&pdev
->dev
, &mtk_smi_larb_component_ops
);
332 static int __maybe_unused
mtk_smi_larb_resume(struct device
*dev
)
334 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
335 const struct mtk_smi_larb_gen
*larb_gen
= larb
->larb_gen
;
338 /* Power on smi-common. */
339 ret
= pm_runtime_get_sync(larb
->smi_common_dev
);
341 dev_err(dev
, "Failed to pm get for smi-common(%d).\n", ret
);
345 ret
= mtk_smi_clk_enable(&larb
->smi
);
347 dev_err(dev
, "Failed to enable clock(%d).\n", ret
);
348 pm_runtime_put_sync(larb
->smi_common_dev
);
352 /* Configure the basic setting for this larb */
353 larb_gen
->config_port(dev
);
358 static int __maybe_unused
mtk_smi_larb_suspend(struct device
*dev
)
360 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
362 mtk_smi_clk_disable(&larb
->smi
);
363 pm_runtime_put_sync(larb
->smi_common_dev
);
367 static const struct dev_pm_ops smi_larb_pm_ops
= {
368 SET_RUNTIME_PM_OPS(mtk_smi_larb_suspend
, mtk_smi_larb_resume
, NULL
)
369 SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
370 pm_runtime_force_resume
)
373 static struct platform_driver mtk_smi_larb_driver
= {
374 .probe
= mtk_smi_larb_probe
,
375 .remove
= mtk_smi_larb_remove
,
377 .name
= "mtk-smi-larb",
378 .of_match_table
= mtk_smi_larb_of_ids
,
379 .pm
= &smi_larb_pm_ops
,
383 static const struct mtk_smi_common_plat mtk_smi_common_gen1
= {
387 static const struct mtk_smi_common_plat mtk_smi_common_gen2
= {
391 static const struct mtk_smi_common_plat mtk_smi_common_mt8183
= {
394 .bus_sel
= F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(5) |
398 static const struct of_device_id mtk_smi_common_of_ids
[] = {
400 .compatible
= "mediatek,mt8173-smi-common",
401 .data
= &mtk_smi_common_gen2
,
404 .compatible
= "mediatek,mt2701-smi-common",
405 .data
= &mtk_smi_common_gen1
,
408 .compatible
= "mediatek,mt2712-smi-common",
409 .data
= &mtk_smi_common_gen2
,
412 .compatible
= "mediatek,mt8183-smi-common",
413 .data
= &mtk_smi_common_mt8183
,
418 static int mtk_smi_common_probe(struct platform_device
*pdev
)
420 struct device
*dev
= &pdev
->dev
;
421 struct mtk_smi
*common
;
422 struct resource
*res
;
425 common
= devm_kzalloc(dev
, sizeof(*common
), GFP_KERNEL
);
429 common
->plat
= of_device_get_match_data(dev
);
431 common
->clk_apb
= devm_clk_get(dev
, "apb");
432 if (IS_ERR(common
->clk_apb
))
433 return PTR_ERR(common
->clk_apb
);
435 common
->clk_smi
= devm_clk_get(dev
, "smi");
436 if (IS_ERR(common
->clk_smi
))
437 return PTR_ERR(common
->clk_smi
);
439 if (common
->plat
->has_gals
) {
440 common
->clk_gals0
= devm_clk_get(dev
, "gals0");
441 if (IS_ERR(common
->clk_gals0
))
442 return PTR_ERR(common
->clk_gals0
);
444 common
->clk_gals1
= devm_clk_get(dev
, "gals1");
445 if (IS_ERR(common
->clk_gals1
))
446 return PTR_ERR(common
->clk_gals1
);
450 * for mtk smi gen 1, we need to get the ao(always on) base to config
451 * m4u port, and we need to enable the aync clock for transform the smi
452 * clock into emi clock domain, but for mtk smi gen2, there's no smi ao
455 if (common
->plat
->gen
== MTK_SMI_GEN1
) {
456 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
457 common
->smi_ao_base
= devm_ioremap_resource(dev
, res
);
458 if (IS_ERR(common
->smi_ao_base
))
459 return PTR_ERR(common
->smi_ao_base
);
461 common
->clk_async
= devm_clk_get(dev
, "async");
462 if (IS_ERR(common
->clk_async
))
463 return PTR_ERR(common
->clk_async
);
465 ret
= clk_prepare_enable(common
->clk_async
);
469 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
470 common
->base
= devm_ioremap_resource(dev
, res
);
471 if (IS_ERR(common
->base
))
472 return PTR_ERR(common
->base
);
474 pm_runtime_enable(dev
);
475 platform_set_drvdata(pdev
, common
);
479 static int mtk_smi_common_remove(struct platform_device
*pdev
)
481 pm_runtime_disable(&pdev
->dev
);
485 static int __maybe_unused
mtk_smi_common_resume(struct device
*dev
)
487 struct mtk_smi
*common
= dev_get_drvdata(dev
);
488 u32 bus_sel
= common
->plat
->bus_sel
;
491 ret
= mtk_smi_clk_enable(common
);
493 dev_err(common
->dev
, "Failed to enable clock(%d).\n", ret
);
497 if (common
->plat
->gen
== MTK_SMI_GEN2
&& bus_sel
)
498 writel(bus_sel
, common
->base
+ SMI_BUS_SEL
);
502 static int __maybe_unused
mtk_smi_common_suspend(struct device
*dev
)
504 struct mtk_smi
*common
= dev_get_drvdata(dev
);
506 mtk_smi_clk_disable(common
);
510 static const struct dev_pm_ops smi_common_pm_ops
= {
511 SET_RUNTIME_PM_OPS(mtk_smi_common_suspend
, mtk_smi_common_resume
, NULL
)
512 SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
513 pm_runtime_force_resume
)
516 static struct platform_driver mtk_smi_common_driver
= {
517 .probe
= mtk_smi_common_probe
,
518 .remove
= mtk_smi_common_remove
,
520 .name
= "mtk-smi-common",
521 .of_match_table
= mtk_smi_common_of_ids
,
522 .pm
= &smi_common_pm_ops
,
526 static int __init
mtk_smi_init(void)
530 ret
= platform_driver_register(&mtk_smi_common_driver
);
532 pr_err("Failed to register SMI driver\n");
536 ret
= platform_driver_register(&mtk_smi_larb_driver
);
538 pr_err("Failed to register SMI-LARB driver\n");
544 platform_driver_unregister(&mtk_smi_common_driver
);
548 module_init(mtk_smi_init
);