xref: /rk3399_ARM-atf/plat/mediatek/drivers/cpu_pm/cpcv5_4/mt_ppu.c (revision cf2df874cd09305ac7282fadb0fef6be597dfffb)
1*75530ee2SKai Liang /*
2*75530ee2SKai Liang  * Copyright (c) 2025, MediaTek Inc. All rights reserved.
3*75530ee2SKai Liang  *
4*75530ee2SKai Liang  * SPDX-License-Identifier: BSD-3-Clause
5*75530ee2SKai Liang  */
6*75530ee2SKai Liang 
7*75530ee2SKai Liang #include "mt_ppu.h"
8*75530ee2SKai Liang 
9*75530ee2SKai Liang #define MTK_PPU_PWR_DYNAMIC_POLICY_SET(_ctrl, _policy) \
10*75530ee2SKai Liang 	mmio_clrsetbits_32(_ctrl->ppu_pwpr, \
11*75530ee2SKai Liang 			   PPU_PWPR_MASK, \
12*75530ee2SKai Liang 			   PPU_PWPR_DYNAMIC_MODE | ((_policy) & PPU_PWPR_MASK))
13*75530ee2SKai Liang 
14*75530ee2SKai Liang #define MTK_PPU_PWR_STATIC_POLICY_SET(_ctrl, _policy) \
15*75530ee2SKai Liang 	mmio_clrsetbits_32(_ctrl->ppu_pwpr, \
16*75530ee2SKai Liang 			   PPU_PWPR_MASK | PPU_PWPR_DYNAMIC_MODE, \
17*75530ee2SKai Liang 			   ((_policy) & PPU_PWPR_MASK))
18*75530ee2SKai Liang 
mt_smp_ppu_pwr_dynamic_set(struct ppu_pwr_ctrl * ctrl,unsigned int policy)19*75530ee2SKai Liang void mt_smp_ppu_pwr_dynamic_set(struct ppu_pwr_ctrl *ctrl,
20*75530ee2SKai Liang 				unsigned int policy)
21*75530ee2SKai Liang {
22*75530ee2SKai Liang 	CPU_PM_ASSERT(ctrl);
23*75530ee2SKai Liang 	MTK_PPU_PWR_DYNAMIC_POLICY_SET(ctrl, policy);
24*75530ee2SKai Liang 	dmbsy();
25*75530ee2SKai Liang }
26*75530ee2SKai Liang 
mt_smp_ppu_pwr_static_set(struct ppu_pwr_ctrl * ctrl,unsigned int policy)27*75530ee2SKai Liang void mt_smp_ppu_pwr_static_set(struct ppu_pwr_ctrl *ctrl,
28*75530ee2SKai Liang 			       unsigned int policy)
29*75530ee2SKai Liang {
30*75530ee2SKai Liang 	CPU_PM_ASSERT(ctrl);
31*75530ee2SKai Liang 	MTK_PPU_PWR_STATIC_POLICY_SET(ctrl, policy);
32*75530ee2SKai Liang 	dmbsy();
33*75530ee2SKai Liang }
34*75530ee2SKai Liang 
mt_smp_ppu_pwr_set(struct ppu_pwr_ctrl * ctrl,unsigned int mode,unsigned int policy)35*75530ee2SKai Liang void mt_smp_ppu_pwr_set(struct ppu_pwr_ctrl *ctrl,
36*75530ee2SKai Liang 			unsigned int mode,
37*75530ee2SKai Liang 			unsigned int policy)
38*75530ee2SKai Liang {
39*75530ee2SKai Liang 	CPU_PM_ASSERT(ctrl);
40*75530ee2SKai Liang 	if (mode & PPU_PWPR_DYNAMIC_MODE)
41*75530ee2SKai Liang 		MTK_PPU_PWR_DYNAMIC_POLICY_SET(ctrl, policy);
42*75530ee2SKai Liang 	else
43*75530ee2SKai Liang 		MTK_PPU_PWR_STATIC_POLICY_SET(ctrl, policy);
44*75530ee2SKai Liang 	mmio_write_32(ctrl->ppu_dcdr0, MT_PPU_DCDR0);
45*75530ee2SKai Liang 	mmio_write_32(ctrl->ppu_dcdr1, MT_PPU_DCDR1);
46*75530ee2SKai Liang 	dsbsy();
47*75530ee2SKai Liang }
48*75530ee2SKai Liang 
mt_smp_ppu_op_set(struct ppu_pwr_ctrl * ctrl,unsigned int mode,unsigned int policy)49*75530ee2SKai Liang void mt_smp_ppu_op_set(struct ppu_pwr_ctrl *ctrl,
50*75530ee2SKai Liang 		       unsigned int mode,
51*75530ee2SKai Liang 		       unsigned int policy)
52*75530ee2SKai Liang {
53*75530ee2SKai Liang 	unsigned int val;
54*75530ee2SKai Liang 
55*75530ee2SKai Liang 	CPU_PM_ASSERT(ctrl);
56*75530ee2SKai Liang 
57*75530ee2SKai Liang 	val = mmio_read_32(ctrl->ppu_pwpr);
58*75530ee2SKai Liang 	val &= ~(PPU_PWPR_OP_MASK | PPU_PWPR_OP_DYNAMIC_MODE);
59*75530ee2SKai Liang 
60*75530ee2SKai Liang 	val |= PPU_PWPR_OP_MODE(policy);
61*75530ee2SKai Liang 	if (mode & PPU_PWPR_OP_DYNAMIC_MODE)
62*75530ee2SKai Liang 		val |= PPU_PWPR_OP_DYNAMIC_MODE;
63*75530ee2SKai Liang 
64*75530ee2SKai Liang 	mmio_write_32(ctrl->ppu_pwpr, val);
65*75530ee2SKai Liang 	dsbsy();
66*75530ee2SKai Liang }
67*75530ee2SKai Liang 
mt_smp_ppu_set(struct ppu_pwr_ctrl * ctrl,unsigned int op_mode,unsigned int policy,unsigned int pwr_mode,unsigned int pwr_policy)68*75530ee2SKai Liang void mt_smp_ppu_set(struct ppu_pwr_ctrl *ctrl,
69*75530ee2SKai Liang 		    unsigned int op_mode,
70*75530ee2SKai Liang 		    unsigned int policy,
71*75530ee2SKai Liang 		    unsigned int pwr_mode,
72*75530ee2SKai Liang 		    unsigned int pwr_policy)
73*75530ee2SKai Liang {
74*75530ee2SKai Liang 	unsigned int val;
75*75530ee2SKai Liang 
76*75530ee2SKai Liang 	CPU_PM_ASSERT(ctrl);
77*75530ee2SKai Liang 	val = mmio_read_32(ctrl->ppu_pwpr);
78*75530ee2SKai Liang 
79*75530ee2SKai Liang 	if (op_mode & PPU_PWPR_OP_DYNAMIC_MODE)
80*75530ee2SKai Liang 		val |= (PPU_PWPR_OP_DYNAMIC_MODE |
81*75530ee2SKai Liang 		       PPU_PWPR_OP_MODE(policy));
82*75530ee2SKai Liang 	else
83*75530ee2SKai Liang 		val |= PPU_PWPR_OP_MODE(policy);
84*75530ee2SKai Liang 
85*75530ee2SKai Liang 	if (pwr_mode & PPU_PWPR_DYNAMIC_MODE) {
86*75530ee2SKai Liang 		val &= ~(PPU_PWPR_MASK);
87*75530ee2SKai Liang 		val |= (PPU_PWPR_DYNAMIC_MODE | (pwr_policy & PPU_PWPR_MASK));
88*75530ee2SKai Liang 	} else {
89*75530ee2SKai Liang 		val &= ~(PPU_PWPR_MASK | PPU_PWPR_DYNAMIC_MODE);
90*75530ee2SKai Liang 		val |= (pwr_policy & PPU_PWPR_MASK);
91*75530ee2SKai Liang 	}
92*75530ee2SKai Liang 	mmio_write_32(ctrl->ppu_pwpr, val);
93*75530ee2SKai Liang 	dsbsy();
94*75530ee2SKai Liang }
95