0001
0002
0003 #include <linux/module.h>
0004
0005 #include <drm/drm_gem_ttm_helper.h>
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 void drm_gem_ttm_print_info(struct drm_printer *p, unsigned int indent,
0024 const struct drm_gem_object *gem)
0025 {
0026 static const char * const plname[] = {
0027 [ TTM_PL_SYSTEM ] = "system",
0028 [ TTM_PL_TT ] = "tt",
0029 [ TTM_PL_VRAM ] = "vram",
0030 [ TTM_PL_PRIV ] = "priv",
0031
0032 [ 16 ] = "cached",
0033 [ 17 ] = "uncached",
0034 [ 18 ] = "wc",
0035 [ 19 ] = "contig",
0036
0037 [ 21 ] = "pinned",
0038 [ 22 ] = "topdown",
0039 };
0040 const struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
0041
0042 drm_printf_indent(p, indent, "placement=");
0043 drm_print_bits(p, bo->resource->placement, plname, ARRAY_SIZE(plname));
0044 drm_printf(p, "\n");
0045
0046 if (bo->resource->bus.is_iomem)
0047 drm_printf_indent(p, indent, "bus.offset=%lx\n",
0048 (unsigned long)bo->resource->bus.offset);
0049 }
0050 EXPORT_SYMBOL(drm_gem_ttm_print_info);
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 int drm_gem_ttm_vmap(struct drm_gem_object *gem,
0064 struct iosys_map *map)
0065 {
0066 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
0067 int ret;
0068
0069 dma_resv_lock(gem->resv, NULL);
0070 ret = ttm_bo_vmap(bo, map);
0071 dma_resv_unlock(gem->resv);
0072
0073 return ret;
0074 }
0075 EXPORT_SYMBOL(drm_gem_ttm_vmap);
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 void drm_gem_ttm_vunmap(struct drm_gem_object *gem,
0086 struct iosys_map *map)
0087 {
0088 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
0089
0090 dma_resv_lock(gem->resv, NULL);
0091 ttm_bo_vunmap(bo, map);
0092 dma_resv_unlock(gem->resv);
0093 }
0094 EXPORT_SYMBOL(drm_gem_ttm_vunmap);
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104 int drm_gem_ttm_mmap(struct drm_gem_object *gem,
0105 struct vm_area_struct *vma)
0106 {
0107 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
0108 int ret;
0109
0110 ret = ttm_bo_mmap_obj(vma, bo);
0111 if (ret < 0)
0112 return ret;
0113
0114
0115
0116
0117
0118 drm_gem_object_put(gem);
0119
0120 return 0;
0121 }
0122 EXPORT_SYMBOL(drm_gem_ttm_mmap);
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140 int drm_gem_ttm_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
0141 uint32_t handle, uint64_t *offset)
0142 {
0143 struct drm_gem_object *gem;
0144
0145 gem = drm_gem_object_lookup(file, handle);
0146 if (!gem)
0147 return -ENOENT;
0148
0149 *offset = drm_vma_node_offset_addr(&gem->vma_node);
0150
0151 drm_gem_object_put(gem);
0152
0153 return 0;
0154 }
0155 EXPORT_SYMBOL(drm_gem_ttm_dumb_map_offset);
0156
0157 MODULE_DESCRIPTION("DRM gem ttm helpers");
0158 MODULE_LICENSE("GPL");