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