]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
Merge tag 'platform-drivers-x86-v4.13-2' of git://git.infradead.org/linux-platform...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_kms.c
index 96c34167078253b26d1ac0cfbc2f2036c07c487d..b0b23101d1c870ddeefc89b15818cd5b13ea13a7 100644 (file)
@@ -87,6 +87,41 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
        struct amdgpu_device *adev;
        int r, acpi_status;
 
+#ifdef CONFIG_DRM_AMDGPU_SI
+       if (!amdgpu_si_support) {
+               switch (flags & AMD_ASIC_MASK) {
+               case CHIP_TAHITI:
+               case CHIP_PITCAIRN:
+               case CHIP_VERDE:
+               case CHIP_OLAND:
+               case CHIP_HAINAN:
+                       dev_info(dev->dev,
+                                "SI support provided by radeon.\n");
+                       dev_info(dev->dev,
+                                "Use radeon.si_support=0 amdgpu.si_support=1 to override.\n"
+                               );
+                       return -ENODEV;
+               }
+       }
+#endif
+#ifdef CONFIG_DRM_AMDGPU_CIK
+       if (!amdgpu_cik_support) {
+               switch (flags & AMD_ASIC_MASK) {
+               case CHIP_KAVERI:
+               case CHIP_BONAIRE:
+               case CHIP_HAWAII:
+               case CHIP_KABINI:
+               case CHIP_MULLINS:
+                       dev_info(dev->dev,
+                                "CIK support provided by radeon.\n");
+                       dev_info(dev->dev,
+                                "Use radeon.cik_support=0 amdgpu.cik_support=1 to override.\n"
+                               );
+                       return -ENODEV;
+               }
+       }
+#endif
+
        adev = kzalloc(sizeof(struct amdgpu_device), GFP_KERNEL);
        if (adev == NULL) {
                return -ENOMEM;
@@ -235,6 +270,7 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,
 static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 {
        struct amdgpu_device *adev = dev->dev_private;
+       struct amdgpu_fpriv *fpriv = filp->driver_priv;
        struct drm_amdgpu_info *info = data;
        struct amdgpu_mode_info *minfo = &adev->mode_info;
        void __user *out = (void __user *)(uintptr_t)info->return_pointer;
@@ -247,6 +283,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
 
        if (!info->return_size || !info->return_pointer)
                return -EINVAL;
+       if (amdgpu_kms_vram_lost(adev, fpriv))
+               return -ENODEV;
 
        switch (info->query) {
        case AMDGPU_INFO_ACCEL_WORKING:
@@ -319,6 +357,19 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                        ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
                        ib_size_alignment = 1;
                        break;
+               case AMDGPU_HW_IP_VCN_DEC:
+                       type = AMD_IP_BLOCK_TYPE_VCN;
+                       ring_mask = adev->vcn.ring_dec.ready ? 1 : 0;
+                       ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
+                       ib_size_alignment = 16;
+                       break;
+               case AMDGPU_HW_IP_VCN_ENC:
+                       type = AMD_IP_BLOCK_TYPE_VCN;
+                       for (i = 0; i < adev->vcn.num_enc_rings; i++)
+                               ring_mask |= ((adev->vcn.ring_enc[i].ready ? 1 : 0) << i);
+                       ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
+                       ib_size_alignment = 1;
+                       break;
                default:
                        return -EINVAL;
                }
@@ -361,6 +412,10 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                case AMDGPU_HW_IP_UVD_ENC:
                        type = AMD_IP_BLOCK_TYPE_UVD;
                        break;
+               case AMDGPU_HW_IP_VCN_DEC:
+               case AMDGPU_HW_IP_VCN_ENC:
+                       type = AMD_IP_BLOCK_TYPE_VCN;
+                       break;
                default:
                        return -EINVAL;
                }
@@ -397,6 +452,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
        case AMDGPU_INFO_NUM_EVICTIONS:
                ui64 = atomic64_read(&adev->num_evictions);
                return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
+       case AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS:
+               ui64 = atomic64_read(&adev->num_vram_cpu_page_faults);
+               return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
        case AMDGPU_INFO_VRAM_USAGE:
                ui64 = atomic64_read(&adev->vram_usage);
                return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
@@ -536,6 +594,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                dev_info.cu_active_number = adev->gfx.cu_info.number;
                dev_info.cu_ao_mask = adev->gfx.cu_info.ao_cu_mask;
                dev_info.ce_ram_size = adev->gfx.ce_ram_size;
+               memcpy(&dev_info.cu_ao_bitmap[0], &adev->gfx.cu_info.ao_cu_bitmap[0],
+                      sizeof(adev->gfx.cu_info.ao_cu_bitmap));
                memcpy(&dev_info.cu_bitmap[0], &adev->gfx.cu_info.bitmap[0],
                       sizeof(adev->gfx.cu_info.bitmap));
                dev_info.vram_type = adev->mc.vram_type;
@@ -730,6 +790,12 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev)
        vga_switcheroo_process_delayed_switch();
 }
 
