OSDN Git Service

[FreeBSD] Declare vblank_disable_fn callout MPSAFE.
[android-x86/external-libdrm.git] / bsd-core / drm_sysctl.c
index 41ffcf1..a6adf0f 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*-
  * Copyright 2003 Eric Anholt
  * All Rights Reserved.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
+ * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/** @file drm_sysctl.c
+ * Implementation of various sysctls for controlling DRM behavior and reporting
+ * debug information.
  */
 
 #include "drmP.h"
 #include "drm.h"
 
-#ifdef __FreeBSD__
-
 #include <sys/sysctl.h>
 
 static int        drm_name_info DRM_SYSCTL_HANDLER_ARGS;
@@ -39,9 +41,6 @@ struct drm_sysctl_list {
        int        (*f) DRM_SYSCTL_HANDLER_ARGS;
 } drm_sysctl_list[] = {
        {"name",    drm_name_info},
-#ifdef DEBUG_MEMORY
-       {"mem",     drm_mem_info},
-#endif
        {"vm",      drm_vm_info},
        {"clients", drm_clients_info},
        {"bufs",    drm_bufs_info},
@@ -53,17 +52,16 @@ struct drm_sysctl_info {
        char                   name[2];
 };
 
-int drm_sysctl_init(drm_device_t *dev)
+int drm_sysctl_init(struct drm_device *dev)
 {
        struct drm_sysctl_info *info;
        struct sysctl_oid *oid;
        struct sysctl_oid *top, *drioid;
        int               i;
 
-       info = drm_alloc(sizeof *info, DRM_MEM_DRIVER);
+       info = malloc(sizeof *info, M_DRM, M_WAITOK | M_ZERO);
        if ( !info )
                return 1;
-       bzero(info, sizeof *info);
        dev->sysctl = info;
 
        /* Add the sysctl node for DRI if it doesn't already exist */
@@ -88,7 +86,7 @@ int drm_sysctl_init(drm_device_t *dev)
                return 1;
        
        for (i = 0; i < DRM_SYSCTL_ENTRIES; i++) {
-               oid = sysctl_add_oid( &info->ctx, 
+               oid = SYSCTL_ADD_OID(&info->ctx, 
                        SYSCTL_CHILDREN(top), 
                        OID_AUTO, 
                        drm_sysctl_list[i].name, 
@@ -101,15 +99,19 @@ int drm_sysctl_init(drm_device_t *dev)
                if (!oid)
                        return 1;
        }
+       SYSCTL_ADD_INT(&info->ctx, SYSCTL_CHILDREN(top), OID_AUTO, "debug",
+           CTLFLAG_RW, &drm_debug_flag, sizeof(drm_debug_flag),
+           "Enable debugging output");
+
        return 0;
 }
 
-int drm_sysctl_cleanup(drm_device_t *dev)
+int drm_sysctl_cleanup(struct drm_device *dev)
 {
        int error;
        error = sysctl_ctx_free( &dev->sysctl->ctx );
 
-       drm_free(dev->sysctl, sizeof *dev->sysctl, DRM_MEM_DRIVER);
+       free(dev->sysctl, M_DRM);
        dev->sysctl = NULL;
 
        return error;
@@ -125,12 +127,12 @@ do {                                                              \
 
 static int drm_name_info DRM_SYSCTL_HANDLER_ARGS
 {
-       drm_device_t *dev = arg1;
+       struct drm_device *dev = arg1;
        char buf[128];
        int retcode;
        int hasunique = 0;
 
-       DRM_SYSCTL_PRINT("%s 0x%x", dev->driver_name, dev2udev(dev->devnode));
+       DRM_SYSCTL_PRINT("%s 0x%x", dev->driver.name, dev2udev(dev->devnode));
        
        DRM_LOCK();
        if (dev->unique) {
@@ -150,9 +152,8 @@ done:
 
 static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS
 {
-       drm_device_t *dev = arg1;
+       struct drm_device *dev = arg1;
        drm_local_map_t *map, *tempmaps;
-       drm_map_list_entry_t    *listentry;
        const char   *types[] = { "FB", "REG", "SHM", "AGP", "SG" };
        const char *type, *yesno;
        int i, mapcount;
@@ -165,18 +166,18 @@ static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS
        DRM_LOCK();
 
        mapcount = 0;
-       TAILQ_FOREACH(listentry, dev->maplist, link)
+       TAILQ_FOREACH(map, &dev->maplist, link)
                mapcount++;
 
-       tempmaps = drm_alloc(sizeof(drm_local_map_t) * mapcount, DRM_MEM_MAPS);
+       tempmaps = malloc(sizeof(drm_local_map_t) * mapcount, M_DRM, M_NOWAIT);
        if (tempmaps == NULL) {
                DRM_UNLOCK();
                return ENOMEM;
        }
 
        i = 0;
-       TAILQ_FOREACH(listentry, dev->maplist, link)
-               tempmaps[i++] = *listentry->map;
+       TAILQ_FOREACH(map, &dev->maplist, link)
+               tempmaps[i++] = *map;
 
        DRM_UNLOCK();
 
@@ -204,13 +205,13 @@ static int drm_vm_info DRM_SYSCTL_HANDLER_ARGS
        SYSCTL_OUT(req, "", 1);
 
 done:
-       drm_free(tempmaps, sizeof(drm_local_map_t) * mapcount, DRM_MEM_MAPS);
+       free(tempmaps, M_DRM);
        return retcode;
 }
 
 static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS
 {
-       drm_device_t     *dev = arg1;
+       struct drm_device        *dev = arg1;
        drm_device_dma_t *dma = dev->dma;
        drm_device_dma_t tempdma;
        int *templists;
@@ -228,7 +229,7 @@ static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS
        }
        DRM_SPINLOCK(&dev->dma_lock);
        tempdma = *dma;
-       templists = drm_alloc(sizeof(int) * dma->buf_count, DRM_MEM_BUFS);
+       templists = malloc(sizeof(int) * dma->buf_count, M_DRM, M_NOWAIT);
        for (i = 0; i < dma->buf_count; i++)
                templists[i] = dma->buflist[i]->list;
        dma = &tempdma;
@@ -260,13 +261,13 @@ static int drm_bufs_info DRM_SYSCTL_HANDLER_ARGS
 
        SYSCTL_OUT(req, "", 1);
 done:
-       drm_free(templists, sizeof(int) * dma->buf_count, DRM_MEM_BUFS);
+       free(templists, M_DRM);
        return retcode;
 }
 
 static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS
 {
-       drm_device_t *dev = arg1;
+       struct drm_device *dev = arg1;
        drm_file_t *priv, *tempprivs;
        char buf[128];
        int retcode;
@@ -278,7 +279,7 @@ static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS
        TAILQ_FOREACH(priv, &dev->files, link)
                privcount++;
 
-       tempprivs = drm_alloc(sizeof(drm_file_t) * privcount, DRM_MEM_FILES);
+       tempprivs = malloc(sizeof(drm_file_t) * privcount, M_DRM, M_NOWAIT);
        if (tempprivs == NULL) {
                DRM_UNLOCK();
                return ENOMEM;
@@ -303,19 +304,6 @@ static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS
 
        SYSCTL_OUT(req, "", 1);
 done:
-       drm_free(tempprivs, sizeof(drm_file_t) * privcount, DRM_MEM_FILES);
+       free(tempprivs, M_DRM);
        return retcode;
 }
-
-#elif defined(__NetBSD__)
-/* stub it out for now, sysctl is only for debugging */
-int drm_sysctl_init(drm_device_t *dev)
-{
-       return 0;
-}
-
-int drm_sysctl_cleanup(drm_device_t *dev)
-{
-       return 0;
-}
-#endif