From: Atharva Tiwari <atharvatiwarilinuxdev@gmail.com>
Cc: "Atharva Tiwari" <atharvatiwarilinuxdev@gmail.com>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Thomas Gleixner" <tglx@kernel.org>,
"Ingo Molnar" <mingo@redhat.com>,
"Borislav Petkov" <bp@alien8.de>,
"Dave Hansen" <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"Len Brown" <lenb@kernel.org>,
"Linus Walleij" <linusw@kernel.org>,
"Bartosz Golaszewski" <brgl@kernel.org>,
"Sven Peter" <sven@kernel.org>, "Janne Grunau" <j@jannau.net>,
"Neal Gompa" <neal@gompa.dev>,
"Guenter Roeck" <linux@roeck-us.net>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>, "Lee Jones" <lee@kernel.org>,
"Pavel Machek" <pavel@kernel.org>,
"Griffin Kroah-Hartman" <griffin@kroah.com>,
"Hans de Goede" <hansg@kernel.org>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Sebastian Reichel" <sre@kernel.org>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Wim Van Sebroeck" <wim@linux-watchdog.org>,
"Jarkko Sakkinen" <jarkko@kernel.org>,
"Mimi Zohar" <zohar@linux.ibm.com>,
"Roberto Sassu" <roberto.sassu@huawei.com>,
"Dmitry Kasatkin" <dmitry.kasatkin@gmail.com>,
"Eric Snowberg" <eric.snowberg@oracle.com>,
"Paul Moore" <paul@paul-moore.com>,
"James Morris" <jmorris@namei.org>,
"Serge E. Hallyn" <serge@hallyn.com>,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
linux-acpi@vger.kernel.org, linux-gpio@vger.kernel.org,
asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
linux-hwmon@vger.kernel.org, linux-iio@vger.kernel.org,
linux-leds@vger.kernel.org, mfd@lists.linux.dev,
platform-driver-x86@vger.kernel.org, linux-pm@vger.kernel.org,
linux-rtc@vger.kernel.org, linux-watchdog@vger.kernel.org,
linux-integrity@vger.kernel.org, keyrings@vger.kernel.org,
linux-security-module@vger.kernel.org
Subject: [RFC PATCH 14/14] mfd/macsmc: add ioctl to access smc keys
Date: Thu, 29 Oct 2026 04:52:11 -0400 [thread overview]
Message-ID: <20261029085504.3547-15-atharvatiwarilinuxdev@gmail.com> (raw)
In-Reply-To: <20261029085504.3547-1-atharvatiwarilinuxdev@gmail.com>
Add a /dev/smc device so userspace can talk to the SMC
directly. Some keys that need to be written aren't handled by
any driver, or affect several drivers at once, so they
can't be exposed cleanly through the kernel interfaces.
Keys already managed by kernel drivers can't be written this
way, to avoid conflicts.
Signed-off-by: Atharva Tiwari <atharvatiwarilinuxdev@gmail.com>
---
drivers/mfd/macsmc-core.c | 155 +++++++++++++++++++++++++++++++++++++
include/linux/mfd/macsmc.h | 27 +++++++
2 files changed, 182 insertions(+)
diff --git a/drivers/mfd/macsmc-core.c b/drivers/mfd/macsmc-core.c
index bc4200f57..a30f7386e 100644
--- a/drivers/mfd/macsmc-core.c
+++ b/drivers/mfd/macsmc-core.c
@@ -6,10 +6,13 @@
#include <linux/bitfield.h>
#include <linux/device.h>
+#include <linux/fs.h>
#include <linux/mfd/core.h>
#include <linux/mfd/macsmc.h>
+#include <linux/miscdevice.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
+#include <linux/uaccess.h>
static const struct mfd_cell apple_smc_rtkit_devs[] = {
MFD_CELL_NAME("macsmc-input"),
@@ -112,6 +115,144 @@ static void apple_smc_disable_notifications(void *data)
smc->be->disable_notifications(smc->be_cookie);
}
+static long apple_smc_fops_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+ struct apple_smc *smc = file->private_data;
+ void __user *argp = (void __user *)arg;
+ int ret;
+
+ switch (cmd) {
+ case IOCTL_SMC_READ: {
+ struct ioctl_smc_rw_payload payload;
+ struct apple_smc_key_info info;
+
+ if (copy_from_user(&payload, argp, sizeof(payload)))
+ return -EFAULT;
+
+ ret = apple_smc_get_key_info(smc, payload.key, &info);
+ if (ret < 0)
+ return ret;
+
+ if (payload.size != info.size)
+ return -EINVAL;
+
+ if (payload.size > 32)
+ return -EINVAL;
+
+ ret = apple_smc_read(smc, payload.key, payload.buf, payload.size);
+ if (ret < 0)
+ return ret;
+
+ if (copy_to_user(argp, &payload, sizeof(payload)))
+ return -EFAULT;
+ return 0;
+ }
+ case IOCTL_SMC_WRITE: {
+ struct ioctl_smc_rw_payload payload;
+ struct apple_smc_key_info info;
+
+ if (copy_from_user(&payload, argp, sizeof(payload)))
+ return -EFAULT;
+
+ ret = apple_smc_get_key_info(smc, payload.key, &info);
+ if (ret < 0)
+ return ret;
+
+ if (payload.size != info.size)
+ return -EINVAL;
+
+ if (payload.size > 32)
+ return -EINVAL;
+
+ switch (payload.key) {
+ case __SMC_KEY('C', 'H', '0', 'I'):
+ case __SMC_KEY('C', 'H', '0', 'C'):
+ case __SMC_KEY('C', 'H', '0', 'K'):
+ case __SMC_KEY('C', 'H', '0', 'B'):
+ case __SMC_KEY('C', 'H', 'T', 'E'):
+ case __SMC_KEY('C', 'H', 'L', 'S'):
+ case __SMC_KEY('B', 'C', 'L', 'M'):
+ case __SMC_KEY('M', 'B', 'S', 'E'):
+ case __SMC_KEY('C', 'L', 'K', 'L'):
+ case __SMC_KEY('C', 'L', 'K', 'O'):
+ case __SMC_KEY('O', 'S', 'W', 'D'):
+ case __SMC_KEY('N', 'A', 'T', 'J'):
+ case __SMC_KEY('N', 'A', 'T', 'i'):
+ case __SMC_KEY('N', 'E', 'S', 'N'):
+ case __SMC_KEY('M', 'O', 'C', 'N'):
+ case __SMC_KEY('L', 'K', 'S', 'B'):
+ case __SMC_KEY('N', 'T', 'O', 'K'):
+ case __SMC_KEY('N', 'T', 'A', 'P'):
+ case __SMC_KEY('F', '0', 'T', 'g'):
+ case __SMC_KEY('F', '1', 'T', 'g'):
+ case __SMC_KEY('F', '0', 'M', 'd'):
+ case __SMC_KEY('F', '1', 'M', 'd'):
+ case __SMC_KEY('F', 'S', '!', ' '):
+ return -EPERM;
+ }
+
+ ret = apple_smc_write(smc, payload.key, payload.buf, payload.size);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+ }
+ case IOCTL_SMC_GET_KEY_INDEX: {
+ struct ioctl_smc_index_payload payload;
+
+ if (copy_from_user(&payload, argp, sizeof(payload)))
+ return -EFAULT;
+
+ ret = apple_smc_get_key_by_index(smc, payload.index, &payload.key);
+ if (ret < 0)
+ return ret;
+
+ if (copy_to_user(argp, &payload, sizeof(payload)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case IOCTL_SMC_GET_KEY_INFO: {
+ struct ioctl_smc_info_payload payload;
+
+ if (copy_from_user(&payload, argp, sizeof(payload)))
+ return -EFAULT;
+
+ ret = apple_smc_get_key_info(smc, payload.key, &payload.info);
+ if (ret < 0)
+ return ret;
+
+ if (copy_to_user(argp, &payload, sizeof(payload)))
+ return -EFAULT;
+
+ return 0;
+ }
+ default:
+ return -EINVAL;
+ }
+}
+
+static int apple_smc_fops_open(struct inode *inode, struct file *file)
+{
+ struct miscdevice *misc = file->private_data;
+
+ file->private_data = container_of(misc, struct apple_smc, miscdev);
+ return 0;
+}
+
+static const struct file_operations apple_smc_fops = {
+ .owner = THIS_MODULE,
+ .open = apple_smc_fops_open,
+ .unlocked_ioctl = apple_smc_fops_ioctl,
+ .compat_ioctl = compat_ptr_ioctl,
+ .llseek = noop_llseek,
+};
+
+static void apple_smc_misc_unregister(void *data)
+{
+ misc_deregister(data);
+}
+
int apple_smc_probe(struct device *dev, const struct apple_smc_backend_ops *ops,
void *cookie, struct blocking_notifier_head *event_handlers, bool is_acpi)
{
@@ -150,6 +291,20 @@ int apple_smc_probe(struct device *dev, const struct apple_smc_backend_ops *ops,
if (ret)
return ret;
+ smc->miscdev.minor = MISC_DYNAMIC_MINOR;
+ smc->miscdev.name = "smc";
+ smc->miscdev.fops = &apple_smc_fops;
+ smc->miscdev.parent = dev;
+ smc->miscdev.mode = 0600;
+
+ ret = misc_register(&smc->miscdev);
+ if (ret)
+ return ret;
+
+ ret = devm_add_action_or_reset(dev, apple_smc_misc_unregister, &smc->miscdev);
+ if (ret)
+ return ret;
+
if (smc->is_acpi) {
ret = devm_mfd_add_devices(dev, -1, apple_smc_acpi_common,
ARRAY_SIZE(apple_smc_acpi_common), NULL, 0, NULL);
diff --git a/include/linux/mfd/macsmc.h b/include/linux/mfd/macsmc.h
index 4b4368b99..29fd7b20c 100644
--- a/include/linux/mfd/macsmc.h
+++ b/include/linux/mfd/macsmc.h
@@ -8,6 +8,8 @@
#ifndef _LINUX_MFD_MACSMC_H
#define _LINUX_MFD_MACSMC_H
+#include <linux/ioctl.h>
+#include <linux/miscdevice.h>
#include <linux/soc/apple/rtkit.h>
/**
@@ -125,6 +127,7 @@ struct apple_smc_backend_ops {
* @is_acpi: Is the backend ACPI based
* @mutex: Mutex for non-atomic mode
* @lock: Spinlock for atomic mode
+ * @miscdev: Misc Device struct for ioctl ops
*/
struct apple_smc {
struct device *dev;
@@ -141,8 +144,32 @@ struct apple_smc {
struct mutex mutex;
spinlock_t lock;
+
+ struct miscdevice miscdev;
+};
+
+struct ioctl_smc_rw_payload {
+ smc_key key;
+ size_t size;
+ u8 buf[32];
+};
+
+struct ioctl_smc_index_payload {
+ int index;
+ smc_key key;
+};
+
+struct ioctl_smc_info_payload {
+ smc_key key;
+ struct apple_smc_key_info info;
};
+#define APPLE_SMC_MAGIC 'S'
+#define IOCTL_SMC_READ _IOWR(APPLE_SMC_MAGIC, 1, struct ioctl_smc_rw_payload)
+#define IOCTL_SMC_WRITE _IOW(APPLE_SMC_MAGIC, 2, struct ioctl_smc_rw_payload)
+#define IOCTL_SMC_GET_KEY_INDEX _IOWR(APPLE_SMC_MAGIC, 3, struct ioctl_smc_index_payload)
+#define IOCTL_SMC_GET_KEY_INFO _IOWR(APPLE_SMC_MAGIC, 4, struct ioctl_smc_info_payload)
+
/**
* apple_smc_read - Read size bytes from given SMC key into buf
* @smc: Pointer to apple_smc struct
--
2.55.0
next prev parent reply other threads:[~2026-10-29 9:02 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 8:51 [RFC PATCH 00/14] Add macsmc support for Intel Macs, replacing applesmc Atharva Tiwari
2026-10-29 8:51 ` [RFC PATCH 01/14] treewide: Add backend for macsmc Atharva Tiwari
2026-10-29 9:20 ` sashiko-bot
2026-10-29 8:51 ` [RFC PATCH 02/14] platform/x86: add backend for macsmc in intel macs Atharva Tiwari
2026-10-29 9:23 ` sashiko-bot
2026-10-29 12:59 ` Ilpo Järvinen
2026-10-29 8:52 ` [RFC PATCH 03/14] watchdog: add driver for apple smc Atharva Tiwari
2026-10-29 9:17 ` sashiko-bot
2026-10-29 13:30 ` Andy Shevchenko
2026-10-29 8:52 ` [RFC PATCH 04/14] iio/light: add new driver for macsmc Atharva Tiwari
2026-10-29 9:17 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 05/14] iio/accel: add driver for apple SMS Atharva Tiwari
2026-10-29 9:20 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 06/14] leds: add support for macsmc kbl Atharva Tiwari
2026-10-29 9:16 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 07/14] rtc: add support for x86 macs in macsmc-rtc Atharva Tiwari
2026-10-29 9:15 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 08/14] treewide: Add a flag to detect the Apple T2 chip Atharva Tiwari
2026-10-29 9:11 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 09/14] treewide: disable other rtc's in t2 macs Atharva Tiwari
2026-10-29 9:16 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 10/14] power/supply: add support for x86 macs in macsmc-power Atharva Tiwari
2026-10-29 9:19 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 11/14] acpi: disable battery and adapter for x86 apple machines Atharva Tiwari
2026-10-29 9:13 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 12/14] hwmon/macsmc: add more types Atharva Tiwari
2026-10-29 9:18 ` sashiko-bot
2026-10-29 8:52 ` [RFC PATCH 13/14] hwmon: add support for x86 macs in macsmc-hwmon Atharva Tiwari
2026-10-29 9:20 ` sashiko-bot
2026-10-29 8:52 ` Atharva Tiwari [this message]
2026-10-29 9:22 ` [RFC PATCH 14/14] mfd/macsmc: add ioctl to access smc keys Sasha Finkelstein
2026-10-29 14:39 ` Atharva Tiwari
2026-10-29 14:53 ` Sasha Finkelstein
2026-10-29 15:25 ` Aditya Garg
2026-10-29 15:42 ` Sasha Finkelstein
2026-10-29 9:26 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261029085504.3547-15-atharvatiwarilinuxdev@gmail.com \
--to=atharvatiwarilinuxdev@gmail.com \
--cc=alexandre.belloni@bootlin.com \
--cc=andy@kernel.org \
--cc=asahi@lists.linux.dev \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=brgl@kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=dlechner@baylibre.com \
--cc=dmitry.kasatkin@gmail.com \
--cc=eric.snowberg@oracle.com \
--cc=griffin@kroah.com \
--cc=hansg@kernel.org \
--cc=hpa@zytor.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=j@jannau.net \
--cc=jarkko@kernel.org \
--cc=jic23@kernel.org \
--cc=jmorris@namei.org \
--cc=keyrings@vger.kernel.org \
--cc=lee@kernel.org \
--cc=lenb@kernel.org \
--cc=linusw@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=mfd@lists.linux.dev \
--cc=mingo@redhat.com \
--cc=neal@gompa.dev \
--cc=nuno.sa@analog.com \
--cc=paul@paul-moore.com \
--cc=pavel@kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=roberto.sassu@huawei.com \
--cc=serge@hallyn.com \
--cc=sre@kernel.org \
--cc=sven@kernel.org \
--cc=tglx@kernel.org \
--cc=wim@linux-watchdog.org \
--cc=x86@kernel.org \
--cc=zohar@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox