stage_cache.h
1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #ifndef _STAGE_CACHE_H_ 4 #define _STAGE_CACHE_H_ 5 6 #include <romstage_handoff.h> 7 #include <stddef.h> 8 #include <stdint.h> 9 #include <program_loading.h> 10 11 /* Types of stages that may be stored in stage cache */ 12 enum { 13 STAGE_RAMSTAGE, 14 STAGE_REFCODE, 15 STAGE_POSTCAR, 16 }; 17 18 /* Types of raw data that may be stored in stage cache */ 19 enum { 20 STAGE_S3_DATA, 21 }; 22 23 #if CONFIG(TSEG_STAGE_CACHE) || CONFIG(CBMEM_STAGE_CACHE) 24 /* Cache the loaded stage provided according to the parameters. */ 25 void stage_cache_add(int stage_id, const struct prog *stage); 26 /* Load the cached stage at given location returning the stage entry point. */ 27 void stage_cache_load_stage(int stage_id, struct prog *stage); 28 /* Cache non-specific data or code. */ 29 void stage_cache_add_raw(int stage_id, const void *base, const size_t size); 30 /* Get a pointer to cached raw data and its size. */ 31 void stage_cache_get_raw(int stage_id, void **base, size_t *size); 32 33 #else /* CONFIG_NO_STAGE_CACHE */ 34 35 static inline void stage_cache_add(int stage_id, const struct prog *stage) {} 36 static inline void stage_cache_load_stage(int stage_id, struct prog *stage) {} 37 static inline void stage_cache_add_raw(int stage_id, const void *base, const size_t size) {} 38 static inline void stage_cache_get_raw(int stage_id, void **base, size_t *size) {} 39 40 #endif 41 42 static inline int resume_from_stage_cache(void) 43 { 44 if (CONFIG(NO_STAGE_CACHE)) 45 return 0; 46 47 /* TBD: Replace this with acpi_is_wakeup_s3(). */ 48 return romstage_handoff_is_resume(); 49 } 50 51 /* Fill in parameters for the external stage cache, if utilized. */ 52 void stage_cache_external_region(void **base, size_t *size); 53 54 /* Metadata associated with each stage. */ 55 struct stage_cache { 56 uint64_t load_addr; 57 uint64_t entry_addr; 58 uint64_t arg; 59 }; 60 61 #endif /* _STAGE_CACHE_H_ */