Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright © 2007 Intel Corporation |
| 3 | * |
| 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 5 | * copy of this software and associated documentation files (the "Software"), |
| 6 | * to deal in the Software without restriction, including without limitation |
| 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| 8 | * and/or sell copies of the Software, and to permit persons to whom the |
| 9 | * Software is furnished to do so, subject to the following conditions: |
| 10 | * |
| 11 | * The above copyright notice and this permission notice (including the next |
| 12 | * paragraph) shall be included in all copies or substantial portions of the |
| 13 | * Software. |
| 14 | * |
| 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 18 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| 20 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
| 21 | * IN THE SOFTWARE. |
| 22 | * |
| 23 | * Authors: |
| 24 | * Eric Anholt <eric@anholt.net> |
| 25 | * |
| 26 | */ |
| 27 | |
Eric Anholt | 368b392 | 2008-09-10 13:54:34 -0700 | [diff] [blame] | 28 | #ifdef HAVE_CONFIG_H |
| 29 | #include "config.h" |
| 30 | #endif |
| 31 | |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 32 | #include <string.h> |
| 33 | #include <stdlib.h> |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 34 | #include <stdint.h> |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 35 | #include <assert.h> |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 36 | #include <errno.h> |
| 37 | #include <drm.h> |
| 38 | #include <i915_drm.h> |
Chris Wilson | 9d77603 | 2011-06-04 12:47:19 +0100 | [diff] [blame] | 39 | #include <pciaccess.h> |
Emil Velikov | 42465fe | 2015-04-05 15:51:59 +0100 | [diff] [blame] | 40 | #include "libdrm_macros.h" |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 41 | #include "intel_bufmgr.h" |
| 42 | #include "intel_bufmgr_priv.h" |
Chris Wilson | 9d77603 | 2011-06-04 12:47:19 +0100 | [diff] [blame] | 43 | #include "xf86drm.h" |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 44 | |
Eric Anholt | 4b98264 | 2008-10-30 09:33:07 -0700 | [diff] [blame] | 45 | /** @file intel_bufmgr.c |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 46 | * |
| 47 | * Convenience functions for buffer management methods. |
| 48 | */ |
| 49 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 50 | drm_intel_bo * |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 51 | drm_intel_bo_alloc(drm_intel_bufmgr *bufmgr, const char *name, |
| 52 | unsigned long size, unsigned int alignment) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 53 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 54 | return bufmgr->bo_alloc(bufmgr, name, size, alignment); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 55 | } |
| 56 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 57 | drm_intel_bo * |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 58 | drm_intel_bo_alloc_for_render(drm_intel_bufmgr *bufmgr, const char *name, |
| 59 | unsigned long size, unsigned int alignment) |
Eric Anholt | 72abe98 | 2009-02-18 13:06:35 -0800 | [diff] [blame] | 60 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 61 | return bufmgr->bo_alloc_for_render(bufmgr, name, size, alignment); |
Eric Anholt | 72abe98 | 2009-02-18 13:06:35 -0800 | [diff] [blame] | 62 | } |
| 63 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 64 | drm_intel_bo * |
Tvrtko Ursulin | ae8edc7 | 2014-06-19 15:52:03 +0100 | [diff] [blame] | 65 | drm_intel_bo_alloc_userptr(drm_intel_bufmgr *bufmgr, |
| 66 | const char *name, void *addr, |
| 67 | uint32_t tiling_mode, |
| 68 | uint32_t stride, |
| 69 | unsigned long size, |
| 70 | unsigned long flags) |
| 71 | { |
| 72 | if (bufmgr->bo_alloc_userptr) |
| 73 | return bufmgr->bo_alloc_userptr(bufmgr, name, addr, tiling_mode, |
| 74 | stride, size, flags); |
| 75 | return NULL; |
| 76 | } |
| 77 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 78 | drm_intel_bo * |
Jesse Barnes | 3a7dfcd | 2009-10-06 14:34:06 -0700 | [diff] [blame] | 79 | drm_intel_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name, |
| 80 | int x, int y, int cpp, uint32_t *tiling_mode, |
| 81 | unsigned long *pitch, unsigned long flags) |
| 82 | { |
| 83 | return bufmgr->bo_alloc_tiled(bufmgr, name, x, y, cpp, |
| 84 | tiling_mode, pitch, flags); |
| 85 | } |
| 86 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 87 | void |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 88 | drm_intel_bo_reference(drm_intel_bo *bo) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 89 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 90 | bo->bufmgr->bo_reference(bo); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 91 | } |
| 92 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 93 | void |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 94 | drm_intel_bo_unreference(drm_intel_bo *bo) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 95 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 96 | if (bo == NULL) |
| 97 | return; |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 98 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 99 | bo->bufmgr->bo_unreference(bo); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 100 | } |
| 101 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 102 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 103 | drm_intel_bo_map(drm_intel_bo *buf, int write_enable) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 104 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 105 | return buf->bufmgr->bo_map(buf, write_enable); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 106 | } |
| 107 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 108 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 109 | drm_intel_bo_unmap(drm_intel_bo *buf) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 110 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 111 | return buf->bufmgr->bo_unmap(buf); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 112 | } |
| 113 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 114 | int |
Eric Anholt | 4b98264 | 2008-10-30 09:33:07 -0700 | [diff] [blame] | 115 | drm_intel_bo_subdata(drm_intel_bo *bo, unsigned long offset, |
| 116 | unsigned long size, const void *data) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 117 | { |
Eric Anholt | f45305c | 2010-11-01 06:54:58 -0700 | [diff] [blame] | 118 | return bo->bufmgr->bo_subdata(bo, offset, size, data); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 119 | } |
| 120 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 121 | int |
Eric Anholt | 4b98264 | 2008-10-30 09:33:07 -0700 | [diff] [blame] | 122 | drm_intel_bo_get_subdata(drm_intel_bo *bo, unsigned long offset, |
| 123 | unsigned long size, void *data) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 124 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 125 | int ret; |
Yuanhan Liu | ce317a6 | 2011-07-20 16:08:51 +0800 | [diff] [blame] | 126 | if (bo->bufmgr->bo_get_subdata) |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 127 | return bo->bufmgr->bo_get_subdata(bo, offset, size, data); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 128 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 129 | if (size == 0 || data == NULL) |
| 130 | return 0; |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 131 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 132 | ret = drm_intel_bo_map(bo, 0); |
| 133 | if (ret) |
| 134 | return ret; |
| 135 | memcpy(data, (unsigned char *)bo->virtual + offset, size); |
| 136 | drm_intel_bo_unmap(bo); |
| 137 | return 0; |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 138 | } |
| 139 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 140 | void |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 141 | drm_intel_bo_wait_rendering(drm_intel_bo *bo) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 142 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 143 | bo->bufmgr->bo_wait_rendering(bo); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 144 | } |
| 145 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 146 | void |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 147 | drm_intel_bufmgr_destroy(drm_intel_bufmgr *bufmgr) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 148 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 149 | bufmgr->destroy(bufmgr); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 150 | } |
| 151 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 152 | int |
Eric Anholt | 4b98264 | 2008-10-30 09:33:07 -0700 | [diff] [blame] | 153 | drm_intel_bo_exec(drm_intel_bo *bo, int used, |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 154 | drm_clip_rect_t * cliprects, int num_cliprects, int DR4) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 155 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 156 | return bo->bufmgr->bo_exec(bo, used, cliprects, num_cliprects, DR4); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 157 | } |
| 158 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 159 | int |
Zou Nan hai | 66375fd | 2010-06-02 10:07:37 +0800 | [diff] [blame] | 160 | drm_intel_bo_mrb_exec(drm_intel_bo *bo, int used, |
| 161 | drm_clip_rect_t *cliprects, int num_cliprects, int DR4, |
Chris Wilson | 0184bb1 | 2010-12-19 13:01:15 +0000 | [diff] [blame] | 162 | unsigned int rings) |
Zou Nan hai | 66375fd | 2010-06-02 10:07:37 +0800 | [diff] [blame] | 163 | { |
| 164 | if (bo->bufmgr->bo_mrb_exec) |
| 165 | return bo->bufmgr->bo_mrb_exec(bo, used, |
| 166 | cliprects, num_cliprects, DR4, |
Chris Wilson | 0184bb1 | 2010-12-19 13:01:15 +0000 | [diff] [blame] | 167 | rings); |
Zou Nan hai | 66375fd | 2010-06-02 10:07:37 +0800 | [diff] [blame] | 168 | |
Chris Wilson | f395b0a | 2011-04-04 08:57:42 +0100 | [diff] [blame] | 169 | switch (rings) { |
| 170 | case I915_EXEC_DEFAULT: |
| 171 | case I915_EXEC_RENDER: |
Chris Wilson | 6717b75 | 2011-01-12 10:57:46 +0000 | [diff] [blame] | 172 | return bo->bufmgr->bo_exec(bo, used, |
| 173 | cliprects, num_cliprects, DR4); |
Chris Wilson | f395b0a | 2011-04-04 08:57:42 +0100 | [diff] [blame] | 174 | default: |
| 175 | return -ENODEV; |
| 176 | } |
Zou Nan hai | 66375fd | 2010-06-02 10:07:37 +0800 | [diff] [blame] | 177 | } |
| 178 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 179 | void |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 180 | drm_intel_bufmgr_set_debug(drm_intel_bufmgr *bufmgr, int enable_debug) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 181 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 182 | bufmgr->debug = enable_debug; |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 183 | } |
| 184 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 185 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 186 | drm_intel_bufmgr_check_aperture_space(drm_intel_bo ** bo_array, int count) |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 187 | { |
Eric Anholt | 46e9274 | 2008-08-08 13:13:46 -0700 | [diff] [blame] | 188 | return bo_array[0]->bufmgr->check_aperture_space(bo_array, count); |
Eric Anholt | 6a9eb08 | 2008-06-03 09:27:37 -0700 | [diff] [blame] | 189 | } |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 190 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 191 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 192 | drm_intel_bo_flink(drm_intel_bo *bo, uint32_t * name) |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 193 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 194 | if (bo->bufmgr->bo_flink) |
| 195 | return bo->bufmgr->bo_flink(bo, name); |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 196 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 197 | return -ENODEV; |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 198 | } |
| 199 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 200 | int |
Eric Anholt | 4b98264 | 2008-10-30 09:33:07 -0700 | [diff] [blame] | 201 | drm_intel_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset, |
| 202 | drm_intel_bo *target_bo, uint32_t target_offset, |
| 203 | uint32_t read_domains, uint32_t write_domain) |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 204 | { |
Eric Anholt | 4b98264 | 2008-10-30 09:33:07 -0700 | [diff] [blame] | 205 | return bo->bufmgr->bo_emit_reloc(bo, offset, |
| 206 | target_bo, target_offset, |
| 207 | read_domains, write_domain); |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 208 | } |
| 209 | |
Jesse Barnes | b509640 | 2009-09-15 11:02:58 -0700 | [diff] [blame] | 210 | /* For fence registers, not GL fences */ |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 211 | int |
Jesse Barnes | b509640 | 2009-09-15 11:02:58 -0700 | [diff] [blame] | 212 | drm_intel_bo_emit_reloc_fence(drm_intel_bo *bo, uint32_t offset, |
| 213 | drm_intel_bo *target_bo, uint32_t target_offset, |
| 214 | uint32_t read_domains, uint32_t write_domain) |
| 215 | { |
| 216 | return bo->bufmgr->bo_emit_reloc_fence(bo, offset, |
| 217 | target_bo, target_offset, |
| 218 | read_domains, write_domain); |
| 219 | } |
| 220 | |
| 221 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 222 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 223 | drm_intel_bo_pin(drm_intel_bo *bo, uint32_t alignment) |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 224 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 225 | if (bo->bufmgr->bo_pin) |
| 226 | return bo->bufmgr->bo_pin(bo, alignment); |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 227 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 228 | return -ENODEV; |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 229 | } |
| 230 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 231 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 232 | drm_intel_bo_unpin(drm_intel_bo *bo) |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 233 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 234 | if (bo->bufmgr->bo_unpin) |
| 235 | return bo->bufmgr->bo_unpin(bo); |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 236 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 237 | return -ENODEV; |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 238 | } |
| 239 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 240 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 241 | drm_intel_bo_set_tiling(drm_intel_bo *bo, uint32_t * tiling_mode, |
| 242 | uint32_t stride) |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 243 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 244 | if (bo->bufmgr->bo_set_tiling) |
| 245 | return bo->bufmgr->bo_set_tiling(bo, tiling_mode, stride); |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 246 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 247 | *tiling_mode = I915_TILING_NONE; |
| 248 | return 0; |
Eric Anholt | 738e36a | 2008-09-05 10:35:32 +0100 | [diff] [blame] | 249 | } |
Eric Anholt | 9933838 | 2008-10-14 13:18:11 -0700 | [diff] [blame] | 250 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 251 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 252 | drm_intel_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode, |
| 253 | uint32_t * swizzle_mode) |
Eric Anholt | 9933838 | 2008-10-14 13:18:11 -0700 | [diff] [blame] | 254 | { |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 255 | if (bo->bufmgr->bo_get_tiling) |
| 256 | return bo->bufmgr->bo_get_tiling(bo, tiling_mode, swizzle_mode); |
Eric Anholt | 9933838 | 2008-10-14 13:18:11 -0700 | [diff] [blame] | 257 | |
Eric Anholt | d70d605 | 2009-10-06 12:40:42 -0700 | [diff] [blame] | 258 | *tiling_mode = I915_TILING_NONE; |
| 259 | *swizzle_mode = I915_BIT_6_SWIZZLE_NONE; |
| 260 | return 0; |
Eric Anholt | 9933838 | 2008-10-14 13:18:11 -0700 | [diff] [blame] | 261 | } |
Keith Packard | 5b5ce30 | 2009-05-11 13:42:12 -0700 | [diff] [blame] | 262 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 263 | int |
Michał Winiarski | 8b4d57e | 2015-09-09 16:07:10 +0200 | [diff] [blame] | 264 | drm_intel_bo_set_softpin_offset(drm_intel_bo *bo, uint64_t offset) |
| 265 | { |
| 266 | if (bo->bufmgr->bo_set_softpin_offset) |
| 267 | return bo->bufmgr->bo_set_softpin_offset(bo, offset); |
| 268 | |
| 269 | return -ENODEV; |
| 270 | } |
| 271 | |
| 272 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 273 | drm_intel_bo_disable_reuse(drm_intel_bo *bo) |
Keith Packard | 5b5ce30 | 2009-05-11 13:42:12 -0700 | [diff] [blame] | 274 | { |
| 275 | if (bo->bufmgr->bo_disable_reuse) |
| 276 | return bo->bufmgr->bo_disable_reuse(bo); |
| 277 | return 0; |
| 278 | } |
Keith Packard | f57d7f4 | 2009-05-14 16:58:14 -0700 | [diff] [blame] | 279 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 280 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 281 | drm_intel_bo_is_reusable(drm_intel_bo *bo) |
Chris Wilson | 07e7589 | 2010-05-11 08:54:06 +0100 | [diff] [blame] | 282 | { |
| 283 | if (bo->bufmgr->bo_is_reusable) |
| 284 | return bo->bufmgr->bo_is_reusable(bo); |
| 285 | return 0; |
| 286 | } |
| 287 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 288 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 289 | drm_intel_bo_busy(drm_intel_bo *bo) |
Eric Anholt | 8214a65 | 2009-08-27 18:32:07 -0700 | [diff] [blame] | 290 | { |
| 291 | if (bo->bufmgr->bo_busy) |
| 292 | return bo->bufmgr->bo_busy(bo); |
| 293 | return 0; |
| 294 | } |
| 295 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 296 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 297 | drm_intel_bo_madvise(drm_intel_bo *bo, int madv) |
Chris Wilson | 83a35b6 | 2009-11-11 13:04:38 +0000 | [diff] [blame] | 298 | { |
| 299 | if (bo->bufmgr->bo_madvise) |
| 300 | return bo->bufmgr->bo_madvise(bo, madv); |
| 301 | return -1; |
| 302 | } |
| 303 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 304 | int |
Michel Thierry | 3350add | 2015-09-03 15:23:58 +0100 | [diff] [blame] | 305 | drm_intel_bo_use_48b_address_range(drm_intel_bo *bo, uint32_t enable) |
| 306 | { |
| 307 | if (bo->bufmgr->bo_use_48b_address_range) { |
| 308 | bo->bufmgr->bo_use_48b_address_range(bo, enable); |
| 309 | return 0; |
| 310 | } |
| 311 | |
| 312 | return -ENODEV; |
| 313 | } |
| 314 | |
| 315 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 316 | drm_intel_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo) |
Eric Anholt | 769b105 | 2009-10-01 19:09:26 -0700 | [diff] [blame] | 317 | { |
| 318 | return bo->bufmgr->bo_references(bo, target_bo); |
| 319 | } |
| 320 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 321 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 322 | drm_intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id) |
Keith Packard | f57d7f4 | 2009-05-14 16:58:14 -0700 | [diff] [blame] | 323 | { |
| 324 | if (bufmgr->get_pipe_from_crtc_id) |
| 325 | return bufmgr->get_pipe_from_crtc_id(bufmgr, crtc_id); |
| 326 | return -1; |
| 327 | } |
Chris Wilson | 9d77603 | 2011-06-04 12:47:19 +0100 | [diff] [blame] | 328 | |
| 329 | static size_t |
| 330 | drm_intel_probe_agp_aperture_size(int fd) |
| 331 | { |
| 332 | struct pci_device *pci_dev; |
| 333 | size_t size = 0; |
| 334 | int ret; |
| 335 | |
| 336 | ret = pci_system_init(); |
| 337 | if (ret) |
| 338 | goto err; |
| 339 | |
| 340 | /* XXX handle multiple adaptors? */ |
| 341 | pci_dev = pci_device_find_by_slot(0, 0, 2, 0); |
| 342 | if (pci_dev == NULL) |
| 343 | goto err; |
| 344 | |
| 345 | ret = pci_device_probe(pci_dev); |
| 346 | if (ret) |
| 347 | goto err; |
| 348 | |
| 349 | size = pci_dev->regions[2].size; |
| 350 | err: |
| 351 | pci_system_cleanup (); |
| 352 | return size; |
| 353 | } |
| 354 | |
Emil Velikov | 0f8da82 | 2015-03-31 22:32:11 +0100 | [diff] [blame] | 355 | int |
Maarten Lankhorst | 07fead4 | 2014-07-31 15:07:27 +0200 | [diff] [blame] | 356 | drm_intel_get_aperture_sizes(int fd, size_t *mappable, size_t *total) |
Chris Wilson | 9d77603 | 2011-06-04 12:47:19 +0100 | [diff] [blame] | 357 | { |
| 358 | |
| 359 | struct drm_i915_gem_get_aperture aperture; |
| 360 | int ret; |
| 361 | |
| 362 | ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture); |
| 363 | if (ret) |
| 364 | return ret; |
| 365 | |
| 366 | *mappable = 0; |
| 367 | /* XXX add a query for the kernel value? */ |
| 368 | if (*mappable == 0) |
| 369 | *mappable = drm_intel_probe_agp_aperture_size(fd); |
| 370 | if (*mappable == 0) |
| 371 | *mappable = 64 * 1024 * 1024; /* minimum possible value */ |
| 372 | *total = aperture.aper_size; |
| 373 | return 0; |
| 374 | } |