xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_mcdi.c (revision 9a207532f8216bf83fed0891fed9ed0bc72ca450)
17d116dccSCC Ma /*
27d116dccSCC Ma  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
57d116dccSCC Ma  */
6*09d40e0eSAntonio Nino Diaz 
77d116dccSCC Ma #include <platform_def.h>
8*09d40e0eSAntonio Nino Diaz 
9*09d40e0eSAntonio Nino Diaz #include <arch.h>
10*09d40e0eSAntonio Nino Diaz #include <common/debug.h>
11*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
12*09d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
13*09d40e0eSAntonio Nino Diaz 
14*09d40e0eSAntonio Nino Diaz #include <mt8173_def.h>
157d116dccSCC Ma #include <spm.h>
167d116dccSCC Ma #include <spm_hotplug.h>
177d116dccSCC Ma #include <spm_mcdi.h>
187d116dccSCC Ma 
197d116dccSCC Ma /*
207d116dccSCC Ma  * System Power Manager (SPM) is a hardware module, which controls cpu or
217d116dccSCC Ma  * system power for different power scenarios using different firmware.
227d116dccSCC Ma  * This driver controls the cpu power in cpu idle power saving state.
237d116dccSCC Ma  */
247d116dccSCC Ma 
2544c49087SWeiyi Lu #define WAKE_SRC_FOR_MCDI \
2644c49087SWeiyi Lu 	(WAKE_SRC_KP | WAKE_SRC_GPT | WAKE_SRC_EINT |		\
2744c49087SWeiyi Lu 	 WAKE_SRC_MD32 | WAKE_SRC_USB_CD | WAKE_SRC_USB_PDN |	\
2844c49087SWeiyi Lu 	 WAKE_SRC_AFE | WAKE_SRC_THERM | WAKE_SRC_CIRQ |	\
2944c49087SWeiyi Lu 	 WAKE_SRC_SYSPWREQ | WAKE_SRC_CPU_IRQ)
307d116dccSCC Ma #define PCM_MCDI_HANDSHAKE_SYNC	0xbeefbeef
317d116dccSCC Ma #define PCM_MCDI_HANDSHAKE_ACK	0xdeaddead
327d116dccSCC Ma #define PCM_MCDI_UPDATE_INFORM	0xabcdabcd
337d116dccSCC Ma #define PCM_MCDI_CKECK_DONE	0x12345678
347d116dccSCC Ma #define PCM_MCDI_ALL_CORE_AWAKE	0x0
357d116dccSCC Ma #define PCM_MCDI_OFFLOADED	0xaa55aa55
368e53ec53SJimmy Huang #define PCM_MCDI_CA72_CPUTOP_PWRCTL	(0x1 << 16)
378e53ec53SJimmy Huang #define PCM_MCDI_CA53_CPUTOP_PWRCTL	(0x1 << 17)
388e53ec53SJimmy Huang #define PCM_MCDI_CA72_PWRSTA_SHIFT	16
398e53ec53SJimmy Huang #define PCM_MCDI_CA53_PWRSTA_SHIFT	9
407d116dccSCC Ma 
417d116dccSCC Ma static const unsigned int mcdi_binary[] = {
421a1ff8b9SJimmy Huang 	0x1a10001f, 0x10006b04, 0x1890001f, 0x10006b6c, 0x1a40001f, 0x10006210,
4344c49087SWeiyi Lu 	0x18d0001f, 0x10006210, 0x81002001, 0xd82001c4, 0x17c07c1f, 0xa0900402,
448c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x81052001, 0xd8200284, 0x17c07c1f, 0xa0950402,
458c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x10006230, 0x18d0001f, 0x10006230,
468c9130c6SFan Chen 	0x8100a001, 0xd82003c4, 0x17c07c1f, 0xa0908402, 0xc2401540, 0x17c07c1f,
478c9130c6SFan Chen 	0x8105a001, 0xd8200484, 0x17c07c1f, 0xa0958402, 0xc2401b80, 0x17c07c1f,
4844c49087SWeiyi Lu 	0x1a40001f, 0x10006238, 0x18d0001f, 0x10006238, 0x81012001, 0xd82005c4,
498c9130c6SFan Chen 	0x17c07c1f, 0xa0910402, 0xc2401540, 0x17c07c1f, 0x81062001, 0xd8200684,
508c9130c6SFan Chen 	0x17c07c1f, 0xa0960402, 0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x1000623c,
5144c49087SWeiyi Lu 	0x18d0001f, 0x1000623c, 0x8101a001, 0xd82007c4, 0x17c07c1f, 0xa0918402,
528c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x8106a001, 0xd8200884, 0x17c07c1f, 0xa0968402,
538c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x10006298, 0x18d0001f, 0x10006298,
548c9130c6SFan Chen 	0x81022001, 0xd82009c4, 0x17c07c1f, 0xa0920402, 0xc2401540, 0x17c07c1f,
558c9130c6SFan Chen 	0x81072001, 0xd8200a84, 0x17c07c1f, 0xa0970402, 0xc2401b80, 0x17c07c1f,
5644c49087SWeiyi Lu 	0x1a40001f, 0x1000629c, 0x18d0001f, 0x1000629c, 0x8102a001, 0xd8200bc4,
578c9130c6SFan Chen 	0x17c07c1f, 0xa0928402, 0xc2401540, 0x17c07c1f, 0x8107a001, 0xd8200c84,
588c9130c6SFan Chen 	0x17c07c1f, 0xa0978402, 0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x100062c4,
5944c49087SWeiyi Lu 	0x18d0001f, 0x100062c4, 0x81032001, 0xd8200dc4, 0x17c07c1f, 0xa0930402,
608c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x81082001, 0xd8200e84, 0x17c07c1f, 0xa0980402,
618c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x100062c0, 0x18d0001f, 0x100062c0,
628c9130c6SFan Chen 	0x8103a001, 0xd8200fc4, 0x17c07c1f, 0xa0938402, 0xc2401540, 0x17c07c1f,
638c9130c6SFan Chen 	0x8108a001, 0xd8201084, 0x17c07c1f, 0xa0988402, 0xc2401b80, 0x17c07c1f,
6444c49087SWeiyi Lu 	0x1a40001f, 0x10006214, 0x18d0001f, 0x10006214, 0x81042001, 0xd82011c4,
658c9130c6SFan Chen 	0x17c07c1f, 0xa0940402, 0xc2401540, 0x17c07c1f, 0x81092001, 0xd8201284,
668c9130c6SFan Chen 	0x17c07c1f, 0xa0990402, 0xc2401b80, 0x17c07c1f, 0x1a40001f, 0x100062cc,
6744c49087SWeiyi Lu 	0x18d0001f, 0x100062cc, 0x8104a001, 0xd82013c4, 0x17c07c1f, 0xa0948402,
688c9130c6SFan Chen 	0xc2401540, 0x17c07c1f, 0x8109a001, 0xd8201484, 0x17c07c1f, 0xa0998402,
698c9130c6SFan Chen 	0xc2401b80, 0x17c07c1f, 0x1900001f, 0x10006b6c, 0x80802002, 0xe1000002,
708c9130c6SFan Chen 	0xf0000000, 0x17c07c1f, 0xa8c00003, 0x00000004, 0xe2400003, 0xa8c00003,
718c9130c6SFan Chen 	0x00000008, 0xe2400003, 0x1b80001f, 0x00000020, 0x88c00003, 0xffffffef,
728c9130c6SFan Chen 	0xe2400003, 0x88c00003, 0xfffffffd, 0xe2400003, 0xa8c00003, 0x00000001,
738c9130c6SFan Chen 	0xe2400003, 0x88c00003, 0xfffff0ff, 0xe2400003, 0x1b80001f, 0x20000080,
748c9130c6SFan Chen 	0x1a90001f, 0x10001220, 0x69200009, 0x1000623c, 0xd8001984, 0x17c07c1f,
758c9130c6SFan Chen 	0x69200009, 0x10006214, 0xd8001a64, 0x17c07c1f, 0xd0001b00, 0x17c07c1f,
768c9130c6SFan Chen 	0x1900001f, 0x10001220, 0x8a80000a, 0xfffffff9, 0xe100000a, 0xd0001b00,
778c9130c6SFan Chen 	0x17c07c1f, 0x1900001f, 0x10001220, 0x8a80000a, 0xff1fbfff, 0xe100000a,
788c9130c6SFan Chen 	0x1b80001f, 0x20000080, 0xf0000000, 0x17c07c1f, 0x1a90001f, 0x10001220,
798c9130c6SFan Chen 	0x69200009, 0x1000623c, 0xd8001d04, 0x17c07c1f, 0x69200009, 0x10006214,
808c9130c6SFan Chen 	0xd8001de4, 0x17c07c1f, 0xd0001e80, 0x17c07c1f, 0x1900001f, 0x10001220,
818c9130c6SFan Chen 	0xaa80000a, 0x00000006, 0xe100000a, 0xd0001e80, 0x17c07c1f, 0x1900001f,
828c9130c6SFan Chen 	0x10001220, 0xaa80000a, 0x00e04000, 0xe100000a, 0x1b80001f, 0x20000080,
838c9130c6SFan Chen 	0x69200009, 0x10006214, 0xd8001fe4, 0x17c07c1f, 0xa8c00003, 0x00000f00,
848c9130c6SFan Chen 	0xe2400003, 0xd0002040, 0x17c07c1f, 0xa8c00003, 0x00003f00, 0xe2400003,
858c9130c6SFan Chen 	0x1b80001f, 0x20000080, 0xa8c00003, 0x00000002, 0xe2400003, 0x88c00003,
868c9130c6SFan Chen 	0xfffffffe, 0xe2400003, 0xa8c00003, 0x00000010, 0xe2400003, 0x88c00003,
878c9130c6SFan Chen 	0xfffffffb, 0xe2400003, 0x88c00003, 0xfffffff7, 0xe2400003, 0xf0000000,
888c9130c6SFan Chen 	0x17c07c1f, 0xe2e00036, 0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c,
898c9130c6SFan Chen 	0xe8208000, 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xe2e0007c,
908c9130c6SFan Chen 	0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d, 0xf0000000,
918c9130c6SFan Chen 	0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f, 0xe8208000, 0x10006244,
928c9130c6SFan Chen 	0x00000001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e0003a,
938c9130c6SFan Chen 	0xe2e00032, 0x1b80001f, 0x00000020, 0xf0000000, 0x17c07c1f, 0xe2e00036,
9444c49087SWeiyi Lu 	0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c, 0xe2a00000, 0x1b80001f,
9544c49087SWeiyi Lu 	0x20000080, 0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c,
9644c49087SWeiyi Lu 	0xe2e0004d, 0xf0000000, 0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f,
9744c49087SWeiyi Lu 	0xe2a00001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e0003a,
9844c49087SWeiyi Lu 	0xe2e00032, 0xf0000000, 0x17c07c1f, 0xe2e00026, 0xe2e0002e, 0x1b80001f,
9944c49087SWeiyi Lu 	0x00000020, 0x1a00001f, 0x100062b4, 0x1910001f, 0x100062b4, 0x81322804,
10044c49087SWeiyi Lu 	0xe2000004, 0x81202804, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0000e,
10144c49087SWeiyi Lu 	0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f, 0xe2e0002d, 0x1a00001f,
10244c49087SWeiyi Lu 	0x100062b4, 0x1910001f, 0x100062b4, 0xa1002804, 0xe2000004, 0xa1122804,
10344c49087SWeiyi Lu 	0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0002f, 0xe2e0002b, 0xe2e00023,
1048c9130c6SFan Chen 	0x1b80001f, 0x00000020, 0xe2e00022, 0xf0000000, 0x17c07c1f, 0x1910001f,
1058c9130c6SFan Chen 	0x1000660c, 0x1a10001f, 0x10006610, 0xa2002004, 0x89000008, 0x00030000,
1068c9130c6SFan Chen 	0xd80036c4, 0x17c07c1f, 0x8207a001, 0xd82036c8, 0x17c07c1f, 0x1900001f,
10744c49087SWeiyi Lu 	0x1020020c, 0x1a10001f, 0x1020020c, 0xaa000008, 0x00000001, 0xe1000008,
1088c9130c6SFan Chen 	0x1910001f, 0x1020020c, 0x81001001, 0xd8203184, 0x17c07c1f, 0x1910001f,
1098c9130c6SFan Chen 	0x10006720, 0x820c9001, 0xd8203228, 0x17c07c1f, 0x1900001f, 0x10001220,
1108c9130c6SFan Chen 	0x1a10001f, 0x10001220, 0xa21f0408, 0xe1000008, 0x1b80001f, 0x20000080,
1118c9130c6SFan Chen 	0xe2e0006d, 0xe2e0002d, 0x1a00001f, 0x100062b8, 0x1910001f, 0x100062b8,
1128c9130c6SFan Chen 	0xa9000004, 0x00000001, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0002c,
1138c9130c6SFan Chen 	0xe2e0003c, 0xe2e0003e, 0xe2e0003a, 0xe2e00032, 0x1b80001f, 0x00000020,
1148c9130c6SFan Chen 	0x1900001f, 0x10006404, 0x1a10001f, 0x10006404, 0xa2168408, 0xe1000008,
1158c9130c6SFan Chen 	0xf0000000, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x8207a001, 0xd8003e68,
1168c9130c6SFan Chen 	0x17c07c1f, 0x1a10001f, 0x10006918, 0x8a000008, 0x00003030, 0xb900010c,
1178c9130c6SFan Chen 	0x01000001, 0xd8203e64, 0x17c07c1f, 0x1900001f, 0x10006404, 0x1a10001f,
1188c9130c6SFan Chen 	0x10006404, 0x8a000008, 0x0000dfff, 0xe1000008, 0xe2e00036, 0xe2e0003e,
1198c9130c6SFan Chen 	0x1b80001f, 0x00000020, 0xe2e0002e, 0x1a00001f, 0x100062b8, 0x1910001f,
1208c9130c6SFan Chen 	0x100062b8, 0x89000004, 0x0000fffe, 0xe2000004, 0x1b80001f, 0x20000080,
1218c9130c6SFan Chen 	0xe2e0006e, 0xe2e0004e, 0xe2e0004c, 0xe2e0004d, 0x1900001f, 0x10001220,
1228c9130c6SFan Chen 	0x1a10001f, 0x10001220, 0x8a000008, 0xbfffffff, 0xe1000008, 0x1b80001f,
1238c9130c6SFan Chen 	0x20000080, 0x1900001f, 0x1020020c, 0x1a10001f, 0x1020020c, 0x8a000008,
1248c9130c6SFan Chen 	0xfffffffe, 0xe1000008, 0x1910001f, 0x1020020c, 0x81001001, 0xd8003dc4,
1258c9130c6SFan Chen 	0x17c07c1f, 0xf0000000, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1267d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1277d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0x11407c1f, 0xe8208000,
1288c9130c6SFan Chen 	0x10006310, 0x0b160008, 0x1900001f, 0x000f7bde, 0x1a00001f, 0x10200268,
1298c9130c6SFan Chen 	0xe2000004, 0xe8208000, 0x10006600, 0x00000000, 0x69200006, 0xbeefbeef,
1308c9130c6SFan Chen 	0xd8204584, 0x17c07c1f, 0x1910001f, 0x10006358, 0x810b1001, 0xd8004244,
1318c9130c6SFan Chen 	0x17c07c1f, 0x1980001f, 0xdeaddead, 0x69200006, 0xabcdabcd, 0xd8204324,
1328c9130c6SFan Chen 	0x17c07c1f, 0x88900001, 0x10006814, 0x1910001f, 0x10006400, 0x81271002,
1338c9130c6SFan Chen 	0x1880001f, 0x10006600, 0xe0800004, 0x1910001f, 0x10006358, 0x810b1001,
1348c9130c6SFan Chen 	0xd80044a4, 0x17c07c1f, 0x1980001f, 0x12345678, 0x60a07c05, 0x89100002,
1358c9130c6SFan Chen 	0x10006600, 0x80801001, 0xd8007bc2, 0x17c07c1f, 0x1890001f, 0x10006b00,
1368c9130c6SFan Chen 	0x82090801, 0xc8800008, 0x17c07c1f, 0x1b00001f, 0x3fffe7ff, 0x8a00000c,
1378c9130c6SFan Chen 	0x3fffe7ff, 0xd82041c8, 0x17c07c1f, 0x1b80001f, 0xd0010000, 0x1a10001f,
1388c9130c6SFan Chen 	0x10006720, 0x82002001, 0x82201408, 0xd8204988, 0x17c07c1f, 0x1a40001f,
1398c9130c6SFan Chen 	0x10006200, 0x1a80001f, 0x1000625c, 0xc24028e0, 0x17c07c1f, 0xa1400405,
1408c9130c6SFan Chen 	0x1a10001f, 0x10006720, 0x8200a001, 0x82209408, 0xd8204b28, 0x17c07c1f,
1418c9130c6SFan Chen 	0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264, 0xc24028e0, 0x17c07c1f,
1428c9130c6SFan Chen 	0xa1508405, 0x1a10001f, 0x10006720, 0x82012001, 0x82211408, 0xd8204cc8,
1438c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 0xc24028e0,
1448c9130c6SFan Chen 	0x17c07c1f, 0xa1510405, 0x1a10001f, 0x10006720, 0x8201a001, 0x82219408,
1458c9130c6SFan Chen 	0xd8204e68, 0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274,
1468c9130c6SFan Chen 	0xc24028e0, 0x17c07c1f, 0xa1518405, 0x1a10001f, 0x10006720, 0x82022001,
1478c9130c6SFan Chen 	0x82221408, 0xd8204fe8, 0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f,
1488c9130c6SFan Chen 	0xc2402cc0, 0x17c07c1f, 0xa1520405, 0x1a10001f, 0x10006720, 0x8202a001,
1498c9130c6SFan Chen 	0x82229408, 0xd8205168, 0x17c07c1f, 0x1a40001f, 0x100062a4, 0x1290841f,
1508c9130c6SFan Chen 	0xc2402cc0, 0x17c07c1f, 0xa1528405, 0x1a10001f, 0x10006720, 0x82032001,
1518c9130c6SFan Chen 	0x82231408, 0xd8205248, 0x17c07c1f, 0xa1530405, 0x1a10001f, 0x10006720,
1528c9130c6SFan Chen 	0x8203a001, 0x82239408, 0xd8205328, 0x17c07c1f, 0xa1538405, 0x1a10001f,
1538c9130c6SFan Chen 	0x10006b00, 0x8108a001, 0xd8205e84, 0x17c07c1f, 0x1910001f, 0x1000660c,
1548c9130c6SFan Chen 	0x1a10001f, 0x10006610, 0xa2002004, 0x89000008, 0x00001e00, 0xd8005944,
1558c9130c6SFan Chen 	0x17c07c1f, 0x82042001, 0xd8205948, 0x17c07c1f, 0x1900001f, 0x1020002c,
1568c9130c6SFan Chen 	0x1a10001f, 0x1020002c, 0xaa000008, 0x00000010, 0xe1000008, 0x1910001f,
1578c9130c6SFan Chen 	0x10006720, 0x820c1001, 0xd8205628, 0x17c07c1f, 0x1900001f, 0x10001250,
1588c9130c6SFan Chen 	0x1a10001f, 0x10001250, 0xa2110408, 0xe1000008, 0x1b80001f, 0x20000080,
1598c9130c6SFan Chen 	0x1900001f, 0x10001220, 0x1a10001f, 0x10001220, 0xa21e8408, 0xe1000008,
1608c9130c6SFan Chen 	0x1b80001f, 0x20000080, 0x1a40001f, 0x10006208, 0xc24024e0, 0x17c07c1f,
1618c9130c6SFan Chen 	0x1a10001f, 0x10006610, 0x82042001, 0xd8005e88, 0x17c07c1f, 0x1a10001f,
1628c9130c6SFan Chen 	0x10006918, 0x8a000008, 0x00000f0f, 0xba00010c, 0x1fffe7ff, 0xd8205e88,
1638c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x10006208, 0xc24022a0, 0x17c07c1f, 0x1900001f,
1648c9130c6SFan Chen 	0x10001250, 0x1a10001f, 0x10001250, 0x8a000008, 0xfffffffb, 0xe1000008,
165bb99828dSFan Chen 	0x1b80001f, 0x20000080, 0x1900001f, 0x10001220, 0x1a10001f, 0x10001220,
1668c9130c6SFan Chen 	0x8a000008, 0xdfffffff, 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f,
1678c9130c6SFan Chen 	0x1020002c, 0x1a10001f, 0x1020002c, 0x8a000008, 0xffffffef, 0xe1000008,
1688c9130c6SFan Chen 	0x1a10001f, 0x10006b00, 0x81082001, 0xd8205fa4, 0x17c07c1f, 0x1a40001f,
1698c9130c6SFan Chen 	0x100062b0, 0xc2402f20, 0x17c07c1f, 0x1b80001f, 0x20000208, 0xd8207b8c,
1708c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x100062b0, 0xc2403700, 0x17c07c1f, 0x81001401,
1718c9130c6SFan Chen 	0xd8206424, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81002001, 0xb1042081,
1728c9130c6SFan Chen 	0xb900008c, 0x1fffe7ff, 0xd8206424, 0x17c07c1f, 0x1a40001f, 0x10006200,
1738c9130c6SFan Chen 	0x1a80001f, 0x1000625c, 0xc24026e0, 0x17c07c1f, 0x89400005, 0xfffffffe,
174bb99828dSFan Chen 	0xe8208000, 0x10006f00, 0x00000000, 0xe8208000, 0x10006b30, 0x00000000,
1758c9130c6SFan Chen 	0xe8208000, 0x100063e0, 0x00000001, 0x81009401, 0xd82067a4, 0x17c07c1f,
176bb99828dSFan Chen 	0x1a10001f, 0x10006918, 0x8100a001, 0xb104a081, 0xb900008c, 0x01000001,
1778c9130c6SFan Chen 	0xd82067a4, 0x17c07c1f, 0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264,
1788c9130c6SFan Chen 	0xc24026e0, 0x17c07c1f, 0x89400005, 0xfffffffd, 0xe8208000, 0x10006f04,
179bb99828dSFan Chen 	0x00000000, 0xe8208000, 0x10006b34, 0x00000000, 0xe8208000, 0x100063e0,
1808c9130c6SFan Chen 	0x00000002, 0x81011401, 0xd8206b24, 0x17c07c1f, 0x1a10001f, 0x10006918,
1818c9130c6SFan Chen 	0x81012001, 0xb1052081, 0xb900008c, 0x01000001, 0xd8206b24, 0x17c07c1f,
1828c9130c6SFan Chen 	0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 0xc24026e0, 0x17c07c1f,
183bb99828dSFan Chen 	0x89400005, 0xfffffffb, 0xe8208000, 0x10006f08, 0x00000000, 0xe8208000,
184bb99828dSFan Chen 	0x10006b38, 0x00000000, 0xe8208000, 0x100063e0, 0x00000004, 0x81019401,
1858c9130c6SFan Chen 	0xd8206ea4, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8101a001, 0xb105a081,
1868c9130c6SFan Chen 	0xb900008c, 0x01000001, 0xd8206ea4, 0x17c07c1f, 0x1a40001f, 0x10006220,
1878c9130c6SFan Chen 	0x1a80001f, 0x10006274, 0xc24026e0, 0x17c07c1f, 0x89400005, 0xfffffff7,
188bb99828dSFan Chen 	0xe8208000, 0x10006f0c, 0x00000000, 0xe8208000, 0x10006b3c, 0x00000000,
1898c9130c6SFan Chen 	0xe8208000, 0x100063e0, 0x00000008, 0x1a10001f, 0x10006610, 0x8207a001,
1908c9130c6SFan Chen 	0xd8207608, 0x17c07c1f, 0x81021401, 0xd82072a4, 0x17c07c1f, 0x1a10001f,
1918c9130c6SFan Chen 	0x10006918, 0x81022001, 0xb1062081, 0xb900008c, 0x01000001, 0xd82072a4,
1928c9130c6SFan Chen 	0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f, 0xc2402a60, 0x17c07c1f,
193bb99828dSFan Chen 	0x89400005, 0xffffffef, 0xe8208000, 0x10006f10, 0x00000000, 0xe8208000,
194bb99828dSFan Chen 	0x10006b40, 0x00000000, 0xe8208000, 0x100063e0, 0x00000010, 0x81029401,
1958c9130c6SFan Chen 	0xd8207604, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8102a001, 0xb106a081,
1968c9130c6SFan Chen 	0xb900008c, 0x01000001, 0xd8207604, 0x17c07c1f, 0x1a40001f, 0x100062a4,
1978c9130c6SFan Chen 	0x1290841f, 0xc2402a60, 0x17c07c1f, 0x89400005, 0xffffffdf, 0xe8208000,
198bb99828dSFan Chen 	0x10006f14, 0x00000000, 0xe8208000, 0x10006b44, 0x00000000, 0xe8208000,
1998c9130c6SFan Chen 	0x100063e0, 0x00000020, 0x81031401, 0xd82078c4, 0x17c07c1f, 0x1a10001f,
2008c9130c6SFan Chen 	0x10006918, 0x81032001, 0xb1072081, 0xb900008c, 0x01000001, 0xd82078c4,
201bb99828dSFan Chen 	0x17c07c1f, 0x89400005, 0xffffffbf, 0xe8208000, 0x10006f18, 0x00000000,
202bb99828dSFan Chen 	0xe8208000, 0x10006b48, 0x00000000, 0xe8208000, 0x100063e0, 0x00000040,
2038c9130c6SFan Chen 	0x81039401, 0xd8207b84, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8103a001,
2048c9130c6SFan Chen 	0xb107a081, 0xb900008c, 0x01000001, 0xd8207b84, 0x17c07c1f, 0x89400005,
205bb99828dSFan Chen 	0xffffff7f, 0xe8208000, 0x10006f1c, 0x00000000, 0xe8208000, 0x10006b4c,
2068c9130c6SFan Chen 	0x00000000, 0xe8208000, 0x100063e0, 0x00000080, 0xd00041c0, 0x17c07c1f,
207bb99828dSFan Chen 	0xe8208000, 0x10006600, 0x00000000, 0x1ac0001f, 0x55aa55aa, 0x1940001f,
208bb99828dSFan Chen 	0xaa55aa55, 0x1b80001f, 0x00001000, 0xf0000000, 0x17c07c1f
2097d116dccSCC Ma };
2107d116dccSCC Ma 
2117d116dccSCC Ma static const struct pcm_desc mcdi_pcm = {
2128c9130c6SFan Chen 	.version = "pcm_mcdi_mt8173_20160401_v1",
2137d116dccSCC Ma 	.base = mcdi_binary,
21403be4806SPaul Kocialkowski 	.size = 1001,
2157d116dccSCC Ma 	.sess = 2,
2167d116dccSCC Ma 	.replace = 0,
2177d116dccSCC Ma };
2187d116dccSCC Ma 
2197d116dccSCC Ma static struct pwr_ctrl mcdi_ctrl = {
2207d116dccSCC Ma 	.wake_src = WAKE_SRC_FOR_MCDI,
2217d116dccSCC Ma 	.wake_src_md32 = 0,
2227d116dccSCC Ma 	.wfi_op = WFI_OP_OR,
2237d116dccSCC Ma 	.mcusys_idle_mask = 1,
2247d116dccSCC Ma 	.ca7top_idle_mask = 1,
2257d116dccSCC Ma 	.ca15top_idle_mask = 1,
2267d116dccSCC Ma 	.disp_req_mask = 1,
2277d116dccSCC Ma 	.mfg_req_mask = 1,
2287d116dccSCC Ma 	.md32_req_mask = 1,
2297d116dccSCC Ma };
2307d116dccSCC Ma 
2317d116dccSCC Ma static const struct spm_lp_scen spm_mcdi = {
2327d116dccSCC Ma 	.pcmdesc = &mcdi_pcm,
2337d116dccSCC Ma 	.pwrctrl = &mcdi_ctrl,
2347d116dccSCC Ma };
2357d116dccSCC Ma 
spm_mcdi_cpu_wake_up_event(int wake_up_event,int disable_dormant_power)2367d116dccSCC Ma void spm_mcdi_cpu_wake_up_event(int wake_up_event, int disable_dormant_power)
2377d116dccSCC Ma {
2387d116dccSCC Ma 	if (((mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) & 0x1) == 1)
2397d116dccSCC Ma 	    && ((mmio_read_32(SPM_CLK_CON) & CC_DISABLE_DORM_PWR) == 0)) {
2407d116dccSCC Ma 		/* MCDI is offload? */
2417d116dccSCC Ma 		INFO("%s: SPM_SLEEP_CPU_WAKEUP_EVENT:%x, SPM_CLK_CON %x",
2427d116dccSCC Ma 			__func__, mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT),
2437d116dccSCC Ma 			mmio_read_32(SPM_CLK_CON));
2447d116dccSCC Ma 		return;
2457d116dccSCC Ma 	}
2467d116dccSCC Ma 	/* Inform SPM that CPU wants to program CPU_WAKEUP_EVENT and
2477d116dccSCC Ma 	 * DISABLE_CPU_DROM */
2487d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_HANDSHAKE_SYNC);
2497d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2507d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2517d116dccSCC Ma 
2527d116dccSCC Ma 	/* Wait SPM's response, can't use sleep api */
2537d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_HANDSHAKE_ACK)
2547d116dccSCC Ma 		;
2557d116dccSCC Ma 
2567d116dccSCC Ma 	if (disable_dormant_power) {
2577d116dccSCC Ma 		mmio_setbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR);
2587d116dccSCC Ma 		while (mmio_read_32(SPM_CLK_CON) !=
2597d116dccSCC Ma 			(mmio_read_32(SPM_CLK_CON) | CC_DISABLE_DORM_PWR))
2607d116dccSCC Ma 			;
2617d116dccSCC Ma 
2627d116dccSCC Ma 	} else {
2637d116dccSCC Ma 		mmio_clrbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR);
2647d116dccSCC Ma 		while (mmio_read_32(SPM_CLK_CON) !=
2657d116dccSCC Ma 			(mmio_read_32(SPM_CLK_CON) & ~CC_DISABLE_DORM_PWR))
2667d116dccSCC Ma 			;
2677d116dccSCC Ma 	}
2687d116dccSCC Ma 
2697d116dccSCC Ma 	mmio_write_32(SPM_SLEEP_CPU_WAKEUP_EVENT, wake_up_event);
2707d116dccSCC Ma 
2717d116dccSCC Ma 	while (mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) != wake_up_event)
2727d116dccSCC Ma 		;
2737d116dccSCC Ma 
2747d116dccSCC Ma 	/* Inform SPM to see updated setting */
2757d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_UPDATE_INFORM);
2767d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2777d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2787d116dccSCC Ma 
2797d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_CKECK_DONE)
2807d116dccSCC Ma 		;
2817d116dccSCC Ma 	/* END OF sequence */
2827d116dccSCC Ma 
2837d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, 0x0);
2847d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6);
2857d116dccSCC Ma 	mmio_write_32(SPM_PCM_PWR_IO_EN, 0);
2867d116dccSCC Ma }
2877d116dccSCC Ma 
spm_mcdi_wakeup_all_cores(void)2887d116dccSCC Ma void spm_mcdi_wakeup_all_cores(void)
2897d116dccSCC Ma {
2907d116dccSCC Ma 	if (is_mcdi_ready() == 0)
2917d116dccSCC Ma 		return;
2927d116dccSCC Ma 
2937d116dccSCC Ma 	spm_mcdi_cpu_wake_up_event(1, 1);
2947d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_ALL_CORE_AWAKE)
2957d116dccSCC Ma 		;
2967d116dccSCC Ma 	spm_mcdi_cpu_wake_up_event(1, 0);
2977d116dccSCC Ma 	while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_OFFLOADED)
2987d116dccSCC Ma 		;
2997d116dccSCC Ma 
3007d116dccSCC Ma 	spm_clean_after_wakeup();
3017d116dccSCC Ma 	clear_all_ready();
3027d116dccSCC Ma }
3037d116dccSCC Ma 
spm_mcdi_wfi_sel_enter(unsigned long mpidr)3048e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_enter(unsigned long mpidr)
3057d116dccSCC Ma {
3067d116dccSCC Ma 	int core_id_val = mpidr & MPIDR_CPU_MASK;
3077d116dccSCC Ma 	int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
3087d116dccSCC Ma 
3097d116dccSCC Ma 	/* SPM WFI Select by core number */
3107d116dccSCC Ma 	if (cluster_id) {
3117d116dccSCC Ma 		switch (core_id_val) {
3127d116dccSCC Ma 		case 0:
3137d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 1);
3147d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 1);
3157d116dccSCC Ma 			break;
3167d116dccSCC Ma 		case 1:
3177d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 1);
3187d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 1);
3197d116dccSCC Ma 			break;
3207d116dccSCC Ma 		case 2:
3217d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 1);
3227d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 1);
3237d116dccSCC Ma 			break;
3247d116dccSCC Ma 		case 3:
3257d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 1);
3267d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 1);
3277d116dccSCC Ma 			break;
3287d116dccSCC Ma 		default:
3297d116dccSCC Ma 			break;
3307d116dccSCC Ma 		}
3317d116dccSCC Ma 	} else {
3327d116dccSCC Ma 		switch (core_id_val) {
3337d116dccSCC Ma 		case 0:
3347d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 1);
3357d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 1);
3367d116dccSCC Ma 			break;
3377d116dccSCC Ma 		case 1:
3387d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 1);
3397d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 1);
3407d116dccSCC Ma 			break;
3417d116dccSCC Ma 		case 2:
3427d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 1);
3437d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 1);
3447d116dccSCC Ma 			break;
3457d116dccSCC Ma 		case 3:
3467d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 1);
3477d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 1);
3487d116dccSCC Ma 			break;
3497d116dccSCC Ma 		default:
3507d116dccSCC Ma 			break;
3517d116dccSCC Ma 		}
3527d116dccSCC Ma 	}
3537d116dccSCC Ma }
3547d116dccSCC Ma 
spm_mcdi_wfi_sel_leave(unsigned long mpidr)3558e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_leave(unsigned long mpidr)
3567d116dccSCC Ma {
3577d116dccSCC Ma 	int core_id_val = mpidr & MPIDR_CPU_MASK;
3587d116dccSCC Ma 	int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS;
3597d116dccSCC Ma 
3607d116dccSCC Ma 	/* SPM WFI Select by core number */
3617d116dccSCC Ma 	if (cluster_id) {
3627d116dccSCC Ma 		switch (core_id_val) {
3637d116dccSCC Ma 		case 0:
3647d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 0);
3657d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 0);
3667d116dccSCC Ma 			break;
3677d116dccSCC Ma 		case 1:
3687d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 0);
3697d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 0);
3707d116dccSCC Ma 			break;
3717d116dccSCC Ma 		case 2:
3727d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 0);
3737d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 0);
3747d116dccSCC Ma 			break;
3757d116dccSCC Ma 		case 3:
3767d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 0);
3777d116dccSCC Ma 			mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 0);
3787d116dccSCC Ma 			break;
3797d116dccSCC Ma 		default:
3807d116dccSCC Ma 			break;
3817d116dccSCC Ma 		}
3827d116dccSCC Ma 	} else {
3837d116dccSCC Ma 		switch (core_id_val) {
3847d116dccSCC Ma 		case 0:
3857d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 0);
3867d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 0);
3877d116dccSCC Ma 			break;
3887d116dccSCC Ma 		case 1:
3897d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 0);
3907d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 0);
3917d116dccSCC Ma 			break;
3927d116dccSCC Ma 		case 2:
3937d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 0);
3947d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 0);
3957d116dccSCC Ma 			break;
3967d116dccSCC Ma 		case 3:
3977d116dccSCC Ma 			mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 0);
3987d116dccSCC Ma 			mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 0);
3997d116dccSCC Ma 			break;
4007d116dccSCC Ma 		default:
4017d116dccSCC Ma 			break;
4027d116dccSCC Ma 		}
4037d116dccSCC Ma 	}
4047d116dccSCC Ma }
4057d116dccSCC Ma 
spm_mcdi_set_cputop_pwrctrl_for_cluster_off(unsigned long mpidr)4068e53ec53SJimmy Huang static void spm_mcdi_set_cputop_pwrctrl_for_cluster_off(unsigned long mpidr)
4078e53ec53SJimmy Huang {
4088e53ec53SJimmy Huang 	unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK;
4098e53ec53SJimmy Huang 	unsigned long cpu_id = mpidr & MPIDR_CPU_MASK;
4108e53ec53SJimmy Huang 	unsigned int pwr_status, shift, i, flag = 0;
4118e53ec53SJimmy Huang 
4128e53ec53SJimmy Huang 	pwr_status = mmio_read_32(SPM_PWR_STATUS) |
4138e53ec53SJimmy Huang 				 mmio_read_32(SPM_PWR_STATUS_2ND);
4148e53ec53SJimmy Huang 
4158e53ec53SJimmy Huang 	if (cluster_id) {
4168e53ec53SJimmy Huang 		for (i = 0; i < PLATFORM_CLUSTER1_CORE_COUNT; i++) {
4178e53ec53SJimmy Huang 			if (i == cpu_id)
4188e53ec53SJimmy Huang 				continue;
4198e53ec53SJimmy Huang 			shift = i + PCM_MCDI_CA72_PWRSTA_SHIFT;
4208e53ec53SJimmy Huang 			flag |= (pwr_status & (1 << shift)) >> shift;
4218e53ec53SJimmy Huang 		}
4228e53ec53SJimmy Huang 		if (!flag)
4238e53ec53SJimmy Huang 			mmio_setbits_32(SPM_PCM_RESERVE,
4248e53ec53SJimmy Huang 					PCM_MCDI_CA72_CPUTOP_PWRCTL);
4258e53ec53SJimmy Huang 	} else {
4268e53ec53SJimmy Huang 		for (i = 0; i < PLATFORM_CLUSTER0_CORE_COUNT; i++) {
4278e53ec53SJimmy Huang 			if (i == cpu_id)
4288e53ec53SJimmy Huang 				continue;
4298e53ec53SJimmy Huang 			shift = i + PCM_MCDI_CA53_PWRSTA_SHIFT;
4308e53ec53SJimmy Huang 			flag |= (pwr_status & (1 << shift)) >> shift;
4318e53ec53SJimmy Huang 		}
4328e53ec53SJimmy Huang 		if (!flag)
4338e53ec53SJimmy Huang 			mmio_setbits_32(SPM_PCM_RESERVE,
4348e53ec53SJimmy Huang 					PCM_MCDI_CA53_CPUTOP_PWRCTL);
4358e53ec53SJimmy Huang 	}
4368e53ec53SJimmy Huang }
4378e53ec53SJimmy Huang 
spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(unsigned long mpidr)4388e53ec53SJimmy Huang static void spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(unsigned long mpidr)
4398e53ec53SJimmy Huang {
4408e53ec53SJimmy Huang 	unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK;
4418e53ec53SJimmy Huang 
4428e53ec53SJimmy Huang 	if (cluster_id)
4438e53ec53SJimmy Huang 		mmio_clrbits_32(SPM_PCM_RESERVE,
4448e53ec53SJimmy Huang 				PCM_MCDI_CA72_CPUTOP_PWRCTL);
4458e53ec53SJimmy Huang 	else
4468e53ec53SJimmy Huang 		mmio_clrbits_32(SPM_PCM_RESERVE,
4478e53ec53SJimmy Huang 				PCM_MCDI_CA53_CPUTOP_PWRCTL);
4488e53ec53SJimmy Huang }
4498e53ec53SJimmy Huang 
spm_mcdi_prepare_for_mtcmos(void)4501a1ff8b9SJimmy Huang void spm_mcdi_prepare_for_mtcmos(void)
4511a1ff8b9SJimmy Huang {
4521a1ff8b9SJimmy Huang 	const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc;
4531a1ff8b9SJimmy Huang 	struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl;
4541a1ff8b9SJimmy Huang 
4551a1ff8b9SJimmy Huang 	if (is_mcdi_ready() == 0) {
4561a1ff8b9SJimmy Huang 		if (is_hotplug_ready() == 1)
4571a1ff8b9SJimmy Huang 			spm_clear_hotplug();
4581a1ff8b9SJimmy Huang 		set_pwrctrl_pcm_flags(pwrctrl, 0);
4591a1ff8b9SJimmy Huang 		spm_reset_and_init_pcm();
4601a1ff8b9SJimmy Huang 		spm_kick_im_to_fetch(pcmdesc);
4611a1ff8b9SJimmy Huang 		spm_set_power_control(pwrctrl);
4621a1ff8b9SJimmy Huang 		spm_set_wakeup_event(pwrctrl);
4631a1ff8b9SJimmy Huang 		spm_kick_pcm_to_run(pwrctrl);
4641a1ff8b9SJimmy Huang 		set_mcdi_ready();
4651a1ff8b9SJimmy Huang 	}
4661a1ff8b9SJimmy Huang }
4671a1ff8b9SJimmy Huang 
spm_mcdi_prepare_for_off_state(unsigned long mpidr,unsigned int afflvl)4688e53ec53SJimmy Huang void spm_mcdi_prepare_for_off_state(unsigned long mpidr, unsigned int afflvl)
4697d116dccSCC Ma {
4707d116dccSCC Ma 	const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc;
4717d116dccSCC Ma 	struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl;
4727d116dccSCC Ma 
4737d116dccSCC Ma 	spm_lock_get();
4747d116dccSCC Ma 	if (is_mcdi_ready() == 0) {
4757d116dccSCC Ma 		if (is_hotplug_ready() == 1)
4767d116dccSCC Ma 			spm_clear_hotplug();
4777d116dccSCC Ma 		set_pwrctrl_pcm_flags(pwrctrl, 0);
4787d116dccSCC Ma 		spm_reset_and_init_pcm();
4797d116dccSCC Ma 		spm_kick_im_to_fetch(pcmdesc);
4807d116dccSCC Ma 		spm_set_power_control(pwrctrl);
4817d116dccSCC Ma 		spm_set_wakeup_event(pwrctrl);
4827d116dccSCC Ma 		spm_kick_pcm_to_run(pwrctrl);
4837d116dccSCC Ma 		set_mcdi_ready();
4847d116dccSCC Ma 	}
4857d116dccSCC Ma 	spm_mcdi_wfi_sel_enter(mpidr);
4868e53ec53SJimmy Huang 	if (afflvl == MPIDR_AFFLVL1)
4878e53ec53SJimmy Huang 		spm_mcdi_set_cputop_pwrctrl_for_cluster_off(mpidr);
4887d116dccSCC Ma 	spm_lock_release();
4897d116dccSCC Ma }
4907d116dccSCC Ma 
spm_mcdi_finish_for_on_state(unsigned long mpidr,unsigned int afflvl)4918e53ec53SJimmy Huang void spm_mcdi_finish_for_on_state(unsigned long mpidr, unsigned int afflvl)
4927d116dccSCC Ma {
493201d535fSKoan-Sin Tan 	unsigned long linear_id;
494201d535fSKoan-Sin Tan 
495201d535fSKoan-Sin Tan 	linear_id = ((mpidr & MPIDR_CLUSTER_MASK) >> 6) |
496201d535fSKoan-Sin Tan 			(mpidr & MPIDR_CPU_MASK);
4977d116dccSCC Ma 
4987d116dccSCC Ma 	spm_lock_get();
4998e53ec53SJimmy Huang 	spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(mpidr);
5007d116dccSCC Ma 	spm_mcdi_wfi_sel_leave(mpidr);
5017d116dccSCC Ma 	mmio_write_32(SPM_PCM_SW_INT_CLEAR, (0x1 << linear_id));
5027d116dccSCC Ma 	spm_lock_release();
5037d116dccSCC Ma }
504