1*11684655SJacky Bai /*
2*11684655SJacky Bai * Copyright 2023-2025 NXP
3*11684655SJacky Bai *
4*11684655SJacky Bai * SPDX-License-Identifier: BSD-3-Clause
5*11684655SJacky Bai */
6*11684655SJacky Bai
7*11684655SJacky Bai #include <common/debug.h>
8*11684655SJacky Bai #include <common/runtime_svc.h>
9*11684655SJacky Bai #include <lib/mmio.h>
10*11684655SJacky Bai
11*11684655SJacky Bai #include <ele_api.h>
12*11684655SJacky Bai #include <platform_def.h>
13*11684655SJacky Bai
14*11684655SJacky Bai #define ELE_MU_RSR (ELE_MU_BASE + 0x12c)
15*11684655SJacky Bai #define ELE_MU_TRx(i) (ELE_MU_BASE + 0x200 + (i) * 4)
16*11684655SJacky Bai #define ELE_MU_RRx(i) (ELE_MU_BASE + 0x280 + (i) * 4)
17*11684655SJacky Bai
18*11684655SJacky Bai static struct ele_soc_info soc_info;
19*11684655SJacky Bai
imx9_soc_info_handler(uint32_t smc_fid,void * handle)20*11684655SJacky Bai int imx9_soc_info_handler(uint32_t smc_fid, void *handle)
21*11684655SJacky Bai {
22*11684655SJacky Bai SMC_RET4(handle, 0x0, soc_info.soc,
23*11684655SJacky Bai soc_info.uid[1] | (uint64_t)soc_info.uid[0] << 32,
24*11684655SJacky Bai soc_info.uid[3] | (uint64_t)soc_info.uid[2] << 32);
25*11684655SJacky Bai }
26*11684655SJacky Bai
ele_get_soc_info(void)27*11684655SJacky Bai void ele_get_soc_info(void)
28*11684655SJacky Bai {
29*11684655SJacky Bai uint32_t msg, resp;
30*11684655SJacky Bai
31*11684655SJacky Bai flush_dcache_range((uint64_t)&soc_info, sizeof(struct ele_soc_info));
32*11684655SJacky Bai
33*11684655SJacky Bai mmio_write_32(ELE_MU_TRx(0), ELE_GET_INFO_REQ);
34*11684655SJacky Bai mmio_write_32(ELE_MU_TRx(1), ((uint64_t) &soc_info) >> 32);
35*11684655SJacky Bai mmio_write_32(ELE_MU_TRx(2), ((uint64_t) &soc_info) & 0xffffffff);
36*11684655SJacky Bai mmio_write_32(ELE_MU_TRx(3), sizeof(struct ele_soc_info));
37*11684655SJacky Bai
38*11684655SJacky Bai do {
39*11684655SJacky Bai resp = mmio_read_32(ELE_MU_RSR);
40*11684655SJacky Bai } while ((resp & 0x3) != 0x3);
41*11684655SJacky Bai
42*11684655SJacky Bai msg = mmio_read_32(ELE_MU_RRx(0));
43*11684655SJacky Bai resp = mmio_read_32(ELE_MU_RRx(1));
44*11684655SJacky Bai VERBOSE("msg : %x, resp: %x\n", msg, resp);
45*11684655SJacky Bai }
46*11684655SJacky Bai
ele_release_gmid(void)47*11684655SJacky Bai void ele_release_gmid(void)
48*11684655SJacky Bai {
49*11684655SJacky Bai uint32_t msg, resp;
50*11684655SJacky Bai
51*11684655SJacky Bai mmio_write_32(ELE_MU_TRx(0), ELE_RELEASE_GMID);
52*11684655SJacky Bai
53*11684655SJacky Bai do {
54*11684655SJacky Bai resp = mmio_read_32(ELE_MU_RSR);
55*11684655SJacky Bai } while ((resp & 0x3) != 0x3);
56*11684655SJacky Bai
57*11684655SJacky Bai msg = mmio_read_32(ELE_MU_RRx(0));
58*11684655SJacky Bai resp = mmio_read_32(ELE_MU_RRx(1));
59*11684655SJacky Bai VERBOSE("msg : %x, resp: %x\n", msg, resp);
60*11684655SJacky Bai }
61