Re: [Intel-gfx] [PATCH 5/8] drm/i915: Wrap the preallocated BIOS framebuffer and preserve for KMS fbcon

2013-03-08 Thread Imre Deak
On Wed, 2013-02-06 at 11:10 +, Chris Wilson wrote:
> Signed-off-by: Chris Wilson 
> Signed-off-by: Jesse Barnes 
> ---
>  drivers/gpu/drm/i915/i915_dma.c  |8 +-
>  drivers/gpu/drm/i915/i915_drv.h  |2 +-
>  drivers/gpu/drm/i915/intel_display.c |   14 +-
>  drivers/gpu/drm/i915/intel_drv.h |4 +
>  drivers/gpu/drm/i915/intel_fb.c  |  305 
> +++---
>  5 files changed, 306 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> index 4fa6beb..f2b7db7 100644
> --- a/drivers/gpu/drm/i915/i915_dma.c
> +++ b/drivers/gpu/drm/i915/i915_dma.c
> @@ -1273,6 +1273,7 @@ static const struct vga_switcheroo_client_ops 
> i915_switcheroo_ops = {
>  static int i915_load_modeset_init(struct drm_device *dev)
>  {
>   struct drm_i915_private *dev_priv = dev->dev_private;
> + bool was_vga_enabled;
>   int ret;
>  
>   ret = intel_parse_bios(dev);
> @@ -1309,7 +1310,11 @@ static int i915_load_modeset_init(struct drm_device 
> *dev)
>  
>   /* Important: The output setup functions called by modeset_init need
>* working irqs for e.g. gmbus and dp aux transfers. */
> - intel_modeset_init(dev);
> + intel_modeset_init(dev, &was_vga_enabled);
> +
> + /* Wrap existing BIOS mode configuration prior to GEM takeover */
> + if (!was_vga_enabled)
> + intel_fbdev_init_bios(dev);
>  
>   ret = i915_gem_init(dev);
>   if (ret)
> @@ -1323,6 +1328,7 @@ static int i915_load_modeset_init(struct drm_device 
> *dev)
>   /* FIXME: do pre/post-mode set stuff in core KMS code */
>   dev->vblank_disable_allowed = 1;
>  
> + /* Install a default KMS/GEM fbcon if we failed to wrap the BIOS fb */
>   ret = intel_fbdev_init(dev);
>   if (ret)
>   goto cleanup_gem;
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index fd8a495..6f4afbf 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1814,7 +1814,7 @@ static inline void intel_unregister_dsm_handler(void) { 
> return; }
>  
>  /* modesetting */
>  extern void intel_modeset_init_hw(struct drm_device *dev);
> -extern void intel_modeset_init(struct drm_device *dev);
> +extern void intel_modeset_init(struct drm_device *dev, bool 
> *was_vga_enabled);
>  extern void intel_modeset_gem_init(struct drm_device *dev);
>  extern void intel_modeset_cleanup(struct drm_device *dev);
>  extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/drm/i915/intel_display.c
> index 8f9cdd7..7c4c7d5 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8698,12 +8698,17 @@ static void intel_init_quirks(struct drm_device *dev)
>  }
>  
>  /* Disable the VGA plane that we never use */
> -static void i915_disable_vga(struct drm_device *dev)
> +static bool i915_disable_vga(struct drm_device *dev)
>  {
>   struct drm_i915_private *dev_priv = dev->dev_private;
> + bool was_enabled;
>   u8 sr1;
>   u32 vga_reg = i915_vgacntrl_reg(dev);
>  
> + was_enabled = !(I915_READ(vga_reg) & VGA_DISP_DISABLE);
> + DRM_DEBUG_KMS("VGA output is currently %s\n",
> +   was_enabled ? "enabled" : "disabled");
> +
>   vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
>   outb(SR01, VGA_SR_INDEX);
>   sr1 = inb(VGA_SR_DATA);
> @@ -8713,6 +8718,8 @@ static void i915_disable_vga(struct drm_device *dev)
>  
>   I915_WRITE(vga_reg, VGA_DISP_DISABLE);
>   POSTING_READ(vga_reg);
> +
> + return was_enabled;
>  }
>  
>  void intel_modeset_init_hw(struct drm_device *dev)
> @@ -8728,7 +8735,8 @@ void intel_modeset_init_hw(struct drm_device *dev)
>   mutex_unlock(&dev->struct_mutex);
>  }
>  
> -void intel_modeset_init(struct drm_device *dev)
> +void intel_modeset_init(struct drm_device *dev,
> + bool *was_vga_enabled)
>  {
>   struct drm_i915_private *dev_priv = dev->dev_private;
>   int i, ret;
> @@ -8775,7 +8783,7 @@ void intel_modeset_init(struct drm_device *dev)
>   intel_pch_pll_init(dev);
>  
>   /* Just disable it once at startup */
> - i915_disable_vga(dev);
> + *was_vga_enabled = i915_disable_vga(dev);
>   intel_setup_outputs(dev);
>  
>   /* Just in case the BIOS is doing something questionable. */
> diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> b/drivers/gpu/drm/i915/intel_drv.h
> index 07d95a1..985e9dd 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -146,6 +146,8 @@ struct intel_fbdev {
>   struct intel_framebuffer ifb;
>   struct list_head fbdev_list;
>   struct drm_display_mode *our_mode;
> + bool stolen;
> + int preferred_bpp;
>  };
>  
>  struct intel_encoder {
> @@ -212,6 +214,7 @@ struct intel_crtc {
>   enum plane plane;
>   enum 

[Intel-gfx] [PATCH 5/8] drm/i915: Wrap the preallocated BIOS framebuffer and preserve for KMS fbcon

2013-02-06 Thread Chris Wilson
Signed-off-by: Chris Wilson 
Signed-off-by: Jesse Barnes 
---
 drivers/gpu/drm/i915/i915_dma.c  |8 +-
 drivers/gpu/drm/i915/i915_drv.h  |2 +-
 drivers/gpu/drm/i915/intel_display.c |   14 +-
 drivers/gpu/drm/i915/intel_drv.h |4 +
 drivers/gpu/drm/i915/intel_fb.c  |  305 +++---
 5 files changed, 306 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 4fa6beb..f2b7db7 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1273,6 +1273,7 @@ static const struct vga_switcheroo_client_ops 
i915_switcheroo_ops = {
 static int i915_load_modeset_init(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev->dev_private;
+   bool was_vga_enabled;
int ret;
 
ret = intel_parse_bios(dev);
@@ -1309,7 +1310,11 @@ static int i915_load_modeset_init(struct drm_device *dev)
 
/* Important: The output setup functions called by modeset_init need
 * working irqs for e.g. gmbus and dp aux transfers. */
-   intel_modeset_init(dev);
+   intel_modeset_init(dev, &was_vga_enabled);
+
+   /* Wrap existing BIOS mode configuration prior to GEM takeover */
+   if (!was_vga_enabled)
+   intel_fbdev_init_bios(dev);
 
ret = i915_gem_init(dev);
if (ret)
@@ -1323,6 +1328,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
/* FIXME: do pre/post-mode set stuff in core KMS code */
dev->vblank_disable_allowed = 1;
 
+   /* Install a default KMS/GEM fbcon if we failed to wrap the BIOS fb */
ret = intel_fbdev_init(dev);
if (ret)
goto cleanup_gem;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index fd8a495..6f4afbf 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1814,7 +1814,7 @@ static inline void intel_unregister_dsm_handler(void) { 
return; }
 
 /* modesetting */
 extern void intel_modeset_init_hw(struct drm_device *dev);
-extern void intel_modeset_init(struct drm_device *dev);
+extern void intel_modeset_init(struct drm_device *dev, bool *was_vga_enabled);
 extern void intel_modeset_gem_init(struct drm_device *dev);
 extern void intel_modeset_cleanup(struct drm_device *dev);
 extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 8f9cdd7..7c4c7d5 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -8698,12 +8698,17 @@ static void intel_init_quirks(struct drm_device *dev)
 }
 
 /* Disable the VGA plane that we never use */
-static void i915_disable_vga(struct drm_device *dev)
+static bool i915_disable_vga(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev->dev_private;
+   bool was_enabled;
u8 sr1;
u32 vga_reg = i915_vgacntrl_reg(dev);
 
+   was_enabled = !(I915_READ(vga_reg) & VGA_DISP_DISABLE);
+   DRM_DEBUG_KMS("VGA output is currently %s\n",
+ was_enabled ? "enabled" : "disabled");
+
vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
outb(SR01, VGA_SR_INDEX);
sr1 = inb(VGA_SR_DATA);
@@ -8713,6 +8718,8 @@ static void i915_disable_vga(struct drm_device *dev)
 
I915_WRITE(vga_reg, VGA_DISP_DISABLE);
POSTING_READ(vga_reg);
+
+   return was_enabled;
 }
 
 void intel_modeset_init_hw(struct drm_device *dev)
@@ -8728,7 +8735,8 @@ void intel_modeset_init_hw(struct drm_device *dev)
mutex_unlock(&dev->struct_mutex);
 }
 
-void intel_modeset_init(struct drm_device *dev)
+void intel_modeset_init(struct drm_device *dev,
+   bool *was_vga_enabled)
 {
struct drm_i915_private *dev_priv = dev->dev_private;
int i, ret;
@@ -8775,7 +8783,7 @@ void intel_modeset_init(struct drm_device *dev)
intel_pch_pll_init(dev);
 
/* Just disable it once at startup */
-   i915_disable_vga(dev);
+   *was_vga_enabled = i915_disable_vga(dev);
intel_setup_outputs(dev);
 
/* Just in case the BIOS is doing something questionable. */
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 07d95a1..985e9dd 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -146,6 +146,8 @@ struct intel_fbdev {
struct intel_framebuffer ifb;
struct list_head fbdev_list;
struct drm_display_mode *our_mode;
+   bool stolen;
+   int preferred_bpp;
 };
 
 struct intel_encoder {
@@ -212,6 +214,7 @@ struct intel_crtc {
enum plane plane;
enum transcoder cpu_transcoder;
u8 lut_r[256], lut_g[256], lut_b[256];
+   bool mode_valid;
/*
 * Whether the crtc and the connected output pipeline is active. Implies
 * that crtc->enabled is