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