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 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 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 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