1*aed177ceSRunyang Chen /* 2*aed177ceSRunyang Chen * Copyright (c) 2025, MediaTek Inc. All rights reserved. 3*aed177ceSRunyang Chen * 4*aed177ceSRunyang Chen * SPDX-License-Identifier: BSD-3-Clause 5*aed177ceSRunyang Chen */ 6*aed177ceSRunyang Chen #include <arch_helpers.h> 7*aed177ceSRunyang Chen #include <common/debug.h> 8*aed177ceSRunyang Chen #include <lib/mmio.h> 9*aed177ceSRunyang Chen #include <dfd.h> 10*aed177ceSRunyang Chen #include <plat_dfd.h> 11*aed177ceSRunyang Chen 12*aed177ceSRunyang Chen struct dfd_mcu_ext_pair { 13*aed177ceSRunyang Chen uint32_t reg; 14*aed177ceSRunyang Chen uint32_t val; 15*aed177ceSRunyang Chen }; 16*aed177ceSRunyang Chen 17*aed177ceSRunyang Chen static const struct dfd_mcu_ext_pair ext_init_array[] = { 18*aed177ceSRunyang Chen { DFD_INTERNAL_CTL, 0x0018200D }, 19*aed177ceSRunyang Chen { DFD_INTERNAL_PWR_ON, 0x0000000B }, 20*aed177ceSRunyang Chen { DFD_INTERNAL_SHIFT_CLK_RATIO, 0x00000000 }, 21*aed177ceSRunyang Chen { DFD_INTERNAL_TEST_SO_OVER_64, 0x00000001 }, 22*aed177ceSRunyang Chen { DFD_TEST_SI_0, 0x00000000 }, 23*aed177ceSRunyang Chen { DFD_TEST_SI_1, 0x00000000 }, 24*aed177ceSRunyang Chen { DFD_TEST_SI_2, 0x00000000 }, 25*aed177ceSRunyang Chen { DFD_TEST_SI_3, 0x00000000 }, 26*aed177ceSRunyang Chen { DFD_INTERNAL_CHAIN_GROUP, 0x00000013 }, 27*aed177ceSRunyang Chen { DFD_INTERNAL_CHAIN_INV_INFO_LL, 0x00000002 }, 28*aed177ceSRunyang Chen { DFD_INTERNAL_CHAIN_INV_INFO_LH, 0x40444444 }, 29*aed177ceSRunyang Chen { DFD_INTERNAL_CHAIN_INV_INFO_HL, 0x00000040 }, 30*aed177ceSRunyang Chen { DFD_INTERNAL_CHAIN_INV_INFO_HH, 0x00000000 }, 31*aed177ceSRunyang Chen { DFD_POWER_CTL, 0x000000F9 }, 32*aed177ceSRunyang Chen { DFD_READ_ADDR, 0x000000F9 }, 33*aed177ceSRunyang Chen { DFD_V50_GROUP_0_1_DIFF, 1 }, 34*aed177ceSRunyang Chen { DFD_V50_GROUP_0_2_DIFF, 236 }, 35*aed177ceSRunyang Chen { DFD_V50_GROUP_0_3_DIFF, 1466 }, 36*aed177ceSRunyang Chen { DFD_V50_GROUP_0_4_DIFF, 4885 }, 37*aed177ceSRunyang Chen { DFD_V50_GROUP_0_5_DIFF, 17935 }, 38*aed177ceSRunyang Chen { DFD_V50_GROUP_0_6_DIFF, 22364 }, 39*aed177ceSRunyang Chen { DFD_V50_GROUP_0_7_DIFF, 23268 }, 40*aed177ceSRunyang Chen { DFD_V50_GROUP_0_8_DIFF, 31878 }, 41*aed177ceSRunyang Chen { DFD_V50_GROUP_0_9_DIFF, 31879 }, 42*aed177ceSRunyang Chen { DFD_V50_GROUP_0_10_DIFF, 35472 }, 43*aed177ceSRunyang Chen { DFD_V50_GROUP_0_11_DIFF, 35473 }, 44*aed177ceSRunyang Chen { DFD_V50_GROUP_0_12_DIFF, 35540 }, 45*aed177ceSRunyang Chen { DFD_V50_GROUP_0_13_DIFF, 36145 }, 46*aed177ceSRunyang Chen { DFD_V50_GROUP_0_14_DIFF, 37666 }, 47*aed177ceSRunyang Chen { DFD_V50_GROUP_0_15_DIFF, 37667 }, 48*aed177ceSRunyang Chen { DFD_V50_GROUP_0_16_DIFF, 46039 }, 49*aed177ceSRunyang Chen { DFD_V50_GROUP_0_17_DIFF, 48314 }, 50*aed177ceSRunyang Chen { DFD_V50_GROUP_0_18_DIFF, 48705 }, 51*aed177ceSRunyang Chen { DFD_V50_GROUP_0_19_DIFF, 0 }, 52*aed177ceSRunyang Chen { DFD_V50_GROUP_0_20_DIFF, 0 }, 53*aed177ceSRunyang Chen { DFD_V50_GROUP_0_21_DIFF, 0 }, 54*aed177ceSRunyang Chen { DFD_V50_GROUP_0_22_DIFF, 0 }, 55*aed177ceSRunyang Chen { DFD_V50_GROUP_0_23_DIFF, 0 }, 56*aed177ceSRunyang Chen { DFD_V50_GROUP_0_24_DIFF, 0 }, 57*aed177ceSRunyang Chen { DFD_V50_GROUP_0_25_DIFF, 0 }, 58*aed177ceSRunyang Chen { DFD_V50_GROUP_0_26_DIFF, 0 }, 59*aed177ceSRunyang Chen { DFD_V50_GROUP_0_27_DIFF, 0 }, 60*aed177ceSRunyang Chen { DFD_V50_GROUP_0_28_DIFF, 0 }, 61*aed177ceSRunyang Chen { DFD_V50_GROUP_0_29_DIFF, 0 }, 62*aed177ceSRunyang Chen { DFD_V50_GROUP_0_30_DIFF, 0 }, 63*aed177ceSRunyang Chen { DFD_V50_GROUP_0_31_DIFF, 0 }, 64*aed177ceSRunyang Chen { DFD_V50_GROUP_0_32_DIFF, 0 }, 65*aed177ceSRunyang Chen { DFD_V50_GROUP_0_33_DIFF, 0 }, 66*aed177ceSRunyang Chen { DFD_V50_GROUP_0_34_DIFF, 0 }, 67*aed177ceSRunyang Chen { DFD_V50_GROUP_0_35_DIFF, 0 }, 68*aed177ceSRunyang Chen { DFD_V50_GROUP_0_36_DIFF, 0 }, 69*aed177ceSRunyang Chen { DFD_V50_GROUP_0_37_DIFF, 0 }, 70*aed177ceSRunyang Chen { DFD_V50_GROUP_0_38_DIFF, 0 }, 71*aed177ceSRunyang Chen { DFD_V50_GROUP_0_39_DIFF, 0 }, 72*aed177ceSRunyang Chen { DFD_V50_GROUP_0_40_DIFF, 0 }, 73*aed177ceSRunyang Chen { DFD_V50_GROUP_0_41_DIFF, 0 }, 74*aed177ceSRunyang Chen { DFD_V50_GROUP_0_42_DIFF, 0 }, 75*aed177ceSRunyang Chen { DFD_V50_GROUP_0_43_DIFF, 0 }, 76*aed177ceSRunyang Chen { DFD_V50_GROUP_0_44_DIFF, 0 }, 77*aed177ceSRunyang Chen { DFD_V50_GROUP_0_45_DIFF, 0 }, 78*aed177ceSRunyang Chen { DFD_V50_GROUP_0_46_DIFF, 0 }, 79*aed177ceSRunyang Chen { DFD_V50_GROUP_0_47_DIFF, 0 }, 80*aed177ceSRunyang Chen { DFD_V50_GROUP_0_48_DIFF, 0 }, 81*aed177ceSRunyang Chen { DFD_V50_GROUP_0_49_DIFF, 0 }, 82*aed177ceSRunyang Chen { DFD_V50_GROUP_0_50_DIFF, 0 }, 83*aed177ceSRunyang Chen { DFD_V50_GROUP_0_51_DIFF, 0 }, 84*aed177ceSRunyang Chen { DFD_V50_GROUP_0_52_DIFF, 0 }, 85*aed177ceSRunyang Chen { DFD_V50_GROUP_0_53_DIFF, 0 }, 86*aed177ceSRunyang Chen { DFD_V50_GROUP_0_54_DIFF, 0 }, 87*aed177ceSRunyang Chen { DFD_V50_GROUP_0_55_DIFF, 0 }, 88*aed177ceSRunyang Chen { DFD_V50_GROUP_0_56_DIFF, 0 }, 89*aed177ceSRunyang Chen { DFD_V50_GROUP_0_57_DIFF, 0 }, 90*aed177ceSRunyang Chen { DFD_V50_GROUP_0_58_DIFF, 0 }, 91*aed177ceSRunyang Chen { DFD_V50_GROUP_0_59_DIFF, 0 }, 92*aed177ceSRunyang Chen { DFD_V50_GROUP_0_60_DIFF, 0 }, 93*aed177ceSRunyang Chen { DFD_V50_GROUP_0_61_DIFF, 0 }, 94*aed177ceSRunyang Chen { DFD_V50_GROUP_0_62_DIFF, 0 }, 95*aed177ceSRunyang Chen { DFD_V50_GROUP_0_63_DIFF, 0x00000001 }, 96*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_3_0_INFO, 0x00100400 }, 97*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_7_4_INFO, 0x0b0a0a0a }, 98*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_11_8_INFO, 0x12120b0b }, 99*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_15_12_INFO, 0x08080812 }, 100*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_19_16_INFO, 0x09090909 }, 101*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_23_20_INFO, 0x0e0e0d05 }, 102*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_27_24_INFO, 0x0e0e0e0e }, 103*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_31_28_INFO, 0x0e0e0e0e }, 104*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_35_32_INFO, 0x06070f0f }, 105*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_39_36_INFO, 0x06070c06 }, 106*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_43_40_INFO, 0x06070c06 }, 107*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_47_44_INFO, 0x06070c06 }, 108*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_51_48_INFO, 0x06070c06 }, 109*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_55_52_INFO, 0x06070c06 }, 110*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_59_56_INFO, 0x00000c06 }, 111*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_63_60_INFO, 0x11030000 }, 112*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_67_64_INFO, 0x00000002 }, 113*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_71_68_INFO, 0x11030101 }, 114*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_75_72_INFO, 0x00000002 }, 115*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_79_76_INFO, 0x00000101 }, 116*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_83_80_INFO, 0x00000000 }, 117*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_87_84_INFO, 0x00000000 }, 118*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_91_88_INFO, 0x00000000 }, 119*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_95_92_INFO, 0x00000000 }, 120*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_99_96_INFO, 0x00000000 }, 121*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_103_100_INFO, 0x00000000 }, 122*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_107_104_INFO, 0x00000000 }, 123*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_111_108_INFO, 0x00000000 }, 124*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_115_112_INFO, 0x00000000 }, 125*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_119_116_INFO, 0x00000000 }, 126*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_123_120_INFO, 0x00000000 }, 127*aed177ceSRunyang Chen { DFD_V50_CHAIN_GROUP_127_124_INFO, 0x00000000 }, 128*aed177ceSRunyang Chen }; 129*aed177ceSRunyang Chen 130*aed177ceSRunyang Chen static uint64_t dfd_cache_dump; 131*aed177ceSRunyang Chen static bool dfd_enabled; 132*aed177ceSRunyang Chen static uint64_t dfd_base_addr; 133*aed177ceSRunyang Chen static uint64_t dfd_chain_length; 134*aed177ceSRunyang Chen 135*aed177ceSRunyang Chen void dfd_setup(uint64_t base_addr, uint64_t chain_length, uint64_t cache_dump) 136*aed177ceSRunyang Chen { 137*aed177ceSRunyang Chen unsigned int i; 138*aed177ceSRunyang Chen 139*aed177ceSRunyang Chen mmio_write_32(DFD_INTERNAL_CHAIN_LENGTH_0, chain_length); 140*aed177ceSRunyang Chen mmio_write_32(DFD_O_SET_BASEADDR_REG, base_addr >> 24); 141*aed177ceSRunyang Chen 142*aed177ceSRunyang Chen /* setup global variables for suspend and resume */ 143*aed177ceSRunyang Chen dfd_enabled = true; 144*aed177ceSRunyang Chen dfd_base_addr = base_addr; 145*aed177ceSRunyang Chen dfd_chain_length = chain_length; 146*aed177ceSRunyang Chen dfd_cache_dump = cache_dump; 147*aed177ceSRunyang Chen 148*aed177ceSRunyang Chen for (i = 0; i < ARRAY_SIZE(ext_init_array); i++) 149*aed177ceSRunyang Chen mmio_write_32(ext_init_array[i].reg, ext_init_array[i].val); 150*aed177ceSRunyang Chen 151*aed177ceSRunyang Chen if ((cache_dump & DFD_CACHE_DUMP_ENABLE) != 0UL) { 152*aed177ceSRunyang Chen sync_writel(DFD_V35_ENABLE, 0x1); 153*aed177ceSRunyang Chen sync_writel(DFD_V35_TAP_NUMBER, 0xB); 154*aed177ceSRunyang Chen sync_writel(DFD_V35_TAP_EN, DFD_V35_TAP_EN_VAL); 155*aed177ceSRunyang Chen sync_writel(DFD_V35_SEQ0_0, DFD_V35_SEQ0_0_VAL); 156*aed177ceSRunyang Chen } 157*aed177ceSRunyang Chen dsbsy(); 158*aed177ceSRunyang Chen } 159*aed177ceSRunyang Chen 160*aed177ceSRunyang Chen void dfd_resume(void) 161*aed177ceSRunyang Chen { 162*aed177ceSRunyang Chen if (dfd_enabled == true) { 163*aed177ceSRunyang Chen dfd_setup(dfd_base_addr, dfd_chain_length, dfd_cache_dump); 164*aed177ceSRunyang Chen } 165*aed177ceSRunyang Chen } 166