Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09f98a82 authored by Tang Liang's avatar Tang Liang Committed by Konrad Rzeszutek Wilk
Browse files

x86, acpi, tboot: Have a ACPI os prepare sleep instead of calling tboot_sleep.



The ACPI suspend path makes a call to tboot_sleep right before
it writes the PM1A, PM1B values. We replace the direct call to
tboot via an registration callback similar to __acpi_register_gsi.

CC: Len Brown <len.brown@intel.com>
Acked-by: default avatarJoseph Cihula <joseph.cihula@intel.com>
Acked-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
[v1: Added __attribute__ ((unused))]
[v2: Introduced a wrapper instead of changing tboot_sleep return values]
[v3: Added return value AE_CTRL_SKIP for acpi_os_sleep_prepare]
Signed-off-by: default avatarTang Liang <liang.tang@oracle.com>
[v1: Fix compile issues on IA64 and PPC64]
[v2: Fix where __acpi_os_prepare_sleep==NULL and did not go in sleep properly]
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 805a6af8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -297,6 +297,12 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control)

	tboot_shutdown(acpi_shutdown_map[sleep_state]);
}
static int tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control,
			       u32 pm1b_control)
{
	tboot_sleep(sleep_state, pm1a_control, pm1b_control);
	return 0;
}

static atomic_t ap_wfs_count;

@@ -345,6 +351,8 @@ static __init int tboot_late_init(void)

	atomic_set(&ap_wfs_count, 0);
	register_hotcpu_notifier(&tboot_cpu_notifier);

	acpi_os_set_prepare_sleep(&tboot_sleep_wrapper);
	return 0;
}

+7 −3
Original line number Diff line number Diff line
@@ -43,9 +43,9 @@
 */

#include <acpi/acpi.h>
#include <linux/acpi.h>
#include "accommon.h"
#include "actables.h"
#include <linux/tboot.h>
#include <linux/module.h>

#define _COMPONENT          ACPI_HARDWARE
@@ -344,8 +344,12 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)

	ACPI_FLUSH_CPU_CACHE();

	tboot_sleep(sleep_state, pm1a_control, pm1b_control);

	status = acpi_os_prepare_sleep(sleep_state, pm1a_control,
				       pm1b_control);
	if (ACPI_SKIP(status))
		return_ACPI_STATUS(AE_OK);
	if (ACPI_FAILURE(status))
		return_ACPI_STATUS(status);
	/* Write #2: Write both SLP_TYP + SLP_EN */

	status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
+24 −0
Original line number Diff line number Diff line
@@ -76,6 +76,9 @@ EXPORT_SYMBOL(acpi_in_debugger);
extern char line_buf[80];
#endif				/*ENABLE_DEBUGGER */

static int (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl,
				      u32 pm1b_ctrl);

static acpi_osd_handler acpi_irq_handler;
static void *acpi_irq_context;
static struct workqueue_struct *kacpid_wq;
@@ -1659,3 +1662,24 @@ acpi_status acpi_os_terminate(void)

	return AE_OK;
}

acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control,
				  u32 pm1b_control)
{
	int rc = 0;
	if (__acpi_os_prepare_sleep)
		rc = __acpi_os_prepare_sleep(sleep_state,
					     pm1a_control, pm1b_control);
	if (rc < 0)
		return AE_ERROR;
	else if (rc > 0)
		return AE_CTRL_SKIP;

	return AE_OK;
}

void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
			       u32 pm1a_ctrl, u32 pm1b_ctrl))
{
	__acpi_os_prepare_sleep = func;
}
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@
#define ACPI_SUCCESS(a)                 (!(a))
#define ACPI_FAILURE(a)                 (a)

#define ACPI_SKIP(a)                    (a == AE_CTRL_SKIP)
#define AE_OK                           (acpi_status) 0x0000

/*
+10 −0
Original line number Diff line number Diff line
@@ -359,4 +359,14 @@ static inline int suspend_nvs_register(unsigned long a, unsigned long b)
}
#endif

#ifdef CONFIG_ACPI
void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
			       u32 pm1a_ctrl,  u32 pm1b_ctrl));

acpi_status acpi_os_prepare_sleep(u8 sleep_state,
				  u32 pm1a_control, u32 pm1b_control);
#else
#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0)
#endif

#endif	/*_LINUX_ACPI_H*/
Loading