1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <spi-generic.h>
5 #include <arch/cache.h>
6 #include <device/mmio.h>
7 #include <soc/addressmap.h>
8 #include <soc/qspi_common.h>
15 #define CACHE_LINE_SIZE 64
17 static int curr_desc_idx
= -1;
20 uint32_t data_address
;
21 uint32_t next_descriptor
;
23 uint32_t multi_io_mode
:3;
28 //------------------------//
31 uint32_t bounce_length
;
53 enum bus_xfer_direction
{
59 struct cmd_desc descriptors
[3];
60 uint8_t buffers
[3][CACHE_LINE_SIZE
];
61 } *dma
= (void *)_dma_coherent
;
63 static void dma_transfer_chain(struct cmd_desc
*chain
)
65 uint32_t mstr_int_status
;
67 write32(&qcom_qspi
->mstr_int_sts
, 0xFFFFFFFF);
68 write32(&qcom_qspi
->next_dma_desc_addr
, (uint32_t)(uintptr_t)chain
);
71 mstr_int_status
= read32(&qcom_qspi
->mstr_int_sts
);
72 if (mstr_int_status
& DMA_CHAIN_DONE
)
77 static void flush_chain(void)
79 struct cmd_desc
*desc
= &dma
->descriptors
[0];
83 dma_transfer_chain(desc
);
86 if (desc
->direction
== MASTER_READ
) {
87 if (desc
->bounce_length
== 0)
88 dcache_invalidate_by_mva(
89 (void *)(uintptr_t)desc
->data_address
,
92 src
= (void *)(uintptr_t)desc
->bounce_src
;
93 dst
= (void *)(uintptr_t)desc
->bounce_dst
;
94 memcpy(dst
, src
, desc
->bounce_length
);
97 desc
= (void *)(uintptr_t)desc
->next_descriptor
;
102 static struct cmd_desc
*allocate_descriptor(void)
104 struct cmd_desc
*current
;
105 struct cmd_desc
*next
;
108 current
= (curr_desc_idx
== -1) ?
109 NULL
: &dma
->descriptors
[curr_desc_idx
];
111 index
= ++curr_desc_idx
;
112 next
= &dma
->descriptors
[index
];
114 next
->data_address
= (uint32_t)(uintptr_t)dma
->buffers
[index
];
116 next
->next_descriptor
= 0;
117 next
->direction
= MASTER_READ
;
118 next
->multi_io_mode
= 0;
121 * QSPI controller doesn't support transfer starts with read segment.
122 * So to support read transfers that are not preceded by write, set
123 * transfer fragment bit = 1
128 next
->bounce_src
= 0;
129 next
->bounce_dst
= 0;
130 next
->bounce_length
= 0;
133 current
->next_descriptor
= (uint32_t)(uintptr_t)next
;
138 static void cs_change(enum cs_state state
)
140 gpio_set(QSPI_CS
, state
== CS_DEASSERT
);
143 static void configure_gpios(void)
145 gpio_output(QSPI_CS
, 1);
147 gpio_configure(QSPI_DATA_0
, GPIO_FUNC_QSPI_DATA_0
,
148 GPIO_NO_PULL
, GPIO_8MA
, GPIO_OUTPUT
);
150 gpio_configure(QSPI_DATA_1
, GPIO_FUNC_QSPI_DATA_1
,
151 GPIO_NO_PULL
, GPIO_8MA
, GPIO_OUTPUT
);
153 gpio_configure(QSPI_CLK
, GPIO_FUNC_QSPI_CLK
,
154 GPIO_NO_PULL
, GPIO_8MA
, GPIO_OUTPUT
);
157 static void queue_bounce_data(uint8_t *data
, uint32_t data_bytes
,
158 enum qspi_mode data_mode
, bool write
)
160 struct cmd_desc
*desc
;
163 desc
= allocate_descriptor();
164 desc
->direction
= write
;
165 desc
->multi_io_mode
= data_mode
;
166 ptr
= (void *)(uintptr_t)desc
->data_address
;
169 memcpy(ptr
, data
, data_bytes
);
171 desc
->bounce_src
= (uint32_t)(uintptr_t)ptr
;
172 desc
->bounce_dst
= (uint32_t)(uintptr_t)data
;
173 desc
->bounce_length
= data_bytes
;
176 desc
->length
= data_bytes
;
179 static void queue_direct_data(uint8_t *data
, uint32_t data_bytes
,
180 enum qspi_mode data_mode
, bool write
)
182 struct cmd_desc
*desc
;
184 desc
= allocate_descriptor();
185 desc
->direction
= write
;
186 desc
->multi_io_mode
= data_mode
;
187 desc
->data_address
= (uint32_t)(uintptr_t)data
;
188 desc
->length
= data_bytes
;
191 dcache_clean_by_mva(data
, data_bytes
);
193 dcache_invalidate_by_mva(data
, data_bytes
);
196 static void queue_data(uint8_t *data
, uint32_t data_bytes
,
197 enum qspi_mode data_mode
, bool write
)
199 uint8_t *aligned_ptr
;
201 uint32_t prolog_bytes
, aligned_bytes
, epilog_bytes
;
207 (uint8_t *)ALIGN_UP((uintptr_t)data
, CACHE_LINE_SIZE
);
209 prolog_bytes
= MIN(data_bytes
, aligned_ptr
- data
);
210 aligned_bytes
= ALIGN_DOWN(data_bytes
- prolog_bytes
, CACHE_LINE_SIZE
);
211 epilog_bytes
= data_bytes
- prolog_bytes
- aligned_bytes
;
213 epilog_ptr
= data
+ prolog_bytes
+ aligned_bytes
;
216 queue_bounce_data(data
, prolog_bytes
, data_mode
, write
);
218 queue_direct_data(aligned_ptr
, aligned_bytes
, data_mode
, write
);
220 queue_bounce_data(epilog_ptr
, epilog_bytes
, data_mode
, write
);
223 static void reg_init(void)
226 uint32_t tx_data_oe_delay
, tx_data_delay
;
227 uint32_t mstr_config
;
231 tx_data_oe_delay
= 0;
234 mstr_config
= (tx_data_oe_delay
<< TX_DATA_OE_DELAY_SHIFT
) |
235 (tx_data_delay
<< TX_DATA_DELAY_SHIFT
) | (SBL_EN
) |
236 (spi_mode
<< SPI_MODE_SHIFT
) |
242 write32(&qcom_qspi
->mstr_cfg
, mstr_config
);
243 write32(&qcom_qspi
->ahb_mstr_cfg
, 0xA42);
244 write32(&qcom_qspi
->mstr_int_en
, 0x0);
245 write32(&qcom_qspi
->mstr_int_sts
, 0xFFFFFFFF);
246 write32(&qcom_qspi
->rd_fifo_cfg
, 0x0);
247 write32(&qcom_qspi
->rd_fifo_rst
, RESET_FIFO
);
250 void quadspi_init(uint32_t hz
)
252 assert(dcache_line_bytes() == CACHE_LINE_SIZE
);
253 clock_configure_qspi(hz
* 4);
258 int qspi_claim_bus(const struct spi_slave
*slave
)
260 cs_change(CS_ASSERT
);
264 void qspi_release_bus(const struct spi_slave
*slave
)
266 cs_change(CS_DEASSERT
);
269 static int xfer(enum qspi_mode mode
, const void *dout
, size_t out_bytes
,
270 void *din
, size_t in_bytes
)
272 if ((out_bytes
&& !dout
) || (in_bytes
&& !din
) ||
273 (in_bytes
&& out_bytes
)) {
277 queue_data((uint8_t *)(out_bytes
? dout
: din
),
278 in_bytes
| out_bytes
, mode
, !!out_bytes
);
285 int qspi_xfer(const struct spi_slave
*slave
, const void *dout
,
286 size_t out_bytes
, void *din
, size_t in_bytes
)
288 return xfer(SDR_1BIT
, dout
, out_bytes
, din
, in_bytes
);
291 int qspi_xfer_dual(const struct spi_slave
*slave
, const void *dout
,
292 size_t out_bytes
, void *din
, size_t in_bytes
)
294 return xfer(SDR_2BIT
, dout
, out_bytes
, din
, in_bytes
);