summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-shipmail-dot-org>2009-02-10 20:10:16 +0100
committerThomas Hellstrom <thomas-at-shipmail-dot-org>2009-02-10 20:11:26 +0100
commit815856d5de70e941f54b865faa92bd38916880c3 (patch)
tree6b6389314b4d00a08a578ebffb92c2af9b2ae826
parent97302ed5c76f1c1e3688f52ea8b75cdd74f392ff (diff)
Fix openchrome backwards compat.
-rw-r--r--linux-core/openchrome/via_ttm_glue.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/linux-core/openchrome/via_ttm_glue.c b/linux-core/openchrome/via_ttm_glue.c
index c0e6a43db..82dc8dd85 100644
--- a/linux-core/openchrome/via_ttm_glue.c
+++ b/linux-core/openchrome/via_ttm_glue.c
@@ -103,6 +103,7 @@ int via_pl_create_ioctl(struct drm_device *dev, void *data,
* situations.
*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
static int via_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
struct ttm_buffer_object *bo = (struct ttm_buffer_object *)
@@ -122,6 +123,28 @@ static int via_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
return ret;
}
+#else
+
+static unsigned long via_ttm_nopfn(struct vm_area_struct *vma, unsigned long address)
+{
+ struct ttm_buffer_object *bo = (struct ttm_buffer_object *)
+ vma->vm_private_data;
+ struct drm_via_private *dev_priv =
+ container_of(bo->bdev, struct drm_via_private, bdev);
+ int ret;
+
+ ret = ttm_read_lock(&dev_priv->ttm_lock, true);
+ if (unlikely(ret != 0))
+ return NOPFN_REFAULT;
+
+ ret = ttm_vm_ops->nopfn(vma, address);
+
+ ttm_read_unlock(&dev_priv->ttm_lock);
+
+ return ret;
+}
+#endif
+
int via_mmap(struct file *filp, struct vm_area_struct *vma)
{
struct drm_file *file_priv;
@@ -141,7 +164,11 @@ int via_mmap(struct file *filp, struct vm_area_struct *vma)
if (unlikely(ttm_vm_ops == NULL)) {
ttm_vm_ops = vma->vm_ops;
via_ttm_vm_ops = *ttm_vm_ops;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
via_ttm_vm_ops.fault = &via_ttm_fault;
+#else
+ via_ttm_vm_ops.nopfn = &via_ttm_nopfn;
+#endif
}
vma->vm_ops = &via_ttm_vm_ops;