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

Commit 7ede9f8a authored by Jiang Liu's avatar Jiang Liu Committed by Rafael J. Wysocki
Browse files

ACPI / extlog: replace open-coded _DSM code with helper functions



Use helper functions to simplify _DSM related code in acpi_extlog driver.
Also mark initialization data and functions with __init and __initdata
to reduce memory footprint.

Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Tested-by: default avatarChen, Gong <gong.chen@linux.intel.com>
Reviewed-by: default avatarChen, Gong <gong.chen@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent b072e53b
Loading
Loading
Loading
Loading
+12 −49
Original line number Diff line number Diff line
@@ -20,11 +20,9 @@
#define EXT_ELOG_ENTRY_MASK	GENMASK_ULL(51, 0) /* elog entry address mask */

#define EXTLOG_DSM_REV		0x0
#define	EXTLOG_FN_QUERY		0x0
#define	EXTLOG_FN_ADDR		0x1

#define FLAG_OS_OPTIN		BIT(0)
#define EXTLOG_QUERY_L1_EXIST	BIT(1)
#define ELOG_ENTRY_VALID	(1ULL<<63)
#define ELOG_ENTRY_LEN		0x1000

@@ -43,7 +41,7 @@ struct extlog_l1_head {
	u8  rev1[12];
};

static u8 extlog_dsm_uuid[] = "663E35AF-CC10-41A4-88EA-5470AF055295";
static u8 extlog_dsm_uuid[] __initdata = "663E35AF-CC10-41A4-88EA-5470AF055295";

/* L1 table related physical address */
static u64 elog_base;
@@ -153,62 +151,27 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,
	return NOTIFY_DONE;
}

static int extlog_get_dsm(acpi_handle handle, int rev, int func, u64 *ret)
static bool __init extlog_get_l1addr(void)
{
	struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL};
	struct acpi_object_list input;
	union acpi_object params[4], *obj;
	u8 uuid[16];
	int i;
	acpi_handle handle;
	union acpi_object *obj;

	acpi_str_to_uuid(extlog_dsm_uuid, uuid);
	input.count = 4;
	input.pointer = params;
	params[0].type = ACPI_TYPE_BUFFER;
	params[0].buffer.length = 16;
	params[0].buffer.pointer = uuid;
	params[1].type = ACPI_TYPE_INTEGER;
	params[1].integer.value = rev;
	params[2].type = ACPI_TYPE_INTEGER;
	params[2].integer.value = func;
	params[3].type = ACPI_TYPE_PACKAGE;
	params[3].package.count = 0;
	params[3].package.elements = NULL;

	if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf)))
		return -1;

	*ret = 0;
	obj = (union acpi_object *)buf.pointer;
	if (obj->type == ACPI_TYPE_INTEGER) {
		*ret = obj->integer.value;
	} else if (obj->type == ACPI_TYPE_BUFFER) {
		if (obj->buffer.length <= 8) {
			for (i = 0; i < obj->buffer.length; i++)
				*ret |= (obj->buffer.pointer[i] << (i * 8));
		}
	}
	kfree(buf.pointer);

	return 0;
}

static bool extlog_get_l1addr(void)
{
	acpi_handle handle;
	u64 ret;

	if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle)))
		return false;

	if (extlog_get_dsm(handle, EXTLOG_DSM_REV, EXTLOG_FN_QUERY, &ret) ||
	    !(ret & EXTLOG_QUERY_L1_EXIST))
	if (!acpi_check_dsm(handle, uuid, EXTLOG_DSM_REV, 1 << EXTLOG_FN_ADDR))
		return false;

	if (extlog_get_dsm(handle, EXTLOG_DSM_REV, EXTLOG_FN_ADDR, &ret))
	obj = acpi_evaluate_dsm_typed(handle, uuid, EXTLOG_DSM_REV,
				      EXTLOG_FN_ADDR, NULL, ACPI_TYPE_INTEGER);
	if (!obj) {
		return false;
	} else {
		l1_dirbase = obj->integer.value;
		ACPI_FREE(obj);
	}

	l1_dirbase = ret;
	/* Spec says L1 directory must be 4K aligned, bail out if it isn't */
	if (l1_dirbase & ((1 << 12) - 1)) {
		pr_warn(FW_BUG "L1 Directory is invalid at physical %llx\n",