17ec681f3Smrg/*
27ec681f3Smrg * Copyright (C) 2014-2015 Etnaviv Project
37ec681f3Smrg *
47ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
57ec681f3Smrg * copy of this software and associated documentation files (the "Software"),
67ec681f3Smrg * to deal in the Software without restriction, including without limitation
77ec681f3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
87ec681f3Smrg * and/or sell copies of the Software, and to permit persons to whom the
97ec681f3Smrg * Software is furnished to do so, subject to the following conditions:
107ec681f3Smrg *
117ec681f3Smrg * The above copyright notice and this permission notice (including the next
127ec681f3Smrg * paragraph) shall be included in all copies or substantial portions of the
137ec681f3Smrg * Software.
147ec681f3Smrg *
157ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167ec681f3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177ec681f3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187ec681f3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
197ec681f3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
207ec681f3Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
217ec681f3Smrg * SOFTWARE.
227ec681f3Smrg *
237ec681f3Smrg * Authors:
247ec681f3Smrg *    Christian Gmeiner <christian.gmeiner@gmail.com>
257ec681f3Smrg */
267ec681f3Smrg
277ec681f3Smrg#ifndef ETNAVIV_DRMIF_H_
287ec681f3Smrg#define ETNAVIV_DRMIF_H_
297ec681f3Smrg
307ec681f3Smrg#include <xf86drm.h>
317ec681f3Smrg#include <stdbool.h>
327ec681f3Smrg#include <stdint.h>
337ec681f3Smrg
347ec681f3Smrgstruct etna_bo;
357ec681f3Smrgstruct etna_pipe;
367ec681f3Smrgstruct etna_gpu;
377ec681f3Smrgstruct etna_device;
387ec681f3Smrgstruct etna_cmd_stream;
397ec681f3Smrgstruct etna_perfmon;
407ec681f3Smrgstruct etna_perfmon_domain;
417ec681f3Smrgstruct etna_perfmon_signal;
427ec681f3Smrg
437ec681f3Smrgenum etna_pipe_id {
447ec681f3Smrg	ETNA_PIPE_3D = 0,
457ec681f3Smrg	ETNA_PIPE_2D = 1,
467ec681f3Smrg	ETNA_PIPE_VG = 2,
477ec681f3Smrg	ETNA_PIPE_MAX
487ec681f3Smrg};
497ec681f3Smrg
507ec681f3Smrgenum etna_param_id {
517ec681f3Smrg	ETNA_GPU_MODEL                     = 0x1,
527ec681f3Smrg	ETNA_GPU_REVISION                  = 0x2,
537ec681f3Smrg	ETNA_GPU_FEATURES_0                = 0x3,
547ec681f3Smrg	ETNA_GPU_FEATURES_1                = 0x4,
557ec681f3Smrg	ETNA_GPU_FEATURES_2                = 0x5,
567ec681f3Smrg	ETNA_GPU_FEATURES_3                = 0x6,
577ec681f3Smrg	ETNA_GPU_FEATURES_4                = 0x7,
587ec681f3Smrg	ETNA_GPU_FEATURES_5                = 0x8,
597ec681f3Smrg	ETNA_GPU_FEATURES_6                = 0x9,
607ec681f3Smrg	ETNA_GPU_FEATURES_7                = 0xa,
617ec681f3Smrg	ETNA_GPU_FEATURES_8                = 0xb,
627ec681f3Smrg
637ec681f3Smrg	ETNA_GPU_STREAM_COUNT              = 0x10,
647ec681f3Smrg	ETNA_GPU_REGISTER_MAX              = 0x11,
657ec681f3Smrg	ETNA_GPU_THREAD_COUNT              = 0x12,
667ec681f3Smrg	ETNA_GPU_VERTEX_CACHE_SIZE         = 0x13,
677ec681f3Smrg	ETNA_GPU_SHADER_CORE_COUNT         = 0x14,
687ec681f3Smrg	ETNA_GPU_PIXEL_PIPES               = 0x15,
697ec681f3Smrg	ETNA_GPU_VERTEX_OUTPUT_BUFFER_SIZE = 0x16,
707ec681f3Smrg	ETNA_GPU_BUFFER_SIZE               = 0x17,
717ec681f3Smrg	ETNA_GPU_INSTRUCTION_COUNT         = 0x18,
727ec681f3Smrg	ETNA_GPU_NUM_CONSTANTS             = 0x19,
737ec681f3Smrg	ETNA_GPU_NUM_VARYINGS              = 0x1a
747ec681f3Smrg};
757ec681f3Smrg
767ec681f3Smrg/* bo flags: */
777ec681f3Smrg#define DRM_ETNA_GEM_CACHE_CACHED       0x00010000
787ec681f3Smrg#define DRM_ETNA_GEM_CACHE_WC           0x00020000
797ec681f3Smrg#define DRM_ETNA_GEM_CACHE_UNCACHED     0x00040000
807ec681f3Smrg#define DRM_ETNA_GEM_CACHE_MASK         0x000f0000
817ec681f3Smrg/* map flags */
827ec681f3Smrg#define DRM_ETNA_GEM_FORCE_MMU          0x00100000
837ec681f3Smrg
847ec681f3Smrg/* bo access flags: (keep aligned to ETNA_PREP_x) */
857ec681f3Smrg#define DRM_ETNA_PREP_READ              0x01
867ec681f3Smrg#define DRM_ETNA_PREP_WRITE             0x02
877ec681f3Smrg#define DRM_ETNA_PREP_NOSYNC            0x04
887ec681f3Smrg
897ec681f3Smrg/* device functions:
907ec681f3Smrg */
917ec681f3Smrg
927ec681f3Smrg#define ETNA_DRM_VERSION(major, minor) ((major) << 16 | (minor))
937ec681f3Smrg
947ec681f3Smrgstruct etna_device *etna_device_new(int fd);
957ec681f3Smrgstruct etna_device *etna_device_new_dup(int fd);
967ec681f3Smrgstruct etna_device *etna_device_ref(struct etna_device *dev);
977ec681f3Smrgvoid etna_device_del(struct etna_device *dev);
987ec681f3Smrgint etna_device_fd(struct etna_device *dev);
997ec681f3Smrgbool etnaviv_device_softpin_capable(struct etna_device *dev);
1007ec681f3Smrguint32_t etnaviv_device_version(struct etna_device *dev);
1017ec681f3Smrg
1027ec681f3Smrg/* gpu functions:
1037ec681f3Smrg */
1047ec681f3Smrg
1057ec681f3Smrgstruct etna_gpu *etna_gpu_new(struct etna_device *dev, unsigned int core);
1067ec681f3Smrgvoid etna_gpu_del(struct etna_gpu *gpu);
1077ec681f3Smrgint etna_gpu_get_param(struct etna_gpu *gpu, enum etna_param_id param,
1087ec681f3Smrg		uint64_t *value);
1097ec681f3Smrg
1107ec681f3Smrg
1117ec681f3Smrg/* pipe functions:
1127ec681f3Smrg */
1137ec681f3Smrg
1147ec681f3Smrgstruct etna_pipe *etna_pipe_new(struct etna_gpu *gpu, enum etna_pipe_id id);
1157ec681f3Smrgvoid etna_pipe_del(struct etna_pipe *pipe);
1167ec681f3Smrgint etna_pipe_wait_ns(struct etna_pipe *pipe, uint32_t timestamp, uint64_t ns);
1177ec681f3Smrg
1187ec681f3Smrg
1197ec681f3Smrg/* buffer-object functions:
1207ec681f3Smrg */
1217ec681f3Smrg
1227ec681f3Smrgstruct etna_bo *etna_bo_new(struct etna_device *dev,
1237ec681f3Smrg		uint32_t size, uint32_t flags);
1247ec681f3Smrgstruct etna_bo *etna_bo_from_name(struct etna_device *dev, uint32_t name);
1257ec681f3Smrgstruct etna_bo *etna_bo_from_dmabuf(struct etna_device *dev, int fd);
1267ec681f3Smrgstruct etna_bo *etna_bo_ref(struct etna_bo *bo);
1277ec681f3Smrgvoid etna_bo_del(struct etna_bo *bo);
1287ec681f3Smrgint etna_bo_get_name(struct etna_bo *bo, uint32_t *name);
1297ec681f3Smrguint32_t etna_bo_handle(struct etna_bo *bo);
1307ec681f3Smrgint etna_bo_dmabuf(struct etna_bo *bo);
1317ec681f3Smrguint32_t etna_bo_size(struct etna_bo *bo);
1327ec681f3Smrguint32_t etna_bo_gpu_va(struct etna_bo *bo);
1337ec681f3Smrgvoid * etna_bo_map(struct etna_bo *bo);
1347ec681f3Smrgint etna_bo_cpu_prep(struct etna_bo *bo, uint32_t op);
1357ec681f3Smrgvoid etna_bo_cpu_fini(struct etna_bo *bo);
1367ec681f3Smrg
1377ec681f3Smrg
1387ec681f3Smrg/* cmd stream functions:
1397ec681f3Smrg */
1407ec681f3Smrg
1417ec681f3Smrgstruct etna_cmd_stream {
1427ec681f3Smrg	uint32_t *buffer;
1437ec681f3Smrg	uint32_t offset;	/* in 32-bit words */
1447ec681f3Smrg	uint32_t size;		/* in 32-bit words */
1457ec681f3Smrg};
1467ec681f3Smrg
1477ec681f3Smrgstruct etna_cmd_stream *etna_cmd_stream_new(struct etna_pipe *pipe, uint32_t size,
1487ec681f3Smrg		void (*reset_notify)(struct etna_cmd_stream *stream, void *priv),
1497ec681f3Smrg		void *priv);
1507ec681f3Smrgvoid etna_cmd_stream_del(struct etna_cmd_stream *stream);
1517ec681f3Smrguint32_t etna_cmd_stream_timestamp(struct etna_cmd_stream *stream);
1527ec681f3Smrgvoid etna_cmd_stream_flush(struct etna_cmd_stream *stream, int in_fence_fd,
1537ec681f3Smrg			    int *out_fence_fd);
1547ec681f3Smrgvoid etna_cmd_stream_force_flush(struct etna_cmd_stream *stream);
1557ec681f3Smrg
1567ec681f3Smrgstatic inline uint32_t etna_cmd_stream_avail(struct etna_cmd_stream *stream)
1577ec681f3Smrg{
1587ec681f3Smrg	static const uint32_t END_CLEARANCE = 2; /* LINK op code */
1597ec681f3Smrg
1607ec681f3Smrg	return stream->size - stream->offset - END_CLEARANCE;
1617ec681f3Smrg}
1627ec681f3Smrg
1637ec681f3Smrgvoid etna_cmd_stream_realloc(struct etna_cmd_stream *stream, size_t n);
1647ec681f3Smrg
1657ec681f3Smrgstatic inline void etna_cmd_stream_reserve(struct etna_cmd_stream *stream, size_t n)
1667ec681f3Smrg{
1677ec681f3Smrg	if (etna_cmd_stream_avail(stream) < n)
1687ec681f3Smrg		etna_cmd_stream_realloc(stream, n);
1697ec681f3Smrg}
1707ec681f3Smrg
1717ec681f3Smrgstatic inline void etna_cmd_stream_emit(struct etna_cmd_stream *stream, uint32_t data)
1727ec681f3Smrg{
1737ec681f3Smrg	stream->buffer[stream->offset++] = data;
1747ec681f3Smrg}
1757ec681f3Smrg
1767ec681f3Smrgstatic inline uint32_t etna_cmd_stream_get(struct etna_cmd_stream *stream, uint32_t offset)
1777ec681f3Smrg{
1787ec681f3Smrg	return stream->buffer[offset];
1797ec681f3Smrg}
1807ec681f3Smrg
1817ec681f3Smrgstatic inline void etna_cmd_stream_set(struct etna_cmd_stream *stream, uint32_t offset,
1827ec681f3Smrg		uint32_t data)
1837ec681f3Smrg{
1847ec681f3Smrg	stream->buffer[offset] = data;
1857ec681f3Smrg}
1867ec681f3Smrg
1877ec681f3Smrgstatic inline uint32_t etna_cmd_stream_offset(struct etna_cmd_stream *stream)
1887ec681f3Smrg{
1897ec681f3Smrg	return stream->offset;
1907ec681f3Smrg}
1917ec681f3Smrg
1927ec681f3Smrgstruct etna_reloc {
1937ec681f3Smrg	struct etna_bo *bo;
1947ec681f3Smrg#define ETNA_RELOC_READ             0x0001
1957ec681f3Smrg#define ETNA_RELOC_WRITE            0x0002
1967ec681f3Smrg	uint32_t flags;
1977ec681f3Smrg	uint32_t offset;
1987ec681f3Smrg};
1997ec681f3Smrg
2007ec681f3Smrgvoid etna_cmd_stream_reloc(struct etna_cmd_stream *stream, const struct etna_reloc *r);
2017ec681f3Smrgvoid etna_cmd_stream_ref_bo(struct etna_cmd_stream *stream,
2027ec681f3Smrg		struct etna_bo *bo, uint32_t flags);
2037ec681f3Smrg
2047ec681f3Smrg/* performance monitoring functions:
2057ec681f3Smrg */
2067ec681f3Smrg
2077ec681f3Smrgstruct etna_perfmon *etna_perfmon_create(struct etna_pipe *pipe);
2087ec681f3Smrgvoid etna_perfmon_del(struct etna_perfmon *perfmon);
2097ec681f3Smrgstruct etna_perfmon_domain *etna_perfmon_get_dom_by_name(struct etna_perfmon *pm, const char *name);
2107ec681f3Smrgstruct etna_perfmon_signal *etna_perfmon_get_sig_by_name(struct etna_perfmon_domain *dom, const char *name);
2117ec681f3Smrg
2127ec681f3Smrgstruct etna_perf {
2137ec681f3Smrg#define ETNA_PM_PROCESS_PRE             0x0001
2147ec681f3Smrg#define ETNA_PM_PROCESS_POST            0x0002
2157ec681f3Smrg	uint32_t flags;
2167ec681f3Smrg	uint32_t sequence;
2177ec681f3Smrg	struct etna_perfmon_signal *signal;
2187ec681f3Smrg	struct etna_bo *bo;
2197ec681f3Smrg	uint32_t offset;
2207ec681f3Smrg};
2217ec681f3Smrg
2227ec681f3Smrgvoid etna_cmd_stream_perf(struct etna_cmd_stream *stream, const struct etna_perf *p);
2237ec681f3Smrg
2247ec681f3Smrg#endif /* ETNAVIV_DRMIF_H_ */
225