drm/via: Embed via_map in via_dri1
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / via / via_dri1.c
index d5d4a64..2fa2235 100644 (file)
@@ -32,6 +32,7 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_pciids.h>
+#include <drm/drm_vblank.h>
 #include <drm/via_drm.h>
 
 #include "via_drv.h"
        dev_priv->dma_low += 8;                 \
 } while (0)
 
+static int via_do_init_map(struct drm_device *dev, drm_via_init_t *init)
+{
+       drm_via_private_t *dev_priv = dev->dev_private;
+
+       DRM_DEBUG("\n");
+
+       dev_priv->sarea = drm_legacy_getsarea(dev);
+       if (!dev_priv->sarea) {
+               DRM_ERROR("could not find sarea!\n");
+               dev->dev_private = (void *)dev_priv;
+               via_do_cleanup_map(dev);
+               return -EINVAL;
+       }
+
+       dev_priv->fb = drm_legacy_findmap(dev, init->fb_offset);
+       if (!dev_priv->fb) {
+               DRM_ERROR("could not find framebuffer!\n");
+               dev->dev_private = (void *)dev_priv;
+               via_do_cleanup_map(dev);
+               return -EINVAL;
+       }
+       dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
+       if (!dev_priv->mmio) {
+               DRM_ERROR("could not find mmio region!\n");
+               dev->dev_private = (void *)dev_priv;
+               via_do_cleanup_map(dev);
+               return -EINVAL;
+       }
+
+       dev_priv->sarea_priv =
+           (drm_via_sarea_t *) ((u8 *) dev_priv->sarea->handle +
+                                init->sarea_priv_offset);
+
+       dev_priv->agpAddr = init->agpAddr;
+
+       via_init_futex(dev_priv);
+
+       via_init_dmablit(dev);
+
+       dev->dev_private = (void *)dev_priv;
+       return 0;
+}
+
+int via_do_cleanup_map(struct drm_device *dev)
+{
+       via_dma_cleanup(dev);
+
+       return 0;
+}
+
+static int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
+{
+       drm_via_init_t *init = data;
+
+       DRM_DEBUG("\n");
+
+       switch (init->func) {
+       case VIA_INIT_MAP:
+               return via_do_init_map(dev, init);
+       case VIA_CLEANUP_MAP:
+               return via_do_cleanup_map(dev);
+       }
+
+       return -EINVAL;
+}
+
+static int via_driver_load(struct drm_device *dev, unsigned long chipset)
+{
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+       drm_via_private_t *dev_priv;
+       int ret = 0;
+
+       dev_priv = kzalloc(sizeof(drm_via_private_t), GFP_KERNEL);
+       if (dev_priv == NULL)
+               return -ENOMEM;
+
+       idr_init(&dev_priv->object_idr);
+       dev->dev_private = (void *)dev_priv;
+
+       dev_priv->chipset = chipset;
+
+       pci_set_master(pdev);
+
+       ret = drm_vblank_init(dev, 1);
+       if (ret) {
+               kfree(dev_priv);
+               return ret;
+       }
+
+       return 0;
+}
+
+static void via_driver_unload(struct drm_device *dev)
+{
+       drm_via_private_t *dev_priv = dev->dev_private;
+
+       idr_destroy(&dev_priv->object_idr);
+
+       kfree(dev_priv);
+}
+
 static void via_cmdbuf_start(drm_via_private_t *dev_priv);
 static void via_cmdbuf_pause(drm_via_private_t *dev_priv);
 static void via_cmdbuf_reset(drm_via_private_t *dev_priv);