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
lfa_rmm_prime(struct lfa_component_status * activation)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
lfa_rmm_activate(struct lfa_component_status * activation,uint64_t ep_address,uint64_t context_id)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
get_rmm_activator(void)73d837ccd8SManish V Badarkhe struct lfa_component_ops *get_rmm_activator(void)
74d837ccd8SManish V Badarkhe {
75d837ccd8SManish V Badarkhe return &rmm_activator;
76d837ccd8SManish V Badarkhe }
77