]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'drm-next-4.4' of git://people.freedesktop.org/~agd5f/linux into drm...
authorDave Airlie <airlied@redhat.com>
Thu, 29 Oct 2015 23:48:28 +0000 (09:48 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 29 Oct 2015 23:48:28 +0000 (09:48 +1000)
More amdgpu and radeon stuff for drm-next.  Stoney support is the big change.
The rest is just bug fixes and code cleanups.  The Stoney stuff is pretty
low impact with respect to existing chips.

* 'drm-next-4.4' of git://people.freedesktop.org/~agd5f/linux:
  drm/amdgpu: change VM size default to 64GB
  drm/amdgpu: add Stoney pci ids
  drm/amdgpu: update the core VI support for Stoney
  drm/amdgpu: add VCE support for Stoney (v2)
  drm/amdgpu: add UVD support for Stoney
  drm/amdgpu: add GFX support for Stoney (v2)
  drm/amdgpu: add SDMA support for Stoney (v2)
  drm/amdgpu: add DCE support for Stoney
  drm/amdgpu: Update SMC/DPM for Stoney
  drm/amdgpu: add GMC support for Stoney
  drm/amdgpu: add Stoney chip family
  drm/amdgpu: fix the broken vm->mutex V2
  drm/amdgpu: remove the unnecessary parameter adev for amdgpu_fence_wait_any()
  drm/amdgpu: remove the exclusive lock
  drm/amdgpu: remove old lockup detection infrastructure
  drm: fix trivial typos
  drm/amdgpu/dce: simplify suspend/resume
  drm/amdgpu/gfx8: set TC_WB_ACTION_EN in RELEASE_MEM packet
  drm/radeon: Use rdev->gem.mutex to protect hyperz/cmask owners

1  2 
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/cz_dpm.c
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
drivers/gpu/drm/amd/amdgpu/vi.c
drivers/gpu/drm/radeon/radeon_kms.c

index 3fa1397fd7ae4fa7879ac7039b26958d78db56c7,a9c0def6ce31f2ffb947e523be449717da6ba7db..5c400f4b87fdf5ea423489f87e3239fbb3c69585
@@@ -345,7 -345,6 +345,6 @@@ struct amdgpu_ring_funcs 
        /* testing functions */
        int (*test_ring)(struct amdgpu_ring *ring);
        int (*test_ib)(struct amdgpu_ring *ring);
-       bool (*is_lockup)(struct amdgpu_ring *ring);
        /* insert NOP packets */
        void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
  };
@@@ -448,8 -447,7 +447,7 @@@ int amdgpu_fence_wait_next(struct amdgp
  int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);
  unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring);
  
