blob: 52c72472b218d1ec85c96928137cc53255ab019c [file] [log] [blame]
Kyösti Mälkkib6585482020-06-01 15:11:14 +03001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <arch/io.h>
4#include <console/console.h>
5#include <cpu/x86/smm.h>
Felix Heldc0a4c892024-01-04 18:31:35 +01006#include <smm_call.h>
Elyes Haouas45d32052022-10-07 10:07:12 +02007#include <stdint.h>
Kyösti Mälkkib6585482020-06-01 15:11:14 +03008
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +02009static void apmc_log(const char *fn, u8 cmd)
Kyösti Mälkkib6585482020-06-01 15:11:14 +030010{
Kyösti Mälkkib6585482020-06-01 15:11:14 +030011 switch (cmd) {
Kyösti Mälkkib6585482020-06-01 15:11:14 +030012 case APM_CNT_ACPI_DISABLE:
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020013 printk(BIOS_DEBUG, "%s: Disabling ACPI.\n", fn);
Kyösti Mälkkib6585482020-06-01 15:11:14 +030014 break;
15 case APM_CNT_ACPI_ENABLE:
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020016 printk(BIOS_DEBUG, "%s: Enabling ACPI.\n", fn);
Kyösti Mälkkib6585482020-06-01 15:11:14 +030017 break;
Kyösti Mälkkib6585482020-06-01 15:11:14 +030018 case APM_CNT_FINALIZE:
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020019 printk(BIOS_DEBUG, "%s: Finalizing SMM.\n", fn);
Kyösti Mälkkib6585482020-06-01 15:11:14 +030020 break;
21 case APM_CNT_ELOG_GSMI:
22 break;
23 case APM_CNT_SMMSTORE:
24 break;
25 case APM_CNT_SMMINFO:
26 break;
27 default:
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020028 printk(BIOS_DEBUG, "%s: Unknown APMC 0x%02x.\n", fn, cmd);
Kyösti Mälkkib6585482020-06-01 15:11:14 +030029 break;
30 }
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020031}
32
Felix Held21710ea2024-01-05 19:16:48 +010033enum cb_err apm_control(u8 cmd)
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020034{
35 /* Never proceed inside SMI handler or without one. */
36 if (ENV_SMM || !CONFIG(HAVE_SMI_HANDLER))
Felix Held21710ea2024-01-05 19:16:48 +010037 return CB_ERR;
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020038
39 apmc_log(__func__, cmd);
Kyösti Mälkkib6585482020-06-01 15:11:14 +030040
41 /* Now raise the SMI. */
Felix Heldc0a4c892024-01-04 18:31:35 +010042 call_smm(cmd, 0, NULL);
Kyösti Mälkkib6585482020-06-01 15:11:14 +030043
44 printk(BIOS_DEBUG, "APMC done.\n");
Felix Held21710ea2024-01-05 19:16:48 +010045 return CB_SUCCESS;
Kyösti Mälkkib6585482020-06-01 15:11:14 +030046}
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020047
48u8 apm_get_apmc(void)
49{
Felix Heldc4fbc912023-12-14 20:59:54 +010050 /* Read command byte from APMC SMI IO port */
51 u8 cmd = inb(pm_acpi_smi_cmd_port());
Kyösti Mälkki9a1620f2021-01-08 13:27:33 +020052
53 apmc_log("SMI#", cmd);
54 return cmd;
55}