From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010006.outbound.protection.outlook.com [52.101.193.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B646133A02B for ; Mon, 3 Aug 2026 14:58:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.6 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785769132; cv=fail; b=ewWJSjY+QEHLiBBkXI+NEOqqxW0W3oO7L6jmWioM7VDJrVZEcX+CapJ1wsi3AyZCI+5u8vComeD6v/eNss/8wKjBeeGjV8/IwNlsXEjkMjfw53N4vUvX5woXAfsC8tJqsZiZ2H2SgmjqXaOvN2wmMtywoY/urJP89ylAPT/XKV8= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785769132; c=relaxed/simple; bh=zOuLKk2dJwkcXaF4iA+7igo3Fp3YqMr2xXkdtbxae80=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Vvv6H8eCuwUkmSE44qGvAU8kWuGdb1wuq2qzjsHPnnYDwM14fNhB3JOCJfeSBO4kX+fZeX+AQ02suqMdSO3jqWlzyLR/Oyyv1v/s2kGnwBWzOyHMulXspR0rK6ABbYUo9QvAPXiy7/nIjwUCFV/sMy0mRD4eIXnWadYOQoO+ctI= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=Mq0ffzdo; arc=fail smtp.client-ip=52.101.193.6 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="Mq0ffzdo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BOuWmd8t1fmw7M0e8I/mipZTUXD+9jsQuIL3levh4YFGxcMGvl7R+eW0wcjZntmxlNY1EUdccegszWVmUKnx6woWrMk9xGjbl9Bz6aPa5pj383S9oW60qPOgZ08FJ3Sul+gk9GsAXVHcdD8Pm0TJF6ybxykPvXvjbm00Qiauc2gT+xYW7ixsBxn89Hv65LXS9CZrsiRUxfygXBY1FbT726y8LbYzaBbdV/LBZlBCfor4Zw1KNGY4HeKZ0tpQwTisKY6Iqklpb21i9ANCs3iP1H7ZpJfT4fbHaEvlBPesWwLVrXElOnKGAb+gmepwhdOrmgDnBFaEMikWB6MukaDVww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BFnI6CfdW8TqFo6Vd7NTlznyWeomo6RyChOckmxRO0Q=; b=lypwFTpWcEJh/GBZoQQWLrAKDQ5dtzbCu0mJUVQzePEk3Dr8x/nNxZT0reTZQLxwj5gt+qJZq3JDUzJ6w8oRstH1aeQZOZZe3EeDUW9u3i8XnQbaB8Eay9QmlrpKJUonSvUR71XvLqHeWx+fuUaMHPi6Oz3DFwbV5zMgcu9J+6QjAHBMArp/nvgeHiAYWh7OL8LKgxwgKGINXIUMrshWOhOT7b3BR43Sl1sk7apVPFNnA8YB4yv79ZoCHidupzDRWpAQi0D7b1STV5acDIe2rauzPbKtzzYmDX6XuTZO8H62rwep55tEe/P19a68us6Fk7/krvTWKviaWfxalyVmgg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BFnI6CfdW8TqFo6Vd7NTlznyWeomo6RyChOckmxRO0Q=; b=Mq0ffzdovp/fEdnTtK+YUCJBcQD7fbtUE4LPrmbTW7X0TfMSgzQv+DMkD88oi+Xv5sZkaZZc8ADYL3Yd3GVfZdUBhE4NLn3QqUPcsqxlB7Y8G8K/nEzziiCb4M3lNPgNwYD8//E5UbSCsbEjIc8Vr1wFEHGO62M+mxsi1CLJR2c= Received: from CH5P221CA0006.NAMP221.PROD.OUTLOOK.COM (2603:10b6:610:1f2::19) by SA1PR12MB8093.namprd12.prod.outlook.com (2603:10b6:806:335::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.270.18; Mon, 3 Aug 2026 14:58:42 +0000 Received: from CH2PEPF00000148.namprd02.prod.outlook.com (2603:10b6:610:1f2:cafe::3a) by CH5P221CA0006.outlook.office365.com (2603:10b6:610:1f2::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.270.18 via Frontend Transport; Mon, 3 Aug 2026 14:58:39 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CH2PEPF00000148.mail.protection.outlook.com (10.167.244.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.8 via Frontend Transport; Mon, 3 Aug 2026 14:58:39 +0000 Received: from airavat.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Mon, 3 Aug 2026 09:58:37 -0500 From: Basavaraj Natikar To: , , CC: , Basavaraj Natikar Subject: [PATCH v2 3/5] HID: amd_sfh: Add accessor to read the operating-mode sensor Date: Mon, 3 Aug 2026 20:27:59 +0530 Message-ID: <20260803145801.3801862-4-Basavaraj.Natikar@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260803145801.3801862-1-Basavaraj.Natikar@amd.com> References: <20260803145801.3801862-1-Basavaraj.Natikar@amd.com> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF00000148:EE_|SA1PR12MB8093:EE_ X-MS-Office365-Filtering-Correlation-Id: dbb39758-6741-4ed1-075e-08def16fb42d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|23010399003|376014|1800799024|82310400026|56012099006|11063799006|10067099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: 0i2HRtF11fQ55zxj54VkV8uYkUtQhooxmPz4N/X2ubwdrpS+MfcSd/ZJY7kFELPDhf5OqsOviowyyFm336FiFhSm17LmU2ebRn22rMd1L4vnsgabtblklFV7x2WAUnidCgUf5AnR+K6ADVoz1MlZD1eh6XUMuBDiEPR1/jYGwzDPR+GPSs8KTF2cSBECUXEkJvutZE80uN1Xfm8wzSso1P/7TxFZqWLAJhQ6cguQmWeWuBHIClvK3LD/8t8uSJvaVpyP8mTNucLLzo66H2J1z4MpsqftZwHS1sDLzia7O9ZiIUZQrY1oZgiebxrvwcFz+Cc6y1bHsVFLyqlQGrRUUBnSjvPeRiOeEkU11jABSizWsTtjiallMqls7QacuR0R7RrklcStbu3w3JN92uSt0c+hFC6QeMo3qGqaIUnlHK3ZgxtmmqtyeY+MvDpidElyTTyRKCZV1+2OjjdyLGLLinRBwKd/v2gzci0fh/SuC3Ixr0VJZhwWVAixVNComQno7Bu4WvvBe+XgkjrrdkJkqgDs4DHrbGbKvkpxgWj0DN2X5ghUN1+dJdK+Gerk3Ri5aom7Ur7bLdLclqU4cI5IdSvLW+qwr8piYWM/x2l3EeYi4rBK7Ol8IbEVe5xyU49vNpt53elyl8qqF5uMbF36eUgNL30ASOPW2+Avaf3qZhCv+qJTvNfYElcVBwEe7+oVeYDPlZ3VOlUCUjOBAynecA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(23010399003)(376014)(1800799024)(82310400026)(56012099006)(11063799006)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: h7QYEZrBjy5HYXBg6SJD6rC52MfOlYWoadjbTJBQwR/SK715q1ImgEq10DTVsz8UADf1aoZwSg4Z+VF/XRLT8vepMCfk/9MI36SHbMNAlQb5t9pwBqR+FQt6Tn/ebqqVKGhjaKKA5OLRa0343aro1Q2//2KN033vL8Qha6hmTiyLz0hBWHx1mAnfmXMk8wi+jk0MwnbFOaOP7L9iAjanHXkDBDTVP5AYYcHRmHrP1TYeyKx+QcRyUF0WGplnqj89k7QTQZGOL1sBPM00xC2VYbspH9NZ/RLPP4Eb3KNv9XMlJOoNG5aOnTUGtx+3RXBH9oCYli3siA5OUU9D7oVD2PPPC1r32YTFHOZdF0pvz0Q4y3bELl4Rr7JstQxm1ILJvudk+NEWgyi6QePx7UI5X5CTtEvVuN1mMAKVNanvmB1NGcnXKS5YFmvF654PCPim X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2026 14:58:39.9163 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dbb39758-6741-4ed1-075e-08def16fb42d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH2PEPF00000148.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB8093 Allow other drivers to query the operating mode (laptop or tablet) reported by the Sensor Fusion Hub. This is the interface used by the tablet-mode switch driver to report the device posture to userspace. Signed-off-by: Basavaraj Natikar --- drivers/hid/amd-sfh-hid/amd_sfh_client.c | 16 +++++++++ drivers/hid/amd-sfh-hid/amd_sfh_common.h | 5 +++ drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 4 +++ .../amd-sfh-hid/sfh1_1/amd_sfh_interface.c | 33 +++++++++++++++++++ .../amd-sfh-hid/sfh1_1/amd_sfh_interface.h | 1 - include/linux/amd-pmf-io.h | 14 ++++++++ 6 files changed, 72 insertions(+), 1 deletion(-) diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_client.c b/drivers/hid/amd-sfh-hid/amd_sfh_client.c index 96ae792beeb6..ae6add0b9ce3 100644 --- a/drivers/hid/amd-sfh-hid/amd_sfh_client.c +++ b/drivers/hid/amd-sfh-hid/amd_sfh_client.c @@ -383,3 +383,19 @@ int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata) return 0; } + +bool amd_sfh_op_idx_enabled(struct amd_mp2_dev *mp2) +{ + struct amdtp_cl_data *cl = mp2->cl_data; + int i; + + if (!cl) + return false; + + for (i = 0; i < cl->num_hid_devices; i++) + if (cl->sensor_idx[i] == op_idx && + READ_ONCE(cl->sensor_sts[i]) == SENSOR_ENABLED) + return true; + + return false; +} diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_common.h b/drivers/hid/amd-sfh-hid/amd_sfh_common.h index 68586f08ab23..0ca3254151ac 100644 --- a/drivers/hid/amd-sfh-hid/amd_sfh_common.h +++ b/drivers/hid/amd-sfh-hid/amd_sfh_common.h @@ -106,4 +106,9 @@ static inline u64 amd_get_p2c_val(struct amd_mp2_dev *mp2, u32 idx) { return mp2->rver == 1 ? AMD_P2C_MSG_V1(idx) : AMD_P2C_MSG(idx); } + +bool amd_sfh_op_idx_enabled(struct amd_mp2_dev *mp2); +void sfh_set_emp2(struct amd_mp2_dev *mp2); +void sfh_deinit_emp2(void); + #endif diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c index 92801ca38957..4b1cd260410d 100644 --- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c +++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c @@ -251,6 +251,8 @@ int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id) static void amd_mp2_pci_remove(void *privdata) { struct amd_mp2_dev *mp2 = privdata; + + sfh_deinit_emp2(); amd_sfh_hid_client_deinit(privdata); mp2->mp2_ops->stop_all(mp2); pcim_intx(mp2->pdev, false); @@ -419,6 +421,7 @@ static void sfh_init_work(struct work_struct *work) return; } + sfh_set_emp2(mp2); amd_sfh_clear_intr(mp2); mp2->init_done = 1; } @@ -448,6 +451,7 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i privdata->pdev = pdev; dev_set_drvdata(&pdev->dev, privdata); + rc = pcim_enable_device(pdev); if (rc) return rc; diff --git a/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.c b/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.c index dd2720bae65c..097c5513ccd8 100644 --- a/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.c +++ b/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.c @@ -84,6 +84,12 @@ void sfh_deinit_emp2(void) emp2 = NULL; } +void sfh_set_emp2(struct amd_mp2_dev *mp2) +{ + guard(mutex)(&emp2_lock); + emp2 = mp2; +} + void sfh_interface_init(struct amd_mp2_dev *mp2) { mp2->mp2_ops = &amd_sfh_ops; @@ -91,6 +97,31 @@ void sfh_interface_init(struct amd_mp2_dev *mp2) emp2 = mp2; } +static int amd_sfh_op_mode_info(u32 *op_mode) +{ + struct sfh_op_mode mode; + bool present; + + if (!op_mode) + return -EINVAL; + if (!emp2) + return -ENODEV; + + present = emp2->sfh1_1_ops ? emp2->dev_en.is_sra_present + : (emp2->mp2_ver == MP2_VER_V2 && + amd_sfh_op_idx_enabled(emp2)); + if (!present) + return -ENODEV; + + mode.val = readl(emp2->mmio + amd_get_c2p_val(emp2, 3)); + dev_dbg(&emp2->pdev->dev, "op-mode: %s (mode=%u)\n", + mode.op_mode.mode == SFH_MODE_TABLET ? "tablet" : "laptop", + mode.op_mode.mode); + *op_mode = mode.op_mode.mode; + + return 0; +} + static int amd_sfh_mode_info(u32 *platform_type, u32 *laptop_placement) { struct sfh_op_mode mode; @@ -175,6 +206,8 @@ int amd_get_sfh_info(struct amd_sfh_info *sfh_info, enum sfh_message_type op) case MT_SRA: return amd_sfh_mode_info(&sfh_info->platform_type, &sfh_info->laptop_placement); + case MT_OP_MODE: + return amd_sfh_op_mode_info(&sfh_info->op_mode); } } return -EINVAL; diff --git a/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.h b/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.h index 665c99ad779f..56258c4d1b3a 100644 --- a/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.h +++ b/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.h @@ -185,7 +185,6 @@ struct sfh_op_mode { }; void sfh_interface_init(struct amd_mp2_dev *mp2); -void sfh_deinit_emp2(void); void amd_sfh1_1_set_desc_ops(struct amd_mp2_ops *mp2_ops); int amd_sfh_float_to_int(u32 flt32_val); #endif diff --git a/include/linux/amd-pmf-io.h b/include/linux/amd-pmf-io.h index 55198d2875cc..dc59c43bd8f2 100644 --- a/include/linux/amd-pmf-io.h +++ b/include/linux/amd-pmf-io.h @@ -19,11 +19,13 @@ * @MT_HPD: Message ID to know the Human presence info from MP2 FW * @MT_ALS: Message ID to know the Ambient light info from MP2 FW * @MT_SRA: Message ID to know the SRA data from MP2 FW + * @MT_OP_MODE: Message ID to know the operating-mode (tablet/laptop) info */ enum sfh_message_type { MT_HPD, MT_ALS, MT_SRA, + MT_OP_MODE, }; /** @@ -44,12 +46,24 @@ enum sfh_hpd_info { * @user_present: Populates the user presence information * @platform_type: Operating modes (clamshell, flat, tent, etc.) * @laptop_placement: Device states (ontable, onlap, outbag) + * @op_mode: Operating-mode field (see enum sfh_dev_mode); used for tablet detection */ struct amd_sfh_info { u32 ambient_light; u8 user_present; u32 platform_type; u32 laptop_placement; + u32 op_mode; +}; + +/** + * enum sfh_dev_mode - SFH operating-mode field (sfh_op_mode.mode, bits 0-2) + * @SFH_MODE_LAPTOP: Device is in laptop/clamshell posture + * @SFH_MODE_TABLET: Device is in tablet posture + */ +enum sfh_dev_mode { + SFH_MODE_LAPTOP = 1, + SFH_MODE_TABLET = 3, }; enum laptop_placement { -- 2.34.1