xref: /arm-trusted-firmware/plat/mediatek/mt8173/drivers/spm/spm_hotplug.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <arch.h>
8*91f16700Schasinglulu #include <lib/mmio.h>
9*91f16700Schasinglulu #include <mt8173_def.h>
10*91f16700Schasinglulu #include <plat/common/platform.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <spm.h>
13*91f16700Schasinglulu #include <spm_hotplug.h>
14*91f16700Schasinglulu #include <spm_mcdi.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /*
17*91f16700Schasinglulu  * System Power Manager (SPM) is a hardware module, which controls cpu or
18*91f16700Schasinglulu  * system power for different power scenarios using different firmware.
19*91f16700Schasinglulu  * This driver controls the cpu power in cpu hotplug flow.
20*91f16700Schasinglulu  */
21*91f16700Schasinglulu 
22*91f16700Schasinglulu #define PCM_HOTPLUG_VALID_MASK	0x0000ff00
23*91f16700Schasinglulu #define PCM_HOTPLUG_VALID_SHIFT	0x8
24*91f16700Schasinglulu 
25*91f16700Schasinglulu /**********************************************************
26*91f16700Schasinglulu  * PCM sequence for CPU hotplug
27*91f16700Schasinglulu  **********************************************************/
28*91f16700Schasinglulu static const unsigned int hotplug_binary[] = {
29*91f16700Schasinglulu 	0x1900001f, 0x1020020c, 0x1950001f, 0x1020020c, 0xa9400005, 0x00000001,
30*91f16700Schasinglulu 	0xe1000005, 0x1910001f, 0x10006720, 0x814c9001, 0xd82000e5, 0x17c07c1f,
31*91f16700Schasinglulu 	0x1900001f, 0x10001220, 0x1950001f, 0x10001220, 0xa15f0405, 0xe1000005,
32*91f16700Schasinglulu 	0x1900001f, 0x10001228, 0x1950001f, 0x10001228, 0x810f1401, 0xd8200244,
33*91f16700Schasinglulu 	0x17c07c1f, 0xe2e0006d, 0xe2e0002d, 0x1a00001f, 0x100062b8, 0x1910001f,
34*91f16700Schasinglulu 	0x100062b8, 0xa9000004, 0x00000001, 0xe2000004, 0x1910001f, 0x100062b8,
35*91f16700Schasinglulu 	0x81142804, 0xd8200444, 0x17c07c1f, 0xe2e0002c, 0xe2e0003c, 0xe2e0003e,
36*91f16700Schasinglulu 	0xe2e0003a, 0xe2e00032, 0x1910001f, 0x1000660c, 0x81079001, 0x1950001f,
37*91f16700Schasinglulu 	0x10006610, 0x81479401, 0xa1001404, 0xd8000584, 0x17c07c1f, 0x1900001f,
38*91f16700Schasinglulu 	0x10006404, 0x1950001f, 0x10006404, 0xa1568405, 0xe1000005, 0xf0000000,
39*91f16700Schasinglulu 	0x17c07c1f, 0x1900001f, 0x10006404, 0x1950001f, 0x10006404, 0x89400005,
40*91f16700Schasinglulu 	0x0000dfff, 0xe1000005, 0xe2e00036, 0xe2e0003e, 0x1910001f, 0x1000660c,
41*91f16700Schasinglulu 	0x81079001, 0x1950001f, 0x10006610, 0x81479401, 0x81001404, 0xd82008c4,
42*91f16700Schasinglulu 	0x17c07c1f, 0xe2e0002e, 0x1a00001f, 0x100062b8, 0x1910001f, 0x100062b8,
43*91f16700Schasinglulu 	0x89000004, 0x0000fffe, 0xe2000004, 0x1910001f, 0x100062b8, 0x81142804,
44*91f16700Schasinglulu 	0xd8000ae4, 0x17c07c1f, 0xe2e0006e, 0xe2e0004e, 0xe2e0004c, 0xe2e0004d,
45*91f16700Schasinglulu 	0x1900001f, 0x10001220, 0x1950001f, 0x10001220, 0x89400005, 0xbfffffff,
46*91f16700Schasinglulu 	0xe1000005, 0x1900001f, 0x10001228, 0x1950001f, 0x10001228, 0x810f1401,
47*91f16700Schasinglulu 	0xd8000ce4, 0x17c07c1f, 0x1900001f, 0x1020020c, 0x1950001f, 0x1020020c,
48*91f16700Schasinglulu 	0x89400005, 0xfffffffe, 0xe1000005, 0xf0000000, 0x17c07c1f, 0x1212841f,
49*91f16700Schasinglulu 	0xe2e00036, 0xe2e0003e, 0x1380201f, 0xe2e0003c, 0xe2a00000, 0x1b80001f,
50*91f16700Schasinglulu 	0x20000080, 0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c,
51*91f16700Schasinglulu 	0xe2e0004d, 0xf0000000, 0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f,
52*91f16700Schasinglulu 	0xe2a00001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e00032,
53*91f16700Schasinglulu 	0xf0000000, 0x17c07c1f, 0x1212841f, 0xe2e00026, 0xe2e0002e, 0x1380201f,
54*91f16700Schasinglulu 	0x1a00001f, 0x100062b4, 0x1910001f, 0x100062b4, 0x81322804, 0xe2000004,
55*91f16700Schasinglulu 	0x81202804, 0xe2000004, 0x1b80001f, 0x20000034, 0x1910001f, 0x100062b4,
56*91f16700Schasinglulu 	0x81142804, 0xd8001404, 0x17c07c1f, 0xe2e0000e, 0xe2e0000c, 0xe2e0000d,
57*91f16700Schasinglulu 	0xf0000000, 0x17c07c1f, 0xe2e0002d, 0x1a00001f, 0x100062b4, 0x1910001f,
58*91f16700Schasinglulu 	0x100062b4, 0xa1002804, 0xe2000004, 0xa1122804, 0xe2000004, 0x1b80001f,
59*91f16700Schasinglulu 	0x20000080, 0x1910001f, 0x100062b4, 0x81142804, 0xd82016a4, 0x17c07c1f,
60*91f16700Schasinglulu 	0xe2e0002f, 0xe2e0002b, 0xe2e00023, 0x1380201f, 0xe2e00022, 0xf0000000,
61*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
62*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
63*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
64*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
65*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
66*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
67*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
68*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
69*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
70*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
71*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
72*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
73*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
74*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
75*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
76*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
77*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
78*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
79*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
80*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
81*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
82*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
83*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
84*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
85*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
86*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
87*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
88*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
89*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
90*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
91*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
92*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
93*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
94*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
95*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
96*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
97*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
98*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
99*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
100*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
101*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
102*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
103*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
104*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
105*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
106*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
107*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
108*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
109*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
110*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
111*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
112*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
113*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
114*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0x1840001f, 0x00000001,
115*91f16700Schasinglulu 	0x1840001f, 0x00000001, 0xa1d48407, 0x1b00001f, 0x2f7be75f, 0xe8208000,
116*91f16700Schasinglulu 	0x10006354, 0xfffe7b47, 0xa1d10407, 0x1b80001f, 0x20000020, 0x17c07c1f,
117*91f16700Schasinglulu 	0x1910001f, 0x10006b00, 0x81461001, 0xb14690a1, 0xd82044e5, 0x17c07c1f,
118*91f16700Schasinglulu 	0x1910001f, 0x10006610, 0x81079001, 0xd80044e4, 0x17c07c1f, 0x1990001f,
119*91f16700Schasinglulu 	0x10006b00, 0x81421801, 0x82429801, 0x81402405, 0xd80044e5, 0x17c07c1f,
120*91f16700Schasinglulu 	0x1a40001f, 0x100062b0, 0x1280041f, 0xc24007a0, 0x17c07c1f, 0x1910001f,
121*91f16700Schasinglulu 	0x10006b00, 0x81449001, 0xd8204be5, 0x17c07c1f, 0x1910001f, 0x10006b00,
122*91f16700Schasinglulu 	0x81009001, 0xd8204984, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81051001,
123*91f16700Schasinglulu 	0xd8204be4, 0x17c07c1f, 0x1910001f, 0x10006720, 0x81489001, 0xd82046c5,
124*91f16700Schasinglulu 	0x17c07c1f, 0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264, 0xc24010e0,
125*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x1000660c, 0x81051001, 0x1950001f, 0x10006610,
126*91f16700Schasinglulu 	0x81451401, 0xa1001404, 0xd8004824, 0x17c07c1f, 0xd0004b00, 0x17c07c1f,
127*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x10006610, 0x81051001, 0xd8004be4, 0x17c07c1f,
128*91f16700Schasinglulu 	0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264, 0xc2400ee0, 0x17c07c1f,
129*91f16700Schasinglulu 	0x1910001f, 0x10006b00, 0x89000004, 0xfffffdff, 0x1940001f, 0x10006b00,
130*91f16700Schasinglulu 	0xe1400004, 0x17c07c1f, 0x1910001f, 0x10006b00, 0x81451001, 0xd8205305,
131*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x10006b00, 0x81011001, 0xd82050a4, 0x17c07c1f,
132*91f16700Schasinglulu 	0x1910001f, 0x10006610, 0x81059001, 0xd8205304, 0x17c07c1f, 0x1910001f,
133*91f16700Schasinglulu 	0x10006720, 0x81491001, 0xd8204de5, 0x17c07c1f, 0x1a40001f, 0x1000621c,
134*91f16700Schasinglulu 	0x1a80001f, 0x1000626c, 0xc24010e0, 0x17c07c1f, 0x1910001f, 0x1000660c,
135*91f16700Schasinglulu 	0x81059001, 0x1950001f, 0x10006610, 0x81459401, 0xa1001404, 0xd8004f44,
136*91f16700Schasinglulu 	0x17c07c1f, 0xd0005220, 0x17c07c1f, 0x17c07c1f, 0x1910001f, 0x10006610,
137*91f16700Schasinglulu 	0x81059001, 0xd8005304, 0x17c07c1f, 0x1a40001f, 0x1000621c, 0x1a80001f,
138*91f16700Schasinglulu 	0x1000626c, 0xc2400ee0, 0x17c07c1f, 0x1910001f, 0x10006b00, 0x89000004,
139*91f16700Schasinglulu 	0xfffffbff, 0x1940001f, 0x10006b00, 0xe1400004, 0x17c07c1f, 0x1910001f,
140*91f16700Schasinglulu 	0x10006b00, 0x81459001, 0xd8205a25, 0x17c07c1f, 0x1910001f, 0x10006b00,
141*91f16700Schasinglulu 	0x81019001, 0xd82057c4, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81061001,
142*91f16700Schasinglulu 	0xd8205a24, 0x17c07c1f, 0x1910001f, 0x10006720, 0x81499001, 0xd8205505,
143*91f16700Schasinglulu 	0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc24010e0,
144*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x1000660c, 0x81061001, 0x1950001f, 0x10006610,
145*91f16700Schasinglulu 	0x81461401, 0xa1001404, 0xd8005664, 0x17c07c1f, 0xd0005940, 0x17c07c1f,
146*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x10006610, 0x81061001, 0xd8005a24, 0x17c07c1f,
147*91f16700Schasinglulu 	0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc2400ee0, 0x17c07c1f,
148*91f16700Schasinglulu 	0x1910001f, 0x10006b00, 0x89000004, 0xfffff7ff, 0x1940001f, 0x10006b00,
149*91f16700Schasinglulu 	0xe1400004, 0x17c07c1f, 0x1910001f, 0x10006b00, 0x81461001, 0xd8206185,
150*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x10006b00, 0x81021001, 0xd8205ec4, 0x17c07c1f,
151*91f16700Schasinglulu 	0x1910001f, 0x10006610, 0x81081001, 0xd8206184, 0x17c07c1f, 0x1910001f,
152*91f16700Schasinglulu 	0x10006720, 0x814a1001, 0xd8205c25, 0x17c07c1f, 0x1a40001f, 0x100062a0,
153*91f16700Schasinglulu 	0x1280041f, 0xc2401540, 0x17c07c1f, 0x1910001f, 0x1000660c, 0x81081001,
154*91f16700Schasinglulu 	0x1950001f, 0x10006610, 0x81481401, 0xa1001404, 0xd8005d64, 0x17c07c1f,
155*91f16700Schasinglulu 	0xd00060a0, 0x17c07c1f, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81479001,
156*91f16700Schasinglulu 	0x81881001, 0x69a00006, 0x00000000, 0x81401805, 0xd8206185, 0x17c07c1f,
157*91f16700Schasinglulu 	0x1a40001f, 0x100062a0, 0x1280041f, 0xc2401240, 0x17c07c1f, 0x1910001f,
158*91f16700Schasinglulu 	0x10006b00, 0x89000004, 0xffffefff, 0x1940001f, 0x10006b00, 0xe1400004,
159*91f16700Schasinglulu 	0x17c07c1f, 0x1910001f, 0x10006b00, 0x81469001, 0xd82068e5, 0x17c07c1f,
160*91f16700Schasinglulu 	0x1910001f, 0x10006b00, 0x81029001, 0xd8206624, 0x17c07c1f, 0x1910001f,
161*91f16700Schasinglulu 	0x10006610, 0x81089001, 0xd82068e4, 0x17c07c1f, 0x1910001f, 0x10006720,
162*91f16700Schasinglulu 	0x814a9001, 0xd8206385, 0x17c07c1f, 0x1a40001f, 0x100062a4, 0x1290841f,
163*91f16700Schasinglulu 	0xc2401540, 0x17c07c1f, 0x1910001f, 0x1000660c, 0x81089001, 0x1950001f,
164*91f16700Schasinglulu 	0x10006610, 0x81489401, 0xa1001404, 0xd80064c4, 0x17c07c1f, 0xd0006800,
165*91f16700Schasinglulu 	0x17c07c1f, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81479001, 0x81889001,
166*91f16700Schasinglulu 	0x69a00006, 0x00000000, 0x81401805, 0xd82068e5, 0x17c07c1f, 0x1a40001f,
167*91f16700Schasinglulu 	0x100062a4, 0x1290841f, 0xc2401240, 0x17c07c1f, 0x1910001f, 0x10006b00,
168*91f16700Schasinglulu 	0x89000004, 0xffffdfff, 0x1940001f, 0x10006b00, 0xe1400004, 0x1910001f,
169*91f16700Schasinglulu 	0x10006610, 0x81479001, 0x81881001, 0x69600005, 0x00000000, 0xa1401805,
170*91f16700Schasinglulu 	0x81889001, 0xa1401805, 0xd8006bc5, 0x17c07c1f, 0x1910001f, 0x10006b00,
171*91f16700Schasinglulu 	0x81421001, 0x82429001, 0x82802405, 0xd8206bca, 0x17c07c1f, 0x1a40001f,
172*91f16700Schasinglulu 	0x100062b0, 0x1280041f, 0xc2400000, 0x17c07c1f, 0x1990001f, 0x10006b00,
173*91f16700Schasinglulu 	0x89800006, 0x00003f00, 0x69200006, 0x00000000, 0xd82041e4, 0x17c07c1f,
174*91f16700Schasinglulu 	0x1990001f, 0x10006320, 0x69200006, 0xbeefbeef, 0xd8006dc4, 0x17c07c1f,
175*91f16700Schasinglulu 	0xd00041e0, 0x17c07c1f, 0x1910001f, 0x10006358, 0x810b1001, 0xd8006dc4,
176*91f16700Schasinglulu 	0x17c07c1f, 0x1980001f, 0xdeaddead, 0x19c0001f, 0x01411820, 0xf0000000
177*91f16700Schasinglulu };
178*91f16700Schasinglulu static const struct pcm_desc hotplug_pcm = {
179*91f16700Schasinglulu 	.version	= "pcm_power_down_mt8173_V37",
180*91f16700Schasinglulu 	.base		= hotplug_binary,
181*91f16700Schasinglulu 	.size		= 888,
182*91f16700Schasinglulu 	.sess		= 2,
183*91f16700Schasinglulu 	.replace	= 0,
184*91f16700Schasinglulu };
185*91f16700Schasinglulu 
186*91f16700Schasinglulu static struct pwr_ctrl hotplug_ctrl = {
187*91f16700Schasinglulu 	.wake_src = 0,
188*91f16700Schasinglulu 	.wake_src_md32 = 0,
189*91f16700Schasinglulu 	.wfi_op = WFI_OP_OR,
190*91f16700Schasinglulu 	.mcusys_idle_mask = 1,
191*91f16700Schasinglulu 	.ca7top_idle_mask = 1,
192*91f16700Schasinglulu 	.ca15top_idle_mask = 1,
193*91f16700Schasinglulu 	.disp_req_mask = 1,
194*91f16700Schasinglulu 	.mfg_req_mask = 1,
195*91f16700Schasinglulu 	.md32_req_mask = 1,
196*91f16700Schasinglulu 	.syspwreq_mask = 1,
197*91f16700Schasinglulu 	.pcm_flags = 0,
198*91f16700Schasinglulu };
199*91f16700Schasinglulu 
200*91f16700Schasinglulu static const struct spm_lp_scen spm_hotplug = {
201*91f16700Schasinglulu 	.pcmdesc = &hotplug_pcm,
202*91f16700Schasinglulu 	.pwrctrl = &hotplug_ctrl,
203*91f16700Schasinglulu };
204*91f16700Schasinglulu 
205*91f16700Schasinglulu void spm_go_to_hotplug(void)
206*91f16700Schasinglulu {
207*91f16700Schasinglulu 	const struct pcm_desc *pcmdesc = spm_hotplug.pcmdesc;
208*91f16700Schasinglulu 	struct pwr_ctrl *pwrctrl = spm_hotplug.pwrctrl;
209*91f16700Schasinglulu 
210*91f16700Schasinglulu 	set_pwrctrl_pcm_flags(pwrctrl, 0);
211*91f16700Schasinglulu 	spm_reset_and_init_pcm();
212*91f16700Schasinglulu 	spm_kick_im_to_fetch(pcmdesc);
213*91f16700Schasinglulu 	spm_set_power_control(pwrctrl);
214*91f16700Schasinglulu 	spm_set_wakeup_event(pwrctrl);
215*91f16700Schasinglulu 	spm_kick_pcm_to_run(pwrctrl);
216*91f16700Schasinglulu }
217*91f16700Schasinglulu 
218*91f16700Schasinglulu void spm_clear_hotplug(void)
219*91f16700Schasinglulu {
220*91f16700Schasinglulu 	/* Inform SPM that CPU wants to program CPU_WAKEUP_EVENT and
221*91f16700Schasinglulu 	 * DISABLE_CPU_DROM */
222*91f16700Schasinglulu 
223*91f16700Schasinglulu 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_HANDSHAKE_SEND1);
224*91f16700Schasinglulu 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
225*91f16700Schasinglulu 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
226*91f16700Schasinglulu 
227*91f16700Schasinglulu 	/* Wait SPM's response, can't use sleep api */
228*91f16700Schasinglulu 	while ((mmio_read_32(SPM_PCM_FSM_STA) & PCM_END_FSM_STA_MASK)
229*91f16700Schasinglulu 		!= PCM_END_FSM_STA_DEF)
230*91f16700Schasinglulu 		;
231*91f16700Schasinglulu 
232*91f16700Schasinglulu 	/* no hotplug pcm running */
233*91f16700Schasinglulu 	clear_all_ready();
234*91f16700Schasinglulu }
235*91f16700Schasinglulu 
236*91f16700Schasinglulu void spm_hotplug_on(unsigned long mpidr)
237*91f16700Schasinglulu {
238*91f16700Schasinglulu 	unsigned long linear_id;
239*91f16700Schasinglulu 
240*91f16700Schasinglulu 	linear_id = ((mpidr & MPIDR_CLUSTER_MASK) >> 6) |
241*91f16700Schasinglulu 			(mpidr & MPIDR_CPU_MASK);
242*91f16700Schasinglulu 
243*91f16700Schasinglulu 	spm_lock_get();
244*91f16700Schasinglulu 	if (is_hotplug_ready() == 0) {
245*91f16700Schasinglulu 		spm_mcdi_wakeup_all_cores();
246*91f16700Schasinglulu 		mmio_clrbits_32(SPM_PCM_RESERVE, PCM_HOTPLUG_VALID_MASK);
247*91f16700Schasinglulu 		spm_go_to_hotplug();
248*91f16700Schasinglulu 		set_hotplug_ready();
249*91f16700Schasinglulu 	}
250*91f16700Schasinglulu 	/* turn on CPUx */
251*91f16700Schasinglulu 	mmio_clrsetbits_32(SPM_PCM_RESERVE,
252*91f16700Schasinglulu 		PCM_HOTPLUG_VALID_MASK | (1 << linear_id),
253*91f16700Schasinglulu 		1 << (linear_id + PCM_HOTPLUG_VALID_SHIFT));
254*91f16700Schasinglulu 	spm_lock_release();
255*91f16700Schasinglulu }
256*91f16700Schasinglulu 
257*91f16700Schasinglulu void spm_hotplug_off(unsigned long mpidr)
258*91f16700Schasinglulu {
259*91f16700Schasinglulu 	unsigned long linear_id;
260*91f16700Schasinglulu 
261*91f16700Schasinglulu 	linear_id = ((mpidr & MPIDR_CLUSTER_MASK) >> 6) |
262*91f16700Schasinglulu 			(mpidr & MPIDR_CPU_MASK);
263*91f16700Schasinglulu 
264*91f16700Schasinglulu 	spm_lock_get();
265*91f16700Schasinglulu 	if (is_hotplug_ready() == 0) {
266*91f16700Schasinglulu 		spm_mcdi_wakeup_all_cores();
267*91f16700Schasinglulu 		mmio_clrbits_32(SPM_PCM_RESERVE, PCM_HOTPLUG_VALID_MASK);
268*91f16700Schasinglulu 		spm_go_to_hotplug();
269*91f16700Schasinglulu 		set_hotplug_ready();
270*91f16700Schasinglulu 	}
271*91f16700Schasinglulu 	mmio_clrsetbits_32(SPM_PCM_RESERVE, PCM_HOTPLUG_VALID_MASK,
272*91f16700Schasinglulu 		(1 << linear_id) |
273*91f16700Schasinglulu 		(1 << (linear_id + PCM_HOTPLUG_VALID_SHIFT)));
274*91f16700Schasinglulu 	spm_lock_release();
275*91f16700Schasinglulu }
276