Merge branch 'gma500-next' of git://github.com/patjak/drm-gma500 into drm-next
authorDave Airlie <airlied@redhat.com>
Wed, 17 Apr 2013 05:18:32 +0000 (15:18 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 17 Apr 2013 05:18:32 +0000 (15:18 +1000)
Patrik writes:

I haven't had much review or testing on other platforms than Poulsbo but
at least the following Cedarview bug has been squashed and no
regressions reported: https://bugs.freedesktop.org/show_bug.cgi?id=58527

* 'gma500-next' of git://github.com/patjak/drm-gma500:
  drm/gma500: Add debugging info to psb_gtt_restore()
  drm/gma500: Check connector status before restoring sdvo
  gma500:fix build failure for 3.9-rc5
  drm/gma500: Fix hibernation problems on sdvo encoders
  drm/gma500: Add hooks for hibernation
  drm/gma500: Activate the gtt rebuild on suspend/resume
  drm/gma500: Add support for rebuilding the gtt
  drm/gma500: Change fb name so pm-utils doesn't apply quirks
  gma500: Make VGA and HDMI connector hotpluggable
  drm/gma500: Clean up various defines
  drm/gma500: Remove unnecessary function exposure
  drm/gma500: Type clock limits directly into array and remove defines
  drm/gma500: Calculate clock in one function instead of three identical
  drm/gma500: Remove unused i8xx clock limits
  gma500: medfield: Fix possible NULL pointer dereference
  drivers: gpu: drm: gma500: Replaced calls kzalloc & memcpy with kmemdup
  gma500: remove unused drm_psb_no_fb

1  2 
drivers/gpu/drm/gma500/Kconfig
drivers/gpu/drm/gma500/gtt.c

index 1188f0fe7e4f0837d66f44f7194dfdfed4a3b3fd,92760ffad2e8ec0980a5efdd0285034867deb25e..1f6e2dfaaeaef7f557f4ad74ed45530dd28cd2c6
@@@ -1,11 -1,16 +1,16 @@@
  config DRM_GMA500
        tristate "Intel GMA5/600 KMS Framebuffer"
 -      depends on DRM && PCI && X86 && EXPERIMENTAL
 +      depends on DRM && PCI && X86
        select FB_CFB_COPYAREA
-         select FB_CFB_FILLRECT
-         select FB_CFB_IMAGEBLIT
-         select DRM_KMS_HELPER
-         select DRM_TTM
+       select FB_CFB_FILLRECT
+       select FB_CFB_IMAGEBLIT
+       select DRM_KMS_HELPER
+       select DRM_TTM
+       # GMA500 depends on ACPI_VIDEO when ACPI is enabled, just like i915
+       select ACPI_VIDEO if ACPI
+       select BACKLIGHT_CLASS_DEVICE if ACPI
+       select VIDEO_OUTPUT_CONTROL if ACPI
+       select INPUT if ACPI
        help
          Say yes for an experimental 2D KMS framebuffer driver for the
          Intel GMA500 ('Poulsbo') and other Intel IMG based graphics
index 054e26e769ec1b2eb7ecfff544e412cc2b6f70ed,01e32420388db5e6035eb44ae0f814c7976035f6..1f82183536a32014f0d73af7fea740489476ab35
@@@ -80,7 -80,8 +80,8 @@@ static u32 __iomem *psb_gtt_entry(struc
   *    the GTT. This is protected via the gtt mutex which the caller
   *    must hold.
   */
- static int psb_gtt_insert(struct drm_device *dev, struct gtt_range *r)
+ static int psb_gtt_insert(struct drm_device *dev, struct gtt_range *r,
+                         int resume)
  {
        u32 __iomem *gtt_slot;
        u32 pte;
        gtt_slot = psb_gtt_entry(dev, r);
        pages = r->pages;
  
-       /* Make sure changes are visible to the GPU */
-       set_pages_array_wc(pages, r->npage);
+       if (!resume) {
+               /* Make sure changes are visible to the GPU */
+               set_pages_array_wc(pages, r->npage);
+       }
  
        /* Write our page entries into the GTT itself */
        for (i = r->roll; i < r->npage; i++) {
@@@ -202,7 -205,7 +205,7 @@@ static int psb_gtt_attach_pages(struct 
        WARN_ON(gt->pages);
  
        /* This is the shared memory object that backs the GEM resource */
 -      inode = gt->gem.filp->f_path.dentry->d_inode;
 +      inode = file_inode(gt->gem.filp);
        mapping = inode->i_mapping;
  
        gt->pages = kmalloc(pages * sizeof(struct page *), GFP_KERNEL);
@@@ -269,7 -272,7 +272,7 @@@ int psb_gtt_pin(struct gtt_range *gt
                ret = psb_gtt_attach_pages(gt);
                if (ret < 0)
                        goto out;
-               ret = psb_gtt_insert(dev, gt);
+               ret = psb_gtt_insert(dev, gt, 0);
                if (ret < 0) {
                        psb_gtt_detach_pages(gt);
                        goto out;
@@@ -421,9 -424,11 +424,11 @@@ int psb_gtt_init(struct drm_device *dev
        int ret = 0;
        uint32_t pte;
  
-       mutex_init(&dev_priv->gtt_mutex);
+       if (!resume) {
+               mutex_init(&dev_priv->gtt_mutex);
+               psb_gtt_alloc(dev);
+       }
  
-       psb_gtt_alloc(dev);
        pg = &dev_priv->gtt;
  
        /* Enable the GTT */
        /*
         *      Map the GTT and the stolen memory area
         */
-       dev_priv->gtt_map = ioremap_nocache(pg->gtt_phys_start,
+       if (!resume)
+               dev_priv->gtt_map = ioremap_nocache(pg->gtt_phys_start,
                                                gtt_pages << PAGE_SHIFT);
        if (!dev_priv->gtt_map) {
                dev_err(dev->dev, "Failure to map gtt.\n");
                goto out_err;
        }
  
-       dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, stolen_size);
+       if (!resume)
+               dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base,
+                                                stolen_size);
        if (!dev_priv->vram_addr) {
                dev_err(dev->dev, "Failure to map stolen base.\n");
                ret = -ENOMEM;
@@@ -549,3 -557,31 +557,31 @@@ out_err
        psb_gtt_takedown(dev);
        return ret;
  }
+ int psb_gtt_restore(struct drm_device *dev)
+ {
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       struct resource *r = dev_priv->gtt_mem->child;
+       struct gtt_range *range;
+       unsigned int restored = 0, total = 0, size = 0;
+       /* On resume, the gtt_mutex is already initialized */
+       mutex_lock(&dev_priv->gtt_mutex);
+       psb_gtt_init(dev, 1);
+       while (r != NULL) {
+               range = container_of(r, struct gtt_range, resource);
+               if (range->pages) {
+                       psb_gtt_insert(dev, range, 1);
+                       size += range->resource.end - range->resource.start;
+                       restored++;
+               }
+               r = r->sibling;
+               total++;
+       }
+       mutex_unlock(&dev_priv->gtt_mutex);
+       DRM_DEBUG_DRIVER("Restored %u of %u gtt ranges (%u KB)", restored,
+                        total, (size / 1024));
+       return 0;
+ }