summaryrefslogtreecommitdiff
path: root/include/soc/qcom/qup-fw-load.h
blob: a67a93c72a4b705eff5bd29b185a4172c19ae1d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
 */
#ifndef _LINUX_QCOM_QUP_FW_LOAD
#define _LINUX_QCOM_QUP_FW_LOAD

#include <linux/kernel.h>

/*Magic numbers*/
#define MAGIC_NUM_SE			0x57464553

/* Common SE registers*/
#define GENI_INIT_CFG_REVISION		0x0
#define GENI_S_INIT_CFG_REVISION	0x4
#define GENI_FORCE_DEFAULT_REG		0x20
#define GENI_CGC_CTRL			0x28
#define GENI_CFG_REG0			0x100

#define QUPV3_SE_HW_PARAM_1		0xE28
#define RX_FIFO_WIDTH_BIT		24
#define RX_FIFO_WIDTH_MASK		0x3F

/*Same registers as GENI_DMA_MODE_EN*/
#define QUPV3_SE_GENI_DMA_MODE_EN	0x258
#define GENI_M_IRQ_ENABLE		0x614
#define GENI_S_IRQ_ENABLE		0x644
#define GENI_RX_RFR_WATERMARK_REG	0x814
#define DMA_TX_IRQ_EN_SET		0xC4C
#define DMA_RX_IRQ_EN_SET		0xD4C
#define DMA_GENERAL_CFG			0xE30
#define SE_GENI_FW_REVISION		0x1000
#define SE_S_FW_REVISION		0x1004
#define SE_GENI_CFG_RAMN		0x1010
#define SE_GENI_CLK_CTRL		0x2000
#define SE_DMA_IF_EN			0x2004
#define SE_FIFO_IF_DISABLE		0x2008

#define MAX_GENI_CFG_RAMn_CNT		455

#define MI_PBT_NON_PAGED_SEGMENT	0x0
#define MI_PBT_HASH_SEGMENT		0x2
#define MI_PBT_NOTUSED_SEGMENT		0x3
#define MI_PBT_SHARED_SEGMENT		0x4
#define MI_PBT_FLAG_PAGE_MODE_MASK	0x100000
#define MI_PBT_FLAG_PAGE_MODE_SHIFT	0x14
#define MI_PBT_FLAG_SEGMENT_TYPE_MASK	0x7000000
#define MI_PBT_FLAG_SEGMENT_TYPE_SHIFT	0x18
#define MI_PBT_FLAG_ACCESS_TYPE_MASK	0xE00000
#define MI_PBT_FLAG_ACCESS_TYPE_SHIFT	0x15

#define MI_PBT_PAGE_MODE_VALUE(x) \
	(((x) & MI_PBT_FLAG_PAGE_MODE_MASK) >> \
	  MI_PBT_FLAG_PAGE_MODE_SHIFT)

#define MI_PBT_SEGMENT_TYPE_VALUE(x) \
	(((x) & MI_PBT_FLAG_SEGMENT_TYPE_MASK) >> \
		MI_PBT_FLAG_SEGMENT_TYPE_SHIFT)

#define MI_PBT_ACCESS_TYPE_VALUE(x) \
	(((x) & MI_PBT_FLAG_ACCESS_TYPE_MASK) >> \
	  MI_PBT_FLAG_ACCESS_TYPE_SHIFT)

/* GENI_FORCE_DEFAULT_REG fields */
#define FORCE_DEFAULT			BIT(0)

/* FW_REVISION_RO fields */
#define FW_REV_PROTOCOL_SHFT		8
#define FW_REV_VERSION_SHFT		0

#define GENI_FW_REVISION_RO		0x68
#define GENI_S_FW_REVISION_RO		0x6C

/* SE_GENI_DMA_MODE_EN */
#define GENI_DMA_MODE_EN		BIT(0)

/* GENI_M_IRQ_EN fields */
#define M_CMD_DONE_EN			BIT(0)
#define M_IO_DATA_DEASSERT_EN		BIT(22)
#define M_IO_DATA_ASSERT_EN		BIT(23)
#define M_RX_FIFO_RD_ERR_EN		BIT(24)
#define M_RX_FIFO_WR_ERR_EN		BIT(25)
#define M_RX_FIFO_WATERMARK_EN		BIT(26)
#define M_RX_FIFO_LAST_EN		BIT(27)
#define M_TX_FIFO_RD_ERR_EN		BIT(28)
#define M_TX_FIFO_WR_ERR_EN		BIT(29)
#define M_TX_FIFO_WATERMARK_EN		BIT(30)
#define M_COMMON_GENI_M_IRQ_EN	(GENMASK(6, 1) | \
				M_IO_DATA_DEASSERT_EN | \
				M_IO_DATA_ASSERT_EN | M_RX_FIFO_RD_ERR_EN | \
				M_RX_FIFO_WR_ERR_EN | M_TX_FIFO_RD_ERR_EN | \
				M_TX_FIFO_WR_ERR_EN)

