1d837ccd8SManish V Badarkhe /* 2d837ccd8SManish V Badarkhe * Copyright (c) 2025, Arm Limited. All rights reserved. 3d837ccd8SManish V Badarkhe * 4d837ccd8SManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 5d837ccd8SManish V Badarkhe */ 6d837ccd8SManish V Badarkhe 7*f024c573SManish V Badarkhe #include <lib/el3_runtime/context_mgmt.h> 8*f024c573SManish V Badarkhe #include <plat/common/platform.h> 9*f024c573SManish V Badarkhe #include <services/lfa_holding_pen.h> 10d837ccd8SManish V Badarkhe #include <services/lfa_svc.h> 11d837ccd8SManish V Badarkhe #include <services/rmmd_rmm_lfa.h> 12*f024c573SManish V Badarkhe #include <services/rmmd_svc.h> 13d837ccd8SManish V Badarkhe 143151d9fcSManish V Badarkhe static int lfa_rmm_prime(struct lfa_component_status *activation) 15d837ccd8SManish V Badarkhe { 16*f024c573SManish V Badarkhe /* RMM-specific PRIME actions. Currently, no action is required. */ 17*f024c573SManish V Badarkhe 18*f024c573SManish V Badarkhe return LFA_SUCCESS; 19d837ccd8SManish V Badarkhe } 20d837ccd8SManish V Badarkhe 213151d9fcSManish V Badarkhe static int lfa_rmm_activate(struct lfa_component_status *activation, 22d837ccd8SManish V Badarkhe uint64_t ep_address, uint64_t context_id) 23d837ccd8SManish V Badarkhe { 24*f024c573SManish V Badarkhe int ret = LFA_SUCCESS; 25*f024c573SManish V Badarkhe 26*f024c573SManish V Badarkhe if (lfa_holding_start()) { 27*f024c573SManish V Badarkhe /* Leader CPU */ 28*f024c573SManish V Badarkhe INFO("LFA_ACTIVATE: Last CPU proceed with activation\n"); 29*f024c573SManish V Badarkhe 30*f024c573SManish V Badarkhe cm_el2_sysregs_context_save(NON_SECURE); 31*f024c573SManish V Badarkhe ret = rmmd_primary_activate(); 32*f024c573SManish V Badarkhe cm_el2_sysregs_context_restore(NON_SECURE); 33*f024c573SManish V Badarkhe 34*f024c573SManish V Badarkhe cm_set_next_eret_context(NON_SECURE); 35*f024c573SManish V Badarkhe 36*f024c573SManish V Badarkhe if (ret == LFA_SUCCESS) { 37*f024c573SManish V Badarkhe VERBOSE("Successful activation of component %d\n", 38*f024c573SManish V Badarkhe activation->component_id); 39*f024c573SManish V Badarkhe } else { 40*f024c573SManish V Badarkhe ERROR("Failed to activate component %d\n", activation->component_id); 41*f024c573SManish V Badarkhe ret = LFA_BUSY; 42*f024c573SManish V Badarkhe } 43*f024c573SManish V Badarkhe 44*f024c573SManish V Badarkhe lfa_holding_release(ret); 45*f024c573SManish V Badarkhe 46*f024c573SManish V Badarkhe /** 47*f024c573SManish V Badarkhe * TODO: avoid race condition trying to prime next firmware 48*f024c573SManish V Badarkhe * before secondary activations are finished 49*f024c573SManish V Badarkhe */ 50*f024c573SManish V Badarkhe lfa_reset_activation(); 51*f024c573SManish V Badarkhe } else { 52*f024c573SManish V Badarkhe ret = lfa_holding_wait(); 53*f024c573SManish V Badarkhe 54*f024c573SManish V Badarkhe if (ret == LFA_SUCCESS) { 55*f024c573SManish V Badarkhe cm_el2_sysregs_context_save(NON_SECURE); 56*f024c573SManish V Badarkhe ret = rmmd_secondary_activate(); 57*f024c573SManish V Badarkhe cm_el2_sysregs_context_restore(NON_SECURE); 58*f024c573SManish V Badarkhe 59*f024c573SManish V Badarkhe cm_set_next_eret_context(NON_SECURE); 60*f024c573SManish V Badarkhe } 61*f024c573SManish V Badarkhe } 62*f024c573SManish V Badarkhe 63*f024c573SManish V Badarkhe return ret; 64d837ccd8SManish V Badarkhe } 65d837ccd8SManish V Badarkhe 66d837ccd8SManish V Badarkhe static struct lfa_component_ops rmm_activator = { 67d837ccd8SManish V Badarkhe .prime = lfa_rmm_prime, 68d837ccd8SManish V Badarkhe .activate = lfa_rmm_activate, 6906a6f296SManish V Badarkhe .may_reset_cpu = false, 7006a6f296SManish V Badarkhe .cpu_rendezvous_required = true, 71d837ccd8SManish V Badarkhe }; 72d837ccd8SManish V Badarkhe 73d837ccd8SManish V Badarkhe struct lfa_component_ops *get_rmm_activator(void) 74d837ccd8SManish V Badarkhe { 75d837ccd8SManish V Badarkhe return &rmm_activator; 76d837ccd8SManish V Badarkhe } 77