1*dbfe9df8SPeng Fan /* 2*dbfe9df8SPeng Fan * Copyright 2023-2025 NXP 3*dbfe9df8SPeng Fan * 4*dbfe9df8SPeng Fan * SPDX-License-Identifier: BSD-3-Clause 5*dbfe9df8SPeng Fan */ 6*dbfe9df8SPeng Fan 7*dbfe9df8SPeng Fan #ifndef SCMI_IMX9_H 8*dbfe9df8SPeng Fan #define SCMI_IMX9_H 9*dbfe9df8SPeng Fan 10*dbfe9df8SPeng Fan #include <stddef.h> 11*dbfe9df8SPeng Fan #include <stdint.h> 12*dbfe9df8SPeng Fan 13*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_RUN 0 14*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_WAIT 1 15*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_STOP 2 16*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_SUSPEND 3 17*dbfe9df8SPeng Fan 18*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_NEVER 0U 19*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_RUN 1U 20*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_RUN_WAIT 2U 21*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_RUN_WAIT_STOP 3U 22*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_ALWAYS 4U 23*dbfe9df8SPeng Fan 24*dbfe9df8SPeng Fan #define MAX_PER_LPI_CONFIGS_PER_CMD 9 25*dbfe9df8SPeng Fan 26*dbfe9df8SPeng Fan #define IMX9_SCMI_PERF_PROTO_ID 0x13 27*dbfe9df8SPeng Fan 28*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PERFLEVELSET_MSG 0x7 29*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PERFLEVELSET_MSG_LEN 12 30*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PERFLEVELSET_RESP_LEN 8 31*dbfe9df8SPeng Fan 32*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PROTO_ID 0x82 33*dbfe9df8SPeng Fan 34*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_START_MSG 0x4 35*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_START_MSG_LEN 8 36*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_START_RESP_LEN 8 37*dbfe9df8SPeng Fan 38*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_STOP_MSG 0x4 39*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_STOP_MSG_LEN 8 40*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_STOP_RESP_LEN 8 41*dbfe9df8SPeng Fan 42*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_RESET_ADDR_SET_MSG 0x6 43*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_RESET_ADDR_SET_MSG_LEN 20 44*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_RESET_ADDR_SET_RESP_LEN 8 45*dbfe9df8SPeng Fan 46*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETSLEEPMODE_MSG 0x7 47*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETSLEEPMODE_MSG_LEN 16 48*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETSLEEPMODE_RESP_LEN 8 49*dbfe9df8SPeng Fan 50*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETIRQWAKESET_MSG 0x8 51*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETIRQWAKESET_MSG_LEN 76 52*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETIRQWAKESET_RESP_LEN 8 53*dbfe9df8SPeng Fan 54*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_NONIRQWAKESET_MSG 0x9 55*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_NONIRQWAKESET_MSG_LEN 64 56*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_NONIRQWAKESET_RESP_LEN 8 57*dbfe9df8SPeng Fan 58*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_LPMMODESET_MSG 0xA 59*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_LPMMODESET_MSG_LEN 12 60*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_LPMMODESET_RESP_LEN 8 61*dbfe9df8SPeng Fan 62*dbfe9df8SPeng Fan #define IMX9_SCMI_PER_LPMMODESET_MSG 0xB 63*dbfe9df8SPeng Fan #define IMX9_SCMI_PER_LPMMODESET_MSG_LEN 12 64*dbfe9df8SPeng Fan #define IMX9_SCMI_PER_LPMMODESET_RESP_LEN 8 65*dbfe9df8SPeng Fan 66*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_GETINFO_MSG 0xC 67*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_GETINFO_MSG_LEN 8 68*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_GETINFO_RESP_LEN 24 69*dbfe9df8SPeng Fan 70*dbfe9df8SPeng Fan #define SCMI_CPU_VEC_FLAGS_BOOT BIT(30) 71*dbfe9df8SPeng Fan #define SCMI_CPU_VEC_FLAGS_RESUME BIT(31) 72*dbfe9df8SPeng Fan 73*dbfe9df8SPeng Fan #define SCMI_GPC_WAKEUP 0 74*dbfe9df8SPeng Fan #define SCMI_GIC_WAKEUP 1 75*dbfe9df8SPeng Fan #define SCMI_RESUME_CPU BIT(1) 76*dbfe9df8SPeng Fan 77*dbfe9df8SPeng Fan #define SCMI_IMX_SYS_POWER_STATE_MODE_MASK 0xC0000000U 78*dbfe9df8SPeng Fan #define SM_ACTIVE BIT(0) 79*dbfe9df8SPeng Fan #define FRO_ACTIVE BIT(1) 80*dbfe9df8SPeng Fan #define SYSCTR_ACTIVE BIT(2) 81*dbfe9df8SPeng Fan #define PMIC_STBY_INACTIVE BIT(3) 82*dbfe9df8SPeng Fan #define OSC24M_ACTIVE BIT(4) 83*dbfe9df8SPeng Fan 84*dbfe9df8SPeng Fan /* 85*dbfe9df8SPeng Fan * sleep_mode[3:0] – Currently unused. 86*dbfe9df8SPeng Fan * sleep_mode[7:4] – sleep mode performance level 87*dbfe9df8SPeng Fan */ 88*dbfe9df8SPeng Fan #define SM_PERF_LVL_PRK U(0) 89*dbfe9df8SPeng Fan #define SM_PERF_LVL_LOW U(1) 90*dbfe9df8SPeng Fan #define SM_PERF_LVL_NOM U(2) 91*dbfe9df8SPeng Fan #define SM_PERF_LVL_ODV U(3) 92*dbfe9df8SPeng Fan #define SM_PERF_LVL_SOD U(4) 93*dbfe9df8SPeng Fan 94*dbfe9df8SPeng Fan #define SYS_SLEEP_MODE_L(x) (((x) & 0xF) << 16U) 95*dbfe9df8SPeng Fan #define SYS_SLEEP_MODE_H(x) (((x) & 0xF) << 20U) 96*dbfe9df8SPeng Fan #define SYS_SLEEP_FLAGS(x) (((x) & 0xFFFFU)) 97*dbfe9df8SPeng Fan 98*dbfe9df8SPeng Fan struct scmi_cpu_reset_addr_a2p { 99*dbfe9df8SPeng Fan uint32_t cpu_id; 100*dbfe9df8SPeng Fan uint32_t flags; 101*dbfe9df8SPeng Fan uint32_t reset_vector_low; 102*dbfe9df8SPeng Fan uint32_t reset_vector_high; 103*dbfe9df8SPeng Fan }; 104*dbfe9df8SPeng Fan 105*dbfe9df8SPeng Fan struct scmi_cpu_reset_addr_p2a { 106*dbfe9df8SPeng Fan int32_t status; 107*dbfe9df8SPeng Fan }; 108*dbfe9df8SPeng Fan 109*dbfe9df8SPeng Fan struct scmi_cpu_start_a2p { 110*dbfe9df8SPeng Fan uint32_t cpu_id; 111*dbfe9df8SPeng Fan }; 112*dbfe9df8SPeng Fan 113*dbfe9df8SPeng Fan struct scmi_cpu_start_p2a { 114*dbfe9df8SPeng Fan int32_t status; 115*dbfe9df8SPeng Fan }; 116*dbfe9df8SPeng Fan 117*dbfe9df8SPeng Fan struct scmi_cpu_stop_a2p { 118*dbfe9df8SPeng Fan uint32_t cpu_id; 119*dbfe9df8SPeng Fan }; 120*dbfe9df8SPeng Fan 121*dbfe9df8SPeng Fan struct scmi_cpu_stop_p2a { 122*dbfe9df8SPeng Fan int32_t status; 123*dbfe9df8SPeng Fan }; 124*dbfe9df8SPeng Fan 125*dbfe9df8SPeng Fan struct scmi_lpm_config { 126*dbfe9df8SPeng Fan uint32_t power_domain; 127*dbfe9df8SPeng Fan uint32_t lpmsetting; 128*dbfe9df8SPeng Fan uint32_t retentionmask; 129*dbfe9df8SPeng Fan }; 130*dbfe9df8SPeng Fan 131*dbfe9df8SPeng Fan struct scmi_cpu_pd_info { 132*dbfe9df8SPeng Fan uint32_t cpu_id; 133*dbfe9df8SPeng Fan uint32_t cpu_pd_id; 134*dbfe9df8SPeng Fan uint32_t nmem; 135*dbfe9df8SPeng Fan uint32_t *cpu_mem_pd_id; 136*dbfe9df8SPeng Fan }; 137*dbfe9df8SPeng Fan 138*dbfe9df8SPeng Fan /* 139*dbfe9df8SPeng Fan * SCMI CPU peripheral LPM configuration 140*dbfe9df8SPeng Fan */ 141*dbfe9df8SPeng Fan struct scmi_per_lpm_config { 142*dbfe9df8SPeng Fan uint32_t perId; 143*dbfe9df8SPeng Fan uint32_t lpmSetting; 144*dbfe9df8SPeng Fan }; 145*dbfe9df8SPeng Fan 146*dbfe9df8SPeng Fan int scmi_core_set_reset_addr(void *p, uint64_t reset_addr, uint32_t cpu_id, uint32_t attr); 147*dbfe9df8SPeng Fan int scmi_core_start(void *p, uint32_t cpu_id); 148*dbfe9df8SPeng Fan int scmi_core_stop(void *p, uint32_t cpu_id); 149*dbfe9df8SPeng Fan int scmi_core_info_get(void *p, uint32_t cpu_id, uint32_t *run, uint32_t *sleep, 150*dbfe9df8SPeng Fan uint64_t *vector); 151*dbfe9df8SPeng Fan int scmi_core_set_sleep_mode(void *p, uint32_t cpu_id, uint32_t wakeup, uint32_t mode); 152*dbfe9df8SPeng Fan int scmi_core_Irq_wake_set(void *p, uint32_t cpu_id, uint32_t mask_idx, 153*dbfe9df8SPeng Fan uint32_t num_mask, uint32_t *mask); 154*dbfe9df8SPeng Fan int scmi_core_nonIrq_wake_set(void *p, uint32_t cpu_id, uint32_t mask_idx, 155*dbfe9df8SPeng Fan uint32_t num_mask, uint32_t mask); 156*dbfe9df8SPeng Fan int scmi_core_lpm_mode_set(void *p, uint32_t cpu_id, uint32_t num_configs, 157*dbfe9df8SPeng Fan struct scmi_lpm_config *cfg); 158*dbfe9df8SPeng Fan int scmi_per_lpm_mode_set(void *p, uint32_t cpu_id, uint32_t num_configs, 159*dbfe9df8SPeng Fan struct scmi_per_lpm_config *cfg); 160*dbfe9df8SPeng Fan int scmi_perf_mode_set(void *p, uint32_t domain_id, uint32_t perf_level); 161*dbfe9df8SPeng Fan 162*dbfe9df8SPeng Fan #endif /* SCMI_IMX9_H */ 163