- signed long amdgpu_fence_wait_any(struct amdgpu_device *adev,
-                                 struct fence **array,
+ signed long amdgpu_fence_wait_any(struct fence **array,
                                  uint32_t count,
                                  bool intr,
                                  signed long t);
@@@ -907,8 -905,6 +905,6 @@@ struct amdgpu_ring 
        unsigned                ring_size;
        unsigned                ring_free_dw;
        int                     count_dw;
-       atomic_t                last_rptr;
-       atomic64_t              last_activity;
        uint64_t                gpu_addr;
        uint32_t                align_mask;
        uint32_t                ptr_mask;
@@@ -1230,8 -1226,6 +1226,6 @@@ void amdgpu_ring_commit(struct amdgpu_r
  void amdgpu_ring_unlock_commit(struct amdgpu_ring *ring);
  void amdgpu_ring_undo(struct amdgpu_ring *ring);
  void amdgpu_ring_unlock_undo(struct amdgpu_ring *ring);
- void amdgpu_ring_lockup_update(struct amdgpu_ring *ring);
- bool amdgpu_ring_test_lockup(struct amdgpu_ring *ring);
  unsigned amdgpu_ring_backup(struct amdgpu_ring *ring,
                            uint32_t **data);
  int amdgpu_ring_restore(struct amdgpu_ring *ring,
@@@ -1960,7 -1954,6 +1954,6 @@@ struct amdgpu_device 
        struct device                   *dev;
        struct drm_device               *ddev;
        struct pci_dev                  *pdev;
-       struct rw_semaphore             exclusive_lock;
  
        /* ASIC */
        enum amd_asic_type              asic_type;
        bool                            suspend;
        bool                            need_dma32;
        bool                            accel_working;
-       bool                            needs_reset;
        struct work_struct              reset_work;
        struct notifier_block           acpi_nb;
        struct amdgpu_i2c_chan          *i2c_bus[AMDGPU_MAX_I2C_BUS];
@@@ -2253,7 -2245,6 +2245,6 @@@ amdgpu_get_sdma_instance(struct amdgpu_
  #define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
  #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
  #define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r))
- #define amdgpu_ring_is_lockup(r) (r)->funcs->is_lockup((r))
  #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
  #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
  #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
@@@ -2362,10 -2353,10 +2353,10 @@@ void amdgpu_driver_preclose_kms(struct 
                                struct drm_file *file_priv);
  int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon);
  int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
 -u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, int crtc);
 -int amdgpu_enable_vblank_kms(struct drm_device *dev, int crtc);
 -void amdgpu_disable_vblank_kms(struct drm_device *dev, int crtc);
 -int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
 +u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
 +int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
 +void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
 +int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
                                    int *max_error,
                                    struct timeval *vblank_time,
                                    unsigned flags);
index baf00617fe906f8a505581cadec567503bf2ef15,8727c3099554b48bdea0dce69c9d4afaedfe340c..27ef52847e6dbd4ea3e0fbed40a42da6eb31bb8d
@@@ -157,8 -157,7 +157,8 @@@ int amdgpu_cs_parser_init(struct amdgpu
        uint64_t *chunk_array_user;
        uint64_t *chunk_array;
        struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
 -      unsigned size, i;
 +      unsigned size;
 +      int i;
        int ret;
  
        if (cs->in.num_chunks == 0)
  
        /* get chunks */
        INIT_LIST_HEAD(&p->validated);
 -      chunk_array_user = (uint64_t __user *)(cs->in.chunks);
 +      chunk_array_user = (uint64_t __user *)(unsigned long)(cs->in.chunks);
        if (copy_from_user(chunk_array, chunk_array_user,
                           sizeof(uint64_t)*cs->in.num_chunks)) {
                ret = -EFAULT;
                struct drm_amdgpu_cs_chunk user_chunk;
                uint32_t __user *cdata;
  
 -              chunk_ptr = (void __user *)chunk_array[i];
 +              chunk_ptr = (void __user *)(unsigned long)chunk_array[i];
                if (copy_from_user(&user_chunk, chunk_ptr,
                                       sizeof(struct drm_amdgpu_cs_chunk))) {
                        ret = -EFAULT;
                p->chunks[i].length_dw = user_chunk.length_dw;
  
                size = p->chunks[i].length_dw;
 -              cdata = (void __user *)user_chunk.chunk_data;
 +              cdata = (void __user *)(unsigned long)user_chunk.chunk_data;
                p->chunks[i].user_ptr = cdata;
  
                p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t));
@@@ -609,7 -608,6 +609,6 @@@ static int amdgpu_cs_ib_vm_chunk(struc
                }
        }
  
-       mutex_lock(&vm->mutex);
        r = amdgpu_bo_vm_update_pte(parser, vm);
        if (r) {
                goto out;
                                       parser->filp);
  
  out:
-       mutex_unlock(&vm->mutex);
        return r;
  }
  
@@@ -828,15 -825,14 +826,14 @@@ int amdgpu_cs_ioctl(struct drm_device *
  {
        struct amdgpu_device *adev = dev->dev_private;
        union drm_amdgpu_cs *cs = data;
+       struct amdgpu_fpriv *fpriv = filp->driver_priv;
+       struct amdgpu_vm *vm = &fpriv->vm;
        struct amdgpu_cs_parser *parser;
        bool reserved_buffers = false;
        int i, r;
  
-       down_read(&adev->exclusive_lock);
-       if (!adev->accel_working) {
-               up_read(&adev->exclusive_lock);
+       if (!adev->accel_working)
                return -EBUSY;
-       }
  
        parser = amdgpu_cs_parser_create(adev, filp, NULL, NULL, 0);
        if (!parser)
        r = amdgpu_cs_parser_init(parser, data);
        if (r) {
                DRM_ERROR("Failed to initialize parser !\n");
-               kfree(parser);
-               up_read(&adev->exclusive_lock);
+               amdgpu_cs_parser_fini(parser, r, false);
                r = amdgpu_cs_handle_lockup(adev, r);
                return r;
        }
+       mutex_lock(&vm->mutex);
        r = amdgpu_cs_parser_relocs(parser);
        if (r == -ENOMEM)
                DRM_ERROR("Not enough memory for command submission!\n");
  
                mutex_unlock(&job->job_lock);
                amdgpu_cs_parser_fini_late(parser);
-               up_read(&adev->exclusive_lock);
+               mutex_unlock(&vm->mutex);
                return 0;
        }
  
        cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence;
  out:
        amdgpu_cs_parser_fini(parser, r, reserved_buffers);
-       up_read(&adev->exclusive_lock);
+       mutex_unlock(&vm->mutex);
        r = amdgpu_cs_handle_lockup(adev, r);
        return r;
  }
