2011-12-05 19:19:21 -06:00
/*
*
* Copyright ( C ) 2011 Texas Instruments Incorporated - http : //www.ti.com/
* Author : Rob Clark < rob @ ti . com >
* Andy Gross < andy . gross @ ti . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed " as is " WITHOUT ANY WARRANTY of any
* kind , whether express or implied ; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# ifndef OMAP_DMM_PRIV_H
# define OMAP_DMM_PRIV_H
# define DMM_REVISION 0x000
# define DMM_HWINFO 0x004
# define DMM_LISA_HWINFO 0x008
# define DMM_DMM_SYSCONFIG 0x010
# define DMM_LISA_LOCK 0x01C
# define DMM_LISA_MAP__0 0x040
# define DMM_LISA_MAP__1 0x044
# define DMM_TILER_HWINFO 0x208
# define DMM_TILER_OR__0 0x220
# define DMM_TILER_OR__1 0x224
# define DMM_PAT_HWINFO 0x408
# define DMM_PAT_GEOMETRY 0x40C
# define DMM_PAT_CONFIG 0x410
# define DMM_PAT_VIEW__0 0x420
# define DMM_PAT_VIEW__1 0x424
# define DMM_PAT_VIEW_MAP__0 0x440
# define DMM_PAT_VIEW_MAP_BASE 0x460
# define DMM_PAT_IRQ_EOI 0x478
# define DMM_PAT_IRQSTATUS_RAW 0x480
# define DMM_PAT_IRQSTATUS 0x490
# define DMM_PAT_IRQENABLE_SET 0x4A0
# define DMM_PAT_IRQENABLE_CLR 0x4B0
# define DMM_PAT_STATUS__0 0x4C0
# define DMM_PAT_STATUS__1 0x4C4
# define DMM_PAT_STATUS__2 0x4C8
# define DMM_PAT_STATUS__3 0x4CC
# define DMM_PAT_DESCR__0 0x500
# define DMM_PAT_DESCR__1 0x510
# define DMM_PAT_DESCR__2 0x520
# define DMM_PAT_DESCR__3 0x530
# define DMM_PEG_HWINFO 0x608
# define DMM_PEG_PRIO 0x620
# define DMM_PEG_PRIO_PAT 0x640
# define DMM_IRQSTAT_DST (1<<0)
# define DMM_IRQSTAT_LST (1<<1)
# define DMM_IRQSTAT_ERR_INV_DSC (1<<2)
# define DMM_IRQSTAT_ERR_INV_DATA (1<<3)
# define DMM_IRQSTAT_ERR_UPD_AREA (1<<4)
# define DMM_IRQSTAT_ERR_UPD_CTRL (1<<5)
# define DMM_IRQSTAT_ERR_UPD_DATA (1<<6)
# define DMM_IRQSTAT_ERR_LUT_MISS (1<<7)
# define DMM_IRQSTAT_ERR_MASK (DMM_IRQ_STAT_ERR_INV_DSC | \
DMM_IRQ_STAT_ERR_INV_DATA | \
DMM_IRQ_STAT_ERR_UPD_AREA | \
DMM_IRQ_STAT_ERR_UPD_CTRL | \
DMM_IRQ_STAT_ERR_UPD_DATA | \
DMM_IRQ_STAT_ERR_LUT_MISS )
# define DMM_PATSTATUS_READY (1<<0)
# define DMM_PATSTATUS_VALID (1<<1)
# define DMM_PATSTATUS_RUN (1<<2)
# define DMM_PATSTATUS_DONE (1<<3)
# define DMM_PATSTATUS_LINKED (1<<4)
# define DMM_PATSTATUS_BYPASSED (1<<7)
# define DMM_PATSTATUS_ERR_INV_DESCR (1<<10)
# define DMM_PATSTATUS_ERR_INV_DATA (1<<11)
# define DMM_PATSTATUS_ERR_UPD_AREA (1<<12)
# define DMM_PATSTATUS_ERR_UPD_CTRL (1<<13)
# define DMM_PATSTATUS_ERR_UPD_DATA (1<<14)
# define DMM_PATSTATUS_ERR_ACCESS (1<<15)
2011-12-09 23:26:08 -06:00
/* note: don't treat DMM_PATSTATUS_ERR_ACCESS as an error */
2011-12-05 19:19:21 -06:00
# define DMM_PATSTATUS_ERR (DMM_PATSTATUS_ERR_INV_DESCR | \
DMM_PATSTATUS_ERR_INV_DATA | \
DMM_PATSTATUS_ERR_UPD_AREA | \
DMM_PATSTATUS_ERR_UPD_CTRL | \
2011-12-09 23:26:08 -06:00
DMM_PATSTATUS_ERR_UPD_DATA )
2011-12-05 19:19:21 -06:00
enum {
PAT_STATUS ,
PAT_DESCR
} ;
struct pat_ctrl {
u32 start : 4 ;
u32 dir : 4 ;
u32 lut_id : 8 ;
u32 sync : 12 ;
u32 ini : 4 ;
} ;
struct pat {
uint32_t next_pa ;
struct pat_area area ;
struct pat_ctrl ctrl ;
uint32_t data_pa ;
} ;
# define DMM_FIXED_RETRY_COUNT 1000
/* create refill buffer big enough to refill all slots, plus 3 descriptors..
* 3 descriptors is probably the worst - case for # of 2 d - slices in a 1 d area ,
* but I guess you don ' t hit that worst case at the same time as full area
* refill
*/
# define DESCR_SIZE 128
# define REFILL_BUFFER_SIZE ((4 * 128 * 256) + (3 * DESCR_SIZE))
2012-12-19 14:53:38 -06:00
/* For OMAP5, a fixed offset is added to all Y coordinates for 1D buffers.
* This is used in programming to address the upper portion of the LUT
*/
# define OMAP5_LUT_OFFSET 128
2011-12-05 19:19:21 -06:00
struct dmm ;
struct dmm_txn {
void * engine_handle ;
struct tcm * tcm ;
uint8_t * current_va ;
dma_addr_t current_pa ;
struct pat * last_pat ;
} ;
struct refill_engine {
int id ;
struct dmm * dmm ;
struct tcm * tcm ;
uint8_t * refill_va ;
dma_addr_t refill_pa ;
/* only one trans per engine for now */
struct dmm_txn txn ;
2012-10-12 11:18:11 -05:00
bool async ;
2011-12-05 19:19:21 -06:00
wait_queue_head_t wait_for_refill ;
struct list_head idle_node ;
} ;
struct dmm {
struct device * dev ;
void __iomem * base ;
int irq ;
struct page * dummy_page ;
dma_addr_t dummy_pa ;
void * refill_va ;
dma_addr_t refill_pa ;
/* refill engines */
2012-10-12 11:18:11 -05:00
wait_queue_head_t engine_queue ;
2011-12-05 19:19:21 -06:00
struct list_head idle_head ;
struct refill_engine * engines ;
int num_engines ;
2012-10-12 11:18:11 -05:00
atomic_t engine_counter ;
2011-12-05 19:19:21 -06:00
/* container information */
int container_width ;
int container_height ;
int lut_width ;
int lut_height ;
int num_lut ;
/* array of LUT - TCM containers */
struct tcm * * tcm ;
/* allocation list and lock */
struct list_head alloc_head ;
} ;
# endif