Subversion Repositories Kolibri OS

Rev

Rev 1404 | Rev 5078 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright 2009 Jerome Glisse.
  3.  * All Rights Reserved.
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the
  7.  * "Software"), to deal in the Software without restriction, including
  8.  * without limitation the rights to use, copy, modify, merge, publish,
  9.  * distribute, sub license, and/or sell copies of the Software, and to
  10.  * permit persons to whom the Software is furnished to do so, subject to
  11.  * the following conditions:
  12.  *
  13.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15.  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  16.  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  17.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  18.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  19.  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  20.  *
  21.  * The above copyright notice and this permission notice (including the
  22.  * next paragraph) shall be included in all copies or substantial portions
  23.  * of the Software.
  24.  *
  25.  */
  26. /*
  27.  * Authors:
  28.  *    Jerome Glisse <glisse@freedesktop.org>
  29.  *    Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
  30.  *    Dave Airlie
  31.  */
  32. #include <ttm/ttm_bo_api.h>
  33. #include <ttm/ttm_bo_driver.h>
  34. #include <ttm/ttm_placement.h>
  35. #include <ttm/ttm_module.h>
  36. #include <ttm/ttm_page_alloc.h>
  37. #include <drm/drmP.h>
  38. #include <drm/radeon_drm.h>
  39. #include <linux/seq_file.h>
  40. #include <linux/slab.h>
  41. #include "radeon_reg.h"
  42. #include "radeon.h"
  43.  
  44. #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
  45.  
  46. static int radeon_ttm_debugfs_init(struct radeon_device *rdev);
  47.  
  48. static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
  49. {
  50.         struct radeon_mman *mman;
  51.         struct radeon_device *rdev;
  52.  
  53.         mman = container_of(bdev, struct radeon_mman, bdev);
  54.         rdev = container_of(mman, struct radeon_device, mman);
  55.         return rdev;
  56. }
  57.  
  58.  
  59. /*
  60.  * Global memory.
  61.  */
  62. static int radeon_ttm_mem_global_init(struct drm_global_reference *ref)
  63. {
  64.         return ttm_mem_global_init(ref->object);
  65. }
  66.  
  67. static void radeon_ttm_mem_global_release(struct drm_global_reference *ref)
  68. {
  69.         ttm_mem_global_release(ref->object);
  70. }
  71.  
  72. static int radeon_ttm_global_init(struct radeon_device *rdev)
  73. {
  74.         struct drm_global_reference *global_ref;
  75.         int r;
  76.  
  77.         rdev->mman.mem_global_referenced = false;
  78.         global_ref = &rdev->mman.mem_global_ref;
  79.         global_ref->global_type = DRM_GLOBAL_TTM_MEM;
  80.         global_ref->size = sizeof(struct ttm_mem_global);
  81.         global_ref->init = &radeon_ttm_mem_global_init;
  82.         global_ref->release = &radeon_ttm_mem_global_release;
  83.         r = drm_global_item_ref(global_ref);
  84.         if (r != 0) {
  85.                 DRM_ERROR("Failed setting up TTM memory accounting "
  86.                           "subsystem.\n");
  87.                 return r;
  88.         }
  89.  
  90.         rdev->mman.bo_global_ref.mem_glob =
  91.                 rdev->mman.mem_global_ref.object;
  92.         global_ref = &rdev->mman.bo_global_ref.ref;
  93.         global_ref->global_type = DRM_GLOBAL_TTM_BO;
  94.         global_ref->size = sizeof(struct ttm_bo_global);
  95.         global_ref->init = &ttm_bo_global_init;
  96.         global_ref->release = &ttm_bo_global_release;
  97.         r = drm_global_item_ref(global_ref);
  98.         if (r != 0) {
  99.                 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
  100.                 drm_global_item_unref(&rdev->mman.mem_global_ref);
  101.                 return r;
  102.         }
  103.  
  104.         rdev->mman.mem_global_referenced = true;
  105.         return 0;
  106. }
  107.  
  108.  
  109. static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
  110. {
  111.         return 0;
  112. }
  113.  
  114. static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
  115.                                 struct ttm_mem_type_manager *man)
  116. {
  117.         struct radeon_device *rdev;
  118.  
  119.         rdev = radeon_get_rdev(bdev);
  120.  
  121.         switch (type) {
  122.         case TTM_PL_SYSTEM:
  123.                 /* System memory */
  124.                 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
  125.                 man->available_caching = TTM_PL_MASK_CACHING;
  126.                 man->default_caching = TTM_PL_FLAG_CACHED;
  127.                 break;
  128.         case TTM_PL_TT:
  129.                 man->func = &ttm_bo_manager_func;
  130.                 man->gpu_offset = rdev->mc.gtt_start;
  131.                 man->available_caching = TTM_PL_MASK_CACHING;
  132.                 man->default_caching = TTM_PL_FLAG_CACHED;
  133.                 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA;
  134. #if __OS_HAS_AGP
  135.                 if (rdev->flags & RADEON_IS_AGP) {
  136.                         if (!(drm_core_has_AGP(rdev->ddev) && rdev->ddev->agp)) {
  137.                                 DRM_ERROR("AGP is not enabled for memory type %u\n",
  138.                                           (unsigned)type);
  139.                                 return -EINVAL;
  140.                         }
  141.                         if (!rdev->ddev->agp->cant_use_aperture)
  142.                                 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
  143.                         man->available_caching = TTM_PL_FLAG_UNCACHED |
  144.                                                  TTM_PL_FLAG_WC;
  145.                         man->default_caching = TTM_PL_FLAG_WC;
  146.                 }
  147. #endif
  148.                 break;
  149.         case TTM_PL_VRAM:
  150.                 /* "On-card" video ram */
  151.                 man->func = &ttm_bo_manager_func;
  152.                 man->gpu_offset = rdev->mc.vram_start;
  153.                 man->flags = TTM_MEMTYPE_FLAG_FIXED |
  154.                              TTM_MEMTYPE_FLAG_MAPPABLE;
  155.                 man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC;
  156.                 man->default_caching = TTM_PL_FLAG_WC;
  157.                 break;
  158.         default:
  159.                 DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
  160.                 return -EINVAL;
  161.         }
  162.         return 0;
  163. }
  164.  
  165. static struct ttm_bo_driver radeon_bo_driver = {
  166. //   .create_ttm_backend_entry = &radeon_create_ttm_backend_entry,
  167. //   .invalidate_caches = &radeon_invalidate_caches,
  168.     .init_mem_type = &radeon_init_mem_type,
  169. //   .evict_flags = &radeon_evict_flags,
  170. //   .move = &radeon_bo_move,
  171. //   .verify_access = &radeon_verify_access,
  172. //   .sync_obj_signaled = &radeon_sync_obj_signaled,
  173. //   .sync_obj_wait = &radeon_sync_obj_wait,
  174. //   .sync_obj_flush = &radeon_sync_obj_flush,
  175. //   .sync_obj_unref = &radeon_sync_obj_unref,
  176. //   .sync_obj_ref = &radeon_sync_obj_ref,
  177. //   .move_notify = &radeon_bo_move_notify,
  178. //   .fault_reserve_notify = &radeon_bo_fault_reserve_notify,
  179. };
  180.  
  181. int radeon_ttm_init(struct radeon_device *rdev)
  182. {
  183.         int r;
  184.  
  185.         r = radeon_ttm_global_init(rdev);
  186.         if (r) {
  187.                 return r;
  188.         }
  189.         /* No others user of address space so set it to 0 */
  190.         r = ttm_bo_device_init(&rdev->mman.bdev,
  191.                                rdev->mman.bo_global_ref.ref.object,
  192.                                &radeon_bo_driver, DRM_FILE_PAGE_OFFSET,
  193.                                rdev->need_dma32);
  194.         if (r) {
  195.                 DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
  196.                 return r;
  197.         }
  198.         rdev->mman.initialized = true;
  199.         r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM,
  200.                                 rdev->mc.real_vram_size >> PAGE_SHIFT);
  201.         if (r) {
  202.                 DRM_ERROR("Failed initializing VRAM heap.\n");
  203.                 return r;
  204.         }
  205.         r = radeon_bo_create(rdev, NULL, 256 * 1024, true,
  206.                                 RADEON_GEM_DOMAIN_VRAM,
  207.                                 &rdev->stollen_vga_memory);
  208.         if (r) {
  209.                 return r;
  210.         }
  211.         r = radeon_bo_reserve(rdev->stollen_vga_memory, false);
  212.         if (r)
  213.                 return r;
  214.         r = radeon_bo_pin(rdev->stollen_vga_memory, RADEON_GEM_DOMAIN_VRAM, NULL);
  215.         radeon_bo_unreserve(rdev->stollen_vga_memory);
  216.         if (r) {
  217.                 radeon_bo_unref(&rdev->stollen_vga_memory);
  218.                 return r;
  219.         }
  220.         DRM_INFO("radeon: %uM of VRAM memory ready\n",
  221.                  (unsigned)rdev->mc.real_vram_size / (1024 * 1024));
  222.         r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_TT,
  223.                                 rdev->mc.gtt_size >> PAGE_SHIFT);
  224.         if (r) {
  225.                 DRM_ERROR("Failed initializing GTT heap.\n");
  226.                 return r;
  227.         }
  228.         DRM_INFO("radeon: %uM of GTT memory ready.\n",
  229.                  (unsigned)(rdev->mc.gtt_size / (1024 * 1024)));
  230.         if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
  231.                 rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping;
  232.         }
  233.  
  234.         r = radeon_ttm_debugfs_init(rdev);
  235.         if (r) {
  236.                 DRM_ERROR("Failed to init debugfs\n");
  237.                 return r;
  238.         }
  239.         return 0;
  240. }
  241.  
  242. static struct vm_operations_struct radeon_ttm_vm_ops;
  243. static const struct vm_operations_struct *ttm_vm_ops = NULL;
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.