From: Sui Jingfeng <sui.jingfeng@linux.dev>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org,
nouveau@lists.freedesktop.org, linux-pci@vger.kernel.org,
Sui Jingfeng <suijingfeng@loongson.cn>
Subject: [RFC,drm-misc-next v4 9/9] drm/gma500: Register as a VGA client by calling vga_client_register()
Date: Tue, 5 Sep 2023 03:57:24 +0800 [thread overview]
Message-ID: <20230904195724.633404-10-sui.jingfeng@linux.dev> (raw)
In-Reply-To: <20230904195724.633404-1-sui.jingfeng@linux.dev>
From: Sui Jingfeng <suijingfeng@loongson.cn>
Because the display controller in N2000/D2000 series can be VGA-compatible,
so let's register gma500 as a VGA client, despite the firmware may alter
the PCI class code of IGD on a multiple GPU co-exist configuration. But
this commit no crime, because VGAARB only cares about VGA devices.
Noticed that the display controller in N2000/D2000 processor don't has a
valid VRAM BAR, the firmware put the EFI firmware framebuffer into the
stolen memory, so the commit <86fd887b7fe3> ("vgaarb: Don't default
exclusively to first video device with mem+io") is not effictive on such
a case. But the benefits of the stolen memory is that it will not suffer
from PCI resource relocation. Becase the stolen memory is carved out by
the firmware and reside in system RAM. Therefore, while at it, provided a
naive version of firmware framebuffer identification function and use the
new machanism just created.
Signed-off-by: Sui Jingfeng <suijingfeng@loongson.cn>
---
drivers/gpu/drm/gma500/psb_drv.c | 57 ++++++++++++++++++++++++++++++--
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 8b64f61ffaf9..eb95d030d981 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -14,7 +14,7 @@
#include <linux/pm_runtime.h>
#include <linux/spinlock.h>
#include <linux/delay.h>
-
+#include <linux/vgaarb.h>
#include <asm/set_memory.h>
#include <acpi/video.h>
@@ -36,6 +36,11 @@
#include "psb_irq.h"
#include "psb_reg.h"
+static int gma500_modeset = -1;
+
+MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
+module_param_named(modeset, gma500_modeset, int, 0400);
+
static const struct drm_driver driver;
static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
@@ -446,6 +451,49 @@ static int gma_remove_conflicting_framebuffers(struct pci_dev *pdev,
return __aperture_remove_legacy_vga_devices(pdev);
}
+static bool gma_contain_firmware_fb(u64 ap_start, u64 ap_end)
+{
+ u64 fb_start;
+ u64 fb_size;
+ u64 fb_end;
+
+ if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
+ fb_start = (u64)screen_info.ext_lfb_base << 32 | screen_info.lfb_base;
+ else
+ fb_start = screen_info.lfb_base;
+
+ fb_size = screen_info.lfb_size;
+ fb_end = fb_start + fb_size - 1;
+
+ /* No firmware framebuffer support */
+ if (!fb_start || !fb_size)
+ return false;
+
+ if (fb_start >= ap_start && fb_end <= ap_end)
+ return true;
+
+ return false;
+}
+
+static bool gma_want_to_be_primary(struct pci_dev *pdev)
+{
+ struct drm_device *drm = pci_get_drvdata(pdev);
+ struct drm_psb_private *priv = to_drm_psb_private(drm);
+ u64 vram_base = priv->stolen_base;
+ u64 vram_size = priv->vram_stolen_size;
+
+ if (gma500_modeset == 10)
+ return true;
+
+ /* Stolen memory are not going to be moved */
+ if (gma_contain_firmware_fb(vram_base, vram_base + vram_size)) {
+ drm_dbg(drm, "Contains firmware FB in the stolen memory\n");
+ return true;
+ }
+
+ return false;
+}
+
static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
struct drm_psb_private *dev_priv;
@@ -475,6 +523,8 @@ static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (ret)
return ret;
+ vga_client_register(pdev, NULL, gma_want_to_be_primary);
+
psb_fbdev_setup(dev_priv);
return 0;
@@ -526,7 +576,10 @@ static struct pci_driver psb_pci_driver = {
static int __init psb_init(void)
{
- if (drm_firmware_drivers_only())
+ if (drm_firmware_drivers_only() && (gma500_modeset == -1))
+ return -ENODEV;
+
+ if (!gma500_modeset)
return -ENODEV;
return pci_register_driver(&psb_pci_driver);
--
2.34.1
next prev parent reply other threads:[~2023-09-04 19:58 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-04 19:57 [RFC,drm-misc-next v4 0/9] PCI/VGA: Allowing the user to select the primary video adapter at boot time Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 1/9] " Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 2/9] drm/nouveau: Implement .be_primary() callback Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 3/9] drm/radeon: " Sui Jingfeng
2023-09-05 5:50 ` Christian König
2023-09-05 17:24 ` suijingfeng
2023-09-06 16:00 ` Alex Deucher
2023-09-07 1:40 ` Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 4/9] drm/amdgpu: " Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 5/9] drm/i915: " Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 6/9] drm/loongson: " Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 7/9] drm/ast: Register as a VGA client by calling vga_client_register() Sui Jingfeng
2023-09-04 19:57 ` [RFC,drm-misc-next v4 8/9] drm/hibmc: " Sui Jingfeng
2023-09-04 19:57 ` Sui Jingfeng [this message]
2023-09-05 10:38 ` [RFC, drm-misc-next v4 0/9] PCI/VGA: Allowing the user to select the primary video adapter at boot time Jani Nikula
2023-09-05 13:28 ` Christian König
2023-09-05 14:28 ` Sui Jingfeng
2023-09-06 6:47 ` Christian König
2023-09-05 10:45 ` [Nouveau] " Thomas Zimmermann
2023-09-05 13:30 ` suijingfeng
2023-09-05 15:05 ` Thomas Zimmermann
2023-09-06 2:14 ` suijingfeng
2023-09-06 7:00 ` Thomas Zimmermann
2023-09-06 2:34 ` suijingfeng
2023-09-06 7:18 ` Thomas Zimmermann
2023-09-06 3:08 ` suijingfeng
2023-09-06 7:46 ` Thomas Zimmermann
2023-09-06 4:14 ` Sui Jingfeng
2023-09-06 6:45 ` Christian König
2023-09-06 9:08 ` suijingfeng
2023-09-06 9:40 ` Christian König
2023-09-07 2:30 ` Sui Jingfeng
2023-09-07 9:08 ` Christian König
2023-09-07 12:32 ` suijingfeng
2023-09-07 12:43 ` Christian König
2023-09-07 15:26 ` suijingfeng
2023-09-07 15:32 ` Christian König
2023-09-07 16:33 ` suijingfeng
2023-09-08 6:59 ` Christian König
2023-09-06 10:31 ` Sui Jingfeng
2023-09-06 10:50 ` Christian König
2023-09-05 10:49 ` Thomas Zimmermann
2023-09-05 15:59 ` suijingfeng
2023-09-06 8:05 ` Thomas Zimmermann
2023-09-06 9:48 ` suijingfeng
2023-09-06 11:06 ` Thomas Zimmermann
2023-09-07 9:43 ` Jani Nikula
2023-09-05 14:52 ` Alex Williamson
2023-09-05 16:21 ` suijingfeng
2023-09-05 16:39 ` Alex Williamson
2023-09-06 3:51 ` Sui Jingfeng
2023-09-06 19:29 ` Alex Williamson
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=20230904195724.633404-10-sui.jingfeng@linux.dev \
--to=sui.jingfeng@linux.dev \
--cc=amd-gfx@lists.freedesktop.org \
--cc=bhelgaas@google.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=nouveau@lists.freedesktop.org \
--cc=suijingfeng@loongson.cn \
/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;
as well as URLs for NNTP newsgroup(s).