Hello,

attached are patches that restructurate drm_sg_alloc, by splitting it into  an 
ioctl wrapper, and a
function that actually does the work. This way drm_sg_alloc can be called from 
inside the DRM, and
this is something I want to have to implement PCI DMA in Nouveau.

Please forgive the mess with the 4 files, I am new to git..
-- 
Greetings, 
A.H.
>From d245d656fc7bbd4476f2c546ffdeda3d94f60459 Mon Sep 17 00:00:00 2001
From: Arthur Huillet <[EMAIL PROTECTED]>
Date: Tue, 3 Jul 2007 01:43:05 +0200
Subject: [PATCH] modified drm_sg_alloc to be callable from inside the DRM - 
drm_sg_alloc_ioctl is the ioctl wrapper

---
 linux-core/drmP.h        |    2 +-
 linux-core/drm_drv.c     |    2 +-
 linux-core/drm_scatter.c |   48 ++++++++++++++++++++++++++++-----------------
 3 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/linux-core/drmP.h b/linux-core/drmP.h
index dd3a69d..5fda31e 100644
--- a/linux-core/drmP.h
+++ b/linux-core/drmP.h
@@ -1137,7 +1137,7 @@ extern int drm_proc_cleanup(int minor,
 
                                /* Scatter Gather Support (drm_scatter.h) */
 extern void drm_sg_cleanup(drm_sg_mem_t * entry);
-extern int drm_sg_alloc(struct inode *inode, struct file *filp,
+extern int drm_sg_alloc_ioctl(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg);
 extern int drm_sg_free(struct inode *inode, struct file *filp,
                       unsigned int cmd, unsigned long arg);
diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c
index d5eb971..dcc16af 100644
--- a/linux-core/drm_drv.c
+++ b/linux-core/drm_drv.c
@@ -113,7 +113,7 @@ static drm_ioctl_desc_t drm_ioctls[] = {
        [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = {drm_agp_unbind_ioctl, 
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
 #endif
 
-       [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)] = {drm_sg_alloc, 
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
+       [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)] = {drm_sg_alloc_ioctl, 
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
        [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)] = {drm_sg_free, 
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
 
        [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)] = {drm_wait_vblank, 0},
diff --git a/linux-core/drm_scatter.c b/linux-core/drm_scatter.c
index e5c9f87..a87c7e8 100644
--- a/linux-core/drm_scatter.c
+++ b/linux-core/drm_scatter.c
@@ -62,14 +62,10 @@ void drm_sg_cleanup(drm_sg_mem_t * entry)
 # define ScatterHandle(x) (unsigned int)(x)
 #endif
 
-int drm_sg_alloc(struct inode *inode, struct file *filp,
-                unsigned int cmd, unsigned long arg)
+int drm_sg_alloc(drm_file_t * priv, drm_scatter_gather_t * request)
 {
-       drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->head->dev;
-       drm_scatter_gather_t __user *argp = (void __user *)arg;
-       drm_scatter_gather_t request;
        drm_sg_mem_t *entry;
+       drm_device_t *dev = priv->head->dev;
        unsigned long pages, i, j;
 
        DRM_DEBUG("%s\n", __FUNCTION__);
@@ -80,17 +76,13 @@ int drm_sg_alloc(struct inode *inode, struct file *filp,
        if (dev->sg)
                return -EINVAL;
 
-       if (copy_from_user(&request, argp, sizeof(request)))
-               return -EFAULT;
-
        entry = drm_alloc(sizeof(*entry), DRM_MEM_SGLISTS);
        if (!entry)
                return -ENOMEM;
 
        memset(entry, 0, sizeof(*entry));
-
-       pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE;
-       DRM_DEBUG("sg size=%ld pages=%ld\n", request.size, pages);
+       pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
+       DRM_DEBUG("sg size=%ld pages=%ld\n", request->size, pages);
 
        entry->pages = pages;
        entry->pagelist = drm_alloc(pages * sizeof(*entry->pagelist),
@@ -142,12 +134,7 @@ int drm_sg_alloc(struct inode *inode, struct file *filp,
                SetPageReserved(entry->pagelist[j]);
        }
 
-       request.handle = entry->handle;
-
-       if (copy_to_user(argp, &request, sizeof(request))) {
-               drm_sg_cleanup(entry);
-               return -EFAULT;
-       }
+       request->handle = entry->handle;
 
        dev->sg = entry;
 
@@ -196,6 +183,31 @@ int drm_sg_alloc(struct inode *inode, struct file *filp,
       failed:
        drm_sg_cleanup(entry);
        return -ENOMEM;
+
+}
+
+int drm_sg_alloc_ioctl(struct inode *inode, struct file *filp,
+                unsigned int cmd, unsigned long arg)
+{
+       drm_file_t *priv = filp->private_data;
+       drm_scatter_gather_t __user *argp = (void __user *)arg;
+       drm_scatter_gather_t request;
+       int ret;
+
+       if (copy_from_user(&request, argp, sizeof(request)))
+               return -EFAULT;
+
+       ret = drm_sg_alloc(priv, &request);
+       if ( ret ) return ret;
+
+       if (copy_to_user(argp, &request, sizeof(request))) {
+               drm_sg_cleanup(priv->head->dev->sg);
+               return -EFAULT;
+       }
+
+
+       return 0;
+
 }
 
 int drm_sg_free(struct inode *inode, struct file *filp,
-- 
1.5.1.4

>From b77e93929c406e3c72f7b7aeab1394c3d8ae0495 Mon Sep 17 00:00:00 2001
From: Arthur Huillet <[EMAIL PROTECTED]>
Date: Tue, 3 Jul 2007 02:18:07 +0200
Subject: [PATCH] changed arguments passed to drm_sg_alloc in order to match BSD 
implementation

---
 linux-core/drm_scatter.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/linux-core/drm_scatter.c b/linux-core/drm_scatter.c
index a87c7e8..46b80e4 100644
--- a/linux-core/drm_scatter.c
+++ b/linux-core/drm_scatter.c
@@ -62,10 +62,9 @@ void drm_sg_cleanup(drm_sg_mem_t * entry)
 # define ScatterHandle(x) (unsigned int)(x)
 #endif
 
-int drm_sg_alloc(drm_file_t * priv, drm_scatter_gather_t * request)
+int drm_sg_alloc(drm_device_t * dev, drm_scatter_gather_t * request)
 {
        drm_sg_mem_t *entry;
-       drm_device_t *dev = priv->head->dev;
        unsigned long pages, i, j;
 
        DRM_DEBUG("%s\n", __FUNCTION__);
@@ -197,7 +196,7 @@ int drm_sg_alloc_ioctl(struct inode *inode, struct file 
*filp,
        if (copy_from_user(&request, argp, sizeof(request)))
                return -EFAULT;
 
-       ret = drm_sg_alloc(priv, &request);
+       ret = drm_sg_alloc(priv->head->dev, &request);
        if ( ret ) return ret;
 
        if (copy_to_user(argp, &request, sizeof(request))) {
-- 
1.5.1.4

>From 739b67e83eb5482ec41522911752a7451e1b2149 Mon Sep 17 00:00:00 2001
From: Arthur Huillet <[EMAIL PROTECTED]>
Date: Tue, 3 Jul 2007 02:19:18 +0200
Subject: [PATCH] modified drm_sg_alloc to be accessible from inside the DRM, 
drm_sg_alloc_ioctl is the ioctl wrapper - BSD changes untested

---
 bsd-core/drmP.h        |    2 +-
 bsd-core/drm_scatter.c |   39 ++++++++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/bsd-core/drmP.h b/bsd-core/drmP.h
index 9ba3d50..64727b2 100644
--- a/bsd-core/drmP.h
+++ b/bsd-core/drmP.h
@@ -989,7 +989,7 @@ int drm_agp_unbind_ioctl(DRM_IOCTL_ARGS);
 int    drm_agp_bind_ioctl(DRM_IOCTL_ARGS);
 
 /* Scatter Gather Support (drm_scatter.c) */
-int    drm_sg_alloc(DRM_IOCTL_ARGS);
+int    drm_sg_alloc_ioctl(DRM_IOCTL_ARGS);
 int    drm_sg_free(DRM_IOCTL_ARGS);
 
 /* consistent PCI memory functions (drm_pci.c) */
diff --git a/bsd-core/drm_scatter.c b/bsd-core/drm_scatter.c
index 9dc280a..46222f1 100644
--- a/bsd-core/drm_scatter.c
+++ b/bsd-core/drm_scatter.c
@@ -40,28 +40,20 @@ void drm_sg_cleanup(drm_sg_mem_t *entry)
        free(entry, M_DRM);
 }
 
-int drm_sg_alloc(DRM_IOCTL_ARGS)
+int drm_sg_alloc(drm_device_t * dev, drm_scatter_gather_t * request)
 {
-       DRM_DEVICE;
-       drm_scatter_gather_t request;
        drm_sg_mem_t *entry;
        unsigned long pages;
-       int i;
-
-       DRM_DEBUG( "%s\n", __FUNCTION__ );
 
        if ( dev->sg )
                return EINVAL;
 
-       DRM_COPY_FROM_USER_IOCTL(request, (drm_scatter_gather_t *)data,
-                            sizeof(request) );
-
        entry = malloc(sizeof(*entry), M_DRM, M_WAITOK | M_ZERO);
        if ( !entry )
                return ENOMEM;
 
        pages = round_page(request.size) / PAGE_SIZE;
-       DRM_DEBUG( "sg size=%ld pages=%ld\n", request.size, pages );
+       DRM_DEBUG( "sg size=%ld pages=%ld\n", request->size, pages );
 
        entry->pages = pages;
 
@@ -86,11 +78,7 @@ int drm_sg_alloc(DRM_IOCTL_ARGS)
        DRM_DEBUG( "sg alloc handle  = %08lx\n", entry->handle );
 
        entry->virtual = (void *)entry->handle;
-       request.handle = entry->handle;
-
-       DRM_COPY_TO_USER_IOCTL( (drm_scatter_gather_t *)data,
-                          request,
-                          sizeof(request) );
+       request->handle = entry->handle;
 
        DRM_LOCK();
        if (dev->sg) {
@@ -101,6 +89,27 @@ int drm_sg_alloc(DRM_IOCTL_ARGS)
        dev->sg = entry;
        DRM_UNLOCK();
 
+}
+
+int drm_sg_alloc_ioctl(DRM_IOCTL_ARGS)
+{
+       DRM_DEVICE;
+       drm_scatter_gather_t request;
+       int ret;
+
+       DRM_DEBUG( "%s\n", __FUNCTION__ );
+
+
+       DRM_COPY_FROM_USER_IOCTL(request, (drm_scatter_gather_t *)data,
+                            sizeof(request) );
+
+       ret = drm_sg_alloc(dev, &request);
+       if ( ret ) return ret;
+
+       DRM_COPY_TO_USER_IOCTL( (drm_scatter_gather_t *)data,
+                          request,
+                          sizeof(request) );
+
        return 0;
 }
 
-- 
1.5.1.4

>From 835bef42de1b28e7b418edf77c186a569e020854 Mon Sep 17 00:00:00 2001
From: Arthur Huillet <[EMAIL PROTECTED]>
Date: Tue, 3 Jul 2007 02:19:44 +0200
Subject: [PATCH] modified drm_sg_alloc to be accessible from inside the DRM, 
drm_sg_alloc_ioctl is the ioctl wrapper - BSD changes untested

---
 bsd-core/drm_drv.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c
index baaeb43..069774c 100644
--- a/bsd-core/drm_drv.c
+++ b/bsd-core/drm_drv.c
@@ -117,7 +117,7 @@ static drm_ioctl_desc_t               drm_ioctls[256] = {
        [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)]      = { drm_agp_bind_ioctl, 
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY },
        [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)]    = { drm_agp_unbind_ioctl, 
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY },
 
-       [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)]      = { drm_sg_alloc,    
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY },
+       [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)]      = { drm_sg_alloc_ioctl,    
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY },
        [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)]       = { drm_sg_free,     
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY },
 
        [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)]   = { drm_wait_vblank, 0 },
-- 
1.5.1.4

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to