From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Javier Martinez Canillas <javierm@redhat.com>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
Sasha Levin <sashal@kernel.org>,
corbet@lwn.net, tzimmermann@suse.de, bp@suse.de,
gregkh@linuxfoundation.org, linux-doc@vger.kernel.org
Subject: [PATCH AUTOSEL 5.18 16/22] firmware: sysfb: Add sysfb_disable() helper function
Date: Wed, 6 Jul 2022 11:30:34 -0400 [thread overview]
Message-ID: <20220706153041.1597639-16-sashal@kernel.org> (raw)
In-Reply-To: <20220706153041.1597639-1-sashal@kernel.org>
From: Javier Martinez Canillas <javierm@redhat.com>
[ Upstream commit bde376e9de3c0bc55eedc8956b0f114c05531595 ]
This can be used by subsystems to unregister a platform device registered
by sysfb and also to disable future platform device registration in sysfb.
Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20220607182338.344270-3-javierm@redhat.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
.../driver-api/firmware/other_interfaces.rst | 6 +++
drivers/firmware/sysfb.c | 54 ++++++++++++++++---
include/linux/sysfb.h | 12 +++++
3 files changed, 66 insertions(+), 6 deletions(-)
diff --git a/Documentation/driver-api/firmware/other_interfaces.rst b/Documentation/driver-api/firmware/other_interfaces.rst
index b81794e0cfbb..06ac89adaafb 100644
--- a/Documentation/driver-api/firmware/other_interfaces.rst
+++ b/Documentation/driver-api/firmware/other_interfaces.rst
@@ -13,6 +13,12 @@ EDD Interfaces
.. kernel-doc:: drivers/firmware/edd.c
:internal:
+Generic System Framebuffers Interface
+-------------------------------------
+
+.. kernel-doc:: drivers/firmware/sysfb.c
+ :export:
+
Intel Stratix10 SoC Service Layer
---------------------------------
Some features of the Intel Stratix10 SoC require a level of privilege
diff --git a/drivers/firmware/sysfb.c b/drivers/firmware/sysfb.c
index b032f40a92de..1f276f108cc9 100644
--- a/drivers/firmware/sysfb.c
+++ b/drivers/firmware/sysfb.c
@@ -34,21 +34,59 @@
#include <linux/screen_info.h>
#include <linux/sysfb.h>
+static struct platform_device *pd;
+static DEFINE_MUTEX(disable_lock);
+static bool disabled;
+
+static bool sysfb_unregister(void)
+{
+ if (IS_ERR_OR_NULL(pd))
+ return false;
+
+ platform_device_unregister(pd);
+ pd = NULL;
+
+ return true;
+}
+
+/**
+ * sysfb_disable() - disable the Generic System Framebuffers support
+ *
+ * This disables the registration of system framebuffer devices that match the
+ * generic drivers that make use of the system framebuffer set up by firmware.
+ *
+ * It also unregisters a device if this was already registered by sysfb_init().
+ *
+ * Context: The function can sleep. A @disable_lock mutex is acquired to serialize
+ * against sysfb_init(), that registers a system framebuffer device.
+ */
+void sysfb_disable(void)
+{
+ mutex_lock(&disable_lock);
+ sysfb_unregister();
+ disabled = true;
+ mutex_unlock(&disable_lock);
+}
+EXPORT_SYMBOL_GPL(sysfb_disable);
+
static __init int sysfb_init(void)
{
struct screen_info *si = &screen_info;
struct simplefb_platform_data mode;
- struct platform_device *pd;
const char *name;
bool compatible;
- int ret;
+ int ret = 0;
+
+ mutex_lock(&disable_lock);
+ if (disabled)
+ goto unlock_mutex;
/* try to create a simple-framebuffer device */
compatible = sysfb_parse_mode(si, &mode);
if (compatible) {
pd = sysfb_create_simplefb(si, &mode);
if (!IS_ERR(pd))
- return 0;
+ goto unlock_mutex;
}
/* if the FB is incompatible, create a legacy framebuffer device */
@@ -60,8 +98,10 @@ static __init int sysfb_init(void)
name = "platform-framebuffer";
pd = platform_device_alloc(name, 0);
- if (!pd)
- return -ENOMEM;
+ if (!pd) {
+ ret = -ENOMEM;
+ goto unlock_mutex;
+ }
sysfb_apply_efi_quirks(pd);
@@ -73,9 +113,11 @@ static __init int sysfb_init(void)
if (ret)
goto err;
- return 0;
+ goto unlock_mutex;
err:
platform_device_put(pd);
+unlock_mutex:
+ mutex_unlock(&disable_lock);
return ret;
}
diff --git a/include/linux/sysfb.h b/include/linux/sysfb.h
index 708152e9037b..8ba8b5be5567 100644
--- a/include/linux/sysfb.h
+++ b/include/linux/sysfb.h
@@ -55,6 +55,18 @@ struct efifb_dmi_info {
int flags;
};
+#ifdef CONFIG_SYSFB
+
+void sysfb_disable(void);
+
+#else /* CONFIG_SYSFB */
+
+static inline void sysfb_disable(void)
+{
+}
+
+#endif /* CONFIG_SYSFB */
+
#ifdef CONFIG_EFI
extern struct efifb_dmi_info efifb_dmi_list[];
--
2.35.1
next prev parent reply other threads:[~2022-07-06 15:32 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-06 15:30 [PATCH AUTOSEL 5.18 01/22] ksmbd: use SOCK_NONBLOCK type for kernel_accept() Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 02/22] powerpc/xive/spapr: correct bitmap allocation size Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 03/22] vdpa/mlx5: Initialize CVQ vringh only once Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 04/22] vduse: Tie vduse mgmtdev and its device Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 05/22] platform/x86: intel/pmc: Add Alder Lake N support to PMC core driver Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 06/22] virtio_mmio: Add missing PM calls to freeze/restore Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 07/22] virtio_mmio: Restore guest page size on resume Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 08/22] netfilter: nf_tables: avoid skb access on nf_stolen Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 09/22] netfilter: br_netfilter: do not skip all hooks with 0 priority Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 10/22] scsi: hisi_sas: Limit max hw sectors for v3 HW Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 11/22] cpufreq: pmac32-cpufreq: Fix refcount leak bug Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 12/22] platform/x86: thinkpad-acpi: profile capabilities as integer Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 13/22] platform/x86: thinkpad_acpi: do not use PSC mode on Intel platforms Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 14/22] platform/x86: hp-wmi: Ignore Sanitization Mode event Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 15/22] firmware: sysfb: Make sysfb_create_simplefb() return a pdev pointer Sasha Levin
2022-07-06 15:30 ` Sasha Levin [this message]
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 17/22] fbdev: Disable sysfb device registration when removing conflicting FBs Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 18/22] net: tipc: fix possible refcount leak in tipc_sk_create() Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 19/22] NFC: nxp-nci: don't print header length mismatch on i2c error Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 20/22] nvme-tcp: always fail a request when sending it failed Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 21/22] nvme: fix regression when disconnect a recovering ctrl Sasha Levin
2022-07-06 15:30 ` [PATCH AUTOSEL 5.18 22/22] net: sfp: fix memory leak in sfp_probe() Sasha Levin
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=20220706153041.1597639-16-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=bp@suse.de \
--cc=corbet@lwn.net \
--cc=daniel.vetter@ffwll.ch \
--cc=gregkh@linuxfoundation.org \
--cc=javierm@redhat.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=tzimmermann@suse.de \
/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