r600g: Remove the redundant radeon_new() prototype.
[mesa.git] / src / gallium / winsys / r600 / drm / r600_drm.c
index a7ad96f5a2041d58251b4876e7b64c27a8c55090..69b0a1dcd720ac05f0e0b8c6dbe9f4afcf143bcf 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
+
+enum radeon_family r600_get_family(struct radeon *r600)
+{
+       return r600->family;
+}
+
+enum chip_class r600_get_family_class(struct radeon *radeon)
+{
+       return radeon->chip_class;
+}
+
+struct r600_tiling_info *r600_get_tiling_info(struct radeon *radeon)
+{
+       return &radeon->tiling_info;
+}
+
 static int radeon_get_device(struct radeon *radeon)
 {
        struct drm_radeon_info info;
@@ -49,7 +69,74 @@ static int radeon_get_device(struct radeon *radeon)
        return r;
 }
 
-struct radeon *radeon_new(int fd, unsigned device)
+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 0;
+
+       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;
+}
+
+static int radeon_init_fence(struct radeon *radeon)
+{
+       radeon->fence = 1;
+       radeon->fence_bo = r600_bo(radeon, 4096, 0, 0, 0);
+       if (radeon->fence_bo == NULL) {
+               return -ENOMEM;
+       }
+       radeon->cfence = r600_bo_map(radeon, radeon->fence_bo, PB_USAGE_UNSYNCHRONIZED, NULL);
+       *radeon->cfence = 0;
+       return 0;
+}
+
+static struct radeon *radeon_new(int fd, unsigned device)
 {
        struct radeon *radeon;
        int r;
@@ -73,58 +160,6 @@ struct radeon *radeon_new(int fd, unsigned device)
                fprintf(stderr, "Unknown chipset 0x%04X\n", radeon->device);
                return radeon_decref(radeon);
        }
-       switch (radeon->family) {
-       case CHIP_R600:
-       case CHIP_RV610:
-       case CHIP_RV630:
-       case CHIP_RV670:
-       case CHIP_RV620:
-       case CHIP_RV635:
-       case CHIP_RS780:
-       case CHIP_RS880:
-       case CHIP_RV770:
-       case CHIP_RV730:
-       case CHIP_RV710:
-       case CHIP_RV740:
-       case CHIP_CEDAR:
-       case CHIP_REDWOOD:
-       case CHIP_JUNIPER:
-       case CHIP_CYPRESS:
-       case CHIP_HEMLOCK:
-               break;
-       case CHIP_R100:
-       case CHIP_RV100:
-       case CHIP_RS100:
-       case CHIP_RV200:
-       case CHIP_RS200:
-       case CHIP_R200:
-       case CHIP_RV250:
-       case CHIP_RS300:
-       case CHIP_RV280:
-       case CHIP_R300:
-       case CHIP_R350:
-       case CHIP_RV350:
-       case CHIP_RV380:
-       case CHIP_R420:
-       case CHIP_R423:
-       case CHIP_RV410:
-       case CHIP_RS400:
-       case CHIP_RS480:
-       case CHIP_RS600:
-       case CHIP_RS690:
-       case CHIP_RS740:
-       case CHIP_RV515:
-       case CHIP_R520:
-       case CHIP_RV530:
-       case CHIP_RV560:
-       case CHIP_RV570:
-       case CHIP_R580:
-       default:
-               fprintf(stderr, "%s unknown or unsupported chipset 0x%04X\n",
-                       __func__, radeon->device);
-               break;
-       }
-
        /* setup class */
        switch (radeon->family) {
        case CHIP_R600:
@@ -136,19 +171,29 @@ struct radeon *radeon_new(int fd, unsigned device)
        case CHIP_RS780:
        case CHIP_RS880:
                radeon->chip_class = R600;
+               /* set default group bytes, overridden by tiling info ioctl */
+               radeon->tiling_info.group_bytes = 256;
                break;
        case CHIP_RV770:
        case CHIP_RV730:
        case CHIP_RV710:
        case CHIP_RV740:
                radeon->chip_class = R700;
+               /* set default group bytes, overridden by tiling info ioctl */
+               radeon->tiling_info.group_bytes = 256;
                break;
        case CHIP_CEDAR:
        case CHIP_REDWOOD:
        case CHIP_JUNIPER:
        case CHIP_CYPRESS:
        case CHIP_HEMLOCK:
+       case CHIP_PALM:
+       case CHIP_BARTS:
+       case CHIP_TURKS:
+       case CHIP_CAICOS:
                radeon->chip_class = EVERGREEN;
+               /* set default group bytes, overridden by tiling info ioctl */
+               radeon->tiling_info.group_bytes = 512;
                break;
        default:
                fprintf(stderr, "%s unknown or unsupported chipset 0x%04X\n",
@@ -156,15 +201,19 @@ struct radeon *radeon_new(int fd, unsigned device)
                break;
        }
 
-       radeon->mman = pb_malloc_bufmgr_create();
-       if (!radeon->mman)
-               return NULL;
-       radeon->kman = radeon_bo_pbmgr_create(radeon);
-       if (!radeon->kman)
+       if (radeon->chip_class == R600 || radeon->chip_class == R700) {
+               if (radeon_drm_get_tiling(radeon))
+                       return NULL;
+       }
+       radeon->bomgr = r600_bomgr_create(radeon, 1000000);
+       if (radeon->bomgr == NULL) {
                return NULL;
-       radeon->cman = pb_cache_manager_create(radeon->kman, 100000);
-       if (!radeon->cman)
+       }
+       r = radeon_init_fence(radeon);
+       if (r) {
+               radeon_decref(radeon);
                return NULL;
+       }
        return radeon;
 }
 
@@ -181,10 +230,16 @@ 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->fence_bo) {
+               r600_bo_reference(radeon, &radeon->fence_bo, NULL);
+       }
+
+       if (radeon->bomgr)
+               r600_bomgr_destroy(radeon->bomgr);
+
+       if (radeon->fd >= 0)
+               drmClose(radeon->fd);
+
        free(radeon);
        return NULL;
 }