xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_mcdi.c (revision 1a1ff8b96282dd86705b3f697b1445916048a8e7)
17d116dccSCC Ma /*
27d116dccSCC Ma  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma  *
47d116dccSCC Ma  * Redistribution and use in source and binary forms, with or without
57d116dccSCC Ma  * modification, are permitted provided that the following conditions are met:
67d116dccSCC Ma  *
77d116dccSCC Ma  * Redistributions of source code must retain the above copyright notice, this
87d116dccSCC Ma  * list of conditions and the following disclaimer.
97d116dccSCC Ma  *
107d116dccSCC Ma  * Redistributions in binary form must reproduce the above copyright notice,
117d116dccSCC Ma  * this list of conditions and the following disclaimer in the documentation
127d116dccSCC Ma  * and/or other materials provided with the distribution.
137d116dccSCC Ma  *
147d116dccSCC Ma  * Neither the name of ARM nor the names of its contributors may be used
157d116dccSCC Ma  * to endorse or promote products derived from this software without specific
167d116dccSCC Ma  * prior written permission.
177d116dccSCC Ma  *
187d116dccSCC Ma  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
197d116dccSCC Ma  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
207d116dccSCC Ma  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
217d116dccSCC Ma  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
227d116dccSCC Ma  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
237d116dccSCC Ma  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
247d116dccSCC Ma  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
257d116dccSCC Ma  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
267d116dccSCC Ma  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
277d116dccSCC Ma  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
287d116dccSCC Ma  * POSSIBILITY OF SUCH DAMAGE.
297d116dccSCC Ma  */
307d116dccSCC Ma #include <arch.h>
317d116dccSCC Ma #include <debug.h>
327d116dccSCC Ma #include <mmio.h>
337d116dccSCC Ma #include <mt8173_def.h>
347d116dccSCC Ma #include <platform.h>
357d116dccSCC Ma #include <platform_def.h>
367d116dccSCC Ma #include <spm.h>
377d116dccSCC Ma #include <spm_hotplug.h>
387d116dccSCC Ma #include <spm_mcdi.h>
397d116dccSCC Ma 
407d116dccSCC Ma /*
417d116dccSCC Ma  * System Power Manager (SPM) is a hardware module, which controls cpu or
427d116dccSCC Ma  * system power for different power scenarios using different firmware.
437d116dccSCC Ma  * This driver controls the cpu power in cpu idle power saving state.
447d116dccSCC Ma  */
457d116dccSCC Ma 
467d116dccSCC Ma #define WAKE_SRC_FOR_MCDI	(WAKE_SRC_SYSPWREQ | WAKE_SRC_CPU_IRQ)
477d116dccSCC Ma #define PCM_MCDI_HANDSHAKE_SYNC	0xbeefbeef
487d116dccSCC Ma #define PCM_MCDI_HANDSHAKE_ACK	0xdeaddead
497d116dccSCC Ma #define PCM_MCDI_UPDATE_INFORM	0xabcdabcd
507d116dccSCC Ma #define PCM_MCDI_CKECK_DONE	0x12345678
517d116dccSCC Ma #define PCM_MCDI_ALL_CORE_AWAKE	0x0
527d116dccSCC Ma #define PCM_MCDI_OFFLOADED	0xaa55aa55
538e53ec53SJimmy Huang #define PCM_MCDI_CA72_CPUTOP_PWRCTL	(0x1 << 16)
548e53ec53SJimmy Huang #define PCM_MCDI_CA53_CPUTOP_PWRCTL	(0x1 << 17)
558e53ec53SJimmy Huang #define PCM_MCDI_CA72_PWRSTA_SHIFT	16
568e53ec53SJimmy Huang #define PCM_MCDI_CA53_PWRSTA_SHIFT	9
577d116dccSCC Ma 
587d116dccSCC Ma static const unsigned int mcdi_binary[] = {
59*1a1ff8b9SJimmy Huang 	0x1a10001f, 0x10006b04, 0x1890001f, 0x10006b6c, 0x1a40001f, 0x10006210,
60*1a1ff8b9SJimmy Huang 	0x81002001, 0xd8200184, 0x17c07c1f, 0xa0900402, 0xc24012a0, 0x17c07c1f,
61*1a1ff8b9SJimmy Huang 	0x81052001, 0xd8200244, 0x17c07c1f, 0x80b00402, 0xc2401760, 0x17c07c1f,
62*1a1ff8b9SJimmy Huang 	0x1a40001f, 0x10006230, 0x8100a001, 0xd8200344, 0x17c07c1f, 0xa0908402,
63*1a1ff8b9SJimmy Huang 	0xc24012a0, 0x17c07c1f, 0x8105a001, 0xd8200404, 0x17c07c1f, 0x80b08402,
64*1a1ff8b9SJimmy Huang 	0xc2401760, 0x17c07c1f, 0x1a40001f, 0x10006238, 0x81012001, 0xd8200504,
65*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0xa0910402, 0xc24012a0, 0x17c07c1f, 0x81062001, 0xd82005c4,
66*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x80b10402, 0xc2401760, 0x17c07c1f, 0x1a40001f, 0x1000623c,
67*1a1ff8b9SJimmy Huang 	0x8101a001, 0xd82006c4, 0x17c07c1f, 0xa0918402, 0xc24012a0, 0x17c07c1f,
68*1a1ff8b9SJimmy Huang 	0x8106a001, 0xd8200784, 0x17c07c1f, 0x80b18402, 0xc2401760, 0x17c07c1f,
69*1a1ff8b9SJimmy Huang 	0x1a40001f, 0x10006298, 0x81022001, 0xd8200884, 0x17c07c1f, 0xa0920402,
70*1a1ff8b9SJimmy Huang 	0xc24012a0, 0x17c07c1f, 0x81072001, 0xd8200944, 0x17c07c1f, 0x80b20402,
71*1a1ff8b9SJimmy Huang 	0xc2401760, 0x17c07c1f, 0x1a40001f, 0x1000629c, 0x8102a001, 0xd8200a44,
72*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0xa0928402, 0xc24012a0, 0x17c07c1f, 0x8107a001, 0xd8200b04,
73*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x80b28402, 0xc2401760, 0x17c07c1f, 0x1a40001f, 0x100062c4,
74*1a1ff8b9SJimmy Huang 	0x81032001, 0xd8200c04, 0x17c07c1f, 0xa0930402, 0xc24012a0, 0x17c07c1f,
75*1a1ff8b9SJimmy Huang 	0x81082001, 0xd8200cc4, 0x17c07c1f, 0x80b30402, 0xc2401760, 0x17c07c1f,
76*1a1ff8b9SJimmy Huang 	0x1a40001f, 0x100062c0, 0x8103a001, 0xd8200dc4, 0x17c07c1f, 0xa0938402,
77*1a1ff8b9SJimmy Huang 	0xc24012a0, 0x17c07c1f, 0x8108a001, 0xd8200e84, 0x17c07c1f, 0x80b38402,
78*1a1ff8b9SJimmy Huang 	0xc2401760, 0x17c07c1f, 0x1a40001f, 0x10006214, 0x81042001, 0xd8200f84,
79*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0xa0940402, 0xc24012a0, 0x17c07c1f, 0x81092001, 0xd8201044,
80*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x80b40402, 0xc2401760, 0x17c07c1f, 0x1a40001f, 0x100062cc,
81*1a1ff8b9SJimmy Huang 	0x8104a001, 0xd8201144, 0x17c07c1f, 0xa0948402, 0xc24012a0, 0x17c07c1f,
82*1a1ff8b9SJimmy Huang 	0x8109a001, 0xd8201204, 0x17c07c1f, 0x80b48402, 0xc2401760, 0x17c07c1f,
83*1a1ff8b9SJimmy Huang 	0x1900001f, 0x10006b6c, 0xe1000002, 0xf0000000, 0x17c07c1f, 0xe2603f16,
84*1a1ff8b9SJimmy Huang 	0xe2603f1e, 0x1b80001f, 0x00000020, 0xe2603f0e, 0xe2603f0c, 0xe2603f0d,
85*1a1ff8b9SJimmy Huang 	0xe260000d, 0x1b80001f, 0x20000080, 0x1a90001f, 0x10001220, 0x69200009,
86*1a1ff8b9SJimmy Huang 	0x1000623c, 0xd8001564, 0x17c07c1f, 0x69200009, 0x10006214, 0xd8001644,
87*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0xd00016e0, 0x17c07c1f, 0x1900001f, 0x10001220, 0x8a80000a,
88*1a1ff8b9SJimmy Huang 	0xfffffffc, 0xe100000a, 0xd00016e0, 0x17c07c1f, 0x1900001f, 0x10001220,
89*1a1ff8b9SJimmy Huang 	0x8a80000a, 0xff1fbfff, 0xe100000a, 0x1b80001f, 0x20000080, 0xf0000000,
90*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1a90001f, 0x10001220, 0x69200009, 0x1000623c, 0xd80018e4,
91*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x69200009, 0x10006214, 0xd80019c4, 0x17c07c1f, 0xd0001a60,
92*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1900001f, 0x10001220, 0xaa80000a, 0x00000003, 0xe100000a,
93*1a1ff8b9SJimmy Huang 	0xd0001a60, 0x17c07c1f, 0x1900001f, 0x10001220, 0xaa80000a, 0x00e04000,
94*1a1ff8b9SJimmy Huang 	0xe100000a, 0x1b80001f, 0x20000080, 0x69200009, 0x10006214, 0xd8001b84,
95*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0xe2600f0d, 0xd0001ba0, 0x17c07c1f, 0xe2603f0d, 0x1b80001f,
96*1a1ff8b9SJimmy Huang 	0x20000080, 0xe2600f0f, 0xe2600f0e, 0xe2600f1e, 0xe2600f1a, 0xe2600f12,
97*1a1ff8b9SJimmy Huang 	0xf0000000, 0x17c07c1f, 0xe2e00036, 0xe2e0003e, 0x1b80001f, 0x00000020,
98*1a1ff8b9SJimmy Huang 	0xe2e0003c, 0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080,
998e53ec53SJimmy Huang 	0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d,
100*1a1ff8b9SJimmy Huang 	0xf0000000, 0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f, 0xe8208000,
101*1a1ff8b9SJimmy Huang 	0x10006244, 0x00000001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e,
102*1a1ff8b9SJimmy Huang 	0xe2e0003a, 0xe2e00032, 0x1b80001f, 0x00000020, 0x1910001f, 0x10006b6c,
103*1a1ff8b9SJimmy Huang 	0x09000004, 0x00100000, 0x1a10001f, 0x10006b6c, 0xe2000004, 0xf0000000,
104*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0xe2e00036, 0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c,
105*1a1ff8b9SJimmy Huang 	0xe2a00000, 0x1b80001f, 0x20000080, 0xe2e0007c, 0x1b80001f, 0x20000003,
106*1a1ff8b9SJimmy Huang 	0xe2e0005c, 0xe2e0004c, 0xe2e0004d, 0xf0000000, 0x17c07c1f, 0xe2e0004f,
107*1a1ff8b9SJimmy Huang 	0xe2e0006f, 0xe2e0002f, 0xe2a00001, 0x1b80001f, 0x20000080, 0xe2e0002e,
108*1a1ff8b9SJimmy Huang 	0xe2e0003e, 0xe2e0003a, 0xe2e00032, 0xf0000000, 0x17c07c1f, 0xe2e00026,
109*1a1ff8b9SJimmy Huang 	0xe2e0002e, 0x1b80001f, 0x00000020, 0x1a00001f, 0x100062b4, 0x1910001f,
110*1a1ff8b9SJimmy Huang 	0x100062b4, 0x81322804, 0xe2000004, 0x81202804, 0xe2000004, 0x1b80001f,
111*1a1ff8b9SJimmy Huang 	0x20000080, 0xe2e0000e, 0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f,
112*1a1ff8b9SJimmy Huang 	0xe2e0002d, 0x1a00001f, 0x100062b4, 0x1910001f, 0x100062b4, 0xa1002804,
113*1a1ff8b9SJimmy Huang 	0xe2000004, 0xa1122804, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0002f,
114*1a1ff8b9SJimmy Huang 	0xe2e0002b, 0xe2e00023, 0x1b80001f, 0x00000020, 0xe2e00022, 0xf0000000,
1158e53ec53SJimmy Huang 	0x17c07c1f, 0x1900001f, 0x1020020c, 0x1a10001f, 0x1020020c, 0xaa000008,
116*1a1ff8b9SJimmy Huang 	0x00000001, 0xe1000008, 0x1910001f, 0x10006720, 0x820c9001, 0xd8202b08,
1178e53ec53SJimmy Huang 	0x17c07c1f, 0x1900001f, 0x10001220, 0x1a10001f, 0x10001220, 0xa21f0408,
118*1a1ff8b9SJimmy Huang 	0xe1000008, 0x1b80001f, 0x20000080, 0xe2e0006d, 0xe2e0002d, 0x1a00001f,
119*1a1ff8b9SJimmy Huang 	0x100062b8, 0x1910001f, 0x100062b8, 0xa9000004, 0x00000001, 0xe2000004,
120*1a1ff8b9SJimmy Huang 	0x1b80001f, 0x20000080, 0xe2e0002c, 0xe2e0003c, 0xe2e0003e, 0xe2e0003a,
121*1a1ff8b9SJimmy Huang 	0xe2e00032, 0x1b80001f, 0x00000020, 0x1900001f, 0x10006404, 0x1a10001f,
122*1a1ff8b9SJimmy Huang 	0x10006404, 0xa2168408, 0xe1000008, 0xf0000000, 0x17c07c1f, 0x1a10001f,
123*1a1ff8b9SJimmy Huang 	0x10006918, 0x81022001, 0xb102a081, 0xb1062081, 0xb106a081, 0xb1003081,
124*1a1ff8b9SJimmy Huang 	0xd8203624, 0x17c07c1f, 0x1900001f, 0x10006404, 0x1a10001f, 0x10006404,
125*1a1ff8b9SJimmy Huang 	0x8a000008, 0x0000dfff, 0xe1000008, 0xe2e00036, 0xe2e0003e, 0x1b80001f,
126*1a1ff8b9SJimmy Huang 	0x00000020, 0xe2e0002e, 0x1a00001f, 0x100062b8, 0x1910001f, 0x100062b8,
127*1a1ff8b9SJimmy Huang 	0x89000004, 0x0000fffe, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0006e,
128*1a1ff8b9SJimmy Huang 	0xe2e0004e, 0xe2e0004c, 0xe2e0004d, 0x1900001f, 0x10001220, 0x1a10001f,
129*1a1ff8b9SJimmy Huang 	0x10001220, 0x8a000008, 0xbfffffff, 0xe1000008, 0x1b80001f, 0x20000080,
1308e53ec53SJimmy Huang 	0x1900001f, 0x1020020c, 0x1a10001f, 0x1020020c, 0x8a000008, 0xfffffffe,
131*1a1ff8b9SJimmy Huang 	0xe1000008, 0xf0000000, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1327d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1337d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1347d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1357d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1367d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1377d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1387d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1397d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1407d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1417d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1427d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1437d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1447d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0x11407c1f, 0xe8208000,
1457d116dccSCC Ma 	0x10006b6c, 0xa0000000, 0xe8208000, 0x10006310, 0x0b160008, 0x1900001f,
1467d116dccSCC Ma 	0x000f7bde, 0x1a00001f, 0x10200268, 0xe2000004, 0xe8208000, 0x10006600,
147*1a1ff8b9SJimmy Huang 	0x00000000, 0x1b00001f, 0x21000001, 0x1b80001f, 0xd0010000, 0x69200006,
148*1a1ff8b9SJimmy Huang 	0xbeefbeef, 0xd8204664, 0x17c07c1f, 0x1910001f, 0x10006358, 0x810b1001,
149*1a1ff8b9SJimmy Huang 	0xd8004324, 0x17c07c1f, 0x1980001f, 0xdeaddead, 0x69200006, 0xabcdabcd,
150*1a1ff8b9SJimmy Huang 	0xd8204404, 0x17c07c1f, 0x88900001, 0x10006814, 0x1910001f, 0x10006400,
151*1a1ff8b9SJimmy Huang 	0x81271002, 0x1880001f, 0x10006600, 0xe0800004, 0x1910001f, 0x10006358,
152*1a1ff8b9SJimmy Huang 	0x810b1001, 0xd8004584, 0x17c07c1f, 0x1980001f, 0x12345678, 0x60a07c05,
153*1a1ff8b9SJimmy Huang 	0x89100002, 0x10006600, 0x80801001, 0xd8007d42, 0x17c07c1f, 0x1890001f,
154*1a1ff8b9SJimmy Huang 	0x10006b00, 0x82090801, 0xc8800008, 0x17c07c1f, 0x1a10001f, 0x10006720,
155*1a1ff8b9SJimmy Huang 	0x82002001, 0x82201408, 0xd8204968, 0x17c07c1f, 0x1a40001f, 0x10006200,
156*1a1ff8b9SJimmy Huang 	0x1a80001f, 0x1000625c, 0xc24023e0, 0x17c07c1f, 0xa1400405, 0x1a10001f,
157*1a1ff8b9SJimmy Huang 	0x10006720, 0x8200a001, 0x82209408, 0xd8204b08, 0x17c07c1f, 0x1a40001f,
158*1a1ff8b9SJimmy Huang 	0x10006218, 0x1a80001f, 0x10006264, 0xc24023e0, 0x17c07c1f, 0xa1508405,
159*1a1ff8b9SJimmy Huang 	0x1a10001f, 0x10006720, 0x82012001, 0x82211408, 0xd8204ca8, 0x17c07c1f,
160*1a1ff8b9SJimmy Huang 	0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 0xc24023e0, 0x17c07c1f,
161*1a1ff8b9SJimmy Huang 	0xa1510405, 0x1a10001f, 0x10006720, 0x8201a001, 0x82219408, 0xd8204e48,
162*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc24023e0,
1638e53ec53SJimmy Huang 	0x17c07c1f, 0xa1518405, 0x1a10001f, 0x10006720, 0x82022001, 0x82221408,
164*1a1ff8b9SJimmy Huang 	0xd8204fc8, 0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f, 0xc24027c0,
1658e53ec53SJimmy Huang 	0x17c07c1f, 0xa1520405, 0x1a10001f, 0x10006720, 0x8202a001, 0x82229408,
166*1a1ff8b9SJimmy Huang 	0xd8205148, 0x17c07c1f, 0x1a40001f, 0x100062a4, 0x1290841f, 0xc24027c0,
1678e53ec53SJimmy Huang 	0x17c07c1f, 0xa1528405, 0x1a10001f, 0x10006720, 0x82032001, 0x82231408,
168*1a1ff8b9SJimmy Huang 	0xd8205228, 0x17c07c1f, 0xa1530405, 0x1a10001f, 0x10006720, 0x8203a001,
169*1a1ff8b9SJimmy Huang 	0x82239408, 0xd8205308, 0x17c07c1f, 0xa1538405, 0x1a10001f, 0x10006b00,
170*1a1ff8b9SJimmy Huang 	0x8108a001, 0xd8205ee4, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x8104a001,
171*1a1ff8b9SJimmy Huang 	0xb1052081, 0xb105a081, 0xb1062081, 0xd8005904, 0x17c07c1f, 0x81042001,
172*1a1ff8b9SJimmy Huang 	0xd8205904, 0x17c07c1f, 0x1900001f, 0x1020002c, 0x1a10001f, 0x1020002c,
173*1a1ff8b9SJimmy Huang 	0xaa000008, 0x00000010, 0xe1000008, 0x1910001f, 0x10006720, 0x820c1001,
174*1a1ff8b9SJimmy Huang 	0xd82055e8, 0x17c07c1f, 0x1900001f, 0x10001250, 0x1a10001f, 0x10001250,
175*1a1ff8b9SJimmy Huang 	0xa2110408, 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f, 0x10001220,
176*1a1ff8b9SJimmy Huang 	0x1a10001f, 0x10001220, 0xa21e8408, 0xe1000008, 0x1b80001f, 0x20000080,
177*1a1ff8b9SJimmy Huang 	0x1a40001f, 0x10006208, 0xc2401f00, 0x17c07c1f, 0x1910001f, 0x10006610,
178*1a1ff8b9SJimmy Huang 	0x81041001, 0xd8005ee4, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81002001,
179*1a1ff8b9SJimmy Huang 	0xb100a081, 0xb1012081, 0xb101a081, 0xb1042081, 0xb104a081, 0xb1052081,
180*1a1ff8b9SJimmy Huang 	0xb105a081, 0xb1003081, 0xd8205ee4, 0x17c07c1f, 0x1a40001f, 0x10006208,
181*1a1ff8b9SJimmy Huang 	0xc2401cc0, 0x17c07c1f, 0x1900001f, 0x10001250, 0x1a10001f, 0x10001250,
182*1a1ff8b9SJimmy Huang 	0x8a000008, 0xfffffffb, 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f,
183*1a1ff8b9SJimmy Huang 	0x10001220, 0x1a10001f, 0x10001220, 0x8a000008, 0xdfffffff, 0xe1000008,
184*1a1ff8b9SJimmy Huang 	0x1b80001f, 0x20000080, 0x1900001f, 0x1020002c, 0x1a10001f, 0x1020002c,
185*1a1ff8b9SJimmy Huang 	0x8a000008, 0xffffffef, 0xe1000008, 0x1a10001f, 0x10006b00, 0x81082001,
186*1a1ff8b9SJimmy Huang 	0xd8206164, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x81082001, 0xb108a081,
187*1a1ff8b9SJimmy Huang 	0xd8006164, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x8107a001, 0xd8206164,
188*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1a40001f, 0x100062b0, 0xc2402a20, 0x17c07c1f, 0x1b80001f,
189*1a1ff8b9SJimmy Huang 	0x20000208, 0xd8207d0c, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81079001,
190*1a1ff8b9SJimmy Huang 	0xd8006304, 0x17c07c1f, 0x1a40001f, 0x100062b0, 0xc2402fe0, 0x17c07c1f,
191*1a1ff8b9SJimmy Huang 	0x81001401, 0xd8206684, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81002001,
192*1a1ff8b9SJimmy Huang 	0xb1042081, 0xb1003081, 0xb10c3081, 0xd8206684, 0x17c07c1f, 0x1a40001f,
193*1a1ff8b9SJimmy Huang 	0x10006200, 0x1a80001f, 0x1000625c, 0xc24021e0, 0x17c07c1f, 0x89400005,
194*1a1ff8b9SJimmy Huang 	0xfffffffe, 0xe8208000, 0x10006f00, 0x00000000, 0xe8208000, 0x10006b30,
195*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x100063e0, 0x00000001, 0x81009401, 0xd82069e4,
196*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1a10001f, 0x10006918, 0x8100a001, 0xb104a081, 0xb1003081,
197*1a1ff8b9SJimmy Huang 	0xd82069e4, 0x17c07c1f, 0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264,
198*1a1ff8b9SJimmy Huang 	0xc24021e0, 0x17c07c1f, 0x89400005, 0xfffffffd, 0xe8208000, 0x10006f04,
199*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x10006b34, 0x00000000, 0xe8208000, 0x100063e0,
200*1a1ff8b9SJimmy Huang 	0x00000002, 0x81011401, 0xd8206d44, 0x17c07c1f, 0x1a10001f, 0x10006918,
201*1a1ff8b9SJimmy Huang 	0x81012001, 0xb1052081, 0xb1003081, 0xd8206d44, 0x17c07c1f, 0x1a40001f,
202*1a1ff8b9SJimmy Huang 	0x1000621c, 0x1a80001f, 0x1000626c, 0xc24021e0, 0x17c07c1f, 0x89400005,
203*1a1ff8b9SJimmy Huang 	0xfffffffb, 0xe8208000, 0x10006f08, 0x00000000, 0xe8208000, 0x10006b38,
204*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x100063e0, 0x00000004, 0x81019401, 0xd82070a4,
205*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1a10001f, 0x10006918, 0x8101a001, 0xb105a081, 0xb1003081,
206*1a1ff8b9SJimmy Huang 	0xd82070a4, 0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274,
207*1a1ff8b9SJimmy Huang 	0xc24021e0, 0x17c07c1f, 0x89400005, 0xfffffff7, 0xe8208000, 0x10006f0c,
208*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x10006b3c, 0x00000000, 0xe8208000, 0x100063e0,
209*1a1ff8b9SJimmy Huang 	0x00000008, 0x1910001f, 0x10006610, 0x81079001, 0xd82077c4, 0x17c07c1f,
210*1a1ff8b9SJimmy Huang 	0x81021401, 0xd8207484, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81022001,
211*1a1ff8b9SJimmy Huang 	0xb1062081, 0xb1003081, 0xd8207484, 0x17c07c1f, 0x1a40001f, 0x100062a0,
212*1a1ff8b9SJimmy Huang 	0x1280041f, 0xc2402560, 0x17c07c1f, 0x89400005, 0xffffffef, 0xe8208000,
213*1a1ff8b9SJimmy Huang 	0x10006f10, 0x00000000, 0xe8208000, 0x10006b40, 0x00000000, 0xe8208000,
214*1a1ff8b9SJimmy Huang 	0x100063e0, 0x00000010, 0x81029401, 0xd82077c4, 0x17c07c1f, 0x1a10001f,
215*1a1ff8b9SJimmy Huang 	0x10006918, 0x8102a001, 0xb106a081, 0xb1003081, 0xd82077c4, 0x17c07c1f,
216*1a1ff8b9SJimmy Huang 	0x1a40001f, 0x100062a4, 0x1290841f, 0xc2402560, 0x17c07c1f, 0x89400005,
217*1a1ff8b9SJimmy Huang 	0xffffffdf, 0xe8208000, 0x10006f14, 0x00000000, 0xe8208000, 0x10006b44,
218*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x100063e0, 0x00000020, 0x81031401, 0xd8207a64,
219*1a1ff8b9SJimmy Huang 	0x17c07c1f, 0x1a10001f, 0x10006918, 0x81032001, 0xb1072081, 0xb1003081,
220*1a1ff8b9SJimmy Huang 	0xd8207a64, 0x17c07c1f, 0x89400005, 0xffffffbf, 0xe8208000, 0x10006f18,
221*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x10006b48, 0x00000000, 0xe8208000, 0x100063e0,
222*1a1ff8b9SJimmy Huang 	0x00000040, 0x81039401, 0xd8207d04, 0x17c07c1f, 0x1a10001f, 0x10006918,
223*1a1ff8b9SJimmy Huang 	0x8103a001, 0xb107a081, 0xb1003081, 0xd8207d04, 0x17c07c1f, 0x89400005,
224*1a1ff8b9SJimmy Huang 	0xffffff7f, 0xe8208000, 0x10006f1c, 0x00000000, 0xe8208000, 0x10006b4c,
225*1a1ff8b9SJimmy Huang 	0x00000000, 0xe8208000, 0x100063e0, 0x00000080, 0xd0004220, 0x17c07c1f,
2267d116dccSCC Ma 	0xe8208000, 0x10006600, 0x00000000, 0x1ac0001f, 0x55aa55aa, 0x1940001f,
227*1a1ff8b9SJimmy Huang 	0xaa55aa55, 0x1b80001f, 0x00001000, 0xf0000000, 0x17c07c1f
2287d116dccSCC Ma };
2297d116dccSCC Ma 
2307d116dccSCC Ma static const struct pcm_desc mcdi_pcm = {
231*1a1ff8b9SJimmy Huang 	.version = "pcm_mcdi_mt8173_20151110_V4",
2327d116dccSCC Ma 	.base = mcdi_binary,
233*1a1ff8b9SJimmy Huang 	.size = 1013,
2347d116dccSCC Ma 	.sess = 2,
2357d116dccSCC Ma 	.replace = 0,
2367d116dccSCC Ma };
2377d116dccSCC Ma 
2387d116dccSCC Ma static struct pwr_ctrl mcdi_ctrl = {
2397d116dccSCC Ma 	.wake_src = WAKE_SRC_FOR_MCDI,
2407d116dccSCC Ma 	.wake_src_md32 = 0,
2417d116dccSCC Ma 	.wfi_op = WFI_OP_OR,
2427d116dccSCC Ma 	.mcusys_idle_mask = 1,
2437d116dccSCC Ma 	.ca7top_idle_mask = 1,
2447d116dccSCC Ma 	.ca15top_idle_mask = 1,
2457d116dccSCC Ma 	.disp_req_mask = 1,
2467d116dccSCC Ma 	.mfg_req_mask = 1,
2477d116dccSCC Ma 	.md32_req_mask = 1,
2487d116dccSCC Ma };
2497d116dccSCC Ma 
2507d116dccSCC Ma static const struct spm_lp_scen spm_mcdi = {
2517d116dccSCC Ma 	.pcmdesc = &mcdi_pcm,
2527d116dccSCC Ma 	.pwrctrl = &mcdi_ctrl,
2537d116dccSCC Ma };
2547d116dccSCC Ma 
2557d116dccSCC Ma void spm_mcdi_cpu_wake_up_event(int wake_up_event, int disable_dormant_power)
2567d116dccSCC Ma {
2577d116dccSCC Ma 	if (((mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) & 0x1) == 1)
2587d116dccSCC Ma 	    && ((mmio_read_32(SPM_CLK_CON) & CC_DISABLE_DORM_PWR) == 0)) {
2597d116dccSCC Ma 		/* MCDI is offload? */
2607d116dccSCC Ma 		INFO("%s: SPM_SLEEP_CPU_WAKEUP_EVENT:%x, SPM_CLK_CON %x",
2617d116dccSCC Ma 			__func__, mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT),
2627d116dccSCC Ma 			mmio_read_32(SPM_CLK_CON));
2637d116dccSCC Ma 		return;
2647d116dccSCC Ma 	}
2657d116dccSCC Ma 	/* Inform SPM that CPU wants to program CPU_WAKEUP_EVENT and
2667d116dccSCC Ma 	 * DISABLE_CPU_DROM */
2677d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_HANDSHAKE_SYNC);
2687d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2697d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2707d116dccSCC Ma 
2717d116dccSCC Ma 	/* Wait SPM's response, can't use sleep api */
2727d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_HANDSHAKE_ACK)
2737d116dccSCC Ma 		;
2747d116dccSCC Ma 
2757d116dccSCC Ma 	if (disable_dormant_power) {
2767d116dccSCC Ma 		mmio_setbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR);
2777d116dccSCC Ma 		while (mmio_read_32(SPM_CLK_CON) !=
2787d116dccSCC Ma 			(mmio_read_32(SPM_CLK_CON) | CC_DISABLE_DORM_PWR))
2797d116dccSCC Ma 			;
2807d116dccSCC Ma 
2817d116dccSCC Ma 	} else {
2827d116dccSCC Ma 		mmio_clrbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR);
2837d116dccSCC Ma 		while (mmio_read_32(SPM_CLK_CON) !=
2847d116dccSCC Ma 			(mmio_read_32(SPM_CLK_CON) & ~CC_DISABLE_DORM_PWR))
2857d116dccSCC Ma 			;
2867d116dccSCC Ma 	}
2877d116dccSCC Ma 
2887d116dccSCC Ma 	mmio_write_32(SPM_SLEEP_CPU_WAKEUP_EVENT, wake_up_event);
2897d116dccSCC Ma 
2907d116dccSCC Ma 	while (mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) != wake_up_event)
2917d116dccSCC Ma 		;
2927d116dccSCC Ma 
2937d116dccSCC Ma 	/* Inform SPM to see updated setting */
2947d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_UPDATE_INFORM);
2957d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2967d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2977d116dccSCC Ma 
2987d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_CKECK_DONE)
2997d116dccSCC Ma 		;
3007d116dccSCC Ma 	/* END OF sequence */
3017d116dccSCC Ma 
3027d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, 0x0);
3037d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
3047d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
3057d116dccSCC Ma }
3067d116dccSCC Ma 
3077d116dccSCC Ma void spm_mcdi_wakeup_all_cores(void)
3087d116dccSCC Ma {
3097d116dccSCC Ma 	if (is_mcdi_ready() == 0)
3107d116dccSCC Ma 		return;
3117d116dccSCC Ma 
3127d116dccSCC Ma 	spm_mcdi_cpu_wake_up_event(1, 1);
3137d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_ALL_CORE_AWAKE)
3147d116dccSCC Ma 		;
3157d116dccSCC Ma 	spm_mcdi_cpu_wake_up_event(1, 0);
3167d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_OFFLOADED)
3177d116dccSCC Ma 		;
3187d116dccSCC Ma 
3197d116dccSCC Ma 	spm_clean_after_wakeup();
3207d116dccSCC Ma 	clear_all_ready();
3217d116dccSCC Ma }
3227d116dccSCC Ma 
3238e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_enter(unsigned long mpidr)
3247d116dccSCC Ma {
3257d116dccSCC Ma 	int core_id_val = mpidr & MPIDR_CPU_MASK;
3267d116dccSCC Ma 	int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
3277d116dccSCC Ma 
3287d116dccSCC Ma 	/* SPM WFI Select by core number */
3297d116dccSCC Ma 	if (cluster_id) {
3307d116dccSCC Ma 		switch (core_id_val) {
3317d116dccSCC Ma 		case 0:
3327d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 1);
3337d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 1);
3347d116dccSCC Ma 			break;
3357d116dccSCC Ma 		case 1:
3367d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 1);
3377d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 1);
3387d116dccSCC Ma 			break;
3397d116dccSCC Ma 		case 2:
3407d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 1);
3417d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 1);
3427d116dccSCC Ma 			break;
3437d116dccSCC Ma 		case 3:
3447d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 1);
3457d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 1);
3467d116dccSCC Ma 			break;
3477d116dccSCC Ma 		default:
3487d116dccSCC Ma 			break;
3497d116dccSCC Ma 		}
3507d116dccSCC Ma 	} else {
3517d116dccSCC Ma 		switch (core_id_val) {
3527d116dccSCC Ma 		case 0:
3537d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 1);
3547d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 1);
3557d116dccSCC Ma 			break;
3567d116dccSCC Ma 		case 1:
3577d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 1);
3587d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 1);
3597d116dccSCC Ma 			break;
3607d116dccSCC Ma 		case 2:
3617d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 1);
3627d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 1);
3637d116dccSCC Ma 			break;
3647d116dccSCC Ma 		case 3:
3657d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 1);
3667d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 1);
3677d116dccSCC Ma 			break;
3687d116dccSCC Ma 		default:
3697d116dccSCC Ma 			break;
3707d116dccSCC Ma 		}
3717d116dccSCC Ma 	}
3727d116dccSCC Ma }
3737d116dccSCC Ma 
3748e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_leave(unsigned long mpidr)
3757d116dccSCC Ma {
3767d116dccSCC Ma 	int core_id_val = mpidr & MPIDR_CPU_MASK;
3777d116dccSCC Ma 	int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
3787d116dccSCC Ma 
3797d116dccSCC Ma 	/* SPM WFI Select by core number */
3807d116dccSCC Ma 	if (cluster_id) {
3817d116dccSCC Ma 		switch (core_id_val) {
3827d116dccSCC Ma 		case 0:
3837d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 0);
3847d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 0);
3857d116dccSCC Ma 			break;
3867d116dccSCC Ma 		case 1:
3877d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 0);
3887d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 0);
3897d116dccSCC Ma 			break;
3907d116dccSCC Ma 		case 2:
3917d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 0);
3927d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 0);
3937d116dccSCC Ma 			break;
3947d116dccSCC Ma 		case 3:
3957d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 0);
3967d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 0);
3977d116dccSCC Ma 			break;
3987d116dccSCC Ma 		default:
3997d116dccSCC Ma 			break;
4007d116dccSCC Ma 		}
4017d116dccSCC Ma 	} else {
4027d116dccSCC Ma 		switch (core_id_val) {
4037d116dccSCC Ma 		case 0:
4047d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 0);
4057d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 0);
4067d116dccSCC Ma 			break;
4077d116dccSCC Ma 		case 1:
4087d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 0);
4097d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 0);
4107d116dccSCC Ma 			break;
4117d116dccSCC Ma 		case 2:
4127d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 0);
4137d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 0);
4147d116dccSCC Ma 			break;
4157d116dccSCC Ma 		case 3:
4167d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 0);
4177d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 0);
4187d116dccSCC Ma 			break;
4197d116dccSCC Ma 		default:
4207d116dccSCC Ma 			break;
4217d116dccSCC Ma 		}
4227d116dccSCC Ma 	}
4237d116dccSCC Ma }
4247d116dccSCC Ma 
4258e53ec53SJimmy Huang static void spm_mcdi_set_cputop_pwrctrl_for_cluster_off(unsigned long mpidr)
4268e53ec53SJimmy Huang {
4278e53ec53SJimmy Huang 	unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK;
4288e53ec53SJimmy Huang 	unsigned long cpu_id = mpidr & MPIDR_CPU_MASK;
4298e53ec53SJimmy Huang 	unsigned int pwr_status, shift, i, flag = 0;
4308e53ec53SJimmy Huang 
4318e53ec53SJimmy Huang 	pwr_status = mmio_read_32(SPM_PWR_STATUS) |
4328e53ec53SJimmy Huang 				 mmio_read_32(SPM_PWR_STATUS_2ND);
4338e53ec53SJimmy Huang 
4348e53ec53SJimmy Huang 	if (cluster_id) {
4358e53ec53SJimmy Huang 		for (i = 0; i < PLATFORM_CLUSTER1_CORE_COUNT; i++) {
4368e53ec53SJimmy Huang 			if (i == cpu_id)
4378e53ec53SJimmy Huang 				continue;
4388e53ec53SJimmy Huang 			shift = i + PCM_MCDI_CA72_PWRSTA_SHIFT;
4398e53ec53SJimmy Huang 			flag |= (pwr_status & (1 << shift)) >> shift;
4408e53ec53SJimmy Huang 		}
4418e53ec53SJimmy Huang 		if (!flag)
4428e53ec53SJimmy Huang 			mmio_setbits_32(SPM_PCM_RESERVE,
4438e53ec53SJimmy Huang 					PCM_MCDI_CA72_CPUTOP_PWRCTL);
4448e53ec53SJimmy Huang 	} else {
4458e53ec53SJimmy Huang 		for (i = 0; i < PLATFORM_CLUSTER0_CORE_COUNT; i++) {
4468e53ec53SJimmy Huang 			if (i == cpu_id)
4478e53ec53SJimmy Huang 				continue;
4488e53ec53SJimmy Huang 			shift = i + PCM_MCDI_CA53_PWRSTA_SHIFT;
4498e53ec53SJimmy Huang 			flag |= (pwr_status & (1 << shift)) >> shift;
4508e53ec53SJimmy Huang 		}
4518e53ec53SJimmy Huang 		if (!flag)
4528e53ec53SJimmy Huang 			mmio_setbits_32(SPM_PCM_RESERVE,
4538e53ec53SJimmy Huang 					PCM_MCDI_CA53_CPUTOP_PWRCTL);
4548e53ec53SJimmy Huang 	}
4558e53ec53SJimmy Huang }
4568e53ec53SJimmy Huang 
4578e53ec53SJimmy Huang static void spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(unsigned long mpidr)
4588e53ec53SJimmy Huang {
4598e53ec53SJimmy Huang 	unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK;
4608e53ec53SJimmy Huang 
4618e53ec53SJimmy Huang 	if (cluster_id)
4628e53ec53SJimmy Huang 		mmio_clrbits_32(SPM_PCM_RESERVE,
4638e53ec53SJimmy Huang 				PCM_MCDI_CA72_CPUTOP_PWRCTL);
4648e53ec53SJimmy Huang 	else
4658e53ec53SJimmy Huang 		mmio_clrbits_32(SPM_PCM_RESERVE,
4668e53ec53SJimmy Huang 				PCM_MCDI_CA53_CPUTOP_PWRCTL);
4678e53ec53SJimmy Huang }
4688e53ec53SJimmy Huang 
469*1a1ff8b9SJimmy Huang void spm_mcdi_prepare_for_mtcmos(void)
470*1a1ff8b9SJimmy Huang {
471*1a1ff8b9SJimmy Huang 	const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc;
472*1a1ff8b9SJimmy Huang 	struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl;
473*1a1ff8b9SJimmy Huang 
474*1a1ff8b9SJimmy Huang 	if (is_mcdi_ready() == 0) {
475*1a1ff8b9SJimmy Huang 		if (is_hotplug_ready() == 1)
476*1a1ff8b9SJimmy Huang 			spm_clear_hotplug();
477*1a1ff8b9SJimmy Huang 		set_pwrctrl_pcm_flags(pwrctrl, 0);
478*1a1ff8b9SJimmy Huang 		spm_reset_and_init_pcm();
479*1a1ff8b9SJimmy Huang 		spm_kick_im_to_fetch(pcmdesc);
480*1a1ff8b9SJimmy Huang 		spm_set_power_control(pwrctrl);
481*1a1ff8b9SJimmy Huang 		spm_set_wakeup_event(pwrctrl);
482*1a1ff8b9SJimmy Huang 		spm_kick_pcm_to_run(pwrctrl);
483*1a1ff8b9SJimmy Huang 		set_mcdi_ready();
484*1a1ff8b9SJimmy Huang 	}
485*1a1ff8b9SJimmy Huang }
486*1a1ff8b9SJimmy Huang 
4878e53ec53SJimmy Huang void spm_mcdi_prepare_for_off_state(unsigned long mpidr, unsigned int afflvl)
4887d116dccSCC Ma {
4897d116dccSCC Ma 	const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc;
4907d116dccSCC Ma 	struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl;
4917d116dccSCC Ma 
4927d116dccSCC Ma 	spm_lock_get();
4937d116dccSCC Ma 	if (is_mcdi_ready() == 0) {
4947d116dccSCC Ma 		if (is_hotplug_ready() == 1)
4957d116dccSCC Ma 			spm_clear_hotplug();
4967d116dccSCC Ma 		set_pwrctrl_pcm_flags(pwrctrl, 0);
4977d116dccSCC Ma 		spm_reset_and_init_pcm();
4987d116dccSCC Ma 		spm_kick_im_to_fetch(pcmdesc);
4997d116dccSCC Ma 		spm_set_power_control(pwrctrl);
5007d116dccSCC Ma 		spm_set_wakeup_event(pwrctrl);
5017d116dccSCC Ma 		spm_kick_pcm_to_run(pwrctrl);
5027d116dccSCC Ma 		set_mcdi_ready();
5037d116dccSCC Ma 	}
5047d116dccSCC Ma 	spm_mcdi_wfi_sel_enter(mpidr);
5058e53ec53SJimmy Huang 	if (afflvl == MPIDR_AFFLVL1)
5068e53ec53SJimmy Huang 		spm_mcdi_set_cputop_pwrctrl_for_cluster_off(mpidr);
5077d116dccSCC Ma 	spm_lock_release();
5087d116dccSCC Ma }
5097d116dccSCC Ma 
5108e53ec53SJimmy Huang void spm_mcdi_finish_for_on_state(unsigned long mpidr, unsigned int afflvl)
5117d116dccSCC Ma {
5127d116dccSCC Ma 	unsigned long linear_id = platform_get_core_pos(mpidr);
5137d116dccSCC Ma 
5147d116dccSCC Ma 	spm_lock_get();
5158e53ec53SJimmy Huang 	spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(mpidr);
5167d116dccSCC Ma 	spm_mcdi_wfi_sel_leave(mpidr);
5177d116dccSCC Ma 	mmio_write_32(SPM_PCM_SW_INT_CLEAR, (0x1 << linear_id));
5187d116dccSCC Ma 	spm_lock_release();
5197d116dccSCC Ma }
520