index de116398fa4932f0c97f82450c63523b48b1ae68,fdf7525cf1206cd426b5f24c2abfda29e3e488a6..d747fca59669fe6ad95d5f45db6f4fcb8a6dbfb3
@@@ -47,11 -47,8 +47,8 @@@ static void amdgpu_flip_wait_fence(stru
        fence = to_amdgpu_fence(*f);
        if (fence) {
                r = fence_wait(&fence->base, false);
-               if (r == -EDEADLK) {
-                       up_read(&adev->exclusive_lock);
+               if (r == -EDEADLK)
                        r = amdgpu_gpu_reset(adev);
-                       down_read(&adev->exclusive_lock);
-               }
        } else
                r = fence_wait(*f, false);
  
@@@ -77,7 -74,6 +74,6 @@@ static void amdgpu_flip_work_func(struc
        unsigned long flags;
        unsigned i;
  
-       down_read(&adev->exclusive_lock);
        amdgpu_flip_wait_fence(adev, &work->excl);
        for (i = 0; i < work->shared_count; ++i)
                amdgpu_flip_wait_fence(adev, &work->shared[i]);
@@@ -93,7 -89,6 +89,6 @@@
        amdgpuCrtc->pflip_status = AMDGPU_FLIP_SUBMITTED;
  
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
-       up_read(&adev->exclusive_lock);
  }
  
  /*
@@@ -721,7 -716,7 +716,7 @@@ bool amdgpu_crtc_scaling_mode_fixup(str
   * an optional accurate timestamp of when query happened.
   *
   * \param dev Device to query.
 - * \param crtc Crtc to query.
 + * \param pipe Crtc to query.
   * \param flags Flags from caller (DRM_CALLED_FROM_VBLIRQ or 0).
   * \param *vpos Location where vertical scanout position should be stored.
   * \param *hpos Location where horizontal scanout position should go.
   * unknown small number of scanlines wrt. real scanout position.
   *
   */
 -int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, unsigned int flags,
 -                             int *vpos, int *hpos, ktime_t *stime, ktime_t *etime,
 +int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
 +                             unsigned int flags, int *vpos, int *hpos,
 +                             ktime_t *stime, ktime_t *etime,
                               const struct drm_display_mode *mode)
  {
        u32 vbl = 0, position = 0;
        if (stime)
                *stime = ktime_get();
  
 -      if (amdgpu_display_page_flip_get_scanoutpos(adev, crtc, &vbl, &position) == 0)
 +      if (amdgpu_display_page_flip_get_scanoutpos(adev, pipe, &vbl, &position) == 0)
                ret |= DRM_SCANOUTPOS_VALID;
  
        /* Get optional system timestamp after query. */
index ef58774b242c9e20009dc6d07b608dabeff69ae7,8d6668cedf6db769b7607ed99d487a7a3b6d4331..0508c5cd103aa125f4ab22ae50a9da3a35ae75fb
@@@ -73,7 -73,7 +73,7 @@@ int amdgpu_hard_reset = 0
  unsigned amdgpu_ip_block_mask = 0xffffffff;
  int amdgpu_bapm = -1;
  int amdgpu_deep_color = 0;
- int amdgpu_vm_size = 8;
+ int amdgpu_vm_size = 64;
  int amdgpu_vm_block_size = -1;
  int amdgpu_vm_fault_stop = 0;
  int amdgpu_vm_debug = 0;
@@@ -137,7 -137,7 +137,7 @@@ module_param_named(bapm, amdgpu_bapm, i
  MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))");
  module_param_named(deep_color, amdgpu_deep_color, int, 0444);
  
- MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 8GB)");
+ MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 64GB)");
  module_param_named(vm_size, amdgpu_vm_size, int, 0444);
  
  MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)");