/* GENI_S_IRQ_EN fields */
#define S_CMD_OVERRUN_EN		BIT(1)
#define S_ILLEGAL_CMD_EN		BIT(2)
#define S_CMD_CANCEL_EN			BIT(4)
#define S_CMD_ABORT_EN			BIT(5)
#define S_GP_IRQ_0_EN			BIT(9)
#define S_GP_IRQ_1_EN			BIT(10)
#define S_GP_IRQ_2_EN			BIT(11)
#define S_GP_IRQ_3_EN			BIT(12)
#define S_RX_FIFO_RD_ERR_EN		BIT(24)
#define S_RX_FIFO_WR_ERR_EN		BIT(25)
#define S_COMMON_GENI_S_IRQ_EN	(GENMASK(5, 1) | GENMASK(13, 9) | \
				 S_RX_FIFO_RD_ERR_EN | S_RX_FIFO_WR_ERR_EN)

#define GENI_CGC_CTRL_PROG_RAM_SCLK_OFF_BMSK		0x00000200
#define GENI_CGC_CTRL_PROG_RAM_HCLK_OFF_BMSK		0x00000100

#define GENI_DMA_MODE_EN_GENI_DMA_MODE_EN_BMSK		0x00000001

#define DMA_TX_IRQ_EN_SET_RESET_DONE_EN_SET_BMSK	0x00000008
#define DMA_TX_IRQ_EN_SET_SBE_EN_SET_BMSK		0x00000004
#define DMA_TX_IRQ_EN_SET_DMA_DONE_EN_SET_BMSK		0x00000001

#define DMA_RX_IRQ_EN_SET_FLUSH_DONE_EN_SET_BMSK	0x00000010
#define DMA_RX_IRQ_EN_SET_RESET_DONE_EN_SET_BMSK	0x00000008
#define DMA_RX_IRQ_EN_SET_SBE_EN_SET_BMSK		0x00000004
#define DMA_RX_IRQ_EN_SET_DMA_DONE_EN_SET_BMSK		0x00000001

#define DMA_GENERAL_CFG_AHB_SEC_SLV_CLK_CGC_ON_BMSK	0x00000008
#define DMA_GENERAL_CFG_DMA_AHB_SLV_CLK_CGC_ON_BMSK	0x00000004
#define DMA_GENERAL_CFG_DMA_TX_CLK_CGC_ON_BMSK		0x00000002
#define DMA_GENERAL_CFG_DMA_RX_CLK_CGC_ON_BMSK		0x00000001

#define GENI_CLK_CTRL_SER_CLK_SEL_BMSK			0x00000001
#define DMA_IF_EN_DMA_IF_EN_BMSK			0x00000001
#define SE_GSI_EVENT_EN_BMSK				0x0000000f
#define SE_IRQ_EN_RMSK					0x0000000f

#define QUPV3_COMMON_CFG				0x0120
#define FAST_SWITCH_TO_HIGH_DISABLE_BMASK		0x00000001

#define QUPV3_SE_AHB_M_CFG				0x0118
#define AHB_M_CLK_CGC_ON_BMASK				0x00000001

#define QUPV3_COMMON_CGC_CTRL				0x021C
#define COMMON_CSR_SLV_CLK_CGC_ON_BMASK			0x00000001

/* access ports */
#define geni_setbits32(_addr, _v) writel_relaxed(readl_relaxed(_addr) |  (_v), (_addr))
#define geni_clrbits32(_addr, _v) writel_relaxed(readl_relaxed(_addr) & ~(_v), (_addr))

/**
 * struct elf_se_hdr - firmware configurations
 *
 * @magic: set to 'SEFW'
 * @version: A 32-bit value indicating the structure’s version number
 * @core_version: QUPV3_HW_VERSION
 * @serial_protocol: Programmed into GENI_FW_REVISION
 * @fw_version: Programmed into GENI_FW_REVISION
 * @cfg_version: Programmed into GENI_INIT_CFG_REVISION
 * @fw_size_in_items: Number of (uint32_t) GENI_FW_RAM words
 * @fw_offset: Byte offset of GENI_FW_RAM array
 * @cfg_size_in_items: Number of GENI_FW_CFG index/value pairs
 * @cfg_idx_offset: Byte offset of GENI_FW_CFG index array
 * @cfg_val_offset: Byte offset of GENI_FW_CFG values array
 */
struct elf_se_hdr {
	u32 magic;
	u32 version;
	u32 core_version;
	u16 serial_protocol;
	u16 fw_version;
	u16 cfg_version;
	u16 fw_size_in_items;
	u16 fw_offset;
	u16 cfg_size_in_items;
	u16 cfg_idx_offset;
	u16 cfg_val_offset;
};

struct udevice;

int qcom_geni_load_firmware(phys_addr_t qup_base, struct udevice *dev);

#endif /* _LINUX_QCOM_QUP_FW_LOAD */