+bool amdgpu_kms_vram_lost(struct amdgpu_device *adev,
+                         struct amdgpu_fpriv *fpriv)
+{
+       return fpriv->vram_lost_counter != atomic_read(&adev->vram_lost_counter);
+}
+
 /**
  * amdgpu_driver_open_kms - drm callback for open
  *
@@ -757,7 +823,8 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                goto out_suspend;
        }
 
-       r = amdgpu_vm_init(adev, &fpriv->vm);
+       r = amdgpu_vm_init(adev, &fpriv->vm,
+                          AMDGPU_VM_CONTEXT_GFX);
        if (r) {
                kfree(fpriv);
                goto out_suspend;
@@ -782,6 +849,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
 
        amdgpu_ctx_mgr_init(&fpriv->ctx_mgr);
 
+       fpriv->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
        file_priv->driver_priv = fpriv;
 
 out_suspend:
@@ -814,8 +882,10 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
 
        amdgpu_ctx_mgr_fini(&fpriv->ctx_mgr);
 
-       amdgpu_uvd_free_handles(adev, file_priv);
-       amdgpu_vce_free_handles(adev, file_priv);
+       if (adev->asic_type != CHIP_RAVEN) {
+               amdgpu_uvd_free_handles(adev, file_priv);
+               amdgpu_vce_free_handles(adev, file_priv);
+       }
 
        amdgpu_vm_bo_rmv(adev, fpriv->prt_va);
 
@@ -945,50 +1015,10 @@ void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe)
        amdgpu_irq_put(adev, &adev->crtc_irq, idx);
 }
 
-/**
- * amdgpu_get_vblank_timestamp_kms - get vblank timestamp
- *
- * @dev: drm dev pointer
- * @crtc: crtc to get the timestamp for
- * @max_error: max error
- * @vblank_time: time value
- * @flags: flags passed to the driver
- *
- * Gets the timestamp on the requested crtc based on the
- * scanout position.  (all asics).
- * Returns postive status flags on success, negative error on failure.
- */
-int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
-                                   int *max_error,
-                                   struct timeval *vblank_time,
-                                   unsigned flags)
-{
-       struct drm_crtc *crtc;
-       struct amdgpu_device *adev = dev->dev_private;
-
-       if (pipe >= dev->num_crtcs) {
-               DRM_ERROR("Invalid crtc %u\n", pipe);
-               return -EINVAL;
-       }
-
-       /* Get associated drm_crtc: */
-       crtc = &adev->mode_info.crtcs[pipe]->base;
-       if (!crtc) {
-               /* This can occur on driver load if some component fails to
-                * initialize completely and driver is unloaded */
-               DRM_ERROR("Uninitialized crtc %d\n", pipe);
-               return -EINVAL;
-       }
-
-       /* Helper routine in DRM core does all the work: */
-       return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
-                                                    vblank_time, flags,
-                                                    &crtc->hwmode);
-}
-
 const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
        DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(AMDGPU_VM, amdgpu_vm_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(AMDGPU_BO_LIST, amdgpu_bo_list_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
        /* KMS */
        DRM_IOCTL_DEF_DRV(AMDGPU_GEM_MMAP, amdgpu_gem_mmap_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
This page took 0.040233 seconds and 4 git commands to generate.