2 * Copyright © 2008 Nicolai Haehnle
3 * Copyright © 2008 Jérôme Glisse
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * 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:
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
28 * Aapo Tahkola <aet@rasterburn.org>
29 * Nicolai Haehnle <prefect_@gmx.net>
30 * Jérôme Glisse <glisse@freedesktop.org>
38 #include "radeon_drm.h"
40 struct radeon_cs_reloc
{
43 uint32_t write_domain
;
48 #define RADEON_CS_SPACE_OK 0
49 #define RADEON_CS_SPACE_OP_TO_BIG 1
50 #define RADEON_CS_SPACE_FLUSH 2
52 struct radeon_cs_space_check
{
54 uint32_t read_domains
;
55 uint32_t write_domain
;
56 uint32_t new_accounted
;
59 struct radeon_cs_manager
;
62 struct radeon_cs_manager
*csm
;
66 unsigned relocs_total_size
;
72 const char *section_file
;
73 const char *section_func
;
79 struct radeon_cs_funcs
{
80 struct radeon_cs
*(*cs_create
)(struct radeon_cs_manager
*csm
,
82 int (*cs_write_reloc
)(struct radeon_cs
*cs
,
85 uint32_t write_domain
,
87 int (*cs_begin
)(struct radeon_cs
*cs
,
92 int (*cs_end
)(struct radeon_cs
*cs
,
96 int (*cs_emit
)(struct radeon_cs
*cs
);
97 int (*cs_destroy
)(struct radeon_cs
*cs
);
98 int (*cs_erase
)(struct radeon_cs
*cs
);
99 int (*cs_need_flush
)(struct radeon_cs
*cs
);
100 void (*cs_print
)(struct radeon_cs
*cs
, FILE *file
);
101 int (*cs_space_check
)(struct radeon_cs
*cs
, struct radeon_cs_space_check
*bos
,
105 struct radeon_cs_manager
{
106 struct radeon_cs_funcs
*funcs
;
108 uint32_t vram_limit
, gart_limit
;
109 uint32_t vram_write_used
, gart_write_used
;
113 static inline struct radeon_cs
*radeon_cs_create(struct radeon_cs_manager
*csm
,
116 return csm
->funcs
->cs_create(csm
, ndw
);
119 static inline int radeon_cs_write_reloc(struct radeon_cs
*cs
,
120 struct radeon_bo
*bo
,
121 uint32_t read_domain
,
122 uint32_t write_domain
,
125 return cs
->csm
->funcs
->cs_write_reloc(cs
,
132 static inline int radeon_cs_begin(struct radeon_cs
*cs
,
138 return cs
->csm
->funcs
->cs_begin(cs
, ndw
, file
, func
, line
);
141 static inline int radeon_cs_end(struct radeon_cs
*cs
,
146 return cs
->csm
->funcs
->cs_end(cs
, file
, func
, line
);
149 static inline int radeon_cs_emit(struct radeon_cs
*cs
)
151 return cs
->csm
->funcs
->cs_emit(cs
);
154 static inline int radeon_cs_destroy(struct radeon_cs
*cs
)
156 return cs
->csm
->funcs
->cs_destroy(cs
);
159 static inline int radeon_cs_erase(struct radeon_cs
*cs
)
161 return cs
->csm
->funcs
->cs_erase(cs
);
164 static inline int radeon_cs_need_flush(struct radeon_cs
*cs
)
166 return cs
->csm
->funcs
->cs_need_flush(cs
);
169 static inline void radeon_cs_print(struct radeon_cs
*cs
, FILE *file
)
171 cs
->csm
->funcs
->cs_print(cs
, file
);
174 static inline int radeon_cs_space_check(struct radeon_cs
*cs
,
175 struct radeon_cs_space_check
*bos
,
178 return cs
->csm
->funcs
->cs_space_check(cs
, bos
, num_bo
);
181 static inline void radeon_cs_set_limit(struct radeon_cs
*cs
, uint32_t domain
, uint32_t limit
)
184 if (domain
== RADEON_GEM_DOMAIN_VRAM
)
185 cs
->csm
->vram_limit
= limit
;
187 cs
->csm
->gart_limit
= limit
;
190 static inline void radeon_cs_write_dword(struct radeon_cs
*cs
, uint32_t dword
)
192 cs
->packets
[cs
->cdw
++] = dword
;
198 static inline void radeon_cs_write_qword(struct radeon_cs
*cs
, uint64_t qword
)
201 memcpy(cs
->packets
+ cs
->cdw
, &qword
, sizeof(qword
));