Add support for coreboot devices. Until now, all devices with system
framebuffers were on the platform bus. On systems with a coreboot
firmware, the system framebuffer can be represented as coreboot device
on the coreboot bus. Handling the related graphics apertures requires
new interfaces and a custom way of removing the coreboot device. The
core aperture code is independent from the type of device.

Also move around a comment that refers to both, platform and coreboot,
devices.

Signed-off-by: Thomas Zimmermann <[email protected]>
---
 drivers/video/aperture.c | 60 ++++++++++++++++++++++++++++++++--------
 include/linux/aperture.h | 16 +++++++++++
 2 files changed, 64 insertions(+), 12 deletions(-)

diff --git a/drivers/video/aperture.c b/drivers/video/aperture.c
index 2b5a1e666e9b..15e664a4478b 100644
--- a/drivers/video/aperture.c
+++ b/drivers/video/aperture.c
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: MIT
 
 #include <linux/aperture.h>
+#include <linux/coreboot.h>
 #include <linux/device.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
@@ -197,22 +198,47 @@ static int devm_aperture_acquire(struct device *dev,
        return devm_add_action_or_reset(dev, devm_aperture_acquire_release, ap);
 }
 
+#if defined(CONFIG_GOOGLE_COREBOOT_TABLE)
+static void aperture_detach_coreboot_device(struct device *dev)
+{
+       struct coreboot_device *cbdev = dev_to_coreboot_device(dev);
+
+       device_unregister(&cbdev->dev);
+}
+
+/**
+ * devm_aperture_acquire_for_coreboot_device - Acquires ownership of an 
aperture
+ *                                             on behalf of a coreboot device.
+ * @cbdev:     the coreboot device to own the aperture
+ * @base:      the aperture's byte offset in physical memory
+ * @size:      the aperture size in bytes
+ *
+ * Installs the given device as the new owner of the aperture. The function
+ * expects the aperture to be provided by a coreboot device. If another
+ * driver takes over ownership of the aperture, aperture helpers will then
+ * unregister the coreboot device automatically. All acquired apertures are
+ * released automatically when the underlying device goes away.
+ *
+ * The function fails if the aperture, or parts of it, is currently
+ * owned by another device. To evict current owners, callers should use
+ * remove_conflicting_devices() et al. before calling this function.
+ *
+ * Returns:
+ * 0 on success, or a negative errno value otherwise.
+ */
+int devm_aperture_acquire_for_coreboot_device(struct coreboot_device *cbdev,
+                                             resource_size_t base,
+                                             resource_size_t size)
+{
+       return devm_aperture_acquire(&cbdev->dev, base, size, 
aperture_detach_coreboot_device);
+}
+EXPORT_SYMBOL(devm_aperture_acquire_for_coreboot_device);
+#endif
+
 static void aperture_detach_platform_device(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
 
-       /*
-        * Remove the device from the device hierarchy. This is the right thing
-        * to do for firmware-based fb drivers, such as EFI, VESA or VGA. After
-        * the new driver takes over the hardware, the firmware device's state
-        * will be lost.
-        *
-        * For non-platform devices, a new callback would be required.
-        *
-        * If the aperture helpers ever need to handle native drivers, this call
-        * would only have to unplug the DRM device, so that the hardware device
-        * stays around after detachment.
-        */
        platform_device_unregister(pdev);
 }
 
@@ -264,6 +290,16 @@ static void aperture_detach_devices(resource_size_t base, 
resource_size_t size)
                ap->dev = NULL; /* detach from device */
                list_del(&ap->lh);
 
+               /*
+                * Remove the device from the device hierarchy. This is the 
right thing
+                * to do for firmware-based fb drivers, such as EFI, VESA or 
VGA. After
+                * the new driver takes over the hardware, the firmware 
device's state
+                * will be lost.
+                *
+                * If the aperture helpers ever need to handle native drivers, 
this call
+                * would only have to unplug the DRM device, so that the 
hardware device
+                * stays around after detachment.
+                */
                ap->detach(dev);
        }
 
diff --git a/include/linux/aperture.h b/include/linux/aperture.h
index 1a9a88b11584..459823f86dc8 100644
--- a/include/linux/aperture.h
+++ b/include/linux/aperture.h
@@ -5,10 +5,17 @@
 
 #include <linux/types.h>
 
+struct coreboot_device;
 struct pci_dev;
 struct platform_device;
 
 #if defined(CONFIG_APERTURE_HELPERS)
+#if defined(CONFIG_GOOGLE_COREBOOT_TABLE)
+int devm_aperture_acquire_for_coreboot_device(struct coreboot_device *cbdev,
+                                             resource_size_t base,
+                                             resource_size_t size);
+#endif
+
 int devm_aperture_acquire_for_platform_device(struct platform_device *pdev,
                                              resource_size_t base,
                                              resource_size_t size);
@@ -20,6 +27,15 @@ int __aperture_remove_legacy_vga_devices(struct pci_dev 
*pdev);
 
 int aperture_remove_conflicting_pci_devices(struct pci_dev *pdev, const char 
*name);
 #else
+#if defined(CONFIG_GOOGLE_COREBOOT_TABLE)
+static inline int devm_aperture_acquire_for_coreboot_device(struct 
coreboot_device *cbdev,
+                                                           resource_size_t 
base,
+                                                           resource_size_t 
size)
+{
+       return 0;
+}
+#endif
+
 static inline int devm_aperture_acquire_for_platform_device(struct 
platform_device *pdev,
                                                            resource_size_t 
base,
                                                            resource_size_t 
size)
-- 
2.52.0

Reply via email to