Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
      3  * Copyright (c) Imagination Technologies Limited, UK
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors:
     26  *    Waldo Bastian <waldo.bastian (at) intel.com>
     27  *
     28  */
     29 
     30 #ifndef _PSB_CMDBUF_H_
     31 #define _PSB_CMDBUF_H_
     32 
     33 #include "psb_drv_video.h"
     34 #include "psb_buffer.h"
     35 //#include "xf86mm.h"
     36 #include "hwdefs/dxva_fw_ctrl.h"
     37 #include "hwdefs/lldma_defs.h"
     38 
     39 #include <stdint.h>
     40 
     41 
     42 #ifdef ANDROID
     43 #define Bool int
     44 #endif
     45 
     46 
     47 typedef struct psb_cmdbuf_s *psb_cmdbuf_p;
     48 
     49 struct psb_cmdbuf_s {
     50     struct psb_buffer_s buf;
     51     unsigned int size;
     52     struct psb_buffer_s reloc_buf;
     53     unsigned int reloc_size;
     54 
     55     struct psb_buffer_s regio_buf;
     56     unsigned int regio_size;
     57     unsigned char * regio_base;
     58     uint32_t *regio_idx;
     59 
     60     /* MTX msg */
     61     unsigned char *MTX_msg;
     62     /* Relocation records */
     63     unsigned char *reloc_base;
     64     struct drm_psb_reloc *reloc_idx;
     65 
     66     /* CMD stream data */
     67     int cmd_count;
     68     int deblock_count;
     69 #ifdef SLICE_HEADER_PARSING
     70     int parse_count;
     71     int decode_flag;
     72 #endif
     73     int oold_count;
     74     int host_be_opp_count;
     75     int frame_info_count;
     76     unsigned char *cmd_base;
     77     unsigned char *cmd_start;
     78     uint32_t *cmd_idx;
     79     uint32_t *cmd_bitstream_size; /* Pointer to bitstream size field in last SR_SETUP */
     80     /* LLDMA records */
     81     unsigned char *lldma_base;
     82     unsigned char *lldma_idx;
     83     unsigned char *lldma_last; /* Pointer to last LLDMA record */
     84 
     85     /* Referenced buffers */
     86     psb_buffer_p *buffer_refs;
     87 
     88     int buffer_refs_count;
     89     int buffer_refs_allocated;
     90     /* Pointer for Register commands */
     91     uint32_t *reg_start;
     92     uint32_t *reg_wt_p;
     93     uint32_t reg_next;
     94     uint32_t reg_flags;
     95     /* Pointer for Rendec Block commands */
     96     uint32_t *rendec_block_start;
     97     uint32_t *rendec_chunk_start;
     98     /* Pointer for Segment commands */
     99     uint32_t *last_next_segment_cmd;
    100     uint32_t first_segment_size;
    101     /* Pointer for Skip block commands */
    102     uint32_t *skip_block_start;
    103     uint32_t skip_condition;
    104 };
    105 
    106 /*
    107  * Create command buffer
    108  */
    109 VAStatus psb_cmdbuf_create(
    110     object_context_p obj_context,
    111     psb_driver_data_p driver_data,
    112     psb_cmdbuf_p cmdbuf);
    113 
    114 /*
    115  * Destroy buffer
    116  */
    117 void psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf);
    118 
    119 /*
    120  * Reset buffer & map
    121  *
    122  * Returns 0 on success
    123  */
    124 int psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf);
    125 
    126 /*
    127  * Unmap buffer
    128  *
    129  * Returns 0 on success
    130  */
    131 int psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf);
    132 
    133 /*
    134  * Reference an addtional buffer "buf" in the command stream
    135  * Returns a reference index that can be used to refer to "buf" in
    136  * relocation records, on error -1 is returned.
    137  */
    138 int psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf);
    139 
    140 /* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
    141  * "addr_in_cmdbuf"
    142  * The relocation is based on the device virtual address of "ref_buffer"
    143  * "buf_offset" is be added to the device virtual address, and the sum is then
    144  * right shifted with "align_shift".
    145  * "mask" determines which bits of the target DWORD will be updated with the so
    146  * constructed address. The remaining bits will be filled with bits from "background".
    147  */
    148 void psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf,
    149                                uint32_t *addr_in_cmdbuf,
    150                                psb_buffer_p ref_buffer,
    151                                uint32_t buf_offset,
    152                                uint32_t mask,
    153                                uint32_t background,
    154                                uint32_t align_shift,
    155                                uint32_t dst_buffer);
    156 
    157 #define RELOC(dest, offset, buf)        psb_cmdbuf_add_relocation(cmdbuf, (uint32_t*) &dest, buf, offset, 0XFFFFFFFF, 0, 0, 1)
    158 #define RELOC_MSG(dest, offset, buf)    psb_cmdbuf_add_relocation(cmdbuf, (uint32_t*) &dest, buf, offset, 0XFFFFFFFF, 0, 0, 0)
    159 #define RELOC_SHIFT4(dest, offset, background, buf)     psb_cmdbuf_add_relocation(cmdbuf, (uint32_t*) &dest, buf, offset, 0X0FFFFFFF, background, 4, 1)
    160 #define RELOC_REGIO(dest, offset, buf, dst)     psb_cmdbuf_add_relocation(cmdbuf, (uint32_t*) &dest, buf, offset, 0XFFFFFFFF, 0, 0, dst)
    161 
    162 /*
    163  * Advances "obj_context" to the next cmdbuf
    164  *
    165  * Returns 0 on success
    166  */
    167 int psb_context_get_next_cmdbuf(object_context_p obj_context);
    168 
    169 int psb_context_submit_deblock(object_context_p obj_context);
    170 
    171 int psb_context_submit_oold(object_context_p obj_context,
    172                             psb_buffer_p src_buf,
    173                             psb_buffer_p dst_buf,
    174                             psb_buffer_p colocate_buffer,
    175                             uint32_t picture_width_in_mb,
    176                             uint32_t frame_height_in_mb,
    177                             uint32_t field_type,
    178                             uint32_t chroma_offset);
    179 
    180 int psb_context_submit_host_be_opp(object_context_p obj_context,
    181                                   psb_buffer_p buf_a,
    182                                   psb_buffer_p buf_b,
    183                                   psb_buffer_p buf_c,
    184                                   uint32_t picture_widht_mb,
    185                                   uint32_t frame_height_mb,
    186                                   uint32_t rotation_flags,
    187                                   uint32_t field_type,
    188                                   uint32_t ext_stride_a,
    189                                   uint32_t chroma_offset_a,
    190                                   uint32_t chroma_offset_b);
    191 
    192 int psb_context_submit_hw_deblock(object_context_p obj_context,
    193                                   psb_buffer_p buf_a,
    194                                   psb_buffer_p buf_b,
    195                                   psb_buffer_p colocate_buffer,
    196                                   uint32_t picture_widht_mb,
    197                                   uint32_t frame_height_mb,
    198                                   uint32_t rotation_flags,
    199                                   uint32_t field_type,
    200                                   uint32_t ext_stride_a,
    201                                   uint32_t chroma_offset_a,
    202                                   uint32_t chroma_offset_b,
    203                                   uint32_t is_oold);
    204 
    205 int psb_context_submit_hw_deblock(object_context_p obj_context,
    206                                   psb_buffer_p buf_a,
    207                                   psb_buffer_p buf_b,
    208                                   psb_buffer_p colocate_buffer,
    209                                   uint32_t picture_widht_mb,
    210                                   uint32_t frame_height_mb,
    211                                   uint32_t rotation_flags,
    212                                   uint32_t field_type,
    213                                   uint32_t ext_stride_a,
    214                                   uint32_t chroma_offset_a,
    215                                   uint32_t chroma_offset_b,
    216                                   uint32_t is_oold);
    217 
    218 /*
    219  * Submits the current cmdbuf
    220  *
    221  * Returns 0 on success
    222  */
    223 int psb_context_submit_cmdbuf(object_context_p obj_context);
    224 
    225 /*
    226  * Flushes the pending cmdbuf
    227  *
    228  * Return 0 on success
    229  */
    230 int psb_context_flush_cmdbuf(object_context_p obj_context);
    231 void psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition);
    232 
    233 /*
    234  * Write a SR_SETUP_CMD referencing a bitstream buffer to the command buffer
    235  *
    236  * The slice data runs from buffer_offset_in_bytes to buffer_offset_in_bytes + size_in_bytes
    237  * The first bit to be processed is buffer_offset_in_bytes + offset_in_bits
    238  *
    239  * TODO: Return something
    240  */
    241 
    242 void psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf,
    243                                       psb_buffer_p bitstream_buf,
    244                                       uint32_t buffer_offset,
    245                                       uint32_t size_in_bytes,
    246                                       uint32_t offset_in_bits,
    247                                       uint32_t flags);
    248 
    249 void psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf,
    250     psb_buffer_p bitstream_buf,
    251     uint32_t buffer_offset,
    252     uint32_t size,
    253     uint32_t dest_offset,
    254     DMA_TYPE type);
    255 
    256 #ifdef SLICE_HEADER_PARSING
    257 void psb_cmdbuf_dma_write_key(psb_cmdbuf_p cmdbuf,
    258                                       uint32_t flags,
    259                                       uint32_t key);
    260 #endif
    261 /*
    262  * Create a command to set registers
    263  */
    264 void psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags);
    265 
    266 void psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val);
    267 
    268 #define psb_cmdbuf_reg_set_RELOC( cmdbuf, reg, buffer,buffer_offset)             \
    269     do { *cmdbuf->cmd_idx++ = reg; RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); } while (0)
    270 
    271 void psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf,
    272                                 uint32_t reg,
    273                                 psb_buffer_p buffer,
    274                                 uint32_t buffer_offset);
    275 
    276 /*
    277  * Finish a command to set registers
    278  */
    279 void psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf);
    280 
    281 /*
    282  * Create a RENDEC command block
    283  */
    284 void psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address);
    285 
    286 #define psb_cmdbuf_rendec_write( cmdbuf, val ) \
    287     do { *cmdbuf->cmd_idx++ = val; } while(0)
    288 
    289 void psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf,
    290                                    unsigned char *block,
    291                                    uint32_t size);
    292 
    293 void psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf,
    294                                      psb_buffer_p buffer,
    295                                      uint32_t buffer_offset);
    296 
    297 typedef enum {
    298     SKIP_ON_CONTEXT_SWITCH = 1,
    299 } E_SKIP_CONDITION;
    300 
    301 /*
    302  * Create a conditional SKIP block
    303  */
    304 void psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition);
    305 
    306 /*
    307  * Terminate a conditional SKIP block
    308  */
    309 void psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf);
    310 
    311 /*
    312  * Terminate a conditional SKIP block
    313  */
    314 void psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf);
    315 /*
    316  * Write RegIO record into buffer
    317  */
    318 int psb_cmdbuf_second_pass(object_context_p obj_context,
    319                            uint32_t OperatingModeCmd,
    320                            unsigned char * pvParamBase,
    321                            uint32_t PicWidthInMbs,
    322                            uint32_t FrameHeightInMbs,
    323                            psb_buffer_p target_buffer,
    324                            uint32_t chroma_offset
    325                           );
    326 
    327 void *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size);
    328 
    329 void psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf,
    330         psb_buffer_p bitstream_buf,
    331         uint32_t size_in_bytes);
    332 
    333 #endif /* _PSB_CMDBUF_H_ */
    334