From 80fb8edaea44483ed9fa28bfe060734d771150aa Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Wed, 5 Nov 2014 10:28:28 +0100 Subject: [PATCH] acpigen: Add and use acpigen_write_method. The sequence of bytes to create a method is used several times in codebase. Put it into a function with logical arguments rather than duplicating magic bytes everywhere. Change-Id: I0e55d8dc7d5e8e92a521c7a83117c470d0614008 Signed-off-by: Vladimir Serbinenko Reviewed-on: http://review.coreboot.org/7347 Tested-by: build bot (Jenkins) Reviewed-by: Edward O'Callaghan --- src/arch/x86/boot/acpigen.c | 37 ++++++++++++++-------------- src/arch/x86/include/arch/acpigen.h | 1 + src/cpu/intel/fsp_model_206ax/acpi.c | 5 +--- src/cpu/intel/model_2065x/acpi.c | 5 +--- src/cpu/intel/model_206ax/acpi.c | 5 +--- src/drivers/lenovo/wacom.c | 13 ++-------- 6 files changed, 25 insertions(+), 41 deletions(-) diff --git a/src/arch/x86/boot/acpigen.c b/src/arch/x86/boot/acpigen.c index 0689273b0a..0eee78a141 100644 --- a/src/arch/x86/boot/acpigen.c +++ b/src/arch/x86/boot/acpigen.c @@ -395,6 +395,19 @@ int acpigen_write_empty_PTC(void) return len + nlen; } +int acpigen_write_method(const char *name, int nargs) +{ + int len; + + /* method op */ + len = acpigen_emit_byte(0x14); + len += acpigen_write_len_f(); + len += acpigen_emit_namestring(name); + len += acpigen_emit_byte(nargs & 7); + + return len; +} + /* * Generates a func with max supported P-states. */ @@ -407,18 +420,13 @@ int acpigen_write_PPC(u8 nr) } */ int len; - /* method op */ - acpigen_emit_byte(0x14); - len = acpigen_write_len_f(); - len += acpigen_emit_namestring("_PPC"); - /* no fnarg */ - acpigen_emit_byte(0x00); + len = acpigen_write_method("_PPC", 0); /* return */ acpigen_emit_byte(0xa4); /* arg */ len += acpigen_write_byte(nr); /* add all single bytes */ - len += 3; + len += 1; acpigen_patch_len(len - 1); return len; } @@ -436,18 +444,14 @@ int acpigen_write_PPC_NVS(void) } */ int len; - /* method op */ - acpigen_emit_byte(0x14); - len = acpigen_write_len_f(); - len += acpigen_emit_namestring("_PPC"); - /* no fnarg */ - acpigen_emit_byte(0x00); + + len = acpigen_write_method("_PPC", 0); /* return */ acpigen_emit_byte(0xa4); /* arg */ len += acpigen_emit_namestring("PPCM"); /* add all single bytes */ - len += 3; + len += 1; acpigen_patch_len(len - 1); return len; } @@ -463,10 +467,7 @@ int acpigen_write_TPC(const char *gnvs_tpc_limit) */ int len; - len = acpigen_emit_byte(0x14); /* MethodOp */ - len += acpigen_write_len_f(); /* PkgLength */ - len += acpigen_emit_namestring("_TPC"); - len += acpigen_emit_byte(0x00); /* No Arguments */ + len = acpigen_write_method("_TPC", 0); len += acpigen_emit_byte(0xa4); /* ReturnOp */ len += acpigen_emit_namestring(gnvs_tpc_limit); acpigen_patch_len(len - 1); diff --git a/src/arch/x86/include/arch/acpigen.h b/src/arch/x86/include/arch/acpigen.h index d9df5d016a..babfb4014b 100644 --- a/src/arch/x86/include/arch/acpigen.h +++ b/src/arch/x86/include/arch/acpigen.h @@ -43,6 +43,7 @@ int acpigen_write_name_dword(const char *name, uint32_t val); int acpigen_write_name_qword(const char *name, uint64_t val); int acpigen_write_name_byte(const char *name, uint8_t val); int acpigen_write_scope(const char *name); +int acpigen_write_method(const char *name, int nargs); int acpigen_write_PPC(u8 nr); int acpigen_write_PPC_NVS(void); int acpigen_write_empty_PCT(void); diff --git a/src/cpu/intel/fsp_model_206ax/acpi.c b/src/cpu/intel/fsp_model_206ax/acpi.c index 57af8366a6..fabf3135cb 100644 --- a/src/cpu/intel/fsp_model_206ax/acpi.c +++ b/src/cpu/intel/fsp_model_206ax/acpi.c @@ -106,10 +106,7 @@ static void generate_C_state_entries(void) if (!cpu || !cpu->cstates) return; - acpigen_emit_byte(0x14); /* MethodOp */ - acpigen_write_len_f(); /* PkgLength */ - acpigen_emit_namestring("_CST"); - acpigen_emit_byte(0x00); /* No Arguments */ + acpigen_write_method("_CST", 0); /* If running on AC power */ acpigen_emit_byte(0xa0); /* IfOp */ diff --git a/src/cpu/intel/model_2065x/acpi.c b/src/cpu/intel/model_2065x/acpi.c index bfe801d587..8d8757ae7a 100644 --- a/src/cpu/intel/model_2065x/acpi.c +++ b/src/cpu/intel/model_2065x/acpi.c @@ -106,10 +106,7 @@ static void generate_C_state_entries(void) if (!cpu || !cpu->cstates) return; - acpigen_emit_byte(0x14); /* MethodOp */ - acpigen_write_len_f(); /* PkgLength */ - acpigen_emit_namestring("_CST"); - acpigen_emit_byte(0x00); /* No Arguments */ + acpigen_write_method("_CST", 0); /* If running on AC power */ acpigen_emit_byte(0xa0); /* IfOp */ diff --git a/src/cpu/intel/model_206ax/acpi.c b/src/cpu/intel/model_206ax/acpi.c index a801ec0928..465525b91e 100644 --- a/src/cpu/intel/model_206ax/acpi.c +++ b/src/cpu/intel/model_206ax/acpi.c @@ -106,10 +106,7 @@ static void generate_C_state_entries(void) if (!cpu || !cpu->cstates) return; - acpigen_emit_byte(0x14); /* MethodOp */ - acpigen_write_len_f(); /* PkgLength */ - acpigen_emit_namestring("_CST"); - acpigen_emit_byte(0x00); /* No Arguments */ + acpigen_write_method("_CST", 0); /* If running on AC power */ acpigen_emit_byte(0xa0); /* IfOp */ diff --git a/src/drivers/lenovo/wacom.c b/src/drivers/lenovo/wacom.c index 4a79e9a913..2f73a6d8e0 100644 --- a/src/drivers/lenovo/wacom.c +++ b/src/drivers/lenovo/wacom.c @@ -115,12 +115,7 @@ drivers_lenovo_serial_ports_ssdt_generate(const char *scope, acpigen_write_resourcetemplate_footer(reslen); - /* method op */ - acpigen_emit_byte(0x14); - acpigen_write_len_f(); - acpigen_emit_namestring("_STA"); - /* no fnarg */ - acpigen_emit_byte(0x00); + acpigen_write_method("_STA", 0); /* return */ acpigen_emit_byte(0xa4); acpigen_write_byte(0xf); @@ -151,11 +146,7 @@ drivers_lenovo_serial_ports_ssdt_generate(const char *scope, acpigen_write_resourcetemplate_footer(reslen); /* method op */ - acpigen_emit_byte(0x14); - acpigen_write_len_f(); - acpigen_emit_namestring("_STA"); - /* no fnarg */ - acpigen_emit_byte(0x00); + acpigen_write_method("_STA", 0); /* return */ acpigen_emit_byte(0xa4); acpigen_write_byte(0xf);