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 46*44c49087SWeiyi Lu #define WAKE_SRC_FOR_MCDI \ 47*44c49087SWeiyi Lu (WAKE_SRC_KP | WAKE_SRC_GPT | WAKE_SRC_EINT | \ 48*44c49087SWeiyi Lu WAKE_SRC_MD32 | WAKE_SRC_USB_CD | WAKE_SRC_USB_PDN | \ 49*44c49087SWeiyi Lu WAKE_SRC_AFE | WAKE_SRC_THERM | WAKE_SRC_CIRQ | \ 50*44c49087SWeiyi 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, 64*44c49087SWeiyi Lu 0x18d0001f, 0x10006210, 0x81002001, 0xd82001c4, 0x17c07c1f, 0xa0900402, 65*44c49087SWeiyi Lu 0xc2401520, 0x17c07c1f, 0x81052001, 0xd8200284, 0x17c07c1f, 0x80b00402, 66*44c49087SWeiyi Lu 0xc2401b60, 0x17c07c1f, 0x1a40001f, 0x10006230, 0x18d0001f, 0x10006230, 67*44c49087SWeiyi Lu 0x8100a001, 0xd82003c4, 0x17c07c1f, 0xa0908402, 0xc2401520, 0x17c07c1f, 68*44c49087SWeiyi Lu 0x8105a001, 0xd8200484, 0x17c07c1f, 0x80b08402, 0xc2401b60, 0x17c07c1f, 69*44c49087SWeiyi Lu 0x1a40001f, 0x10006238, 0x18d0001f, 0x10006238, 0x81012001, 0xd82005c4, 70*44c49087SWeiyi Lu 0x17c07c1f, 0xa0910402, 0xc2401520, 0x17c07c1f, 0x81062001, 0xd8200684, 71*44c49087SWeiyi Lu 0x17c07c1f, 0x80b10402, 0xc2401b60, 0x17c07c1f, 0x1a40001f, 0x1000623c, 72*44c49087SWeiyi Lu 0x18d0001f, 0x1000623c, 0x8101a001, 0xd82007c4, 0x17c07c1f, 0xa0918402, 73*44c49087SWeiyi Lu 0xc2401520, 0x17c07c1f, 0x8106a001, 0xd8200884, 0x17c07c1f, 0x80b18402, 74*44c49087SWeiyi Lu 0xc2401b60, 0x17c07c1f, 0x1a40001f, 0x10006298, 0x18d0001f, 0x10006298, 75*44c49087SWeiyi Lu 0x81022001, 0xd82009c4, 0x17c07c1f, 0xa0920402, 0xc2401520, 0x17c07c1f, 76*44c49087SWeiyi Lu 0x81072001, 0xd8200a84, 0x17c07c1f, 0x80b20402, 0xc2401b60, 0x17c07c1f, 77*44c49087SWeiyi Lu 0x1a40001f, 0x1000629c, 0x18d0001f, 0x1000629c, 0x8102a001, 0xd8200bc4, 78*44c49087SWeiyi Lu 0x17c07c1f, 0xa0928402, 0xc2401520, 0x17c07c1f, 0x8107a001, 0xd8200c84, 79*44c49087SWeiyi Lu 0x17c07c1f, 0x80b28402, 0xc2401b60, 0x17c07c1f, 0x1a40001f, 0x100062c4, 80*44c49087SWeiyi Lu 0x18d0001f, 0x100062c4, 0x81032001, 0xd8200dc4, 0x17c07c1f, 0xa0930402, 81*44c49087SWeiyi Lu 0xc2401520, 0x17c07c1f, 0x81082001, 0xd8200e84, 0x17c07c1f, 0x80b30402, 82*44c49087SWeiyi Lu 0xc2401b60, 0x17c07c1f, 0x1a40001f, 0x100062c0, 0x18d0001f, 0x100062c0, 83*44c49087SWeiyi Lu 0x8103a001, 0xd8200fc4, 0x17c07c1f, 0xa0938402, 0xc2401520, 0x17c07c1f, 84*44c49087SWeiyi Lu 0x8108a001, 0xd8201084, 0x17c07c1f, 0x80b38402, 0xc2401b60, 0x17c07c1f, 85*44c49087SWeiyi Lu 0x1a40001f, 0x10006214, 0x18d0001f, 0x10006214, 0x81042001, 0xd82011c4, 86*44c49087SWeiyi Lu 0x17c07c1f, 0xa0940402, 0xc2401520, 0x17c07c1f, 0x81092001, 0xd8201284, 87*44c49087SWeiyi Lu 0x17c07c1f, 0x80b40402, 0xc2401b60, 0x17c07c1f, 0x1a40001f, 0x100062cc, 88*44c49087SWeiyi Lu 0x18d0001f, 0x100062cc, 0x8104a001, 0xd82013c4, 0x17c07c1f, 0xa0948402, 89*44c49087SWeiyi Lu 0xc2401520, 0x17c07c1f, 0x8109a001, 0xd8201484, 0x17c07c1f, 0x80b48402, 90*44c49087SWeiyi Lu 0xc2401b60, 0x17c07c1f, 0x1900001f, 0x10006b6c, 0xe1000002, 0xf0000000, 91*44c49087SWeiyi Lu 0x17c07c1f, 0xa8c00003, 0x00000004, 0xe2400003, 0xa8c00003, 0x00000008, 92*44c49087SWeiyi Lu 0xe2400003, 0x1b80001f, 0x00000020, 0x88c00003, 0xffffffef, 0xe2400003, 93*44c49087SWeiyi Lu 0x88c00003, 0xfffffffd, 0xe2400003, 0xa8c00003, 0x00000001, 0xe2400003, 94*44c49087SWeiyi Lu 0x88c00003, 0xfffff0ff, 0xe2400003, 0x1b80001f, 0x20000080, 0x1a90001f, 95*44c49087SWeiyi Lu 0x10001220, 0x69200009, 0x1000623c, 0xd8001964, 0x17c07c1f, 0x69200009, 96*44c49087SWeiyi Lu 0x10006214, 0xd8001a44, 0x17c07c1f, 0xd0001ae0, 0x17c07c1f, 0x1900001f, 97*44c49087SWeiyi Lu 0x10001220, 0x8a80000a, 0xfffffff9, 0xe100000a, 0xd0001ae0, 0x17c07c1f, 98*44c49087SWeiyi Lu 0x1900001f, 0x10001220, 0x8a80000a, 0xff1fbfff, 0xe100000a, 0x1b80001f, 99*44c49087SWeiyi Lu 0x20000080, 0xf0000000, 0x17c07c1f, 0x1a90001f, 0x10001220, 0x69200009, 100*44c49087SWeiyi Lu 0x1000623c, 0xd8001ce4, 0x17c07c1f, 0x69200009, 0x10006214, 0xd8001dc4, 101*44c49087SWeiyi Lu 0x17c07c1f, 0xd0001e60, 0x17c07c1f, 0x1900001f, 0x10001220, 0xaa80000a, 102*44c49087SWeiyi Lu 0x00000006, 0xe100000a, 0xd0001e60, 0x17c07c1f, 0x1900001f, 0x10001220, 103*44c49087SWeiyi Lu 0xaa80000a, 0x00e04000, 0xe100000a, 0x1b80001f, 0x20000080, 0x69200009, 104*44c49087SWeiyi Lu 0x10006214, 0xd8001fc4, 0x17c07c1f, 0xa8c00003, 0x00000f00, 0xe2400003, 105*44c49087SWeiyi Lu 0xd0002020, 0x17c07c1f, 0xa8c00003, 0x00003f00, 0xe2400003, 0x1b80001f, 106*44c49087SWeiyi Lu 0x20000080, 0xa8c00003, 0x00000002, 0xe2400003, 0x88c00003, 0xfffffffe, 107*44c49087SWeiyi Lu 0xe2400003, 0xa8c00003, 0x00000010, 0xe2400003, 0x88c00003, 0xfffffffb, 108*44c49087SWeiyi Lu 0xe2400003, 0x88c00003, 0xfffffff7, 0xe2400003, 0xf0000000, 0x17c07c1f, 109*44c49087SWeiyi Lu 0xe2e00036, 0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c, 0xe8208000, 110*44c49087SWeiyi Lu 0x10006244, 0x00000000, 0x1b80001f, 0x20000080, 0xe2e0007c, 0x1b80001f, 111*44c49087SWeiyi Lu 0x20000003, 0xe2e0005c, 0xe2e0004c, 0xe2e0004d, 0xf0000000, 0x17c07c1f, 112*44c49087SWeiyi Lu 0xe2e0004f, 0xe2e0006f, 0xe2e0002f, 0xe8208000, 0x10006244, 0x00000001, 113*44c49087SWeiyi Lu 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e0003a, 0xe2e00032, 114*44c49087SWeiyi Lu 0x1b80001f, 0x00000020, 0x1910001f, 0x10006b6c, 0x09000004, 0x00100000, 115*44c49087SWeiyi Lu 0x1a10001f, 0x10006b6c, 0xe2000004, 0xf0000000, 0x17c07c1f, 0xe2e00036, 116*44c49087SWeiyi Lu 0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0003c, 0xe2a00000, 0x1b80001f, 117*44c49087SWeiyi Lu 0x20000080, 0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c, 118*44c49087SWeiyi Lu 0xe2e0004d, 0xf0000000, 0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f, 119*44c49087SWeiyi Lu 0xe2a00001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e0003a, 120*44c49087SWeiyi Lu 0xe2e00032, 0xf0000000, 0x17c07c1f, 0xe2e00026, 0xe2e0002e, 0x1b80001f, 121*44c49087SWeiyi Lu 0x00000020, 0x1a00001f, 0x100062b4, 0x1910001f, 0x100062b4, 0x81322804, 122*44c49087SWeiyi Lu 0xe2000004, 0x81202804, 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0000e, 123*44c49087SWeiyi Lu 0xe2e0000c, 0xe2e0000d, 0xf0000000, 0x17c07c1f, 0xe2e0002d, 0x1a00001f, 124*44c49087SWeiyi Lu 0x100062b4, 0x1910001f, 0x100062b4, 0xa1002804, 0xe2000004, 0xa1122804, 125*44c49087SWeiyi Lu 0xe2000004, 0x1b80001f, 0x20000080, 0xe2e0002f, 0xe2e0002b, 0xe2e00023, 126*44c49087SWeiyi Lu 0x1b80001f, 0x00000020, 0xe2e00022, 0xf0000000, 0x17c07c1f, 0x1900001f, 127*44c49087SWeiyi Lu 0x1020020c, 0x1a10001f, 0x1020020c, 0xaa000008, 0x00000001, 0xe1000008, 128*44c49087SWeiyi Lu 0x1910001f, 0x10006720, 0x820c9001, 0xd82030c8, 0x17c07c1f, 0x1900001f, 129*44c49087SWeiyi Lu 0x10001220, 0x1a10001f, 0x10001220, 0xa21f0408, 0xe1000008, 0x1b80001f, 130*44c49087SWeiyi Lu 0x20000080, 0xe2e0006d, 0xe2e0002d, 0x1a00001f, 0x100062b8, 0x1910001f, 131*44c49087SWeiyi Lu 0x100062b8, 0xa9000004, 0x00000001, 0xe2000004, 0x1b80001f, 0x20000080, 132*44c49087SWeiyi Lu 0xe2e0002c, 0xe2e0003c, 0xe2e0003e, 0xe2e0003a, 0xe2e00032, 0x1b80001f, 133*44c49087SWeiyi Lu 0x00000020, 0x1900001f, 0x10006404, 0x1a10001f, 0x10006404, 0xa2168408, 134*44c49087SWeiyi Lu 0xe1000008, 0xf0000000, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8a000008, 135*44c49087SWeiyi Lu 0x00003030, 0xb900010c, 0x01000001, 0xd8203bc4, 0x17c07c1f, 0x1900001f, 136*44c49087SWeiyi Lu 0x10006404, 0x1a10001f, 0x10006404, 0x8a000008, 0x0000dfff, 0xe1000008, 137*44c49087SWeiyi Lu 0xe2e00036, 0xe2e0003e, 0x1b80001f, 0x00000020, 0xe2e0002e, 0x1a00001f, 138*44c49087SWeiyi Lu 0x100062b8, 0x1910001f, 0x100062b8, 0x89000004, 0x0000fffe, 0xe2000004, 139*44c49087SWeiyi Lu 0x1b80001f, 0x20000080, 0xe2e0006e, 0xe2e0004e, 0xe2e0004c, 0xe2e0004d, 140*44c49087SWeiyi Lu 0x1900001f, 0x10001220, 0x1a10001f, 0x10001220, 0x8a000008, 0xbfffffff, 141*44c49087SWeiyi Lu 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f, 0x1020020c, 0x1a10001f, 142*44c49087SWeiyi Lu 0x1020020c, 0x8a000008, 0xfffffffe, 0xe1000008, 0xf0000000, 0x17c07c1f, 1437d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 1447d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 1457d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 1467d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 1477d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 1487d116dccSCC Ma 0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0x11407c1f, 0xe8208000, 1497d116dccSCC Ma 0x10006b6c, 0xa0000000, 0xe8208000, 0x10006310, 0x0b160008, 0x1900001f, 1507d116dccSCC Ma 0x000f7bde, 0x1a00001f, 0x10200268, 0xe2000004, 0xe8208000, 0x10006600, 151*44c49087SWeiyi Lu 0x00000000, 0x1b00001f, 0x3fffe7ff, 0x1b80001f, 0xd0010000, 0x69200006, 1521a1ff8b9SJimmy Huang 0xbeefbeef, 0xd8204664, 0x17c07c1f, 0x1910001f, 0x10006358, 0x810b1001, 1531a1ff8b9SJimmy Huang 0xd8004324, 0x17c07c1f, 0x1980001f, 0xdeaddead, 0x69200006, 0xabcdabcd, 1541a1ff8b9SJimmy Huang 0xd8204404, 0x17c07c1f, 0x88900001, 0x10006814, 0x1910001f, 0x10006400, 1551a1ff8b9SJimmy Huang 0x81271002, 0x1880001f, 0x10006600, 0xe0800004, 0x1910001f, 0x10006358, 1561a1ff8b9SJimmy Huang 0x810b1001, 0xd8004584, 0x17c07c1f, 0x1980001f, 0x12345678, 0x60a07c05, 157*44c49087SWeiyi Lu 0x89100002, 0x10006600, 0x80801001, 0xd8007d82, 0x17c07c1f, 0x1890001f, 1581a1ff8b9SJimmy Huang 0x10006b00, 0x82090801, 0xc8800008, 0x17c07c1f, 0x1a10001f, 0x10006720, 1591a1ff8b9SJimmy Huang 0x82002001, 0x82201408, 0xd8204968, 0x17c07c1f, 0x1a40001f, 0x10006200, 160*44c49087SWeiyi Lu 0x1a80001f, 0x1000625c, 0xc24029a0, 0x17c07c1f, 0xa1400405, 0x1a10001f, 1611a1ff8b9SJimmy Huang 0x10006720, 0x8200a001, 0x82209408, 0xd8204b08, 0x17c07c1f, 0x1a40001f, 162*44c49087SWeiyi Lu 0x10006218, 0x1a80001f, 0x10006264, 0xc24029a0, 0x17c07c1f, 0xa1508405, 1631a1ff8b9SJimmy Huang 0x1a10001f, 0x10006720, 0x82012001, 0x82211408, 0xd8204ca8, 0x17c07c1f, 164*44c49087SWeiyi Lu 0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 0xc24029a0, 0x17c07c1f, 1651a1ff8b9SJimmy Huang 0xa1510405, 0x1a10001f, 0x10006720, 0x8201a001, 0x82219408, 0xd8204e48, 166*44c49087SWeiyi Lu 0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc24029a0, 1678e53ec53SJimmy Huang 0x17c07c1f, 0xa1518405, 0x1a10001f, 0x10006720, 0x82022001, 0x82221408, 168*44c49087SWeiyi Lu 0xd8204fc8, 0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f, 0xc2402d80, 1698e53ec53SJimmy Huang 0x17c07c1f, 0xa1520405, 0x1a10001f, 0x10006720, 0x8202a001, 0x82229408, 170*44c49087SWeiyi Lu 0xd8205148, 0x17c07c1f, 0x1a40001f, 0x100062a4, 0x1290841f, 0xc2402d80, 1718e53ec53SJimmy Huang 0x17c07c1f, 0xa1528405, 0x1a10001f, 0x10006720, 0x82032001, 0x82231408, 1721a1ff8b9SJimmy Huang 0xd8205228, 0x17c07c1f, 0xa1530405, 0x1a10001f, 0x10006720, 0x8203a001, 1731a1ff8b9SJimmy Huang 0x82239408, 0xd8205308, 0x17c07c1f, 0xa1538405, 0x1a10001f, 0x10006b00, 174*44c49087SWeiyi Lu 0x8108a001, 0xd8205e44, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x8104a001, 1751a1ff8b9SJimmy Huang 0xb1052081, 0xb105a081, 0xb1062081, 0xd8005904, 0x17c07c1f, 0x81042001, 1761a1ff8b9SJimmy Huang 0xd8205904, 0x17c07c1f, 0x1900001f, 0x1020002c, 0x1a10001f, 0x1020002c, 1771a1ff8b9SJimmy Huang 0xaa000008, 0x00000010, 0xe1000008, 0x1910001f, 0x10006720, 0x820c1001, 1781a1ff8b9SJimmy Huang 0xd82055e8, 0x17c07c1f, 0x1900001f, 0x10001250, 0x1a10001f, 0x10001250, 1791a1ff8b9SJimmy Huang 0xa2110408, 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f, 0x10001220, 1801a1ff8b9SJimmy Huang 0x1a10001f, 0x10001220, 0xa21e8408, 0xe1000008, 0x1b80001f, 0x20000080, 181*44c49087SWeiyi Lu 0x1a40001f, 0x10006208, 0xc24024c0, 0x17c07c1f, 0x1910001f, 0x10006610, 182*44c49087SWeiyi Lu 0x81041001, 0xd8005e44, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8a000008, 183*44c49087SWeiyi Lu 0x00000f0f, 0xb900010c, 0x1fffe7ff, 0xd8205e44, 0x17c07c1f, 0x1a40001f, 184*44c49087SWeiyi Lu 0x10006208, 0xc2402280, 0x17c07c1f, 0x1900001f, 0x10001250, 0x1a10001f, 185*44c49087SWeiyi Lu 0x10001250, 0x8a000008, 0xfffffffb, 0xe1000008, 0x1b80001f, 0x20000080, 186*44c49087SWeiyi Lu 0x1900001f, 0x10001220, 0x1a10001f, 0x10001220, 0x8a000008, 0xdfffffff, 187*44c49087SWeiyi Lu 0xe1000008, 0x1b80001f, 0x20000080, 0x1900001f, 0x1020002c, 0x1a10001f, 188*44c49087SWeiyi Lu 0x1020002c, 0x8a000008, 0xffffffef, 0xe1000008, 0x1a10001f, 0x10006b00, 189*44c49087SWeiyi Lu 0x81082001, 0xd82060c4, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x81082001, 190*44c49087SWeiyi Lu 0xb108a081, 0xd80060c4, 0x17c07c1f, 0x1a10001f, 0x10006610, 0x8107a001, 191*44c49087SWeiyi Lu 0xd82060c4, 0x17c07c1f, 0x1a40001f, 0x100062b0, 0xc2402fe0, 0x17c07c1f, 192*44c49087SWeiyi Lu 0x1b80001f, 0x20000208, 0xd8207d4c, 0x17c07c1f, 0x1910001f, 0x10006610, 193*44c49087SWeiyi Lu 0x81079001, 0xd8006264, 0x17c07c1f, 0x1a40001f, 0x100062b0, 0xc24035a0, 194*44c49087SWeiyi Lu 0x17c07c1f, 0x81001401, 0xd82065e4, 0x17c07c1f, 0x1a10001f, 0x10006918, 195*44c49087SWeiyi Lu 0x81002001, 0xb1042081, 0xb900008c, 0x1fffe7ff, 0xd82065e4, 0x17c07c1f, 196*44c49087SWeiyi Lu 0x1a40001f, 0x10006200, 0x1a80001f, 0x1000625c, 0xc24027a0, 0x17c07c1f, 197*44c49087SWeiyi Lu 0x89400005, 0xfffffffe, 0xe8208000, 0x10006f00, 0x00000000, 0xe8208000, 198*44c49087SWeiyi Lu 0x10006b30, 0x00000000, 0xe8208000, 0x100063e0, 0x00000001, 0x81009401, 199*44c49087SWeiyi Lu 0xd8206964, 0x17c07c1f, 0x1a10001f, 0x10006918, 0x8100a001, 0xb104a081, 200*44c49087SWeiyi Lu 0xb900008c, 0x01000001, 0xd8206964, 0x17c07c1f, 0x1a40001f, 0x10006218, 201*44c49087SWeiyi Lu 0x1a80001f, 0x10006264, 0xc24027a0, 0x17c07c1f, 0x89400005, 0xfffffffd, 202*44c49087SWeiyi Lu 0xe8208000, 0x10006f04, 0x00000000, 0xe8208000, 0x10006b34, 0x00000000, 203*44c49087SWeiyi Lu 0xe8208000, 0x100063e0, 0x00000002, 0x81011401, 0xd8206ce4, 0x17c07c1f, 204*44c49087SWeiyi Lu 0x1a10001f, 0x10006918, 0x81012001, 0xb1052081, 0xb900008c, 0x01000001, 205*44c49087SWeiyi Lu 0xd8206ce4, 0x17c07c1f, 0x1a40001f, 0x1000621c, 0x1a80001f, 0x1000626c, 206*44c49087SWeiyi Lu 0xc24027a0, 0x17c07c1f, 0x89400005, 0xfffffffb, 0xe8208000, 0x10006f08, 207*44c49087SWeiyi Lu 0x00000000, 0xe8208000, 0x10006b38, 0x00000000, 0xe8208000, 0x100063e0, 208*44c49087SWeiyi Lu 0x00000004, 0x81019401, 0xd8207064, 0x17c07c1f, 0x1a10001f, 0x10006918, 209*44c49087SWeiyi Lu 0x8101a001, 0xb105a081, 0xb900008c, 0x01000001, 0xd8207064, 0x17c07c1f, 210*44c49087SWeiyi Lu 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc24027a0, 0x17c07c1f, 211*44c49087SWeiyi Lu 0x89400005, 0xfffffff7, 0xe8208000, 0x10006f0c, 0x00000000, 0xe8208000, 212*44c49087SWeiyi Lu 0x10006b3c, 0x00000000, 0xe8208000, 0x100063e0, 0x00000008, 0x1910001f, 213*44c49087SWeiyi Lu 0x10006610, 0x81079001, 0xd82077c4, 0x17c07c1f, 0x81021401, 0xd8207464, 214*44c49087SWeiyi Lu 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81022001, 0xb1062081, 0xb900008c, 215*44c49087SWeiyi Lu 0x01000001, 0xd8207464, 0x17c07c1f, 0x1a40001f, 0x100062a0, 0x1280041f, 216*44c49087SWeiyi Lu 0xc2402b20, 0x17c07c1f, 0x89400005, 0xffffffef, 0xe8208000, 0x10006f10, 217*44c49087SWeiyi Lu 0x00000000, 0xe8208000, 0x10006b40, 0x00000000, 0xe8208000, 0x100063e0, 218*44c49087SWeiyi Lu 0x00000010, 0x81029401, 0xd82077c4, 0x17c07c1f, 0x1a10001f, 0x10006918, 219*44c49087SWeiyi Lu 0x8102a001, 0xb106a081, 0xb900008c, 0x01000001, 0xd82077c4, 0x17c07c1f, 220*44c49087SWeiyi Lu 0x1a40001f, 0x100062a4, 0x1290841f, 0xc2402b20, 0x17c07c1f, 0x89400005, 2211a1ff8b9SJimmy Huang 0xffffffdf, 0xe8208000, 0x10006f14, 0x00000000, 0xe8208000, 0x10006b44, 222*44c49087SWeiyi Lu 0x00000000, 0xe8208000, 0x100063e0, 0x00000020, 0x81031401, 0xd8207a84, 223*44c49087SWeiyi Lu 0x17c07c1f, 0x1a10001f, 0x10006918, 0x81032001, 0xb1072081, 0xb900008c, 224*44c49087SWeiyi Lu 0x01000001, 0xd8207a84, 0x17c07c1f, 0x89400005, 0xffffffbf, 0xe8208000, 225*44c49087SWeiyi Lu 0x10006f18, 0x00000000, 0xe8208000, 0x10006b48, 0x00000000, 0xe8208000, 226*44c49087SWeiyi Lu 0x100063e0, 0x00000040, 0x81039401, 0xd8207d44, 0x17c07c1f, 0x1a10001f, 227*44c49087SWeiyi Lu 0x10006918, 0x8103a001, 0xb107a081, 0xb900008c, 0x01000001, 0xd8207d44, 228*44c49087SWeiyi Lu 0x17c07c1f, 0x89400005, 0xffffff7f, 0xe8208000, 0x10006f1c, 0x00000000, 229*44c49087SWeiyi Lu 0xe8208000, 0x10006b4c, 0x00000000, 0xe8208000, 0x100063e0, 0x00000080, 230*44c49087SWeiyi Lu 0xd0004220, 0x17c07c1f, 0xe8208000, 0x10006600, 0x00000000, 0x1ac0001f, 231*44c49087SWeiyi Lu 0x55aa55aa, 0x1940001f, 0xaa55aa55, 0x1b80001f, 0x00001000, 0xf0000000, 232*44c49087SWeiyi Lu 0x17c07c1f 2337d116dccSCC Ma }; 2347d116dccSCC Ma 2357d116dccSCC Ma static const struct pcm_desc mcdi_pcm = { 236*44c49087SWeiyi Lu .version = "pcm_mcdi_mt8173_20151126_V1", 2377d116dccSCC Ma .base = mcdi_binary, 238*44c49087SWeiyi Lu .size = 1015, 2397d116dccSCC Ma .sess = 2, 2407d116dccSCC Ma .replace = 0, 2417d116dccSCC Ma }; 2427d116dccSCC Ma 2437d116dccSCC Ma static struct pwr_ctrl mcdi_ctrl = { 2447d116dccSCC Ma .wake_src = WAKE_SRC_FOR_MCDI, 2457d116dccSCC Ma .wake_src_md32 = 0, 2467d116dccSCC Ma .wfi_op = WFI_OP_OR, 2477d116dccSCC Ma .mcusys_idle_mask = 1, 2487d116dccSCC Ma .ca7top_idle_mask = 1, 2497d116dccSCC Ma .ca15top_idle_mask = 1, 2507d116dccSCC Ma .disp_req_mask = 1, 2517d116dccSCC Ma .mfg_req_mask = 1, 2527d116dccSCC Ma .md32_req_mask = 1, 2537d116dccSCC Ma }; 2547d116dccSCC Ma 2557d116dccSCC Ma static const struct spm_lp_scen spm_mcdi = { 2567d116dccSCC Ma .pcmdesc = &mcdi_pcm, 2577d116dccSCC Ma .pwrctrl = &mcdi_ctrl, 2587d116dccSCC Ma }; 2597d116dccSCC Ma 2607d116dccSCC Ma void spm_mcdi_cpu_wake_up_event(int wake_up_event, int disable_dormant_power) 2617d116dccSCC Ma { 2627d116dccSCC Ma if (((mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) & 0x1) == 1) 2637d116dccSCC Ma && ((mmio_read_32(SPM_CLK_CON) & CC_DISABLE_DORM_PWR) == 0)) { 2647d116dccSCC Ma /* MCDI is offload? */ 2657d116dccSCC Ma INFO("%s: SPM_SLEEP_CPU_WAKEUP_EVENT:%x, SPM_CLK_CON %x", 2667d116dccSCC Ma __func__, mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT), 2677d116dccSCC Ma mmio_read_32(SPM_CLK_CON)); 2687d116dccSCC Ma return; 2697d116dccSCC Ma } 2707d116dccSCC Ma /* Inform SPM that CPU wants to program CPU_WAKEUP_EVENT and 2717d116dccSCC Ma * DISABLE_CPU_DROM */ 2727d116dccSCC Ma mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_HANDSHAKE_SYNC); 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 /* Wait SPM's response, can't use sleep api */ 2777d116dccSCC Ma while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_HANDSHAKE_ACK) 2787d116dccSCC Ma ; 2797d116dccSCC Ma 2807d116dccSCC Ma if (disable_dormant_power) { 2817d116dccSCC Ma mmio_setbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR); 2827d116dccSCC Ma while (mmio_read_32(SPM_CLK_CON) != 2837d116dccSCC Ma (mmio_read_32(SPM_CLK_CON) | CC_DISABLE_DORM_PWR)) 2847d116dccSCC Ma ; 2857d116dccSCC Ma 2867d116dccSCC Ma } else { 2877d116dccSCC Ma mmio_clrbits_32(SPM_CLK_CON, CC_DISABLE_DORM_PWR); 2887d116dccSCC Ma while (mmio_read_32(SPM_CLK_CON) != 2897d116dccSCC Ma (mmio_read_32(SPM_CLK_CON) & ~CC_DISABLE_DORM_PWR)) 2907d116dccSCC Ma ; 2917d116dccSCC Ma } 2927d116dccSCC Ma 2937d116dccSCC Ma mmio_write_32(SPM_SLEEP_CPU_WAKEUP_EVENT, wake_up_event); 2947d116dccSCC Ma 2957d116dccSCC Ma while (mmio_read_32(SPM_SLEEP_CPU_WAKEUP_EVENT) != wake_up_event) 2967d116dccSCC Ma ; 2977d116dccSCC Ma 2987d116dccSCC Ma /* Inform SPM to see updated setting */ 2997d116dccSCC Ma mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_MCDI_UPDATE_INFORM); 3007d116dccSCC Ma mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6); 3017d116dccSCC Ma mmio_write_32(SPM_PCM_PWR_IO_EN, 0); 3027d116dccSCC Ma 3037d116dccSCC Ma while (mmio_read_32(SPM_PCM_REG6_DATA) != PCM_MCDI_CKECK_DONE) 3047d116dccSCC Ma ; 3057d116dccSCC Ma /* END OF sequence */ 3067d116dccSCC Ma 3077d116dccSCC Ma mmio_write_32(SPM_PCM_REG_DATA_INI, 0x0); 3087d116dccSCC Ma mmio_write_32(SPM_PCM_PWR_IO_EN, PCM_RF_SYNC_R6); 3097d116dccSCC Ma mmio_write_32(SPM_PCM_PWR_IO_EN, 0); 3107d116dccSCC Ma } 3117d116dccSCC Ma 3127d116dccSCC Ma void spm_mcdi_wakeup_all_cores(void) 3137d116dccSCC Ma { 3147d116dccSCC Ma if (is_mcdi_ready() == 0) 3157d116dccSCC Ma return; 3167d116dccSCC Ma 3177d116dccSCC Ma spm_mcdi_cpu_wake_up_event(1, 1); 3187d116dccSCC Ma while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_ALL_CORE_AWAKE) 3197d116dccSCC Ma ; 3207d116dccSCC Ma spm_mcdi_cpu_wake_up_event(1, 0); 3217d116dccSCC Ma while (mmio_read_32(SPM_PCM_REG5_DATA) != PCM_MCDI_OFFLOADED) 3227d116dccSCC Ma ; 3237d116dccSCC Ma 3247d116dccSCC Ma spm_clean_after_wakeup(); 3257d116dccSCC Ma clear_all_ready(); 3267d116dccSCC Ma } 3277d116dccSCC Ma 3288e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_enter(unsigned long mpidr) 3297d116dccSCC Ma { 3307d116dccSCC Ma int core_id_val = mpidr & MPIDR_CPU_MASK; 3317d116dccSCC Ma int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS; 3327d116dccSCC Ma 3337d116dccSCC Ma /* SPM WFI Select by core number */ 3347d116dccSCC Ma if (cluster_id) { 3357d116dccSCC Ma switch (core_id_val) { 3367d116dccSCC Ma case 0: 3377d116dccSCC Ma mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 1); 3387d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 1); 3397d116dccSCC Ma break; 3407d116dccSCC Ma case 1: 3417d116dccSCC Ma mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 1); 3427d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 1); 3437d116dccSCC Ma break; 3447d116dccSCC Ma case 2: 3457d116dccSCC Ma mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 1); 3467d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 1); 3477d116dccSCC Ma break; 3487d116dccSCC Ma case 3: 3497d116dccSCC Ma mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 1); 3507d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 1); 3517d116dccSCC Ma break; 3527d116dccSCC Ma default: 3537d116dccSCC Ma break; 3547d116dccSCC Ma } 3557d116dccSCC Ma } else { 3567d116dccSCC Ma switch (core_id_val) { 3577d116dccSCC Ma case 0: 3587d116dccSCC Ma mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 1); 3597d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 1); 3607d116dccSCC Ma break; 3617d116dccSCC Ma case 1: 3627d116dccSCC Ma mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 1); 3637d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 1); 3647d116dccSCC Ma break; 3657d116dccSCC Ma case 2: 3667d116dccSCC Ma mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 1); 3677d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 1); 3687d116dccSCC Ma break; 3697d116dccSCC Ma case 3: 3707d116dccSCC Ma mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 1); 3717d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 1); 3727d116dccSCC Ma break; 3737d116dccSCC Ma default: 3747d116dccSCC Ma break; 3757d116dccSCC Ma } 3767d116dccSCC Ma } 3777d116dccSCC Ma } 3787d116dccSCC Ma 3798e53ec53SJimmy Huang static void spm_mcdi_wfi_sel_leave(unsigned long mpidr) 3807d116dccSCC Ma { 3817d116dccSCC Ma int core_id_val = mpidr & MPIDR_CPU_MASK; 3827d116dccSCC Ma int cluster_id = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS; 3837d116dccSCC Ma 3847d116dccSCC Ma /* SPM WFI Select by core number */ 3857d116dccSCC Ma if (cluster_id) { 3867d116dccSCC Ma switch (core_id_val) { 3877d116dccSCC Ma case 0: 3887d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI0_EN, 0); 3897d116dccSCC Ma mmio_write_32(SPM_CA15_CPU0_IRQ_MASK, 0); 3907d116dccSCC Ma break; 3917d116dccSCC Ma case 1: 3927d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI1_EN, 0); 3937d116dccSCC Ma mmio_write_32(SPM_CA15_CPU1_IRQ_MASK, 0); 3947d116dccSCC Ma break; 3957d116dccSCC Ma case 2: 3967d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI2_EN, 0); 3977d116dccSCC Ma mmio_write_32(SPM_CA15_CPU2_IRQ_MASK, 0); 3987d116dccSCC Ma break; 3997d116dccSCC Ma case 3: 4007d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA15_WFI3_EN, 0); 4017d116dccSCC Ma mmio_write_32(SPM_CA15_CPU3_IRQ_MASK, 0); 4027d116dccSCC Ma break; 4037d116dccSCC Ma default: 4047d116dccSCC Ma break; 4057d116dccSCC Ma } 4067d116dccSCC Ma } else { 4077d116dccSCC Ma switch (core_id_val) { 4087d116dccSCC Ma case 0: 4097d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI0_EN, 0); 4107d116dccSCC Ma mmio_write_32(SPM_CA7_CPU0_IRQ_MASK, 0); 4117d116dccSCC Ma break; 4127d116dccSCC Ma case 1: 4137d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI1_EN, 0); 4147d116dccSCC Ma mmio_write_32(SPM_CA7_CPU1_IRQ_MASK, 0); 4157d116dccSCC Ma break; 4167d116dccSCC Ma case 2: 4177d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI2_EN, 0); 4187d116dccSCC Ma mmio_write_32(SPM_CA7_CPU2_IRQ_MASK, 0); 4197d116dccSCC Ma break; 4207d116dccSCC Ma case 3: 4217d116dccSCC Ma mmio_write_32(SPM_SLEEP_CA7_WFI3_EN, 0); 4227d116dccSCC Ma mmio_write_32(SPM_CA7_CPU3_IRQ_MASK, 0); 4237d116dccSCC Ma break; 4247d116dccSCC Ma default: 4257d116dccSCC Ma break; 4267d116dccSCC Ma } 4277d116dccSCC Ma } 4287d116dccSCC Ma } 4297d116dccSCC Ma 4308e53ec53SJimmy Huang static void spm_mcdi_set_cputop_pwrctrl_for_cluster_off(unsigned long mpidr) 4318e53ec53SJimmy Huang { 4328e53ec53SJimmy Huang unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK; 4338e53ec53SJimmy Huang unsigned long cpu_id = mpidr & MPIDR_CPU_MASK; 4348e53ec53SJimmy Huang unsigned int pwr_status, shift, i, flag = 0; 4358e53ec53SJimmy Huang 4368e53ec53SJimmy Huang pwr_status = mmio_read_32(SPM_PWR_STATUS) | 4378e53ec53SJimmy Huang mmio_read_32(SPM_PWR_STATUS_2ND); 4388e53ec53SJimmy Huang 4398e53ec53SJimmy Huang if (cluster_id) { 4408e53ec53SJimmy Huang for (i = 0; i < PLATFORM_CLUSTER1_CORE_COUNT; i++) { 4418e53ec53SJimmy Huang if (i == cpu_id) 4428e53ec53SJimmy Huang continue; 4438e53ec53SJimmy Huang shift = i + PCM_MCDI_CA72_PWRSTA_SHIFT; 4448e53ec53SJimmy Huang flag |= (pwr_status & (1 << shift)) >> shift; 4458e53ec53SJimmy Huang } 4468e53ec53SJimmy Huang if (!flag) 4478e53ec53SJimmy Huang mmio_setbits_32(SPM_PCM_RESERVE, 4488e53ec53SJimmy Huang PCM_MCDI_CA72_CPUTOP_PWRCTL); 4498e53ec53SJimmy Huang } else { 4508e53ec53SJimmy Huang for (i = 0; i < PLATFORM_CLUSTER0_CORE_COUNT; i++) { 4518e53ec53SJimmy Huang if (i == cpu_id) 4528e53ec53SJimmy Huang continue; 4538e53ec53SJimmy Huang shift = i + PCM_MCDI_CA53_PWRSTA_SHIFT; 4548e53ec53SJimmy Huang flag |= (pwr_status & (1 << shift)) >> shift; 4558e53ec53SJimmy Huang } 4568e53ec53SJimmy Huang if (!flag) 4578e53ec53SJimmy Huang mmio_setbits_32(SPM_PCM_RESERVE, 4588e53ec53SJimmy Huang PCM_MCDI_CA53_CPUTOP_PWRCTL); 4598e53ec53SJimmy Huang } 4608e53ec53SJimmy Huang } 4618e53ec53SJimmy Huang 4628e53ec53SJimmy Huang static void spm_mcdi_clear_cputop_pwrctrl_for_cluster_on(unsigned long mpidr) 4638e53ec53SJimmy Huang { 4648e53ec53SJimmy Huang unsigned long cluster_id = mpidr & MPIDR_CLUSTER_MASK; 4658e53ec53SJimmy Huang 4668e53ec53SJimmy Huang if (cluster_id) 4678e53ec53SJimmy Huang mmio_clrbits_32(SPM_PCM_RESERVE, 4688e53ec53SJimmy Huang PCM_MCDI_CA72_CPUTOP_PWRCTL); 4698e53ec53SJimmy Huang else 4708e53ec53SJimmy Huang mmio_clrbits_32(SPM_PCM_RESERVE, 4718e53ec53SJimmy Huang PCM_MCDI_CA53_CPUTOP_PWRCTL); 4728e53ec53SJimmy Huang } 4738e53ec53SJimmy Huang 4741a1ff8b9SJimmy Huang void spm_mcdi_prepare_for_mtcmos(void) 4751a1ff8b9SJimmy Huang { 4761a1ff8b9SJimmy Huang const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc; 4771a1ff8b9SJimmy Huang struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl; 4781a1ff8b9SJimmy Huang 4791a1ff8b9SJimmy Huang if (is_mcdi_ready() == 0) { 4801a1ff8b9SJimmy Huang if (is_hotplug_ready() == 1) 4811a1ff8b9SJimmy Huang spm_clear_hotplug(); 4821a1ff8b9SJimmy Huang set_pwrctrl_pcm_flags(pwrctrl, 0); 4831a1ff8b9SJimmy Huang spm_reset_and_init_pcm(); 4841a1ff8b9SJimmy Huang spm_kick_im_to_fetch(pcmdesc); 4851a1ff8b9SJimmy Huang spm_set_power_control(pwrctrl); 4861a1ff8b9SJimmy Huang spm_set_wakeup_event(pwrctrl); 4871a1ff8b9SJimmy Huang spm_kick_pcm_to_run(pwrctrl); 4881a1ff8b9SJimmy Huang set_mcdi_ready(); 4891a1ff8b9SJimmy Huang } 4901a1ff8b9SJimmy Huang } 4911a1ff8b9SJimmy Huang 4928e53ec53SJimmy Huang void spm_mcdi_prepare_for_off_state(unsigned long mpidr, unsigned int afflvl) 4937d116dccSCC Ma { 4947d116dccSCC Ma const struct pcm_desc *pcmdesc = spm_mcdi.pcmdesc; 4957d116dccSCC Ma struct pwr_ctrl *pwrctrl = spm_mcdi.pwrctrl; 4967d116dccSCC Ma 4977d116dccSCC Ma spm_lock_get(); 4987d116dccSCC Ma if (is_mcdi_ready() == 0) { 4997d116dccSCC Ma if (is_hotplug_ready() == 1) 5007d116dccSCC Ma spm_clear_hotplug(); 5017d116dccSCC Ma set_pwrctrl_pcm_flags(pwrctrl, 0); 5027d116dccSCC Ma spm_reset_and_init_pcm(); 5037d116dccSCC Ma spm_kick_im_to_fetch(pcmdesc); 5047d116dccSCC Ma spm_set_power_control(pwrctrl); 5057d116dccSCC Ma spm_set_wakeup_event(pwrctrl); 5067d116dccSCC Ma spm_kick_pcm_to_run(pwrctrl); 5077d116dccSCC Ma set_mcdi_ready(); 5087d116dccSCC Ma } 5097d116dccSCC Ma spm_mcdi_wfi_sel_enter(mpidr); 5108e53ec53SJimmy Huang if (afflvl == MPIDR_AFFLVL1) 5118e53ec53SJimmy Huang spm_mcdi_set_cputop_pwrctrl_for_cluster_off(mpidr); 5127d116dccSCC Ma spm_lock_release(); 5137d116dccSCC Ma } 5147d116dccSCC Ma 5158e53ec53SJimmy Huang void spm_mcdi_finish_for_on_state(unsigned long mpidr, unsigned int afflvl) 5167d116dccSCC Ma { 5177d116dccSCC Ma unsigned long linear_id = platform_get_core_pos(mpidr); 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