1*5532feb7SWenzhen Yu /* 2*5532feb7SWenzhen Yu * Copyright (c) 2025, Mediatek Inc. All rights reserved. 3*5532feb7SWenzhen Yu * 4*5532feb7SWenzhen Yu * SPDX-License-Identifier: BSD-3-Clause 5*5532feb7SWenzhen Yu */ 6*5532feb7SWenzhen Yu 7*5532feb7SWenzhen Yu #ifndef MT_SPM_VER_H 8*5532feb7SWenzhen Yu #define MT_SPM_VER_H 9*5532feb7SWenzhen Yu 10*5532feb7SWenzhen Yu #include <stdint.h> 11*5532feb7SWenzhen Yu 12*5532feb7SWenzhen Yu enum mt_plat_dram_to_spm_type { 13*5532feb7SWenzhen Yu SPMFW_DEFAULT_TYPE = 0, 14*5532feb7SWenzhen Yu SPMFW_LP4_2CH_3200, 15*5532feb7SWenzhen Yu SPMFW_LP4X_2CH_3600, 16*5532feb7SWenzhen Yu SPMFW_LP3_1CH_1866, 17*5532feb7SWenzhen Yu SPMFW_LP4X_2CH_3733, 18*5532feb7SWenzhen Yu SPMFW_LP4X_2CH_4266, 19*5532feb7SWenzhen Yu SPMFW_LP4X_2CH_3200, 20*5532feb7SWenzhen Yu SPMFW_LP5_2CH_6400, 21*5532feb7SWenzhen Yu SPMFW_LP5X_4CH_7500, 22*5532feb7SWenzhen Yu SPMFW_TYPE_NOT_FOUND, 23*5532feb7SWenzhen Yu }; 24*5532feb7SWenzhen Yu 25*5532feb7SWenzhen Yu enum pwrctrl_selection { 26*5532feb7SWenzhen Yu SPM_INIT_PWRCTRL = 0, 27*5532feb7SWenzhen Yu SPM_VCOREDVFS_PWRCTRL, 28*5532feb7SWenzhen Yu SPM_IDLE_PWRCTRL, 29*5532feb7SWenzhen Yu SPM_SUSPEND_PWRCTRL, 30*5532feb7SWenzhen Yu SPM_PWRCTRL_MAX, 31*5532feb7SWenzhen Yu }; 32*5532feb7SWenzhen Yu 33*5532feb7SWenzhen Yu struct pcm_desc { 34*5532feb7SWenzhen Yu const char *version; /* PCM code version */ 35*5532feb7SWenzhen Yu uint32_t *base; /* Binary array base */ 36*5532feb7SWenzhen Yu uintptr_t base_dma; /* DMA addr of base */ 37*5532feb7SWenzhen Yu uint32_t pmem_words; 38*5532feb7SWenzhen Yu uint32_t total_words; 39*5532feb7SWenzhen Yu uint32_t pmem_start; 40*5532feb7SWenzhen Yu uint32_t dmem_start; 41*5532feb7SWenzhen Yu }; 42*5532feb7SWenzhen Yu 43*5532feb7SWenzhen Yu #define DYNA_LOAD_PCM_PATH_SIZE 128 44*5532feb7SWenzhen Yu #define PCM_FIRMWARE_VERSION_SIZE 128 45*5532feb7SWenzhen Yu 46*5532feb7SWenzhen Yu struct dyna_load_pcm_t { 47*5532feb7SWenzhen Yu char path[DYNA_LOAD_PCM_PATH_SIZE]; 48*5532feb7SWenzhen Yu char version[PCM_FIRMWARE_VERSION_SIZE]; 49*5532feb7SWenzhen Yu char *buf; 50*5532feb7SWenzhen Yu struct pcm_desc desc; 51*5532feb7SWenzhen Yu int ready; 52*5532feb7SWenzhen Yu }; 53*5532feb7SWenzhen Yu 54*5532feb7SWenzhen Yu struct load_pcm_fw_t { 55*5532feb7SWenzhen Yu unsigned int fw_max_num; 56*5532feb7SWenzhen Yu char **pcm_name_str; 57*5532feb7SWenzhen Yu struct dyna_load_pcm_t *dyna_load_pcm; 58*5532feb7SWenzhen Yu unsigned int (*is_fw_running)(void); 59*5532feb7SWenzhen Yu unsigned int (*get_fw_index)(unsigned int fw_type); 60*5532feb7SWenzhen Yu int (*fw_init)(struct pcm_desc *desc); 61*5532feb7SWenzhen Yu int (*fw_run)(unsigned int first, void *pwrctrl); 62*5532feb7SWenzhen Yu }; 63*5532feb7SWenzhen Yu 64*5532feb7SWenzhen Yu /* SPM firmware restart definition */ 65*5532feb7SWenzhen Yu #define SPM_FW_FORCE_RESET BIT(0) 66*5532feb7SWenzhen Yu #define SPM_FW_FORCE_RESUME BIT(1) 67*5532feb7SWenzhen Yu int spm_firmware_restart(unsigned int force, void *pwrctrl); 68*5532feb7SWenzhen Yu int spm_firmware_type_get(void); 69*5532feb7SWenzhen Yu void spm_firmware_type_probe(unsigned int type); 70*5532feb7SWenzhen Yu void spm_firmware_init(uint64_t addr, uint64_t size); 71*5532feb7SWenzhen Yu uint64_t spm_load_firmware_status(void); 72*5532feb7SWenzhen Yu void register_load_fw(struct load_pcm_fw_t *info); 73*5532feb7SWenzhen Yu 74*5532feb7SWenzhen Yu #endif /* MT_SPM_VER_H */ 75