1/*
2 * Copyright © 2008 Dave Airlie
3 * Copyright © 2008 Jérôme Glisse
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
18 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * The above copyright notice and this permission notice (including the
24 * next paragraph) shall be included in all copies or substantial portions
25 * of the Software.
26 */
27/*
28 * Authors:
29 *      Dave Airlie
30 *      Jérôme Glisse <glisse@freedesktop.org>
31 */
32#ifdef HAVE_CONFIG_H
33#include <config.h>
34#endif
35#include <libdrm.h>
36#include <radeon_bo.h>
37#include <radeon_bo_int.h>
38
39drm_public void radeon_bo_debug(struct radeon_bo *bo, const char *op)
40{
41    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
42
43    fprintf(stderr, "%s %p 0x%08X 0x%08X 0x%08X\n",
44            op, bo, bo->handle, boi->size, boi->cref);
45}
46
47drm_public struct radeon_bo *
48radeon_bo_open(struct radeon_bo_manager *bom, uint32_t handle, uint32_t size,
49	       uint32_t alignment, uint32_t domains, uint32_t flags)
50{
51    struct radeon_bo *bo;
52    bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags);
53    return bo;
54}
55
56drm_public void radeon_bo_ref(struct radeon_bo *bo)
57{
58    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
59    boi->cref++;
60    boi->bom->funcs->bo_ref(boi);
61}
62
63drm_public struct radeon_bo *radeon_bo_unref(struct radeon_bo *bo)
64{
65    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
66    if (bo == NULL)
67        return NULL;
68
69    boi->cref--;
70    return boi->bom->funcs->bo_unref(boi);
71}
72
73drm_public int radeon_bo_map(struct radeon_bo *bo, int write)
74{
75    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
76    return boi->bom->funcs->bo_map(boi, write);
77}
78
79drm_public int radeon_bo_unmap(struct radeon_bo *bo)
80{
81    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
82    return boi->bom->funcs->bo_unmap(boi);
83}
84
85drm_public int radeon_bo_wait(struct radeon_bo *bo)
86{
87    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
88    if (!boi->bom->funcs->bo_wait)
89        return 0;
90    return boi->bom->funcs->bo_wait(boi);
91}
92
93drm_public int radeon_bo_is_busy(struct radeon_bo *bo, uint32_t *domain)
94{
95    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
96    return boi->bom->funcs->bo_is_busy(boi, domain);
97}
98
99drm_public int
100radeon_bo_set_tiling(struct radeon_bo *bo,
101                     uint32_t tiling_flags, uint32_t pitch)
102{
103    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
104    return boi->bom->funcs->bo_set_tiling(boi, tiling_flags, pitch);
105}
106
107drm_public int
108radeon_bo_get_tiling(struct radeon_bo *bo,
109                     uint32_t *tiling_flags, uint32_t *pitch)
110{
111    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
112    return boi->bom->funcs->bo_get_tiling(boi, tiling_flags, pitch);
113}
114
115drm_public int radeon_bo_is_static(struct radeon_bo *bo)
116{
117    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
118    if (boi->bom->funcs->bo_is_static)
119        return boi->bom->funcs->bo_is_static(boi);
120    return 0;
121}
122
123drm_public int
124radeon_bo_is_referenced_by_cs(struct radeon_bo *bo, struct radeon_cs *cs)
125{
126    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
127    return boi->cref > 1;
128}
129
130drm_public uint32_t radeon_bo_get_handle(struct radeon_bo *bo)
131{
132    return bo->handle;
133}
134
135drm_public uint32_t radeon_bo_get_src_domain(struct radeon_bo *bo)
136{
137    struct radeon_bo_int *boi = (struct radeon_bo_int *)bo;
138    uint32_t src_domain;
139
140    src_domain = boi->space_accounted & 0xffff;
141    if (!src_domain)
142        src_domain = boi->space_accounted >> 16;
143
144    return src_domain;
145}
146