Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 1 | /* |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 2 | * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ |
| 3 | * Author: Rob Clark <rob@ti.com> |
| 4 | * Andy Gross <andy.gross@ti.com> |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License as |
| 8 | * published by the Free Software Foundation version 2. |
| 9 | * |
| 10 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any |
| 11 | * kind, whether express or implied; without even the implied warranty |
| 12 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | * GNU General Public License for more details. |
| 14 | */ |
| 15 | #ifndef OMAP_DMM_TILER_H |
| 16 | #define OMAP_DMM_TILER_H |
| 17 | |
| 18 | #include "omap_drv.h" |
| 19 | #include "tcm.h" |
| 20 | |
| 21 | enum tiler_fmt { |
| 22 | TILFMT_8BIT = 0, |
| 23 | TILFMT_16BIT, |
| 24 | TILFMT_32BIT, |
| 25 | TILFMT_PAGE, |
| 26 | TILFMT_NFORMATS |
| 27 | }; |
| 28 | |
| 29 | struct pat_area { |
| 30 | u32 x0:8; |
| 31 | u32 y0:8; |
| 32 | u32 x1:8; |
| 33 | u32 y1:8; |
| 34 | }; |
| 35 | |
| 36 | struct tiler_block { |
| 37 | struct list_head alloc_node; /* node for global block list */ |
| 38 | struct tcm_area area; /* area */ |
| 39 | enum tiler_fmt fmt; /* format */ |
| 40 | }; |
| 41 | |
| 42 | /* bits representing the same slot in DMM-TILER hw-block */ |
| 43 | #define SLOT_WIDTH_BITS 6 |
| 44 | #define SLOT_HEIGHT_BITS 6 |
| 45 | |
| 46 | /* bits reserved to describe coordinates in DMM-TILER hw-block */ |
| 47 | #define CONT_WIDTH_BITS 14 |
| 48 | #define CONT_HEIGHT_BITS 13 |
| 49 | |
| 50 | /* calculated constants */ |
| 51 | #define TILER_PAGE (1 << (SLOT_WIDTH_BITS + SLOT_HEIGHT_BITS)) |
| 52 | #define TILER_WIDTH (1 << (CONT_WIDTH_BITS - SLOT_WIDTH_BITS)) |
| 53 | #define TILER_HEIGHT (1 << (CONT_HEIGHT_BITS - SLOT_HEIGHT_BITS)) |
| 54 | |
Rob Clark | 3c810c6 | 2012-08-15 15:18:01 -0500 | [diff] [blame] | 55 | /* |
| 56 | Table 15-11. Coding and Description of TILER Orientations |
| 57 | S Y X Description Alternate description |
| 58 | 0 0 0 0-degree view Natural view |
| 59 | 0 0 1 0-degree view with vertical mirror 180-degree view with horizontal mirror |
| 60 | 0 1 0 0-degree view with horizontal mirror 180-degree view with vertical mirror |
| 61 | 0 1 1 180-degree view |
| 62 | 1 0 0 90-degree view with vertical mirror 270-degree view with horizontal mirror |
| 63 | 1 0 1 270-degree view |
| 64 | 1 1 0 90-degree view |
| 65 | 1 1 1 90-degree view with horizontal mirror 270-degree view with vertical mirror |
| 66 | */ |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 67 | #define MASK_XY_FLIP (1 << 31) |
| 68 | #define MASK_Y_INVERT (1 << 30) |
| 69 | #define MASK_X_INVERT (1 << 29) |
| 70 | #define SHIFT_ACC_MODE 27 |
| 71 | #define MASK_ACC_MODE 3 |
| 72 | |
| 73 | #define MASK(bits) ((1 << (bits)) - 1) |
| 74 | |
| 75 | #define TILVIEW_8BIT 0x60000000u |
| 76 | #define TILVIEW_16BIT (TILVIEW_8BIT + VIEW_SIZE) |
| 77 | #define TILVIEW_32BIT (TILVIEW_16BIT + VIEW_SIZE) |
| 78 | #define TILVIEW_PAGE (TILVIEW_32BIT + VIEW_SIZE) |
| 79 | #define TILVIEW_END (TILVIEW_PAGE + VIEW_SIZE) |
| 80 | |
| 81 | /* create tsptr by adding view orientation and access mode */ |
| 82 | #define TIL_ADDR(x, orient, a)\ |
| 83 | ((u32) (x) | (orient) | ((a) << SHIFT_ACC_MODE)) |
| 84 | |
Andy Gross | 6169a148 | 2011-12-15 21:05:17 -0600 | [diff] [blame] | 85 | #ifdef CONFIG_DEBUG_FS |
| 86 | int tiler_map_show(struct seq_file *s, void *arg); |
| 87 | #endif |
| 88 | |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 89 | /* pin/unpin */ |
Rob Clark | a6a9182 | 2011-12-09 23:26:08 -0600 | [diff] [blame] | 90 | int tiler_pin(struct tiler_block *block, struct page **pages, |
Laurent Pinchart | dfe9cfc | 2018-02-11 15:07:33 +0200 | [diff] [blame] | 91 | u32 npages, u32 roll, bool wait); |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 92 | int tiler_unpin(struct tiler_block *block); |
| 93 | |
| 94 | /* reserve/release */ |
Laurent Pinchart | dfe9cfc | 2018-02-11 15:07:33 +0200 | [diff] [blame] | 95 | struct tiler_block *tiler_reserve_2d(enum tiler_fmt fmt, u16 w, u16 h, |
| 96 | u16 align); |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 97 | struct tiler_block *tiler_reserve_1d(size_t size); |
| 98 | int tiler_release(struct tiler_block *block); |
| 99 | |
| 100 | /* utilities */ |
| 101 | dma_addr_t tiler_ssptr(struct tiler_block *block); |
Laurent Pinchart | dfe9cfc | 2018-02-11 15:07:33 +0200 | [diff] [blame] | 102 | dma_addr_t tiler_tsptr(struct tiler_block *block, u32 orient, |
| 103 | u32 x, u32 y); |
| 104 | u32 tiler_stride(enum tiler_fmt fmt, u32 orient); |
| 105 | size_t tiler_size(enum tiler_fmt fmt, u16 w, u16 h); |
| 106 | size_t tiler_vsize(enum tiler_fmt fmt, u16 w, u16 h); |
| 107 | void tiler_align(enum tiler_fmt fmt, u16 *w, u16 *h); |
| 108 | u32 tiler_get_cpu_cache_flags(void); |
Andy Gross | e5e4e9b | 2012-10-17 00:30:03 -0500 | [diff] [blame] | 109 | bool dmm_is_available(void); |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 110 | |
Andy Gross | 5c13779 | 2012-03-05 10:48:39 -0600 | [diff] [blame] | 111 | extern struct platform_driver omap_dmm_driver; |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 112 | |
| 113 | /* GEM bo flags -> tiler fmt */ |
Laurent Pinchart | dfe9cfc | 2018-02-11 15:07:33 +0200 | [diff] [blame] | 114 | static inline enum tiler_fmt gem2fmt(u32 flags) |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 115 | { |
| 116 | switch (flags & OMAP_BO_TILED) { |
| 117 | case OMAP_BO_TILED_8: |
| 118 | return TILFMT_8BIT; |
| 119 | case OMAP_BO_TILED_16: |
| 120 | return TILFMT_16BIT; |
| 121 | case OMAP_BO_TILED_32: |
| 122 | return TILFMT_32BIT; |
| 123 | default: |
| 124 | return TILFMT_PAGE; |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | static inline bool validfmt(enum tiler_fmt fmt) |
| 129 | { |
| 130 | switch (fmt) { |
| 131 | case TILFMT_8BIT: |
| 132 | case TILFMT_16BIT: |
| 133 | case TILFMT_32BIT: |
| 134 | case TILFMT_PAGE: |
| 135 | return true; |
| 136 | default: |
| 137 | return false; |
| 138 | } |
| 139 | } |
| 140 | |
Andy Gross | 71e8831 | 2011-12-05 19:19:21 -0600 | [diff] [blame] | 141 | #endif |