108438e24SVarun Wadekar /* 2990c1e01SVarun Wadekar * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. 308438e24SVarun Wadekar * 408438e24SVarun Wadekar * Redistribution and use in source and binary forms, with or without 508438e24SVarun Wadekar * modification, are permitted provided that the following conditions are met: 608438e24SVarun Wadekar * 708438e24SVarun Wadekar * Redistributions of source code must retain the above copyright notice, this 808438e24SVarun Wadekar * list of conditions and the following disclaimer. 908438e24SVarun Wadekar * 1008438e24SVarun Wadekar * Redistributions in binary form must reproduce the above copyright notice, 1108438e24SVarun Wadekar * this list of conditions and the following disclaimer in the documentation 1208438e24SVarun Wadekar * and/or other materials provided with the distribution. 1308438e24SVarun Wadekar * 1408438e24SVarun Wadekar * Neither the name of ARM nor the names of its contributors may be used 1508438e24SVarun Wadekar * to endorse or promote products derived from this software without specific 1608438e24SVarun Wadekar * prior written permission. 1708438e24SVarun Wadekar * 1808438e24SVarun Wadekar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1908438e24SVarun Wadekar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2008438e24SVarun Wadekar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2108438e24SVarun Wadekar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2208438e24SVarun Wadekar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2308438e24SVarun Wadekar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2408438e24SVarun Wadekar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2508438e24SVarun Wadekar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2608438e24SVarun Wadekar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2708438e24SVarun Wadekar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2808438e24SVarun Wadekar * POSSIBILITY OF SUCH DAMAGE. 2908438e24SVarun Wadekar */ 3008438e24SVarun Wadekar 3108438e24SVarun Wadekar #include <arch_helpers.h> 3208438e24SVarun Wadekar #include <assert.h> 3308438e24SVarun Wadekar #include <bl_common.h> 3408438e24SVarun Wadekar #include <context.h> 3508438e24SVarun Wadekar #include <context_mgmt.h> 365b5928e8SVarun Wadekar #include <console.h> 3708438e24SVarun Wadekar #include <debug.h> 3808438e24SVarun Wadekar #include <memctrl.h> 3908438e24SVarun Wadekar #include <mmio.h> 4008438e24SVarun Wadekar #include <platform.h> 4108438e24SVarun Wadekar #include <platform_def.h> 4208438e24SVarun Wadekar #include <pmc.h> 4308438e24SVarun Wadekar #include <psci.h> 4408438e24SVarun Wadekar #include <tegra_def.h> 4508438e24SVarun Wadekar #include <tegra_private.h> 4608438e24SVarun Wadekar 4708438e24SVarun Wadekar extern uint64_t tegra_bl31_phys_base; 4871cb26eaSVarun Wadekar extern uint64_t tegra_sec_entry_point; 495b5928e8SVarun Wadekar extern uint64_t tegra_console_base; 5008438e24SVarun Wadekar 5108438e24SVarun Wadekar /* 5208438e24SVarun Wadekar * The following platform setup functions are weakly defined. They 5308438e24SVarun Wadekar * provide typical implementations that will be overridden by a SoC. 5408438e24SVarun Wadekar */ 5571cb26eaSVarun Wadekar #pragma weak tegra_soc_pwr_domain_suspend 5671cb26eaSVarun Wadekar #pragma weak tegra_soc_pwr_domain_on 5771cb26eaSVarun Wadekar #pragma weak tegra_soc_pwr_domain_off 5871cb26eaSVarun Wadekar #pragma weak tegra_soc_pwr_domain_on_finish 5926c0d9b2SVarun Wadekar #pragma weak tegra_soc_pwr_domain_power_down_wfi 603b40f993SVarun Wadekar #pragma weak tegra_soc_prepare_system_reset 6131a4957cSVarun Wadekar #pragma weak tegra_soc_prepare_system_off 62a7cd0953SVarun Wadekar #pragma weak tegra_soc_get_target_pwr_state 6308438e24SVarun Wadekar 6471cb26eaSVarun Wadekar int tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state) 6508438e24SVarun Wadekar { 6608438e24SVarun Wadekar return PSCI_E_NOT_SUPPORTED; 6708438e24SVarun Wadekar } 6808438e24SVarun Wadekar 6971cb26eaSVarun Wadekar int tegra_soc_pwr_domain_on(u_register_t mpidr) 7008438e24SVarun Wadekar { 7108438e24SVarun Wadekar return PSCI_E_SUCCESS; 7208438e24SVarun Wadekar } 7308438e24SVarun Wadekar 7471cb26eaSVarun Wadekar int tegra_soc_pwr_domain_off(const psci_power_state_t *target_state) 7508438e24SVarun Wadekar { 7608438e24SVarun Wadekar return PSCI_E_SUCCESS; 7708438e24SVarun Wadekar } 7808438e24SVarun Wadekar 7971cb26eaSVarun Wadekar int tegra_soc_pwr_domain_on_finish(const psci_power_state_t *target_state) 8008438e24SVarun Wadekar { 8108438e24SVarun Wadekar return PSCI_E_SUCCESS; 8208438e24SVarun Wadekar } 8308438e24SVarun Wadekar 8426c0d9b2SVarun Wadekar int tegra_soc_pwr_domain_power_down_wfi(const psci_power_state_t *target_state) 8526c0d9b2SVarun Wadekar { 8626c0d9b2SVarun Wadekar return PSCI_E_SUCCESS; 8726c0d9b2SVarun Wadekar } 8826c0d9b2SVarun Wadekar 893b40f993SVarun Wadekar int tegra_soc_prepare_system_reset(void) 903b40f993SVarun Wadekar { 913b40f993SVarun Wadekar return PSCI_E_SUCCESS; 923b40f993SVarun Wadekar } 933b40f993SVarun Wadekar 9431a4957cSVarun Wadekar __dead2 void tegra_soc_prepare_system_off(void) 9531a4957cSVarun Wadekar { 9631a4957cSVarun Wadekar ERROR("Tegra System Off: operation not handled.\n"); 9731a4957cSVarun Wadekar panic(); 9831a4957cSVarun Wadekar } 9931a4957cSVarun Wadekar 100a7cd0953SVarun Wadekar plat_local_state_t tegra_soc_get_target_pwr_state(unsigned int lvl, 101a7cd0953SVarun Wadekar const plat_local_state_t *states, 102a7cd0953SVarun Wadekar unsigned int ncpu) 103a7cd0953SVarun Wadekar { 1048539f45dSVarun Wadekar plat_local_state_t target = PLAT_MAX_OFF_STATE, temp; 105a7cd0953SVarun Wadekar 106a7cd0953SVarun Wadekar assert(ncpu); 107a7cd0953SVarun Wadekar 108a7cd0953SVarun Wadekar do { 109a7cd0953SVarun Wadekar temp = *states++; 1108539f45dSVarun Wadekar if ((temp < target)) 111a7cd0953SVarun Wadekar target = temp; 112a7cd0953SVarun Wadekar } while (--ncpu); 113a7cd0953SVarun Wadekar 114a7cd0953SVarun Wadekar return target; 115a7cd0953SVarun Wadekar } 116a7cd0953SVarun Wadekar 11708438e24SVarun Wadekar /******************************************************************************* 11871cb26eaSVarun Wadekar * This handler is called by the PSCI implementation during the `SYSTEM_SUSPEND` 11971cb26eaSVarun Wadekar * call to get the `power_state` parameter. This allows the platform to encode 12071cb26eaSVarun Wadekar * the appropriate State-ID field within the `power_state` parameter which can 12171cb26eaSVarun Wadekar * be utilized in `pwr_domain_suspend()` to suspend to system affinity level. 12208438e24SVarun Wadekar ******************************************************************************/ 12371cb26eaSVarun Wadekar void tegra_get_sys_suspend_power_state(psci_power_state_t *req_state) 12408438e24SVarun Wadekar { 125a7cd0953SVarun Wadekar /* all affinities use system suspend state id */ 126a7cd0953SVarun Wadekar for (int i = MPIDR_AFFLVL0; i <= PLAT_MAX_PWR_LVL; i++) 127a7cd0953SVarun Wadekar req_state->pwr_domain_state[i] = PSTATE_ID_SOC_POWERDN; 12808438e24SVarun Wadekar } 12908438e24SVarun Wadekar 13008438e24SVarun Wadekar /******************************************************************************* 13108438e24SVarun Wadekar * Handler called when an affinity instance is about to enter standby. 13208438e24SVarun Wadekar ******************************************************************************/ 13371cb26eaSVarun Wadekar void tegra_cpu_standby(plat_local_state_t cpu_state) 13408438e24SVarun Wadekar { 13508438e24SVarun Wadekar /* 13608438e24SVarun Wadekar * Enter standby state 13708438e24SVarun Wadekar * dsb is good practice before using wfi to enter low power states 13808438e24SVarun Wadekar */ 13908438e24SVarun Wadekar dsb(); 14008438e24SVarun Wadekar wfi(); 14108438e24SVarun Wadekar } 14208438e24SVarun Wadekar 14308438e24SVarun Wadekar /******************************************************************************* 14408438e24SVarun Wadekar * Handler called when an affinity instance is about to be turned on. The 14508438e24SVarun Wadekar * level and mpidr determine the affinity instance. 14608438e24SVarun Wadekar ******************************************************************************/ 14771cb26eaSVarun Wadekar int tegra_pwr_domain_on(u_register_t mpidr) 14808438e24SVarun Wadekar { 14971cb26eaSVarun Wadekar return tegra_soc_pwr_domain_on(mpidr); 15008438e24SVarun Wadekar } 15108438e24SVarun Wadekar 15208438e24SVarun Wadekar /******************************************************************************* 15371cb26eaSVarun Wadekar * Handler called when a power domain is about to be turned off. The 15471cb26eaSVarun Wadekar * target_state encodes the power state that each level should transition to. 15508438e24SVarun Wadekar ******************************************************************************/ 15671cb26eaSVarun Wadekar void tegra_pwr_domain_off(const psci_power_state_t *target_state) 15708438e24SVarun Wadekar { 15871cb26eaSVarun Wadekar tegra_soc_pwr_domain_off(target_state); 15908438e24SVarun Wadekar } 16008438e24SVarun Wadekar 16108438e24SVarun Wadekar /******************************************************************************* 16226c0d9b2SVarun Wadekar * Handler called when a power domain is about to be suspended. The 16371cb26eaSVarun Wadekar * target_state encodes the power state that each level should transition to. 16408438e24SVarun Wadekar ******************************************************************************/ 16571cb26eaSVarun Wadekar void tegra_pwr_domain_suspend(const psci_power_state_t *target_state) 16608438e24SVarun Wadekar { 16771cb26eaSVarun Wadekar tegra_soc_pwr_domain_suspend(target_state); 16808438e24SVarun Wadekar 1695b5928e8SVarun Wadekar /* Disable console if we are entering deep sleep. */ 1705b5928e8SVarun Wadekar if (target_state->pwr_domain_state[PLAT_MAX_PWR_LVL] == 1715b5928e8SVarun Wadekar PSTATE_ID_SOC_POWERDN) 1725b5928e8SVarun Wadekar console_uninit(); 1735b5928e8SVarun Wadekar 17408438e24SVarun Wadekar /* disable GICC */ 17508438e24SVarun Wadekar tegra_gic_cpuif_deactivate(); 17608438e24SVarun Wadekar } 17708438e24SVarun Wadekar 17808438e24SVarun Wadekar /******************************************************************************* 17926c0d9b2SVarun Wadekar * Handler called at the end of the power domain suspend sequence. The 18026c0d9b2SVarun Wadekar * target_state encodes the power state that each level should transition to. 18126c0d9b2SVarun Wadekar ******************************************************************************/ 18226c0d9b2SVarun Wadekar __dead2 void tegra_pwr_domain_power_down_wfi(const psci_power_state_t 18326c0d9b2SVarun Wadekar *target_state) 18426c0d9b2SVarun Wadekar { 18526c0d9b2SVarun Wadekar /* call the chip's power down handler */ 18626c0d9b2SVarun Wadekar tegra_soc_pwr_domain_power_down_wfi(target_state); 18726c0d9b2SVarun Wadekar 18826c0d9b2SVarun Wadekar /* enter power down state */ 18926c0d9b2SVarun Wadekar wfi(); 19026c0d9b2SVarun Wadekar 19126c0d9b2SVarun Wadekar /* we can never reach here */ 19226c0d9b2SVarun Wadekar ERROR("%s: operation not handled.\n", __func__); 19326c0d9b2SVarun Wadekar panic(); 19426c0d9b2SVarun Wadekar } 19526c0d9b2SVarun Wadekar 19626c0d9b2SVarun Wadekar /******************************************************************************* 19771cb26eaSVarun Wadekar * Handler called when a power domain has just been powered on after 19871cb26eaSVarun Wadekar * being turned off earlier. The target_state encodes the low power state that 19971cb26eaSVarun Wadekar * each level has woken up from. 20008438e24SVarun Wadekar ******************************************************************************/ 20171cb26eaSVarun Wadekar void tegra_pwr_domain_on_finish(const psci_power_state_t *target_state) 20208438e24SVarun Wadekar { 20308438e24SVarun Wadekar plat_params_from_bl2_t *plat_params; 20408438e24SVarun Wadekar 20508438e24SVarun Wadekar /* 20608438e24SVarun Wadekar * Initialize the GIC cpu and distributor interfaces 20708438e24SVarun Wadekar */ 208d3360301SVarun Wadekar plat_gic_setup(); 20908438e24SVarun Wadekar 21008438e24SVarun Wadekar /* 21108438e24SVarun Wadekar * Check if we are exiting from deep sleep. 21208438e24SVarun Wadekar */ 21371cb26eaSVarun Wadekar if (target_state->pwr_domain_state[PLAT_MAX_PWR_LVL] == 21471cb26eaSVarun Wadekar PSTATE_ID_SOC_POWERDN) { 21508438e24SVarun Wadekar 2165b5928e8SVarun Wadekar /* Initialize the runtime console */ 217*9b514f83SDamon Duan if (tegra_console_base != (uint64_t)0) { 2185b5928e8SVarun Wadekar console_init(tegra_console_base, TEGRA_BOOT_UART_CLK_IN_HZ, 2195b5928e8SVarun Wadekar TEGRA_CONSOLE_BAUDRATE); 220*9b514f83SDamon Duan } 2215b5928e8SVarun Wadekar 22208438e24SVarun Wadekar /* 223102e4087SVarun Wadekar * Restore Memory Controller settings as it loses state 224102e4087SVarun Wadekar * during system suspend. 22508438e24SVarun Wadekar */ 226102e4087SVarun Wadekar tegra_memctrl_restore_settings(); 22708438e24SVarun Wadekar 22808438e24SVarun Wadekar /* 22908438e24SVarun Wadekar * Security configuration to allow DRAM/device access. 23008438e24SVarun Wadekar */ 23108438e24SVarun Wadekar plat_params = bl31_get_plat_params(); 232e0d4158cSVarun Wadekar tegra_memctrl_tzdram_setup(plat_params->tzdram_base, 23308438e24SVarun Wadekar plat_params->tzdram_size); 234207680c6SVarun Wadekar 235207680c6SVarun Wadekar /* 236207680c6SVarun Wadekar * Set up the TZRAM memory aperture to allow only secure world 237207680c6SVarun Wadekar * access 238207680c6SVarun Wadekar */ 239207680c6SVarun Wadekar tegra_memctrl_tzram_setup(TEGRA_TZRAM_BASE, TEGRA_TZRAM_SIZE); 24008438e24SVarun Wadekar } 24108438e24SVarun Wadekar 24208438e24SVarun Wadekar /* 24308438e24SVarun Wadekar * Reset hardware settings. 24408438e24SVarun Wadekar */ 24571cb26eaSVarun Wadekar tegra_soc_pwr_domain_on_finish(target_state); 24608438e24SVarun Wadekar } 24708438e24SVarun Wadekar 24808438e24SVarun Wadekar /******************************************************************************* 24971cb26eaSVarun Wadekar * Handler called when a power domain has just been powered on after 25071cb26eaSVarun Wadekar * having been suspended earlier. The target_state encodes the low power state 25171cb26eaSVarun Wadekar * that each level has woken up from. 25208438e24SVarun Wadekar ******************************************************************************/ 25371cb26eaSVarun Wadekar void tegra_pwr_domain_suspend_finish(const psci_power_state_t *target_state) 25408438e24SVarun Wadekar { 25571cb26eaSVarun Wadekar tegra_pwr_domain_on_finish(target_state); 25608438e24SVarun Wadekar } 25708438e24SVarun Wadekar 25808438e24SVarun Wadekar /******************************************************************************* 25908438e24SVarun Wadekar * Handler called when the system wants to be powered off 26008438e24SVarun Wadekar ******************************************************************************/ 26108438e24SVarun Wadekar __dead2 void tegra_system_off(void) 26208438e24SVarun Wadekar { 26331a4957cSVarun Wadekar INFO("Powering down system...\n"); 26431a4957cSVarun Wadekar 26531a4957cSVarun Wadekar tegra_soc_prepare_system_off(); 26608438e24SVarun Wadekar } 26708438e24SVarun Wadekar 26808438e24SVarun Wadekar /******************************************************************************* 26908438e24SVarun Wadekar * Handler called when the system wants to be restarted. 27008438e24SVarun Wadekar ******************************************************************************/ 27108438e24SVarun Wadekar __dead2 void tegra_system_reset(void) 27208438e24SVarun Wadekar { 27331a4957cSVarun Wadekar INFO("Restarting system...\n"); 27431a4957cSVarun Wadekar 2753b40f993SVarun Wadekar /* per-SoC system reset handler */ 2763b40f993SVarun Wadekar tegra_soc_prepare_system_reset(); 2773b40f993SVarun Wadekar 27808438e24SVarun Wadekar /* 27908438e24SVarun Wadekar * Program the PMC in order to restart the system. 28008438e24SVarun Wadekar */ 28108438e24SVarun Wadekar tegra_pmc_system_reset(); 28208438e24SVarun Wadekar } 28308438e24SVarun Wadekar 28408438e24SVarun Wadekar /******************************************************************************* 28571cb26eaSVarun Wadekar * Handler called to check the validity of the power state parameter. 28671cb26eaSVarun Wadekar ******************************************************************************/ 28771cb26eaSVarun Wadekar int32_t tegra_validate_power_state(unsigned int power_state, 28871cb26eaSVarun Wadekar psci_power_state_t *req_state) 28971cb26eaSVarun Wadekar { 29071cb26eaSVarun Wadekar assert(req_state); 29171cb26eaSVarun Wadekar 29271cb26eaSVarun Wadekar return tegra_soc_validate_power_state(power_state, req_state); 29371cb26eaSVarun Wadekar } 29471cb26eaSVarun Wadekar 29571cb26eaSVarun Wadekar /******************************************************************************* 29671cb26eaSVarun Wadekar * Platform handler called to check the validity of the non secure entrypoint. 29771cb26eaSVarun Wadekar ******************************************************************************/ 29871cb26eaSVarun Wadekar int tegra_validate_ns_entrypoint(uintptr_t entrypoint) 29971cb26eaSVarun Wadekar { 30071cb26eaSVarun Wadekar /* 30171cb26eaSVarun Wadekar * Check if the non secure entrypoint lies within the non 30271cb26eaSVarun Wadekar * secure DRAM. 30371cb26eaSVarun Wadekar */ 30471cb26eaSVarun Wadekar if ((entrypoint >= TEGRA_DRAM_BASE) && (entrypoint <= TEGRA_DRAM_END)) 30571cb26eaSVarun Wadekar return PSCI_E_SUCCESS; 30671cb26eaSVarun Wadekar 30771cb26eaSVarun Wadekar return PSCI_E_INVALID_ADDRESS; 30871cb26eaSVarun Wadekar } 30971cb26eaSVarun Wadekar 31071cb26eaSVarun Wadekar /******************************************************************************* 31108438e24SVarun Wadekar * Export the platform handlers to enable psci to invoke them 31208438e24SVarun Wadekar ******************************************************************************/ 31371cb26eaSVarun Wadekar static const plat_psci_ops_t tegra_plat_psci_ops = { 31471cb26eaSVarun Wadekar .cpu_standby = tegra_cpu_standby, 31571cb26eaSVarun Wadekar .pwr_domain_on = tegra_pwr_domain_on, 31671cb26eaSVarun Wadekar .pwr_domain_off = tegra_pwr_domain_off, 31771cb26eaSVarun Wadekar .pwr_domain_suspend = tegra_pwr_domain_suspend, 31871cb26eaSVarun Wadekar .pwr_domain_on_finish = tegra_pwr_domain_on_finish, 31971cb26eaSVarun Wadekar .pwr_domain_suspend_finish = tegra_pwr_domain_suspend_finish, 32026c0d9b2SVarun Wadekar .pwr_domain_pwr_down_wfi = tegra_pwr_domain_power_down_wfi, 32108438e24SVarun Wadekar .system_off = tegra_system_off, 32208438e24SVarun Wadekar .system_reset = tegra_system_reset, 32394c672e7SVarun Wadekar .validate_power_state = tegra_validate_power_state, 32471cb26eaSVarun Wadekar .validate_ns_entrypoint = tegra_validate_ns_entrypoint, 32571cb26eaSVarun Wadekar .get_sys_suspend_power_state = tegra_get_sys_suspend_power_state, 32608438e24SVarun Wadekar }; 32708438e24SVarun Wadekar 32808438e24SVarun Wadekar /******************************************************************************* 32971cb26eaSVarun Wadekar * Export the platform specific power ops and initialize Power Controller 33008438e24SVarun Wadekar ******************************************************************************/ 33171cb26eaSVarun Wadekar int plat_setup_psci_ops(uintptr_t sec_entrypoint, 33271cb26eaSVarun Wadekar const plat_psci_ops_t **psci_ops) 33308438e24SVarun Wadekar { 33471cb26eaSVarun Wadekar psci_power_state_t target_state = { { PSCI_LOCAL_STATE_RUN } }; 33571cb26eaSVarun Wadekar 33671cb26eaSVarun Wadekar /* 33771cb26eaSVarun Wadekar * Flush entrypoint variable to PoC since it will be 33871cb26eaSVarun Wadekar * accessed after a reset with the caches turned off. 33971cb26eaSVarun Wadekar */ 34071cb26eaSVarun Wadekar tegra_sec_entry_point = sec_entrypoint; 34171cb26eaSVarun Wadekar flush_dcache_range((uint64_t)&tegra_sec_entry_point, sizeof(uint64_t)); 34271cb26eaSVarun Wadekar 34308438e24SVarun Wadekar /* 34408438e24SVarun Wadekar * Reset hardware settings. 34508438e24SVarun Wadekar */ 34671cb26eaSVarun Wadekar tegra_soc_pwr_domain_on_finish(&target_state); 34708438e24SVarun Wadekar 34808438e24SVarun Wadekar /* 34971cb26eaSVarun Wadekar * Initialize PSCI ops struct 35008438e24SVarun Wadekar */ 35171cb26eaSVarun Wadekar *psci_ops = &tegra_plat_psci_ops; 35208438e24SVarun Wadekar 35308438e24SVarun Wadekar return 0; 35408438e24SVarun Wadekar } 3552693f1dbSVarun Wadekar 3562693f1dbSVarun Wadekar /******************************************************************************* 3572693f1dbSVarun Wadekar * Platform handler to calculate the proper target power level at the 3582693f1dbSVarun Wadekar * specified affinity level 3592693f1dbSVarun Wadekar ******************************************************************************/ 3602693f1dbSVarun Wadekar plat_local_state_t plat_get_target_pwr_state(unsigned int lvl, 3612693f1dbSVarun Wadekar const plat_local_state_t *states, 3622693f1dbSVarun Wadekar unsigned int ncpu) 3632693f1dbSVarun Wadekar { 364a7cd0953SVarun Wadekar return tegra_soc_get_target_pwr_state(lvl, states, ncpu); 3652693f1dbSVarun Wadekar } 366