2
2
// Copyright (c) 2017-2018, The Linux foundation. All rights reserved.
3
3
4
4
#include <linux/clk.h>
5
+ #include <linux/dmapool.h>
6
+ #include <linux/dma-mapping.h>
5
7
#include <linux/interconnect.h>
6
8
#include <linux/interrupt.h>
7
9
#include <linux/io.h>
62
64
#define WR_FIFO_FULL BIT(10)
63
65
#define WR_FIFO_OVERRUN BIT(11)
64
66
#define TRANSACTION_DONE BIT(16)
67
+ #define DMA_CHAIN_DONE BIT(31)
65
68
#define QSPI_ERR_IRQS (RESP_FIFO_UNDERRUN | HRESP_FROM_NOC_ERR | \
66
69
WR_FIFO_OVERRUN)
67
70
#define QSPI_ALL_IRQS (QSPI_ERR_IRQS | RESP_FIFO_RDY | \
108
111
#define RD_FIFO_RESET 0x0030
109
112
#define RESET_FIFO BIT(0)
110
113
114
+ #define NEXT_DMA_DESC_ADDR 0x0040
115
+ #define CURRENT_DMA_DESC_ADDR 0x0044
116
+ #define CURRENT_MEM_ADDR 0x0048
117
+
111
118
#define CUR_MEM_ADDR 0x0048
112
119
#define HW_VERSION 0x004c
113
120
#define RD_FIFO 0x0050
114
121
#define SAMPLING_CLK_CFG 0x0090
115
122
#define SAMPLING_CLK_STATUS 0x0094
116
123
124
+ #define QSPI_ALIGN_REQ 32
117
125
118
126
enum qspi_dir {
119
127
QSPI_READ ,
120
128
QSPI_WRITE ,
121
129
};
122
130
131
+ struct qspi_cmd_desc {
132
+ u32 data_address ;
133
+ u32 next_descriptor ;
134
+ u32 direction :1 ;
135
+ u32 multi_io_mode :3 ;
136
+ u32 reserved1 :4 ;
137
+ u32 fragment :1 ;
138
+ u32 reserved2 :7 ;
139
+ u32 length :16 ;
140
+ };
141
+
123
142
struct qspi_xfer {
124
143
union {
125
144
const void * tx_buf ;
@@ -137,11 +156,23 @@ enum qspi_clocks {
137
156
QSPI_NUM_CLKS
138
157
};
139
158
159
+ /*
160
+ * Number of entries in sgt returned from spi framework that-
161
+ * will be supported. Can be modified as required.
162
+ * In practice, given max_dma_len is 64KB, the number of
163
+ * entries is not expected to exceed 1.
164
+ */
165
+ #define QSPI_MAX_SG 5
166
+
140
167
struct qcom_qspi {
141
168
void __iomem * base ;
142
169
struct device * dev ;
143
170
struct clk_bulk_data * clks ;
144
171
struct qspi_xfer xfer ;
172
+ struct dma_pool * dma_cmd_pool ;
173
+ dma_addr_t dma_cmd_desc [QSPI_MAX_SG ];
174
+ void * virt_cmd_desc [QSPI_MAX_SG ];
175
+ unsigned int n_cmd_desc ;
145
176
struct icc_path * icc_path_cpu_to_qspi ;
146
177
unsigned long last_speed ;
147
178
/* Lock to protect data accessed by IRQs */
@@ -153,21 +184,22 @@ static u32 qspi_buswidth_to_iomode(struct qcom_qspi *ctrl,
153
184
{
154
185
switch (buswidth ) {
155
186
case 1 :
156
- return SDR_1BIT << MULTI_IO_MODE_SHFT ;
187
+ return SDR_1BIT ;
157
188
case 2 :
158
- return SDR_2BIT << MULTI_IO_MODE_SHFT ;
189
+ return SDR_2BIT ;
159
190
case 4 :
160
- return SDR_4BIT << MULTI_IO_MODE_SHFT ;
191
+ return SDR_4BIT ;
161
192
default :
162
193
dev_warn_once (ctrl -> dev ,
163
194
"Unexpected bus width: %u\n" , buswidth );
164
- return SDR_1BIT << MULTI_IO_MODE_SHFT ;
195
+ return SDR_1BIT ;
165
196
}
166
197
}
167
198
168
199
static void qcom_qspi_pio_xfer_cfg (struct qcom_qspi * ctrl )
169
200
{
170
201
u32 pio_xfer_cfg ;
202
+ u32 iomode ;
171
203
const struct qspi_xfer * xfer ;
172
204
173
205
xfer = & ctrl -> xfer ;
@@ -179,7 +211,8 @@ static void qcom_qspi_pio_xfer_cfg(struct qcom_qspi *ctrl)
179
211
else
180
212
pio_xfer_cfg |= TRANSFER_FRAGMENT ;
181
213
pio_xfer_cfg &= ~MULTI_IO_MODE_MSK ;
182
- pio_xfer_cfg |= qspi_buswidth_to_iomode (ctrl , xfer -> buswidth );
214
+ iomode = qspi_buswidth_to_iomode (ctrl , xfer -> buswidth );
215
+ pio_xfer_cfg |= iomode << MULTI_IO_MODE_SHFT ;
183
216
184
217
writel (pio_xfer_cfg , ctrl -> base + PIO_XFER_CFG );
185
218
}
@@ -217,12 +250,22 @@ static void qcom_qspi_pio_xfer(struct qcom_qspi *ctrl)
217
250
static void qcom_qspi_handle_err (struct spi_master * master ,
218
251
struct spi_message * msg )
219
252
{
253
+ u32 int_status ;
220
254
struct qcom_qspi * ctrl = spi_master_get_devdata (master );
221
255
unsigned long flags ;
256
+ int i ;
222
257
223
258
spin_lock_irqsave (& ctrl -> lock , flags );
224
259
writel (0 , ctrl -> base + MSTR_INT_EN );
260
+ int_status = readl (ctrl -> base + MSTR_INT_STATUS );
261
+ writel (int_status , ctrl -> base + MSTR_INT_STATUS );
225
262
ctrl -> xfer .rem_bytes = 0 ;
263
+
264
+ /* free cmd descriptors if they are around (DMA mode) */
265
+ for (i = 0 ; i < ctrl -> n_cmd_desc ; i ++ )
266
+ dma_pool_free (ctrl -> dma_cmd_pool , ctrl -> virt_cmd_desc [i ],
267
+ ctrl -> dma_cmd_desc [i ]);
268
+ ctrl -> n_cmd_desc = 0 ;
226
269
spin_unlock_irqrestore (& ctrl -> lock , flags );
227
270
}
228
271
@@ -242,7 +285,7 @@ static int qcom_qspi_set_speed(struct qcom_qspi *ctrl, unsigned long speed_hz)
242
285
}
243
286
244
287
/*
245
- * Set BW quota for CPU as driver supports FIFO mode only .
288
+ * Set BW quota for CPU.
246
289
* We don't have explicit peak requirement so keep it equal to avg_bw.
247
290
*/
248
291
avg_bw_cpu = Bps_to_icc (speed_hz );
@@ -258,6 +301,102 @@ static int qcom_qspi_set_speed(struct qcom_qspi *ctrl, unsigned long speed_hz)
258
301
return 0 ;
259
302
}
260
303
304
+ static int qcom_qspi_alloc_desc (struct qcom_qspi * ctrl , dma_addr_t dma_ptr ,
305
+ uint32_t n_bytes )
306
+ {
307
+ struct qspi_cmd_desc * virt_cmd_desc , * prev ;
308
+ dma_addr_t dma_cmd_desc ;
309
+
310
+ /* allocate for dma cmd descriptor */
311
+ virt_cmd_desc = dma_pool_alloc (ctrl -> dma_cmd_pool , GFP_KERNEL | __GFP_ZERO , & dma_cmd_desc );
312
+ if (!virt_cmd_desc )
313
+ return - ENOMEM ;
314
+
315
+ ctrl -> virt_cmd_desc [ctrl -> n_cmd_desc ] = virt_cmd_desc ;
316
+ ctrl -> dma_cmd_desc [ctrl -> n_cmd_desc ] = dma_cmd_desc ;
317
+ ctrl -> n_cmd_desc ++ ;
318
+
319
+ /* setup cmd descriptor */
320
+ virt_cmd_desc -> data_address = dma_ptr ;
321
+ virt_cmd_desc -> direction = ctrl -> xfer .dir ;
322
+ virt_cmd_desc -> multi_io_mode = qspi_buswidth_to_iomode (ctrl , ctrl -> xfer .buswidth );
323
+ virt_cmd_desc -> fragment = !ctrl -> xfer .is_last ;
324
+ virt_cmd_desc -> length = n_bytes ;
325
+
326
+ /* update previous descriptor */
327
+ if (ctrl -> n_cmd_desc >= 2 ) {
328
+ prev = (ctrl -> virt_cmd_desc )[ctrl -> n_cmd_desc - 2 ];
329
+ prev -> next_descriptor = dma_cmd_desc ;
330
+ prev -> fragment = 1 ;
331
+ }
332
+
333
+ return 0 ;
334
+ }
335
+
336
+ static int qcom_qspi_setup_dma_desc (struct qcom_qspi * ctrl ,
337
+ struct spi_transfer * xfer )
338
+ {
339
+ int ret ;
340
+ struct sg_table * sgt ;
341
+ dma_addr_t dma_ptr_sg ;
342
+ unsigned int dma_len_sg ;
343
+ int i ;
344
+
345
+ if (ctrl -> n_cmd_desc ) {
346
+ dev_err (ctrl -> dev , "Remnant dma buffers n_cmd_desc-%d\n" , ctrl -> n_cmd_desc );
347
+ return - EIO ;
348
+ }
349
+
350
+ sgt = (ctrl -> xfer .dir == QSPI_READ ) ? & xfer -> rx_sg : & xfer -> tx_sg ;
351
+ if (!sgt -> nents || sgt -> nents > QSPI_MAX_SG ) {
352
+ dev_warn_once (ctrl -> dev , "Cannot handle %d entries in scatter list\n" , sgt -> nents );
353
+ return - EAGAIN ;
354
+ }
355
+
356
+ for (i = 0 ; i < sgt -> nents ; i ++ ) {
357
+ dma_ptr_sg = sg_dma_address (sgt -> sgl + i );
358
+ if (!IS_ALIGNED (dma_ptr_sg , QSPI_ALIGN_REQ )) {
359
+ dev_warn_once (ctrl -> dev , "dma_address not aligned to %d\n" , QSPI_ALIGN_REQ );
360
+ return - EAGAIN ;
361
+ }
362
+ }
363
+
364
+ for (i = 0 ; i < sgt -> nents ; i ++ ) {
365
+ dma_ptr_sg = sg_dma_address (sgt -> sgl + i );
366
+ dma_len_sg = sg_dma_len (sgt -> sgl + i );
367
+
368
+ ret = qcom_qspi_alloc_desc (ctrl , dma_ptr_sg , dma_len_sg );
369
+ if (ret )
370
+ goto cleanup ;
371
+ }
372
+ return 0 ;
373
+
374
+ cleanup :
375
+ for (i = 0 ; i < ctrl -> n_cmd_desc ; i ++ )
376
+ dma_pool_free (ctrl -> dma_cmd_pool , ctrl -> virt_cmd_desc [i ],
377
+ ctrl -> dma_cmd_desc [i ]);
378
+ ctrl -> n_cmd_desc = 0 ;
379
+ return ret ;
380
+ }
381
+
382
+ static void qcom_qspi_dma_xfer (struct qcom_qspi * ctrl )
383
+ {
384
+ /* Setup new interrupts */
385
+ writel (DMA_CHAIN_DONE , ctrl -> base + MSTR_INT_EN );
386
+
387
+ /* kick off transfer */
388
+ writel ((u32 )((ctrl -> dma_cmd_desc )[0 ]), ctrl -> base + NEXT_DMA_DESC_ADDR );
389
+ }
390
+
391
+ /* Switch to DMA if transfer length exceeds this */
392
+ #define QSPI_MAX_BYTES_FIFO 64
393
+
394
+ static bool qcom_qspi_can_dma (struct spi_controller * ctlr ,
395
+ struct spi_device * slv , struct spi_transfer * xfer )
396
+ {
397
+ return xfer -> len > QSPI_MAX_BYTES_FIFO ;
398
+ }
399
+
261
400
static int qcom_qspi_transfer_one (struct spi_master * master ,
262
401
struct spi_device * slv ,
263
402
struct spi_transfer * xfer )
@@ -266,6 +405,7 @@ static int qcom_qspi_transfer_one(struct spi_master *master,
266
405
int ret ;
267
406
unsigned long speed_hz ;
268
407
unsigned long flags ;
408
+ u32 mstr_cfg ;
269
409
270
410
speed_hz = slv -> max_speed_hz ;
271
411
if (xfer -> speed_hz )
@@ -276,6 +416,7 @@ static int qcom_qspi_transfer_one(struct spi_master *master,
276
416
return ret ;
277
417
278
418
spin_lock_irqsave (& ctrl -> lock , flags );
419
+ mstr_cfg = readl (ctrl -> base + MSTR_CONFIG );
279
420
280
421
/* We are half duplex, so either rx or tx will be set */
281
422
if (xfer -> rx_buf ) {
@@ -290,10 +431,36 @@ static int qcom_qspi_transfer_one(struct spi_master *master,
290
431
ctrl -> xfer .is_last = list_is_last (& xfer -> transfer_list ,
291
432
& master -> cur_msg -> transfers );
292
433
ctrl -> xfer .rem_bytes = xfer -> len ;
434
+
435
+ if (xfer -> rx_sg .nents || xfer -> tx_sg .nents ) {
436
+ /* do DMA transfer */
437
+ if (!(mstr_cfg & DMA_ENABLE )) {
438
+ mstr_cfg |= DMA_ENABLE ;
439
+ writel (mstr_cfg , ctrl -> base + MSTR_CONFIG );
440
+ }
441
+
442
+ ret = qcom_qspi_setup_dma_desc (ctrl , xfer );
443
+ if (ret != - EAGAIN ) {
444
+ if (!ret )
445
+ qcom_qspi_dma_xfer (ctrl );
446
+ goto exit ;
447
+ }
448
+ dev_warn_once (ctrl -> dev , "DMA failure, falling back to PIO" );
449
+ ret = 0 ; /* We'll retry w/ PIO */
450
+ }
451
+
452
+ if (mstr_cfg & DMA_ENABLE ) {
453
+ mstr_cfg &= ~DMA_ENABLE ;
454
+ writel (mstr_cfg , ctrl -> base + MSTR_CONFIG );
455
+ }
293
456
qcom_qspi_pio_xfer (ctrl );
294
457
458
+ exit :
295
459
spin_unlock_irqrestore (& ctrl -> lock , flags );
296
460
461
+ if (ret )
462
+ return ret ;
463
+
297
464
/* We'll call spi_finalize_current_transfer() when done */
298
465
return 1 ;
299
466
}
@@ -328,6 +495,16 @@ static int qcom_qspi_prepare_message(struct spi_master *master,
328
495
return 0 ;
329
496
}
330
497
498
+ static int qcom_qspi_alloc_dma (struct qcom_qspi * ctrl )
499
+ {
500
+ ctrl -> dma_cmd_pool = dmam_pool_create ("qspi cmd desc pool" ,
501
+ ctrl -> dev , sizeof (struct qspi_cmd_desc ), 0 , 0 );
502
+ if (!ctrl -> dma_cmd_pool )
503
+ return - ENOMEM ;
504
+
505
+ return 0 ;
506
+ }
507
+
331
508
static irqreturn_t pio_read (struct qcom_qspi * ctrl )
332
509
{
333
510
u32 rd_fifo_status ;
@@ -426,6 +603,7 @@ static irqreturn_t qcom_qspi_irq(int irq, void *dev_id)
426
603
int_status = readl (ctrl -> base + MSTR_INT_STATUS );
427
604
writel (int_status , ctrl -> base + MSTR_INT_STATUS );
428
605
606
+ /* PIO mode handling */
429
607
if (ctrl -> xfer .dir == QSPI_WRITE ) {
430
608
if (int_status & WR_FIFO_EMPTY )
431
609
ret = pio_write (ctrl );
@@ -449,6 +627,22 @@ static irqreturn_t qcom_qspi_irq(int irq, void *dev_id)
449
627
spi_finalize_current_transfer (dev_get_drvdata (ctrl -> dev ));
450
628
}
451
629
630
+ /* DMA mode handling */
631
+ if (int_status & DMA_CHAIN_DONE ) {
632
+ int i ;
633
+
634
+ writel (0 , ctrl -> base + MSTR_INT_EN );
635
+ ctrl -> xfer .rem_bytes = 0 ;
636
+
637
+ for (i = 0 ; i < ctrl -> n_cmd_desc ; i ++ )
638
+ dma_pool_free (ctrl -> dma_cmd_pool , ctrl -> virt_cmd_desc [i ],
639
+ ctrl -> dma_cmd_desc [i ]);
640
+ ctrl -> n_cmd_desc = 0 ;
641
+
642
+ ret = IRQ_HANDLED ;
643
+ spi_finalize_current_transfer (dev_get_drvdata (ctrl -> dev ));
644
+ }
645
+
452
646
spin_unlock (& ctrl -> lock );
453
647
return ret ;
454
648
}
@@ -517,7 +711,13 @@ static int qcom_qspi_probe(struct platform_device *pdev)
517
711
return ret ;
518
712
}
519
713
714
+ ret = dma_set_mask_and_coherent (dev , DMA_BIT_MASK (32 ));
715
+ if (ret )
716
+ return dev_err_probe (dev , ret , "could not set DMA mask\n" );
717
+
520
718
master -> max_speed_hz = 300000000 ;
719
+ master -> max_dma_len = 65536 ; /* as per HPG */
720
+ master -> dma_alignment = QSPI_ALIGN_REQ ;
521
721
master -> num_chipselect = QSPI_NUM_CS ;
522
722
master -> bus_num = -1 ;
523
723
master -> dev .of_node = pdev -> dev .of_node ;
@@ -528,6 +728,8 @@ static int qcom_qspi_probe(struct platform_device *pdev)
528
728
master -> prepare_message = qcom_qspi_prepare_message ;
529
729
master -> transfer_one = qcom_qspi_transfer_one ;
530
730
master -> handle_err = qcom_qspi_handle_err ;
731
+ if (of_property_read_bool (pdev -> dev .of_node , "iommus" ))
732
+ master -> can_dma = qcom_qspi_can_dma ;
531
733
master -> auto_runtime_pm = true;
532
734
533
735
ret = devm_pm_opp_set_clkname (& pdev -> dev , "core" );
@@ -540,6 +742,10 @@ static int qcom_qspi_probe(struct platform_device *pdev)
540
742
return ret ;
541
743
}
542
744
745
+ ret = qcom_qspi_alloc_dma (ctrl );
746
+ if (ret )
747
+ return ret ;
748
+
543
749
pm_runtime_use_autosuspend (dev );
544
750
pm_runtime_set_autosuspend_delay (dev , 250 );
545
751
pm_runtime_enable (dev );
0 commit comments