radeon_cs.h revision 2fa2db138ba989bfa1a8cd9ab66d83fb7369249e
12fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie/* 22fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Copyright © 2008 Nicolai Haehnle 32fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Copyright © 2008 Jérôme Glisse 42fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * All Rights Reserved. 52fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * 62fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 72fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * copy of this software and associated documentation files (the 82fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * "Software"), to deal in the Software without restriction, including 92fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * without limitation the rights to use, copy, modify, merge, publish, 102fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * distribute, sub license, and/or sell copies of the Software, and to 112fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * permit persons to whom the Software is furnished to do so, subject to 122fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * the following conditions: 132fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * 142fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 152fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 162fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 172fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 182fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 192fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 202fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE. 212fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * 222fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * The above copyright notice and this permission notice (including the 232fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * next paragraph) shall be included in all copies or substantial portions 242fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * of the Software. 252fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie */ 262fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie/* 272fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Authors: 282fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Aapo Tahkola <aet@rasterburn.org> 292fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Nicolai Haehnle <prefect_@gmx.net> 302fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Jérôme Glisse <glisse@freedesktop.org> 312fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie */ 322fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#ifndef RADEON_CS_H 332fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_H 342fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 352fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include <stdint.h> 362fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include <string.h> 372fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include "drm.h" 382fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include "radeon_drm.h" 392fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include "radeon_bo.h" 402fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 412fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs_reloc { 422fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_bo *bo; 432fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t read_domain; 442fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t write_domain; 452fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t flags; 462fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie}; 472fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 482fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 492fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_SPACE_OK 0 502fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_SPACE_OP_TO_BIG 1 512fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_SPACE_FLUSH 2 522fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 532fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs_space_check { 542fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_bo *bo; 552fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t read_domains; 562fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t write_domain; 572fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t new_accounted; 582fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie}; 592fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 602fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs_manager; 612fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 622fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs { 632fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_cs_manager *csm; 642fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie void *relocs; 652fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t *packets; 662fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie unsigned crelocs; 672fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie unsigned relocs_total_size; 682fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie unsigned cdw; 692fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie unsigned ndw; 702fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int section; 712fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie unsigned section_ndw; 722fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie unsigned section_cdw; 732fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *section_file; 742fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *section_func; 752fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int section_line; 762fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 772fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie}; 782fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 792fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie/* cs functions */ 802fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs_funcs { 812fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_cs *(*cs_create)(struct radeon_cs_manager *csm, 822fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t ndw); 832fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_write_reloc)(struct radeon_cs *cs, 842fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_bo *bo, 852fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t read_domain, 862fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t write_domain, 872fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t flags); 882fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_begin)(struct radeon_cs *cs, 892fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t ndw, 902fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *file, 912fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *func, 922fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int line); 932fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_end)(struct radeon_cs *cs, 942fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *file, 952fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *func, 962fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int line); 972fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_emit)(struct radeon_cs *cs); 982fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_destroy)(struct radeon_cs *cs); 992fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_erase)(struct radeon_cs *cs); 1002fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_need_flush)(struct radeon_cs *cs); 1012fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie void (*cs_print)(struct radeon_cs *cs, FILE *file); 1022fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int (*cs_space_check)(struct radeon_cs *cs, struct radeon_cs_space_check *bos, 1032fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int num_bo); 1042fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie}; 1052fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1062fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs_manager { 1072fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_cs_funcs *funcs; 1082fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int fd; 1092fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t vram_limit, gart_limit; 1102fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t vram_write_used, gart_write_used; 1112fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t read_used; 1122fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie}; 1132fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1142fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm, 1152fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t ndw) 1162fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1172fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return csm->funcs->cs_create(csm, ndw); 1182fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1192fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1202fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_write_reloc(struct radeon_cs *cs, 1212fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_bo *bo, 1222fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t read_domain, 1232fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t write_domain, 1242fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t flags) 1252fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1262fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_write_reloc(cs, 1272fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie bo, 1282fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie read_domain, 1292fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie write_domain, 1302fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie flags); 1312fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1322fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1332fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_begin(struct radeon_cs *cs, 1342fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie uint32_t ndw, 1352fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *file, 1362fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *func, 1372fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int line) 1382fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1392fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_begin(cs, ndw, file, func, line); 1402fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1412fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1422fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_end(struct radeon_cs *cs, 1432fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *file, 1442fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie const char *func, 1452fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int line) 1462fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1472fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_end(cs, file, func, line); 1482fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1492fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1502fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_emit(struct radeon_cs *cs) 1512fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1522fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_emit(cs); 1532fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1542fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1552fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_destroy(struct radeon_cs *cs) 1562fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1572fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_destroy(cs); 1582fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1592fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1602fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_erase(struct radeon_cs *cs) 1612fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1622fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_erase(cs); 1632fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1642fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1652fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_need_flush(struct radeon_cs *cs) 1662fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1672fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_need_flush(cs); 1682fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1692fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1702fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline void radeon_cs_print(struct radeon_cs *cs, FILE *file) 1712fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1722fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->csm->funcs->cs_print(cs, file); 1732fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1742fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1752fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline int radeon_cs_space_check(struct radeon_cs *cs, 1762fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie struct radeon_cs_space_check *bos, 1772fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie int num_bo) 1782fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1792fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie return cs->csm->funcs->cs_space_check(cs, bos, num_bo); 1802fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1812fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1822fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline void radeon_cs_set_limit(struct radeon_cs *cs, uint32_t domain, uint32_t limit) 1832fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1842fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1852fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie if (domain == RADEON_GEM_DOMAIN_VRAM) 1862fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->csm->vram_limit = limit; 1872fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie else 1882fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->csm->gart_limit = limit; 1892fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1902fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1912fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline void radeon_cs_write_dword(struct radeon_cs *cs, uint32_t dword) 1922fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 1932fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->packets[cs->cdw++] = dword; 1942fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie if (cs->section) { 1952fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->section_cdw++; 1962fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie } 1972fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 1982fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 1992fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestatic inline void radeon_cs_write_qword(struct radeon_cs *cs, uint64_t qword) 2002fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie{ 2012fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie memcpy(cs->packets + cs->cdw, &qword, sizeof(uint64_t)); 2022fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->cdw += 2; 2032fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie if (cs->section) { 2042fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie cs->section_cdw += 2; 2052fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie } 2062fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie} 2072fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie 2082fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#endif 209