1fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin/*
2fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * Copyright 2013 Ilia Mirkin
3fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin *
4fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * Permission is hereby granted, free of charge, to any person obtaining a
5fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * copy of this software and associated documentation files (the "Software"),
6fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * to deal in the Software without restriction, including without limitation
7fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * and/or sell copies of the Software, and to permit persons to whom the
9fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * Software is furnished to do so, subject to the following conditions:
10fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin *
11fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * The above copyright notice and this permission notice shall be included in
12fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * all copies or substantial portions of the Software.
13fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin *
14fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin * OTHER DEALINGS IN THE SOFTWARE.
21fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin */
22fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
235eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv50/nv84_video.h"
24fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
25fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinstruct iparm {
26fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct iseqparm {
27fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t chroma_format_idc; // 00
28fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pad[(0x128 - 0x4) / 4];
29fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t log2_max_frame_num_minus4; // 128
30fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pic_order_cnt_type; // 12c
31fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t log2_max_pic_order_cnt_lsb_minus4; // 130
32fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t delta_pic_order_always_zero_flag; // 134
33fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t num_ref_frames; // 138
34fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pic_width_in_mbs_minus1; // 13c
35fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pic_height_in_map_units_minus1; // 140
36fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t frame_mbs_only_flag; // 144
37fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t mb_adaptive_frame_field_flag; // 148
38fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t direct_8x8_inference_flag; // 14c
39fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   } iseqparm; // 000
40fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct ipicparm {
41fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t entropy_coding_mode_flag; // 00
42fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pic_order_present_flag; // 04
43fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t num_slice_groups_minus1; // 08
44fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t slice_group_map_type; // 0c
45fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pad1[0x60 / 4];
46fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t u70; // 70
47fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t u74; // 74
48fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t u78; // 78
49fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t num_ref_idx_l0_active_minus1; // 7c
50fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t num_ref_idx_l1_active_minus1; // 80
51fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t weighted_pred_flag; // 84
52fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t weighted_bipred_idc; // 88
53fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pic_init_qp_minus26; // 8c
54fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t chroma_qp_index_offset; // 90
55fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t deblocking_filter_control_present_flag; // 94
56fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t constrained_intra_pred_flag; // 98
57fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t redundant_pic_cnt_present_flag; // 9c
58fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t transform_8x8_mode_flag; // a0
59fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t pad2[(0x1c8 - 0xa0 - 4) / 4];
60fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t second_chroma_qp_index_offset; // 1c8
61fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t u1cc; // 1cc
62fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t curr_pic_order_cnt; // 1d0
63fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t field_order_cnt[2]; // 1d4
64fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      uint32_t curr_mvidx; // 1dc
65fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      struct iref {
66fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint32_t u00; // 00
67fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint32_t field_is_ref; // 04 // bit0: top, bit1: bottom
68fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint8_t is_long_term; // 08
69fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint8_t non_existing; // 09
703cfe6bc9cc369b29e5475b1bb0c60bbb37a6a1a2Thorsten Glaser         uint8_t u0a; // 0a
713cfe6bc9cc369b29e5475b1bb0c60bbb37a6a1a2Thorsten Glaser         uint8_t u0b; // 0b
72fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint32_t frame_idx; // 0c
73fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint32_t field_order_cnt[2]; // 10
74fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint32_t mvidx; // 18
75fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         uint8_t field_pic_flag; // 1c
763cfe6bc9cc369b29e5475b1bb0c60bbb37a6a1a2Thorsten Glaser         uint8_t u1d; // 1d
773cfe6bc9cc369b29e5475b1bb0c60bbb37a6a1a2Thorsten Glaser         uint8_t u1e; // 1e
783cfe6bc9cc369b29e5475b1bb0c60bbb37a6a1a2Thorsten Glaser         uint8_t u1f; // 1f
79fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         // 20
80fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      } refs[0x10]; // 1e0
81fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   } ipicparm; // 150
82fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin};
83fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
84fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinint
85fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkinnv84_decoder_bsp(struct nv84_decoder *dec,
86fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 struct pipe_h264_picture_desc *desc,
87fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 unsigned num_buffers,
88fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 const void *const *data,
89fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 const unsigned *num_bytes,
90fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                 struct nv84_video_buffer *dest)
91fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin{
92fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct iparm params;
93fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   uint32_t more_params[0x44 / 4] = {0};
94fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   unsigned total_bytes = 0;
95fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   int i;
96fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   static const uint32_t end[] = {0x0b010000, 0, 0x0b010000, 0};
97fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   char indexes[17] = {0};
98fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_pushbuf *push = dec->bsp_pushbuf;
99fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   struct nouveau_pushbuf_refn bo_refs[] = {
100fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      { dec->vpring, NOUVEAU_BO_RDWR | NOUVEAU_BO_VRAM },
101fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      { dec->mbring, NOUVEAU_BO_RDWR | NOUVEAU_BO_VRAM },
102fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      { dec->bitstream, NOUVEAU_BO_RDWR | NOUVEAU_BO_GART },
103fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      { dec->fence, NOUVEAU_BO_RDWR | NOUVEAU_BO_VRAM },
104fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   };
105fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
106fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   nouveau_bo_wait(dec->fence, NOUVEAU_BO_RDWR, dec->client);
107fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
108fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   STATIC_ASSERT(sizeof(struct iparm) == 0x530);
109fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
110fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   memset(&params, 0, sizeof(params));
111fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
112fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   dest->frame_num = dest->frame_num_max = desc->frame_num;
113fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
114fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   for (i = 0; i < 16; i++) {
115fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      struct iref *ref = &params.ipicparm.refs[i];
116fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      struct nv84_video_buffer *frame = (struct nv84_video_buffer *)desc->ref[i];
117fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      if (!frame) break;
118fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      /* The frame index is relative to the last IDR frame. So once the frame
119fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin       * num goes back to 0, previous reference frames need to have a negative
120fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin       * index.
121fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin       */
122fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      if (desc->frame_num >= frame->frame_num_max) {
123fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         frame->frame_num_max = desc->frame_num;
124fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      } else {
125fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         frame->frame_num -= frame->frame_num_max + 1;
126fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         frame->frame_num_max = desc->frame_num;
127fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      }
128fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->non_existing = 0;
129fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->field_is_ref = (desc->top_is_reference[i] ? 1 : 0) |
130fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         (desc->bottom_is_reference[i] ? 2 : 0);
131fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->is_long_term = desc->is_long_term[i];
132fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->field_order_cnt[0] = desc->field_order_cnt_list[i][0];
133fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->field_order_cnt[1] = desc->field_order_cnt_list[i][1];
134fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->frame_idx = frame->frame_num;
135fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->u00 = ref->mvidx = frame->mvidx;
136fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      ref->field_pic_flag = desc->field_pic_flag;
137fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      indexes[frame->mvidx] = 1;
138fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   }
139fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
140fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /* Needs to be adjusted if we ever support non-4:2:0 videos */
141fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.iseqparm.chroma_format_idc = 1;
142fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
143fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.iseqparm.pic_width_in_mbs_minus1 = mb(dec->base.width) - 1;
144925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   if (desc->field_pic_flag || desc->pps->sps->mb_adaptive_frame_field_flag)
145fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      params.iseqparm.pic_height_in_map_units_minus1 = mb_half(dec->base.height) - 1;
146fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   else
147fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      params.iseqparm.pic_height_in_map_units_minus1 = mb(dec->base.height) - 1;
148fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
149fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   if (desc->bottom_field_flag)
150fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      params.ipicparm.curr_pic_order_cnt = desc->field_order_cnt[1];
151fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   else
152fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      params.ipicparm.curr_pic_order_cnt = desc->field_order_cnt[0];
153fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.ipicparm.field_order_cnt[0] = desc->field_order_cnt[0];
154fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.ipicparm.field_order_cnt[1] = desc->field_order_cnt[1];
155fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   if (desc->is_reference) {
156fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      if (dest->mvidx < 0) {
157fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         for (i = 0; i < desc->num_ref_frames + 1; i++) {
158fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin            if (!indexes[i]) {
159fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin               dest->mvidx = i;
160fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin               break;
161fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin            }
162fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         }
163fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin         assert(i != desc->num_ref_frames + 1);
164fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      }
165fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
166fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      params.ipicparm.u1cc = params.ipicparm.curr_mvidx = dest->mvidx;
167fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   }
168fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
169fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.iseqparm.num_ref_frames = desc->num_ref_frames;
170925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.mb_adaptive_frame_field_flag = desc->pps->sps->mb_adaptive_frame_field_flag;
171925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.constrained_intra_pred_flag = desc->pps->constrained_intra_pred_flag;
172925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.weighted_pred_flag = desc->pps->weighted_pred_flag;
173925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.weighted_bipred_idc = desc->pps->weighted_bipred_idc;
174925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.frame_mbs_only_flag = desc->pps->sps->frame_mbs_only_flag;
175925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.transform_8x8_mode_flag = desc->pps->transform_8x8_mode_flag;
176925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.chroma_qp_index_offset = desc->pps->chroma_qp_index_offset;
177925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.second_chroma_qp_index_offset = desc->pps->second_chroma_qp_index_offset;
178925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.pic_init_qp_minus26 = desc->pps->pic_init_qp_minus26;
179fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.ipicparm.num_ref_idx_l0_active_minus1 = desc->num_ref_idx_l0_active_minus1;
180fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   params.ipicparm.num_ref_idx_l1_active_minus1 = desc->num_ref_idx_l1_active_minus1;
181925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.log2_max_frame_num_minus4 = desc->pps->sps->log2_max_frame_num_minus4;
182925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.pic_order_cnt_type = desc->pps->sps->pic_order_cnt_type;
183925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.log2_max_pic_order_cnt_lsb_minus4 = desc->pps->sps->log2_max_pic_order_cnt_lsb_minus4;
184925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.delta_pic_order_always_zero_flag = desc->pps->sps->delta_pic_order_always_zero_flag;
185925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.iseqparm.direct_8x8_inference_flag = desc->pps->sps->direct_8x8_inference_flag;
186925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.entropy_coding_mode_flag = desc->pps->entropy_coding_mode_flag;
187925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.pic_order_present_flag = desc->pps->bottom_field_pic_order_in_frame_present_flag;
188925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.deblocking_filter_control_present_flag = desc->pps->deblocking_filter_control_present_flag;
189925ffa8c4a5760d0f79de6bf1fab52c2d6e83b17Christian König   params.ipicparm.redundant_pic_cnt_present_flag = desc->pps->redundant_pic_cnt_present_flag;
190fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
191fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   memcpy(dec->bitstream->map, &params, sizeof(params));
192fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   for (i = 0; i < num_buffers; i++) {
193fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      assert(total_bytes + num_bytes[i] < dec->bitstream->size / 2 - 0x700);
194fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      memcpy(dec->bitstream->map + 0x700 + total_bytes, data[i], num_bytes[i]);
195fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin      total_bytes += num_bytes[i];
196fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   }
197fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   memcpy(dec->bitstream->map + 0x700 + total_bytes, end, sizeof(end));
198fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   total_bytes += sizeof(end);
199fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   more_params[1] = total_bytes;
200fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   memcpy(dec->bitstream->map + 0x600, more_params, sizeof(more_params));
201fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
202fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_SPACE(push, 5 + 21 + 3 + 2 + 4 + 2);
203be51020f2ad2ce8e8dc4d0f3a79186000fb01454Edward O'Callaghan   nouveau_pushbuf_refn(push, bo_refs, ARRAY_SIZE(bo_refs));
204fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
205fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /* Wait for the fence = 1 */
206fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   BEGIN_NV04(push, SUBC_BSP(0x10), 4);
207fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATAh(push, dec->fence->offset);
208fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->fence->offset);
209fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 1);
210fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 1);
211fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
212fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /* TODO: Use both halves of bitstream/vpring for alternating frames */
213fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
214fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /* Kick off the BSP */
215fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   BEGIN_NV04(push, SUBC_BSP(0x400), 20);
216fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->bitstream->offset >> 8);
217fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, (dec->bitstream->offset >> 8) + 7);
218fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->bitstream->size / 2 - 0x700);
219fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, (dec->bitstream->offset >> 8) + 6);
220fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 1);
221fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->mbring->offset >> 8);
222fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->frame_size);
223fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, (dec->mbring->offset + dec->frame_size) >> 8);
224fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring->offset >> 8);
225fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring->size / 2);
226fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring_residual);
227fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring_ctrl);
228fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0);
229fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring_residual);
230fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring_residual + dec->vpring_ctrl);
231fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->vpring_deblock);
232fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, (dec->vpring->offset + dec->vpring_ctrl +
233fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin                     dec->vpring_residual + dec->vpring_deblock) >> 8);
234fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0x654321);
235fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0);
236fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0x100008);
237fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
238fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   BEGIN_NV04(push, SUBC_BSP(0x620), 2);
239fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0);
240fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0);
241fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
242fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   BEGIN_NV04(push, SUBC_BSP(0x300), 1);
243fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0);
244fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
245fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   /* Write fence = 2, intr */
246fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   BEGIN_NV04(push, SUBC_BSP(0x610), 3);
247fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATAh(push, dec->fence->offset);
248fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, dec->fence->offset);
249fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 2);
250fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin
251fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   BEGIN_NV04(push, SUBC_BSP(0x304), 1);
252fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_DATA (push, 0x101);
253fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   PUSH_KICK (push);
254fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin   return 0;
255fbdae1ca41946af374c7924fd4c296199172890dIlia Mirkin}
256