Merge branch 'drm-next-4.14' of git://people.freedesktop.org/~agd5f/linux into drm...
authorDave Airlie <airlied@redhat.com>
Wed, 2 Aug 2017 02:43:12 +0000 (12:43 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 2 Aug 2017 02:43:12 +0000 (12:43 +1000)
- Stop reprogramming the MC, the vbios already does this in asic_init
- Reduce internal gart to 256M (this does not affect the ttm GTT pool size)
- Initial support for huge pages
- Rework bo migration logic
- Lots of improvements for vega10
- Powerplay fixes
- Additional Raven enablement
- SR-IOV improvements
- Bug fixes
- Code cleanup

* 'drm-next-4.14' of git://people.freedesktop.org/~agd5f/linux: (138 commits)
  drm/amdgpu: fix header on gfx9 clear state
  drm/amdgpu: reduce the time of reading VBIOS
  drm/amdgpu/virtual_dce: Remove the rmmod error message
  drm/amdgpu/gmc9: disable legacy vga features in gmc init
  drm/amdgpu/gmc8: disable legacy vga features in gmc init
  drm/amdgpu/gmc7: disable legacy vga features in gmc init
  drm/amdgpu/gmc6: disable legacy vga features in gmc init (v2)
  drm/radeon: Set depth on low mem to 16 bpp instead of 8 bpp
  drm/amdgpu: fix the incorrect scratch reg number on gfx v6
  drm/amdgpu: fix the incorrect scratch reg number on gfx v7
  drm/amdgpu: fix the incorrect scratch reg number on gfx v8
  drm/amdgpu: fix the incorrect scratch reg number on gfx v9
  drm/amd/powerplay: add support for 3DP 4K@120Hz on vega10.
  drm/amdgpu: enable huge page handling in the VM v5
  drm/amdgpu: increase fragmentation size for Vega10 v2
  drm/amdgpu: ttm_bind only when user needs gpu_addr in bo pin
  drm/amdgpu: correct clock info for SRIOV
  drm/amdgpu/gmc8: SRIOV need to program fb location
  drm/amdgpu: disable firmware loading for psp v10
  drm/amdgpu:fix gfx fence allocate size
  ...

1  2 
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/radeon/radeon_fb.c
drivers/gpu/drm/radeon/radeon_irq_kms.c

index 4a8fc15467cf8c40ed268f190a01acd4f506fed0,15f55865fcfbec077369035e897473838830e691..6279956e92a4175759280a76741de3656ef127f7
@@@ -53,6 -53,9 +53,9 @@@
  #include "bif/bif_4_1_d.h"
  #include <linux/pci.h>
  #include <linux/firmware.h>
+ #include "amdgpu_vf_error.h"
+ #include "amdgpu_amdkfd.h"
  
  MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
  MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");
@@@ -128,6 -131,10 +131,10 @@@ void amdgpu_mm_wreg(struct amdgpu_devic
  {
        trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
  
+       if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
+               adev->last_mm_index = v;
+       }
        if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev)) {
                BUG_ON(in_interrupt());
                return amdgpu_virt_kiq_wreg(adev, reg, v);
                writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
                spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
        }
+       if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
+               udelay(500);
+       }
  }
  
  u32 amdgpu_io_rreg(struct amdgpu_device *adev, u32 reg)
  
  void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
  {
+       if (adev->asic_type >= CHIP_VEGA10 && reg == 0) {
+               adev->last_mm_index = v;
+       }
  
        if ((reg * 4) < adev->rio_mem_size)
                iowrite32(v, adev->rio_mem + (reg * 4));
                iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));
                iowrite32(v, adev->rio_mem + (mmMM_DATA * 4));
        }
+       if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) {
+               udelay(500);
+       }
  }
  
  /**
@@@ -584,6 -602,21 +602,21 @@@ int amdgpu_wb_get_64bit(struct amdgpu_d
        }
  }
  
+ int amdgpu_wb_get_256Bit(struct amdgpu_device *adev, u32 *wb)
+ {
+       int i = 0;
+       unsigned long offset = bitmap_find_next_zero_area_off(adev->wb.used,
+                               adev->wb.num_wb, 0, 8, 63, 0);
+       if ((offset + 7) < adev->wb.num_wb) {
+               for (i = 0; i < 8; i++)
+                       __set_bit(offset + i, adev->wb.used);
+               *wb = offset;
+               return 0;
+       } else {
+               return -EINVAL;
+       }
+ }
  /**
   * amdgpu_wb_free - Free a wb entry
   *
@@@ -614,6 -647,23 +647,23 @@@ void amdgpu_wb_free_64bit(struct amdgpu
        }
  }
  
+ /**
+  * amdgpu_wb_free_256bit - Free a wb entry
+  *
+  * @adev: amdgpu_device pointer
+  * @wb: wb index
+  *
+  * Free a wb slot allocated for use by the driver (all asics)
+  */
+ void amdgpu_wb_free_256bit(struct amdgpu_device *adev, u32 wb)
+ {
+       int i = 0;
+       if ((wb + 7) < adev->wb.num_wb)
+               for (i = 0; i < 8; i++)
+                       __clear_bit(wb + i, adev->wb.used);
+ }
  /**
   * amdgpu_vram_location - try to find VRAM location
   * @adev: amdgpu device structure holding all necessary informations
@@@ -665,7 -715,7 +715,7 @@@ void amdgpu_vram_location(struct amdgpu
  }
  
  /**
-  * amdgpu_gtt_location - try to find GTT location
+  * amdgpu_gart_location - try to find GTT location
   * @adev: amdgpu device structure holding all necessary informations
   * @mc: memory controller structure holding memory informations
   *
   *
   * FIXME: when reducing GTT size align new size on power of 2.
   */
