xref: /rk3399_ARM-atf/plat/mediatek/mt8173/drivers/spm/spm_hotplug.c (revision 201d535ff65ceefcb35840a53f8048992dcffdaf)
17d116dccSCC Ma /*
27d116dccSCC Ma  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma  *
47d116dccSCC Ma  * Redistribution and use in source and binary forms, with or without
57d116dccSCC Ma  * modification, are permitted provided that the following conditions are met:
67d116dccSCC Ma  *
77d116dccSCC Ma  * Redistributions of source code must retain the above copyright notice, this
87d116dccSCC Ma  * list of conditions and the following disclaimer.
97d116dccSCC Ma  *
107d116dccSCC Ma  * Redistributions in binary form must reproduce the above copyright notice,
117d116dccSCC Ma  * this list of conditions and the following disclaimer in the documentation
127d116dccSCC Ma  * and/or other materials provided with the distribution.
137d116dccSCC Ma  *
147d116dccSCC Ma  * Neither the name of ARM nor the names of its contributors may be used
157d116dccSCC Ma  * to endorse or promote products derived from this software without specific
167d116dccSCC Ma  * prior written permission.
177d116dccSCC Ma  *
187d116dccSCC Ma  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
197d116dccSCC Ma  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
207d116dccSCC Ma  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
217d116dccSCC Ma  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
227d116dccSCC Ma  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
237d116dccSCC Ma  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
247d116dccSCC Ma  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
257d116dccSCC Ma  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
267d116dccSCC Ma  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
277d116dccSCC Ma  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
287d116dccSCC Ma  * POSSIBILITY OF SUCH DAMAGE.
297d116dccSCC Ma  */
30*201d535fSKoan-Sin Tan #include <arch.h>
317d116dccSCC Ma #include <mmio.h>
327d116dccSCC Ma #include <mt8173_def.h>
337d116dccSCC Ma #include <platform.h>
347d116dccSCC Ma #include <spm.h>
357d116dccSCC Ma #include <spm_hotplug.h>
367d116dccSCC Ma #include <spm_mcdi.h>
377d116dccSCC Ma 
387d116dccSCC Ma /*
397d116dccSCC Ma  * System Power Manager (SPM) is a hardware module, which controls cpu or
407d116dccSCC Ma  * system power for different power scenarios using different firmware.
417d116dccSCC Ma  * This driver controls the cpu power in cpu hotplug flow.
427d116dccSCC Ma  */
437d116dccSCC Ma 
448e53ec53SJimmy Huang #define PCM_HOTPLUG_VALID_MASK	0x0000ff00
457d116dccSCC Ma #define PCM_HOTPLUG_VALID_SHIFT	0x8
467d116dccSCC Ma 
477d116dccSCC Ma /**********************************************************
487d116dccSCC Ma  * PCM sequence for CPU hotplug
497d116dccSCC Ma  **********************************************************/
507d116dccSCC Ma static const unsigned int hotplug_binary[] = {
517d116dccSCC Ma 	0x1900001f, 0x1020020c, 0x1950001f, 0x1020020c, 0xa9400005, 0x00000001,
527d116dccSCC Ma 	0xe1000005, 0x1910001f, 0x10006720, 0x814c9001, 0xd82000e5, 0x17c07c1f,
537d116dccSCC Ma 	0x1900001f, 0x10001220, 0x1950001f, 0x10001220, 0xa15f0405, 0xe1000005,
547d116dccSCC Ma 	0x1900001f, 0x10001228, 0x1950001f, 0x10001228, 0x810f1401, 0xd8200244,
557d116dccSCC Ma 	0x17c07c1f, 0xe2e0006d, 0xe2e0002d, 0x1a00001f, 0x100062b8, 0x1910001f,
567d116dccSCC Ma 	0x100062b8, 0xa9000004, 0x00000001, 0xe2000004, 0x1910001f, 0x100062b8,
577d116dccSCC Ma 	0x81142804, 0xd8200444, 0x17c07c1f, 0xe2e0002c, 0xe2e0003c, 0xe2e0003e,
587d116dccSCC Ma 	0xe2e0003a, 0xe2e00032, 0x1910001f, 0x1000660c, 0x81079001, 0x1950001f,
597d116dccSCC Ma 	0x10006610, 0x81479401, 0xa1001404, 0xd8000584, 0x17c07c1f, 0x1900001f,
607d116dccSCC Ma 	0x10006404, 0x1950001f, 0x10006404, 0xa1568405, 0xe1000005, 0xf0000000,
617d116dccSCC Ma 	0x17c07c1f, 0x1900001f, 0x10006404, 0x1950001f, 0x10006404, 0x89400005,
627d116dccSCC Ma 	0x0000dfff, 0xe1000005, 0xe2e00036, 0xe2e0003e, 0x1910001f, 0x1000660c,
637d116dccSCC Ma 	0x81079001, 0x1950001f, 0x10006610, 0x81479401, 0x81001404, 0xd82008c4,
647d116dccSCC Ma 	0x17c07c1f, 0xe2e0002e, 0x1a00001f, 0x100062b8, 0x1910001f, 0x100062b8,
657d116dccSCC Ma 	0x89000004, 0x0000fffe, 0xe2000004, 0x1910001f, 0x100062b8, 0x81142804,
667d116dccSCC Ma 	0xd8000ae4, 0x17c07c1f, 0xe2e0006e, 0xe2e0004e, 0xe2e0004c, 0xe2e0004d,
677d116dccSCC Ma 	0x1900001f, 0x10001220, 0x1950001f, 0x10001220, 0x89400005, 0xbfffffff,
687d116dccSCC Ma 	0xe1000005, 0x1900001f, 0x10001228, 0x1950001f, 0x10001228, 0x810f1401,
697d116dccSCC Ma 	0xd8000ce4, 0x17c07c1f, 0x1900001f, 0x1020020c, 0x1950001f, 0x1020020c,
707d116dccSCC Ma 	0x89400005, 0xfffffffe, 0xe1000005, 0xf0000000, 0x17c07c1f, 0x1212841f,
717d116dccSCC Ma 	0xe2e00036, 0xe2e0003e, 0x1380201f, 0xe2e0003c, 0xe2a00000, 0x1b80001f,
727d116dccSCC Ma 	0x20000080, 0xe2e0007c, 0x1b80001f, 0x20000003, 0xe2e0005c, 0xe2e0004c,
737d116dccSCC Ma 	0xe2e0004d, 0xf0000000, 0x17c07c1f, 0xe2e0004f, 0xe2e0006f, 0xe2e0002f,
747d116dccSCC Ma 	0xe2a00001, 0x1b80001f, 0x20000080, 0xe2e0002e, 0xe2e0003e, 0xe2e00032,
757d116dccSCC Ma 	0xf0000000, 0x17c07c1f, 0x1212841f, 0xe2e00026, 0xe2e0002e, 0x1380201f,
767d116dccSCC Ma 	0x1a00001f, 0x100062b4, 0x1910001f, 0x100062b4, 0x81322804, 0xe2000004,
777d116dccSCC Ma 	0x81202804, 0xe2000004, 0x1b80001f, 0x20000034, 0x1910001f, 0x100062b4,
787d116dccSCC Ma 	0x81142804, 0xd8001404, 0x17c07c1f, 0xe2e0000e, 0xe2e0000c, 0xe2e0000d,
797d116dccSCC Ma 	0xf0000000, 0x17c07c1f, 0xe2e0002d, 0x1a00001f, 0x100062b4, 0x1910001f,
807d116dccSCC Ma 	0x100062b4, 0xa1002804, 0xe2000004, 0xa1122804, 0xe2000004, 0x1b80001f,
817d116dccSCC Ma 	0x20000080, 0x1910001f, 0x100062b4, 0x81142804, 0xd82016a4, 0x17c07c1f,
827d116dccSCC Ma 	0xe2e0002f, 0xe2e0002b, 0xe2e00023, 0x1380201f, 0xe2e00022, 0xf0000000,
837d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
847d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
857d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
867d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
877d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
887d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
897d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
907d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
917d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
927d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
937d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
947d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
957d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
967d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
977d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
987d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
997d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1007d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1017d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1027d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1037d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1047d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1057d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1067d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1077d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1087d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1097d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1107d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1117d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1127d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1137d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1147d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1157d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1167d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1177d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1187d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1197d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1207d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1217d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1227d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1237d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1247d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1257d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1267d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1277d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1287d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1297d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1307d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1317d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1327d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1337d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1347d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1357d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f, 0x17c07c1f,
1367d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1840001f, 0x00000001, 0x1840001f, 0x00000001,
1377d116dccSCC Ma 	0x1840001f, 0x00000001, 0xa1d48407, 0x1b00001f, 0x2f7be75f, 0xe8208000,
1387d116dccSCC Ma 	0x10006354, 0xfffe7b47, 0xa1d10407, 0x1b80001f, 0x20000020, 0x17c07c1f,
1397d116dccSCC Ma 	0x1910001f, 0x10006b00, 0x81461001, 0xb14690a1, 0xd82044e5, 0x17c07c1f,
1407d116dccSCC Ma 	0x1910001f, 0x10006610, 0x81079001, 0xd80044e4, 0x17c07c1f, 0x1990001f,
1417d116dccSCC Ma 	0x10006b00, 0x81421801, 0x82429801, 0x81402405, 0xd80044e5, 0x17c07c1f,
1427d116dccSCC Ma 	0x1a40001f, 0x100062b0, 0x1280041f, 0xc24007a0, 0x17c07c1f, 0x1910001f,
1437d116dccSCC Ma 	0x10006b00, 0x81449001, 0xd8204be5, 0x17c07c1f, 0x1910001f, 0x10006b00,
1447d116dccSCC Ma 	0x81009001, 0xd8204984, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81051001,
1457d116dccSCC Ma 	0xd8204be4, 0x17c07c1f, 0x1910001f, 0x10006720, 0x81489001, 0xd82046c5,
1467d116dccSCC Ma 	0x17c07c1f, 0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264, 0xc24010e0,
1477d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x1000660c, 0x81051001, 0x1950001f, 0x10006610,
1487d116dccSCC Ma 	0x81451401, 0xa1001404, 0xd8004824, 0x17c07c1f, 0xd0004b00, 0x17c07c1f,
1497d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x10006610, 0x81051001, 0xd8004be4, 0x17c07c1f,
1507d116dccSCC Ma 	0x1a40001f, 0x10006218, 0x1a80001f, 0x10006264, 0xc2400ee0, 0x17c07c1f,
1517d116dccSCC Ma 	0x1910001f, 0x10006b00, 0x89000004, 0xfffffdff, 0x1940001f, 0x10006b00,
1527d116dccSCC Ma 	0xe1400004, 0x17c07c1f, 0x1910001f, 0x10006b00, 0x81451001, 0xd8205305,
1537d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x10006b00, 0x81011001, 0xd82050a4, 0x17c07c1f,
1547d116dccSCC Ma 	0x1910001f, 0x10006610, 0x81059001, 0xd8205304, 0x17c07c1f, 0x1910001f,
1557d116dccSCC Ma 	0x10006720, 0x81491001, 0xd8204de5, 0x17c07c1f, 0x1a40001f, 0x1000621c,
1567d116dccSCC Ma 	0x1a80001f, 0x1000626c, 0xc24010e0, 0x17c07c1f, 0x1910001f, 0x1000660c,
1577d116dccSCC Ma 	0x81059001, 0x1950001f, 0x10006610, 0x81459401, 0xa1001404, 0xd8004f44,
1587d116dccSCC Ma 	0x17c07c1f, 0xd0005220, 0x17c07c1f, 0x17c07c1f, 0x1910001f, 0x10006610,
1597d116dccSCC Ma 	0x81059001, 0xd8005304, 0x17c07c1f, 0x1a40001f, 0x1000621c, 0x1a80001f,
1607d116dccSCC Ma 	0x1000626c, 0xc2400ee0, 0x17c07c1f, 0x1910001f, 0x10006b00, 0x89000004,
1617d116dccSCC Ma 	0xfffffbff, 0x1940001f, 0x10006b00, 0xe1400004, 0x17c07c1f, 0x1910001f,
1627d116dccSCC Ma 	0x10006b00, 0x81459001, 0xd8205a25, 0x17c07c1f, 0x1910001f, 0x10006b00,
1637d116dccSCC Ma 	0x81019001, 0xd82057c4, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81061001,
1647d116dccSCC Ma 	0xd8205a24, 0x17c07c1f, 0x1910001f, 0x10006720, 0x81499001, 0xd8205505,
1657d116dccSCC Ma 	0x17c07c1f, 0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc24010e0,
1667d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x1000660c, 0x81061001, 0x1950001f, 0x10006610,
1677d116dccSCC Ma 	0x81461401, 0xa1001404, 0xd8005664, 0x17c07c1f, 0xd0005940, 0x17c07c1f,
1687d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x10006610, 0x81061001, 0xd8005a24, 0x17c07c1f,
1697d116dccSCC Ma 	0x1a40001f, 0x10006220, 0x1a80001f, 0x10006274, 0xc2400ee0, 0x17c07c1f,
1707d116dccSCC Ma 	0x1910001f, 0x10006b00, 0x89000004, 0xfffff7ff, 0x1940001f, 0x10006b00,
1717d116dccSCC Ma 	0xe1400004, 0x17c07c1f, 0x1910001f, 0x10006b00, 0x81461001, 0xd8206185,
1727d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x10006b00, 0x81021001, 0xd8205ec4, 0x17c07c1f,
1737d116dccSCC Ma 	0x1910001f, 0x10006610, 0x81081001, 0xd8206184, 0x17c07c1f, 0x1910001f,
1747d116dccSCC Ma 	0x10006720, 0x814a1001, 0xd8205c25, 0x17c07c1f, 0x1a40001f, 0x100062a0,
1757d116dccSCC Ma 	0x1280041f, 0xc2401540, 0x17c07c1f, 0x1910001f, 0x1000660c, 0x81081001,
1767d116dccSCC Ma 	0x1950001f, 0x10006610, 0x81481401, 0xa1001404, 0xd8005d64, 0x17c07c1f,
1777d116dccSCC Ma 	0xd00060a0, 0x17c07c1f, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81479001,
1787d116dccSCC Ma 	0x81881001, 0x69a00006, 0x00000000, 0x81401805, 0xd8206185, 0x17c07c1f,
1797d116dccSCC Ma 	0x1a40001f, 0x100062a0, 0x1280041f, 0xc2401240, 0x17c07c1f, 0x1910001f,
1807d116dccSCC Ma 	0x10006b00, 0x89000004, 0xffffefff, 0x1940001f, 0x10006b00, 0xe1400004,
1817d116dccSCC Ma 	0x17c07c1f, 0x1910001f, 0x10006b00, 0x81469001, 0xd82068e5, 0x17c07c1f,
1827d116dccSCC Ma 	0x1910001f, 0x10006b00, 0x81029001, 0xd8206624, 0x17c07c1f, 0x1910001f,
1837d116dccSCC Ma 	0x10006610, 0x81089001, 0xd82068e4, 0x17c07c1f, 0x1910001f, 0x10006720,
1847d116dccSCC Ma 	0x814a9001, 0xd8206385, 0x17c07c1f, 0x1a40001f, 0x100062a4, 0x1290841f,
1857d116dccSCC Ma 	0xc2401540, 0x17c07c1f, 0x1910001f, 0x1000660c, 0x81089001, 0x1950001f,
1867d116dccSCC Ma 	0x10006610, 0x81489401, 0xa1001404, 0xd80064c4, 0x17c07c1f, 0xd0006800,
1877d116dccSCC Ma 	0x17c07c1f, 0x17c07c1f, 0x1910001f, 0x10006610, 0x81479001, 0x81889001,
1887d116dccSCC Ma 	0x69a00006, 0x00000000, 0x81401805, 0xd82068e5, 0x17c07c1f, 0x1a40001f,
1897d116dccSCC Ma 	0x100062a4, 0x1290841f, 0xc2401240, 0x17c07c1f, 0x1910001f, 0x10006b00,
1907d116dccSCC Ma 	0x89000004, 0xffffdfff, 0x1940001f, 0x10006b00, 0xe1400004, 0x1910001f,
1917d116dccSCC Ma 	0x10006610, 0x81479001, 0x81881001, 0x69600005, 0x00000000, 0xa1401805,
1927d116dccSCC Ma 	0x81889001, 0xa1401805, 0xd8006bc5, 0x17c07c1f, 0x1910001f, 0x10006b00,
1937d116dccSCC Ma 	0x81421001, 0x82429001, 0x82802405, 0xd8206bca, 0x17c07c1f, 0x1a40001f,
1947d116dccSCC Ma 	0x100062b0, 0x1280041f, 0xc2400000, 0x17c07c1f, 0x1990001f, 0x10006b00,
1957d116dccSCC Ma 	0x89800006, 0x00003f00, 0x69200006, 0x00000000, 0xd82041e4, 0x17c07c1f,
1967d116dccSCC Ma 	0x1990001f, 0x10006320, 0x69200006, 0xbeefbeef, 0xd8006dc4, 0x17c07c1f,
1977d116dccSCC Ma 	0xd00041e0, 0x17c07c1f, 0x1910001f, 0x10006358, 0x810b1001, 0xd8006dc4,
1987d116dccSCC Ma 	0x17c07c1f, 0x1980001f, 0xdeaddead, 0x19c0001f, 0x01411820, 0xf0000000
1997d116dccSCC Ma };
2007d116dccSCC Ma static const struct pcm_desc hotplug_pcm = {
2017d116dccSCC Ma 	.version	= "pcm_power_down_mt8173_V37",
2027d116dccSCC Ma 	.base		= hotplug_binary,
2037d116dccSCC Ma 	.size		= 888,
2047d116dccSCC Ma 	.sess		= 2,
2057d116dccSCC Ma 	.replace	= 0,
2067d116dccSCC Ma };
2077d116dccSCC Ma 
2087d116dccSCC Ma static struct pwr_ctrl hotplug_ctrl = {
2097d116dccSCC Ma 	.wake_src = 0,
2107d116dccSCC Ma 	.wake_src_md32 = 0,
2117d116dccSCC Ma 	.wfi_op = WFI_OP_OR,
2127d116dccSCC Ma 	.mcusys_idle_mask = 1,
2137d116dccSCC Ma 	.ca7top_idle_mask = 1,
2147d116dccSCC Ma 	.ca15top_idle_mask = 1,
2157d116dccSCC Ma 	.disp_req_mask = 1,
2167d116dccSCC Ma 	.mfg_req_mask = 1,
2177d116dccSCC Ma 	.md32_req_mask = 1,
2187d116dccSCC Ma 	.syspwreq_mask = 1,
2197d116dccSCC Ma 	.pcm_flags = 0,
2207d116dccSCC Ma };
2217d116dccSCC Ma 
2227d116dccSCC Ma static const struct spm_lp_scen spm_hotplug = {
2237d116dccSCC Ma 	.pcmdesc = &hotplug_pcm,
2247d116dccSCC Ma 	.pwrctrl = &hotplug_ctrl,
2257d116dccSCC Ma };
2267d116dccSCC Ma 
2277d116dccSCC Ma void spm_go_to_hotplug(void)
2287d116dccSCC Ma {
2297d116dccSCC Ma 	const struct pcm_desc *pcmdesc = spm_hotplug.pcmdesc;
2307d116dccSCC Ma 	struct pwr_ctrl *pwrctrl = spm_hotplug.pwrctrl;
2317d116dccSCC Ma 
2327d116dccSCC Ma 	set_pwrctrl_pcm_flags(pwrctrl, 0);
2337d116dccSCC Ma 	spm_reset_and_init_pcm();
2347d116dccSCC Ma 	spm_kick_im_to_fetch(pcmdesc);
2357d116dccSCC Ma 	spm_set_power_control(pwrctrl);
2367d116dccSCC Ma 	spm_set_wakeup_event(pwrctrl);
2377d116dccSCC Ma 	spm_kick_pcm_to_run(pwrctrl);
2387d116dccSCC Ma }
2397d116dccSCC Ma 
2407d116dccSCC Ma void spm_clear_hotplug(void)
2417d116dccSCC Ma {
2427d116dccSCC Ma 	/* Inform SPM that CPU wants to program CPU_WAKEUP_EVENT and
2437d116dccSCC Ma 	 * DISABLE_CPU_DROM */
2447d116dccSCC Ma 
2457d116dccSCC Ma 	mmio_write_32(SPM_PCM_REG_DATA_INI, PCM_HANDSHAKE_SEND1);
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_FSM_STA) & PCM_END_FSM_STA_MASK)
2517d116dccSCC Ma 		!= PCM_END_FSM_STA_DEF)
2527d116dccSCC Ma 		;
2537d116dccSCC Ma 
2547d116dccSCC Ma 	/* no hotplug pcm running */
2557d116dccSCC Ma 	clear_all_ready();
2567d116dccSCC Ma }
2577d116dccSCC Ma 
2587d116dccSCC Ma void spm_hotplug_on(unsigned long mpidr)
2597d116dccSCC Ma {
2607d116dccSCC Ma 	unsigned long linear_id;
2617d116dccSCC Ma 
262*201d535fSKoan-Sin Tan 	linear_id = ((mpidr & MPIDR_CLUSTER_MASK) >> 6) |
263*201d535fSKoan-Sin Tan 			(mpidr & MPIDR_CPU_MASK);
264*201d535fSKoan-Sin Tan 
2657d116dccSCC Ma 	spm_lock_get();
2667d116dccSCC Ma 	if (is_hotplug_ready() == 0) {
2677d116dccSCC Ma 		spm_mcdi_wakeup_all_cores();
2687d116dccSCC Ma 		mmio_clrbits_32(SPM_PCM_RESERVE, PCM_HOTPLUG_VALID_MASK);
2697d116dccSCC Ma 		spm_go_to_hotplug();
2707d116dccSCC Ma 		set_hotplug_ready();
2717d116dccSCC Ma 	}
2727d116dccSCC Ma 	/* turn on CPUx */
2737d116dccSCC Ma 	mmio_clrsetbits_32(SPM_PCM_RESERVE,
2747d116dccSCC Ma 		PCM_HOTPLUG_VALID_MASK | (1 << linear_id),
2757d116dccSCC Ma 		1 << (linear_id + PCM_HOTPLUG_VALID_SHIFT));
2767d116dccSCC Ma 	spm_lock_release();
2777d116dccSCC Ma }
2787d116dccSCC Ma 
2797d116dccSCC Ma void spm_hotplug_off(unsigned long mpidr)
2807d116dccSCC Ma {
2817d116dccSCC Ma 	unsigned long linear_id;
2827d116dccSCC Ma 
283*201d535fSKoan-Sin Tan 	linear_id = ((mpidr & MPIDR_CLUSTER_MASK) >> 6) |
284*201d535fSKoan-Sin Tan 			(mpidr & MPIDR_CPU_MASK);
285*201d535fSKoan-Sin Tan 
2867d116dccSCC Ma 	spm_lock_get();
2877d116dccSCC Ma 	if (is_hotplug_ready() == 0) {
2887d116dccSCC Ma 		spm_mcdi_wakeup_all_cores();
2897d116dccSCC Ma 		mmio_clrbits_32(SPM_PCM_RESERVE, PCM_HOTPLUG_VALID_MASK);
2907d116dccSCC Ma 		spm_go_to_hotplug();
2917d116dccSCC Ma 		set_hotplug_ready();
2927d116dccSCC Ma 	}
2937d116dccSCC Ma 	mmio_clrsetbits_32(SPM_PCM_RESERVE, PCM_HOTPLUG_VALID_MASK,
2947d116dccSCC Ma 		(1 << linear_id) |
2957d116dccSCC Ma 		(1 << (linear_id + PCM_HOTPLUG_VALID_SHIFT)));
2967d116dccSCC Ma 	spm_lock_release();
2977d116dccSCC Ma }
298