Received: by 2002:a05:7412:8521:b0:e2:908c:2ebd with SMTP id t33csp672349rdf; Fri, 3 Nov 2023 11:21:13 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGJAiEDvKYZD9tFHDN4C4y9Tl/9ApJ3LRkpy3YtDHzPd3nSYvkCLSKw6/QHyr81EzllviHX X-Received: by 2002:a17:903:1110:b0:1c8:9832:827f with SMTP id n16-20020a170903111000b001c89832827fmr25340659plh.20.1699035672720; Fri, 03 Nov 2023 11:21:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1699035672; cv=none; d=google.com; s=arc-20160816; b=HdlTPyT+5qT3PXZzoYTwcBQRgwb5MCvtJqBoXdGLnGNbIldSS1T85unSkkNqqs7LgS cCpVSPCnuQGBusxlx9hRxZNRMihvCCCu63tORG8zrixmUwYA/9/FO/F5T7DwZVlVh+5a TA5DyxXZJXq/vcpNvHG9c74jHMZxoB+FRGOJlN4RiuV7ed8rivpnFj7gwJ7QIuO7u2S+ Z4USC0j76ZoIHQXkhswhJcDfk77pSDAGj01SDbx40oIm8FfIuhQKQGmDYq5/brYLf1Xj BFKZZwL2ygn6aOiIiiaFVwJZ0BvoJcntYu8fmu14fJ1epHaBTaCPrhodZDCwQXllD1Ni AShQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:sender:dkim-signature; bh=Aw3NIZOfJGjEMR/zbjqoZg8/cDgznkhoiJJtPHEZINM=; fh=gDgQsirMRRN//1TlxABmFg5R8c5fcWvI3qgstXIZBy8=; b=i4SzBbHr1cHGzXSqWR9y09s9cy0i1girWA6NBzptmBELI8J5lb+cjFBE446OuuNAER B+j8QRV7BapqEJ6HHBjKvI8L9wUccf3/ti/bMDAfB/sZ8Ovq+PrxypmmUYVYhXrzpe8y nG2LLPSxHYTNoXLjP8Fu5ilJYuyZrfM6wFcFiYqSxBap8TOtXUko+43FUpvBOlvAWIra SmqnEpRq0w8Y6mlULjG2BnbGh4H/u2vI2IgI5Cf6WbROzzW6djAGJl7Tr/A7KzceJGub 9HQxMqn/6z3ynvKQGKxHkORccJtNNntLxoAfHss1NEaW4RcydLaqGsUzxfwpjzBDPLx2 ptGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@equiv.tech header.s=mx header.b=LZoxlEfK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=equiv.tech Return-Path: Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id q20-20020a170902f35400b001cc644a2131si1894699ple.74.2023.11.03.11.21.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Nov 2023 11:21:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@equiv.tech header.s=mx header.b=LZoxlEfK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=equiv.tech Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 9A98F808985E; Fri, 3 Nov 2023 11:20:40 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230197AbjKCST6 (ORCPT + 99 others); Fri, 3 Nov 2023 14:19:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39908 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230219AbjKCSTy (ORCPT ); Fri, 3 Nov 2023 14:19:54 -0400 Received: from rs227.mailgun.us (rs227.mailgun.us [209.61.151.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E850DCF for ; Fri, 3 Nov 2023 11:19:46 -0700 (PDT) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=equiv.tech; q=dns/txt; s=mx; t=1699035585; x=1699042785; h=Content-Transfer-Encoding: Content-Type: MIME-Version: Message-Id: Date: Subject: Subject: Cc: To: To: From: From: Sender: Sender; bh=Aw3NIZOfJGjEMR/zbjqoZg8/cDgznkhoiJJtPHEZINM=; b=LZoxlEfK+ZMiQAEdQ6icHiIJqgspBOmZFb7F6voG0ic5MZQWdRv6sM0sE8D7O8qZoiZy2PeHkUOV3ap00Rt6e+tdxQV/05IEreoTLLGLg5NfNAsG7XiDBSyh0iSVv3Z+7b9nHJ6+bXNjQS1qhkXMNjdhTsfBmQ2gh8CojB4lBYQnn7ZZbdi08p4l1yu1+JEsFqoKjHQcW76T3jgk3jNy0aE70ulAQMwKOQQi9kAPAyvssRTlsSQK3OLECm6T+c7G5nWVBV4OpCsSZqI2rCu8wbvo/b3GV+zj8uiWWbAzb182Qe3SO9OF8MzoakITDfETyZS4GszJbuF4cayaD73/7g== X-Mailgun-Sending-Ip: 209.61.151.227 X-Mailgun-Sid: WyI4ZWI3MiIsImxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmciLCI5M2Q1YWIiXQ== Received: from mail.equiv.tech (equiv.tech [142.93.28.83]) by 0ae46d290350 with SMTP id 654539c082847315b749a83f (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Fri, 03 Nov 2023 18:19:44 GMT Sender: james@equiv.tech From: James Seo To: Jean Delvare , Guenter Roeck Cc: James Seo , Lukasz Stelmach , Armin Wolf , linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC] hwmon: (hp-wmi-sensors) Fix failure to load on EliteDesk 800 G6 Date: Fri, 3 Nov 2023 11:19:31 -0700 Message-Id: <20231103181931.677796-1-james@equiv.tech> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=0.5 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URI_TRY_3LD autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Fri, 03 Nov 2023 11:20:40 -0700 (PDT) The EliteDesk 800 G6 stores a raw WMI string within the ACPI object in its BIOS corresponding to one instance of HPBIOS_PlatformEvents.Name. This is evidently a valid way of representing a WMI data item as far as the Microsoft ACPI-WMI mapper is concerned, but is preventing the driver from loading. As this seems quite rare, add a machine-limited workaround for now. Reported-by: Lukasz Stelmach Closes: https://lore.kernel.org/linux-hwmon/7850a0bd-60e7-88f8-1d6c-0bb0e3234fdc@roeck-us.net/ Signed-off-by: James Seo --- Was converting to UTF-8 a good idea? There's also not much UTF-16 validation, because at the moment it's only being done on one machine with a known input. --- drivers/hwmon/hp-wmi-sensors.c | 57 ++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/hp-wmi-sensors.c b/drivers/hwmon/hp-wmi-sensors.c index 17ae62f88bbf..c82a9bbf16ca 100644 --- a/drivers/hwmon/hp-wmi-sensors.c +++ b/drivers/hwmon/hp-wmi-sensors.c @@ -17,13 +17,17 @@ * Available: https://github.com/linuxhw/ACPI * [4] P. Rohár, "bmfdec - Decompile binary MOF file (BMF) from WMI buffer", * 2017. [Online]. Available: https://github.com/pali/bmfdec + * [5] Microsoft Corporation, "Driver-Defined WMI Data Items", 2017. [Online]. + * Available: https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/driver-defined-wmi-data-items */ #include #include +#include #include #include #include +#include #include #include @@ -52,6 +56,10 @@ #define HP_WMI_MAX_PROPERTIES 32U #define HP_WMI_MAX_INSTANCES 32U +/* DMI board names for machines requiring workarounds. */ + +#define HP_WMI_BOARD_NAME_ELITEDESK_800_G6 "870C" + enum hp_wmi_type { HP_WMI_TYPE_OTHER = 1, HP_WMI_TYPE_TEMPERATURE = 2, @@ -412,6 +420,30 @@ static char *hp_wmi_strdup(struct device *dev, const char *src) return dst; } +/* hp_wmi_wstrdup - hp_wmi_strdup, but for a raw WMI string */ +static char *hp_wmi_wstrdup(struct device *dev, const u8 *buf) +{ + const wchar_t *src; + size_t len; + char *dst; + int i; + + /* WMI strings are length-prefixed UTF-16. See [5]. */ + src = (wchar_t *)buf; + len = min(*src++ / sizeof(*src), (size_t)HP_WMI_MAX_STR_SIZE - 1); + while (len && !src[len - 1]) + len--; + + dst = devm_kmalloc(dev, (len + 1) * sizeof(*dst), GFP_KERNEL); + if (!dst) + return NULL; + + i = utf16s_to_utf8s(src, len, UTF16_LITTLE_ENDIAN, dst, len); + dst[i] = '\0'; + + return strim(dst); +} + /* * hp_wmi_get_wobj - poll WMI for a WMI object instance * @guid: WMI object GUID @@ -442,6 +474,21 @@ static u8 hp_wmi_wobj_instance_count(const char *guid) return clamp(count, 0, (int)HP_WMI_MAX_INSTANCES); } +static bool is_raw_wmi_string(const acpi_object_type property_map[], int prop) +{ + const char *board_name; + + if (property_map != hp_wmi_platform_events_property_map || + prop != HP_WMI_PLATFORM_EVENTS_PROPERTY_NAME) + return false; + + board_name = dmi_get_system_info(DMI_BOARD_NAME); + if (!board_name) + return false; + + return !strcmp(board_name, HP_WMI_BOARD_NAME_ELITEDESK_800_G6); +} + static int check_wobj(const union acpi_object *wobj, const acpi_object_type property_map[], int last_prop) { @@ -462,8 +509,12 @@ static int check_wobj(const union acpi_object *wobj, for (prop = 0; prop <= last_prop; prop++) { type = elements[prop].type; valid_type = property_map[prop]; - if (type != valid_type) + if (type != valid_type) { + if (type == ACPI_TYPE_BUFFER && + is_raw_wmi_string(property_map, prop)) + continue; return -EINVAL; + } } return 0; @@ -480,7 +531,9 @@ static int extract_acpi_value(struct device *dev, break; case ACPI_TYPE_STRING: - *out_string = hp_wmi_strdup(dev, strim(element->string.pointer)); + *out_string = element->type == ACPI_TYPE_BUFFER ? + hp_wmi_wstrdup(dev, element->buffer.pointer) : + hp_wmi_strdup(dev, strim(element->string.pointer)); if (!*out_string) return -ENOMEM; break; base-commit: 0f564130e5c76f1e5cf0008924f6a6cd138929d9 -- 2.39.2