blob: a574237c808a8cdb79ae922e089d2c8e7b0a0b94 [file] [log] [blame]
Angel Ponsf23ae0b2020-04-02 23:48:12 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aaron Durbinb4b9eb32014-02-13 10:26:18 -06002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Aaron Durbinb4b9eb32014-02-13 10:26:18 -06004#include <cbmem.h>
Elyes Haouas45d32052022-10-07 10:07:12 +02005#include <console/console.h>
Aaron Durbinb4b9eb32014-02-13 10:26:18 -06006#include <cpu/x86/smm.h>
Elyes Haouas45d32052022-10-07 10:07:12 +02007#include <string.h>
Aaron Durbinb4b9eb32014-02-13 10:26:18 -06008
9void *backup_default_smm_area(void)
10{
11 void *save_area;
12 const void *default_smm = (void *)SMM_DEFAULT_BASE;
13
Julius Wernercd49cce2019-03-05 16:53:33 -080014 if (!CONFIG(HAVE_ACPI_RESUME))
Aaron Durbinb4b9eb32014-02-13 10:26:18 -060015 return NULL;
16
17 /*
18 * The buffer needs to be preallocated regardless. In the non-resume
19 * path it will be allocated for handling resume. Note that cbmem_add()
20 * does a find before the addition.
21 */
22 save_area = cbmem_add(CBMEM_ID_SMM_SAVE_SPACE, SMM_DEFAULT_SIZE);
23
24 if (save_area == NULL) {
25 printk(BIOS_DEBUG, "SMM save area not added.\n");
26 return NULL;
27 }
28
29 /* Only back up the area on S3 resume. */
Kyösti Mälkkic3c4a382014-06-20 05:21:30 +030030 if (acpi_is_wakeup_s3()) {
Aaron Durbinb4b9eb32014-02-13 10:26:18 -060031 memcpy(save_area, default_smm, SMM_DEFAULT_SIZE);
32 return save_area;
33 }
34
35 /*
36 * Not the S3 resume path. No need to restore memory contents after
37 * SMM relocation.
38 */
39 return NULL;
40}
41
42void restore_default_smm_area(void *smm_save_area)
43{
44 void *default_smm = (void *)SMM_DEFAULT_BASE;
45
46 if (smm_save_area == NULL)
47 return;
48
49 memcpy(default_smm, smm_save_area, SMM_DEFAULT_SIZE);
50}