1 /*
2 * Copyright (c) 2024, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7 
8 #include "mscp_drv.h"
9 
10 #include "tfm_hal_device_header.h"
11 
12 #include <stdint.h>
13 #include <stddef.h>
14 
15 struct _mscp_init_ctrl {
16     __IOM uint32_t mscp_cpu_init_ctrl; /* 0x000 */
17     const uint32_t reserved0[31];
18     __IOM uint32_t tcmecc_errstatus; /* 0x080 */
19     __IOM uint32_t tcmeec_errctrl; /* 0x084 */
20     __IOM uint32_t tcmeec_errcode; /* 0x088 */
21     __IM  uint32_t tcmeec_erraddr; /* 0x08C */
22     const uint32_t reserved1[3];
23     __IM  uint32_t mscp_icerr; /* 0x0A0 */
24     __IM  uint32_t mscp_dcerr; /* 0x0A4 */
25     const uint32_t reserved2[970];
26     __IM  uint32_t pidr4; /* 0xFD0 */
27     const uint32_t reserved3[3];
28     __IM  uint32_t pidr0; /* 0xFE0 */
29     __IM  uint32_t pidr1; /* 0xFE4 */
30     __IM  uint32_t pidr2; /* 0xFE8 */
31     __IM  uint32_t pidr3; /* 0xFEC */
32     __IM  uint32_t cidr0; /* 0xFF0 */
33     __IM  uint32_t cidr1; /* 0xFF4 */
34     __IM  uint32_t cidr2; /* 0xFF8 */
35     __IM  uint32_t cidr3; /* 0xFFC */
36 };
37 
38 /* Field definitions for MSCP_CPU_INIT_CTRL */
39 #define MSCP_INIT_CPUCTRL_CPUWAIT_POS    (0)
40 #define MSCP_INIT_CPUCTRL_CPUWAIT_MASK   (0x1 << MSCP_INIT_CPUCTRL_CPUWAIT_POS)
41 #define MSCP_INIT_CPUCTRL_CPUWAIT_UNHALT (0x0 << MSCP_INIT_CPUCTRL_CPUWAIT_POS)
42 #define MSCP_INIT_CPUCTRL_CPUWAIT_HALT   (0x1 << MSCP_INIT_CPUCTRL_CPUWAIT_POS)
43 
mscp_driver_release_cpu(struct mscp_dev_t * dev)44 enum mscp_error_t mscp_driver_release_cpu(struct mscp_dev_t *dev)
45 {
46     if (dev == NULL) {
47         return MSCP_ERR_INVALID_PARAM;
48     }
49 
50     struct _mscp_init_ctrl *mscp_init_ctrl =
51             (struct _mscp_init_ctrl *) dev->init_ctrl_base;
52     mscp_init_ctrl->mscp_cpu_init_ctrl &= ~MSCP_INIT_CPUCTRL_CPUWAIT_MASK;
53 
54     return MSCP_ERR_NONE;
55 }
56