Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / gallium / winsys / r600 / drm / r600_drm.c
index a7ad96f5a2041d58251b4876e7b64c27a8c55090..c9de95ffc027fea1bfb1f945db79f5defa05b7d2 100644 (file)
 #include "util/u_inlines.h"
 #include "util/u_debug.h"
 #include <pipebuffer/pb_bufmgr.h>
-#include "radeon_priv.h"
+#include "r600.h"
+#include "r600_priv.h"
 #include "r600_drm_public.h"
 #include "xf86drm.h"
 #include "radeon_drm.h"
 
+#ifndef RADEON_INFO_TILING_CONFIG
+#define RADEON_INFO_TILING_CONFIG 0x6
+#endif
 static int radeon_get_device(struct radeon *radeon)
 {
        struct drm_radeon_info info;
@@ -49,6 +53,61 @@ static int radeon_get_device(struct radeon *radeon)
        return r;
 }
 
+static int radeon_drm_get_tiling(struct radeon *radeon)
+{
+       struct drm_radeon_info info;
+       int r;
+       uint32_t tiling_config;
+
+       info.request = RADEON_INFO_TILING_CONFIG;
+       info.value = (uintptr_t)&tiling_config;
+       r = drmCommandWriteRead(radeon->fd, DRM_RADEON_INFO, &info,
+                               sizeof(struct drm_radeon_info));
+
+       if (r)
+               return r;
+
+       switch ((tiling_config & 0xe) >> 1) {
+       case 0:
+               radeon->tiling_info.num_channels = 1;
+               break;
+       case 1:
+               radeon->tiling_info.num_channels = 2;
+               break;
+       case 2:
+               radeon->tiling_info.num_channels = 4;
+               break;
+       case 3:
+               radeon->tiling_info.num_channels = 8;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       switch ((tiling_config & 0x30) >> 4) {
+       case 0:
+               radeon->tiling_info.num_banks = 4;
+               break;
+       case 1:
+               radeon->tiling_info.num_banks = 8;
+               break;
+       default:
+               return -EINVAL;
+
+       }
+       switch ((tiling_config & 0xc0) >> 6) {
+       case 0:
+               radeon->tiling_info.group_bytes = 256;
+               break;
+       case 1:
+               radeon->tiling_info.group_bytes = 512;
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
 struct radeon *radeon_new(int fd, unsigned device)
 {
        struct radeon *radeon;
@@ -156,9 +215,10 @@ struct radeon *radeon_new(int fd, unsigned device)
                break;
        }
 
-       radeon->mman = pb_malloc_bufmgr_create();
-       if (!radeon->mman)
-               return NULL;
+       if (radeon->chip_class == R600 || radeon->chip_class == R700) {
+               if (radeon_drm_get_tiling(radeon))
+                       return NULL;
+       }
        radeon->kman = radeon_bo_pbmgr_create(radeon);
        if (!radeon->kman)
                return NULL;
@@ -181,10 +241,15 @@ struct radeon *radeon_decref(struct radeon *radeon)
                return NULL;
        }
 
-       radeon->mman->destroy(radeon->mman);
-       radeon->cman->destroy(radeon->cman);
-       radeon->kman->destroy(radeon->kman);
-       drmClose(radeon->fd);
+        if (radeon->cman)
+           radeon->cman->destroy(radeon->cman);
+
+        if (radeon->kman)
+           radeon->kman->destroy(radeon->kman);
+
+        if (radeon->fd >= 0)
+           drmClose(radeon->fd);
+
        free(radeon);
        return NULL;
 }