drm/ttm: device naming cleanup
[linux-2.6-microblaze.git] / drivers / gpu / drm / vmwgfx / vmwgfx_drv.c
index 216daf9..b454d80 100644 (file)
 #include <linux/mem_encrypt.h>
 
 #include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_sysfs.h>
 #include <drm/ttm/ttm_bo_driver.h>
-#include <drm/ttm/ttm_module.h>
 #include <drm/ttm/ttm_placement.h>
 
 #include "ttm_object.h"
@@ -43,8 +43,6 @@
 #include "vmwgfx_drv.h"
 
 #define VMWGFX_DRIVER_DESC "Linux drm driver for VMware graphics devices"
-#define VMWGFX_CHIP_SVGAII 0
-#define VMW_FB_RESERVATION 0
 
 #define VMW_MIN_INITIAL_WIDTH 800
 #define VMW_MIN_INITIAL_HEIGHT 600
        DRM_IOWR(DRM_COMMAND_BASE + DRM_VMW_MSG,                        \
                struct drm_vmw_msg_arg)
 
-/**
+/*
  * The core DRM version of this macro doesn't account for
  * DRM_COMMAND_BASE.
  */
 #define VMW_IOCTL_DEF(ioctl, func, flags) \
   [DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = {DRM_IOCTL_##ioctl, flags, func}
 
-/**
+/*
  * Ioctl definitions.
  */
 
@@ -253,8 +251,8 @@ static const struct drm_ioctl_desc vmw_ioctls[] = {
 };
 
 static const struct pci_device_id vmw_pci_id_list[] = {
-       {0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII},
-       {0, 0, 0}
+       { PCI_DEVICE(0x15ad, VMWGFX_PCI_ID_SVGA2) },
+       { }
 };
 MODULE_DEVICE_TABLE(pci, vmw_pci_id_list);
 
@@ -425,8 +423,7 @@ static int vmw_request_device_late(struct vmw_private *dev_priv)
        }
 
        if (dev_priv->cman) {
-               ret = vmw_cmdbuf_set_pool_size(dev_priv->cman,
-                                              256*4096, 2*4096);
+               ret = vmw_cmdbuf_set_pool_size(dev_priv->cman, 256*4096);
                if (ret) {
                        struct vmw_cmdbuf_man *man = dev_priv->cman;
 
@@ -529,7 +526,7 @@ static void vmw_release_device_late(struct vmw_private *dev_priv)
        vmw_fifo_release(dev_priv, &dev_priv->fifo);
 }
 
-/**
+/*
  * Sets the initial_[width|height] fields on the given vmw_private.
  *
  * It does so by reading SVGA_REG_[WIDTH|HEIGHT] regs and then
@@ -602,14 +599,14 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv)
 /**
  * vmw_dma_masks - set required page- and dma masks
  *
- * @dev: Pointer to struct drm-device
+ * @dev_priv: Pointer to struct drm-device
  *
  * With 32-bit we can only handle 32 bit PFNs. Optionally set that
  * restriction also for 64-bit systems.
  */
 static int vmw_dma_masks(struct vmw_private *dev_priv)
 {
-       struct drm_device *dev = dev_priv->dev;
+       struct drm_device *dev = &dev_priv->drm;
        int ret = 0;
 
        ret = dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(64));
@@ -644,26 +641,83 @@ static void vmw_vram_manager_fini(struct vmw_private *dev_priv)
 #endif
 }
 
-static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
+static int vmw_setup_pci_resources(struct vmw_private *dev,
+                                  unsigned long pci_id)
 {
-       struct vmw_private *dev_priv;
+       resource_size_t fifo_start;
+       resource_size_t fifo_size;
        int ret;
+       struct pci_dev *pdev = to_pci_dev(dev->drm.dev);
+
+       pci_set_master(pdev);
+
+       ret = pci_request_regions(pdev, "vmwgfx probe");
+       if (ret)
+               return ret;
+
+       dev->io_start = pci_resource_start(pdev, 0);
+       dev->vram_start = pci_resource_start(pdev, 1);
+       dev->vram_size = pci_resource_len(pdev, 1);
+       fifo_start = pci_resource_start(pdev, 2);
+       fifo_size = pci_resource_len(pdev, 2);
+
+       DRM_INFO("FIFO at %pa size is %llu kiB\n",
+                &fifo_start, (uint64_t)fifo_size / 1024);
+       dev->fifo_mem = devm_memremap(dev->drm.dev,
+                                     fifo_start,
+                                     fifo_size,
+                                     MEMREMAP_WB);
+
+       if (unlikely(dev->fifo_mem == NULL)) {
+               DRM_ERROR("Failed mapping FIFO memory.\n");
+               return -ENOMEM;
+       }
+
+       /*
+        * This is approximate size of the vram, the exact size will only
+        * be known after we read SVGA_REG_VRAM_SIZE. The PCI resource
+        * size will be equal to or bigger than the size reported by
+        * SVGA_REG_VRAM_SIZE.
+        */
+       DRM_INFO("VRAM at %pa size is %llu kiB\n",
+                &dev->vram_start, (uint64_t)dev->vram_size / 1024);
+
+       return 0;
+}
+
+static int vmw_detect_version(struct vmw_private *dev)
+{
        uint32_t svga_id;
+
+       vmw_write(dev, SVGA_REG_ID, SVGA_ID_2);
+       svga_id = vmw_read(dev, SVGA_REG_ID);
+       if (svga_id != SVGA_ID_2) {
+               DRM_ERROR("Unsupported SVGA ID 0x%x on chipset 0x%x\n",
+                         svga_id, dev->vmw_chipset);
+               return -ENOSYS;
+       }
+       return 0;
+}
+
+static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
+{
+       int ret;
        enum vmw_res_type i;
        bool refuse_dma = false;
        char host_log[100] = {0};
+       struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
 
-       dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
-       if (unlikely(!dev_priv)) {
-               DRM_ERROR("Failed allocating a device private struct.\n");
-               return -ENOMEM;
-       }
+       dev_priv->vmw_chipset = pci_id;
+       dev_priv->last_read_seqno = (uint32_t) -100;
+       dev_priv->drm.dev_private = dev_priv;
 
-       pci_set_master(dev->pdev);
+       ret = vmw_setup_pci_resources(dev_priv, pci_id);
+       if (ret)
+               return ret;
+       ret = vmw_detect_version(dev_priv);
+       if (ret)
+               return ret;
 
-       dev_priv->dev = dev;
-       dev_priv->vmw_chipset = chipset;
-       dev_priv->last_read_seqno = (uint32_t) -100;
        mutex_init(&dev_priv->cmdbuf_mutex);
        mutex_init(&dev_priv->release_mutex);
        mutex_init(&dev_priv->binding_mutex);
@@ -673,7 +727,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        spin_lock_init(&dev_priv->hw_lock);
        spin_lock_init(&dev_priv->waiter_lock);
        spin_lock_init(&dev_priv->cap_lock);
-       spin_lock_init(&dev_priv->svga_lock);
        spin_lock_init(&dev_priv->cursor_lock);
 
        for (i = vmw_res_context; i < vmw_res_max; ++i) {
@@ -688,21 +741,10 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 
        dev_priv->used_memory_size = 0;
 
-       dev_priv->io_start = pci_resource_start(dev->pdev, 0);
-       dev_priv->vram_start = pci_resource_start(dev->pdev, 1);
-       dev_priv->mmio_start = pci_resource_start(dev->pdev, 2);
-
        dev_priv->assume_16bpp = !!vmw_assume_16bpp;
 
        dev_priv->enable_fb = enable_fbdev;
 
-       vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2);
-       svga_id = vmw_read(dev_priv, SVGA_REG_ID);
-       if (svga_id != SVGA_ID_2) {
-               ret = -ENOSYS;
-               DRM_ERROR("Unsupported SVGA ID 0x%x\n", svga_id);
-               goto out_err0;
-       }
 
        dev_priv->capabilities = vmw_read(dev_priv, SVGA_REG_CAPABILITIES);
 
@@ -720,7 +762,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        }
 
        dev_priv->vram_size = vmw_read(dev_priv, SVGA_REG_VRAM_SIZE);
-       dev_priv->mmio_size = vmw_read(dev_priv, SVGA_REG_MEM_SIZE);
+       dev_priv->fifo_mem_size = vmw_read(dev_priv, SVGA_REG_MEM_SIZE);
        dev_priv->fb_max_width = vmw_read(dev_priv, SVGA_REG_MAX_WIDTH);
        dev_priv->fb_max_height = vmw_read(dev_priv, SVGA_REG_MAX_HEIGHT);
 
@@ -794,7 +836,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        if (unlikely(ret != 0))
                goto out_err0;
 
-       dma_set_max_seg_size(dev->dev, U32_MAX);
+       dma_set_max_seg_size(dev_priv->drm.dev, U32_MAX);
 
        if (dev_priv->capabilities & SVGA_CAP_GMR2) {
                DRM_INFO("Max GMR ids is %u\n",
@@ -804,21 +846,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
                DRM_INFO("Max dedicated hypervisor surface memory is %u kiB\n",
                         (unsigned)dev_priv->memory_size / 1024);
        }
-       DRM_INFO("Maximum display memory size is %u kiB\n",
-                dev_priv->prim_bb_mem / 1024);
-       DRM_INFO("VRAM at 0x%08x size is %u kiB\n",
-                dev_priv->vram_start, dev_priv->vram_size / 1024);
-       DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
-                dev_priv->mmio_start, dev_priv->mmio_size / 1024);
-
-       dev_priv->mmio_virt = memremap(dev_priv->mmio_start,
-                                      dev_priv->mmio_size, MEMREMAP_WB);
-
-       if (unlikely(dev_priv->mmio_virt == NULL)) {
-               ret = -ENOMEM;
-               DRM_ERROR("Failed mapping MMIO.\n");
-               goto out_err0;
-       }
+       DRM_INFO("Maximum display memory size is %llu kiB\n",
+                (uint64_t)dev_priv->prim_bb_mem / 1024);
 
        /* Need mmio memory to check for fifo pitchlock cap. */
        if (!(dev_priv->capabilities & SVGA_CAP_DISPLAY_TOPOLOGY) &&
@@ -826,7 +855,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
            !vmw_fifo_have_pitchlock(dev_priv)) {
                ret = -ENOSYS;
                DRM_ERROR("Hardware has no pitchlock\n");
-               goto out_err4;
+               goto out_err0;
        }
 
        dev_priv->tdev = ttm_object_device_init(&ttm_mem_glob, 12,
@@ -835,29 +864,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        if (unlikely(dev_priv->tdev == NULL)) {
                DRM_ERROR("Unable to initialize TTM object management.\n");
                ret = -ENOMEM;
-               goto out_err4;
-       }
-
-       dev->dev_private = dev_priv;
-
-       ret = pci_request_regions(dev->pdev, "vmwgfx probe");
-       dev_priv->stealth = (ret != 0);
-       if (dev_priv->stealth) {
-               /**
-                * Request at least the mmio PCI resource.
-                */
-
-               DRM_INFO("It appears like vesafb is loaded. "
-                        "Ignore above error if any.\n");
-               ret = pci_request_region(dev->pdev, 2, "vmwgfx stealth probe");
-               if (unlikely(ret != 0)) {
-                       DRM_ERROR("Failed reserving the SVGA MMIO resource.\n");
-                       goto out_no_device;
-               }
+               goto out_err0;
        }
 
        if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
-               ret = vmw_irq_install(dev, dev->pdev->irq);
+               ret = vmw_irq_install(&dev_priv->drm, pdev->irq);
                if (ret != 0) {
                        DRM_ERROR("Failed installing irq: %d\n", ret);
                        goto out_no_irq;
@@ -873,12 +884,12 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        drm_vma_offset_manager_init(&dev_priv->vma_manager,
                                    DRM_FILE_PAGE_OFFSET_START,
                                    DRM_FILE_PAGE_OFFSET_SIZE);
-       ret = ttm_bo_device_init(&dev_priv->bdev, &vmw_bo_driver,
-                                dev_priv->dev->dev,
-                                dev->anon_inode->i_mapping,
-                                &dev_priv->vma_manager,
-                                dev_priv->map_mode == vmw_dma_alloc_coherent,
-                                false);
+       ret = ttm_device_init(&dev_priv->bdev, &vmw_bo_driver,
+                             dev_priv->drm.dev,
+                             dev_priv->drm.anon_inode->i_mapping,
+                             &dev_priv->vma_manager,
+                             dev_priv->map_mode == vmw_dma_alloc_coherent,
+                             false);
        if (unlikely(ret != 0)) {
                DRM_ERROR("Failed initializing TTM buffer object driver.\n");
                goto out_no_bdev;
@@ -955,7 +966,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        if (ret)
                goto out_no_fifo;
 
-       DRM_INFO("Atomic: %s\n", (dev->driver->driver_features & DRIVER_ATOMIC)
+       DRM_INFO("Atomic: %s\n", (dev_priv->drm.driver->driver_features & DRIVER_ATOMIC)
                 ? "yes." : "no.");
        if (dev_priv->sm_type == VMW_SM_5)
                DRM_INFO("SM5 support available.\n");
@@ -995,21 +1006,15 @@ out_no_kms:
                vmw_gmrid_man_fini(dev_priv, VMW_PL_GMR);
        vmw_vram_manager_fini(dev_priv);
 out_no_vram:
-       (void)ttm_bo_device_release(&dev_priv->bdev);
+       ttm_device_fini(&dev_priv->bdev);
 out_no_bdev:
        vmw_fence_manager_takedown(dev_priv->fman);
 out_no_fman:
        if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
-               vmw_irq_uninstall(dev_priv->dev);
+               vmw_irq_uninstall(&dev_priv->drm);
 out_no_irq:
-       if (dev_priv->stealth)
-               pci_release_region(dev->pdev, 2);
-       else
-               pci_release_regions(dev->pdev);
-out_no_device:
+       pci_release_regions(pdev);
        ttm_object_device_release(&dev_priv->tdev);
-out_err4:
-       memunmap(dev_priv->mmio_virt);
 out_err0:
        for (i = vmw_res_context; i < vmw_res_max; ++i)
                idr_destroy(&dev_priv->res_idr[i]);
@@ -1023,6 +1028,7 @@ out_err0:
 static void vmw_driver_unload(struct drm_device *dev)
 {
        struct vmw_private *dev_priv = vmw_priv(dev);
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
        enum vmw_res_type i;
 
        unregister_pm_notifier(&dev_priv->pm_nb);
@@ -1047,19 +1053,15 @@ static void vmw_driver_unload(struct drm_device *dev)
        if (dev_priv->has_mob)
                vmw_gmrid_man_fini(dev_priv, VMW_PL_MOB);
        vmw_vram_manager_fini(dev_priv);
-       (void) ttm_bo_device_release(&dev_priv->bdev);
+       ttm_device_fini(&dev_priv->bdev);
        drm_vma_offset_manager_destroy(&dev_priv->vma_manager);
        vmw_release_device_late(dev_priv);
        vmw_fence_manager_takedown(dev_priv->fman);
        if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
-               vmw_irq_uninstall(dev_priv->dev);
-       if (dev_priv->stealth)
-               pci_release_region(dev->pdev, 2);
-       else
-               pci_release_regions(dev->pdev);
+               vmw_irq_uninstall(&dev_priv->drm);
+       pci_release_regions(pdev);
 
        ttm_object_device_release(&dev_priv->tdev);
-       memunmap(dev_priv->mmio_virt);
        if (dev_priv->ctx.staged_bindings)
                vmw_binding_state_free(dev_priv->ctx.staged_bindings);
 
@@ -1190,12 +1192,10 @@ static void __vmw_svga_enable(struct vmw_private *dev_priv)
 {
        struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
 
-       spin_lock(&dev_priv->svga_lock);
        if (!ttm_resource_manager_used(man)) {
                vmw_write(dev_priv, SVGA_REG_ENABLE, SVGA_REG_ENABLE);
                ttm_resource_manager_set_used(man, true);
        }
-       spin_unlock(&dev_priv->svga_lock);
 }
 
 /**
@@ -1221,14 +1221,12 @@ static void __vmw_svga_disable(struct vmw_private *dev_priv)
 {
        struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
 
-       spin_lock(&dev_priv->svga_lock);
        if (ttm_resource_manager_used(man)) {
                ttm_resource_manager_set_used(man, false);
                vmw_write(dev_priv, SVGA_REG_ENABLE,
                          SVGA_REG_ENABLE_HIDE |
                          SVGA_REG_ENABLE_ENABLE);
        }
-       spin_unlock(&dev_priv->svga_lock);
 }
 
 /**
@@ -1253,19 +1251,16 @@ void vmw_svga_disable(struct vmw_private *dev_priv)
         * to be inconsistent with the device, causing modesetting problems.
         *
         */
-       vmw_kms_lost_device(dev_priv->dev);
+       vmw_kms_lost_device(&dev_priv->drm);
        ttm_write_lock(&dev_priv->reservation_sem, false);
-       spin_lock(&dev_priv->svga_lock);
        if (ttm_resource_manager_used(man)) {
-               ttm_resource_manager_set_used(man, false);
-               spin_unlock(&dev_priv->svga_lock);
                if (ttm_resource_manager_evict_all(&dev_priv->bdev, man))
                        DRM_ERROR("Failed evicting VRAM buffers.\n");
+               ttm_resource_manager_set_used(man, false);
                vmw_write(dev_priv, SVGA_REG_ENABLE,
                          SVGA_REG_ENABLE_HIDE |
                          SVGA_REG_ENABLE_ENABLE);
-       } else
-               spin_unlock(&dev_priv->svga_lock);
+       }
        ttm_write_unlock(&dev_priv->reservation_sem);
 }
 
@@ -1275,8 +1270,6 @@ static void vmw_remove(struct pci_dev *pdev)
 
        drm_dev_unregister(dev);
        vmw_driver_unload(dev);
-       drm_dev_put(dev);
-       pci_disable_device(pdev);
 }
 
 static unsigned long
@@ -1377,7 +1370,7 @@ static int vmw_pm_freeze(struct device *kdev)
         * No user-space processes should be running now.
         */
        ttm_suspend_unlock(&dev_priv->reservation_sem);
-       ret = vmw_kms_suspend(dev_priv->dev);
+       ret = vmw_kms_suspend(&dev_priv->drm);
        if (ret) {
                ttm_suspend_lock(&dev_priv->reservation_sem);
                DRM_ERROR("Failed to freeze modesetting.\n");
@@ -1409,7 +1402,7 @@ static int vmw_pm_freeze(struct device *kdev)
 
        vmw_fence_fifo_down(dev_priv->fman);
        __vmw_svga_disable(dev_priv);
-       
+
        vmw_release_device_late(dev_priv);
        return 0;
 }
@@ -1438,7 +1431,7 @@ static int vmw_pm_restore(struct device *kdev)
        dev_priv->suspend_locked = false;
        ttm_suspend_unlock(&dev_priv->reservation_sem);
        if (dev_priv->suspend_state)
-               vmw_kms_resume(dev_priv->dev);
+               vmw_kms_resume(&dev_priv->drm);
 
        if (dev_priv->enable_fb)
                vmw_fb_on(dev_priv);
@@ -1507,39 +1500,35 @@ static struct pci_driver vmw_pci_driver = {
 
 static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
-       struct drm_device *dev;
+       struct vmw_private *vmw;
        int ret;
 
-       ret = pci_enable_device(pdev);
+       ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, "svgadrmfb");
        if (ret)
                return ret;
 
-       dev = drm_dev_alloc(&driver, &pdev->dev);
-       if (IS_ERR(dev)) {
-               ret = PTR_ERR(dev);
-               goto err_pci_disable_device;
-       }
+       ret = pcim_enable_device(pdev);
+       if (ret)
+               return ret;
 
-       dev->pdev = pdev;
-       pci_set_drvdata(pdev, dev);
+       vmw = devm_drm_dev_alloc(&pdev->dev, &driver,
+                                struct vmw_private, drm);
+       if (IS_ERR(vmw))
+               return PTR_ERR(vmw);
 
-       ret = vmw_driver_load(dev, ent->driver_data);
-       if (ret)
-               goto err_drm_dev_put;
+       pci_set_drvdata(pdev, &vmw->drm);
 
-       ret = drm_dev_register(dev, ent->driver_data);
+       ret = vmw_driver_load(vmw, ent->device);
        if (ret)
-               goto err_vmw_driver_unload;
+               return ret;
 
-       return 0;
+       ret = drm_dev_register(&vmw->drm, 0);
+       if (ret) {
+               vmw_driver_unload(&vmw->drm);
+               return ret;
+       }
 
-err_vmw_driver_unload:
-       vmw_driver_unload(dev);
-err_drm_dev_put:
-       drm_dev_put(dev);
-err_pci_disable_device:
-       pci_disable_device(pdev);
-       return ret;
+       return 0;
 }
 
 static int __init vmwgfx_init(void)