xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_mcdi.c (revision 201d535ff65ceefcb35840a53f8048992dcffdaf)
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 
4644c49087SWeiyi Lu #define WAKE_SRC_FOR_MCDI \
4744c49087SWeiyi Lu 	(WAKE_SRC_KP | WAKE_SRC_GPT | WAKE_SRC_EINT |		\
4844c49087SWeiyi Lu 	 WAKE_SRC_MD32 | WAKE_SRC_USB_CD | WAKE_SRC_USB_PDN |	\
4944c49087SWeiyi Lu 	 WAKE_SRC_AFE | WAKE_SRC_THERM | WAKE_SRC_CIRQ |	\
5044c49087SWeiyi Lu 	 WAKE_SRC_SYSPWREQ | WAKE_SRC_CPU_IRQ)
517d116dccSCC Ma #define PCM_MCDI_HANDSHAKE_SYNC	0xbeefbeef
527d116dccSCC Ma #define PCM_MCDI_HANDSHAKE_ACK	0xdeaddead
537d116dccSCC Ma #define PCM_MCDI_UPDATE_INFORM	0xabcdabcd
547d116dccSCC Ma #define PCM_MCDI_CKECK_DONE	0x12345678
557d116dccSCC Ma #define PCM_MCDI_ALL_CORE_AWAKE	0x0
567d116dccSCC Ma #define PCM_MCDI_OFFLOADED	0xaa55aa55
578e53ec53SJimmy Huang #define PCM_MCDI_CA72_CPUTOP_PWRCTL	(0x1 << 16)
588e53ec53SJimmy Huang #define PCM_MCDI_CA53_CPUTOP_PWRCTL	(0x1 << 17)
598e53ec53SJimmy Huang #define PCM_MCDI_CA72_PWRSTA_SHIFT	16
608e53ec53SJimmy Huang #define PCM_MCDI_CA53_PWRSTA_SHIFT	9
617d116dccSCC Ma 
627d116dccSCC Ma static const unsigned int mcdi_binary[] = {
631a1ff8b9SJimmy Huang 	0x1a10001f, 0x10006b04, 0x1890001f, 0x10006b6c, 0x1a40001f, 0x10006210,
6444c49087SWeiyi Lu 	0x18d0001f, 0x10006210, 0x81002001, 0xd82001c4, 0x17c07c1f, 0xa0900402,
658c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x81052001, 0xd8200284, 0x17c07c1f, 0xa0950402,
668c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x10006230, 0x18d0001f, 0x10006230,
678c9130c6SFan Chen 	0x8100a001, 0xd82003c4, 0x17c07c1f, 0xa0908402, 0xc2401540, 0x17c07c1f,
688c9130c6SFan Chen 	0x8105a001, 0xd8200484, 0x17c07c1f, 0xa0958402, 0xc2401b80, 0x17c07c1f,
6944c49087SWeiyi Lu 	0x1a40001f, 0x10006238, 0x18d0001f, 0x10006238, 0x81012001, 0xd82005c4,
708c9130c6SFan Chen 	0x17c07c1f, 0xa0910402, 0xc2401540, 0x17c07c1f, 0x81062001, 0xd8200684,
718c9130c6SFan Chen 	0x17c07c1f, 0xa0960402, 0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x1000623c,
7244c49087SWeiyi Lu 	0x18d0001f, 0x1000623c, 0x8101a001, 0xd82007c4, 0x17c07c1f, 0xa0918402,
738c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x8106a001, 0xd8200884, 0x17c07c1f, 0xa0968402,
748c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x10006298, 0x18d0001f, 0x10006298,
758c9130c6SFan Chen 	0x81022001, 0xd82009c4, 0x17c07c1f, 0xa0920402, 0xc2401540, 0x17c07c1f,
768c9130c6SFan Chen 	0x81072001, 0xd8200a84, 0x17c07c1f, 0xa0970402, 0xc2401b80, 0x17c07c1f,
7744c49087SWeiyi Lu 	0x1a40001f, 0x1000629c, 0x18d0001f, 0x1000629c, 0x8102a001, 0xd8200bc4,
788c9130c6SFan Chen 	0x17c07c1f, 0xa0928402, 0xc2401540, 0x17c07c1f, 0x8107a001, 0xd8200c84,
798c9130c6SFan Chen 	0x17c07c1f, 0xa0978402, 0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x100062c4,
8044c49087SWeiyi Lu 	0x18d0001f, 0x100062c4, 0x81032001, 0xd8200dc4, 0x17c07c1f, 0xa0930402,
818c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x81082001, 0xd8200e84, 0x17c07c1f, 0xa0980402,
828c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x100062c0, 0x18d0001f, 0x100062c0,
838c9130c6SFan Chen 	0x8103a001, 0xd8200fc4, 0x17c07c1f, 0xa0938402, 0xc2401540, 0x17c07c1f,
848c9130c6SFan Chen 	0x8108a001, 0xd8201084, 0x17c07c1f, 0xa0988402, 0xc2401b80, 0x17c07c1f,
8544c49087SWeiyi Lu 	0x1a40001f, 0x10006214, 0x18d0001f, 0x10006214, 0x81042001, 0xd82011c4,
868c9130c6SFan Chen 	0x17c07c1f, 0xa0940402, 0xc2401540, 0x17c07c1f, 0x81092001, 0xd8201284,
878c9130c6SFan Chen 	0x17c07c1f, 0xa0990402, 0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x100062cc,
8844c49087SWeiyi Lu 	0x18d0001f, 0x100062cc, 0x8104a001, 0xd82013c4, 0x17c07c1f, 0xa0948402,
898c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x8109a001, 0xd8201484, 0x17c07c1f, 0xa0998402,
908c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1900001f, 0x10006b6c, 0x80802002, 0xe1000002,
918c9130c6SFan Chen 	0xf0000000, 0x17c07c1f, 0xa8c00003, 0x00000004, 0xe2400003, 0xa8c00003,
928c9130c6SFan Chen 	0x00000008, 0xe2400003, 0x1b80001f, 0x00000020, 0x88c00003, 0xffffffef,
938c9130c6SFan Chen 	0xe2400003, 0x88c00003, 0xfffffffd, 0xe2400003, 0xa8c00003, 0x00000001,
948c9130c6SFan Chen 	0xe2400003, 0x88c00003, 0xfffff0ff, 0xe2400003, 0x1b80001f, 0x20000080,
958c9130c6SFan Chen 	0x1a90001f, 0x10001220, 0x69200009, 0x1000623c, 0xd8001984, 0x17c07c1f,
968c9130c6SFan Chen 	0x69200009, 0x10006214, 0xd8001a64, 0x17c07c1f, 0xd0001b00, 0x17c07c1f,
978c9130c6SFan Chen 	0x1900001f, 0x10001220, 0x8a80000a, 0xfffffff9, 0xe100000a, 0xd0001b00,
988c9130c6SFan Chen 	0x17c07c1f, 0x1900001f, 0x10001220, 0x8a80000a, 0xff1fbfff, 0xe100000a,
998c9130c6SFan Chen 	0x1b80001f, 0x20000080, 0xf0000000, 0x17c07c1f, 0x1a90001f, 0x10001220,
1008c9130c6SFan Chen 	0x69200009, 0x1000623c, 0xd8001d04, 0x17c07c1f, 0x69200009, 0x10006214,
1018c9130c6SFan Chen 	0xd8001de4, 0x17c07c1f, 0xd0001e80, 0x17c07c1f, 0x1900001f, 0x10001220,
1028c9130c6SFan Chen 	0xaa80000a, 0x00000006, 0xe100000a, 0xd0001e80, 0x17c07c1f, 0x1900001f,
1038c9130c6SFan Chen 	0x10001220, 0xaa80000a, 0x00e04000, 0xe100000a, 0x1b80001f, 0x20000080,
1048c9130c6SFan Chen 	0x69200009, 0x10006214, 0xd8001fe4, 0x17c07c1f, 0xa8c00003, 0x00000f00,
1058c9130c6SFan Chen 	0xe2400003, 0xd0002040, 0x17c07c1f, 0xa8c00003, 0x00003f00, 0xe2400003,
1068c9130c6SFan Chen 	0x1b80001f, 0x20000080, 0xa8c00003, 0x00000002, 0xe2400003, 0x88c00003,
1078c9130c6SFan Chen 	0xfffffffe, 0xe2400003, 0xa8c00003, 0x00000010, 0xe2400003, 0x88c00003,
1088c9130c6SFan Chen 	0xfffffffb, 0xe2400003, 0x88c00003, 0xfffffff7, 0xe2400003, 0xf0000000,
1098c9130c6SFan Chen 	0x17c07c1f, 0xe2e00036, 0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c,
1108c9130c6SFan Chen 	0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xe2e0007c,
1118c9130c6SFan Chen 	0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d, 0xf0000000,
1128c9130c6SFan Chen 	0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f, 0xe8208000, 0x10006244,
1138c9130c6SFan Chen 	0x00000001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e0003a,
1148c9130c6SFan Chen 	0xe2e00032, 0x1b80001f, 0x00000020, 0xf0000000, 0x17c07c1f, 0xe2e00036,
11544c49087SWeiyi Lu 	0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c, 0xe2a00000, 0x1b80001f,
11644c49087SWeiyi Lu 	0x20000080, 0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c,
11744c49087SWeiyi Lu 	0xe2e0004d, 0xf0000000, 0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f,
11844c49087SWeiyi Lu 	0xe2a00001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e0003a,
11944c49087SWeiyi Lu 	0xe2e00032, 0xf0000000, 0x17c07c1f, 0xe2e00026, 0xe2e0002e, 0x1b80001f,
12044c49087SWeiyi Lu 	0x00000020, 0x1a00001f, 0x100062b4, 0x1910001f, 0x100062b4, 0x81322804,
12144c49087SWeiyi Lu 	0xe2000004, 0x81202804, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0000e,
12244c49087SWeiyi Lu 	0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f, 0xe2e0002d, 0x1a00001f,
12344c49087SWeiyi Lu 	0x100062b4, 0x1910001f, 0x100062b4, 0xa1002804, 0xe2000004, 0xa1122804,
12444c49087SWeiyi Lu 	0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0002f, 0xe2e0002b, 0xe2e00023,
1258c9130c6SFan Chen 	0x1b80001f, 0x00000020, 0xe2e00022, 0xf0000000, 0x17c07c1f, 0x1910001f,
1268c9130c6SFan Chen 	0x1000660c, 0x1a10001f, 0x10006610, 0xa2002004, 0x89000008, 0x00030000,
1278c9130c6SFan Chen 	0xd80036c4, 0x17c07c1f, 0x8207a001, 0xd82036c8, 0x17c07c1f, 0x1900001f,
12844c49087SWeiyi Lu 	0x1020020c, 0x1a10001f, 0x1020020c, 0xaa000008, 0x00000001, 0xe1000008,
1298c9130c6SFan Chen 	0x1910001f, 0x1020020c, 0x81001001, 0xd8203184, 0x17c07c1f, 0x1910001f,
1308c9130c6SFan Chen 	0x10006720, 0x820c9001, 0xd8203228, 0x17c07c1f, 0x1900001f, 0x10001220,
1318c9130c6SFan Chen 	0x1a10001f, 0x10001220, 0xa21f0408, 0xe1000008, 0x1b80001f, 0x20000080,
1328c9130c6SFan Chen 	0xe2e0006d, 0xe2e0002d, 0x1a00001f, 0x100062b8, 0x1910001f, 0x100062b8,
1338c9130c6SFan Chen 	0xa9000004, 0x00000001, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0002c,
1348c9130c6SFan Chen 	0xe2e0003c, 0xe2e0003e, 0xe2e0003a, 0xe2e00032, 0x1b80001f, 0x00000020,
1358c9130c6SFan Chen 	0x1900001f, 0x10006404, 0x1a10001f, 0x10006404, 0xa2168408, 0xe1000008,
1368c9130c6SFan Chen 	0xf0000000, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x8207a001, 0xd8003e68,
1378c9130c6SFan Chen 	0x17c07c1f, 0x1a10001f, 0x10006918, 0x8a000008, 0x00003030, 0xb900010c,
1388c9130c6SFan Chen 	0x01000001, 0xd8203e64, 0x17c07c1f, 0x1900001f, 0x10006404, 0x1a10001f,
1398c9130c6SFan Chen 	0x10006404, 0x8a000008, 0x0000dfff, 0xe1000008, 0xe2e00036, 0xe2e0003e,
1408c9130c6SFan Chen 	0x1b80001f, 0x00000020, 0xe2e0002e, 0x1a00001f, 0x100062b8, 0x1910001f,
1418c9130c6SFan Chen 	0x100062b8, 0x89000004, 0x0000fffe, 0xe2000004, 0x1b80001f, 0x20000080,
1428c9130c6SFan Chen 	0xe2e0006e, 0xe2e0004e, 0xe2e0004c, 0xe2e0004d, 0x1900001f, 0x10001220,
1438c9130c6SFan Chen 	0x1a10001f, 0x10001220, 0x8a000008, 0xbfffffff, 0xe1000008, 0x1b80001f,
1448c9130c6SFan Chen 	0x20000080, 0x1900001f, 0x1020020c, 0x1a10001f, 0x1020020c, 0x8a000008,
1458c9130c6SFan Chen 	0xfffffffe, 0xe1000008, 0x1910001f, 0x1020020c, 0x81001001, 0xd8003dc4,
1468c9130c6SFan Chen 	0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1477d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1487d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0x11407c1f, 0xe8208000,
1498c9130c6SFan Chen 	0x10006310, 0x0b160008, 0x1900001f, 0x000f7bde, 0x1a00001f, 0x10200268,
1508c9130c6SFan Chen 	0xe2000004, 0xe8208000, 0x10006600, 0x00000000, 0x69200006, 0xbeefbeef,
1518c9130c6SFan Chen 	0xd8204584, 0x17c07c1f, 0x1910001f, 0x10006358, 0x810b1001, 0xd8004244,
1528c9130c6SFan Chen 	0x17c07c1f, 0x1980001f, 0xdeaddead, 0x69200006, 0xabcdabcd, 0xd8204324,
1538c9130c6SFan Chen 	0x17c07c1f, 0x88900001, 0x10006814, 0x1910001f, 0x10006400, 0x81271002,
1548c9130c6SFan Chen 	0x1880001f, 0x10006600, 0xe0800004, 0x1910001f, 0x10006358, 0x810b1001,
1558c9130c6SFan Chen 	0xd80044a4, 0x17c07c1f, 0x1980001f, 0x12345678, 0x60a07c05, 0x89100002,
1568c9130c6SFan Chen 	0x10006600, 0x80801001, 0xd8007bc2, 0x17c07c1f, 0x1890001f, 0x10006b00,
1578c9130c6SFan Chen 	0x82090801, 0xc8800008, 0x17c07c1f, 0x1b00001f, 0x3fffe7ff, 0x8a00000c,
1588c9130c6SFan Chen 	0x3fffe7ff, 0xd82041c8, 0x17c07c1f, 0x1b80001f, 0xd0010000, 0x1a10001f,
1598c9130c6SFan Chen 	0x10006720, 0x82002001, 0x82201408, 0xd8204988, 0x17c07c1f, 0x1a40001f,
1608c9130c6SFan Chen 	0x10006200, 0x1a80001f, 0x1000625c, 0xc24028e0, 0x17c07c1f, 0xa1400405,
1618c9130c6SFan Chen 	0x1a10001f, 0x10006720, 0x8200a001, 0x82209408, 0xd8204b28, 0x17c07c1f,
1628c9130c6SFan Chen 	0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264, 0xc24028e0, 0x17c07c1f,
1638c9130c6SFan Chen 	0xa1508405, 0x1a10001f, 0x10006720, 0x82012001, 0x82211408, 0xd8204cc8,
1648c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 0xc24028e0,
1658c9130c6SFan Chen 	0x17c07c1f, 0xa1510405, 0x1a10001f, 0x10006720, 0x8201a001, 0x82219408,
1668c9130c6SFan Chen 	0xd8204e68, 0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274,
1678c9130c6SFan Chen 	0xc24028e0, 0x17c07c1f, 0xa1518405, 0x1a10001f, 0x10006720, 0x82022001,
1688c9130c6SFan Chen 	0x82221408, 0xd8204fe8, 0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f,
1698c9130c6SFan Chen 	0xc2402cc0, 0x17c07c1f, 0xa1520405, 0x1a10001f, 0x10006720, 0x8202a001,
1708c9130c6SFan Chen 	0x82229408, 0xd8205168, 0x17c07c1f, 0x1a40001f, 0x100062a4, 0x1290841f,
1718c9130c6SFan Chen 	0xc2402cc0, 0x17c07c1f, 0xa1528405, 0x1a10001f, 0x10006720, 0x82032001,
1728c9130c6SFan Chen 	0x82231408, 0xd8205248, 0x17c07c1f, 0xa1530405, 0x1a10001f, 0x10006720,
1738c9130c6SFan Chen 	0x8203a001, 0x82239408, 0xd8205328, 0x17c07c1f, 0xa1538405, 0x1a10001f,
1748c9130c6SFan Chen 	0x10006b00, 0x8108a001, 0xd8205e84, 0x17c07c1f, 0x1910001f, 0x1000660c,
1758c9130c6SFan Chen 	0x1a10001f, 0x10006610, 0xa2002004, 0x89000008, 0x00001e00, 0xd8005944,
1768c9130c6SFan Chen 	0x17c07c1f, 0x82042001, 0xd8205948, 0x17c07c1f, 0x1900001f, 0x1020002c,
1778c9130c6SFan Chen 	0x1a10001f, 0x1020002c, 0xaa000008, 0x00000010, 0xe1000008, 0x1910001f,
1788c9130c6SFan Chen 	0x10006720, 0x820c1001, 0xd8205628, 0x17c07c1f, 0x1900001f, 0x10001250,
1798c9130c6SFan Chen 	0x1a10001f, 0x10001250, 0xa2110408, 0xe1000008, 0x1b80001f, 0x20000080,
1808c9130c6SFan Chen 	0x1900001f, 0x10001220, 0x1a10001f, 0x10001220, 0xa21e8408, 0xe1000008,
1818c9130c6SFan Chen 	0x1b80001f, 0x20000080, 0x1a40001f, 0x10006208, 0xc24024e0, 0x17c07c1f,
1828c9130c6SFan Chen 	0x1a10001f, 0x10006610, 0x82042001, 0xd8005e88, 0x17c07c1f, 0x1a10001f,
1838c9130c6SFan Chen 	0x10006918, 0x8a000008, 0x00000f0f, 0xba00010c, 0x1fffe7ff, 0xd8205e88,
1848c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x10006208, 0xc24022a0, 0x17c07c1f, 0x1900001f,
1858c9130c6SFan Chen 	0x10001250, 0x1a10001f, 0x10001250, 0x8a000008, 0xfffffffb, 0xe1000008,
186bb99828dSFan Chen 	0x1b80001f, 0x20000080, 0x1900001f, 0x10001220, 0x1a10001f, 0x10001220,
1878c9130c6SFan Chen 	0x8a000008, 0xdfffffff, 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f,
1888c9130c6SFan Chen 	0x1020002c, 0x1a10001f, 0x1020002c, 0x8a000008, 0xffffffef, 0xe1000008,
1898c9130c6SFan Chen 	0x1a10001f, 0x10006b00, 0x81082001, 0xd8205fa4, 0x17c07c1f, 0x1a40001f,
1908c9130c6SFan Chen 	0x100062b0, 0xc2402f20, 0x17c07c1f, 0x1b80001f, 0x20000208, 0xd8207b8c,
1918c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x100062b0, 0xc2403700, 0x17c07c1f, 0x81001401,
1928c9130c6SFan Chen 	0xd8206424, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81002001, 0xb1042081,
1938c9130c6SFan Chen 	0xb900008c, 0x1fffe7ff, 0xd8206424, 0x17c07c1f, 0x1a40001f, 0x10006200,
1948c9130c6SFan Chen 	0x1a80001f, 0x1000625c, 0xc24026e0, 0x17c07c1f, 0x89400005, 0xfffffffe,
195bb99828dSFan Chen 	0xe8208000, 0x10006f00, 0x00000000, 0xe8208000, 0x10006b30, 0x00000000,
1968c9130c6SFan Chen 	0xe8208000, 0x100063e0, 0x00000001, 0x81009401, 0xd82067a4, 0x17c07c1f,
197bb99828dSFan Chen 	0x1a10001f, 0x10006918, 0x8100a001, 0xb104a081, 0xb900008c, 0x01000001,
1988c9130c6SFan Chen 	0xd82067a4, 0x17c07c1f, 0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264,
1998c9130c6SFan Chen 	0xc24026e0, 0x17c07c1f, 0x89400005, 0xfffffffd, 0xe8208000, 0x10006f04,
200bb99828dSFan Chen 	0x00000000, 0xe8208000, 0x10006b34, 0x00000000, 0xe8208000, 0x100063e0,
2018c9130c6SFan Chen 	0x00000002, 0x81011401, 0xd8206b24, 0x17c07c1f, 0x1a10001f, 0x10006918,
2028c9130c6SFan Chen 	0x81012001, 0xb1052081, 0xb900008c, 0x01000001, 0xd8206b24, 0x17c07c1f,
2038c9130c6SFan Chen 	0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 0xc24026e0, 0x17c07c1f,
204bb99828dSFan Chen 	0x89400005, 0xfffffffb, 0xe8208000, 0x10006f08, 0x00000000, 0xe8208000,
205bb99828dSFan Chen 	0x10006b38, 0x00000000, 0xe8208000, 0x100063e0, 0x00000004, 0x81019401,
2068c9130c6SFan Chen 	0xd8206ea4, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8101a001, 0xb105a081,
2078c9130c6SFan Chen 	0xb900008c, 0x01000001, 0xd8206ea4, 0x17c07c1f, 0x1a40001f, 0x10006220,
2088c9130c6SFan Chen 	0x1a80001f, 0x10006274, 0xc24026e0, 0x17c07c1f, 0x89400005, 0xfffffff7,
209bb99828dSFan Chen 	0xe8208000, 0x10006f0c, 0x00000000, 0xe8208000, 0x10006b3c, 0x00000000,
2108c9130c6SFan Chen 	0xe8208000, 0x100063e0, 0x00000008, 0x1a10001f, 0x10006610, 0x8207a001,
2118c9130c6SFan Chen 	0xd8207608, 0x17c07c1f, 0x81021401, 0xd82072a4, 0x17c07c1f, 0x1a10001f,
2128c9130c6SFan Chen 	0x10006918, 0x81022001, 0xb1062081, 0xb900008c, 0x01000001, 0xd82072a4,
2138c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f, 0xc2402a60, 0x17c07c1f,
214bb99828dSFan Chen 	0x89400005, 0xffffffef, 0xe8208000, 0x10006f10, 0x00000000, 0xe8208000,
215bb99828dSFan Chen 	0x10006b40, 0x00000000, 0xe8208000, 0x100063e0, 0x00000010, 0x81029401,
2168c9130c6SFan Chen 	0xd8207604, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8102a001, 0xb106a081,
2178c9130c6SFan Chen 	0xb900008c, 0x01000001, 0xd8207604, 0x17c07c1f, 0x1a40001f, 0x100062a4,
2188c9130c6SFan Chen 	0x1290841f, 0xc2402a60, 0x17c07c1f, 0x89400005, 0xffffffdf, 0xe8208000,
219bb99828dSFan Chen 	0x10006f14, 0x00000000, 0xe8208000, 0x10006b44, 0x00000000, 0xe8208000,
2208c9130c6SFan Chen 	0x100063e0, 0x00000020, 0x81031401, 0xd82078c4, 0x17c07c1f, 0x1a10001f,
2218c9130c6SFan Chen 	0x10006918, 0x81032001, 0xb1072081, 0xb900008c, 0x01000001, 0xd82078c4,
222bb99828dSFan Chen 	0x17c07c1f, 0x89400005, 0xffffffbf, 0xe8208000, 0x10006f18, 0x00000000,
223bb99828dSFan Chen 	0xe8208000, 0x10006b48, 0x00000000, 0xe8208000, 0x100063e0, 0x00000040,
2248c9130c6SFan Chen 	0x81039401, 0xd8207b84, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8103a001,
2258c9130c6SFan Chen 	0xb107a081, 0xb900008c, 0x01000001, 0xd8207b84, 0x17c07c1f, 0x89400005,
226bb99828dSFan Chen 	0xffffff7f, 0xe8208000, 0x10006f1c, 0x00000000, 0xe8208000, 0x10006b4c,
2278c9130c6SFan Chen 	0x00000000, 0xe8208000, 0x100063e0, 0x00000080, 0xd00041c0, 0x17c07c1f,
228bb99828dSFan Chen 	0xe8208000, 0x10006600, 0x00000000, 0x1ac0001f, 0x55aa55aa, 0x1940001f,
229bb99828dSFan Chen 	0xaa55aa55, 0x1b80001f, 0x00001000, 0xf0000000, 0x17c07c1f
2307d116dccSCC Ma };
2317d116dccSCC Ma 
2327d116dccSCC Ma static const struct pcm_desc mcdi_pcm = {
2338c9130c6SFan Chen 	.version = "pcm_mcdi_mt8173_20160401_v1",
2347d116dccSCC Ma 	.base = mcdi_binary,
23503be4806SPaul Kocialkowski 	.size = 1001,
2367d116dccSCC Ma 	.sess = 2,
2377d116dccSCC Ma 	.replace = 0,
2387d116dccSCC Ma };
2397d116dccSCC Ma 
2407d116dccSCC Ma static struct pwr_ctrl mcdi_ctrl = {
2417d116dccSCC Ma 	.wake_src = WAKE_SRC_FOR_MCDI,
2427d116dccSCC Ma 	.wake_src_md32 = 0,
2437d116dccSCC Ma 	.wfi_op = WFI_OP_OR,
2447d116dccSCC Ma 	.mcusys_idle_mask = 1,
2457d116dccSCC Ma 	.ca7top_idle_mask = 1,
2467d116dccSCC Ma 	.ca15top_idle_mask = 1,
2477d116dccSCC Ma 	.disp_req_mask = 1,
2487d116dccSCC Ma 	.mfg_req_mask = 1,
2497d116dccSCC Ma 	.md32_req_mask = 1,
2507d116dccSCC Ma };
2517d116dccSCC Ma 
2527d116dccSCC Ma static const struct spm_lp_scen spm_mcdi = {
2537d116dccSCC Ma 	.pcmdesc = &mcdi_pcm,
2547d116dccSCC Ma 	.pwrctrl = &mcdi_ctrl,
2557d116dccSCC Ma };
2567d116dccSCC Ma 
2577d116dccSCC Ma void spm_mcdi_cpu_wake_up_event(int wake_up_event, int disable_dormant_power)
2587d116dccSCC Ma {
2597d116dccSCC Ma 	if (((mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) & 0x1) == 1)
2607d116dccSCC Ma 	    && ((mmio_read_32(SPM_CLK_CON) & CC_DISABLE_DORM_PWR) == 0)) {
2617d116dccSCC Ma 		/* MCDI is offload? */
2627d116dccSCC Ma 		INFO("%s: SPM_SLEEP_CPU_WAKEUP_EVENT:%x, SPM_CLK_CON %x",
2637d116dccSCC Ma 			__func__, mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT),
2647d116dccSCC Ma 			mmio_read_32(SPM_CLK_CON));
2657d116dccSCC Ma 		return;
2667d116dccSCC Ma 	}
2677d116dccSCC Ma 	/* Inform SPM that CPU wants to program CPU_WAKEUP_EVENT and
2687d116dccSCC Ma 	 * DISABLE_CPU_DROM */
2697d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_HANDSHAKE_SYNC);
2707d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2717d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2727d116dccSCC Ma 
2737d116dccSCC Ma 	/* Wait SPM's response, can't use sleep api */
2747d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_HANDSHAKE_ACK)
2757d116dccSCC Ma 		;
2767d116dccSCC Ma 
2777d116dccSCC Ma 	if (disable_dormant_power) {
2787d116dccSCC Ma 		mmio_setbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR);
2797d116dccSCC Ma 		while (mmio_read_32(SPM_CLK_CON) !=
2807d116dccSCC Ma 			(mmio_read_32(SPM_CLK_CON) | CC_DISABLE_DORM_PWR))
2817d116dccSCC Ma 			;
2827d116dccSCC Ma 
2837d116dccSCC Ma 	} else {
2847d116dccSCC Ma 		mmio_clrbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR);
2857d116dccSCC Ma 		while (mmio_read_32(SPM_CLK_CON) !=
2867d116dccSCC Ma 			(mmio_read_32(SPM_CLK_CON) & ~CC_DISABLE_DORM_PWR))
2877d116dccSCC Ma 			;
2887d116dccSCC Ma 	}
2897d116dccSCC Ma 
2907d116dccSCC Ma 	mmio_write_32(SPM_SLEEP_CPU_WAKEUP_EVENT, wake_up_event);
2917d116dccSCC Ma 
2927d116dccSCC Ma 	while (mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) != wake_up_event)
2937d116dccSCC Ma 		;
2947d116dccSCC Ma 
2957d116dccSCC Ma 	/* Inform SPM to see updated setting */
2967d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_UPDATE_INFORM);
2977d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2987d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2997d116dccSCC Ma 
3007d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_CKECK_DONE)
3017d116dccSCC Ma 		;
3027d116dccSCC Ma 	/* END OF sequence */
3037d116dccSCC Ma 
3047d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, 0x0);
3057d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
3067d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
3077d116dccSCC Ma }
3087d116dccSCC Ma 
3097d116dccSCC Ma void spm_mcdi_wakeup_all_cores(void)
3107d116dccSCC Ma {
3117d116dccSCC Ma 	if (is_mcdi_ready() == 0)
3127d116dccSCC Ma 		return;
3137d116dccSCC Ma 
3147d116dccSCC Ma 	spm_mcdi_cpu_wake_up_event(1, 1);
3157d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_ALL_CORE_AWAKE)
3167d116dccSCC Ma 		;
3177d116dccSCC Ma 	spm_mcdi_cpu_wake_up_event(1, 0);
3187d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_OFFLOADED)
3197d116dccSCC Ma 		;
3207d116dccSCC Ma 
3217d116dccSCC Ma 	spm_clean_after_wakeup();
3227d116dccSCC Ma 	clear_all_ready();
3237d116dccSCC Ma }
3247d116dccSCC Ma 
3258e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_enter(unsigned long mpidr)
3267d116dccSCC Ma {
3277d116dccSCC Ma 	int core_id_val = mpidr & MPIDR_CPU_MASK;
3287d116dccSCC Ma 	int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
3297d116dccSCC Ma 
3307d116dccSCC Ma 	/* SPM WFI Select by core number */
3317d116dccSCC Ma 	if (cluster_id) {
3327d116dccSCC Ma 		switch (core_id_val) {
3337d116dccSCC Ma 		case 0:
3347d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 1);
3357d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 1);
3367d116dccSCC Ma 			break;
3377d116dccSCC Ma 		case 1:
3387d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 1);
3397d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 1);
3407d116dccSCC Ma 			break;
3417d116dccSCC Ma 		case 2:
3427d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 1);
3437d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 1);
3447d116dccSCC Ma 			break;
3457d116dccSCC Ma 		case 3:
3467d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 1);
3477d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 1);
3487d116dccSCC Ma 			break;
3497d116dccSCC Ma 		default:
3507d116dccSCC Ma 			break;
3517d116dccSCC Ma 		}
3527d116dccSCC Ma 	} else {
3537d116dccSCC Ma 		switch (core_id_val) {
3547d116dccSCC Ma 		case 0:
3557d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 1);
3567d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 1);
3577d116dccSCC Ma 			break;
3587d116dccSCC Ma 		case 1:
3597d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 1);
3607d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 1);
3617d116dccSCC Ma 			break;
3627d116dccSCC Ma 		case 2:
3637d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 1);
3647d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 1);
3657d116dccSCC Ma 			break;
3667d116dccSCC Ma 		case 3:
3677d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 1);
3687d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 1);
3697d116dccSCC Ma 			break;
3707d116dccSCC Ma 		default:
3717d116dccSCC Ma 			break;
3727d116dccSCC Ma 		}
3737d116dccSCC Ma 	}
3747d116dccSCC Ma }
3757d116dccSCC Ma 
3768e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_leave(unsigned long mpidr)
3777d116dccSCC Ma {
3787d116dccSCC Ma 	int core_id_val = mpidr & MPIDR_CPU_MASK;
3797d116dccSCC Ma 	int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
3807d116dccSCC Ma 
3817d116dccSCC Ma 	/* SPM WFI Select by core number */
3827d116dccSCC Ma 	if (cluster_id) {
3837d116dccSCC Ma 		switch (core_id_val) {
3847d116dccSCC Ma 		case 0:
3857d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 0);
3867d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 0);
3877d116dccSCC Ma 			break;
3887d116dccSCC Ma 		case 1:
3897d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 0);
3907d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 0);
3917d116dccSCC Ma 			break;
3927d116dccSCC Ma 		case 2:
3937d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 0);
3947d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 0);
3957d116dccSCC Ma 			break;
3967d116dccSCC Ma 		case 3:
3977d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 0);
3987d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 0);
3997d116dccSCC Ma 			break;
4007d116dccSCC Ma 		default:
4017d116dccSCC Ma 			break;
4027d116dccSCC Ma 		}
4037d116dccSCC Ma 	} else {
4047d116dccSCC Ma 		switch (core_id_val) {
4057d116dccSCC Ma 		case 0:
4067d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 0);
4077d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 0);
4087d116dccSCC Ma 			break;
4097d116dccSCC Ma 		case 1:
4107d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 0);
4117d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 0);
4127d116dccSCC Ma 			break;
4137d116dccSCC Ma 		case 2:
4147d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 0);
4157d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 0);
4167d116dccSCC Ma 			break;
4177d116dccSCC Ma 		case 3:
4187d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 0);
4197d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 0);
4207d116dccSCC Ma 			break;
4217d116dccSCC Ma 		default:
4227d116dccSCC Ma 			break;
4237d116dccSCC Ma 		}
4247d116dccSCC Ma 	}
4257d116dccSCC Ma }
4267d116dccSCC Ma 
4278e53ec53SJimmy Huang static void spm_mcdi_set_cputop_pwrctrl_for_cluster_off(unsigned long mpidr)
4288e53ec53SJimmy Huang {
4298e53ec53SJimmy Huang 	unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK;
4308e53ec53SJimmy Huang 	unsigned long cpu_id = mpidr & MPIDR_CPU_MASK;
4318e53ec53SJimmy Huang 	unsigned int pwr_status, shift, i, flag = 0;
4328e53ec53SJimmy Huang 
4338e53ec53SJimmy Huang 	pwr_status = mmio_read_32(SPM_PWR_STATUS) |
4348e53ec53SJimmy Huang 				 mmio_read_32(SPM_PWR_STATUS_2ND);
4358e53ec53SJimmy Huang 
4368e53ec53SJimmy Huang 	if (cluster_id) {
4378e53ec53SJimmy Huang 		for (i = 0; i < PLATFORM_CLUSTER1_CORE_COUNT; i++) {
4388e53ec53SJimmy Huang 			if (i == cpu_id)
4398e53ec53SJimmy Huang 				continue;
4408e53ec53SJimmy Huang 			shift = i + PCM_MCDI_CA72_PWRSTA_SHIFT;
4418e53ec53SJimmy Huang 			flag |= (pwr_status & (1 << shift)) >> shift;
4428e53ec53SJimmy Huang 		}
4438e53ec53SJimmy Huang 		if (!flag)
4448e53ec53SJimmy Huang 			mmio_setbits_32(SPM_PCM_RESERVE,
4458e53ec53SJimmy Huang 					PCM_MCDI_CA72_CPUTOP_PWRCTL);
4468e53ec53SJimmy Huang 	} else {
4478e53ec53SJimmy Huang 		for (i = 0; i < PLATFORM_CLUSTER0_CORE_COUNT; i++) {
4488e53ec53SJimmy Huang 			if (i == cpu_id)
4498e53ec53SJimmy Huang 				continue;
4508e53ec53SJimmy Huang 			shift = i + PCM_MCDI_CA53_PWRSTA_SHIFT;
4518e53ec53SJimmy Huang 			flag |= (pwr_status & (1 << shift)) >> shift;
4528e53ec53SJimmy Huang 		}
4538e53ec53SJimmy Huang 		if (!flag)
4548e53ec53SJimmy Huang 			mmio_setbits_32(SPM_PCM_RESERVE,
4558e53ec53SJimmy Huang 					PCM_MCDI_CA53_CPUTOP_PWRCTL);
4568e53ec53SJimmy Huang 	}
4578e53ec53SJimmy Huang }
4588e53ec53SJimmy Huang 
4598e53ec53SJimmy Huang static void spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(unsigned long mpidr)
4608e53ec53SJimmy Huang {
4618e53ec53SJimmy Huang 	unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK;
4628e53ec53SJimmy Huang 
4638e53ec53SJimmy Huang 	if (cluster_id)
4648e53ec53SJimmy Huang 		mmio_clrbits_32(SPM_PCM_RESERVE,
4658e53ec53SJimmy Huang 				PCM_MCDI_CA72_CPUTOP_PWRCTL);
4668e53ec53SJimmy Huang 	else
4678e53ec53SJimmy Huang 		mmio_clrbits_32(SPM_PCM_RESERVE,
4688e53ec53SJimmy Huang 				PCM_MCDI_CA53_CPUTOP_PWRCTL);
4698e53ec53SJimmy Huang }
4708e53ec53SJimmy Huang 
4711a1ff8b9SJimmy Huang void spm_mcdi_prepare_for_mtcmos(void)
4721a1ff8b9SJimmy Huang {
4731a1ff8b9SJimmy Huang 	const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc;
4741a1ff8b9SJimmy Huang 	struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl;
4751a1ff8b9SJimmy Huang 
4761a1ff8b9SJimmy Huang 	if (is_mcdi_ready() == 0) {
4771a1ff8b9SJimmy Huang 		if (is_hotplug_ready() == 1)
4781a1ff8b9SJimmy Huang 			spm_clear_hotplug();
4791a1ff8b9SJimmy Huang 		set_pwrctrl_pcm_flags(pwrctrl, 0);
4801a1ff8b9SJimmy Huang 		spm_reset_and_init_pcm();
4811a1ff8b9SJimmy Huang 		spm_kick_im_to_fetch(pcmdesc);
4821a1ff8b9SJimmy Huang 		spm_set_power_control(pwrctrl);
4831a1ff8b9SJimmy Huang 		spm_set_wakeup_event(pwrctrl);
4841a1ff8b9SJimmy Huang 		spm_kick_pcm_to_run(pwrctrl);
4851a1ff8b9SJimmy Huang 		set_mcdi_ready();
4861a1ff8b9SJimmy Huang 	}
4871a1ff8b9SJimmy Huang }
4881a1ff8b9SJimmy Huang 
4898e53ec53SJimmy Huang void spm_mcdi_prepare_for_off_state(unsigned long mpidr, unsigned int afflvl)
4907d116dccSCC Ma {
4917d116dccSCC Ma 	const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc;
4927d116dccSCC Ma 	struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl;
4937d116dccSCC Ma 
4947d116dccSCC Ma 	spm_lock_get();
4957d116dccSCC Ma 	if (is_mcdi_ready() == 0) {
4967d116dccSCC Ma 		if (is_hotplug_ready() == 1)
4977d116dccSCC Ma 			spm_clear_hotplug();
4987d116dccSCC Ma 		set_pwrctrl_pcm_flags(pwrctrl, 0);
4997d116dccSCC Ma 		spm_reset_and_init_pcm();
5007d116dccSCC Ma 		spm_kick_im_to_fetch(pcmdesc);
5017d116dccSCC Ma 		spm_set_power_control(pwrctrl);
5027d116dccSCC Ma 		spm_set_wakeup_event(pwrctrl);
5037d116dccSCC Ma 		spm_kick_pcm_to_run(pwrctrl);
5047d116dccSCC Ma 		set_mcdi_ready();
5057d116dccSCC Ma 	}
5067d116dccSCC Ma 	spm_mcdi_wfi_sel_enter(mpidr);
5078e53ec53SJimmy Huang 	if (afflvl == MPIDR_AFFLVL1)
5088e53ec53SJimmy Huang 		spm_mcdi_set_cputop_pwrctrl_for_cluster_off(mpidr);
5097d116dccSCC Ma 	spm_lock_release();
5107d116dccSCC Ma }
5117d116dccSCC Ma 
5128e53ec53SJimmy Huang void spm_mcdi_finish_for_on_state(unsigned long mpidr, unsigned int afflvl)
5137d116dccSCC Ma {
514*201d535fSKoan-Sin Tan 	unsigned long linear_id;
515*201d535fSKoan-Sin Tan 
516*201d535fSKoan-Sin Tan 	linear_id = ((mpidr & MPIDR_CLUSTER_MASK) >> 6) |
517*201d535fSKoan-Sin Tan 			(mpidr & MPIDR_CPU_MASK);
5187d116dccSCC Ma 
5197d116dccSCC Ma 	spm_lock_get();
5208e53ec53SJimmy Huang 	spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(mpidr);
5217d116dccSCC Ma 	spm_mcdi_wfi_sel_leave(mpidr);
5227d116dccSCC Ma 	mmio_write_32(SPM_PCM_SW_INT_CLEAR, (0x1 << linear_id));
5237d116dccSCC Ma 	spm_lock_release();
5247d116dccSCC Ma }
525