8
8
9
9
#include <linux/acpi.h>
10
10
#include <linux/delay.h>
11
+ #include <linux/dma-mapping.h>
11
12
#include <linux/init.h>
12
13
#include <linux/io-64-nonatomic-lo-hi.h>
13
14
#include <linux/iopoll.h>
50
51
#define AMD_SPI_SPD7_SHIFT 8
51
52
#define AMD_SPI_SPD7_MASK GENMASK(13, AMD_SPI_SPD7_SHIFT)
52
53
54
+ #define AMD_SPI_HID2_INPUT_RING_BUF0 0X100
55
+ #define AMD_SPI_HID2_CNTRL 0x150
56
+ #define AMD_SPI_HID2_INT_STATUS 0x154
57
+ #define AMD_SPI_HID2_CMD_START 0x156
58
+ #define AMD_SPI_HID2_INT_MASK 0x158
59
+ #define AMD_SPI_HID2_READ_CNTRL0 0x170
60
+ #define AMD_SPI_HID2_READ_CNTRL1 0x174
61
+ #define AMD_SPI_HID2_READ_CNTRL2 0x180
62
+
53
63
#define AMD_SPI_MAX_HZ 100000000
54
64
#define AMD_SPI_MIN_HZ 800000
55
65
66
+ #define AMD_SPI_IO_SLEEP_US 20
67
+ #define AMD_SPI_IO_TIMEOUT_US 2000000
68
+
56
69
/* SPI read command opcodes */
57
70
#define AMD_SPI_OP_READ 0x03 /* Read data bytes (low frequency) */
58
71
#define AMD_SPI_OP_READ_FAST 0x0b /* Read data bytes (high frequency) */
@@ -108,11 +121,15 @@ struct amd_spi_freq {
108
121
/**
109
122
* struct amd_spi - SPI driver instance
110
123
* @io_remap_addr: Start address of the SPI controller registers
124
+ * @phy_dma_buf: Physical address of DMA buffer
125
+ * @dma_virt_addr: Virtual address of DMA buffer
111
126
* @version: SPI controller hardware version
112
127
* @speed_hz: Device frequency
113
128
*/
114
129
struct amd_spi {
115
130
void __iomem * io_remap_addr ;
131
+ dma_addr_t phy_dma_buf ;
132
+ void * dma_virt_addr ;
116
133
enum amd_spi_versions version ;
117
134
unsigned int speed_hz ;
118
135
};
@@ -135,6 +152,16 @@ static void amd_spi_setclear_reg8(struct amd_spi *amd_spi, int idx, u8 set, u8 c
135
152
amd_spi_writereg8 (amd_spi , idx , tmp );
136
153
}
137
154
155
+ static inline u16 amd_spi_readreg16 (struct amd_spi * amd_spi , int idx )
156
+ {
157
+ return readw ((u8 __iomem * )amd_spi -> io_remap_addr + idx );
158
+ }
159
+
160
+ static inline void amd_spi_writereg16 (struct amd_spi * amd_spi , int idx , u16 val )
161
+ {
162
+ writew (val , ((u8 __iomem * )amd_spi -> io_remap_addr + idx ));
163
+ }
164
+
138
165
static inline u32 amd_spi_readreg32 (struct amd_spi * amd_spi , int idx )
139
166
{
140
167
return readl ((u8 __iomem * )amd_spi -> io_remap_addr + idx );
@@ -517,36 +544,117 @@ static void amd_spi_mem_data_out(struct amd_spi *amd_spi,
517
544
amd_spi_execute_opcode (amd_spi );
518
545
}
519
546
547
+ static void amd_spi_hiddma_read (struct amd_spi * amd_spi , const struct spi_mem_op * op )
548
+ {
549
+ u16 hid_cmd_start , val ;
550
+ u32 hid_regval ;
551
+
552
+ /* Set the opcode in hid2_read_control0 register */
553
+ hid_regval = amd_spi_readreg32 (amd_spi , AMD_SPI_HID2_READ_CNTRL0 );
554
+ hid_regval = (hid_regval & ~GENMASK (7 , 0 )) | op -> cmd .opcode ;
555
+
556
+ /*
557
+ * Program the address in the hid2_read_control0 register [8:31]. The address should
558
+ * be written starting from the 8th bit of the register, requiring an 8-bit shift.
559
+ * Additionally, to convert a 2-byte spinand address to a 3-byte address, another
560
+ * 8-bit shift is needed. Therefore, a total shift of 16 bits is required.
561
+ */
562
+ hid_regval = (hid_regval & ~GENMASK (31 , 8 )) | (op -> addr .val << 16 );
563
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_READ_CNTRL0 , hid_regval );
564
+
565
+ /* Configure dummy clock cycles for fast read, dual, quad I/O commands */
566
+ hid_regval = amd_spi_readreg32 (amd_spi , AMD_SPI_HID2_READ_CNTRL2 );
567
+ /* Fast read dummy cycle */
568
+ hid_regval &= ~GENMASK (4 , 0 );
569
+
570
+ /* Fast read Dual I/O dummy cycle */
571
+ hid_regval &= ~GENMASK (12 , 8 );
572
+
573
+ /* Fast read Quad I/O dummy cycle */
574
+ hid_regval = (hid_regval & ~GENMASK (20 , 16 )) | BIT (17 );
575
+
576
+ /* Set no of preamble bytecount */
577
+ hid_regval &= ~GENMASK (27 , 24 );
578
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_READ_CNTRL2 , hid_regval );
579
+
580
+ /*
581
+ * Program the HID2 Input Ring Buffer0. 4k aligned buf_memory_addr[31:12],
582
+ * buf_size[4:0], end_input_ring[5].
583
+ */
584
+ hid_regval = amd_spi -> phy_dma_buf | BIT (5 ) | BIT (0 );
585
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_INPUT_RING_BUF0 , hid_regval );
586
+
587
+ /* Program max read length(no of DWs) in hid2_read_control1 register */
588
+ hid_regval = amd_spi_readreg32 (amd_spi , AMD_SPI_HID2_READ_CNTRL1 );
589
+ hid_regval = (hid_regval & ~GENMASK (15 , 0 )) | ((op -> data .nbytes / 4 ) - 1 );
590
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_READ_CNTRL1 , hid_regval );
591
+
592
+ /* Set cmd start bit in hid2_cmd_start register to trigger HID basic read operation */
593
+ hid_cmd_start = amd_spi_readreg16 (amd_spi , AMD_SPI_HID2_CMD_START );
594
+ amd_spi_writereg16 (amd_spi , AMD_SPI_HID2_CMD_START , (hid_cmd_start | BIT (3 )));
595
+
596
+ /* Check interrupt status of HIDDMA basic read operation in hid2_int_status register */
597
+ readw_poll_timeout (amd_spi -> io_remap_addr + AMD_SPI_HID2_INT_STATUS , val ,
598
+ (val & BIT (3 )), AMD_SPI_IO_SLEEP_US , AMD_SPI_IO_TIMEOUT_US );
599
+
600
+ /* Clear the interrupts by writing to hid2_int_status register */
601
+ val = amd_spi_readreg16 (amd_spi , AMD_SPI_HID2_INT_STATUS );
602
+ amd_spi_writereg16 (amd_spi , AMD_SPI_HID2_INT_STATUS , val );
603
+ }
604
+
520
605
static void amd_spi_mem_data_in (struct amd_spi * amd_spi ,
521
606
const struct spi_mem_op * op )
522
607
{
523
608
int base_addr = AMD_SPI_FIFO_BASE + op -> addr .nbytes ;
524
609
u64 * buf_64 = (u64 * )op -> data .buf .in ;
525
610
u32 nbytes = op -> data .nbytes ;
526
611
u32 left_data = nbytes ;
612
+ u32 data ;
527
613
u8 * buf ;
528
614
int i ;
529
615
530
- amd_spi_set_opcode (amd_spi , op -> cmd .opcode );
531
- amd_spi_set_addr (amd_spi , op );
532
- amd_spi_set_tx_count (amd_spi , op -> addr .nbytes + op -> dummy .nbytes );
533
-
534
- for (i = 0 ; i < op -> dummy .nbytes ; i ++ )
535
- amd_spi_writereg8 (amd_spi , (base_addr + i ), 0xff );
536
-
537
- amd_spi_set_rx_count (amd_spi , op -> data .nbytes );
538
- amd_spi_clear_fifo_ptr (amd_spi );
539
- amd_spi_execute_opcode (amd_spi );
540
- amd_spi_busy_wait (amd_spi );
541
-
542
- for (i = 0 ; left_data >= 8 ; i ++ , left_data -= 8 )
543
- * buf_64 ++ = amd_spi_readreg64 (amd_spi , base_addr + op -> dummy .nbytes +
544
- (i * 8 ));
616
+ /*
617
+ * Condition for using HID read mode. Only for reading complete page data, use HID read.
618
+ * Use index mode otherwise.
619
+ */
620
+ if (amd_spi -> version == AMD_HID2_SPI && amd_is_spi_read_cmd (op -> cmd .opcode )) {
621
+ amd_spi_hiddma_read (amd_spi , op );
622
+
623
+ for (i = 0 ; left_data >= 8 ; i ++ , left_data -= 8 )
624
+ * buf_64 ++ = readq ((u8 __iomem * )amd_spi -> dma_virt_addr + (i * 8 ));
625
+
626
+ buf = (u8 * )buf_64 ;
627
+ for (i = 0 ; i < left_data ; i ++ )
628
+ buf [i ] = readb ((u8 __iomem * )amd_spi -> dma_virt_addr +
629
+ (nbytes - left_data + i ));
630
+
631
+ /* Reset HID RX memory logic */
632
+ data = amd_spi_readreg32 (amd_spi , AMD_SPI_HID2_CNTRL );
633
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_CNTRL , data | BIT (5 ));
634
+ } else {
635
+ /* Index mode */
636
+ amd_spi_set_opcode (amd_spi , op -> cmd .opcode );
637
+ amd_spi_set_addr (amd_spi , op );
638
+ amd_spi_set_tx_count (amd_spi , op -> addr .nbytes + op -> dummy .nbytes );
639
+
640
+ for (i = 0 ; i < op -> dummy .nbytes ; i ++ )
641
+ amd_spi_writereg8 (amd_spi , (base_addr + i ), 0xff );
642
+
643
+ amd_spi_set_rx_count (amd_spi , op -> data .nbytes );
644
+ amd_spi_clear_fifo_ptr (amd_spi );
645
+ amd_spi_execute_opcode (amd_spi );
646
+ amd_spi_busy_wait (amd_spi );
647
+
648
+ for (i = 0 ; left_data >= 8 ; i ++ , left_data -= 8 )
649
+ * buf_64 ++ = amd_spi_readreg64 (amd_spi , base_addr + op -> dummy .nbytes +
650
+ (i * 8 ));
651
+
652
+ buf = (u8 * )buf_64 ;
653
+ for (i = 0 ; i < left_data ; i ++ )
654
+ buf [i ] = amd_spi_readreg8 (amd_spi , base_addr + op -> dummy .nbytes +
655
+ nbytes + i - left_data );
656
+ }
545
657
546
- buf = (u8 * )buf_64 ;
547
- for (i = 0 ; i < left_data ; i ++ )
548
- buf [i ] = amd_spi_readreg8 (amd_spi , base_addr + op -> dummy .nbytes +
549
- nbytes + i - left_data );
550
658
}
551
659
552
660
static void amd_set_spi_addr_mode (struct amd_spi * amd_spi ,
@@ -617,6 +725,31 @@ static size_t amd_spi_max_transfer_size(struct spi_device *spi)
617
725
return AMD_SPI_FIFO_SIZE ;
618
726
}
619
727
728
+ static int amd_spi_setup_hiddma (struct amd_spi * amd_spi , struct device * dev )
729
+ {
730
+ u32 hid_regval ;
731
+
732
+ /* Allocate DMA buffer to use for HID basic read operation */
733
+ amd_spi -> dma_virt_addr = dma_alloc_coherent (dev , AMD_SPI_HID2_DMA_SIZE ,
734
+ & amd_spi -> phy_dma_buf , GFP_KERNEL );
735
+ if (!amd_spi -> dma_virt_addr )
736
+ return - ENOMEM ;
737
+
738
+ /*
739
+ * Enable interrupts and set mask bits in hid2_int_mask register to generate interrupt
740
+ * properly for HIDDMA basic read operations.
741
+ */
742
+ hid_regval = amd_spi_readreg32 (amd_spi , AMD_SPI_HID2_INT_MASK );
743
+ hid_regval = (hid_regval & GENMASK (31 , 8 )) | BIT (19 );
744
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_INT_MASK , hid_regval );
745
+
746
+ /* Configure buffer unit(4k) in hid2_control register */
747
+ hid_regval = amd_spi_readreg32 (amd_spi , AMD_SPI_HID2_CNTRL );
748
+ amd_spi_writereg32 (amd_spi , AMD_SPI_HID2_CNTRL , hid_regval & ~BIT (3 ));
749
+
750
+ return 0 ;
751
+ }
752
+
620
753
static int amd_spi_probe (struct platform_device * pdev )
621
754
{
622
755
struct device * dev = & pdev -> dev ;
@@ -657,7 +790,10 @@ static int amd_spi_probe(struct platform_device *pdev)
657
790
if (err )
658
791
return dev_err_probe (dev , err , "error registering SPI controller\n" );
659
792
660
- return 0 ;
793
+ if (amd_spi -> version == AMD_HID2_SPI )
794
+ err = amd_spi_setup_hiddma (amd_spi , dev );
795
+
796
+ return err ;
661
797
}
662
798
663
799
#ifdef CONFIG_ACPI
0 commit comments