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(¶ms, 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 = ¶ms.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, ¶ms, 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