| From 466839f127f75f5db73de5e5c01fa1a62a4d950b Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Wed, 9 Oct 2013 09:18:51 +0200 |
| Subject: drm/i915: Kconfig option to disable the legacy fbdev support |
| |
| Boots Just Fine (tm)! |
| |
| The only glitch seems to be that at least on Fedora the boot splash |
| gets confused and doesn't display much at all. |
| |
| And since there's no ugly console flickering anymore in between, the |
| flicker while switching between X servers (VT support is still enabled) |
| is even more jarring. |
| |
| Also, I'm unsure whether we don't need to somehow kick out vgacon, now |
| that nothing else gets in the way. But stuff seems to work, so I |
| don't care. Also everything still works as well with VGA_CONSOLE=n |
| |
| Also the #ifdef mess needs a bit of a cleanup, follow-up patches will |
| do just that. |
| |
| To keep the Kconfig tidy, extract all the i915 options into its own |
| file. |
| |
| v2: |
| - Rebase on top of the preliminary hw support option and the |
| intel_drv.h cleanup. |
| - Shut up warnings in i915_debugfs.c |
| |
| v3: Use the right CONFIG variable, spotted by Chon Ming. |
| |
| Cc: Lee, Chon Ming <chon.ming.lee@intel.com> |
| Cc: David Herrmann <dh.herrmann@gmail.com> |
| Reviewed-by: Chon Ming Lee <chon.ming.lee@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 4520f53a159fb81b8c27afe52428a0959aff259c) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/Kconfig | 60 ------------------------------- |
| drivers/gpu/drm/i915/Kconfig | 67 +++++++++++++++++++++++++++++++++++ |
| drivers/gpu/drm/i915/Makefile | 3 + |
| drivers/gpu/drm/i915/i915_debugfs.c | 9 ++-- |
| drivers/gpu/drm/i915/i915_dma.c | 6 +++ |
| drivers/gpu/drm/i915/i915_drv.h | 2 + |
| drivers/gpu/drm/i915/intel_display.c | 10 +++++ |
| drivers/gpu/drm/i915/intel_drv.h | 36 +++++++++++++++--- |
| 8 files changed, 122 insertions(+), 71 deletions(-) |
| create mode 100644 drivers/gpu/drm/i915/Kconfig |
| |
| --- a/drivers/gpu/drm/Kconfig |
| +++ b/drivers/gpu/drm/Kconfig |
| @@ -128,65 +128,7 @@ config DRM_I810 |
| selected, the module will be called i810. AGP support is required |
| for this driver to work. |
| |
| -config DRM_I915 |
| - tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics" |
| - depends on DRM |
| - depends on AGP |
| - depends on AGP_INTEL |
| - # we need shmfs for the swappable backing store, and in particular |
| - # the shmem_readpage() which depends upon tmpfs |
| - select SHMEM |
| - select TMPFS |
| - select DRM_KMS_HELPER |
| - select DRM_KMS_FB_HELPER |
| - select FB_CFB_FILLRECT |
| - select FB_CFB_COPYAREA |
| - select FB_CFB_IMAGEBLIT |
| - # i915 depends on ACPI_VIDEO when ACPI is enabled |
| - # but for select to work, need to select ACPI_VIDEO's dependencies, ick |
| - select BACKLIGHT_LCD_SUPPORT if ACPI |
| - select BACKLIGHT_CLASS_DEVICE if ACPI |
| - select VIDEO_OUTPUT_CONTROL if ACPI |
| - select INPUT if ACPI |
| - select THERMAL if ACPI |
| - select ACPI_VIDEO if ACPI |
| - select ACPI_BUTTON if ACPI |
| - help |
| - Choose this option if you have a system that has "Intel Graphics |
| - Media Accelerator" or "HD Graphics" integrated graphics, |
| - including 830M, 845G, 852GM, 855GM, 865G, 915G, 945G, 965G, |
| - G35, G41, G43, G45 chipsets and Celeron, Pentium, Core i3, |
| - Core i5, Core i7 as well as Atom CPUs with integrated graphics. |
| - If M is selected, the module will be called i915. AGP support |
| - is required for this driver to work. This driver is used by |
| - the Intel driver in X.org 6.8 and XFree86 4.4 and above. It |
| - replaces the older i830 module that supported a subset of the |
| - hardware in older X.org releases. |
| - |
| - Note that the older i810/i815 chipsets require the use of the |
| - i810 driver instead, and the Atom z5xx series has an entirely |
| - different implementation. |
| - |
| -config DRM_I915_KMS |
| - bool "Enable modesetting on intel by default" |
| - depends on DRM_I915 |
| - help |
| - Choose this option if you want kernel modesetting enabled by default, |
| - and you have a new enough userspace to support this. Running old |
| - userspaces with this enabled will cause pain. Note that this causes |
| - the driver to bind to PCI devices, which precludes loading things |
| - like intelfb. |
| - |
| -config DRM_I915_PRELIMINARY_HW_SUPPORT |
| - bool "Enable preliminary support for prerelease Intel hardware by default" |
| - depends on DRM_I915 |
| - help |
| - Choose this option if you have prerelease Intel hardware and want the |
| - i915 driver to support it by default. You can enable such support at |
| - runtime with the module option i915.preliminary_hw_support=1; this |
| - option changes the default for that module option. |
| - |
| - If in doubt, say "N". |
| +source "drivers/gpu/drm/i915/Kconfig" |
| |
| config DRM_MGA |
| tristate "Matrox g200/g400" |
| --- /dev/null |
| +++ b/drivers/gpu/drm/i915/Kconfig |
| @@ -0,0 +1,67 @@ |
| +config DRM_I915 |
| + tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics" |
| + depends on DRM |
| + depends on AGP |
| + depends on AGP_INTEL |
| + # we need shmfs for the swappable backing store, and in particular |
| + # the shmem_readpage() which depends upon tmpfs |
| + select SHMEM |
| + select TMPFS |
| + select DRM_KMS_HELPER |
| + # i915 depends on ACPI_VIDEO when ACPI is enabled |
| + # but for select to work, need to select ACPI_VIDEO's dependencies, ick |
| + select BACKLIGHT_LCD_SUPPORT if ACPI |
| + select BACKLIGHT_CLASS_DEVICE if ACPI |
| + select VIDEO_OUTPUT_CONTROL if ACPI |
| + select INPUT if ACPI |
| + select ACPI_VIDEO if ACPI |
| + select ACPI_BUTTON if ACPI |
| + help |
| + Choose this option if you have a system that has "Intel Graphics |
| + Media Accelerator" or "HD Graphics" integrated graphics, |
| + including 830M, 845G, 852GM, 855GM, 865G, 915G, 945G, 965G, |
| + G35, G41, G43, G45 chipsets and Celeron, Pentium, Core i3, |
| + Core i5, Core i7 as well as Atom CPUs with integrated graphics. |
| + If M is selected, the module will be called i915. AGP support |
| + is required for this driver to work. This driver is used by |
| + the Intel driver in X.org 6.8 and XFree86 4.4 and above. It |
| + replaces the older i830 module that supported a subset of the |
| + hardware in older X.org releases. |
| + |
| + Note that the older i810/i815 chipsets require the use of the |
| + i810 driver instead, and the Atom z5xx series has an entirely |
| + different implementation. |
| + |
| +config DRM_I915_KMS |
| + bool "Enable modesetting on intel by default" |
| + depends on DRM_I915 |
| + help |
| + Choose this option if you want kernel modesetting enabled by default, |
| + and you have a new enough userspace to support this. Running old |
| + userspaces with this enabled will cause pain. Note that this causes |
| + the driver to bind to PCI devices, which precludes loading things |
| + like intelfb. |
| + |
| +config DRM_I915_FBDEV |
| + bool "Enable legacy fbdev support for the modesettting intel driver" |
| + depends on DRM_I915 |
| + select DRM_KMS_FB_HELPER |
| + select FB_CFB_FILLRECT |
| + select FB_CFB_COPYAREA |
| + select FB_CFB_IMAGEBLIT |
| + default y |
| + help |
| + Choose this option if you have a need for the legacy fbdev |
| + support. Note that this support also provide the linux console |
| + support on top of the intel modesetting driver. |
| + |
| +config DRM_I915_PRELIMINARY_HW_SUPPORT |
| + bool "Enable preliminary support for prerelease Intel hardware by default" |
| + depends on DRM_I915 |
| + help |
| + Choose this option if you have prerelease Intel hardware and want the |
| + i915 driver to support it by default. You can enable such support at |
| + runtime with the module option i915.preliminary_hw_support=1; this |
| + option changes the default for that module option. |
| + |
| + If in doubt, say "N". |
| --- a/drivers/gpu/drm/i915/Makefile |
| +++ b/drivers/gpu/drm/i915/Makefile |
| @@ -33,7 +33,6 @@ i915-y := i915_drv.o i915_dma.o i915_irq |
| intel_panel.o \ |
| intel_pm.o \ |
| intel_i2c.o \ |
| - intel_fb.o \ |
| intel_tv.o \ |
| intel_dvo.o \ |
| intel_ringbuffer.o \ |
| @@ -54,6 +53,8 @@ i915-$(CONFIG_COMPAT) += i915_ioc32.o |
| |
| i915-$(CONFIG_ACPI) += intel_acpi.o |
| |
| +i915-$(CONFIG_DRM_I915_FBDEV) += intel_fb.o |
| + |
| obj-$(CONFIG_DRM_I915) += i915.o |
| |
| CFLAGS_i915_trace_points.o := -I$(src) |
| --- a/drivers/gpu/drm/i915/i915_debugfs.c |
| +++ b/drivers/gpu/drm/i915/i915_debugfs.c |
| @@ -1403,12 +1403,12 @@ static int i915_gem_framebuffer_info(str |
| { |
| struct drm_info_node *node = (struct drm_info_node *) m->private; |
| struct drm_device *dev = node->minor->dev; |
| - drm_i915_private_t *dev_priv = dev->dev_private; |
| - struct intel_fbdev *ifbdev; |
| + struct intel_fbdev *ifbdev = NULL; |
| struct intel_framebuffer *fb; |
| - int ret; |
| |
| - ret = mutex_lock_interruptible(&dev->mode_config.mutex); |
| +#ifdef CONFIG_DRM_I915_FBDEV |
| + struct drm_i915_private *dev_priv = dev->dev_private; |
| + int ret = mutex_lock_interruptible(&dev->mode_config.mutex); |
| if (ret) |
| return ret; |
| |
| @@ -1424,6 +1424,7 @@ static int i915_gem_framebuffer_info(str |
| describe_obj(m, fb->obj); |
| seq_putc(m, '\n'); |
| mutex_unlock(&dev->mode_config.mutex); |
| +#endif |
| |
| mutex_lock(&dev->mode_config.fb_lock); |
| list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) { |
| --- a/drivers/gpu/drm/i915/i915_dma.c |
| +++ b/drivers/gpu/drm/i915/i915_dma.c |
| @@ -1424,6 +1424,7 @@ void i915_master_destroy(struct drm_devi |
| master->driver_priv = NULL; |
| } |
| |
| +#ifdef CONFIG_DRM_I915_FBDEV |
| static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
| { |
| struct apertures_struct *ap; |
| @@ -1444,6 +1445,11 @@ static void i915_kick_out_firmware_fb(st |
| |
| kfree(ap); |
| } |
| +#else |
| +static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
| +{ |
| +} |
| +#endif |
| |
| static void i915_dump_device_info(struct drm_i915_private *dev_priv) |
| { |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1368,8 +1368,10 @@ typedef struct drm_i915_private { |
| |
| struct drm_i915_gem_object *vlv_pctx; |
| |
| +#ifdef CONFIG_DRM_I915_FBDEV |
| /* list of fbdev register on this device */ |
| struct intel_fbdev *fbdev; |
| +#endif |
| |
| /* |
| * The console may be contended at resume, but we don't |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -7335,6 +7335,7 @@ static struct drm_framebuffer * |
| mode_fits_in_fbdev(struct drm_device *dev, |
| struct drm_display_mode *mode) |
| { |
| +#ifdef CONFIG_DRM_I915_FBDEV |
| struct drm_i915_private *dev_priv = dev->dev_private; |
| struct drm_i915_gem_object *obj; |
| struct drm_framebuffer *fb; |
| @@ -7355,6 +7356,9 @@ mode_fits_in_fbdev(struct drm_device *de |
| return NULL; |
| |
| return fb; |
| +#else |
| + return NULL; |
| +#endif |
| } |
| |
| bool intel_get_load_detect_pipe(struct drm_connector *connector, |
| @@ -10101,6 +10105,12 @@ intel_user_framebuffer_create(struct drm |
| return intel_framebuffer_create(dev, mode_cmd, obj); |
| } |
| |
| +#ifndef CONFIG_DRM_I915_FBDEV |
| +static inline void intel_fb_output_poll_changed(struct drm_device *dev) |
| +{ |
| +} |
| +#endif |
| + |
| static const struct drm_mode_config_funcs intel_mode_funcs = { |
| .fb_create = intel_user_framebuffer_create, |
| .output_poll_changed = intel_fb_output_poll_changed, |
| --- a/drivers/gpu/drm/i915/intel_drv.h |
| +++ b/drivers/gpu/drm/i915/intel_drv.h |
| @@ -713,14 +713,36 @@ bool intel_dsi_init(struct drm_device *d |
| void intel_dvo_init(struct drm_device *dev); |
| |
| |
| -/* intel_fb.c */ |
| -int intel_fbdev_init(struct drm_device *dev); |
| -void intel_fbdev_initial_config(struct drm_device *dev); |
| -void intel_fbdev_fini(struct drm_device *dev); |
| -void intel_fbdev_set_suspend(struct drm_device *dev, int state); |
| -void intel_fb_output_poll_changed(struct drm_device *dev); |
| -void intel_fb_restore_mode(struct drm_device *dev); |
| +/* legacy fbdev emulation in intel_fb.c */ |
| +#ifdef CONFIG_DRM_I915_FBDEV |
| +extern int intel_fbdev_init(struct drm_device *dev); |
| +extern void intel_fbdev_initial_config(struct drm_device *dev); |
| +extern void intel_fbdev_fini(struct drm_device *dev); |
| +extern void intel_fbdev_set_suspend(struct drm_device *dev, int state); |
| +extern void intel_fb_output_poll_changed(struct drm_device *dev); |
| +extern void intel_fb_restore_mode(struct drm_device *dev); |
| +#else |
| +static inline int intel_fbdev_init(struct drm_device *dev) |
| +{ |
| + return 0; |
| +} |
| |
| +static inline void intel_fbdev_initial_config(struct drm_device *dev) |
| +{ |
| +} |
| + |
| +static inline void intel_fbdev_fini(struct drm_device *dev) |
| +{ |
| +} |
| + |
| +static inline void intel_fbdev_set_suspend(struct drm_device *dev, int state) |
| +{ |
| +} |
| + |
| +static inline void intel_fb_restore_mode(struct drm_device *dev) |
| +{ |
| +} |
| +#endif |
| |
| /* intel_hdmi.c */ |
| void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port); |