1848b8605Smrg#ifndef __NOUVEAU_VIDEO_H__
2848b8605Smrg#define __NOUVEAU_VIDEO_H__
3848b8605Smrg
4848b8605Smrg#include "nv17_mpeg.xml.h"
5848b8605Smrg#include "nv31_mpeg.xml.h"
6848b8605Smrg#include "nv_object.xml.h"
7848b8605Smrg
8848b8605Smrg#include "nouveau_winsys.h"
9848b8605Smrg
10848b8605Smrgstruct nouveau_video_buffer {
11848b8605Smrg   struct pipe_video_buffer base;
12848b8605Smrg   unsigned num_planes;
13848b8605Smrg   struct pipe_resource     *resources[VL_NUM_COMPONENTS];
14848b8605Smrg   struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS];
15848b8605Smrg   struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS];
16848b8605Smrg   struct pipe_surface      *surfaces[VL_NUM_COMPONENTS * 2];
17848b8605Smrg};
18848b8605Smrg
19848b8605Smrgstruct nouveau_decoder {
20848b8605Smrg   struct pipe_video_codec base;
21848b8605Smrg   struct nouveau_screen *screen;
22848b8605Smrg   struct nouveau_pushbuf *push;
23848b8605Smrg   struct nouveau_object *chan;
24848b8605Smrg   struct nouveau_client *client;
25848b8605Smrg   struct nouveau_bufctx *bufctx;
26848b8605Smrg   struct nouveau_object *mpeg;
27848b8605Smrg   struct nouveau_bo *cmd_bo, *data_bo, *fence_bo;
28848b8605Smrg
29848b8605Smrg   unsigned *fence_map;
30848b8605Smrg   unsigned fence_seq;
31848b8605Smrg
32848b8605Smrg   unsigned ofs;
33848b8605Smrg   unsigned *cmds;
34848b8605Smrg
35848b8605Smrg   unsigned *data;
36848b8605Smrg   unsigned data_pos;
37848b8605Smrg   unsigned picture_structure;
38848b8605Smrg
39848b8605Smrg   unsigned past, future, current;
40848b8605Smrg   unsigned num_surfaces;
41848b8605Smrg   struct nouveau_video_buffer *surfaces[8];
42848b8605Smrg};
43848b8605Smrg
44848b8605Smrg#define NV31_VIDEO_BIND_IMG(i)  i
45848b8605Smrg#define NV31_VIDEO_BIND_CMD     NV31_MPEG_IMAGE_Y_OFFSET__LEN
46848b8605Smrg#define NV31_VIDEO_BIND_COUNT  (NV31_MPEG_IMAGE_Y_OFFSET__LEN + 1)
47848b8605Smrg
48b8e80941Smrgstatic inline void
49848b8605Smrgnouveau_vpe_write(struct nouveau_decoder *dec, unsigned data) {
50848b8605Smrg   dec->cmds[dec->ofs++] = data;
51848b8605Smrg}
52848b8605Smrg
53848b8605Smrg#define SUBC_MPEG(mthd) 1, mthd
54848b8605Smrg#define NV31_MPEG(mthd) SUBC_MPEG(NV31_MPEG_##mthd)
55848b8605Smrg#define NV84_MPEG(mthd) SUBC_MPEG(NV84_MPEG_##mthd)
56848b8605Smrg
57b8e80941Smrgstatic inline uint32_t
58848b8605SmrgNV04_FIFO_PKHDR(int subc, int mthd, unsigned size)
59848b8605Smrg{
60848b8605Smrg   return 0x00000000 | (size << 18) | (subc << 13) | mthd;
61848b8605Smrg}
62848b8605Smrg
63b8e80941Smrgstatic inline uint32_t
64848b8605SmrgNV04_FIFO_PKHDR_NI(int subc, int mthd, unsigned size)
65848b8605Smrg{
66848b8605Smrg   return 0x40000000 | (size << 18) | (subc << 13) | mthd;
67848b8605Smrg}
68848b8605Smrg
69b8e80941Smrgstatic inline void
70848b8605SmrgBEGIN_NV04(struct nouveau_pushbuf *push, int subc, int mthd, unsigned size)
71848b8605Smrg{
72848b8605Smrg   PUSH_SPACE(push, size + 1);
73848b8605Smrg   PUSH_DATA (push, NV04_FIFO_PKHDR(subc, mthd, size));
74848b8605Smrg}
75848b8605Smrg
76b8e80941Smrgstatic inline void
77848b8605SmrgBEGIN_NI04(struct nouveau_pushbuf *push, int subc, int mthd, unsigned size)
78848b8605Smrg{
79848b8605Smrg   PUSH_SPACE(push, size + 1);
80848b8605Smrg   PUSH_DATA (push, NV04_FIFO_PKHDR_NI(subc, mthd, size));
81848b8605Smrg}
82848b8605Smrg
83b8e80941Smrgstatic inline void
84848b8605SmrgPUSH_MTHDl(struct nouveau_pushbuf *push, int subc, int mthd,
85848b8605Smrg           struct nouveau_bo *bo, uint32_t offset,
86b8e80941Smrg           struct nouveau_bufctx *ctx, int bin, uint32_t rw)
87848b8605Smrg{
88848b8605Smrg   nouveau_bufctx_mthd(ctx, bin, NV04_FIFO_PKHDR(subc, mthd, 1),
89848b8605Smrg                       bo, offset,
90848b8605Smrg                       NOUVEAU_BO_LOW | (bo->flags & NOUVEAU_BO_APER) | rw,
91848b8605Smrg                       0, 0);
92848b8605Smrg
93848b8605Smrg   PUSH_DATA(push, bo->offset + offset);
94848b8605Smrg}
95848b8605Smrg
96848b8605Smrg#endif
97