162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com/
462306a36Sopenharmony_ci * Author: Rob Clark <rob@ti.com>
562306a36Sopenharmony_ci *         Andy Gross <andy.gross@ti.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef OMAP_DMM_PRIV_H
962306a36Sopenharmony_ci#define OMAP_DMM_PRIV_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define DMM_REVISION          0x000
1262306a36Sopenharmony_ci#define DMM_HWINFO            0x004
1362306a36Sopenharmony_ci#define DMM_LISA_HWINFO       0x008
1462306a36Sopenharmony_ci#define DMM_DMM_SYSCONFIG     0x010
1562306a36Sopenharmony_ci#define DMM_LISA_LOCK         0x01C
1662306a36Sopenharmony_ci#define DMM_LISA_MAP__0       0x040
1762306a36Sopenharmony_ci#define DMM_LISA_MAP__1       0x044
1862306a36Sopenharmony_ci#define DMM_TILER_HWINFO      0x208
1962306a36Sopenharmony_ci#define DMM_TILER_OR__0       0x220
2062306a36Sopenharmony_ci#define DMM_TILER_OR__1       0x224
2162306a36Sopenharmony_ci#define DMM_PAT_HWINFO        0x408
2262306a36Sopenharmony_ci#define DMM_PAT_GEOMETRY      0x40C
2362306a36Sopenharmony_ci#define DMM_PAT_CONFIG        0x410
2462306a36Sopenharmony_ci#define DMM_PAT_VIEW__0       0x420
2562306a36Sopenharmony_ci#define DMM_PAT_VIEW__1       0x424
2662306a36Sopenharmony_ci#define DMM_PAT_VIEW_MAP__0   0x440
2762306a36Sopenharmony_ci#define DMM_PAT_VIEW_MAP_BASE 0x460
2862306a36Sopenharmony_ci#define DMM_PAT_IRQ_EOI       0x478
2962306a36Sopenharmony_ci#define DMM_PAT_IRQSTATUS_RAW 0x480
3062306a36Sopenharmony_ci#define DMM_PAT_IRQSTATUS     0x490
3162306a36Sopenharmony_ci#define DMM_PAT_IRQENABLE_SET 0x4A0
3262306a36Sopenharmony_ci#define DMM_PAT_IRQENABLE_CLR 0x4B0
3362306a36Sopenharmony_ci#define DMM_PAT_STATUS__0     0x4C0
3462306a36Sopenharmony_ci#define DMM_PAT_STATUS__1     0x4C4
3562306a36Sopenharmony_ci#define DMM_PAT_STATUS__2     0x4C8
3662306a36Sopenharmony_ci#define DMM_PAT_STATUS__3     0x4CC
3762306a36Sopenharmony_ci#define DMM_PAT_DESCR__0      0x500
3862306a36Sopenharmony_ci#define DMM_PAT_DESCR__1      0x510
3962306a36Sopenharmony_ci#define DMM_PAT_DESCR__2      0x520
4062306a36Sopenharmony_ci#define DMM_PAT_DESCR__3      0x530
4162306a36Sopenharmony_ci#define DMM_PEG_HWINFO        0x608
4262306a36Sopenharmony_ci#define DMM_PEG_PRIO          0x620
4362306a36Sopenharmony_ci#define DMM_PEG_PRIO_PAT      0x640
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define DMM_IRQSTAT_DST			(1<<0)
4662306a36Sopenharmony_ci#define DMM_IRQSTAT_LST			(1<<1)
4762306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_INV_DSC		(1<<2)
4862306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_INV_DATA	(1<<3)
4962306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_UPD_AREA	(1<<4)
5062306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_UPD_CTRL	(1<<5)
5162306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_UPD_DATA	(1<<6)
5262306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_LUT_MISS	(1<<7)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define DMM_IRQSTAT_ERR_MASK	(DMM_IRQSTAT_ERR_INV_DSC | \
5562306a36Sopenharmony_ci				DMM_IRQSTAT_ERR_INV_DATA | \
5662306a36Sopenharmony_ci				DMM_IRQSTAT_ERR_UPD_AREA | \
5762306a36Sopenharmony_ci				DMM_IRQSTAT_ERR_UPD_CTRL | \
5862306a36Sopenharmony_ci				DMM_IRQSTAT_ERR_UPD_DATA | \
5962306a36Sopenharmony_ci				DMM_IRQSTAT_ERR_LUT_MISS)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define DMM_PATSTATUS_READY		(1<<0)
6262306a36Sopenharmony_ci#define DMM_PATSTATUS_VALID		(1<<1)
6362306a36Sopenharmony_ci#define DMM_PATSTATUS_RUN		(1<<2)
6462306a36Sopenharmony_ci#define DMM_PATSTATUS_DONE		(1<<3)
6562306a36Sopenharmony_ci#define DMM_PATSTATUS_LINKED		(1<<4)
6662306a36Sopenharmony_ci#define DMM_PATSTATUS_BYPASSED		(1<<7)
6762306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR_INV_DESCR	(1<<10)
6862306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR_INV_DATA	(1<<11)
6962306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR_UPD_AREA	(1<<12)
7062306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR_UPD_CTRL	(1<<13)
7162306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR_UPD_DATA	(1<<14)
7262306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR_ACCESS	(1<<15)
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/* note: don't treat DMM_PATSTATUS_ERR_ACCESS as an error */
7562306a36Sopenharmony_ci#define DMM_PATSTATUS_ERR	(DMM_PATSTATUS_ERR_INV_DESCR | \
7662306a36Sopenharmony_ci				DMM_PATSTATUS_ERR_INV_DATA | \
7762306a36Sopenharmony_ci				DMM_PATSTATUS_ERR_UPD_AREA | \
7862306a36Sopenharmony_ci				DMM_PATSTATUS_ERR_UPD_CTRL | \
7962306a36Sopenharmony_ci				DMM_PATSTATUS_ERR_UPD_DATA)
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cienum {
8462306a36Sopenharmony_ci	PAT_STATUS,
8562306a36Sopenharmony_ci	PAT_DESCR
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct pat_ctrl {
8962306a36Sopenharmony_ci	u32 start:4;
9062306a36Sopenharmony_ci	u32 dir:4;
9162306a36Sopenharmony_ci	u32 lut_id:8;
9262306a36Sopenharmony_ci	u32 sync:12;
9362306a36Sopenharmony_ci	u32 ini:4;
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistruct pat {
9762306a36Sopenharmony_ci	u32 next_pa;
9862306a36Sopenharmony_ci	struct pat_area area;
9962306a36Sopenharmony_ci	struct pat_ctrl ctrl;
10062306a36Sopenharmony_ci	u32 data_pa;
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#define DMM_FIXED_RETRY_COUNT 1000
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/* create refill buffer big enough to refill all slots, plus 3 descriptors..
10662306a36Sopenharmony_ci * 3 descriptors is probably the worst-case for # of 2d-slices in a 1d area,
10762306a36Sopenharmony_ci * but I guess you don't hit that worst case at the same time as full area
10862306a36Sopenharmony_ci * refill
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_ci#define DESCR_SIZE 128
11162306a36Sopenharmony_ci#define REFILL_BUFFER_SIZE ((4 * 128 * 256) + (3 * DESCR_SIZE))
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci/* For OMAP5, a fixed offset is added to all Y coordinates for 1D buffers.
11462306a36Sopenharmony_ci * This is used in programming to address the upper portion of the LUT
11562306a36Sopenharmony_ci*/
11662306a36Sopenharmony_ci#define OMAP5_LUT_OFFSET       128
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cistruct dmm;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct dmm_txn {
12162306a36Sopenharmony_ci	void *engine_handle;
12262306a36Sopenharmony_ci	struct tcm *tcm;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	u8 *current_va;
12562306a36Sopenharmony_ci	dma_addr_t current_pa;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	struct pat *last_pat;
12862306a36Sopenharmony_ci};
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cistruct refill_engine {
13162306a36Sopenharmony_ci	int id;
13262306a36Sopenharmony_ci	struct dmm *dmm;
13362306a36Sopenharmony_ci	struct tcm *tcm;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	u8 *refill_va;
13662306a36Sopenharmony_ci	dma_addr_t refill_pa;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	/* only one trans per engine for now */
13962306a36Sopenharmony_ci	struct dmm_txn txn;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	bool async;
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	struct completion compl;
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	struct list_head idle_node;
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistruct dmm_platform_data {
14962306a36Sopenharmony_ci	u32 cpu_cache_flags;
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cistruct dmm {
15362306a36Sopenharmony_ci	struct device *dev;
15462306a36Sopenharmony_ci	dma_addr_t phys_base;
15562306a36Sopenharmony_ci	void __iomem *base;
15662306a36Sopenharmony_ci	int irq;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	struct page *dummy_page;
15962306a36Sopenharmony_ci	dma_addr_t dummy_pa;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	void *refill_va;
16262306a36Sopenharmony_ci	dma_addr_t refill_pa;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	/* refill engines */
16562306a36Sopenharmony_ci	wait_queue_head_t engine_queue;
16662306a36Sopenharmony_ci	struct list_head idle_head;
16762306a36Sopenharmony_ci	struct refill_engine *engines;
16862306a36Sopenharmony_ci	int num_engines;
16962306a36Sopenharmony_ci	atomic_t engine_counter;
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	/* container information */
17262306a36Sopenharmony_ci	int container_width;
17362306a36Sopenharmony_ci	int container_height;
17462306a36Sopenharmony_ci	int lut_width;
17562306a36Sopenharmony_ci	int lut_height;
17662306a36Sopenharmony_ci	int num_lut;
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* array of LUT - TCM containers */
17962306a36Sopenharmony_ci	struct tcm **tcm;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	/* allocation list and lock */
18262306a36Sopenharmony_ci	struct list_head alloc_head;
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	const struct dmm_platform_data *plat_data;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	bool dmm_workaround;
18762306a36Sopenharmony_ci	spinlock_t wa_lock;
18862306a36Sopenharmony_ci	u32 *wa_dma_data;
18962306a36Sopenharmony_ci	dma_addr_t wa_dma_handle;
19062306a36Sopenharmony_ci	struct dma_chan *wa_dma_chan;
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci#endif
194