* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
-#define __NO_VERSION__
-#include "via.h"
#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__);
+ drm_via_private_t *dev_priv = dev->dev_private;
+ int ret = 0;
- dev_priv = DRM(alloc)(sizeof(drm_via_private_t), DRM_MEM_DRIVER);
- if (dev_priv == NULL)
- return -ENOMEM;
+ DRM_DEBUG("\n");
- memset(dev_priv, 0, sizeof(drm_via_private_t));
-
- 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;
return -EINVAL;
}
- DRM_FIND_MAP(dev_priv->fb, init->fb_offset);
+ dev_priv->fb = drm_core_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;
}
- DRM_FIND_MAP(dev_priv->mmio, init->mmio_offset);
+ dev_priv->mmio = drm_core_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);
+ (drm_via_sarea_t *) ((u8 *) dev_priv->sarea->handle +
+ init->sarea_priv_offset);
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;
+
+}
+
+int via_do_cleanup_map(struct drm_device * dev)
+{
+ via_dma_cleanup(dev);
return 0;
}
-int via_do_cleanup_map(drm_device_t *dev)
+
+int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
{
- if (dev->dev_private) {
+ drm_via_init_t *init = data;
- drm_via_private_t *dev_priv = dev->dev_private;
+ DRM_DEBUG("\n");
- DRM(free)(dev_priv, sizeof(drm_via_private_t),
- DRM_MEM_DRIVER);
- dev->dev_private = NULL;
+ 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 0;
+ return -EINVAL;
}
-int via_map_init( DRM_IOCTL_ARGS )
+int via_driver_load(struct drm_device *dev, unsigned long chipset)
{
- DRM_DEVICE;
- drm_via_init_t init;
+ drm_via_private_t *dev_priv;
+ int ret = 0;
- DRM_DEBUG("%s\n", __FUNCTION__);
+ dev_priv = drm_calloc(1, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
+ if (dev_priv == NULL)
+ return -ENOMEM;
- DRM_COPY_FROM_USER_IOCTL(init, (drm_via_init_t *)data, sizeof(init));
+ dev->dev_private = (void *)dev_priv;
- switch (init.func) {
- case VIA_INIT_MAP:
- return via_do_init_map(dev, &init);
- case VIA_CLEANUP_MAP:
- return via_do_cleanup_map(dev);
- }
+ dev_priv->chipset = chipset;
- return -EINVAL;
+#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_decoder_futex( DRM_IOCTL_ARGS )
+int via_driver_unload(struct drm_device *dev)
{
- 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;
- int ret = 0;
-
- DRM_COPY_FROM_USER_IOCTL(fx, (drm_via_futex_t *) data, sizeof(fx));
-
- if (fx.lock > VIA_NR_XVMC_LOCKS)
- return -EFAULT;
-
- lock = XVMCLOCKPTR(sAPriv,fx.lock);
-
- 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;
- }
- return 0;
+ 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;
}
-
-
-