ACPI, extlog: replace open-coded _DSM specific code with helper functions
PATCH v2 2/13 ACPI, extlog: replace open-coded _DSM specific 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 Jiang Liu <[email protected]>
Cc Chen Gong <[email protected]>
--- drivers/acpi/acpi_extlog.c | 61 +++++++++----------------------------------- 1 file changed, 12 insertions(+), 49 deletions(-)
drivers/acpi/acpi_extlog.c +12 -49
@@ -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",
Signature · 1 line
1.7.10.4
Quoted 10 lines · Jiang Liu
Subject: [Patch v2 02/13] ACPI, extlog: replace open-coded
_DSMspecific
code with helper functions
X-Mailer: git-send-email 1.7.10.4Use helper functions to simplify
_DSMrelated code inacpi_extlogdriver. Also mark initialization data and functions with__initand__initdatato reduce memory footprint.Signed-off-by Jiang Liu <[email protected]>Cc Chen Gong <[email protected]>
Tested-by Chen, Gong <[email protected]>
Reviewed-by Chen, Gong <[email protected]>