OSDN Git Service

nouveau: add a way to override single pushbuffer memory limits
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Sun, 3 Mar 2013 21:34:38 +0000 (22:34 +0100)
committerMarcin Slusarz <marcin.slusarz@gmail.com>
Tue, 26 Mar 2013 20:08:03 +0000 (21:08 +0100)
Currently single pushbuffer can take up to 80% of VRAM and 80% of GART.
As this value seems to be arbitrary (and user may need to set it differently)
this patch adds support for 2 environment variables:
NOUVEAU_LIBDRM_VRAM_LIMIT_PERCENT (default 80)
NOUVEAU_LIBDRM_GART_LIMIT_PERCENT (default 80)
which will let users override pushbuffer VRAM/GART limits.

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
nouveau/nouveau.c
nouveau/private.h
nouveau/pushbuf.c

index 9b32e31..ee7893b 100644 (file)
@@ -77,6 +77,7 @@ nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev)
        uint64_t chipset, vram, gart, bousage;
        drmVersionPtr ver;
        int ret;
+       char *tmp;
 
 #ifdef DEBUG
        debug_init(getenv("NOUVEAU_LIBDRM_DEBUG"));
@@ -114,14 +115,27 @@ nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev)
                nvdev->have_bo_usage = (bousage != 0);
 
        nvdev->close = close;
+
+       tmp = getenv("NOUVEAU_LIBDRM_VRAM_LIMIT_PERCENT");
+       if (tmp)
+               nvdev->vram_limit_percent = atoi(tmp);
+       else
+               nvdev->vram_limit_percent = 80;
+       tmp = getenv("NOUVEAU_LIBDRM_GART_LIMIT_PERCENT");
+       if (tmp)
+               nvdev->gart_limit_percent = atoi(tmp);
+       else
+               nvdev->gart_limit_percent = 80;
        DRMINITLISTHEAD(&nvdev->bo_list);
        nvdev->base.object.oclass = NOUVEAU_DEVICE_CLASS;
        nvdev->base.lib_version = 0x01000000;
        nvdev->base.chipset = chipset;
        nvdev->base.vram_size = vram;
        nvdev->base.gart_size = gart;
-       nvdev->base.vram_limit = (nvdev->base.vram_size * 80) / 100;
-       nvdev->base.gart_limit = (nvdev->base.gart_size * 80) / 100;
+       nvdev->base.vram_limit =
+               (nvdev->base.vram_size * nvdev->vram_limit_percent) / 100;
+       nvdev->base.gart_limit =
+               (nvdev->base.gart_size * nvdev->gart_limit_percent) / 100;
 
        *pdev = &nvdev->base;
        return 0;
index 8a5cb26..60714b8 100644 (file)
@@ -99,6 +99,7 @@ struct nouveau_device_priv {
        uint32_t *client;
        int nr_client;
        bool have_bo_usage;
+       int gart_limit_percent, vram_limit_percent;
 };
 
 static inline struct nouveau_device_priv *
index e720a08..0fd0c47 100644 (file)
@@ -347,8 +347,10 @@ pushbuf_submit(struct nouveau_pushbuf *push, struct nouveau_object *chan)
                                          &req, sizeof(req));
                nvpb->suffix0 = req.suffix0;
                nvpb->suffix1 = req.suffix1;
-               dev->vram_limit = (req.vram_available * 80) / 100;
-               dev->gart_limit = (req.gart_available * 80) / 100;
+               dev->vram_limit = (req.vram_available *
+                               nouveau_device(dev)->vram_limit_percent) / 100;
+               dev->gart_limit = (req.gart_available *
+                               nouveau_device(dev)->gart_limit_percent) / 100;
 #else
                if (dbg_on(31))
                        ret = -EINVAL;