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