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_BUFFER_H_
     31 #define _PSB_BUFFER_H_
     32 
     33 #include "psb_drv_video.h"
     34 
     35 //#include "xf86mm.h"
     36 
     37 /* For TopazSC, it indicates the next frame should be skipped */
     38 #define SKIP_NEXT_FRAME   0x800
     39 
     40 typedef struct psb_buffer_s *psb_buffer_p;
     41 
     42 /* VPU = MSVDX */
     43 typedef enum psb_buffer_type_e {
     44     psb_bt_cpu_vpu = 0,                 /* Shared between CPU & Video PU */
     45     psb_bt_cpu_vpu_shared,              /* CPU/VPU can access, and can shared by other process */
     46     psb_bt_surface,                     /* linear surface */
     47     psb_bt_surface_tt,                  /* surface allocated in TT*/
     48 #ifdef PSBVIDEO_MSVDX_DEC_TILING
     49     psb_bt_mmu_tiling,              /* Tiled surface */
     50     psb_bt_surface_tiling,              /* Tiled surface */
     51 #endif
     52     psb_bt_vpu_only,                    /* Only used by Video PU */
     53     psb_bt_cpu_only,                    /* Only used by CPU */
     54     psb_bt_camera,                      /* memory is camera device memory */
     55     psb_bt_imr,                         /* global RAR buffer */
     56     psb_bt_imr_surface,                 /* memory is RAR device memory for protected surface*/
     57     psb_bt_imr_slice,                   /* memory is RAR device memory for slice data */
     58     psb_bt_user_buffer,                 /* memory is from user buffers */
     59     psb_bt_cpu_vpu_cached               /* Cached & CPU/VPU can access */
     60 } psb_buffer_type_t;
     61 
     62 typedef enum psb_buffer_status_e {
     63     psb_bs_unfinished = 0,
     64     psb_bs_ready,
     65     psb_bs_queued,
     66     psb_bs_abandoned
     67 } psb_buffer_status_t;
     68 
     69 struct psb_buffer_s {
     70     struct _WsbmBufferObject *drm_buf;
     71     int wsbm_synccpu_flag;
     72     uint64_t pl_flags;
     73 
     74     psb_buffer_type_t type;
     75     psb_buffer_status_t status;
     76     uint32_t rar_handle;
     77     unsigned int buffer_ofs; /* several buffers may share one BO (camera/RAR), and use offset to distinguish it */
     78     struct psb_buffer_s *next;
     79     unsigned char *user_ptr; /* user pointer for user buffers */
     80     int fd; /* fd of user buffers if it is from GFX; else it is -1*/
     81     psb_driver_data_p driver_data; /* for RAR buffer release */
     82     uint32_t size;
     83     void *handle;
     84     unsigned char *virtual_addr;
     85     int unfence_flag;
     86 };
     87 
     88 /*
     89  * Create buffer
     90  */
     91 VAStatus psb_buffer_create(psb_driver_data_p driver_data,
     92                            unsigned int size,
     93                            psb_buffer_type_t type,
     94                            psb_buffer_p buf
     95                           );
     96 /* flags: 0 indicates cache */
     97 #define PSB_USER_BUFFER_UNCACHED	(0x1)
     98 #define PSB_USER_BUFFER_WC		(0x1<<1)
     99 /*
    100  * Create buffer from user ptr
    101  */
    102 VAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data,
    103                            unsigned int size,
    104                            psb_buffer_type_t type,
    105                            psb_buffer_p buf,
    106                            void * vaddr,
    107                            int fd,
    108                            unsigned int flags
    109                           );
    110 
    111 /*
    112  * Setstatus Buffer
    113  */
    114 int psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement);
    115 
    116 
    117 /*
    118  * Reference buffer
    119  */
    120 VAStatus psb_buffer_reference(psb_driver_data_p driver_data,
    121                               psb_buffer_p buf,
    122                               psb_buffer_p reference_buf
    123                              );
    124 /*
    125  *
    126  */
    127 VAStatus psb_kbuffer_reference(psb_driver_data_p driver_data,
    128                                psb_buffer_p buf,
    129                                int kbuf_handle
    130                               );
    131 
    132 /*
    133  * Suspend buffer
    134  */
    135 void psb__suspend_buffer(psb_driver_data_p driver_data, object_buffer_p obj_buffer);
    136 
    137 /*
    138  * Destroy buffer
    139  */
    140 void psb_buffer_destroy(psb_buffer_p buf);
    141 
    142 /*
    143  * Map buffer
    144  *
    145  * Returns 0 on success
    146  */
    147 int psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */);
    148 
    149 int psb_codedbuf_map_mangle(
    150     VADriverContextP ctx,
    151     object_buffer_p obj_buffer,
    152     void **pbuf /* out */
    153 );
    154 
    155 
    156 /*
    157  * Unmap buffer
    158  *
    159  * Returns 0 on success
    160  */
    161 int psb_buffer_unmap(psb_buffer_p buf);
    162 
    163 #if PSB_MFLD_DUMMY_CODE
    164 /*
    165  * Create buffer from camera device memory
    166  */
    167 VAStatus psb_buffer_create_camera(psb_driver_data_p driver_data,
    168                                   psb_buffer_p buf,
    169                                   int is_v4l2,
    170                                   int id_or_ofs
    171                                  );
    172 
    173 /*
    174  * Create one buffer from user buffer
    175  * id_or_ofs is CI frame ID (actually now is frame offset), or V4L2 buffer offset
    176  * user_ptr :virtual address of user buffer start.
    177  */
    178 VAStatus psb_buffer_create_camera_from_ub(psb_driver_data_p driver_data,
    179         psb_buffer_p buf,
    180         int id_or_ofs,
    181         int size,
    182         const unsigned long * user_ptr);
    183 #endif
    184 VAStatus psb_buffer_reference_imr(psb_driver_data_p driver_data,
    185                                   uint32_t imr_offset,
    186                                   psb_buffer_p buf
    187                                  );
    188 
    189 #endif /* _PSB_BUFFER_H_ */
    190