- void amdgpu_gtt_location(struct amdgpu_device *adev, struct amdgpu_mc *mc)
+ void amdgpu_gart_location(struct amdgpu_device *adev, struct amdgpu_mc *mc)
  {
        u64 size_af, size_bf;
  
-       size_af = ((adev->mc.mc_mask - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
-       size_bf = mc->vram_start & ~mc->gtt_base_align;
+       size_af = adev->mc.mc_mask - mc->vram_end;
+       size_bf = mc->vram_start;
        if (size_bf > size_af) {
-               if (mc->gtt_size > size_bf) {
+               if (mc->gart_size > size_bf) {
                        dev_warn(adev->dev, "limiting GTT\n");
-                       mc->gtt_size = size_bf;
+                       mc->gart_size = size_bf;
                }
-               mc->gtt_start = 0;
+               mc->gart_start = 0;
        } else {
-               if (mc->gtt_size > size_af) {
+               if (mc->gart_size > size_af) {
                        dev_warn(adev->dev, "limiting GTT\n");
-                       mc->gtt_size = size_af;
+                       mc->gart_size = size_af;
                }
-               mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
+               mc->gart_start = mc->vram_end + 1;
        }
-       mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
+       mc->gart_end = mc->gart_start + mc->gart_size - 1;
        dev_info(adev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
-                       mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
+                       mc->gart_size >> 20, mc->gart_start, mc->gart_end);
  }
  
  /*
@@@ -720,7 -770,12 +770,12 @@@ bool amdgpu_need_post(struct amdgpu_dev
                adev->has_hw_reset = false;
                return true;
        }
-       /* then check MEM_SIZE, in case the crtcs are off */
+       /* bios scratch used on CIK+ */
+       if (adev->asic_type >= CHIP_BONAIRE)
+               return amdgpu_atombios_scratch_need_asic_init(adev);
+       /* check MEM_SIZE for older asics */
        reg = amdgpu_asic_get_config_memsize(adev);
  
        if ((reg != 0) && (reg != 0xffffffff))
@@@ -1031,19 -1086,6 +1086,6 @@@ static unsigned int amdgpu_vga_set_deco
                return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
  }
  
- /**
-  * amdgpu_check_pot_argument - check that argument is a power of two
-  *
-  * @arg: value to check
-  *
-  * Validates that a certain argument is a power of two (all asics).
-  * Returns true if argument is valid.
-  */
- static bool amdgpu_check_pot_argument(int arg)
- {
-       return (arg & (arg - 1)) == 0;
- }
  static void amdgpu_check_block_size(struct amdgpu_device *adev)
  {
        /* defines number of bits in page table versus page directory,
@@@ -1077,7 -1119,7 +1119,7 @@@ static void amdgpu_check_vm_size(struc
        if (amdgpu_vm_size == -1)
                return;
  
-       if (!amdgpu_check_pot_argument(amdgpu_vm_size)) {
+       if (!is_power_of_2(amdgpu_vm_size)) {
                dev_warn(adev->dev, "VM size (%d) must be a power of 2\n",
                         amdgpu_vm_size);
                goto def_value;
@@@ -1118,19 -1160,24 +1160,24 @@@ static void amdgpu_check_arguments(stru
                dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
                         amdgpu_sched_jobs);
                amdgpu_sched_jobs = 4;
-       } else if (!amdgpu_check_pot_argument(amdgpu_sched_jobs)){
+       } else if (!is_power_of_2(amdgpu_sched_jobs)){
                dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",
                         amdgpu_sched_jobs);
                amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
        }
  
-       if (amdgpu_gart_size != -1) {
+       if (amdgpu_gart_size < 32) {
+               /* gart size must be greater or equal to 32M */
+               dev_warn(adev->dev, "gart size (%d) too small\n",
+                        amdgpu_gart_size);
+               amdgpu_gart_size = 32;
+       }
+       if (amdgpu_gtt_size != -1 && amdgpu_gtt_size < 32) {
                /* gtt size must be greater or equal to 32M */
-               if (amdgpu_gart_size < 32) {
-                       dev_warn(adev->dev, "gart size (%d) too small\n",
-                                amdgpu_gart_size);
-                       amdgpu_gart_size = -1;
-               }
+               dev_warn(adev->dev, "gtt size (%d) too small\n",
+                                amdgpu_gtt_size);
+               amdgpu_gtt_size = -1;
        }
  
        amdgpu_check_vm_size(adev);
        amdgpu_check_block_size(adev);
  
        if (amdgpu_vram_page_split != -1 && (amdgpu_vram_page_split < 16 ||
-           !amdgpu_check_pot_argument(amdgpu_vram_page_split))) {
+           !is_power_of_2(amdgpu_vram_page_split))) {
                dev_warn(adev->dev, "invalid VRAM page split (%d)\n",
                         amdgpu_vram_page_split);
                amdgpu_vram_page_split = 1024;
@@@ -1162,12 -1209,16 +1209,12 @@@ static void amdgpu_switcheroo_set_state
                return;
  
        if (state == VGA_SWITCHEROO_ON) {
 -              unsigned d3_delay = dev->pdev->d3_delay;
 -
                pr_info("amdgpu: switched on\n");
                /* don't suspend or resume card normally */
                dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
  
                amdgpu_device_resume(dev, true, true);
  
 -              dev->pdev->d3_delay = d3_delay;
 -
                dev->switch_power_state = DRM_SWITCH_POWER_ON;
                drm_kms_helper_poll_enable(dev);
        } else {
@@@ -2019,7 -2070,7 +2066,7 @@@ int amdgpu_device_init(struct amdgpu_de
        adev->flags = flags;
        adev->asic_type = flags & AMD_ASIC_MASK;
        adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT;
-       adev->mc.gtt_size = 512 * 1024 * 1024;
+       adev->mc.gart_size = 512 * 1024 * 1024;
        adev->accel_working = false;
        adev->num_rings = 0;
        adev->mman.buffer_funcs = NULL;
        spin_lock_init(&adev->uvd_ctx_idx_lock);
        spin_lock_init(&adev->didt_idx_lock);
        spin_lock_init(&adev->gc_cac_idx_lock);
+       spin_lock_init(&adev->se_cac_idx_lock);
        spin_lock_init(&adev->audio_endpt_idx_lock);
        spin_lock_init(&adev->mm_stats.lock);
  
        r = amdgpu_atombios_init(adev);
        if (r) {
                dev_err(adev->dev, "amdgpu_atombios_init failed\n");
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
                goto failed;
        }
  
        if (amdgpu_vpost_needed(adev)) {
                if (!adev->bios) {
                        dev_err(adev->dev, "no vBIOS found\n");
+                       amdgpu_vf_error_put(AMDGIM_ERROR_VF_NO_VBIOS, 0, 0);
                        r = -EINVAL;
                        goto failed;
                }
                r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
                if (r) {
                        dev_err(adev->dev, "gpu post error!\n");
+                       amdgpu_vf_error_put(AMDGIM_ERROR_VF_GPU_POST_ERROR, 0, 0);
                        goto failed;
                }
        } else {
                DRM_INFO("GPU post is not needed\n");
        }
  
-       if (!adev->is_atom_fw) {
+       if (adev->is_atom_fw) {
+               /* Initialize clocks */
+               r = amdgpu_atomfirmware_get_clock_info(adev);
+               if (r) {
+                       dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n");
+                       amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
+                       goto failed;
+               }
+       } else {
                /* Initialize clocks */
                r = amdgpu_atombios_get_clock_info(adev);
                if (r) {
                        dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n");
-                       return r;
+                       amdgpu_vf_error_put(AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0);
+                       goto failed;
                }
                /* init i2c buses */
                amdgpu_atombios_i2c_init(adev);
        r = amdgpu_fence_driver_init(adev);
        if (r) {
                dev_err(adev->dev, "amdgpu_fence_driver_init failed\n");
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_FENCE_INIT_FAIL, 0, 0);
                goto failed;
        }
  
        r = amdgpu_init(adev);
        if (r) {
                dev_err(adev->dev, "amdgpu_init failed\n");
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0);
                amdgpu_fini(adev);
                goto failed;
        }
        r = amdgpu_ib_pool_init(adev);
        if (r) {
                dev_err(adev->dev, "IB initialization failed (%d).\n", r);
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_IB_INIT_FAIL, 0, r);
                goto failed;
        }
  
        r = amdgpu_late_init(adev);
        if (r) {
                dev_err(adev->dev, "amdgpu_late_init failed\n");
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_AMDGPU_LATE_INIT_FAIL, 0, r);
                goto failed;
        }
  
        return 0;
  
  failed:
+       amdgpu_vf_error_trans_all(adev);
        if (runtime)
                vga_switcheroo_fini_domain_pm_ops(adev->dev);
        return r;
@@@ -2351,6 -2420,8 +2416,8 @@@ int amdgpu_device_suspend(struct drm_de
        }
        drm_modeset_unlock_all(dev);
  
+       amdgpu_amdkfd_suspend(adev);
        /* unpin the front buffers and cursors */
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
         */
        amdgpu_bo_evict_vram(adev);
  
-       if (adev->is_atom_fw)
-               amdgpu_atomfirmware_scratch_regs_save(adev);
-       else
-               amdgpu_atombios_scratch_regs_save(adev);
+       amdgpu_atombios_scratch_regs_save(adev);
        pci_save_state(dev->pdev);
        if (suspend) {
                /* Shut down the device */
@@@ -2444,10 -2512,7 +2508,7 @@@ int amdgpu_device_resume(struct drm_dev
                if (r)
                        goto unlock;
        }
-       if (adev->is_atom_fw)
-               amdgpu_atomfirmware_scratch_regs_restore(adev);
-       else
-               amdgpu_atombios_scratch_regs_restore(adev);
+       amdgpu_atombios_scratch_regs_restore(adev);
  
        /* post card */
        if (amdgpu_need_post(adev)) {
                        }
                }
        }
+       r = amdgpu_amdkfd_resume(adev);
+       if (r)
+               return r;
  
        /* blat the mode back in */
        if (fbcon) {
@@@ -2860,21 -2928,9 +2924,9 @@@ int amdgpu_gpu_reset(struct amdgpu_devi
                r = amdgpu_suspend(adev);
  
  retry:
-               /* Disable fb access */
-               if (adev->mode_info.num_crtc) {
-                       struct amdgpu_mode_mc_save save;
-                       amdgpu_display_stop_mc_access(adev, &save);
-                       amdgpu_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GMC);
-               }
-               if (adev->is_atom_fw)
-                       amdgpu_atomfirmware_scratch_regs_save(adev);
-               else
-                       amdgpu_atombios_scratch_regs_save(adev);
+               amdgpu_atombios_scratch_regs_save(adev);
                r = amdgpu_asic_reset(adev);
-               if (adev->is_atom_fw)
-                       amdgpu_atomfirmware_scratch_regs_restore(adev);
-               else
-                       amdgpu_atombios_scratch_regs_restore(adev);
+               amdgpu_atombios_scratch_regs_restore(adev);
                /* post card */
                amdgpu_atom_asic_init(adev->mode_info.atom_context);
  
@@@ -2952,6 -3008,7 +3004,7 @@@ out
                }
        } else {
                dev_err(adev->dev, "asic resume failed (%d).\n", r);
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_ASIC_RESUME_FAIL, 0, r);
                for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
                        if (adev->rings[i] && adev->rings[i]->sched.thread) {
                                kthread_unpark(adev->rings[i]->sched.thread);
        drm_helper_resume_force_mode(adev->ddev);
  
        ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
-       if (r)
+       if (r) {
                /* bad news, how to tell it to userspace ? */
                dev_info(adev->dev, "GPU reset failed\n");
-       else
+               amdgpu_vf_error_put(AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
+       }
+       else {
                dev_info(adev->dev, "GPU reset successed!\n");
+       }
  
+       amdgpu_vf_error_trans_all(adev);
        return r;
  }
  
index 46999247095390e382bbc23055b2ae618598a8fb,b3d7beb6806c21ecbc537fe98901bba6f9b50a99..aa53a860c9049f4b83beaf554125aec89f5ff97a
@@@ -74,7 -74,9 +74,9 @@@
  #define KMS_DRIVER_PATCHLEVEL 0
  
  int amdgpu_vram_limit = 0;
- int amdgpu_gart_size = -1; /* auto */
+ int amdgpu_vis_vram_limit = 0;
+ unsigned amdgpu_gart_size = 256;
+ int amdgpu_gtt_size = -1; /* auto */
  int amdgpu_moverate = -1; /* auto */
  int amdgpu_benchmarking = 0;
  int amdgpu_testing = 0;
@@@ -106,6 -108,7 +108,7 @@@ unsigned amdgpu_pcie_gen_cap = 0
  unsigned amdgpu_pcie_lane_cap = 0;
  unsigned amdgpu_cg_mask = 0xffffffff;
  unsigned amdgpu_pg_mask = 0xffffffff;
+ unsigned amdgpu_sdma_phase_quantum = 32;
  char *amdgpu_disable_cu = NULL;
  char *amdgpu_virtual_display = NULL;
  unsigned amdgpu_pp_feature_mask = 0xffffffff;
@@@ -120,8 -123,14 +123,14 @@@ int amdgpu_lbpw = -1
  MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
  module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
  
- MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc., -1 = auto)");
- module_param_named(gartsize, amdgpu_gart_size, int, 0600);
+ MODULE_PARM_DESC(vis_vramlimit, "Restrict visible VRAM for testing, in megabytes");
+ module_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444);
+ MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc.)");
+ module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
+ MODULE_PARM_DESC(gttsize, "Size of the GTT domain in megabytes (-1 = auto)");
+ module_param_named(gttsize, amdgpu_gtt_size, int, 0600);
  
  MODULE_PARM_DESC(moverate, "Maximum buffer migration rate in MB/s. (32, 64, etc., -1=auto, 0=1=disabled)");
  module_param_named(moverate, amdgpu_moverate, int, 0600);
