Subversion Repositories Kolibri OS

Rev

Rev 3764 | 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 <drm/drmP.h>
  37. #include <drm/radeon_drm.h>
  38. #include <linux/seq_file.h>
  39. #include "radeon_reg.h"
  40. #include "radeon.h"
  41.  
  42. #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
  43.  
  44. static int radeon_ttm_debugfs_init(struct radeon_device *rdev);
  45.  
  46. static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
  47. {
  48.         struct radeon_mman *mman;
  49.         struct radeon_device *rdev;
  50.  
  51.         mman = container_of(bdev, struct radeon_mman, bdev);
  52.         rdev = container_of(mman, struct radeon_device, mman);
  53.         return rdev;
  54. }
  55.  
  56.  
  57. /*
  58.  * Global memory.
  59.  */
  60. static int radeon_ttm_mem_global_init(struct ttm_global_reference *ref)
  61. {
  62.         return ttm_mem_global_init(ref->object);
  63. }
  64.  
  65. static void radeon_ttm_mem_global_release(struct ttm_global_reference *ref)
  66. {
  67.         ttm_mem_global_release(ref->object);
  68. }
  69.  
  70. static int radeon_ttm_global_init(struct radeon_device *rdev)
  71. {
  72.         struct ttm_global_reference *global_ref;
  73.         int r;
  74.  
  75.         rdev->mman.mem_global_referenced = false;
  76.         global_ref = &rdev->mman.mem_global_ref;
  77.         global_ref->global_type = TTM_GLOBAL_TTM_MEM;
  78.         global_ref->size = sizeof(struct ttm_mem_global);
  79.         global_ref->init = &radeon_ttm_mem_global_init;
  80.         global_ref->release = &radeon_ttm_mem_global_release;
  81.         r = ttm_global_item_ref(global_ref);
  82.         if (r != 0) {
  83.                 DRM_ERROR("Failed setting up TTM memory accounting "
  84.                           "subsystem.\n");
  85.                 return r;
  86.         }
  87.  
  88.         rdev->mman.bo_global_ref.mem_glob =
  89.                 rdev->mman.mem_global_ref.object;
  90.         global_ref = &rdev->mman.bo_global_ref.ref;
  91.         global_ref->global_type = TTM_GLOBAL_TTM_BO;
  92.         global_ref->size = sizeof(struct ttm_bo_global);
  93.         global_ref->init = &ttm_bo_global_init;
  94.         global_ref->release = &ttm_bo_global_release;
  95.         r = ttm_global_item_ref(global_ref);
  96.         if (r != 0) {
  97.                 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
  98.                 ttm_global_item_unref(&rdev->mman.mem_global_ref);
  99.                 return r;
  100.         }
  101.  
  102.         rdev->mman.mem_global_referenced = true;
  103.         return 0;
  104. }
  105.  
  106.  
  107. struct ttm_backend *radeon_ttm_backend_create(struct radeon_device *rdev);
  108.  
  109.  
  110. static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
  111.                                 struct ttm_mem_type_manager *man)
  112. {
  113.         struct radeon_device *rdev;
  114.  
  115.         rdev = radeon_get_rdev(bdev);
  116.  
  117.         switch (type) {
  118.         case TTM_PL_SYSTEM:
  119.                 /* System memory */
  120.                 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
  121.                 man->available_caching = TTM_PL_MASK_CACHING;
  122.                 man->default_caching = TTM_PL_FLAG_CACHED;
  123.                 break;
  124.         case TTM_PL_TT:
  125.                 man->gpu_offset = rdev->mc.gtt_location;
  126.                 man->available_caching = TTM_PL_MASK_CACHING;
  127.                 man->default_caching = TTM_PL_FLAG_CACHED;
  128.                 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA;
  129. #if __OS_HAS_AGP
  130.                 if (rdev->flags & RADEON_IS_AGP) {
  131.                         if (!(drm_core_has_AGP(rdev->ddev) && rdev->ddev->agp)) {
  132.                                 DRM_ERROR("AGP is not enabled for memory type %u\n",
  133.                                           (unsigned)type);
  134.                                 return -EINVAL;
  135.                         }
  136.                         man->io_offset = rdev->mc.agp_base;
  137.                         man->io_size = rdev->mc.gtt_size;
  138.                         man->io_addr = NULL;
  139.                         if (!rdev->ddev->agp->cant_use_aperture)
  140.                                 man->flags = TTM_MEMTYPE_FLAG_NEEDS_IOREMAP |
  141.                                              TTM_MEMTYPE_FLAG_MAPPABLE;
  142.                         man->available_caching = TTM_PL_FLAG_UNCACHED |
  143.                                                  TTM_PL_FLAG_WC;
  144.                         man->default_caching = TTM_PL_FLAG_WC;
  145.                 } else
  146. #endif
  147.                 {
  148.                         man->io_offset = 0;
  149.                         man->io_size = 0;
  150.                         man->io_addr = NULL;
  151.                 }
  152.                 break;
  153.         case TTM_PL_VRAM:
  154.                 /* "On-card" video ram */
  155.                 man->gpu_offset = rdev->mc.vram_location;
  156.                 man->flags = TTM_MEMTYPE_FLAG_FIXED |
  157.                              TTM_MEMTYPE_FLAG_NEEDS_IOREMAP |
  158.                              TTM_MEMTYPE_FLAG_MAPPABLE;
  159.                 man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC;
  160.                 man->default_caching = TTM_PL_FLAG_WC;
  161.                 man->io_addr = NULL;
  162.                 man->io_offset = rdev->mc.aper_base;
  163.                 man->io_size = rdev->mc.aper_size;
  164.                 break;
  165.         default:
  166.                 DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
  167.                 return -EINVAL;
  168.         }
  169.         return 0;
  170. }
  171.  
  172. static struct ttm_bo_driver radeon_bo_driver = {
  173. //   .create_ttm_backend_entry = &radeon_create_ttm_backend_entry,
  174. //   .invalidate_caches = &radeon_invalidate_caches,
  175.     .init_mem_type = &radeon_init_mem_type,
  176. //   .evict_flags = &radeon_evict_flags,
  177. //   .move = &radeon_bo_move,
  178. //   .verify_access = &radeon_verify_access,
  179. //   .sync_obj_signaled = &radeon_sync_obj_signaled,
  180. //   .sync_obj_wait = &radeon_sync_obj_wait,
  181. //   .sync_obj_flush = &radeon_sync_obj_flush,
  182. //   .sync_obj_unref = &radeon_sync_obj_unref,
  183. //   .sync_obj_ref = &radeon_sync_obj_ref,
  184. //   .move_notify = &radeon_bo_move_notify,
  185. //   .fault_reserve_notify = &radeon_bo_fault_reserve_notify,
  186. };
  187.  
  188. int radeon_ttm_init(struct radeon_device *rdev)
  189. {
  190.         int r;
  191.  
  192.         r = radeon_ttm_global_init(rdev);
  193.         if (r) {
  194.                 return r;
  195.         }
  196.         /* No others user of address space so set it to 0 */
  197.         r = ttm_bo_device_init(&rdev->mman.bdev,
  198.                                rdev->mman.bo_global_ref.ref.object,
  199.                                &radeon_bo_driver, DRM_FILE_PAGE_OFFSET,
  200.                                rdev->need_dma32);
  201.         if (r) {
  202.                 DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
  203.                 return r;
  204.         }
  205.         rdev->mman.initialized = true;
  206.         r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM,
  207.                                 rdev->mc.real_vram_size >> PAGE_SHIFT);
  208.         if (r) {
  209.                 DRM_ERROR("Failed initializing VRAM heap.\n");
  210.                 return r;
  211.         }
  212.         r = radeon_bo_create(rdev, NULL, 256 * 1024, true,
  213.                                 RADEON_GEM_DOMAIN_VRAM,
  214.                                 &rdev->stollen_vga_memory);
  215.         if (r) {
  216.                 return r;
  217.         }
  218.         r = radeon_bo_reserve(rdev->stollen_vga_memory, false);
  219.         if (r)
  220.                 return r;
  221.         r = radeon_bo_pin(rdev->stollen_vga_memory, RADEON_GEM_DOMAIN_VRAM, NULL);
  222.         radeon_bo_unreserve(rdev->stollen_vga_memory);
  223.         if (r) {
  224.                 radeon_bo_unref(&rdev->stollen_vga_memory);
  225.                 return r;
  226.         }
  227.         DRM_INFO("radeon: %uM of VRAM memory ready\n",
  228.                  (unsigned)rdev->mc.real_vram_size / (1024 * 1024));
  229.         r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_TT,
  230.                                 rdev->mc.gtt_size >> PAGE_SHIFT);
  231.         if (r) {
  232.                 DRM_ERROR("Failed initializing GTT heap.\n");
  233.                 return r;
  234.         }
  235.         DRM_INFO("radeon: %uM of GTT memory ready.\n",
  236.                  (unsigned)(rdev->mc.gtt_size / (1024 * 1024)));
  237.         if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
  238.                 rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping;
  239.         }
  240.  
  241.         r = radeon_ttm_debugfs_init(rdev);
  242.         if (r) {
  243.                 DRM_ERROR("Failed to init debugfs\n");
  244.                 return r;
  245.         }
  246.         return 0;
  247. }
  248.  
  249. static struct vm_operations_struct radeon_ttm_vm_ops;
  250. static const struct vm_operations_struct *ttm_vm_ops = NULL;
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.