From patchwork Tue Oct 3 00:23:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Hung X-Patchwork-Id: 820713 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=fwts-devel-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3y5fsM5Ds6z9t4X; Tue, 3 Oct 2017 11:23:51 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1dzB01-0000ou-13; Tue, 03 Oct 2017 00:23:49 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.86_2) (envelope-from ) id 1dzAzz-0000nz-Cr for fwts-devel@lists.ubuntu.com; Tue, 03 Oct 2017 00:23:47 +0000 Received: from 1.general.alexhung.us.vpn ([10.172.65.254] helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1dzAzy-0000qs-Rs; Tue, 03 Oct 2017 00:23:47 +0000 From: Alex Hung To: fwts-devel@lists.ubuntu.com Subject: [PATCH] acpi: devices: add a new test for smart battery device Date: Mon, 2 Oct 2017 17:23:35 -0700 Message-Id: <1506990215-9584-1-git-send-email-alex.hung@canonical.com> X-Mailer: git-send-email 2.7.4 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: "fwts-devel" Signed-off-by: Alex Hung Acked-by: Colin Ian King Acked-by: Ivan Hu --- src/Makefile.am | 1 + src/acpi/devices/battery/smart_battery.c | 145 +++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 src/acpi/devices/battery/smart_battery.c diff --git a/src/Makefile.am b/src/Makefile.am index c1dccf6..cda0a49 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,6 +47,7 @@ fwts_SOURCES = main.c \ acpi/ac_adapter/ac_adapter.c \ acpi/devices/ac_adapter/ac.c \ acpi/devices/battery/battery.c \ + acpi/devices/battery/smart_battery.c \ acpi/acpidump/acpidump.c \ acpi/acpiinfo/acpiinfo.c \ acpi/acpitables/acpitables.c \ diff --git a/src/acpi/devices/battery/smart_battery.c b/src/acpi/devices/battery/smart_battery.c new file mode 100644 index 0000000..81ecd52 --- /dev/null +++ b/src/acpi/devices/battery/smart_battery.c @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2017 Canonical + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ +#include "fwts.h" + +#if defined(FWTS_HAS_ACPI) + +#include "fwts_acpi_object_eval.h" +#include +#include +#include +#include +#include + +#define FWTS_SMART_BATTERY_HID "ACPI0002" + +static ACPI_HANDLE device; + +static ACPI_STATUS get_device_handle(ACPI_HANDLE handle, uint32_t level, + void *context, void **ret_val) +{ + FWTS_UNUSED(level); + FWTS_UNUSED(context); + FWTS_UNUSED(ret_val); + + device = handle; + return AE_CTRL_TERMINATE; +} + +static int smart_battery_init(fwts_framework *fw) +{ + ACPI_STATUS status; + + if (fwts_acpica_init(fw) != FWTS_OK) + return FWTS_ERROR; + + status = AcpiGetDevices(FWTS_SMART_BATTERY_HID, get_device_handle, NULL, NULL); + if (ACPI_FAILURE(status)) { + fwts_log_error(fw, "Cannot find the ACPI device"); + return FWTS_ERROR; + } + + if (!device) { + fwts_log_error(fw, "Smart Battery device does not exist, skipping test"); + return FWTS_SKIP; + } else { + ACPI_BUFFER buffer; + char full_name[128]; + + buffer.Length = sizeof(full_name); + buffer.Pointer = full_name; + + status = AcpiGetName(device, ACPI_FULL_PATHNAME, &buffer); + if (ACPI_SUCCESS(status)) { + fwts_log_info_verbatim(fw, "Smart Battery Device: %s", full_name); + fwts_log_nl(fw); + } + } + + return FWTS_OK; +} + +static void method_test_SBS_return( + fwts_framework *fw, + char *name, + ACPI_BUFFER *buf, + ACPI_OBJECT *obj, + void *private) +{ + static const char *sbs_info[] = { + "Maximum 1 Smart Battery, system manager/selector not present", + "Maximum 1 Smart Battery, system manager/selector present", + "Maximum 2 Smart Batteries, system manager/selector present", + "Maximum 3 Smart Batteries, system manager/selector present", + "Maximum 4 Smart Batteries, system manager/selector present" + }; + + FWTS_UNUSED(private); + + if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_INTEGER) != FWTS_OK) + return; + + switch (obj->Integer.Value) { + case 0 ... 4: + fwts_passed(fw, "%s correctly returned value %" PRIu64 " %s", + name, (uint64_t)obj->Integer.Value, + sbs_info[obj->Integer.Value]); + break; + default: + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_SBSReturn", + "%s returned %" PRIu64 ", should be between 0 and 4.", + name, (uint64_t)obj->Integer.Value); + fwts_advice(fw, + "Smart Battery %s is incorrectly informing " + "the OS about the smart battery " + "configuration. This is a bug and needs to be " + "fixed.", name); + break; + } +} + +static int method_test_SBS(fwts_framework *fw) +{ + return fwts_evaluate_method(fw, METHOD_MANDATORY, &device, + "_SBS", NULL, 0, method_test_SBS_return, NULL); +} + +static fwts_framework_minor_test smart_battery_tests[] = { + { method_test_SBS, "Test _SBS (Smart Battery Subsystem)." }, + { NULL, NULL } +}; + +static int smart_battery_deinit(fwts_framework *fw) +{ + FWTS_UNUSED(fw); + fwts_acpica_deinit(); + + return FWTS_OK; +} + +static fwts_framework_ops smart_battery_ops = { + .description = "ACPI smart battery device test", + .init = smart_battery_init, + .deinit = smart_battery_deinit, + .minor_tests = smart_battery_tests +}; + +FWTS_REGISTER("smart_battery", &smart_battery_ops, FWTS_TEST_ANYTIME, FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI) + +#endif