2
2
/*
3
3
* PCIe controller driver for Renesas R-Car Gen4 Series SoCs
4
4
* Copyright (C) 2022-2023 Renesas Electronics Corporation
5
+ *
6
+ * The r8a779g0 (R-Car V4H) controller requires a specific firmware to be
7
+ * provided, to initialize the PHY. Otherwise, the PCIe controller will not
8
+ * work.
5
9
*/
6
10
7
11
#include <linux/delay.h>
12
+ #include <linux/firmware.h>
8
13
#include <linux/interrupt.h>
9
14
#include <linux/io.h>
15
+ #include <linux/iopoll.h>
10
16
#include <linux/module.h>
11
17
#include <linux/of.h>
12
18
#include <linux/pci.h>
20
26
/* Renesas-specific */
21
27
/* PCIe Mode Setting Register 0 */
22
28
#define PCIEMSR0 0x0000
23
- #define BIFUR_MOD_SET_ON BIT(0 )
29
+ #define APP_SRIS_MODE BIT(6 )
24
30
#define DEVICE_TYPE_EP 0
25
31
#define DEVICE_TYPE_RC BIT(4)
32
+ #define BIFUR_MOD_SET_ON BIT(0)
26
33
27
34
/* PCIe Interrupt Status 0 */
28
35
#define PCIEINTSTS0 0x0084
37
44
#define PCIEDMAINTSTSEN 0x0314
38
45
#define PCIEDMAINTSTSEN_INIT GENMASK(15, 0)
39
46
47
+ /* Port Logic Registers 89 */
48
+ #define PRTLGC89 0x0b70
49
+
50
+ /* Port Logic Registers 90 */
51
+ #define PRTLGC90 0x0b74
52
+
40
53
/* PCIe Reset Control Register 1 */
41
54
#define PCIERSTCTRL1 0x0014
42
55
#define APP_HOLD_PHY_RST BIT(16)
43
56
#define APP_LTSSM_ENABLE BIT(0)
44
57
58
+ /* PCIe Power Management Control */
59
+ #define PCIEPWRMNGCTRL 0x0070
60
+ #define APP_CLK_REQ_N BIT(11)
61
+ #define APP_CLK_PM_EN BIT(10)
62
+
45
63
#define RCAR_NUM_SPEED_CHANGE_RETRIES 10
46
64
#define RCAR_MAX_LINK_SPEED 4
47
65
48
66
#define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET 0x1000
49
67
#define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET 0x800
50
68
69
+ #define RCAR_GEN4_PCIE_FIRMWARE_NAME "rcar_gen4_pcie.bin"
70
+ #define RCAR_GEN4_PCIE_FIRMWARE_BASE_ADDR 0xc000
71
+ MODULE_FIRMWARE (RCAR_GEN4_PCIE_FIRMWARE_NAME );
72
+
51
73
struct rcar_gen4_pcie ;
52
74
struct rcar_gen4_pcie_drvdata {
75
+ void (* additional_common_init )(struct rcar_gen4_pcie * rcar );
53
76
int (* ltssm_control )(struct rcar_gen4_pcie * rcar , bool enable );
54
77
enum dw_pcie_device_mode mode ;
55
78
};
56
79
57
80
struct rcar_gen4_pcie {
58
81
struct dw_pcie dw ;
59
82
void __iomem * base ;
83
+ void __iomem * phy_base ;
60
84
struct platform_device * pdev ;
61
85
const struct rcar_gen4_pcie_drvdata * drvdata ;
62
86
};
@@ -180,6 +204,9 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
180
204
if (ret )
181
205
goto err_unprepare ;
182
206
207
+ if (rcar -> drvdata -> additional_common_init )
208
+ rcar -> drvdata -> additional_common_init (rcar );
209
+
183
210
return 0 ;
184
211
185
212
err_unprepare :
@@ -221,6 +248,10 @@ static void rcar_gen4_pcie_unprepare(struct rcar_gen4_pcie *rcar)
221
248
222
249
static int rcar_gen4_pcie_get_resources (struct rcar_gen4_pcie * rcar )
223
250
{
251
+ rcar -> phy_base = devm_platform_ioremap_resource_byname (rcar -> pdev , "phy" );
252
+ if (IS_ERR (rcar -> phy_base ))
253
+ return PTR_ERR (rcar -> phy_base );
254
+
224
255
/* Renesas-specific registers */
225
256
rcar -> base = devm_platform_ioremap_resource_byname (rcar -> pdev , "app" );
226
257
@@ -528,6 +559,167 @@ static int r8a779f0_pcie_ltssm_control(struct rcar_gen4_pcie *rcar, bool enable)
528
559
return 0 ;
529
560
}
530
561
562
+ static void rcar_gen4_pcie_additional_common_init (struct rcar_gen4_pcie * rcar )
563
+ {
564
+ struct dw_pcie * dw = & rcar -> dw ;
565
+ u32 val ;
566
+
567
+ val = dw_pcie_readl_dbi (dw , PCIE_PORT_LANE_SKEW );
568
+ val &= ~PORT_LANE_SKEW_INSERT_MASK ;
569
+ if (dw -> num_lanes < 4 )
570
+ val |= BIT (6 );
571
+ dw_pcie_writel_dbi (dw , PCIE_PORT_LANE_SKEW , val );
572
+
573
+ val = readl (rcar -> base + PCIEPWRMNGCTRL );
574
+ val |= APP_CLK_REQ_N | APP_CLK_PM_EN ;
575
+ writel (val , rcar -> base + PCIEPWRMNGCTRL );
576
+ }
577
+
578
+ static void rcar_gen4_pcie_phy_reg_update_bits (struct rcar_gen4_pcie * rcar ,
579
+ u32 offset , u32 mask , u32 val )
580
+ {
581
+ u32 tmp ;
582
+
583
+ tmp = readl (rcar -> phy_base + offset );
584
+ tmp &= ~mask ;
585
+ tmp |= val ;
586
+ writel (tmp , rcar -> phy_base + offset );
587
+ }
588
+
589
+ /*
590
+ * SoC datasheet suggests checking port logic register bits during firmware
591
+ * write. If read returns non-zero value, then this function returns -EAGAIN
592
+ * indicating that the write needs to be done again. If read returns zero,
593
+ * then return 0 to indicate success.
594
+ */
595
+ static int rcar_gen4_pcie_reg_test_bit (struct rcar_gen4_pcie * rcar ,
596
+ u32 offset , u32 mask )
597
+ {
598
+ struct dw_pcie * dw = & rcar -> dw ;
599
+
600
+ if (dw_pcie_readl_dbi (dw , offset ) & mask )
601
+ return - EAGAIN ;
602
+
603
+ return 0 ;
604
+ }
605
+
606
+ static int rcar_gen4_pcie_download_phy_firmware (struct rcar_gen4_pcie * rcar )
607
+ {
608
+ /* The check_addr values are magical numbers in the datasheet */
609
+ const u32 check_addr [] = { 0x00101018 , 0x00101118 , 0x00101021 , 0x00101121 };
610
+ struct dw_pcie * dw = & rcar -> dw ;
611
+ const struct firmware * fw ;
612
+ unsigned int i , timeout ;
613
+ u32 data ;
614
+ int ret ;
615
+
616
+ ret = request_firmware (& fw , RCAR_GEN4_PCIE_FIRMWARE_NAME , dw -> dev );
617
+ if (ret ) {
618
+ dev_err (dw -> dev , "Failed to load firmware (%s): %d\n" ,
619
+ RCAR_GEN4_PCIE_FIRMWARE_NAME , ret );
620
+ return ret ;
621
+ }
622
+
623
+ for (i = 0 ; i < (fw -> size / 2 ); i ++ ) {
624
+ data = fw -> data [(i * 2 ) + 1 ] << 8 | fw -> data [i * 2 ];
625
+ timeout = 100 ;
626
+ do {
627
+ dw_pcie_writel_dbi (dw , PRTLGC89 , RCAR_GEN4_PCIE_FIRMWARE_BASE_ADDR + i );
628
+ dw_pcie_writel_dbi (dw , PRTLGC90 , data );
629
+ if (!rcar_gen4_pcie_reg_test_bit (rcar , PRTLGC89 , BIT (30 )))
630
+ break ;
631
+ if (!(-- timeout )) {
632
+ ret = - ETIMEDOUT ;
633
+ goto exit ;
634
+ }
635
+ usleep_range (100 , 200 );
636
+ } while (1 );
637
+ }
638
+
639
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x0f8 , BIT (17 ), BIT (17 ));
640
+
641
+ for (i = 0 ; i < ARRAY_SIZE (check_addr ); i ++ ) {
642
+ timeout = 100 ;
643
+ do {
644
+ dw_pcie_writel_dbi (dw , PRTLGC89 , check_addr [i ]);
645
+ ret = rcar_gen4_pcie_reg_test_bit (rcar , PRTLGC89 , BIT (30 ));
646
+ ret |= rcar_gen4_pcie_reg_test_bit (rcar , PRTLGC90 , BIT (0 ));
647
+ if (!ret )
648
+ break ;
649
+ if (!(-- timeout )) {
650
+ ret = - ETIMEDOUT ;
651
+ goto exit ;
652
+ }
653
+ usleep_range (100 , 200 );
654
+ } while (1 );
655
+ }
656
+
657
+ exit :
658
+ release_firmware (fw );
659
+
660
+ return ret ;
661
+ }
662
+
663
+ static int rcar_gen4_pcie_ltssm_control (struct rcar_gen4_pcie * rcar , bool enable )
664
+ {
665
+ struct dw_pcie * dw = & rcar -> dw ;
666
+ u32 val ;
667
+ int ret ;
668
+
669
+ if (!enable ) {
670
+ val = readl (rcar -> base + PCIERSTCTRL1 );
671
+ val &= ~APP_LTSSM_ENABLE ;
672
+ writel (val , rcar -> base + PCIERSTCTRL1 );
673
+
674
+ return 0 ;
675
+ }
676
+
677
+ val = dw_pcie_readl_dbi (dw , PCIE_PORT_FORCE );
678
+ val |= PORT_FORCE_DO_DESKEW_FOR_SRIS ;
679
+ dw_pcie_writel_dbi (dw , PCIE_PORT_FORCE , val );
680
+
681
+ val = readl (rcar -> base + PCIEMSR0 );
682
+ val |= APP_SRIS_MODE ;
683
+ writel (val , rcar -> base + PCIEMSR0 );
684
+
685
+ /*
686
+ * The R-Car Gen4 datasheet doesn't describe the PHY registers' name.
687
+ * But, the initialization procedure describes these offsets. So,
688
+ * this driver has magical offset numbers.
689
+ */
690
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x700 , BIT (28 ), 0 );
691
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x700 , BIT (20 ), 0 );
692
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x700 , BIT (12 ), 0 );
693
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x700 , BIT (4 ), 0 );
694
+
695
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x148 , GENMASK (23 , 22 ), BIT (22 ));
696
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x148 , GENMASK (18 , 16 ), GENMASK (17 , 16 ));
697
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x148 , GENMASK (7 , 6 ), BIT (6 ));
698
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x148 , GENMASK (2 , 0 ), GENMASK (11 , 0 ));
699
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x1d4 , GENMASK (16 , 15 ), GENMASK (16 , 15 ));
700
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x514 , BIT (26 ), BIT (26 ));
701
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x0f8 , BIT (16 ), 0 );
702
+ rcar_gen4_pcie_phy_reg_update_bits (rcar , 0x0f8 , BIT (19 ), BIT (19 ));
703
+
704
+ val = readl (rcar -> base + PCIERSTCTRL1 );
705
+ val &= ~APP_HOLD_PHY_RST ;
706
+ writel (val , rcar -> base + PCIERSTCTRL1 );
707
+
708
+ ret = readl_poll_timeout (rcar -> phy_base + 0x0f8 , val , !(val & BIT (18 )), 100 , 10000 );
709
+ if (ret < 0 )
710
+ return ret ;
711
+
712
+ ret = rcar_gen4_pcie_download_phy_firmware (rcar );
713
+ if (ret )
714
+ return ret ;
715
+
716
+ val = readl (rcar -> base + PCIERSTCTRL1 );
717
+ val |= APP_LTSSM_ENABLE ;
718
+ writel (val , rcar -> base + PCIERSTCTRL1 );
719
+
720
+ return 0 ;
721
+ }
722
+
531
723
static struct rcar_gen4_pcie_drvdata drvdata_r8a779f0_pcie = {
532
724
.ltssm_control = r8a779f0_pcie_ltssm_control ,
533
725
.mode = DW_PCIE_RC_TYPE ,
@@ -539,10 +731,14 @@ static struct rcar_gen4_pcie_drvdata drvdata_r8a779f0_pcie_ep = {
539
731
};
540
732
541
733
static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie = {
734
+ .additional_common_init = rcar_gen4_pcie_additional_common_init ,
735
+ .ltssm_control = rcar_gen4_pcie_ltssm_control ,
542
736
.mode = DW_PCIE_RC_TYPE ,
543
737
};
544
738
545
739
static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie_ep = {
740
+ .additional_common_init = rcar_gen4_pcie_additional_common_init ,
741
+ .ltssm_control = rcar_gen4_pcie_ltssm_control ,
546
742
.mode = DW_PCIE_EP_TYPE ,
547
743
};
548
744
0 commit comments