From nobody Mon Nov 25 21:23:35 2024 Received: from mail-oi1-f175.google.com (mail-oi1-f175.google.com [209.85.167.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6956817107F; Thu, 24 Oct 2024 06:18:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750693; cv=none; b=MPQHbSXii6MLqc9GD/0rnwjCrkzhQ6aZ3VsFadYFv0WHSuUnpAfomavRBqDbUoSDLnSSgGTcBX2cDiak+4jEhG7aQrTWbG/1G69/mYK5NaBg+oZgTIIt34GJM9MPmxaj0cVzFpTxqWOwtLIhYxURtLYtV+T7SNMOvSb3aWOA0mY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750693; c=relaxed/simple; bh=xqkLn4wp5FJAgI3ZJp8gPyrrez1eKyHN/pZIqNWTBJA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OOJUeI85Xi6WzuVFjqpGCLd/rewpsphBINUM/SbhFJOXlxzhQcdghx+bLqT/5mP4a4PQKigH/tSvJhSHbQGtr04ndY1xTwbH2mm7bQaxykXkFa+7cgW4A1SW2HgOMfsJzi5vTJbskhO1x2CuNIc2exuiD0H1AHbPlAKIKf+mhms= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IP28OAsj; arc=none smtp.client-ip=209.85.167.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IP28OAsj" Received: by mail-oi1-f175.google.com with SMTP id 5614622812f47-3e606cba08eso371909b6e.0; Wed, 23 Oct 2024 23:18:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729750690; x=1730355490; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OOSMv2IweW/F9SHld4KmOpVAWzlvL/o64OHcLtuXZN4=; b=IP28OAsjv0KTDkZiJ+uWsaZsKGB+lwBzaGEpflYhJ+eXcxUrrhuRZm2+Q4x3oR5dJl BOa7Q+nlz1yvpAInNqGdKgpxz/nufkukH9McsNFtsKroSWVIeXBqIuiYEkuM06IkA2IN UrlNX8D8E5RUsixwbzSjetxTBmv/WXWnLsgGrM6DlsftFFqsLlVrFwzjDNKc16tZvIdW rJMOUtvHN/EloYpDA4+t0Wh5VCTT8scinm5hfNi70PVya0WEDGc3LM/08VSetKQeg70r GAKWOI9EPpZV9Mi71ElGERZrG+/RyRB1JvEk+rRpRqysvgUTW00J37AZ+kM9wgkXImwk HEHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729750690; x=1730355490; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OOSMv2IweW/F9SHld4KmOpVAWzlvL/o64OHcLtuXZN4=; b=wUYyT5vnOeE3LDpibsJobe7VoFcbvmlfr7EODRPFdIAD59fuSYWaCo4RNGZKb1HEGG G2/Zhkz+OK5BLcSTxLVArD0T9AVfwmB5cQGA5P0bZZv2ZembXlS/ga6sRY2oOo7gKycD za/aA4KPBSBex0F6nygpVssx9P+MLQ6hEljx8cCusZixrmQu0gOHEoY5QQbD5ClFQIIB emwqCHqFriMKS3lYVTqscNzbaBRIBU1qxjgi52ZWqDZWQSpgvddZtlvWKwlbD5ApkuXM NLd0kmEHHuLKp2jKGJsODi9V6Zgh/kI/UNEobHskA2fd+aLPztzFhauON0K4fr2PDoXA um4g== X-Forwarded-Encrypted: i=1; AJvYcCW+hmIwluCZFmNjoMvQG+HK9zv5J77kfiHtBz4NtjKXNIdJ2O9nFv+W3+nqbeyPqBxpMiww/Pes4BQpWzU=@vger.kernel.org, AJvYcCWZ3kGkaaVqyKMN4Mdx95j/+IViVVHV6eBuG944gcKajG7lQ0qDijVVVxS7UG7PFhDF1BW069heH1UbntDyKdDQbqRXKw==@vger.kernel.org X-Gm-Message-State: AOJu0YxV4mb7d3ve+NBPWlFHOoMENL/Zb8lHeHEQspQqFeNTtJS75WRH FgNZBvb/Z8pX4wK+Lb3avgIYzKtRTThZBqFmLxpI77g92t+X/9N266J862sn X-Google-Smtp-Source: AGHT+IFlxTBiCWzWj9n+HzD6/dO9s3nrRpg86kuZlkrCcHRcvKREqUOlBc7Xec47CYcIGiyQtjO3mQ== X-Received: by 2002:a05:6808:2f05:b0:3e6:2d97:cb62 with SMTP id 5614622812f47-3e62d97cdd8mr416720b6e.6.1729750690268; Wed, 23 Oct 2024 23:18:10 -0700 (PDT) Received: from localhost.localdomain (host95.181-12-202.telecom.net.ar. [181.12.202.95]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7eaeabde7d5sm7750676a12.93.2024.10.23.23.18.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Oct 2024 23:18:09 -0700 (PDT) From: Kurt Borja To: kuurtb@gmail.com Cc: W_Armin@gmx.de, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org Subject: [PATCH v7 1/4] alienware-wmi: fixed indentation and clean up Date: Thu, 24 Oct 2024 03:17:59 -0300 Message-ID: <20241024061758.34330-2-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241024061547.33918-2-kuurtb@gmail.com> References: <20241024061547.33918-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fixed inconsistent indentation and removed unnecessary (acpi_size) and (u32 *) casts. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- v7: - Unchanged v6: - Unchanged --- drivers/platform/x86/dell/alienware-wmi.c | 134 +++++++++++----------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index f5ee62ce1..16a3fe9ac 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -116,68 +116,68 @@ static int __init dmi_matched(const struct dmi_system= _id *dmi) =20 static const struct dmi_system_id alienware_quirks[] __initconst =3D { { - .callback =3D dmi_matched, - .ident =3D "Alienware X51 R3", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware X51 R3"), - }, - .driver_data =3D &quirk_x51_r3, - }, + .callback =3D dmi_matched, + .ident =3D "Alienware X51 R3", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware X51 R3"), + }, + .driver_data =3D &quirk_x51_r3, + }, { - .callback =3D dmi_matched, - .ident =3D "Alienware X51 R2", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware X51 R2"), - }, - .driver_data =3D &quirk_x51_r1_r2, - }, + .callback =3D dmi_matched, + .ident =3D "Alienware X51 R2", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware X51 R2"), + }, + .driver_data =3D &quirk_x51_r1_r2, + }, { - .callback =3D dmi_matched, - .ident =3D "Alienware X51 R1", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "Alienware X51"), - }, - .driver_data =3D &quirk_x51_r1_r2, - }, + .callback =3D dmi_matched, + .ident =3D "Alienware X51 R1", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "Alienware X51"), + }, + .driver_data =3D &quirk_x51_r1_r2, + }, { - .callback =3D dmi_matched, - .ident =3D "Alienware ASM100", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "ASM100"), - }, - .driver_data =3D &quirk_asm100, - }, + .callback =3D dmi_matched, + .ident =3D "Alienware ASM100", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "ASM100"), + }, + .driver_data =3D &quirk_asm100, + }, { - .callback =3D dmi_matched, - .ident =3D "Alienware ASM200", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "ASM200"), - }, - .driver_data =3D &quirk_asm200, - }, + .callback =3D dmi_matched, + .ident =3D "Alienware ASM200", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "ASM200"), + }, + .driver_data =3D &quirk_asm200, + }, { - .callback =3D dmi_matched, - .ident =3D "Alienware ASM201", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), - DMI_MATCH(DMI_PRODUCT_NAME, "ASM201"), - }, - .driver_data =3D &quirk_asm201, - }, - { - .callback =3D dmi_matched, - .ident =3D "Dell Inc. Inspiron 5675", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5675"), - }, - .driver_data =3D &quirk_inspiron5675, - }, + .callback =3D dmi_matched, + .ident =3D "Alienware ASM201", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), + DMI_MATCH(DMI_PRODUCT_NAME, "ASM201"), + }, + .driver_data =3D &quirk_asm201, + }, + { + .callback =3D dmi_matched, + .ident =3D "Dell Inc. Inspiron 5675", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5675"), + }, + .driver_data =3D &quirk_inspiron5675, + }, {} }; =20 @@ -221,8 +221,8 @@ static struct platform_zone *zone_data; =20 static struct platform_driver platform_driver =3D { .driver =3D { - .name =3D "alienware-wmi", - } + .name =3D "alienware-wmi", + } }; =20 static struct attribute_group zone_attribute_group =3D { @@ -292,7 +292,7 @@ static int alienware_update_led(struct platform_zone *z= one) guid =3D WMAX_CONTROL_GUID; method_id =3D WMAX_METHOD_ZONE_CONTROL; =20 - input.length =3D (acpi_size) sizeof(wmax_basic_args); + input.length =3D sizeof(wmax_basic_args); input.pointer =3D &wmax_basic_args; } else { legacy_args.colors =3D zone->colors; @@ -306,7 +306,7 @@ static int alienware_update_led(struct platform_zone *z= one) guid =3D LEGACY_CONTROL_GUID; method_id =3D zone->location + 1; =20 - input.length =3D (acpi_size) sizeof(legacy_args); + input.length =3D sizeof(legacy_args); input.pointer =3D &legacy_args; } pr_debug("alienware-wmi: guid %s method %d\n", guid, method_id); @@ -358,7 +358,7 @@ static int wmax_brightness(int brightness) .led_mask =3D 0xFF, .percentage =3D brightness, }; - input.length =3D (acpi_size) sizeof(args); + input.length =3D sizeof(args); input.pointer =3D &args; status =3D wmi_evaluate_method(WMAX_CONTROL_GUID, 0, WMAX_METHOD_BRIGHTNESS, &input, NULL); @@ -508,7 +508,7 @@ static acpi_status alienware_wmax_command(struct wmax_b= asic_args *in_args, struct acpi_buffer input; struct acpi_buffer output; =20 - input.length =3D (acpi_size) sizeof(*in_args); + input.length =3D sizeof(*in_args); input.pointer =3D in_args; if (out_data) { output.length =3D ACPI_ALLOCATE_BUFFER; @@ -542,7 +542,7 @@ static ssize_t show_hdmi_cable(struct device *dev, }; status =3D alienware_wmax_command(&in_args, WMAX_METHOD_HDMI_CABLE, - (u32 *) &out_data); + &out_data); if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[unconnected] connected unknown\n"); @@ -563,7 +563,7 @@ static ssize_t show_hdmi_source(struct device *dev, }; status =3D alienware_wmax_command(&in_args, WMAX_METHOD_HDMI_STATUS, - (u32 *) &out_data); + &out_data); =20 if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 1) @@ -643,7 +643,7 @@ static ssize_t show_amplifier_status(struct device *dev, }; status =3D alienware_wmax_command(&in_args, WMAX_METHOD_AMPLIFIER_CABLE, - (u32 *) &out_data); + &out_data); if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[unconnected] connected unknown\n"); @@ -695,7 +695,7 @@ static ssize_t show_deepsleep_status(struct device *dev, .arg =3D 0, }; status =3D alienware_wmax_command(&in_args, WMAX_METHOD_DEEP_SLEEP_STATUS, - (u32 *) &out_data); + &out_data); if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[disabled] s5 s5_s4\n"); --=20 2.47.0 From nobody Mon Nov 25 21:23:35 2024 Received: from mail-oi1-f175.google.com (mail-oi1-f175.google.com [209.85.167.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41529176AA1; Thu, 24 Oct 2024 06:18:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750733; cv=none; b=mf3zNGEYHb5zhmm7jpJAATD05YqfjDoxW1RCJ2quDGKnkQFcv6lD5BuNbuPjEgg8T+9FLTQseiShPBPWRQZURkY/I169lUIf9E20rU+RP3YHLQlJ17W44G0S6byfFW0riogR04YOZHR7um48rX599y98s6GRuMoYCPg/fo2/g5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750733; c=relaxed/simple; bh=usNgQL4ZkUkzNrPidpdCo9BRtmHdYIoxyz0zObdrPmk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kcOpuoQtWQAsgy9iNcy2Rty8pZ3vILLVctLF3r+5SE1tgIwkc5IKFG6XRWgzMXpjGZf4bWukZ6qXtE5TeHwacPnvzC3ojNXh96rngBmG0E137NL8uKR/Aw3InVeuHTj8pT2TvYhuNZV8Bdan2j/KF2N77uO8TeYZNe7sVZDs9NA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NCm850ly; arc=none smtp.client-ip=209.85.167.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NCm850ly" Received: by mail-oi1-f175.google.com with SMTP id 5614622812f47-3e60f6ea262so320524b6e.1; Wed, 23 Oct 2024 23:18:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729750730; x=1730355530; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IXLvDWajhhfj7ALGh86/2Bkae+YpKlHx6XOu5tC70cQ=; b=NCm850lyESxMnkikjVU8AoR/fOkutWU65qFuHibKhR1+JTuWOprYzqHc38SGnhpl00 DdTNnOh7s2qcsCRvJXIxJ5KxKtiecOBud8eff7VfS1v7WkF97ibm8I0CIWmbzEqWkgHt 01ZeQkfdPcwYkBaZBy5da9/4nPcNsCt1z9jZYNOggcsRp5VM0a2lN18cOCazEpuePtGU BLaMKYMoRTarMrt1lpuR+KZu+D321/6xjAJMAveoqkfim/AUvs+KqxCsqGOxrh6UI3Y3 qKhBShhlyV7Phi2ecYKZg5y4x0G3ci57McNgqfGO1luEWUBHq9HnFoArT8nlRCOX7H6a fVxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729750730; x=1730355530; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IXLvDWajhhfj7ALGh86/2Bkae+YpKlHx6XOu5tC70cQ=; b=JBgc7m+QarRQbYSELMj6ue5iSu8m0SvQdk1KleUtN3TocAvtxkTTbqLHJqMTTzanV/ zXEst8Wiz2vusp9z3PyxaKr4A20q8LhfaoJc7wSiICrQWt/t6Dtem47lCxJ3+vdFL54T W7ESSeBynBm/nxWaZSnRNYtEPINEljsahqyWWdx9Q3qwRDy0b7AydaYqsfS1ZhFfPTEq HeNUp4rHw6QL5yQpIz6S6AlKpb2+AkZHGzjgcHeZvMogrEAgP5R+W3zes+kOet2lnJub dOZic8xHSpdWZ9X4381OwhiDrx//ZBFR7HWRoZuDxEPRe8cdsyCrbeEPCtFe/JIDAU3Z ug0A== X-Forwarded-Encrypted: i=1; AJvYcCUITdJ+mrdtUNfV/8H/EQny0FwzzcK17s5dKbCS56g7uriTh1I+txwwVdYsbWT8xielMtHyrh49qCDBog09s5MLLEvGCQ==@vger.kernel.org, AJvYcCXVEKO7hkm9/v4aajy8FAKAoWwjLIsJsVPBRlW4B75DwGyNcL1BkY79JObzF8ITQnFODeQ20WwqpJtj3v0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw59BfD9SLNNetCv6TbcoVvg66xBhsu0B6KVmOGgfutlBlPlJrf RgFjCsbPNUcUL9HYdaoR8Wv6C6WHqoiZsvqyLf5kw6x70QVT1jlN X-Google-Smtp-Source: AGHT+IGgrhR7ZboEsFpdmO7eYnKdZ4MxJ5sCJ2Es07RCtc+525nnSPVsAqhUc3l8bP1kqQITUMTjnA== X-Received: by 2002:a05:6808:2e8f:b0:3e5:f2f4:9a73 with SMTP id 5614622812f47-3e62cbb9327mr1002024b6e.21.1729750730271; Wed, 23 Oct 2024 23:18:50 -0700 (PDT) Received: from localhost.localdomain (host95.181-12-202.telecom.net.ar. [181.12.202.95]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7eaeab48f46sm7901662a12.41.2024.10.23.23.18.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Oct 2024 23:18:49 -0700 (PDT) From: Kurt Borja To: kuurtb@gmail.com Cc: W_Armin@gmx.de, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org Subject: [PATCH v7 2/4] alienware-wmi: alienware_wmax_command() is now input size agnostic Date: Thu, 24 Oct 2024 03:18:39 -0300 Message-ID: <20241024061838.34558-2-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241024061547.33918-2-kuurtb@gmail.com> References: <20241024061547.33918-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" alienware_wmax_command() now takes void * and size_t instead of struct wmax_basic_args to extend support to new WMAX methods. Also int *out_data was changed to u32 *out_data, because new interface specifies u32 as output parameter and all previous callers would pass u32 * regardless. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- v7: - Unchanged v6: - Unchanged --- drivers/platform/x86/dell/alienware-wmi.c | 29 ++++++++++++----------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index 16a3fe9ac..b27f3b64c 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -500,15 +500,15 @@ static void alienware_zone_exit(struct platform_devic= e *dev) kfree(zone_attrs); } =20 -static acpi_status alienware_wmax_command(struct wmax_basic_args *in_args, - u32 command, int *out_data) +static acpi_status alienware_wmax_command(void *in_args, size_t in_size, + u32 command, u32 *out_data) { acpi_status status; union acpi_object *obj; struct acpi_buffer input; struct acpi_buffer output; =20 - input.length =3D sizeof(*in_args); + input.length =3D in_size; input.pointer =3D in_args; if (out_data) { output.length =3D ACPI_ALLOCATE_BUFFER; @@ -541,8 +541,8 @@ static ssize_t show_hdmi_cable(struct device *dev, .arg =3D 0, }; status =3D - alienware_wmax_command(&in_args, WMAX_METHOD_HDMI_CABLE, - &out_data); + alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_HDMI_CABLE, &out_data); if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[unconnected] connected unknown\n"); @@ -562,8 +562,8 @@ static ssize_t show_hdmi_source(struct device *dev, .arg =3D 0, }; status =3D - alienware_wmax_command(&in_args, WMAX_METHOD_HDMI_STATUS, - &out_data); + alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_HDMI_STATUS, &out_data); =20 if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 1) @@ -589,7 +589,8 @@ static ssize_t toggle_hdmi_source(struct device *dev, args.arg =3D 3; pr_debug("alienware-wmi: setting hdmi to %d : %s", args.arg, buf); =20 - status =3D alienware_wmax_command(&args, WMAX_METHOD_HDMI_SOURCE, NULL); + status =3D alienware_wmax_command(&args, sizeof(args), + WMAX_METHOD_HDMI_SOURCE, NULL); =20 if (ACPI_FAILURE(status)) pr_err("alienware-wmi: HDMI toggle failed: results: %u\n", @@ -642,8 +643,8 @@ static ssize_t show_amplifier_status(struct device *dev, .arg =3D 0, }; status =3D - alienware_wmax_command(&in_args, WMAX_METHOD_AMPLIFIER_CABLE, - &out_data); + alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_AMPLIFIER_CABLE, &out_data); if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[unconnected] connected unknown\n"); @@ -694,8 +695,8 @@ static ssize_t show_deepsleep_status(struct device *dev, struct wmax_basic_args in_args =3D { .arg =3D 0, }; - status =3D alienware_wmax_command(&in_args, WMAX_METHOD_DEEP_SLEEP_STATUS, - &out_data); + status =3D alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_DEEP_SLEEP_STATUS, &out_data); if (ACPI_SUCCESS(status)) { if (out_data =3D=3D 0) return sysfs_emit(buf, "[disabled] s5 s5_s4\n"); @@ -723,8 +724,8 @@ static ssize_t toggle_deepsleep(struct device *dev, args.arg =3D 2; pr_debug("alienware-wmi: setting deep sleep to %d : %s", args.arg, buf); =20 - status =3D alienware_wmax_command(&args, WMAX_METHOD_DEEP_SLEEP_CONTROL, - NULL); + status =3D alienware_wmax_command(&args, sizeof(args), + WMAX_METHOD_DEEP_SLEEP_CONTROL, NULL); =20 if (ACPI_FAILURE(status)) pr_err("alienware-wmi: deep sleep control failed: results: %u\n", --=20 2.47.0 From nobody Mon Nov 25 21:23:35 2024 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 84B5117A586; Thu, 24 Oct 2024 06:21:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750913; cv=none; b=XVuzRyfsUIQ0rXz8BWQHavAfGXpCPPK8njEIGIDyzF8QzkwpDmlvgOWloYK+y9vX+4O9DhkPq7KwQrGEWBI00sFah8zJvdy8NSZJZLH77ed8P3c7Z8ZJDpzHxg4EcpA6U1RAKWt2JkpjprcmQe9wzWUIwJ6XEwCj+T8A1rCve2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750913; c=relaxed/simple; bh=EKDKKf3wq3TTOWCTBQrl2cBmw0r8AHV115LHR8xE3Uw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s6of+6lIa/MF97N9aGweZCbXi63aJlKb3zgiZgly+XgBWBPOVnzRNY2+PIvUdt1WuKrHSv8jM6pKR5d4PYSpkKZ4nbvydyJFE5kJTI+ksoD1ECk3QRjVNW9bupJczKhGAjnPf3dc9m8GRpe9ORekT3ALwkgBEk9wqJLC1XX7bgs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LjEbpx7H; arc=none smtp.client-ip=209.85.215.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LjEbpx7H" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-7c1324be8easo1175527a12.1; Wed, 23 Oct 2024 23:21:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729750910; x=1730355710; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QOoHNQBSMYBy6k1di2QmdpB3YrUOvwhni6V9g57tS9s=; b=LjEbpx7Ho4tpHyxdNrgV4MpL7wtqTqqXn2omiYPVYXmjlZtaOjM56mfEAGb3zAl+83 fB8k8d6NG0K8g4+XXcKS1avrgitVuvKp2xzNxmll1ZTiRTf3+O3AqaXWuXoR3abqMZwd WqvUtwtfubyDRzsJ5RUDa7SLC4EUraeJINIX7vX0bdrMUlPWFXKWWIAbnlVGFKdZ6tO2 8H4K5IOmwwES8h5MCzhnrsvS84d4SFqFQSvNWzx9+asSWnPaA/2n+eq67wIXeEvYxb69 ER4bDGqdTiQuOZFxW7kHDqPwkFhTUpPY3ExnxNuO/h07GmWW7u1t2cyo3lZLjAkgHfjs g6xQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729750910; x=1730355710; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QOoHNQBSMYBy6k1di2QmdpB3YrUOvwhni6V9g57tS9s=; b=lPwALw8Je6re+Y3lix4qMboznzIcB2S1H+vHWcFjPHIWasXBZdWLxvKCBBzoFb5vaR QeOGZjRR9lK1P1Dh7kfUrt8bh6eeUWnQosL9249fhhsPWzEr00zAJtBx3eeAVYV2lKpL iLbDKurN/DGNzroz+TbmSuHsEdbivu9EiJJC4uPJWnwBRU74b/b1u6seQMeXl0Q6wD09 P+AGjRQG2Tu264Yh3YROiPZ1RHnrkK2ozrGLZBCkhchwJhCvaN2PplTAmzr8Oj/6XAdO a1NOdlrtfXc5jw7TQJCD3hNsFKDQzNgnN7GcpIb2aMgaXHJXNmPIobnjaQdo5qBbvoKb jOew== X-Forwarded-Encrypted: i=1; AJvYcCULn9ViREnMPBhurZxe380Ou9HCILtILGZ7KxudMWbaB1Z9fUAKUU4P/6r3IHskyDIGI+2dM32udWrN2uCZzJhIi6y+2A==@vger.kernel.org, AJvYcCX8gxVTyjciC7pOicY/+g/M++FFcXZ6oOm8ssyHkoEiib8uSdgmv4w09VVrLjO3sJcQ2vsZkt8b2hZ1NKA=@vger.kernel.org X-Gm-Message-State: AOJu0YwkzSBJdGBL9mrN4YUl+pCZzGDBGOvEvzDp58F4pPFlY1OR1H9j b30jHbxHB30sPhDDqDJQR4KnloVyshUKmWB+BeFvrmWAScf29yXI X-Google-Smtp-Source: AGHT+IGoKKp07x5WG+lwddLv1PQizhj8BtU8Qr+Hz5w1tXMAcXssx31hMRLctI7HbV3pv1HlWS7MGQ== X-Received: by 2002:a17:90a:fd04:b0:2e2:b719:d582 with SMTP id 98e67ed59e1d1-2e77e6405f5mr1671726a91.14.1729750909583; Wed, 23 Oct 2024 23:21:49 -0700 (PDT) Received: from localhost.localdomain (host95.181-12-202.telecom.net.ar. [181.12.202.95]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e76dfebad3sm2584172a91.55.2024.10.23.23.21.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Oct 2024 23:21:49 -0700 (PDT) From: Kurt Borja To: kuurtb@gmail.com Cc: W_Armin@gmx.de, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org Subject: [PATCH v7 3/4] alienware-wmi: added platform profile support Date: Thu, 24 Oct 2024 03:19:03 -0300 Message-ID: <20241024061901.34793-3-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241024061547.33918-2-kuurtb@gmail.com> References: <20241024061547.33918-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implements platform profile support for Dell laptops with new WMAX thermal interface, present on some Alienware X-Series, Alienware M-Series and Dell's G-Series laptops.=20 This implementation automatically detects available thermal profiles and GMODE + Game Shift availability, which is a feature of G-Series laptops. Signed-off-by: Kurt Borja --- v7: - Method operations are now clearly listed as separate enums - wmax_thermal_modes are now listed without codes in order to support autodetection, as well as getting and setting thermal profiles cleanly through arrays - Added wmax_mode_to_platform_profile[] - Added struct wmax_u32_args to replace bit mask approach of constructing arguments for wmax methods - create_thermal_profile now autodetects available thermal codes through operation 0x03 of THERMAL_INFORMATION method. These are codes are stored in supported_thermal_profiles[] - thermal_profile_get now uses wmax_mode_to_platform_profile[] instead of switch-case approach - thermal_profile_set now uses supported_thermal_profiles[] instead of switch-case approach - When gmode is autodetected, thermal_profile_set also sets Game Shift status accordingly v6: - Fixed alignment on some function definitions - Fixed braces on if statment - Removed quirk thermal_ustt - Now quirk thermal can take values defined in enum WMAX_THERMAL_TABLE. - Proper removal of thermal_profile --- This refactor was done in order to autodetect available thermal modes efficently through operation 0x03. This new array approach exploits the fact that the first 4 bits of every thermal code are consecutive from 0 to 9, however next 4 bits are not consecutive (available thermal codes are documented in patch 4/4) so full codes are dynamically probed based on rules found in is_wmax_thermal_code(). --- drivers/platform/x86/dell/Kconfig | 1 + drivers/platform/x86/dell/alienware-wmi.c | 282 ++++++++++++++++++++++ 2 files changed, 283 insertions(+) diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/= Kconfig index 68a49788a..b06d634cd 100644 --- a/drivers/platform/x86/dell/Kconfig +++ b/drivers/platform/x86/dell/Kconfig @@ -21,6 +21,7 @@ config ALIENWARE_WMI depends on LEDS_CLASS depends on NEW_LEDS depends on ACPI_WMI + select ACPI_PLATFORM_PROFILE help This is a driver for controlling Alienware BIOS driven features. It exposes an interface for controlling the AlienFX diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x= 86/dell/alienware-wmi.c index b27f3b64c..9ce6e794a 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -8,8 +8,11 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include +#include +#include #include #include +#include #include #include =20 @@ -25,6 +28,13 @@ #define WMAX_METHOD_AMPLIFIER_CABLE 0x6 #define WMAX_METHOD_DEEP_SLEEP_CONTROL 0x0B #define WMAX_METHOD_DEEP_SLEEP_STATUS 0x0C +#define WMAX_METHOD_THERMAL_INFORMATION 0x14 +#define WMAX_METHOD_THERMAL_CONTROL 0x15 +#define WMAX_METHOD_GAME_SHIFT_STATUS 0x25 + +#define WMAX_THERMAL_MODE_GMODE 0xAB + +#define WMAX_FAILURE_CODE 0xFFFFFFFF =20 MODULE_AUTHOR("Mario Limonciello "); MODULE_DESCRIPTION("Alienware special feature control"); @@ -49,11 +59,59 @@ enum WMAX_CONTROL_STATES { WMAX_SUSPEND =3D 3, }; =20 +enum WMAX_THERMAL_INFORMATION_OPERATIONS { + WMAX_OPERATION_LIST_IDS =3D 0x03, + WMAX_OPERATION_CURRENT_PROFILE =3D 0x0B, +}; + +enum WMAX_THERMAL_CONTROL_OPERATIONS { + WMAX_OPERATION_ACTIVATE_PROFILE =3D 0x01, +}; + +enum WMAX_GAMESHIFT_STATUS_OPERATIONS { + WMAX_OPERATION_TOGGLE_GAME_SHIFT =3D 0x01, + WMAX_OPERATION_GET_GAME_SHIFT_STATUS =3D 0x02, +}; + +enum WMAX_THERMAL_TABLES { + WMAX_THERMAL_TABLE_BASIC =3D 0x90, + WMAX_THERMAL_TABLE_USTT =3D 0xA0, +}; + +enum wmax_thermal_mode { + THERMAL_MODE_USTT_BALANCED, + THERMAL_MODE_USTT_BALANCED_PERFORMANCE, + THERMAL_MODE_USTT_COOL, + THERMAL_MODE_USTT_QUIET, + THERMAL_MODE_USTT_PERFORMANCE, + THERMAL_MODE_USTT_LOW_POWER, + THERMAL_MODE_BASIC_QUIET, + THERMAL_MODE_BASIC_BALANCED, + THERMAL_MODE_BASIC_BALANCED_PERFORMANCE, + THERMAL_MODE_BASIC_PERFORMANCE, + THERMAL_MODE_LAST, +}; + +static const enum platform_profile_option wmax_mode_to_platform_profile[TH= ERMAL_MODE_LAST] =3D { + [THERMAL_MODE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [THERMAL_MODE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, + [THERMAL_MODE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, + [THERMAL_MODE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, + [THERMAL_MODE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, + [THERMAL_MODE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, + [THERMAL_MODE_BASIC_QUIET] =3D PLATFORM_PROFILE_QUIET, + [THERMAL_MODE_BASIC_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [THERMAL_MODE_BASIC_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_P= ERFORMANCE, + [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, +}; + struct quirk_entry { u8 num_zones; u8 hdmi_mux; u8 amplifier; u8 deepslp; + u8 thermal; + u8 gmode; }; =20 static struct quirk_entry *quirks; @@ -64,6 +122,8 @@ static struct quirk_entry quirk_inspiron5675 =3D { .hdmi_mux =3D 0, .amplifier =3D 0, .deepslp =3D 0, + .thermal =3D 0, + .gmode =3D 0, }; =20 static struct quirk_entry quirk_unknown =3D { @@ -71,6 +131,8 @@ static struct quirk_entry quirk_unknown =3D { .hdmi_mux =3D 0, .amplifier =3D 0, .deepslp =3D 0, + .thermal =3D 0, + .gmode =3D 0, }; =20 static struct quirk_entry quirk_x51_r1_r2 =3D { @@ -78,6 +140,8 @@ static struct quirk_entry quirk_x51_r1_r2 =3D { .hdmi_mux =3D 0, .amplifier =3D 0, .deepslp =3D 0, + .thermal =3D 0, + .gmode =3D 0, }; =20 static struct quirk_entry quirk_x51_r3 =3D { @@ -85,6 +149,8 @@ static struct quirk_entry quirk_x51_r3 =3D { .hdmi_mux =3D 0, .amplifier =3D 1, .deepslp =3D 0, + .thermal =3D 0, + .gmode =3D 0, }; =20 static struct quirk_entry quirk_asm100 =3D { @@ -92,6 +158,8 @@ static struct quirk_entry quirk_asm100 =3D { .hdmi_mux =3D 1, .amplifier =3D 0, .deepslp =3D 0, + .thermal =3D 0, + .gmode =3D 0, }; =20 static struct quirk_entry quirk_asm200 =3D { @@ -99,6 +167,8 @@ static struct quirk_entry quirk_asm200 =3D { .hdmi_mux =3D 1, .amplifier =3D 0, .deepslp =3D 1, + .thermal =3D 0, + .gmode =3D 0, }; =20 static struct quirk_entry quirk_asm201 =3D { @@ -106,6 +176,8 @@ static struct quirk_entry quirk_asm201 =3D { .hdmi_mux =3D 1, .amplifier =3D 1, .deepslp =3D 1, + .thermal =3D 0, + .gmode =3D 0, }; =20 static int __init dmi_matched(const struct dmi_system_id *dmi) @@ -214,10 +286,19 @@ struct wmax_led_args { u8 state; } __packed; =20 +struct wmax_u32_args { + u8 operation; + u8 arg1; + u8 arg2; + u8 arg3; +}; + static struct platform_device *platform_device; static struct device_attribute *zone_dev_attrs; static struct attribute **zone_attrs; static struct platform_zone *zone_data; +static struct platform_profile_handler pp_handler; +static enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_= LAST]; =20 static struct platform_driver platform_driver =3D { .driver =3D { @@ -761,6 +842,198 @@ static int create_deepsleep(struct platform_device *d= ev) return ret; } =20 +/* + * Thermal Profile control + * - Provides thermal profile control through the Platform Profile API + */ +#define WMAX_THERMAL_TABLE_MASK GENMASK(7, 4) +#define WMAX_THERMAL_MODE_MASK GENMASK(3, 0) + +static bool is_wmax_thermal_code(u32 code) +{ + return ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_BASIC = || + (code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_USTT) && + (code & WMAX_THERMAL_MODE_MASK) < THERMAL_MODE_LAST; +} + +static int wmax_thermal_information(u8 operation, u8 arg, u32 *out_data) +{ + acpi_status status; + struct wmax_u32_args in_args =3D { + .operation =3D operation, + .arg1 =3D arg, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + status =3D alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_THERMAL_INFORMATION, + out_data); + + if (ACPI_FAILURE(status)) + return -EIO; + + if (*out_data =3D=3D WMAX_FAILURE_CODE) + return -EBADRQC; + + return 0; +} + +static int wmax_thermal_control(u8 operation, u8 arg) +{ + acpi_status status; + struct wmax_u32_args in_args =3D { + .operation =3D operation, + .arg1 =3D arg, + .arg2 =3D 0, + .arg3 =3D 0, + }; + u32 out_data; + + status =3D alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_THERMAL_CONTROL, + &out_data); + + if (ACPI_FAILURE(status)) + return -EIO; + + if (out_data =3D=3D WMAX_FAILURE_CODE) + return -EBADRQC; + + return 0; +} + +static int wmax_gameshift_status(u8 operation, u32 *out_data) +{ + acpi_status status; + struct wmax_u32_args in_args =3D { + .operation =3D operation, + .arg1 =3D 0, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + status =3D alienware_wmax_command(&in_args, sizeof(in_args), + WMAX_METHOD_GAME_SHIFT_STATUS, + out_data); + + if (ACPI_FAILURE(status)) + return -EIO; + + if (*out_data =3D=3D WMAX_FAILURE_CODE) + return -EOPNOTSUPP; + + return 0; +} + +static int thermal_profile_get(struct platform_profile_handler *pprof, + enum platform_profile_option *profile) +{ + u32 out_data; + int ret; + + ret =3D wmax_thermal_information(WMAX_OPERATION_CURRENT_PROFILE, + 0, &out_data); + + if (ret < 0) + return ret; + + if (!is_wmax_thermal_code(out_data)) + return -ENODATA; + + out_data &=3D WMAX_THERMAL_MODE_MASK; + *profile =3D wmax_mode_to_platform_profile[out_data]; + + return 0; +} + +static int thermal_profile_set(struct platform_profile_handler *pprof, + enum platform_profile_option profile) +{ + if (quirks->gmode =3D=3D 1) { + u32 gmode_status; + int ret; + + ret =3D wmax_gameshift_status(WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + &gmode_status); + + if (ret < 0) + return ret; + + if ((profile =3D=3D PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || + (profile !=3D PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { + ret =3D wmax_gameshift_status(WMAX_OPERATION_TOGGLE_GAME_SHIFT, + &gmode_status); + + if (ret < 0) + return ret; + } + } + + return wmax_thermal_control(WMAX_OPERATION_ACTIVATE_PROFILE, + supported_thermal_profiles[profile]); +} + +static int create_thermal_profile(void) +{ + u32 out_data; + u32 gmode_status; + enum wmax_thermal_mode mode; + enum platform_profile_option profile; + int ret; + + for (u8 i =3D 0x2; i <=3D 0xD; i++) { + ret =3D wmax_thermal_information(WMAX_OPERATION_LIST_IDS, + i, &out_data); + + if (ret =3D=3D -EIO) + return 0; + + if (ret =3D=3D -EBADRQC) + break; + + if (!is_wmax_thermal_code(out_data)) + continue; + + mode =3D out_data & WMAX_THERMAL_MODE_MASK; + profile =3D wmax_mode_to_platform_profile[mode]; + supported_thermal_profiles[profile] =3D out_data; + + set_bit(profile, pp_handler.choices); + } + + if (bitmap_empty(pp_handler.choices, PLATFORM_PROFILE_LAST)) + return 0; + + ret =3D wmax_gameshift_status(WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + &gmode_status); + + if (!ret) { + supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D + WMAX_THERMAL_MODE_GMODE; + + set_bit(PLATFORM_PROFILE_PERFORMANCE, pp_handler.choices); + quirks->gmode =3D 1; + } + + pp_handler.profile_get =3D thermal_profile_get; + pp_handler.profile_set =3D thermal_profile_set; + + ret =3D platform_profile_register(&pp_handler); + if (ret < 0) + return ret; + + quirks->thermal =3D 1; + + return 0; +} + +static void remove_thermal_profile(void) +{ + if (quirks->thermal > 0) + platform_profile_remove(); +} + static int __init alienware_wmi_init(void) { int ret; @@ -808,6 +1081,12 @@ static int __init alienware_wmi_init(void) goto fail_prep_deepsleep; } =20 + if (interface =3D=3D WMAX && quirks =3D=3D &quirk_unknown) { + ret =3D create_thermal_profile(); + if (ret) + goto fail_prep_thermal_profile; + } + ret =3D alienware_zone_init(platform_device); if (ret) goto fail_prep_zones; @@ -816,6 +1095,8 @@ static int __init alienware_wmi_init(void) =20 fail_prep_zones: alienware_zone_exit(platform_device); + remove_thermal_profile(); +fail_prep_thermal_profile: fail_prep_deepsleep: fail_prep_amplifier: fail_prep_hdmi: @@ -835,6 +1116,7 @@ static void __exit alienware_wmi_exit(void) if (platform_device) { alienware_zone_exit(platform_device); remove_hdmi(platform_device); + remove_thermal_profile(); platform_device_unregister(platform_device); platform_driver_unregister(&platform_driver); } --=20 2.47.0 From nobody Mon Nov 25 21:23:35 2024 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B55C178362; Thu, 24 Oct 2024 06:22:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750956; cv=none; b=Fosutn07xGU41ByREN8mlHI3wPIfKNBvqN/pnWu3g/3G5U+zLHkWdBcupzmCUJnldannsggoWgtltZad/ePZ1j2rMHDbf0EPBhRQMSHbMZ5ZT9qCCaR9e16dbwZ3x6OY1Vsx6XEZAWzFNZOrYQH4Rfj5+7hpawiim7qZM+qL6rk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729750956; c=relaxed/simple; bh=E6kmkam0iYc4kfUxqECoH0lhUxZ4cXVNKaEm6J+TnWQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OkD0ykjt9Y0XJdp9KnMfVuU/7p0YiXcNosDlhrl9qHQXEPxtWMVNaeXesAOfe49l0metKR1T91ocIRBqS5f9cx/4LYkKfSF1Kgzu9UDAi3uRmQobk9IqkkpLiyjj0dzSar2mozLeEZkIHh7oTLjLQhwS9k4qI3b+XR4TDGTGl4E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Zr77AWrU; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Zr77AWrU" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-71e8235f0b6so411149b3a.3; Wed, 23 Oct 2024 23:22:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729750953; x=1730355753; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5rbgHYgbnVbl9db7ZZffsJrdPHuG61Rfkey1pjzebrs=; b=Zr77AWrU1xBKkE1PF4HzaGpAs3WGi8ZbcfTeGispxNXmDogIVQTzCH0Q+p91/8GiFN 6bLIDA6je41eqBa2wZGeeG7iuhscKnLCWZVkQmL71Bb3xWCBv2/QrnDg2Q7992qbHOVX qQTLhGz0fX+mSuykUElwyG5yzKSihfzQVwLHn0QvaZXNXgRfp4Ns5Vbmj8c6bOqXjbRd hJEfR9f/mX2jMHnNNDx0nUFMTxShcCORzgyvCcSKlLppnTabniu24tdYwwwnzPspOUZU PqaPMnPzn8nM19pwx5zND8hFFe/ttrexSo9z4hFBbLzeTK1xvGpsN2we0AB+AvST+KVe H23A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729750953; x=1730355753; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5rbgHYgbnVbl9db7ZZffsJrdPHuG61Rfkey1pjzebrs=; b=CoBPSLxlOf6jEa4ltgyJWcIlYnCe6S18xJOwirbtRFEsKH3zBS/LkeFC8jxOyyBAGs 5W4YipHbleMRM+f3WGpral5pUWvlA1XMNUgjv11sEx+b9K157y1YkSzkIyA9bnIuNZkh RiwMryrUkw0X8pJWBlZqChyxqAtctlJhj7AO1fe/2cwGPzCqCzPfZo9lfPexhpEl0YPO qKPgkjZfXra5b9uuvzsx8uV/3EM9+Xtjxq6bIOR7lplXftgmNeM5Ub40eI1HJjgx1jPs K6JkDVhBmwnubeJ4ySHxIxnqqykOjL/dKxYOKeNQ9aqV6gnaRCNB1R9L/I8LOIgS3Sxq vdcw== X-Forwarded-Encrypted: i=1; AJvYcCU26jI1A8Ecp9xC0KgnFBNIzRE7SpH3hPnINAKHj+jqS10WjqhOPtUmmc6A6qbNqxR7egGN0R117caNfpot+4I0dETbNw==@vger.kernel.org, AJvYcCXHaQx6rz9uNfp1ckWvXd/gjvD8bZTICFHcET8kAJt4m9rdZtYdOvWcwyk6TdBLNfadL0OsSfZol7Q7Zfw=@vger.kernel.org X-Gm-Message-State: AOJu0Ywn2PDb/szARX3qnmym5bxnomjCcRE8SYcXCGgpUhq32eekQube LdOCEPUkiFUQJyMgFqtFvsM8h4L0IqlohN2GqGPhkpQdBoBr7jy8 X-Google-Smtp-Source: AGHT+IFVly5yLCTI6vZnCKlGZFKBxVsik6tlaVjjMAvAk1aW9U5cjaZlZ219mpOcDKzOKh9QOzAeag== X-Received: by 2002:a05:6a20:4499:b0:1d6:fb1b:d096 with SMTP id adf61e73a8af0-1d978b3ddd5mr6350774637.26.1729750952614; Wed, 23 Oct 2024 23:22:32 -0700 (PDT) Received: from localhost.localdomain (host95.181-12-202.telecom.net.ar. [181.12.202.95]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71ec1313fc1sm7315807b3a.41.2024.10.23.23.22.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Oct 2024 23:22:32 -0700 (PDT) From: Kurt Borja To: kuurtb@gmail.com Cc: W_Armin@gmx.de, hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org Subject: [PATCH v7 4/4] alienware-wmi: WMAX interface documentation Date: Thu, 24 Oct 2024 03:21:59 -0300 Message-ID: <20241024062158.35149-2-kuurtb@gmail.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241024061547.33918-2-kuurtb@gmail.com> References: <20241024061547.33918-2-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Added documentation for new WMAX interface, present on some Alienware X-Series, Alienware M-Series and Dell's G-Series laptops. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- v7: - Added GameShiftStatus method to documentation - Added remark about operation 0x03 of Thermal_Information method - Removed undocumented methods v6: - Fixed typos - Included new file in MAINTAINERS --- Documentation/wmi/devices/alienware-wmi.rst | 388 ++++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 389 insertions(+) create mode 100644 Documentation/wmi/devices/alienware-wmi.rst diff --git a/Documentation/wmi/devices/alienware-wmi.rst b/Documentation/wm= i/devices/alienware-wmi.rst new file mode 100644 index 000000000..36a67ff9a --- /dev/null +++ b/Documentation/wmi/devices/alienware-wmi.rst @@ -0,0 +1,388 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Dell AWCC WMI interface driver (alienware-wmi) +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Introduction +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The WMI device WMAX has been implemented for many Alienware and Dell's G-S= eries +models. Throughout these models, two implementations have been identified.= The +first one, used by older systems, deals with HDMI, brightness, RGB, amplif= ier +and deep sleep control. The second one used by newer systems deals primari= ly +with thermal, overclocking, and GPIO control. + +It is suspected that the latter is used by Alienware Command Center (AWCC)= to +manage manufacturer predefined thermal profiles. The alienware-wmi driver +exposes Thermal_Information and Thermal_Control methods through the Platfo= rm +Profile API to mimic AWCC's behavior. + +This newer interface, named AWCCMethodFunction has been reverse engineered= , as +Dell has not provided any official documentation. We will try to describe = to the +best of our ability its discovered inner workings. + +.. note:: + The following method description may be incomplete and some operations = have + different implementations between devices. + +WMI interface description +------------------------- + +The WMI interface description can be decoded from the embedded binary MOF = (bmof) +data using the `bmfdec `_ utility: + +:: + + [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("WMI= Function"), guid("{A70591CE-A997-11DA-B012-B622A1EF5492}")] + class AWCCWmiMethodFunction { + [key, read] string InstanceName; + [read] boolean Active; + + [WmiMethodId(13), Implemented, read, write, Description("Return Overclo= cking Report.")] void Return_OverclockingReport([out] uint32 argr); + [WmiMethodId(14), Implemented, read, write, Description("Set OCUIBIOS C= ontrol.")] void Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(15), Implemented, read, write, Description("Clear OC FailS= afe Flag.")] void Clear_OCFailSafeFlag([out] uint32 argr); + [WmiMethodId(19), Implemented, read, write, Description("Get Fan Sensor= s.")] void GetFanSensors([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(20), Implemented, read, write, Description("Thermal Inform= ation.")] void Thermal_Information([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(21), Implemented, read, write, Description("Thermal Contro= l.")] void Thermal_Control([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(23), Implemented, read, write, Description("MemoryOCContro= l.")] void MemoryOCControl([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(26), Implemented, read, write, Description("System Informa= tion.")] void SystemInformation([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(28), Implemented, read, write, Description("Power Informat= ion.")] void PowerInformation([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(32), Implemented, read, write, Description("FW Update GPIO= toggle.")] void FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(33), Implemented, read, write, Description("Read Total of = GPIOs.")] void ReadTotalofGPIOs([out] uint32 argr); + [WmiMethodId(34), Implemented, read, write, Description("Read GPIO pin = Status.")] void ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(35), Implemented, read, write, Description("Read Chassis C= olor.")] void ReadChassisColor([out] uint32 argr); + [WmiMethodId(36), Implemented, read, write, Description("Read Platform = Properties.")] void ReadPlatformProperties([out] uint32 argr); + [WmiMethodId(37), Implemented, read, write, Description("Game Shift Sta= tus.")] void GameShiftStatus([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(128), Implemented, read, write, Description("Caldera SW in= stallation.")] void CalderaSWInstallation([out] uint32 argr); + [WmiMethodId(129), Implemented, read, write, Description("Caldera SW is= released.")] void CalderaSWReleased([out] uint32 argr); + [WmiMethodId(130), Implemented, read, write, Description("Caldera Conne= ction Status.")] void CalderaConnectionStatus([in] uint32 arg2, [out] uint3= 2 argr); + [WmiMethodId(131), Implemented, read, write, Description("Surprise Unpl= ugged Flag Status.")] void SurpriseUnpluggedFlagStatus([out] uint32 argr); + [WmiMethodId(132), Implemented, read, write, Description("Clear Surpris= e Unplugged Flag.")] void ClearSurpriseUnpluggedFlag([out] uint32 argr); + [WmiMethodId(133), Implemented, read, write, Description("Cancel Undock= Request.")] void CancelUndockRequest([out] uint32 argr); + [WmiMethodId(135), Implemented, read, write, Description("Devices in Ca= ldera.")] void DevicesInCaldera([in] uint32 arg2, [out] uint32 argr); + [WmiMethodId(136), Implemented, read, write, Description("Notify BIOS f= or SW ready to disconnect Caldera.")] void NotifyBIOSForSWReadyToDisconnect= Caldera([out] uint32 argr); + [WmiMethodId(160), Implemented, read, write, Description("Tobii SW inst= allation.")] void TobiiSWinstallation([out] uint32 argr); + [WmiMethodId(161), Implemented, read, write, Description("Tobii SW Rele= ased.")] void TobiiSWReleased([out] uint32 argr); + [WmiMethodId(162), Implemented, read, write, Description("Tobii Camera = Power Reset.")] void TobiiCameraPowerReset([out] uint32 argr); + [WmiMethodId(163), Implemented, read, write, Description("Tobii Camera = Power On.")] void TobiiCameraPowerOn([out] uint32 argr); + [WmiMethodId(164), Implemented, read, write, Description("Tobii Camera = Power Off.")] void TobiiCameraPowerOff([out] uint32 argr); + }; + +Some of these methods get quite intricate so we will describe them using +pseudo-code that vaguely resembles the original ASL code. + +Methods not described in the following document have unknown behavior. + +Argument Structure +------------------ + +All input arguments have type **uint32** and their structure is very simil= ar +between methods. Usually, the first byte corresponds to a specific *operat= ion* +the method performs, and the subsequent bytes correspond to *arguments* pa= ssed +to this *operation*. For example, if an operation has code 0x01 and requir= es an +ID 0xA0, the argument you would pass to the method is 0xA001. + + +Thermal Methods +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------------- + +:: + + if BYTE_0(arg2) =3D=3D 0x01: + argr =3D 1 + + if BYTE_0(arg2) =3D=3D 0x02: + argr =3D UNKNOWN_CONSTANT + + if BYTE_0(arg2) =3D=3D 0x03: + if BYTE_1(arg2) =3D=3D 0x00: + argr =3D FAN_ID_0 + + if BYTE_1(arg2) =3D=3D 0x01: + argr =3D FAN_ID_1 + + if BYTE_1(arg2) =3D=3D 0x02: + argr =3D FAN_ID_2 + + if BYTE_1(arg2) =3D=3D 0x03: + argr =3D FAN_ID_3 + + if BYTE_1(arg2) =3D=3D 0x04: + argr =3D SENSOR_ID_CPU | 0x0100 + + if BYTE_1(arg2) =3D=3D 0x05: + argr =3D SENSOR_ID_GPU | 0x0100 + + if BYTE_1(arg2) =3D=3D 0x06: + argr =3D THERMAL_MODE_QUIET_ID + + if BYTE_1(arg2) =3D=3D 0x07: + argr =3D THERMAL_MODE_BALANCED_ID + + if BYTE_1(arg2) =3D=3D 0x08: + argr =3D THERMAL_MODE_BALANCED_PERFORMANCE_ID + + if BYTE_1(arg2) =3D=3D 0x09: + argr =3D THERMAL_MODE_PERFORMANCE_ID + + if BYTE_1(arg2) =3D=3D 0x0A: + argr =3D THERMAL_MODE_LOW_POWER_ID + + if BYTE_1(arg2) =3D=3D 0x0B: + argr =3D THERMAL_MODE_GMODE_ID + + else: + argr =3D 0xFFFFFFFF + + if BYTE_0(arg2) =3D=3D 0x04: + if is_valid_sensor(BYTE_1(arg2)): + argr =3D SENSOR_TEMP_C + else: + argr =3D 0xFFFFFFFF + + if BYTE_0(arg2) =3D=3D 0x05: + if is_valid_fan(BYTE_1(arg2)): + argr =3D FAN_RPM() + + if BYTE_0(arg2) =3D=3D 0x06: + skip + + if BYTE_0(arg2) =3D=3D 0x07: + argr =3D 0 + + If BYTE_0(arg2) =3D=3D 0x08: + if is_valid_fan(BYTE_1(arg2)): + argr =3D 0 + else: + argr =3D 0xFFFFFFFF + + if BYTE_0(arg2) =3D=3D 0x09: + if is_valid_fan(BYTE_1(arg2)): + argr =3D FAN_UNKNOWN_STAT_0() + + else: + argr =3D 0xFFFFFFFF + + if BYTE_0(arg2) =3D=3D 0x0A: + argr =3D THERMAL_MODE_BALANCED_ID + + if BYTE_0(arg2) =3D=3D 0x0B: + argr =3D CURRENT_THERMAL_MODE() + + if BYTE_0(arg2) =3D=3D 0x0C: + if is_valid_fan(BYTE_1(arg2)): + argr =3D FAN_UNKNOWN_STAT_1() + else: + argr =3D 0xFFFFFFFF + +Operation 0x03 list all available fan IDs, sensor IDs and thermal profile +codes in order, but different models may have different number of fans and +thermal profiles. These are the known ranges: + +* Fan IDs: from 2 up to 4 +* Sensor IDs: 2 +* Thermal profile codes: from 1 up to 7 + +In total BYTE_1(ARG2) may range from 0x5 up to 0xD depending on the model. + +WMI method Thermal_Control([in] uint32 arg2, [out] uint32 argr) +--------------------------------------------------------------- + +:: + + if BYTE_0(arg2) =3D=3D 0x01: + if is_valid_thermal_profile(BYTE_1(arg2)): + SET_THERMAL_PROFILE(BYTE_1(arg2)) + argr =3D 0 + + if BYTE_0(arg2) =3D=3D 0x02: + if is_valid_fan(BYTE_1(arg2)): + SET_FAN_SPEED_MULTIPLIER(BYTE_2(arg2)) + argr =3D 0 + else: + argr =3D 0xFFFFFFFF + +.. note:: + While you can manually change the fan speed multiplier with this method, + Dell's BIOS tends to overwrite this changes anyway. + +These are the known thermal profile codes: + +:: + + CUSTOM 0x00 + + BALANCED_USTT 0xA0 + BALANCED_PERFORMANCE_USTT 0xA1 + COOL_USTT 0xA2 + QUIET_USTT 0xA3 + PERFORMANCE_USTT 0xA4 + LOW_POWER_USTT 0xA5 + + QUIET 0x96 + BALANCED 0x97 + BALANCED_PERFORMANCE 0x98 + PERFORMANCE 0x99 + + GMODE 0xAB + +Usually if a model doesn't support the first four profiles they will suppo= rt +the User Selectable Thermal Tables (USTT) profiles and vice-versa. + +GMODE replaces PERFORMANCE in G-Series laptops. + +WMI method GameShiftStatus([in] uint32 arg2, [out] uint32 argr) +--------------------------------------------------------------- + +:: + + if BYTE_0(arg2) =3D=3D 0x1: + TOGGLE_GAME_SHIFT() + argr =3D GET_GAME_SHIFT_STATUS() + + if BYTE_0(arg2) =3D=3D 0x2: + argr =3D GET_GAME_SHIFT_STATUS() + +Game Shift Status does not change the fan speed profile but it could be so= me +sort of CPU/GPU power profile. Benchmarks have not been done. + +This method is only present on Dell's G-Series laptops and it's implementa= tion +implies GMODE thermal profile is available, even if operation 0x03 of +Thermal_Information does not list it. + +G-key on Dell's G-Series laptops also changes Game Shift status, so both a= re +directly related. + +WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------- + +:: + + if BYTE_0(arg2) =3D=3D 0x1: + if is_valid_fan(BYTE_1(arg2)): + argr =3D 1 + else: + argr =3D 0 + + if BYTE_0(arg2) =3D=3D 0x2: + if is_valid_fan(BYTE_1(arg2)): + if BYTE_2(arg2) =3D=3D 0: + argr =3D=3D SENSOR_ID + else + argr =3D=3D 0xFFFFFFFF + else: + argr =3D 0 + +Overclocking Methods +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +.. warning:: + These methods have not been tested and are only partially reverse + engineered. + +WMI method Return_OverclockingReport([out] uint32 argr) +------------------------------------------------------- + +:: + + CSMI (0xE3, 0x99) + argr =3D 0 + +CSMI is an unknown operation. + +WMI method Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------------- + +:: + + CSMI (0xE3, 0x99) + argr =3D 0 + +CSMI is an unknown operation. + +WMI method Clear_OCFailSafeFlag([out] uint32 argr) +-------------------------------------------------- + +:: + + CSMI (0xE3, 0x99) + argr =3D 0 + +CSMI is an unknown operation. + + +WMI method MemoryOCControl([in] uint32 arg2, [out] uint32 argr) +--------------------------------------------------------------- + +AWCC supports memory overclocking, but this method is very intricate and h= as +not been deciphered yet. + +GPIO methods +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +These methods are probably related to some kind of firmware update system, +through a GPIO device. + +.. warning:: + These methods have not been tested and are only partially reverse + engineered. + +WMI method FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------------ + +:: + + if BYTE_0(arg2) =3D=3D 0: + if BYTE_1(arg2) =3D=3D 1: + SET_PIN_A_HIGH() + else: + SET_PIN_A_LOW() + + if BYTE_0(arg2) =3D=3D 1: + if BYTE_1(arg2) =3D=3D 1: + SET_PIN_B_HIGH() + + else: + SET_PIN_B_LOW() + + else: + argr =3D 1 + +WMI method ReadTotalofGPIOs([out] uint32 argr) +---------------------------------------------- + +:: + + argr =3D 0x02 + +WMI method ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------------ + +:: + + if BYTE_0(arg2) =3D=3D 0: + argr =3D PIN_A_STATUS + + if BYTE_0(arg2) =3D=3D 1: + argr =3D PIN_B_STATUS + +Other information Methods +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +WMI method ReadChassisColor([out] uint32 argr) +---------------------------------------------- + +:: + + argr =3D CHASSIS_COLOR_ID + +Acknowledgements +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Kudos to `AlexIII `_ for documenting +and testing available thermal profile codes. + diff --git a/MAINTAINERS b/MAINTAINERS index c27f31907..25f6de4c2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -792,6 +792,7 @@ F: drivers/perf/alibaba_uncore_drw_pmu.c ALIENWARE WMI DRIVER L: Dell.Client.Kernel@dell.com S: Maintained +F: Documentation/wmi/devices/alienware-wmi.rst F: drivers/platform/x86/dell/alienware-wmi.c =20 ALLEGRO DVT VIDEO IP CORE DRIVER --=20 2.47.0