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