diff options
| author | Dave Airlie <airlied@redhat.com> | 2023-05-19 11:37:52 +1000 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2023-05-19 11:37:59 +1000 |
| commit | 33a86170888b7e4aa0cea94ebb9c67180139cea9 (patch) | |
| tree | bd0d939e4d803a2db28bcbd73a5f28acb720146b /drivers/gpu/drm/gma500/psb_drv.c | |
| parent | f1fcbaa18b28dec10281551dfe6ed3a3ed80e3d6 (diff) | |
| parent | 4795c78768bcbd58d4ffab650674d314dc6dd772 (diff) | |
Merge tag 'drm-misc-next-2023-05-11' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 6.5:
UAPI Changes:
Cross-subsystem Changes:
- arch: Consolidate <asm/fb.h>
Core Changes:
- aperture: Ignore firmware framebuffers with non-primary devices
- fbdev: Use fbdev's I/O helpers
- sysfs: Expose DRM connector ID
- tests: More tests for drm_rect
Driver Changes:
- armada: Implement fbdev emulation as a client
- bridge:
- fsl-ldb: Support i.MX6SX
- lt9211: Remove blanking packets
- lt9611: Remove blanking packets
- tc358768: Implement input bus formats reporting, fix various
timings and clocks settings
- ti-sn65dsi86: Implement wait_hpd_asserted
- nouveau: Improve NULL pointer checks before dereference
- panel:
- nt36523: Support Lenovo J606F
- st7703: Support Anbernic RG353V-V2
- new panels: InnoLux G070ACE-L01
- sun4i: Fix MIPI-DSI dotclock
- vc4: RGB Range toggle property, BT601 and BT2020 support for HDMI
- vkms: Convert to drmm helpers, Add reflection and rotation support
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/2pxmxdzsk2ekjy6xvbpj67zrhtwvkkhfspuvdm5pfm5i54hed6@sooct7yq6z4w
Diffstat (limited to 'drivers/gpu/drm/gma500/psb_drv.c')
| -rw-r--r-- | drivers/gpu/drm/gma500/psb_drv.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c index 2ce96b1b9c74..8b64f61ffaf9 100644 --- a/drivers/gpu/drm/gma500/psb_drv.c +++ b/drivers/gpu/drm/gma500/psb_drv.c @@ -7,6 +7,7 @@ * **************************************************************************/ +#include <linux/aperture.h> #include <linux/cpu.h> #include <linux/module.h> #include <linux/notifier.h> @@ -19,7 +20,6 @@ #include <acpi/video.h> #include <drm/drm.h> -#include <drm/drm_aperture.h> #include <drm/drm_drv.h> #include <drm/drm_file.h> #include <drm/drm_ioctl.h> @@ -414,20 +414,45 @@ out_err: return ret; } +/* + * Hardware for gma500 is a hybrid device, which both acts as a PCI + * device (for legacy vga functionality) but also more like an + * integrated display on a SoC where the framebuffer simply + * resides in main memory and not in a special PCI bar (that + * internally redirects to a stolen range of main memory) like all + * other integrated PCI display devices implement it. + * + * To catch all cases we need to remove conflicting firmware devices + * for the stolen system memory and for the VGA functionality. As we + * currently cannot easily find the framebuffer's location in stolen + * memory, we remove all framebuffers here. + * + * TODO: Refactor psb_driver_load() to map vdc_reg earlier. Then + * we might be able to read the framebuffer range from the + * device. + */ +static int gma_remove_conflicting_framebuffers(struct pci_dev *pdev, + const struct drm_driver *req_driver) +{ + resource_size_t base = 0; + resource_size_t size = U32_MAX; /* 4 GiB HW limit */ + const char *name = req_driver->name; + int ret; + + ret = aperture_remove_conflicting_devices(base, size, name); + if (ret) + return ret; + + return __aperture_remove_legacy_vga_devices(pdev); +} + static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct drm_psb_private *dev_priv; struct drm_device *dev; int ret; - /* - * We cannot yet easily find the framebuffer's location in memory. So - * remove all framebuffers here. - * - * TODO: Refactor psb_driver_load() to map vdc_reg earlier. Then we - * might be able to read the framebuffer range from the device. - */ - ret = drm_aperture_remove_framebuffers(true, &driver); + ret = gma_remove_conflicting_framebuffers(pdev, &driver); if (ret) return ret; |