xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/version/inc/mt_spm_ver.h (revision cf2df874cd09305ac7282fadb0fef6be597dfffb)
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