xref: /rk3399_ARM-atf/services/std_svc/rmmd/rmmd_rmm_lfa.c (revision f024c573042f7ad29c41e68d261c859b91c6dcde)
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