/* * _tiler.h * * TI TILER driver internal shared definitions. * * Author: Lajos Molnar * * Copyright (C) 2009-2011 Texas Instruments, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _TILER_H #define _TILER_H #include #include #include "tcm.h" #define TILER_FORMATS (TILFMT_MAX - TILFMT_MIN + 1) /* per process (thread group) info */ struct process_info { struct list_head list; /* other processes */ struct list_head groups; /* my groups */ struct list_head bufs; /* my registered buffers */ pid_t pid; /* really: thread group ID */ u32 refs; /* open tiler devices, 0 for processes tracked via kernel APIs */ bool kernel; /* tracking kernel objects */ }; /* per group info (within a process) */ struct gid_info { struct list_head by_pid; /* other groups */ struct list_head areas; /* all areas in this pid/gid */ struct list_head reserved; /* areas pre-reserved */ struct list_head onedim; /* all 1D areas in this pid/gid */ u32 gid; /* group ID */ int refs; /* instances directly using this ptr */ struct process_info *pi; /* parent */ }; /* info for an area reserved from a container */ struct area_info { struct list_head by_gid; /* areas in this pid/gid */ struct list_head blocks; /* blocks in this area */ u32 nblocks; /* # of blocks in this area */ struct tcm_area area; /* area details */ struct gid_info *gi; /* link to parent, if still alive */ }; /* info for a block */ struct mem_info { struct list_head global; /* reserved / global blocks */ struct tiler_block_t blk; /* block info */ u32 num_pg; /* number of pages in page-list */ u32 usr; /* user space address */ u32 *pg_ptr; /* list of mapped struct page ptrs */ struct tcm_area area; u32 *mem; /* list of alloced phys addresses */ int refs; /* number of times referenced */ bool alloced; /* still alloced */ struct list_head by_area; /* blocks in the same area / 1D */ void *parent; /* area info for 2D, else group info */ }; /* tiler geometry information */ struct tiler_geom { u32 x_shft; /* unused X-bits (as part of bpp) */ u32 y_shft; /* unused Y-bits (as part of bpp) */ u32 bpp; /* bytes per pixel */ u32 slot_w; /* width of each slot (in pixels) */ u32 slot_h; /* height of each slot (in pixels) */ u32 bpp_m; /* modified bytes per pixel (=1 for page mode) */ }; /* methods and variables shared between source files */ struct tiler_ops { /* block operations */ s32 (*alloc) (enum tiler_fmt fmt, u32 width, u32 height, u32 align, u32 offs, u32 key, u32 gid, struct process_info *pi, struct mem_info **info); s32 (*map) (enum tiler_fmt fmt, u32 width, u32 height, u32 key, u32 gid, struct process_info *pi, struct mem_info **info, u32 usr_addr); void (*reserve_nv12) (u32 n, u32 width, u32 height, u32 align, u32 offs, u32 gid, struct process_info *pi); void (*reserve) (u32 n, enum tiler_fmt fmt, u32 width, u32 height, u32 align, u32 offs, u32 gid, struct process_info *pi); void (*unreserve) (u32 gid, struct process_info *pi); /* block access operations */ struct mem_info * (*lock) (u32 key, u32 id, struct gid_info *gi); struct mem_info * (*lock_by_ssptr) (u32 sys_addr); void (*describe) (struct mem_info *i, struct tiler_block_info *blk); void (*unlock_free) (struct mem_info *mi, bool free); s32 (*lay_2d) (enum tiler_fmt fmt, u16 n, u16 w, u16 h, u16 band, u16 align, u16 offs, struct gid_info *gi, struct list_head *pos); s32 (*lay_nv12) (int n, u16 w, u16 w1, u16 h, struct gid_info *gi, u8 *p); /* group operations */ struct gid_info * (*get_gi) (struct process_info *pi, u32 gid); void (*release_gi) (struct gid_info *gi); void (*destroy_group) (struct gid_info *pi); /* group access operations */ void (*add_reserved) (struct list_head *reserved, struct gid_info *gi); void (*release) (struct list_head *reserved); /* area operations */ s32 (*analize) (enum tiler_fmt fmt, u32 width, u32 height, u16 *x_area, u16 *y_area, u16 *band, u16 *align, u16 *offs, u16 *in_offs); /* process operations */ void (*cleanup) (void); /* geometry operations */ void (*xy) (u32 ssptr, u32 *x, u32 *y); u32 (*addr) (enum tiler_fmt fmt, u32 x, u32 y); const struct tiler_geom * (*geom) (enum tiler_fmt fmt); /* additional info */ const struct file_operations *fops; bool nv12_packed; /* whether NV12 is packed into same container */ u32 page; /* page size */ u32 width; /* container width */ u32 height; /* container height */ }; void tiler_iface_init(struct tiler_ops *tiler); void tiler_geom_init(struct tiler_ops *tiler); void tiler_reserve_init(struct tiler_ops *tiler); #endif