1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 3*4882a593Smuzhiyun * Author: Rob Clark <rob@ti.com> 4*4882a593Smuzhiyun * Andy Gross <andy.gross@ti.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or 7*4882a593Smuzhiyun * modify it under the terms of the GNU General Public License as 8*4882a593Smuzhiyun * published by the Free Software Foundation version 2. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * This program is distributed "as is" WITHOUT ANY WARRANTY of any 11*4882a593Smuzhiyun * kind, whether express or implied; without even the implied warranty 12*4882a593Smuzhiyun * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*4882a593Smuzhiyun * GNU General Public License for more details. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifndef OMAP_DMM_PRIV_H 17*4882a593Smuzhiyun #define OMAP_DMM_PRIV_H 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define DMM_REVISION 0x000 20*4882a593Smuzhiyun #define DMM_HWINFO 0x004 21*4882a593Smuzhiyun #define DMM_LISA_HWINFO 0x008 22*4882a593Smuzhiyun #define DMM_DMM_SYSCONFIG 0x010 23*4882a593Smuzhiyun #define DMM_LISA_LOCK 0x01C 24*4882a593Smuzhiyun #define DMM_LISA_MAP__0 0x040 25*4882a593Smuzhiyun #define DMM_LISA_MAP__1 0x044 26*4882a593Smuzhiyun #define DMM_TILER_HWINFO 0x208 27*4882a593Smuzhiyun #define DMM_TILER_OR__0 0x220 28*4882a593Smuzhiyun #define DMM_TILER_OR__1 0x224 29*4882a593Smuzhiyun #define DMM_PAT_HWINFO 0x408 30*4882a593Smuzhiyun #define DMM_PAT_GEOMETRY 0x40C 31*4882a593Smuzhiyun #define DMM_PAT_CONFIG 0x410 32*4882a593Smuzhiyun #define DMM_PAT_VIEW__0 0x420 33*4882a593Smuzhiyun #define DMM_PAT_VIEW__1 0x424 34*4882a593Smuzhiyun #define DMM_PAT_VIEW_MAP__0 0x440 35*4882a593Smuzhiyun #define DMM_PAT_VIEW_MAP_BASE 0x460 36*4882a593Smuzhiyun #define DMM_PAT_IRQ_EOI 0x478 37*4882a593Smuzhiyun #define DMM_PAT_IRQSTATUS_RAW 0x480 38*4882a593Smuzhiyun #define DMM_PAT_IRQSTATUS 0x490 39*4882a593Smuzhiyun #define DMM_PAT_IRQENABLE_SET 0x4A0 40*4882a593Smuzhiyun #define DMM_PAT_IRQENABLE_CLR 0x4B0 41*4882a593Smuzhiyun #define DMM_PAT_STATUS__0 0x4C0 42*4882a593Smuzhiyun #define DMM_PAT_STATUS__1 0x4C4 43*4882a593Smuzhiyun #define DMM_PAT_STATUS__2 0x4C8 44*4882a593Smuzhiyun #define DMM_PAT_STATUS__3 0x4CC 45*4882a593Smuzhiyun #define DMM_PAT_DESCR__0 0x500 46*4882a593Smuzhiyun #define DMM_PAT_DESCR__1 0x510 47*4882a593Smuzhiyun #define DMM_PAT_DESCR__2 0x520 48*4882a593Smuzhiyun #define DMM_PAT_DESCR__3 0x530 49*4882a593Smuzhiyun #define DMM_PEG_HWINFO 0x608 50*4882a593Smuzhiyun #define DMM_PEG_PRIO 0x620 51*4882a593Smuzhiyun #define DMM_PEG_PRIO_PAT 0x640 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define DMM_IRQSTAT_DST (1<<0) 54*4882a593Smuzhiyun #define DMM_IRQSTAT_LST (1<<1) 55*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_INV_DSC (1<<2) 56*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_INV_DATA (1<<3) 57*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_UPD_AREA (1<<4) 58*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_UPD_CTRL (1<<5) 59*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_UPD_DATA (1<<6) 60*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_LUT_MISS (1<<7) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define DMM_IRQSTAT_ERR_MASK (DMM_IRQSTAT_ERR_INV_DSC | \ 63*4882a593Smuzhiyun DMM_IRQSTAT_ERR_INV_DATA | \ 64*4882a593Smuzhiyun DMM_IRQSTAT_ERR_UPD_AREA | \ 65*4882a593Smuzhiyun DMM_IRQSTAT_ERR_UPD_CTRL | \ 66*4882a593Smuzhiyun DMM_IRQSTAT_ERR_UPD_DATA | \ 67*4882a593Smuzhiyun DMM_IRQSTAT_ERR_LUT_MISS) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define DMM_PATSTATUS_READY (1<<0) 70*4882a593Smuzhiyun #define DMM_PATSTATUS_VALID (1<<1) 71*4882a593Smuzhiyun #define DMM_PATSTATUS_RUN (1<<2) 72*4882a593Smuzhiyun #define DMM_PATSTATUS_DONE (1<<3) 73*4882a593Smuzhiyun #define DMM_PATSTATUS_LINKED (1<<4) 74*4882a593Smuzhiyun #define DMM_PATSTATUS_BYPASSED (1<<7) 75*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR_INV_DESCR (1<<10) 76*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR_INV_DATA (1<<11) 77*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR_UPD_AREA (1<<12) 78*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR_UPD_CTRL (1<<13) 79*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR_UPD_DATA (1<<14) 80*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR_ACCESS (1<<15) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* note: don't treat DMM_PATSTATUS_ERR_ACCESS as an error */ 83*4882a593Smuzhiyun #define DMM_PATSTATUS_ERR (DMM_PATSTATUS_ERR_INV_DESCR | \ 84*4882a593Smuzhiyun DMM_PATSTATUS_ERR_INV_DATA | \ 85*4882a593Smuzhiyun DMM_PATSTATUS_ERR_UPD_AREA | \ 86*4882a593Smuzhiyun DMM_PATSTATUS_ERR_UPD_CTRL | \ 87*4882a593Smuzhiyun DMM_PATSTATUS_ERR_UPD_DATA) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun enum { 92*4882a593Smuzhiyun PAT_STATUS, 93*4882a593Smuzhiyun PAT_DESCR 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct pat_ctrl { 97*4882a593Smuzhiyun u32 start:4; 98*4882a593Smuzhiyun u32 dir:4; 99*4882a593Smuzhiyun u32 lut_id:8; 100*4882a593Smuzhiyun u32 sync:12; 101*4882a593Smuzhiyun u32 ini:4; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct pat { 105*4882a593Smuzhiyun u32 next_pa; 106*4882a593Smuzhiyun struct pat_area area; 107*4882a593Smuzhiyun struct pat_ctrl ctrl; 108*4882a593Smuzhiyun u32 data_pa; 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define DMM_FIXED_RETRY_COUNT 1000 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* create refill buffer big enough to refill all slots, plus 3 descriptors.. 114*4882a593Smuzhiyun * 3 descriptors is probably the worst-case for # of 2d-slices in a 1d area, 115*4882a593Smuzhiyun * but I guess you don't hit that worst case at the same time as full area 116*4882a593Smuzhiyun * refill 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun #define DESCR_SIZE 128 119*4882a593Smuzhiyun #define REFILL_BUFFER_SIZE ((4 * 128 * 256) + (3 * DESCR_SIZE)) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* For OMAP5, a fixed offset is added to all Y coordinates for 1D buffers. 122*4882a593Smuzhiyun * This is used in programming to address the upper portion of the LUT 123*4882a593Smuzhiyun */ 124*4882a593Smuzhiyun #define OMAP5_LUT_OFFSET 128 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun struct dmm; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun struct dmm_txn { 129*4882a593Smuzhiyun void *engine_handle; 130*4882a593Smuzhiyun struct tcm *tcm; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun u8 *current_va; 133*4882a593Smuzhiyun dma_addr_t current_pa; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun struct pat *last_pat; 136*4882a593Smuzhiyun }; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun struct refill_engine { 139*4882a593Smuzhiyun int id; 140*4882a593Smuzhiyun struct dmm *dmm; 141*4882a593Smuzhiyun struct tcm *tcm; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun u8 *refill_va; 144*4882a593Smuzhiyun dma_addr_t refill_pa; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* only one trans per engine for now */ 147*4882a593Smuzhiyun struct dmm_txn txn; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun bool async; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun struct completion compl; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct list_head idle_node; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun struct dmm_platform_data { 157*4882a593Smuzhiyun u32 cpu_cache_flags; 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct dmm { 161*4882a593Smuzhiyun struct device *dev; 162*4882a593Smuzhiyun dma_addr_t phys_base; 163*4882a593Smuzhiyun void __iomem *base; 164*4882a593Smuzhiyun int irq; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun struct page *dummy_page; 167*4882a593Smuzhiyun dma_addr_t dummy_pa; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun void *refill_va; 170*4882a593Smuzhiyun dma_addr_t refill_pa; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* refill engines */ 173*4882a593Smuzhiyun wait_queue_head_t engine_queue; 174*4882a593Smuzhiyun struct list_head idle_head; 175*4882a593Smuzhiyun struct refill_engine *engines; 176*4882a593Smuzhiyun int num_engines; 177*4882a593Smuzhiyun atomic_t engine_counter; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* container information */ 180*4882a593Smuzhiyun int container_width; 181*4882a593Smuzhiyun int container_height; 182*4882a593Smuzhiyun int lut_width; 183*4882a593Smuzhiyun int lut_height; 184*4882a593Smuzhiyun int num_lut; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* array of LUT - TCM containers */ 187*4882a593Smuzhiyun struct tcm **tcm; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun /* allocation list and lock */ 190*4882a593Smuzhiyun struct list_head alloc_head; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun const struct dmm_platform_data *plat_data; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun bool dmm_workaround; 195*4882a593Smuzhiyun spinlock_t wa_lock; 196*4882a593Smuzhiyun u32 *wa_dma_data; 197*4882a593Smuzhiyun dma_addr_t wa_dma_handle; 198*4882a593Smuzhiyun struct dma_chan *wa_dma_chan; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #endif 202