cpu/x86/smm: Improve smm stack setup
Both the relocation handler and the permanent handler use the same stacks, so things can be simplified. Change-Id: I7bdca775550e8280757a6c5a5150a0d638d5fc2d Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/c/coreboot/+/58698 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: HAOUAS Elyes <ehaouas@noos.fr> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
committed by
Kyösti Mälkki
parent
0eef54b8be
commit
96451a7c6d
@@ -44,17 +44,6 @@ struct mp_ops {
|
||||
* can load the microcode in parallel.
|
||||
*/
|
||||
void (*get_microcode_info)(const void **microcode, int *parallel);
|
||||
/*
|
||||
* Optionally adjust SMM handler parameters to override the default
|
||||
* values. The is_perm variable indicates if the parameters to adjust
|
||||
* are for the relocation handler or the permanent handler. This
|
||||
* function is therefore called twice -- once for each handler.
|
||||
* By default the parameters for each SMM handler are:
|
||||
* stack_size num_concurrent_stacks num_concurrent_save_states
|
||||
* relo: save_state_size get_cpu_count() 1
|
||||
* perm: save_state_size get_cpu_count() get_cpu_count()
|
||||
*/
|
||||
void (*adjust_smm_params)(struct smm_loader_params *slp, int is_perm);
|
||||
/*
|
||||
* Optionally provide a callback prior to the APs starting SMM
|
||||
* relocation or CPU driver initialization. However, note that
|
||||
@@ -92,13 +81,11 @@ struct mp_ops {
|
||||
* 3. get_smm_info()
|
||||
* 4. get_microcode_info()
|
||||
* 5. adjust_cpu_apic_entry() for each number of get_cpu_count()
|
||||
* 6. adjust_smm_params(is_perm = 0)
|
||||
* 7. adjust_smm_params(is_perm = 1)
|
||||
* 8. pre_mp_smm_init()
|
||||
* 9. per_cpu_smm_trigger() in parallel for all cpus which calls
|
||||
* 6. pre_mp_smm_init()
|
||||
* 7. per_cpu_smm_trigger() in parallel for all cpus which calls
|
||||
* relocation_handler() in SMM.
|
||||
* 10. mp_initialize_cpu() for each cpu
|
||||
* 11. post_mp_init()
|
||||
* 8. mp_initialize_cpu() for each cpu
|
||||
* 9. post_mp_init()
|
||||
*/
|
||||
enum cb_err mp_init_with_smm(struct bus *cpu_bus, const struct mp_ops *mp_ops);
|
||||
|
||||
|
@@ -120,9 +120,6 @@ static inline bool smm_points_to_smram(const void *ptr, const size_t len)
|
||||
/* SMM Module Loading API */
|
||||
|
||||
/* The smm_loader_params structure provides direction to the SMM loader:
|
||||
* - stack_top - optional external stack provided to loader. It must be at
|
||||
* least per_cpu_stack_size * num_concurrent_stacks in size.
|
||||
* - per_cpu_stack_size - stack size per CPU for smm modules.
|
||||
* - num_concurrent_stacks - number of concurrent cpus in handler needing stack
|
||||
* optional for setting up relocation handler.
|
||||
* - per_cpu_save_state_size - the SMM save state size per cpu
|
||||
@@ -135,8 +132,6 @@ static inline bool smm_points_to_smram(const void *ptr, const size_t len)
|
||||
* handle sparse APIC id space.
|
||||
*/
|
||||
struct smm_loader_params {
|
||||
uintptr_t stack_top;
|
||||
size_t per_cpu_stack_size;
|
||||
size_t num_concurrent_stacks;
|
||||
|
||||
size_t real_cpu_save_state_size;
|
||||
@@ -148,8 +143,10 @@ struct smm_loader_params {
|
||||
struct smm_stub_params *stub_params;
|
||||
};
|
||||
|
||||
/* Both of these return 0 on success, < 0 on failure. */
|
||||
int smm_setup_relocation_handler(const uintptr_t perm_smram, struct smm_loader_params *params);
|
||||
/* All of these return 0 on success, < 0 on failure. */
|
||||
int smm_setup_stack(const uintptr_t perm_smbase, const size_t perm_smram_size,
|
||||
const unsigned int total_cpus, const size_t stack_size);
|
||||
int smm_setup_relocation_handler(struct smm_loader_params *params);
|
||||
int smm_load_module(uintptr_t smram_base, size_t smram_size, struct smm_loader_params *params);
|
||||
|
||||
u32 smm_get_cpu_smbase(unsigned int cpu_num);
|
||||
|
Reference in New Issue
Block a user