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