@@@ -186,7 -195,7 +195,7 @@@ module_param_named(vm_debug, amdgpu_vm_
  MODULE_PARM_DESC(vm_update_mode, "VM update using CPU (0 = never (default except for large BAR(LB)), 1 = Graphics only, 2 = Compute only (default for LB), 3 = Both");
  module_param_named(vm_update_mode, amdgpu_vm_update_mode, int, 0444);
  
- MODULE_PARM_DESC(vram_page_split, "Number of pages after we split VRAM allocations (default 1024, -1 = disable)");
+ MODULE_PARM_DESC(vram_page_split, "Number of pages after we split VRAM allocations (default 512, -1 = disable)");
  module_param_named(vram_page_split, amdgpu_vram_page_split, int, 0444);
  
  MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))");
@@@ -199,7 -208,7 +208,7 @@@ MODULE_PARM_DESC(sched_hw_submission, "
  module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444);
  
  MODULE_PARM_DESC(ppfeaturemask, "all power features enabled (default))");
- module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, int, 0444);
+ module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, uint, 0444);
  
  MODULE_PARM_DESC(no_evict, "Support pinning request from user space (1 = enable, 0 = disable (default))");
  module_param_named(no_evict, amdgpu_no_evict, int, 0444);
@@@ -219,6 -228,9 +228,9 @@@ module_param_named(cg_mask, amdgpu_cg_m
  MODULE_PARM_DESC(pg_mask, "Powergating flags mask (0 = disable power gating)");
  module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
  
+ MODULE_PARM_DESC(sdma_phase_quantum, "SDMA context switch phase quantum (x 1K GPU clock cycles, 0 = no change (default 32))");
+ module_param_named(sdma_phase_quantum, amdgpu_sdma_phase_quantum, uint, 0444);
  MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
  module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
  
@@@ -803,6 -815,7 +815,6 @@@ static struct drm_driver kms_driver = 
        .open = amdgpu_driver_open_kms,
        .postclose = amdgpu_driver_postclose_kms,
        .lastclose = amdgpu_driver_lastclose_kms,
 -      .set_busid = drm_pci_set_busid,
        .unload = amdgpu_driver_unload_kms,
        .get_vblank_counter = amdgpu_get_vblank_counter_kms,
        .enable_vblank = amdgpu_enable_vblank_kms,
index 2480273c1dcacc0e60ffab5ee42be3daac0cc409,a28f8aad2035aa3368ea97e4ce8eb837909399fa..4bdd851f56d081310614f27dce5093255ecf7dfd
@@@ -220,6 -220,10 +220,10 @@@ int amdgpu_irq_init(struct amdgpu_devic
        int r = 0;
  
        spin_lock_init(&adev->irq.lock);
+       /* Disable vblank irqs aggressively for power-saving */
+       adev->ddev->vblank_disable_immediate = true;
        r = drm_vblank_init(adev->ddev, adev->mode_info.num_crtc);
        if (r) {
                return r;
@@@ -263,6 -267,7 +267,6 @@@ void amdgpu_irq_fini(struct amdgpu_devi
  {
        unsigned i, j;
  
 -      drm_vblank_cleanup(adev->ddev);
        if (adev->irq.installed) {
                drm_irq_uninstall(adev->ddev);
                adev->irq.installed = false;
index aff1f48c947eb7e843895f2509fc5c597304ade1,16915a92672b5bdf8655861699ac915b3b256c77..4b6e2f7bfec9feae37991ba7c6e46712bdecbe5c
@@@ -484,134 -484,6 +484,6 @@@ static bool dce_v10_0_is_display_hung(s
        return true;
  }
  
- static void dce_v10_0_stop_mc_access(struct amdgpu_device *adev,
-                                    struct amdgpu_mode_mc_save *save)
- {
-       u32 crtc_enabled, tmp;
-       int i;
-       save->vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
-       save->vga_hdp_control = RREG32(mmVGA_HDP_CONTROL);
-       /* disable VGA render */
-       tmp = RREG32(mmVGA_RENDER_CONTROL);
-       tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
-       WREG32(mmVGA_RENDER_CONTROL, tmp);
-       /* blank the display controllers */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
-                                            CRTC_CONTROL, CRTC_MASTER_EN);
-               if (crtc_enabled) {
- #if 0
-                       u32 frame_count;
-                       int j;
-                       save->crtc_enabled[i] = true;
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN) == 0) {
-                               amdgpu_display_vblank_wait(adev, i);
-                               WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                               tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 1);
-                               WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                               WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       }
-                       /* wait for the next frame */
-                       frame_count = amdgpu_display_vblank_get_counter(adev, i);
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               if (amdgpu_display_vblank_get_counter(adev, i) != frame_count)
-                                       break;
-                               udelay(1);
-                       }
-                       tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK) == 0) {
-                               tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 1);
-                               WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmMASTER_UPDATE_LOCK + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK) == 0) {
-                               tmp = REG_SET_FIELD(tmp, MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK, 1);
-                               WREG32(mmMASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
-                       }
- #else
-                       /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                       tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
-                       tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
-                       WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       save->crtc_enabled[i] = false;
-                       /* ***** */
- #endif
-               } else {
-                       save->crtc_enabled[i] = false;
-               }
-       }
- }
- static void dce_v10_0_resume_mc_access(struct amdgpu_device *adev,
-                                      struct amdgpu_mode_mc_save *save)
- {
-       u32 tmp, frame_count;
-       int i, j;
-       /* update crtc base addresses */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
-               WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
-               if (save->crtc_enabled[i]) {
-                       tmp = RREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, MASTER_UPDATE_MODE, MASTER_UPDATE_MODE) != 0) {
-                               tmp = REG_SET_FIELD(tmp, MASTER_UPDATE_MODE, MASTER_UPDATE_MODE, 0);
-                               WREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK)) {
-                               tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 0);
-                               WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmMASTER_UPDATE_LOCK + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK)) {
-                               tmp = REG_SET_FIELD(tmp, MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK, 0);
-                               WREG32(mmMASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
-                       }
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                               if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_SURFACE_UPDATE_PENDING) == 0)
-                                       break;
-                               udelay(1);
-                       }
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 0);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                       WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       /* wait for the next frame */
-                       frame_count = amdgpu_display_vblank_get_counter(adev, i);
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               if (amdgpu_display_vblank_get_counter(adev, i) != frame_count)
-                                       break;
-                               udelay(1);
-                       }
-               }
-       }
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(adev->mc.vram_start));
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS, lower_32_bits(adev->mc.vram_start));
-       /* Unlock vga access */
-       WREG32(mmVGA_HDP_CONTROL, save->vga_hdp_control);
-       mdelay(1);
-       WREG32(mmVGA_RENDER_CONTROL, save->vga_render_control);
- }
  static void dce_v10_0_set_vga_render_state(struct amdgpu_device *adev,
                                           bool render)
  {
@@@ -1867,7 -1739,7 +1739,7 @@@ static void dce_v10_0_afmt_setmode(stru
        dce_v10_0_audio_write_sad_regs(encoder);
        dce_v10_0_audio_write_latency_fields(encoder, mode);
  
 -      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
 +      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false);
        if (err < 0) {
                DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
                return;
@@@ -3025,6 -2897,8 +2897,8 @@@ static int dce_v10_0_hw_init(void *hand
  
        dce_v10_0_init_golden_registers(adev);
  
+       /* disable vga render */
+       dce_v10_0_set_vga_render_state(adev, false);
        /* init dig PHYs, disp eng pll */
        amdgpu_atombios_encoder_init_dig(adev);
        amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
@@@ -3737,7 -3611,6 +3611,6 @@@ static void dce_v10_0_encoder_add(struc
  }
  
  static const struct amdgpu_display_funcs dce_v10_0_display_funcs = {
-       .set_vga_render_state = &dce_v10_0_set_vga_render_state,
        .bandwidth_update = &dce_v10_0_bandwidth_update,
        .vblank_get_counter = &dce_v10_0_vblank_get_counter,
        .vblank_wait = &dce_v10_0_vblank_wait,
        .page_flip_get_scanoutpos = &dce_v10_0_crtc_get_scanoutpos,
        .add_encoder = &dce_v10_0_encoder_add,
        .add_connector = &amdgpu_connector_add,
-       .stop_mc_access = &dce_v10_0_stop_mc_access,
-       .resume_mc_access = &dce_v10_0_resume_mc_access,
  };
  
  static void dce_v10_0_set_display_funcs(struct amdgpu_device *adev)
index 2df650dfa727ed7b2a3465ceb5c74c38727e6d0a,6a43f25c5d96ba277e5f4a7fa719e4547ee7658c..6af489872ffd98e3ab5a21030bb975848bc68d0b
@@@ -499,79 -499,6 +499,6 @@@ static bool dce_v11_0_is_display_hung(s
        return true;
  }
  
- static void dce_v11_0_stop_mc_access(struct amdgpu_device *adev,
-                                    struct amdgpu_mode_mc_save *save)
- {
-       u32 crtc_enabled, tmp;
-       int i;
-       save->vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
-       save->vga_hdp_control = RREG32(mmVGA_HDP_CONTROL);
-       /* disable VGA render */
-       tmp = RREG32(mmVGA_RENDER_CONTROL);
-       tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
-       WREG32(mmVGA_RENDER_CONTROL, tmp);
-       /* blank the display controllers */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
-                                            CRTC_CONTROL, CRTC_MASTER_EN);
-               if (crtc_enabled) {
- #if 1
-                       save->crtc_enabled[i] = true;
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN) == 0) {
-                               /*it is correct only for RGB ; black is 0*/
-                               WREG32(mmCRTC_BLANK_DATA_COLOR + crtc_offsets[i], 0);
-                               tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 1);
-                               WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                       }
- #else
-                       /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                       tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
-                       tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
-                       WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       save->crtc_enabled[i] = false;
-                       /* ***** */
- #endif
-               } else {
-                       save->crtc_enabled[i] = false;
-               }
-       }
- }
- static void dce_v11_0_resume_mc_access(struct amdgpu_device *adev,
-                                      struct amdgpu_mode_mc_save *save)
- {
-       u32 tmp;
-       int i;
-       /* update crtc base addresses */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
-               if (save->crtc_enabled[i]) {
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 0);
-                       WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-               }
-       }
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(adev->mc.vram_start));
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS, lower_32_bits(adev->mc.vram_start));
-       /* Unlock vga access */
-       WREG32(mmVGA_HDP_CONTROL, save->vga_hdp_control);
-       mdelay(1);
-       WREG32(mmVGA_RENDER_CONTROL, save->vga_render_control);
- }
  static void dce_v11_0_set_vga_render_state(struct amdgpu_device *adev,
                                           bool render)
  {
@@@ -1851,7 -1778,7 +1778,7 @@@ static void dce_v11_0_afmt_setmode(stru
        dce_v11_0_audio_write_sad_regs(encoder);
        dce_v11_0_audio_write_latency_fields(encoder, mode);
  
 -      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
 +      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false);
        if (err < 0) {
                DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
                return;
@@@ -3086,6 -3013,8 +3013,8 @@@ static int dce_v11_0_hw_init(void *hand
  
        dce_v11_0_init_golden_registers(adev);
  
+       /* disable vga render */
+       dce_v11_0_set_vga_render_state(adev, false);
        /* init dig PHYs, disp eng pll */
        amdgpu_atombios_crtc_powergate_init(adev);
        amdgpu_atombios_encoder_init_dig(adev);
@@@ -3806,7 -3735,6 +3735,6 @@@ static void dce_v11_0_encoder_add(struc
  }
  
  static const struct amdgpu_display_funcs dce_v11_0_display_funcs = {
-       .set_vga_render_state = &dce_v11_0_set_vga_render_state,
        .bandwidth_update = &dce_v11_0_bandwidth_update,
        .vblank_get_counter = &dce_v11_0_vblank_get_counter,
        .vblank_wait = &dce_v11_0_vblank_wait,
        .page_flip_get_scanoutpos = &dce_v11_0_crtc_get_scanoutpos,
        .add_encoder = &dce_v11_0_encoder_add,
        .add_connector = &amdgpu_connector_add,
-       .stop_mc_access = &dce_v11_0_stop_mc_access,
-       .resume_mc_access = &dce_v11_0_resume_mc_access,
  };
  
  static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev)
index 0c3891fa62f1786ca21b8e37e766b56be0b319f4,48d5dd4974de80f5128945ef20931951ef9c8783..126c5e4e7733dcf73f8ea6107c3f990ca8e7b50a
@@@ -392,117 -392,6 +392,6 @@@ static u32 dce_v6_0_hpd_get_gpio_reg(st
        return mmDC_GPIO_HPD_A;
  }
  
- static u32 evergreen_get_vblank_counter(struct amdgpu_device* adev, int crtc)
- {
-       if (crtc >= adev->mode_info.num_crtc)
-               return 0;
-       else
-               return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
- }
- static void dce_v6_0_stop_mc_access(struct amdgpu_device *adev,
-                                   struct amdgpu_mode_mc_save *save)
- {
-       u32 crtc_enabled, tmp, frame_count;
-       int i, j;
-       save->vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
-       save->vga_hdp_control = RREG32(mmVGA_HDP_CONTROL);
-       /* disable VGA render */
-       WREG32(mmVGA_RENDER_CONTROL, 0);
-       /* blank the display controllers */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               crtc_enabled = RREG32(mmCRTC_CONTROL + crtc_offsets[i]) & CRTC_CONTROL__CRTC_MASTER_EN_MASK;
-               if (crtc_enabled) {
-                       save->crtc_enabled[i] = true;
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       if (!(tmp & CRTC_BLANK_CONTROL__CRTC_BLANK_DATA_EN_MASK)) {
-                               dce_v6_0_vblank_wait(adev, i);
-                               WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                               tmp |= CRTC_BLANK_CONTROL__CRTC_BLANK_DATA_EN_MASK;
-                               WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                               WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       }
-                       /* wait for the next frame */
-                       frame_count = evergreen_get_vblank_counter(adev, i);
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               if (evergreen_get_vblank_counter(adev, i) != frame_count)
-                                       break;
-                               udelay(1);
-                       }
-                       /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                       tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
-                       tmp &= ~CRTC_CONTROL__CRTC_MASTER_EN_MASK;
-                       WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       save->crtc_enabled[i] = false;
-                       /* ***** */
-               } else {
-                       save->crtc_enabled[i] = false;
-               }
-       }
- }
- static void dce_v6_0_resume_mc_access(struct amdgpu_device *adev,
-                                     struct amdgpu_mode_mc_save *save)
- {
-       u32 tmp;
-       int i, j;
-       /* update crtc base addresses */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
-               WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
-       }
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(adev->mc.vram_start));
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS, (u32)adev->mc.vram_start);
-       /* unlock regs and wait for update */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               if (save->crtc_enabled[i]) {
-                       tmp = RREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i]);
-                       if ((tmp & 0x7) != 0) {
-                               tmp &= ~0x7;
-                               WREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                       if (tmp & GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK) {
-                               tmp &= ~GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK;
-                               WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmMASTER_UPDATE_LOCK + crtc_offsets[i]);
-                       if (tmp & 1) {
-                               tmp &= ~1;
-                               WREG32(mmMASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
-                       }
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                               if ((tmp & GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK) == 0)
-                                       break;
-                               udelay(1);
-                       }
-               }
-       }
-       /* Unlock vga access */
-       WREG32(mmVGA_HDP_CONTROL, save->vga_hdp_control);
-       mdelay(1);
-       WREG32(mmVGA_RENDER_CONTROL, save->vga_render_control);
- }
  static void dce_v6_0_set_vga_render_state(struct amdgpu_device *adev,
                                          bool render)
  {
@@@ -1597,7 -1486,7 +1486,7 @@@ static void dce_v6_0_audio_set_avi_info
        ssize_t err;
        u32 tmp;
  
 -      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
 +      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false);
        if (err < 0) {
                DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
                return;
@@@ -2873,6 -2762,8 +2762,8 @@@ static int dce_v6_0_hw_init(void *handl
        int i;
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  
+       /* disable vga render */
+       dce_v6_0_set_vga_render_state(adev, false);
        /* init dig PHYs, disp eng pll */
        amdgpu_atombios_encoder_init_dig(adev);
        amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
@@@ -3525,7 -3416,6 +3416,6 @@@ static void dce_v6_0_encoder_add(struc
  }
  
  static const struct amdgpu_display_funcs dce_v6_0_display_funcs = {
-       .set_vga_render_state = &dce_v6_0_set_vga_render_state,
        .bandwidth_update = &dce_v6_0_bandwidth_update,
        .vblank_get_counter = &dce_v6_0_vblank_get_counter,
        .vblank_wait = &dce_v6_0_vblank_wait,
        .page_flip_get_scanoutpos = &dce_v6_0_crtc_get_scanoutpos,
        .add_encoder = &dce_v6_0_encoder_add,
        .add_connector = &amdgpu_connector_add,
-       .stop_mc_access = &dce_v6_0_stop_mc_access,
-       .resume_mc_access = &dce_v6_0_resume_mc_access,
  };
  
  static void dce_v6_0_set_display_funcs(struct amdgpu_device *adev)
index c164bef8284688fb52b5f0b8f79d1399367c3969,647a48f0357478e94a3bf1187041c3ceafc890a1..c0740adee46fe1ef3040621b5cbcce4808dcde85
@@@ -419,81 -419,6 +419,6 @@@ static bool dce_v8_0_is_display_hung(st
        return true;
  }
  
- static void dce_v8_0_stop_mc_access(struct amdgpu_device *adev,
-                                   struct amdgpu_mode_mc_save *save)
- {
-       u32 crtc_enabled, tmp;
-       int i;
-       save->vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
-       save->vga_hdp_control = RREG32(mmVGA_HDP_CONTROL);
-       /* disable VGA render */
-       tmp = RREG32(mmVGA_RENDER_CONTROL);
-       tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
-       WREG32(mmVGA_RENDER_CONTROL, tmp);
-       /* blank the display controllers */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
-                                            CRTC_CONTROL, CRTC_MASTER_EN);
-               if (crtc_enabled) {
- #if 1
-                       save->crtc_enabled[i] = true;
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN) == 0) {
-                               /*it is correct only for RGB ; black is 0*/
-                               WREG32(mmCRTC_BLANK_DATA_COLOR + crtc_offsets[i], 0);
-                               tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 1);
-                               WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                       }
-                       mdelay(20);
- #else
-                       /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
-                       tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
-                       tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
-                       WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       save->crtc_enabled[i] = false;
-                       /* ***** */
- #endif
-               } else {
-                       save->crtc_enabled[i] = false;
-               }
-       }
- }
- static void dce_v8_0_resume_mc_access(struct amdgpu_device *adev,
-                                     struct amdgpu_mode_mc_save *save)
- {
-       u32 tmp;
-       int i;
-       /* update crtc base addresses */
-       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
-               if (save->crtc_enabled[i]) {
-                       tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
-                       tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 0);
-                       WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-               }
-               mdelay(20);
-       }
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(adev->mc.vram_start));
-       WREG32(mmVGA_MEMORY_BASE_ADDRESS, lower_32_bits(adev->mc.vram_start));
-       /* Unlock vga access */
-       WREG32(mmVGA_HDP_CONTROL, save->vga_hdp_control);
-       mdelay(1);
-       WREG32(mmVGA_RENDER_CONTROL, save->vga_render_control);
- }
  static void dce_v8_0_set_vga_render_state(struct amdgpu_device *adev,
                                          bool render)
  {
@@@ -1750,7 -1675,7 +1675,7 @@@ static void dce_v8_0_afmt_setmode(struc
        dce_v8_0_audio_write_sad_regs(encoder);
        dce_v8_0_audio_write_latency_fields(encoder, mode);
  
 -      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
 +      err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false);
        if (err < 0) {
                DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
                return;
@@@ -2870,6 -2795,8 +2795,8 @@@ static int dce_v8_0_hw_init(void *handl
        int i;
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  
+       /* disable vga render */
+       dce_v8_0_set_vga_render_state(adev, false);
        /* init dig PHYs, disp eng pll */
        amdgpu_atombios_encoder_init_dig(adev);
        amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
@@@ -3574,7 -3501,6 +3501,6 @@@ static void dce_v8_0_encoder_add(struc
  }
  
  static const struct amdgpu_display_funcs dce_v8_0_display_funcs = {
-       .set_vga_render_state = &dce_v8_0_set_vga_render_state,
        .bandwidth_update = &dce_v8_0_bandwidth_update,
        .vblank_get_counter = &dce_v8_0_vblank_get_counter,
        .vblank_wait = &dce_v8_0_vblank_wait,
        .page_flip_get_scanoutpos = &dce_v8_0_crtc_get_scanoutpos,
        .add_encoder = &dce_v8_0_encoder_add,
        .add_connector = &amdgpu_connector_add,
-       .stop_mc_access = &dce_v8_0_stop_mc_access,
-       .resume_mc_access = &dce_v8_0_resume_mc_access,
  };
  
  static void dce_v8_0_set_display_funcs(struct amdgpu_device *adev)
index 602769ced3bd3a94e39640eaeff6b62f06107814,0def783889cd7b70da380565eb038b745228c112..42de22bbe14c89f472a2038ca28d15fc1130d117
@@@ -77,6 -77,13 +77,6 @@@ static bool is_pipe_enabled(struct devi
        return false;
  }
  
 -unsigned int get_mec_num(struct device_queue_manager *dqm)
 -{
 -      BUG_ON(!dqm || !dqm->dev);
 -
 -      return dqm->dev->shared_resources.num_mec;
 -}
 -
  unsigned int get_queues_num(struct device_queue_manager *dqm)
  {
        BUG_ON(!dqm || !dqm->dev);
@@@ -664,7 -671,7 +664,7 @@@ static int set_sched_resources(struct d
                /* This situation may be hit in the future if a new HW
                 * generation exposes more than 64 queues. If so, the
                 * definition of res.queue_mask needs updating */
-               if (WARN_ON(i > (sizeof(res.queue_mask)*8))) {
+               if (WARN_ON(i >= (sizeof(res.queue_mask)*8))) {
                        pr_err("Invalid queue enabled by amdgpu: %d\n", i);
                        break;
                }
index e141fcd5e8e136f481605dbe1bcbcb518f5c325e,b5f2642f124ba28cfb81359e638deede893b84c0..7fc63fecb8c1ea0d90d52766a2c00857aaf68e73
@@@ -264,6 -264,7 +264,6 @@@ static int radeonfb_create(struct drm_f
  
        drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
  
 -      info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
        info->fbops = &radeonfb_ops;
  
        tmp = radeon_bo_gpu_offset(rbo) - rdev->mc.vram_start;
@@@ -346,9 -347,12 +346,12 @@@ int radeon_fbdev_init(struct radeon_dev
        if (list_empty(&rdev->ddev->mode_config.connector_list))
                return 0;
  
-       /* select 8 bpp console on RN50 or 16MB cards */
-       if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32*1024*1024))
+       /* select 8 bpp console on 8MB cards, or 16 bpp on RN50 or 32MB */
+       if (rdev->mc.real_vram_size <= (8*1024*1024))
                bpp_sel = 8;
+       else if (ASIC_IS_RN50(rdev) ||
+                rdev->mc.real_vram_size <= (32*1024*1024))
+               bpp_sel = 16;
  
        rfbdev = kzalloc(sizeof(struct radeon_fbdev), GFP_KERNEL);
        if (!rfbdev)
index fff0d11b06001f91021a5f8ffc2ccaec95d9fee4,186076492f64e989470312f8140d894e21fa74b5..afaf10db47ccbc6a4325020a01853dadcce7b11f
@@@ -283,6 -283,10 +283,10 @@@ int radeon_irq_kms_init(struct radeon_d
        int r = 0;
  
        spin_lock_init(&rdev->irq.lock);
+       /* Disable vblank irqs aggressively for power-saving */
+       rdev->ddev->vblank_disable_immediate = true;
        r = drm_vblank_init(rdev->ddev, rdev->num_crtc);
        if (r) {
                return r;
   */
  void radeon_irq_kms_fini(struct radeon_device *rdev)
  {
 -      drm_vblank_cleanup(rdev->ddev);
        if (rdev->irq.installed) {
                drm_irq_uninstall(rdev->ddev);
                rdev->irq.installed = false;