R300+: fixup pixcache flush
[platform/upstream/libdrm.git] / shared-core / via_map.c
index 096e3e1..5493436 100644 (file)
  * DEALINGS IN THE SOFTWARE.
  */
 #include "drmP.h"
+#include "via_drm.h"
 #include "via_drv.h"
 
-int via_do_init_map(drm_device_t * dev, drm_via_init_t * init)
+static int via_do_init_map(struct drm_device * dev, drm_via_init_t * init)
 {
-       drm_via_private_t *dev_priv;
-       unsigned int i;
-
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
-       dev_priv = drm_alloc(sizeof(drm_via_private_t), DRM_MEM_DRIVER);
-       if (dev_priv == NULL)
-               return -ENOMEM;
+       drm_via_private_t *dev_priv = dev->dev_private;
+       int ret = 0;
 
-       memset(dev_priv, 0, sizeof(drm_via_private_t));
+       DRM_DEBUG("\n");
 
-       DRM_GETSAREA();
+       dev_priv->sarea = drm_getsarea(dev);
        if (!dev_priv->sarea) {
                DRM_ERROR("could not find sarea!\n");
                dev->dev_private = (void *)dev_priv;
@@ -66,41 +61,42 @@ int via_do_init_map(drm_device_t * dev, drm_via_init_t * init)
 
        dev_priv->agpAddr = init->agpAddr;
 
-       for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i)
-               DRM_INIT_WAITQUEUE(&(dev_priv->decoder_queue[i]));
-
+       via_init_futex( dev_priv );
+#ifdef VIA_HAVE_DMABLIT
+       via_init_dmablit( dev );
+#endif
+#ifdef VIA_HAVE_FENCE
+       dev_priv->emit_0_sequence = 0;
+       dev_priv->have_idlelock = 0;
+       spin_lock_init(&dev_priv->fence_lock);
+#endif /* VIA_HAVE_FENCE */
        dev->dev_private = (void *)dev_priv;
+#ifdef VIA_HAVE_BUFFER
+       ret = drm_bo_driver_init(dev);
+       if (ret)
+               DRM_ERROR("Could not initialize buffer object driver.\n");
+#endif
+       return ret;
 
-       return 0;
 }
 
-int via_do_cleanup_map(drm_device_t * dev)
+int via_do_cleanup_map(struct drm_device * dev)
 {
-       if (dev->dev_private) {
-
-               drm_via_private_t *dev_priv = dev->dev_private;
-
-               via_dma_cleanup(dev);
-
-               drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
-               dev->dev_private = NULL;
-       }
+       via_dma_cleanup(dev);
 
        return 0;
 }
 
-int via_map_init(DRM_IOCTL_ARGS)
-{
-       DRM_DEVICE;
-       drm_via_init_t init;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
+int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
+{
+       drm_via_init_t *init = data;
 
-       DRM_COPY_FROM_USER_IOCTL(init, (drm_via_init_t *) data, sizeof(init));
+       DRM_DEBUG("\n");
 
-       switch (init.func) {
+       switch (init->func) {
        case VIA_INIT_MAP:
-               return via_do_init_map(dev, &init);
+               return via_do_init_map(dev, init);
        case VIA_CLEANUP_MAP:
                return via_do_cleanup_map(dev);
        }
@@ -108,30 +104,36 @@ int via_map_init(DRM_IOCTL_ARGS)
        return -EINVAL;
 }
 
-int via_decoder_futex(DRM_IOCTL_ARGS)
+int via_driver_load(struct drm_device *dev, unsigned long chipset)
 {
-       DRM_DEVICE;
-       drm_via_futex_t fx;
-       volatile int *lock;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       drm_via_sarea_t *sAPriv = dev_priv->sarea_priv;
+       drm_via_private_t *dev_priv;
        int ret = 0;
 
-       DRM_COPY_FROM_USER_IOCTL(fx, (drm_via_futex_t *) data, sizeof(fx));
+       dev_priv = drm_calloc(1, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
+       if (dev_priv == NULL)
+               return -ENOMEM;
 
-       if (fx.lock > VIA_NR_XVMC_LOCKS)
-               return -EFAULT;
+       dev->dev_private = (void *)dev_priv;
 
-       lock = XVMCLOCKPTR(sAPriv, fx.lock);
+       dev_priv->chipset = chipset;
 
-       switch (fx.op) {
-       case VIA_FUTEX_WAIT:
-               DRM_WAIT_ON(ret, dev_priv->decoder_queue[fx.lock],
-                           (fx.ms / 10) * (DRM_HZ / 100), *lock != fx.val);
-               return ret;
-       case VIA_FUTEX_WAKE:
-               DRM_WAKEUP(&(dev_priv->decoder_queue[fx.lock]));
-               return 0;
+#ifdef VIA_HAVE_CORE_MM
+       ret = drm_sman_init(&dev_priv->sman, 2, 12, 8);
+       if (ret) {
+               drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
        }
+#endif
+       return ret;
+}
+
+int via_driver_unload(struct drm_device *dev)
+{
+       drm_via_private_t *dev_priv = dev->dev_private;
+
+#ifdef VIA_HAVE_CORE_MM
+       drm_sman_takedown(&dev_priv->sman);
+#endif
+       drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
+
        return 0;
 }