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