xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/omapdrm/omap_dmm_priv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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