xref: /rk3399_ARM-atf/services/std_svc/spmd/spmd_pm.c (revision b058f20a7e587e4362413cf8e4544dcc0bcaab96)
1 /*
2  * Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include "spmd_private.h"
9 
10 /*******************************************************************************
11  * This CPU has been turned on. Enter SPMC to initialise S-EL1 or S-EL2. As part
12  * of the SPMC initialization path, they will initialize any SPs that they
13  * manage. Entry into SPMC is done after initialising minimal architectural
14  * state that guarantees safe execution.
15  ******************************************************************************/
16 static void spmd_cpu_on_finish_handler(u_register_t unused)
17 {
18 	unsigned int linear_id = plat_my_core_pos();
19 	spmd_spm_core_context_t *ctx = spmd_get_context();
20 	int rc;
21 
22 	assert(ctx->state != SPMC_STATE_ON);
23 
24 	rc = spmd_spm_core_sync_entry(ctx);
25 	if (rc != 0) {
26 		ERROR("SPMC initialisation failed (%d) on CPU%u\n", rc,
27 		      linear_id);
28 		ctx->state = SPMC_STATE_OFF;
29 		return;
30 	}
31 
32 	ctx->state = SPMC_STATE_ON;
33 }
34 
35 /*******************************************************************************
36  * Structure populated by the SPM Dispatcher to perform any bookkeeping before
37  * PSCI executes a power mgmt. operation.
38  ******************************************************************************/
39 const spd_pm_ops_t spmd_pm = {
40 	.svc_on_finish = spmd_cpu_on_finish_handler,
41 };
42