@@@ -250,11 -250,11 +250,11 @@@ static struct pci_device_id pciidlist[
        {0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},
  #endif
        /* topaz */
 -      {0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
 -      {0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
 -      {0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
 -      {0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
 -      {0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},
 +      {0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT},
 +      {0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT},
 +      {0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT},
 +      {0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT},
 +      {0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT},
        /* tonga */
        {0x1002, 0x6920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
        {0x1002, 0x6921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},
        {0x1002, 0x9875, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
        {0x1002, 0x9876, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
        {0x1002, 0x9877, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
+       /* stoney */
+       {0x1002, 0x98E4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_STONEY|AMD_IS_APU},
  
        {0, 0, 0}
  };
index 644fd9b8591f2104ff1ed18c62de70f0ba543248,06e207fd007b501e9857726989143d33a49aa370..ff26e330ccd684b64616ed4bdb9d0ae36e93cfac
@@@ -90,11 -90,9 +90,9 @@@ struct amdgpu_bo_list_entry *amdgpu_vm_
        struct amdgpu_bo_list_entry *list;
        unsigned i, idx;
  
-       mutex_lock(&vm->mutex);
        list = drm_malloc_ab(vm->max_pde_used + 2,
                             sizeof(struct amdgpu_bo_list_entry));
        if (!list) {
-               mutex_unlock(&vm->mutex);
                return NULL;
        }
  
                list[idx].tv.shared = true;
                list_add(&list[idx++].tv.head, head);
        }
-       mutex_unlock(&vm->mutex);
  
        return list;
  }
@@@ -457,10 -454,8 +454,10 @@@ int amdgpu_vm_update_page_directory(str
                return -ENOMEM;
  
        r = amdgpu_ib_get(ring, NULL, ndw * 4, ib);
 -      if (r)
 +      if (r) {
 +              kfree(ib);
                return r;
 +      }
        ib->length_dw = 0;
  
        /* walk over the address space and update the page directory */
@@@ -972,9 -967,7 +969,7 @@@ struct amdgpu_bo_va *amdgpu_vm_bo_add(s
        INIT_LIST_HEAD(&bo_va->invalids);
        INIT_LIST_HEAD(&bo_va->vm_status);
  
-       mutex_lock(&vm->mutex);
        list_add_tail(&bo_va->bo_list, &bo->va);
-       mutex_unlock(&vm->mutex);
  
        return bo_va;
  }
@@@ -1027,8 -1020,6 +1022,6 @@@ int amdgpu_vm_bo_map(struct amdgpu_devi
                return -EINVAL;
        }
  
-       mutex_lock(&vm->mutex);
        saddr /= AMDGPU_GPU_PAGE_SIZE;
        eaddr /= AMDGPU_GPU_PAGE_SIZE;
  
                        tmp->it.start, tmp->it.last + 1);
                amdgpu_bo_unreserve(bo_va->bo);
                r = -EINVAL;
-               goto error_unlock;
+               goto error;
        }
  
        mapping = kmalloc(sizeof(*mapping), GFP_KERNEL);
        if (!mapping) {
                amdgpu_bo_unreserve(bo_va->bo);
                r = -ENOMEM;
-               goto error_unlock;
+               goto error;
        }
  
        INIT_LIST_HEAD(&mapping->list);
                if (vm->page_tables[pt_idx].bo)
                        continue;
  
-               /* drop mutex to allocate and clear page table */
-               mutex_unlock(&vm->mutex);
                ww_mutex_lock(&resv->lock, NULL);
                r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8,
                                     AMDGPU_GPU_PAGE_SIZE, true,
                        goto error_free;
                }
  
-               /* aquire mutex again */
-               mutex_lock(&vm->mutex);
-               if (vm->page_tables[pt_idx].bo) {
-                       /* someone else allocated the pt in the meantime */
-                       mutex_unlock(&vm->mutex);
-                       amdgpu_bo_unref(&pt);
-                       mutex_lock(&vm->mutex);
-                       continue;
-               }
                vm->page_tables[pt_idx].addr = 0;
                vm->page_tables[pt_idx].bo = pt;
        }
  
-       mutex_unlock(&vm->mutex);
        return 0;
  
  error_free:
-       mutex_lock(&vm->mutex);
        list_del(&mapping->list);
        interval_tree_remove(&mapping->it, &vm->va);
        trace_amdgpu_vm_bo_unmap(bo_va, mapping);
        kfree(mapping);
  
- error_unlock:
-       mutex_unlock(&vm->mutex);
+ error:
        return r;
  }
  
@@@ -1170,7 -1145,6 +1147,6 @@@ int amdgpu_vm_bo_unmap(struct amdgpu_de
                }
        }
  
-       mutex_lock(&vm->mutex);
        list_del(&mapping->list);
        interval_tree_remove(&mapping->it, &vm->va);
        trace_amdgpu_vm_bo_unmap(bo_va, mapping);
                list_add(&mapping->list, &vm->freed);
        else
                kfree(mapping);
-       mutex_unlock(&vm->mutex);
        amdgpu_bo_unreserve(bo_va->bo);
  
        return 0;
@@@ -1203,8 -1176,6 +1178,6 @@@ void amdgpu_vm_bo_rmv(struct amdgpu_dev
  
        list_del(&bo_va->bo_list);
  
-       mutex_lock(&vm->mutex);
        spin_lock(&vm->status_lock);
        list_del(&bo_va->vm_status);
        spin_unlock(&vm->status_lock);
  
        fence_put(bo_va->last_pt_update);
        kfree(bo_va);
-       mutex_unlock(&vm->mutex);
  }
  
  /**
index 2e3373ed4c942d9fc753851d50adb9a3034ebff8,6f244e94c5f614641837bc7e87e7bc27d697402b..8035d4d6a4f57f9ff880d8fe1895285734a9bb2b
@@@ -596,12 -596,6 +596,12 @@@ static int cz_dpm_late_init(void *handl
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  
        if (amdgpu_dpm) {
 +              int ret;
 +              /* init the sysfs and debugfs files late */
 +              ret = amdgpu_pm_sysfs_init(adev);
 +              if (ret)
 +                      return ret;
 +
                /* powerdown unused blocks for now */
                cz_dpm_powergate_uvd(adev, true);
                cz_dpm_powergate_vce(adev, true);
@@@ -638,6 -632,10 +638,6 @@@ static int cz_dpm_sw_init(void *handle
        if (amdgpu_dpm == 1)
                amdgpu_pm_print_power_states(adev);
  
 -      ret = amdgpu_pm_sysfs_init(adev);
 -      if (ret)
 -              goto dpm_init_failed;
 -
        mutex_unlock(&adev->pm.mutex);
        DRM_INFO("amdgpu: dpm initialized\n");
  
@@@ -1264,6 -1262,7 +1264,7 @@@ static void cz_apply_state_adjust_rules
  
  static int cz_dpm_enable(struct amdgpu_device *adev)
  {
+       const char *chip_name;
        int ret = 0;
  
        /* renable will hang up SMU, so check first */
  
        cz_program_voting_clients(adev);
  
+       switch (adev->asic_type) {
+       case CHIP_CARRIZO:
+               chip_name = "carrizo";
+               break;
+       case CHIP_STONEY:
+               chip_name = "stoney";
+               break;
+       default:
+               BUG();
+       }
        ret = cz_start_dpm(adev);
        if (ret) {
-               DRM_ERROR("Carrizo DPM enable failed\n");
+               DRM_ERROR("%s DPM enable failed\n", chip_name);
                return -EINVAL;
        }
  
        ret = cz_program_bootup_state(adev);
        if (ret) {
-               DRM_ERROR("Carrizo bootup state program failed\n");
+               DRM_ERROR("%s bootup state program failed\n", chip_name);
                return -EINVAL;
        }
  
        ret = cz_enable_didt(adev, true);
        if (ret) {
-               DRM_ERROR("Carrizo enable di/dt failed\n");
+               DRM_ERROR("%s enable di/dt failed\n", chip_name);
                return -EINVAL;
        }
  
@@@ -1353,7 -1364,7 +1366,7 @@@ static int cz_dpm_disable(struct amdgpu
  
        ret = cz_enable_didt(adev, false);
        if (ret) {
-               DRM_ERROR("Carrizo disable di/dt failed\n");
+               DRM_ERROR("disable di/dt failed\n");
                return -EINVAL;
        }
  
index 5be83a3f019210fa87ee3840d5c1eb74f6cc3dce,444d930b33170be7a457eb4ae9d91ce4b90bcb62..784afb5978acd154d5ac8ff20851826c10e49dc2
@@@ -126,6 -126,13 +126,13 @@@ static const u32 cz_mgcg_cgcg_init[] 
        mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
  };
  
+ static const u32 stoney_golden_settings_a11[] =
+ {
+       mmCRTC_DOUBLE_BUFFER_CONTROL, 0x00010101, 0x00010000,
+       mmFBC_MISC, 0x1f311fff, 0x14302000,
+ };
  static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
  {
        switch (adev->asic_type) {
                                                 cz_golden_settings_a11,
                                                 (const u32)ARRAY_SIZE(cz_golden_settings_a11));
                break;
+       case CHIP_STONEY:
+               amdgpu_program_register_sequence(adev,
+                                                stoney_golden_settings_a11,
+                                                (const u32)ARRAY_SIZE(stoney_golden_settings_a11));
+               break;
        default:
                break;
        }
@@@ -2425,7 -2437,7 +2437,7 @@@ static u32 dce_v11_0_pick_pll(struct dr
  
        /* XXX need to determine what plls are available on each DCE11 part */
        pll_in_use = amdgpu_pll_get_use_mask(crtc);
-       if (adev->asic_type == CHIP_CARRIZO) {
+       if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY) {
                if (!(pll_in_use & (1 << ATOM_PPLL1)))
                        return ATOM_PPLL1;
                if (!(pll_in_use & (1 << ATOM_PPLL0)))
@@@ -2926,10 -2938,15 +2938,15 @@@ static int dce_v11_0_early_init(void *h
  
        switch (adev->asic_type) {
        case CHIP_CARRIZO:
 -              adev->mode_info.num_crtc = 4;
 +              adev->mode_info.num_crtc = 3;
                adev->mode_info.num_hpd = 6;
                adev->mode_info.num_dig = 9;
                break;
+       case CHIP_STONEY:
+               adev->mode_info.num_crtc = 2;
+               adev->mode_info.num_hpd = 6;
+               adev->mode_info.num_dig = 9;
+               break;
        default:
                /* FIXME: not supported yet */
                return -EINVAL;
@@@ -3028,6 -3045,7 +3045,7 @@@ static int dce_v11_0_hw_init(void *hand
        dce_v11_0_init_golden_registers(adev);
  
        /* init dig PHYs, disp eng pll */
+       amdgpu_atombios_crtc_powergate_init(adev);
        amdgpu_atombios_encoder_init_dig(adev);
        amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
  
@@@ -3061,23 -3079,18 +3079,18 @@@ static int dce_v11_0_suspend(void *hand
  
        amdgpu_atombios_scratch_regs_save(adev);
  
-       dce_v11_0_hpd_fini(adev);
-       return 0;
+       return dce_v11_0_hw_fini(handle);
  }
  
  static int dce_v11_0_resume(void *handle)
  {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+       int ret;
  
-       dce_v11_0_init_golden_registers(adev);
+       ret = dce_v11_0_hw_init(handle);
  
        amdgpu_atombios_scratch_regs_restore(adev);
  
-       /* init dig PHYs, disp eng pll */
-       amdgpu_atombios_crtc_powergate_init(adev);
-       amdgpu_atombios_encoder_init_dig(adev);
-       amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
        /* turn on the BL */
        if (adev->mode_info.bl_encoder) {
                u8 bl_level = amdgpu_display_backlight_get_level(adev,
                                                    bl_level);
        }
  
-       /* initialize hpd */
-       dce_v11_0_hpd_init(adev);
-       return 0;
+       return ret;
  }
  
  static bool dce_v11_0_is_idle(void *handle)
index 0bac8702e9348c2ee9c86ed52d6aaf490ef5032f,9904761c9c37763a23c1dcd83128d63c9a329cfa..d8c93f14c3b58da6a193e5cfa80d93f0d7786d95
@@@ -232,6 -232,13 +232,13 @@@ static const u32 cz_mgcg_cgcg_init[] 
        mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
  };
  
+ static const u32 stoney_mgcg_cgcg_init[] =
+ {
+       mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00000100,
+       mmHDP_XDP_CGTT_BLK_CTRL, 0xffffffff, 0x00000104,
+       mmHDP_HOST_PATH_CNTL, 0xffffffff, 0x0f000027,
+ };
  static void vi_init_golden_registers(struct amdgpu_device *adev)
  {
        /* Some of the registers might be dependent on GRBM_GFX_INDEX */
                                                 cz_mgcg_cgcg_init,
                                                 (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init));
                break;
+       case CHIP_STONEY:
+               amdgpu_program_register_sequence(adev,
+                                                stoney_mgcg_cgcg_init,
+                                                (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init));
+               break;
        default:
                break;
        }
@@@ -488,6 -500,7 +500,7 @@@ static int vi_read_register(struct amdg
        case CHIP_FIJI:
        case CHIP_TONGA:
        case CHIP_CARRIZO:
+       case CHIP_STONEY:
                asic_register_table = cz_allowed_read_registers;
                size = ARRAY_SIZE(cz_allowed_read_registers);
                break;
@@@ -543,8 -556,10 +556,10 @@@ static void vi_print_gpu_status_regs(st
                RREG32(mmSRBM_STATUS2));
        dev_info(adev->dev, "  SDMA0_STATUS_REG   = 0x%08X\n",
                RREG32(mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
-       dev_info(adev->dev, "  SDMA1_STATUS_REG   = 0x%08X\n",
-                RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
+       if (adev->sdma.num_instances > 1) {
+               dev_info(adev->dev, "  SDMA1_STATUS_REG   = 0x%08X\n",
+                       RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
+       }
        dev_info(adev->dev, "  CP_STAT = 0x%08x\n", RREG32(mmCP_STAT));
        dev_info(adev->dev, "  CP_STALLED_STAT1 = 0x%08x\n",
                 RREG32(mmCP_STALLED_STAT1));
@@@ -639,9 -654,11 +654,11 @@@ u32 vi_gpu_check_soft_reset(struct amdg
                reset_mask |= AMDGPU_RESET_DMA;
  
        /* SDMA1_STATUS_REG */
-       tmp = RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
-       if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK))
-               reset_mask |= AMDGPU_RESET_DMA1;
+       if (adev->sdma.num_instances > 1) {
+               tmp = RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
+               if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK))
+                       reset_mask |= AMDGPU_RESET_DMA1;
+       }
  #if 0
        /* VCE_STATUS */
        if (adev->asic_type != CHIP_TOPAZ) {
@@@ -1005,9 -1022,6 +1022,9 @@@ static void vi_pcie_gen3_enable(struct 
        u32 mask;
        int ret;
  
 +      if (pci_is_root_bus(adev->pdev->bus))
 +              return;
 +
        if (amdgpu_pcie_gen2 == 0)
                return;
  
@@@ -1319,6 -1333,7 +1336,7 @@@ int vi_set_ip_blocks(struct amdgpu_devi
                adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks);
                break;
        case CHIP_CARRIZO:
+       case CHIP_STONEY:
                adev->ip_blocks = cz_ip_blocks;
                adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks);
                break;
        return 0;
  }
  
+ #define ATI_REV_ID_FUSE_MACRO__ADDRESS      0xC0014044
+ #define ATI_REV_ID_FUSE_MACRO__SHIFT        9
+ #define ATI_REV_ID_FUSE_MACRO__MASK         0x00001E00
  static uint32_t vi_get_rev_id(struct amdgpu_device *adev)
  {
        if (adev->asic_type == CHIP_TOPAZ)
                return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK)
                        >> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT;
+       else if (adev->flags & AMD_IS_APU)
+               return (RREG32_SMC(ATI_REV_ID_FUSE_MACRO__ADDRESS) & ATI_REV_ID_FUSE_MACRO__MASK)
+                       >> ATI_REV_ID_FUSE_MACRO__SHIFT;
        else
                return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
                        >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
@@@ -1401,6 -1423,7 +1426,7 @@@ static int vi_common_early_init(void *h
                        adev->firmware.smu_load = true;
                break;
        case CHIP_CARRIZO:
+       case CHIP_STONEY:
                adev->has_uvd = true;
                adev->cg_flags = 0;
                /* Disable UVD pg */
index 5f687c95a1e131e430b2ef2ee985fad3722ea5cb,0a68e8d711a1aa8de476a01ec3af1661be86492d..0ec6fcca16d3b12b898d8c9c036ab330cdc47226
@@@ -181,7 -181,9 +181,9 @@@ static void radeon_set_filp_rights(stru
                                   struct drm_file *applier,
                                   uint32_t *value)
  {
-       mutex_lock(&dev->struct_mutex);
+       struct radeon_device *rdev = dev->dev_private;
+       mutex_lock(&rdev->gem.mutex);
        if (*value == 1) {
                /* wants rights */
                if (!*owner)
                        *owner = NULL;
        }
        *value = *owner == applier ? 1 : 0;
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&rdev->gem.mutex);
  }
  
  /*
@@@ -598,7 -600,7 +600,7 @@@ static int radeon_info_ioctl(struct drm
   * Outdated mess for old drm with Xorg being in charge (void function now).
   */
  /**
 - * radeon_driver_firstopen_kms - drm callback for last close
 + * radeon_driver_lastclose_kms - drm callback for last close
   *
   * @dev: drm dev pointer
   *
   */
  void radeon_driver_lastclose_kms(struct drm_device *dev)
  {
 +      struct radeon_device *rdev = dev->dev_private;
 +
 +      radeon_fbdev_restore_mode(rdev);
        vga_switcheroo_process_delayed_switch();
  }
  
@@@ -727,10 -726,14 +729,14 @@@ void radeon_driver_preclose_kms(struct 
                                struct drm_file *file_priv)
  {
        struct radeon_device *rdev = dev->dev_private;
+       mutex_lock(&rdev->gem.mutex);
        if (rdev->hyperz_filp == file_priv)
                rdev->hyperz_filp = NULL;
        if (rdev->cmask_filp == file_priv)
                rdev->cmask_filp = NULL;
+       mutex_unlock(&rdev->gem.mutex);
        radeon_uvd_free_handles(rdev, file_priv);
        radeon_vce_free_handles(rdev, file_priv);
  }
@@@ -847,49 -850,89 +853,49 @@@ int radeon_get_vblank_timestamp_kms(str
                                                     &drmcrtc->hwmode);
  }
  
 -#define KMS_INVALID_IOCTL(name)                                               \
 -static int name(struct drm_device *dev, void *data, struct drm_file   \
 -              *file_priv)                                             \
 -{                                                                     \
 -      DRM_ERROR("invalid ioctl with kms %s\n", __func__);             \
 -      return -EINVAL;                                                 \
 -}
 -
 -/*
 - * All these ioctls are invalid in kms world.
 - */
 -KMS_INVALID_IOCTL(radeon_cp_init_kms)
 -KMS_INVALID_IOCTL(radeon_cp_start_kms)
 -KMS_INVALID_IOCTL(radeon_cp_stop_kms)
 -KMS_INVALID_IOCTL(radeon_cp_reset_kms)
 -KMS_INVALID_IOCTL(radeon_cp_idle_kms)
 -KMS_INVALID_IOCTL(radeon_cp_resume_kms)
 -KMS_INVALID_IOCTL(radeon_engine_reset_kms)
 -KMS_INVALID_IOCTL(radeon_fullscreen_kms)
 -KMS_INVALID_IOCTL(radeon_cp_swap_kms)
 -KMS_INVALID_IOCTL(radeon_cp_clear_kms)
 -KMS_INVALID_IOCTL(radeon_cp_vertex_kms)
 -KMS_INVALID_IOCTL(radeon_cp_indices_kms)
 -KMS_INVALID_IOCTL(radeon_cp_texture_kms)
 -KMS_INVALID_IOCTL(radeon_cp_stipple_kms)
 -KMS_INVALID_IOCTL(radeon_cp_indirect_kms)
 -KMS_INVALID_IOCTL(radeon_cp_vertex2_kms)
 -KMS_INVALID_IOCTL(radeon_cp_cmdbuf_kms)
 -KMS_INVALID_IOCTL(radeon_cp_getparam_kms)
 -KMS_INVALID_IOCTL(radeon_cp_flip_kms)
 -KMS_INVALID_IOCTL(radeon_mem_alloc_kms)
 -KMS_INVALID_IOCTL(radeon_mem_free_kms)
 -KMS_INVALID_IOCTL(radeon_mem_init_heap_kms)
 -KMS_INVALID_IOCTL(radeon_irq_emit_kms)
 -KMS_INVALID_IOCTL(radeon_irq_wait_kms)
 -KMS_INVALID_IOCTL(radeon_cp_setparam_kms)
 -KMS_INVALID_IOCTL(radeon_surface_alloc_kms)
 -KMS_INVALID_IOCTL(radeon_surface_free_kms)
 -
 -
  const struct drm_ioctl_desc radeon_ioctls_kms[] = {
 -      DRM_IOCTL_DEF_DRV(RADEON_CP_INIT, radeon_cp_init_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 -      DRM_IOCTL_DEF_DRV(RADEON_CP_START, radeon_cp_start_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 -      DRM_IOCTL_DEF_DRV(RADEON_CP_STOP, radeon_cp_stop_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 -      DRM_IOCTL_DEF_DRV(RADEON_CP_RESET, radeon_cp_reset_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 -      DRM_IOCTL_DEF_DRV(RADEON_CP_IDLE, radeon_cp_idle_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_CP_RESUME, radeon_cp_resume_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_RESET, radeon_engine_reset_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_FULLSCREEN, radeon_fullscreen_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_SWAP, radeon_cp_swap_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_CLEAR, radeon_cp_clear_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_VERTEX, radeon_cp_vertex_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_INDICES, radeon_cp_indices_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_TEXTURE, radeon_cp_texture_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_STIPPLE, radeon_cp_stipple_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_INDIRECT, radeon_cp_indirect_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 -      DRM_IOCTL_DEF_DRV(RADEON_VERTEX2, radeon_cp_vertex2_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_CMDBUF, radeon_cp_cmdbuf_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_GETPARAM, radeon_cp_getparam_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_FLIP, radeon_cp_flip_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_ALLOC, radeon_mem_alloc_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_FREE, radeon_mem_free_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_INIT_HEAP, radeon_mem_init_heap_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 -      DRM_IOCTL_DEF_DRV(RADEON_IRQ_EMIT, radeon_irq_emit_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_IRQ_WAIT, radeon_irq_wait_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_SETPARAM, radeon_cp_setparam_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_SURF_ALLOC, radeon_surface_alloc_kms, DRM_AUTH),
 -      DRM_IOCTL_DEF_DRV(RADEON_SURF_FREE, radeon_surface_free_kms, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_CP_INIT, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 +      DRM_IOCTL_DEF_DRV(RADEON_CP_START, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 +      DRM_IOCTL_DEF_DRV(RADEON_CP_STOP, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 +      DRM_IOCTL_DEF_DRV(RADEON_CP_RESET, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 +      DRM_IOCTL_DEF_DRV(RADEON_CP_IDLE, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_CP_RESUME, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_RESET, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_FULLSCREEN, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_SWAP, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_CLEAR, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_VERTEX, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_INDICES, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_TEXTURE, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_STIPPLE, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_INDIRECT, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 +      DRM_IOCTL_DEF_DRV(RADEON_VERTEX2, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_CMDBUF, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_GETPARAM, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_FLIP, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_ALLOC, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_FREE, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_INIT_HEAP, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 +      DRM_IOCTL_DEF_DRV(RADEON_IRQ_EMIT, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_IRQ_WAIT, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_SETPARAM, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_SURF_ALLOC, drm_invalid_op, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_SURF_FREE, drm_invalid_op, DRM_AUTH),
        /* KMS */
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_INFO, radeon_gem_info_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_CREATE, radeon_gem_create_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_MMAP, radeon_gem_mmap_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_DOMAIN, radeon_gem_set_domain_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_PREAD, radeon_gem_pread_ioctl, DRM_AUTH|DRM_UNLOCKED),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_PWRITE, radeon_gem_pwrite_ioctl, DRM_AUTH|DRM_UNLOCKED),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_WAIT_IDLE, radeon_gem_wait_idle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_CS, radeon_cs_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_INFO, radeon_info_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 -      DRM_IOCTL_DEF_DRV(RADEON_GEM_USERPTR, radeon_gem_userptr_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_INFO, radeon_gem_info_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_CREATE, radeon_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_MMAP, radeon_gem_mmap_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_DOMAIN, radeon_gem_set_domain_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_PREAD, radeon_gem_pread_ioctl, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_PWRITE, radeon_gem_pwrite_ioctl, DRM_AUTH),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_WAIT_IDLE, radeon_gem_wait_idle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_CS, radeon_cs_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_INFO, radeon_info_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 +      DRM_IOCTL_DEF_DRV(RADEON_GEM_USERPTR, radeon_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
  };
  int radeon_max_kms_ioctl = ARRAY_SIZE(radeon_ioctls_kms);