162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2018-2019 Synopsys, Inc. and/or its affiliates.
462306a36Sopenharmony_ci * Synopsys DesignWare eDMA v0 core
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Author: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _DW_EDMA_V0_REGS_H
1062306a36Sopenharmony_ci#define _DW_EDMA_V0_REGS_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/dmaengine.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define EDMA_V0_MAX_NR_CH				8
1562306a36Sopenharmony_ci#define EDMA_V0_VIEWPORT_MASK				GENMASK(2, 0)
1662306a36Sopenharmony_ci#define EDMA_V0_DONE_INT_MASK				GENMASK(7, 0)
1762306a36Sopenharmony_ci#define EDMA_V0_ABORT_INT_MASK				GENMASK(23, 16)
1862306a36Sopenharmony_ci#define EDMA_V0_WRITE_CH_COUNT_MASK			GENMASK(3, 0)
1962306a36Sopenharmony_ci#define EDMA_V0_READ_CH_COUNT_MASK			GENMASK(19, 16)
2062306a36Sopenharmony_ci#define EDMA_V0_CH_STATUS_MASK				GENMASK(6, 5)
2162306a36Sopenharmony_ci#define EDMA_V0_DOORBELL_CH_MASK			GENMASK(2, 0)
2262306a36Sopenharmony_ci#define EDMA_V0_LINKED_LIST_ERR_MASK			GENMASK(7, 0)
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define EDMA_V0_CH_ODD_MSI_DATA_MASK			GENMASK(31, 16)
2562306a36Sopenharmony_ci#define EDMA_V0_CH_EVEN_MSI_DATA_MASK			GENMASK(15, 0)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct dw_edma_v0_ch_regs {
2862306a36Sopenharmony_ci	u32 ch_control1;				/* 0x0000 */
2962306a36Sopenharmony_ci	u32 ch_control2;				/* 0x0004 */
3062306a36Sopenharmony_ci	u32 transfer_size;				/* 0x0008 */
3162306a36Sopenharmony_ci	union {
3262306a36Sopenharmony_ci		u64 reg;				/* 0x000c..0x0010 */
3362306a36Sopenharmony_ci		struct {
3462306a36Sopenharmony_ci			u32 lsb;			/* 0x000c */
3562306a36Sopenharmony_ci			u32 msb;			/* 0x0010 */
3662306a36Sopenharmony_ci		};
3762306a36Sopenharmony_ci	} sar;
3862306a36Sopenharmony_ci	union {
3962306a36Sopenharmony_ci		u64 reg;				/* 0x0014..0x0018 */
4062306a36Sopenharmony_ci		struct {
4162306a36Sopenharmony_ci			u32 lsb;			/* 0x0014 */
4262306a36Sopenharmony_ci			u32 msb;			/* 0x0018 */
4362306a36Sopenharmony_ci		};
4462306a36Sopenharmony_ci	} dar;
4562306a36Sopenharmony_ci	union {
4662306a36Sopenharmony_ci		u64 reg;				/* 0x001c..0x0020 */
4762306a36Sopenharmony_ci		struct {
4862306a36Sopenharmony_ci			u32 lsb;			/* 0x001c */
4962306a36Sopenharmony_ci			u32 msb;			/* 0x0020 */
5062306a36Sopenharmony_ci		};
5162306a36Sopenharmony_ci	} llp;
5262306a36Sopenharmony_ci} __packed;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct dw_edma_v0_ch {
5562306a36Sopenharmony_ci	struct dw_edma_v0_ch_regs wr;			/* 0x0200 */
5662306a36Sopenharmony_ci	u32 padding_1[55];				/* 0x0224..0x02fc */
5762306a36Sopenharmony_ci	struct dw_edma_v0_ch_regs rd;			/* 0x0300 */
5862306a36Sopenharmony_ci	u32 padding_2[55];				/* 0x0324..0x03fc */
5962306a36Sopenharmony_ci} __packed;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistruct dw_edma_v0_unroll {
6262306a36Sopenharmony_ci	u32 padding_1;					/* 0x00f8 */
6362306a36Sopenharmony_ci	u32 wr_engine_chgroup;				/* 0x0100 */
6462306a36Sopenharmony_ci	u32 rd_engine_chgroup;				/* 0x0104 */
6562306a36Sopenharmony_ci	union {
6662306a36Sopenharmony_ci		u64 reg;				/* 0x0108..0x010c */
6762306a36Sopenharmony_ci		struct {
6862306a36Sopenharmony_ci			u32 lsb;			/* 0x0108 */
6962306a36Sopenharmony_ci			u32 msb;			/* 0x010c */
7062306a36Sopenharmony_ci		};
7162306a36Sopenharmony_ci	} wr_engine_hshake_cnt;
7262306a36Sopenharmony_ci	u32 padding_2[2];				/* 0x0110..0x0114 */
7362306a36Sopenharmony_ci	union {
7462306a36Sopenharmony_ci		u64 reg;				/* 0x0120..0x0124 */
7562306a36Sopenharmony_ci		struct {
7662306a36Sopenharmony_ci			u32 lsb;			/* 0x0120 */
7762306a36Sopenharmony_ci			u32 msb;			/* 0x0124 */
7862306a36Sopenharmony_ci		};
7962306a36Sopenharmony_ci	} rd_engine_hshake_cnt;
8062306a36Sopenharmony_ci	u32 padding_3[2];				/* 0x0120..0x0124 */
8162306a36Sopenharmony_ci	u32 wr_ch0_pwr_en;				/* 0x0128 */
8262306a36Sopenharmony_ci	u32 wr_ch1_pwr_en;				/* 0x012c */
8362306a36Sopenharmony_ci	u32 wr_ch2_pwr_en;				/* 0x0130 */
8462306a36Sopenharmony_ci	u32 wr_ch3_pwr_en;				/* 0x0134 */
8562306a36Sopenharmony_ci	u32 wr_ch4_pwr_en;				/* 0x0138 */
8662306a36Sopenharmony_ci	u32 wr_ch5_pwr_en;				/* 0x013c */
8762306a36Sopenharmony_ci	u32 wr_ch6_pwr_en;				/* 0x0140 */
8862306a36Sopenharmony_ci	u32 wr_ch7_pwr_en;				/* 0x0144 */
8962306a36Sopenharmony_ci	u32 padding_4[8];				/* 0x0148..0x0164 */
9062306a36Sopenharmony_ci	u32 rd_ch0_pwr_en;				/* 0x0168 */
9162306a36Sopenharmony_ci	u32 rd_ch1_pwr_en;				/* 0x016c */
9262306a36Sopenharmony_ci	u32 rd_ch2_pwr_en;				/* 0x0170 */
9362306a36Sopenharmony_ci	u32 rd_ch3_pwr_en;				/* 0x0174 */
9462306a36Sopenharmony_ci	u32 rd_ch4_pwr_en;				/* 0x0178 */
9562306a36Sopenharmony_ci	u32 rd_ch5_pwr_en;				/* 0x018c */
9662306a36Sopenharmony_ci	u32 rd_ch6_pwr_en;				/* 0x0180 */
9762306a36Sopenharmony_ci	u32 rd_ch7_pwr_en;				/* 0x0184 */
9862306a36Sopenharmony_ci	u32 padding_5[30];				/* 0x0188..0x01fc */
9962306a36Sopenharmony_ci	struct dw_edma_v0_ch ch[EDMA_V0_MAX_NR_CH];	/* 0x0200..0x1120 */
10062306a36Sopenharmony_ci} __packed;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistruct dw_edma_v0_legacy {
10362306a36Sopenharmony_ci	u32 viewport_sel;				/* 0x00f8 */
10462306a36Sopenharmony_ci	struct dw_edma_v0_ch_regs ch;			/* 0x0100..0x0120 */
10562306a36Sopenharmony_ci} __packed;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistruct dw_edma_v0_regs {
10862306a36Sopenharmony_ci	/* eDMA global registers */
10962306a36Sopenharmony_ci	u32 ctrl_data_arb_prior;			/* 0x0000 */
11062306a36Sopenharmony_ci	u32 padding_1;					/* 0x0004 */
11162306a36Sopenharmony_ci	u32 ctrl;					/* 0x0008 */
11262306a36Sopenharmony_ci	u32 wr_engine_en;				/* 0x000c */
11362306a36Sopenharmony_ci	u32 wr_doorbell;				/* 0x0010 */
11462306a36Sopenharmony_ci	u32 padding_2;					/* 0x0014 */
11562306a36Sopenharmony_ci	union {
11662306a36Sopenharmony_ci		u64 reg;				/* 0x0018..0x001c */
11762306a36Sopenharmony_ci		struct {
11862306a36Sopenharmony_ci			u32 lsb;			/* 0x0018 */
11962306a36Sopenharmony_ci			u32 msb;			/* 0x001c */
12062306a36Sopenharmony_ci		};
12162306a36Sopenharmony_ci	} wr_ch_arb_weight;
12262306a36Sopenharmony_ci	u32 padding_3[3];				/* 0x0020..0x0028 */
12362306a36Sopenharmony_ci	u32 rd_engine_en;				/* 0x002c */
12462306a36Sopenharmony_ci	u32 rd_doorbell;				/* 0x0030 */
12562306a36Sopenharmony_ci	u32 padding_4;					/* 0x0034 */
12662306a36Sopenharmony_ci	union {
12762306a36Sopenharmony_ci		u64 reg;				/* 0x0038..0x003c */
12862306a36Sopenharmony_ci		struct {
12962306a36Sopenharmony_ci			u32 lsb;			/* 0x0038 */
13062306a36Sopenharmony_ci			u32 msb;			/* 0x003c */
13162306a36Sopenharmony_ci		};
13262306a36Sopenharmony_ci	} rd_ch_arb_weight;
13362306a36Sopenharmony_ci	u32 padding_5[3];				/* 0x0040..0x0048 */
13462306a36Sopenharmony_ci	/* eDMA interrupts registers */
13562306a36Sopenharmony_ci	u32 wr_int_status;				/* 0x004c */
13662306a36Sopenharmony_ci	u32 padding_6;					/* 0x0050 */
13762306a36Sopenharmony_ci	u32 wr_int_mask;				/* 0x0054 */
13862306a36Sopenharmony_ci	u32 wr_int_clear;				/* 0x0058 */
13962306a36Sopenharmony_ci	u32 wr_err_status;				/* 0x005c */
14062306a36Sopenharmony_ci	union {
14162306a36Sopenharmony_ci		u64 reg;				/* 0x0060..0x0064 */
14262306a36Sopenharmony_ci		struct {
14362306a36Sopenharmony_ci			u32 lsb;			/* 0x0060 */
14462306a36Sopenharmony_ci			u32 msb;			/* 0x0064 */
14562306a36Sopenharmony_ci		};
14662306a36Sopenharmony_ci	} wr_done_imwr;
14762306a36Sopenharmony_ci	union {
14862306a36Sopenharmony_ci		u64 reg;				/* 0x0068..0x006c */
14962306a36Sopenharmony_ci		struct {
15062306a36Sopenharmony_ci			u32 lsb;			/* 0x0068 */
15162306a36Sopenharmony_ci			u32 msb;			/* 0x006c */
15262306a36Sopenharmony_ci		};
15362306a36Sopenharmony_ci	} wr_abort_imwr;
15462306a36Sopenharmony_ci	u32 wr_ch01_imwr_data;				/* 0x0070 */
15562306a36Sopenharmony_ci	u32 wr_ch23_imwr_data;				/* 0x0074 */
15662306a36Sopenharmony_ci	u32 wr_ch45_imwr_data;				/* 0x0078 */
15762306a36Sopenharmony_ci	u32 wr_ch67_imwr_data;				/* 0x007c */
15862306a36Sopenharmony_ci	u32 padding_7[4];				/* 0x0080..0x008c */
15962306a36Sopenharmony_ci	u32 wr_linked_list_err_en;			/* 0x0090 */
16062306a36Sopenharmony_ci	u32 padding_8[3];				/* 0x0094..0x009c */
16162306a36Sopenharmony_ci	u32 rd_int_status;				/* 0x00a0 */
16262306a36Sopenharmony_ci	u32 padding_9;					/* 0x00a4 */
16362306a36Sopenharmony_ci	u32 rd_int_mask;				/* 0x00a8 */
16462306a36Sopenharmony_ci	u32 rd_int_clear;				/* 0x00ac */
16562306a36Sopenharmony_ci	u32 padding_10;					/* 0x00b0 */
16662306a36Sopenharmony_ci	union {
16762306a36Sopenharmony_ci		u64 reg;				/* 0x00b4..0x00b8 */
16862306a36Sopenharmony_ci		struct {
16962306a36Sopenharmony_ci			u32 lsb;			/* 0x00b4 */
17062306a36Sopenharmony_ci			u32 msb;			/* 0x00b8 */
17162306a36Sopenharmony_ci		};
17262306a36Sopenharmony_ci	} rd_err_status;
17362306a36Sopenharmony_ci	u32 padding_11[2];				/* 0x00bc..0x00c0 */
17462306a36Sopenharmony_ci	u32 rd_linked_list_err_en;			/* 0x00c4 */
17562306a36Sopenharmony_ci	u32 padding_12;					/* 0x00c8 */
17662306a36Sopenharmony_ci	union {
17762306a36Sopenharmony_ci		u64 reg;				/* 0x00cc..0x00d0 */
17862306a36Sopenharmony_ci		struct {
17962306a36Sopenharmony_ci			u32 lsb;			/* 0x00cc */
18062306a36Sopenharmony_ci			u32 msb;			/* 0x00d0 */
18162306a36Sopenharmony_ci		};
18262306a36Sopenharmony_ci	} rd_done_imwr;
18362306a36Sopenharmony_ci	union {
18462306a36Sopenharmony_ci		u64 reg;				/* 0x00d4..0x00d8 */
18562306a36Sopenharmony_ci		struct {
18662306a36Sopenharmony_ci			u32 lsb;			/* 0x00d4 */
18762306a36Sopenharmony_ci			u32 msb;			/* 0x00d8 */
18862306a36Sopenharmony_ci		};
18962306a36Sopenharmony_ci	} rd_abort_imwr;
19062306a36Sopenharmony_ci	u32 rd_ch01_imwr_data;				/* 0x00dc */
19162306a36Sopenharmony_ci	u32 rd_ch23_imwr_data;				/* 0x00e0 */
19262306a36Sopenharmony_ci	u32 rd_ch45_imwr_data;				/* 0x00e4 */
19362306a36Sopenharmony_ci	u32 rd_ch67_imwr_data;				/* 0x00e8 */
19462306a36Sopenharmony_ci	u32 padding_13[4];				/* 0x00ec..0x00f8 */
19562306a36Sopenharmony_ci	/* eDMA channel context grouping */
19662306a36Sopenharmony_ci	union dw_edma_v0_type {
19762306a36Sopenharmony_ci		struct dw_edma_v0_legacy legacy;	/* 0x00f8..0x0120 */
19862306a36Sopenharmony_ci		struct dw_edma_v0_unroll unroll;	/* 0x00f8..0x1120 */
19962306a36Sopenharmony_ci	} type;
20062306a36Sopenharmony_ci} __packed;
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cistruct dw_edma_v0_lli {
20362306a36Sopenharmony_ci	u32 control;
20462306a36Sopenharmony_ci	u32 transfer_size;
20562306a36Sopenharmony_ci	union {
20662306a36Sopenharmony_ci		u64 reg;
20762306a36Sopenharmony_ci		struct {
20862306a36Sopenharmony_ci			u32 lsb;
20962306a36Sopenharmony_ci			u32 msb;
21062306a36Sopenharmony_ci		};
21162306a36Sopenharmony_ci	} sar;
21262306a36Sopenharmony_ci	union {
21362306a36Sopenharmony_ci		u64 reg;
21462306a36Sopenharmony_ci		struct {
21562306a36Sopenharmony_ci			u32 lsb;
21662306a36Sopenharmony_ci			u32 msb;
21762306a36Sopenharmony_ci		};
21862306a36Sopenharmony_ci	} dar;
21962306a36Sopenharmony_ci} __packed;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistruct dw_edma_v0_llp {
22262306a36Sopenharmony_ci	u32 control;
22362306a36Sopenharmony_ci	u32 reserved;
22462306a36Sopenharmony_ci	union {
22562306a36Sopenharmony_ci		u64 reg;
22662306a36Sopenharmony_ci		struct {
22762306a36Sopenharmony_ci			u32 lsb;
22862306a36Sopenharmony_ci			u32 msb;
22962306a36Sopenharmony_ci		};
23062306a36Sopenharmony_ci	} llp;
23162306a36Sopenharmony_ci} __packed;
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci#endif /* _DW_EDMA_V0_REGS_H */
234