@@ -470,31 +470,6 @@ static void pci_clear_and_set_dword(struct pci_dev *pdev, int pos,
470
470
pci_write_config_dword (pdev , pos , val );
471
471
}
472
472
473
- static void aspm_program_l1ss (struct pci_dev * dev , u32 ctl1 , u32 ctl2 )
474
- {
475
- u16 l1ss = dev -> l1ss ;
476
- u32 l1_2_enable ;
477
-
478
- /*
479
- * Per PCIe r6.0, sec 5.5.4, T_POWER_ON in PCI_L1SS_CTL2 must be
480
- * programmed prior to setting the L1.2 enable bits in PCI_L1SS_CTL1.
481
- */
482
- pci_write_config_dword (dev , l1ss + PCI_L1SS_CTL2 , ctl2 );
483
-
484
- /*
485
- * In addition, Common_Mode_Restore_Time and LTR_L1.2_THRESHOLD in
486
- * PCI_L1SS_CTL1 must be programmed *before* setting the L1.2
487
- * enable bits, even though they're all in PCI_L1SS_CTL1.
488
- */
489
- l1_2_enable = ctl1 & PCI_L1SS_CTL1_L1_2_MASK ;
490
- ctl1 &= ~PCI_L1SS_CTL1_L1_2_MASK ;
491
-
492
- pci_write_config_dword (dev , l1ss + PCI_L1SS_CTL1 , ctl1 );
493
- if (l1_2_enable )
494
- pci_write_config_dword (dev , l1ss + PCI_L1SS_CTL1 ,
495
- ctl1 | l1_2_enable );
496
- }
497
-
498
473
/* Calculate L1.2 PM substate timing parameters */
499
474
static void aspm_calc_l1ss_info (struct pcie_link_state * link ,
500
475
u32 parent_l1ss_cap , u32 child_l1ss_cap )
@@ -504,6 +479,7 @@ static void aspm_calc_l1ss_info(struct pcie_link_state *link,
504
479
u32 t_common_mode , t_power_on , l1_2_threshold , scale , value ;
505
480
u32 ctl1 = 0 , ctl2 = 0 ;
506
481
u32 pctl1 , pctl2 , cctl1 , cctl2 ;
482
+ u32 pl1_2_enables , cl1_2_enables ;
507
483
508
484
if (!(link -> aspm_support & ASPM_STATE_L1_2_MASK ))
509
485
return ;
@@ -552,21 +528,39 @@ static void aspm_calc_l1ss_info(struct pcie_link_state *link,
552
528
ctl2 == pctl2 && ctl2 == cctl2 )
553
529
return ;
554
530
555
- pctl1 &= ~(PCI_L1SS_CTL1_CM_RESTORE_TIME |
556
- PCI_L1SS_CTL1_LTR_L12_TH_VALUE |
557
- PCI_L1SS_CTL1_LTR_L12_TH_SCALE );
558
- pctl1 |= (ctl1 & (PCI_L1SS_CTL1_CM_RESTORE_TIME |
559
- PCI_L1SS_CTL1_LTR_L12_TH_VALUE |
560
- PCI_L1SS_CTL1_LTR_L12_TH_SCALE ));
561
- aspm_program_l1ss (parent , pctl1 , ctl2 );
562
-
563
- cctl1 &= ~(PCI_L1SS_CTL1_CM_RESTORE_TIME |
564
- PCI_L1SS_CTL1_LTR_L12_TH_VALUE |
565
- PCI_L1SS_CTL1_LTR_L12_TH_SCALE );
566
- cctl1 |= (ctl1 & (PCI_L1SS_CTL1_CM_RESTORE_TIME |
567
- PCI_L1SS_CTL1_LTR_L12_TH_VALUE |
568
- PCI_L1SS_CTL1_LTR_L12_TH_SCALE ));
569
- aspm_program_l1ss (child , cctl1 , ctl2 );
531
+ /* Disable L1.2 while updating. See PCIe r5.0, sec 5.5.4, 7.8.3.3 */
532
+ pl1_2_enables = pctl1 & PCI_L1SS_CTL1_L1_2_MASK ;
533
+ cl1_2_enables = cctl1 & PCI_L1SS_CTL1_L1_2_MASK ;
534
+
535
+ if (pl1_2_enables || cl1_2_enables ) {
536
+ pci_clear_and_set_dword (child , child -> l1ss + PCI_L1SS_CTL1 ,
537
+ PCI_L1SS_CTL1_L1_2_MASK , 0 );
538
+ pci_clear_and_set_dword (parent , parent -> l1ss + PCI_L1SS_CTL1 ,
539
+ PCI_L1SS_CTL1_L1_2_MASK , 0 );
540
+ }
541
+
542
+ /* Program T_POWER_ON times in both ports */
543
+ pci_write_config_dword (parent , parent -> l1ss + PCI_L1SS_CTL2 , ctl2 );
544
+ pci_write_config_dword (child , child -> l1ss + PCI_L1SS_CTL2 , ctl2 );
545
+
546
+ /* Program Common_Mode_Restore_Time in upstream device */
547
+ pci_clear_and_set_dword (parent , parent -> l1ss + PCI_L1SS_CTL1 ,
548
+ PCI_L1SS_CTL1_CM_RESTORE_TIME , ctl1 );
549
+
550
+ /* Program LTR_L1.2_THRESHOLD time in both ports */
551
+ pci_clear_and_set_dword (parent , parent -> l1ss + PCI_L1SS_CTL1 ,
552
+ PCI_L1SS_CTL1_LTR_L12_TH_VALUE |
553
+ PCI_L1SS_CTL1_LTR_L12_TH_SCALE , ctl1 );
554
+ pci_clear_and_set_dword (child , child -> l1ss + PCI_L1SS_CTL1 ,
555
+ PCI_L1SS_CTL1_LTR_L12_TH_VALUE |
556
+ PCI_L1SS_CTL1_LTR_L12_TH_SCALE , ctl1 );
557
+
558
+ if (pl1_2_enables || cl1_2_enables ) {
559
+ pci_clear_and_set_dword (parent , parent -> l1ss + PCI_L1SS_CTL1 , 0 ,
560
+ pl1_2_enables );
561
+ pci_clear_and_set_dword (child , child -> l1ss + PCI_L1SS_CTL1 , 0 ,
562
+ cl1_2_enables );
563
+ }
570
564
}
571
565
572
566
static void aspm_l1ss_init (struct pcie_link_state * link )
@@ -757,43 +751,6 @@ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state)
757
751
PCI_L1SS_CTL1_L1SS_MASK , val );
758
752
}
759
753
760
- void pci_save_aspm_l1ss_state (struct pci_dev * dev )
761
- {
762
- struct pci_cap_saved_state * save_state ;
763
- u16 l1ss = dev -> l1ss ;
764
- u32 * cap ;
765
-
766
- if (!l1ss )
767
- return ;
768
-
769
- save_state = pci_find_saved_ext_cap (dev , PCI_EXT_CAP_ID_L1SS );
770
- if (!save_state )
771
- return ;
772
-
773
- cap = (u32 * )& save_state -> cap .data [0 ];
774
- pci_read_config_dword (dev , l1ss + PCI_L1SS_CTL2 , cap ++ );
775
- pci_read_config_dword (dev , l1ss + PCI_L1SS_CTL1 , cap ++ );
776
- }
777
-
778
- void pci_restore_aspm_l1ss_state (struct pci_dev * dev )
779
- {
780
- struct pci_cap_saved_state * save_state ;
781
- u32 * cap , ctl1 , ctl2 ;
782
- u16 l1ss = dev -> l1ss ;
783
-
784
- if (!l1ss )
785
- return ;
786
-
787
- save_state = pci_find_saved_ext_cap (dev , PCI_EXT_CAP_ID_L1SS );
788
- if (!save_state )
789
- return ;
790
-
791
- cap = (u32 * )& save_state -> cap .data [0 ];
792
- ctl2 = * cap ++ ;
793
- ctl1 = * cap ;
794
- aspm_program_l1ss (dev , ctl1 , ctl2 );
795
- }
796
-
797
754
static void pcie_config_aspm_dev (struct pci_dev * pdev , u32 val )
798
755
{
799
756
pcie_capability_clear_and_set_word (pdev , PCI_EXP_LNKCTL ,
0 commit comments