Merge tag 'drm-misc-next-2019-12-16' of git://anongit.freedesktop.org/drm/drm-misc...
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / mgag200 / mgag200_drv.c
index ef795ab..9f4f5f0 100644 (file)
@@ -30,7 +30,8 @@ module_param_named(modeset, mgag200_modeset, int, 0400);
 static struct drm_driver driver;
 
 static const struct pci_device_id pciidlist[] = {
-       { PCI_VENDOR_ID_MATROX, 0x522, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_SE_A },
+       { PCI_VENDOR_ID_MATROX, 0x522, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               G200_SE_A | MGAG200_FLAG_HW_BUG_NO_STARTADD},
        { PCI_VENDOR_ID_MATROX, 0x524, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_SE_B },
        { PCI_VENDOR_ID_MATROX, 0x530, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_EV },
        { PCI_VENDOR_ID_MATROX, 0x532, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_WB },
@@ -94,6 +95,35 @@ static void mga_pci_remove(struct pci_dev *pdev)
 
 DEFINE_DRM_GEM_FOPS(mgag200_driver_fops);
 
+static bool mgag200_pin_bo_at_0(const struct mga_device *mdev)
+{
+       return mdev->flags & MGAG200_FLAG_HW_BUG_NO_STARTADD;
+}
+
+int mgag200_driver_dumb_create(struct drm_file *file,
+                              struct drm_device *dev,
+                              struct drm_mode_create_dumb *args)
+{
+       struct mga_device *mdev = dev->dev_private;
+       unsigned long pg_align;
+
+       if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized"))
+               return -EINVAL;
+
+       pg_align = 0ul;
+
+       /*
+        * Aligning scanout buffers to the size of the video ram forces
+        * placement at offset 0. Works around a bug where HW does not
+        * respect 'startadd' field.
+        */
+       if (mgag200_pin_bo_at_0(mdev))
+               pg_align = PFN_UP(mdev->mc.vram_size);
+
+       return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev,
+                                            pg_align, false, args);
+}
+
 static struct drm_driver driver = {
        .driver_features = DRIVER_GEM | DRIVER_MODESET,
        .fops = &mgag200_driver_fops,
@@ -103,7 +133,10 @@ static struct drm_driver driver = {
        .major = DRIVER_MAJOR,
        .minor = DRIVER_MINOR,
        .patchlevel = DRIVER_PATCHLEVEL,
-       DRM_GEM_VRAM_DRIVER
+       .debugfs_init = drm_vram_mm_debugfs_init,
+       .dumb_create = mgag200_driver_dumb_create,
+       .dumb_map_offset = drm_gem_vram_driver_dumb_mmap_offset,
+       .gem_prime_mmap = drm_gem_prime_mmap,
 };
 
 static struct pci_driver mgag200_pci_driver = {