112
112
#define SEC_ERROR_INT_RX_RAM_SEC_ERR_INT GENMASK(7, 4)
113
113
#define SEC_ERROR_INT_PCIE2AXI_RAM_SEC_ERR_INT GENMASK(11, 8)
114
114
#define SEC_ERROR_INT_AXI2PCIE_RAM_SEC_ERR_INT GENMASK(15, 12)
115
+ #define SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT GENMASK(15, 0)
115
116
#define NUM_SEC_ERROR_INTS (4)
116
117
#define SEC_ERROR_INT_MASK 0x2c
117
118
#define DED_ERROR_INT 0x30
118
119
#define DED_ERROR_INT_TX_RAM_DED_ERR_INT GENMASK(3, 0)
119
120
#define DED_ERROR_INT_RX_RAM_DED_ERR_INT GENMASK(7, 4)
120
121
#define DED_ERROR_INT_PCIE2AXI_RAM_DED_ERR_INT GENMASK(11, 8)
121
122
#define DED_ERROR_INT_AXI2PCIE_RAM_DED_ERR_INT GENMASK(15, 12)
123
+ #define DED_ERROR_INT_ALL_RAM_DED_ERR_INT GENMASK(15, 0)
122
124
#define NUM_DED_ERROR_INTS (4)
123
125
#define DED_ERROR_INT_MASK 0x34
124
126
#define ECC_CONTROL 0x38
@@ -986,39 +988,73 @@ static int mc_pcie_setup_windows(struct platform_device *pdev,
986
988
return 0 ;
987
989
}
988
990
989
- static int mc_platform_init (struct pci_config_window * cfg )
991
+ static inline void mc_clear_secs (struct mc_pcie * port )
990
992
{
991
- struct device * dev = cfg -> parent ;
992
- struct platform_device * pdev = to_platform_device (dev );
993
- struct mc_pcie * port ;
994
- void __iomem * bridge_base_addr ;
995
- void __iomem * ctrl_base_addr ;
996
- int ret ;
997
- int irq ;
998
- int i , intx_irq , msi_irq , event_irq ;
993
+ void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
994
+
995
+ writel_relaxed (SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT , ctrl_base_addr +
996
+ SEC_ERROR_INT );
997
+ writel_relaxed (0 , ctrl_base_addr + SEC_ERROR_EVENT_CNT );
998
+ }
999
+
1000
+ static inline void mc_clear_deds (struct mc_pcie * port )
1001
+ {
1002
+ void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
1003
+
1004
+ writel_relaxed (DED_ERROR_INT_ALL_RAM_DED_ERR_INT , ctrl_base_addr +
1005
+ DED_ERROR_INT );
1006
+ writel_relaxed (0 , ctrl_base_addr + DED_ERROR_EVENT_CNT );
1007
+ }
1008
+
1009
+ static void mc_disable_interrupts (struct mc_pcie * port )
1010
+ {
1011
+ void __iomem * bridge_base_addr = port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
1012
+ void __iomem * ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
999
1013
u32 val ;
1000
- int err ;
1001
1014
1002
- port = devm_kzalloc (dev , sizeof (* port ), GFP_KERNEL );
1003
- if (!port )
1004
- return - ENOMEM ;
1005
- port -> dev = dev ;
1015
+ /* Ensure ECC bypass is enabled */
1016
+ val = ECC_CONTROL_TX_RAM_ECC_BYPASS |
1017
+ ECC_CONTROL_RX_RAM_ECC_BYPASS |
1018
+ ECC_CONTROL_PCIE2AXI_RAM_ECC_BYPASS |
1019
+ ECC_CONTROL_AXI2PCIE_RAM_ECC_BYPASS ;
1020
+ writel_relaxed (val , ctrl_base_addr + ECC_CONTROL );
1006
1021
1007
- ret = mc_pcie_init_clks (dev );
1008
- if (ret ) {
1009
- dev_err (dev , "failed to get clock resources, error %d\n" , ret );
1010
- return - ENODEV ;
1011
- }
1022
+ /* Disable SEC errors and clear any outstanding */
1023
+ writel_relaxed (SEC_ERROR_INT_ALL_RAM_SEC_ERR_INT , ctrl_base_addr +
1024
+ SEC_ERROR_INT_MASK );
1025
+ mc_clear_secs (port );
1012
1026
1013
- port -> axi_base_addr = devm_platform_ioremap_resource (pdev , 1 );
1014
- if (IS_ERR (port -> axi_base_addr ))
1015
- return PTR_ERR (port -> axi_base_addr );
1027
+ /* Disable DED errors and clear any outstanding */
1028
+ writel_relaxed (DED_ERROR_INT_ALL_RAM_DED_ERR_INT , ctrl_base_addr +
1029
+ DED_ERROR_INT_MASK );
1030
+ mc_clear_deds (port );
1016
1031
1017
- bridge_base_addr = port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
1018
- ctrl_base_addr = port -> axi_base_addr + MC_PCIE_CTRL_ADDR ;
1032
+ /* Disable local interrupts and clear any outstanding */
1033
+ writel_relaxed (0 , bridge_base_addr + IMASK_LOCAL );
1034
+ writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_LOCAL );
1035
+ writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_MSI );
1036
+
1037
+ /* Disable PCIe events and clear any outstanding */
1038
+ val = PCIE_EVENT_INT_L2_EXIT_INT |
1039
+ PCIE_EVENT_INT_HOTRST_EXIT_INT |
1040
+ PCIE_EVENT_INT_DLUP_EXIT_INT |
1041
+ PCIE_EVENT_INT_L2_EXIT_INT_MASK |
1042
+ PCIE_EVENT_INT_HOTRST_EXIT_INT_MASK |
1043
+ PCIE_EVENT_INT_DLUP_EXIT_INT_MASK ;
1044
+ writel_relaxed (val , ctrl_base_addr + PCIE_EVENT_INT );
1045
+
1046
+ /* Disable host interrupts and clear any outstanding */
1047
+ writel_relaxed (0 , bridge_base_addr + IMASK_HOST );
1048
+ writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_HOST );
1049
+ }
1050
+
1051
+ static int mc_init_interrupts (struct platform_device * pdev , struct mc_pcie * port )
1052
+ {
1053
+ struct device * dev = & pdev -> dev ;
1054
+ int irq ;
1055
+ int i , intx_irq , msi_irq , event_irq ;
1056
+ int ret ;
1019
1057
1020
- port -> msi .vector_phy = MSI_ADDR ;
1021
- port -> msi .num_vectors = MC_NUM_MSI_IRQS ;
1022
1058
ret = mc_pcie_init_irq_domains (port );
1023
1059
if (ret ) {
1024
1060
dev_err (dev , "failed creating IRQ domains\n" );
@@ -1036,11 +1072,11 @@ static int mc_platform_init(struct pci_config_window *cfg)
1036
1072
return - ENXIO ;
1037
1073
}
1038
1074
1039
- err = devm_request_irq (dev , event_irq , mc_event_handler ,
1075
+ ret = devm_request_irq (dev , event_irq , mc_event_handler ,
1040
1076
0 , event_cause [i ].sym , port );
1041
- if (err ) {
1077
+ if (ret ) {
1042
1078
dev_err (dev , "failed to request IRQ %d\n" , event_irq );
1043
- return err ;
1079
+ return ret ;
1044
1080
}
1045
1081
}
1046
1082
@@ -1065,44 +1101,52 @@ static int mc_platform_init(struct pci_config_window *cfg)
1065
1101
/* Plug the main event chained handler */
1066
1102
irq_set_chained_handler_and_data (irq , mc_handle_event , port );
1067
1103
1068
- /* Hardware doesn't setup MSI by default */
1069
- mc_pcie_enable_msi ( port , cfg -> win );
1104
+ return 0 ;
1105
+ }
1070
1106
1071
- val = readl_relaxed (bridge_base_addr + IMASK_LOCAL );
1072
- val |= PM_MSI_INT_INTX_MASK ;
1073
- writel_relaxed (val , bridge_base_addr + IMASK_LOCAL );
1107
+ static int mc_platform_init (struct pci_config_window * cfg )
1108
+ {
1109
+ struct device * dev = cfg -> parent ;
1110
+ struct platform_device * pdev = to_platform_device (dev );
1111
+ struct mc_pcie * port ;
1112
+ void __iomem * bridge_base_addr ;
1113
+ int ret ;
1074
1114
1075
- writel_relaxed (val , ctrl_base_addr + ECC_CONTROL );
1115
+ port = devm_kzalloc (dev , sizeof (* port ), GFP_KERNEL );
1116
+ if (!port )
1117
+ return - ENOMEM ;
1118
+ port -> dev = dev ;
1076
1119
1077
- val = PCIE_EVENT_INT_L2_EXIT_INT |
1078
- PCIE_EVENT_INT_HOTRST_EXIT_INT |
1079
- PCIE_EVENT_INT_DLUP_EXIT_INT ;
1080
- writel_relaxed (val , ctrl_base_addr + PCIE_EVENT_INT );
1120
+ ret = mc_pcie_init_clks (dev );
1121
+ if (ret ) {
1122
+ dev_err (dev , "failed to get clock resources, error %d\n" , ret );
1123
+ return - ENODEV ;
1124
+ }
1081
1125
1082
- val = SEC_ERROR_INT_TX_RAM_SEC_ERR_INT |
1083
- SEC_ERROR_INT_RX_RAM_SEC_ERR_INT |
1084
- SEC_ERROR_INT_PCIE2AXI_RAM_SEC_ERR_INT |
1085
- SEC_ERROR_INT_AXI2PCIE_RAM_SEC_ERR_INT ;
1086
- writel_relaxed (val , ctrl_base_addr + SEC_ERROR_INT );
1087
- writel_relaxed (0 , ctrl_base_addr + SEC_ERROR_INT_MASK );
1088
- writel_relaxed (0 , ctrl_base_addr + SEC_ERROR_EVENT_CNT );
1126
+ port -> axi_base_addr = devm_platform_ioremap_resource (pdev , 1 );
1127
+ if (IS_ERR (port -> axi_base_addr ))
1128
+ return PTR_ERR (port -> axi_base_addr );
1089
1129
1090
- val = DED_ERROR_INT_TX_RAM_DED_ERR_INT |
1091
- DED_ERROR_INT_RX_RAM_DED_ERR_INT |
1092
- DED_ERROR_INT_PCIE2AXI_RAM_DED_ERR_INT |
1093
- DED_ERROR_INT_AXI2PCIE_RAM_DED_ERR_INT ;
1094
- writel_relaxed (val , ctrl_base_addr + DED_ERROR_INT );
1095
- writel_relaxed (0 , ctrl_base_addr + DED_ERROR_INT_MASK );
1096
- writel_relaxed (0 , ctrl_base_addr + DED_ERROR_EVENT_CNT );
1130
+ mc_disable_interrupts (port );
1097
1131
1098
- writel_relaxed (0 , bridge_base_addr + IMASK_HOST );
1099
- writel_relaxed (GENMASK (31 , 0 ), bridge_base_addr + ISTATUS_HOST );
1132
+ bridge_base_addr = port -> axi_base_addr + MC_PCIE_BRIDGE_ADDR ;
1133
+
1134
+ port -> msi .vector_phy = MSI_ADDR ;
1135
+ port -> msi .num_vectors = MC_NUM_MSI_IRQS ;
1136
+
1137
+ /* Hardware doesn't setup MSI by default */
1138
+ mc_pcie_enable_msi (port , cfg -> win );
1100
1139
1101
1140
/* Configure Address Translation Table 0 for PCIe config space */
1102
1141
mc_pcie_setup_window (bridge_base_addr , 0 , cfg -> res .start & 0xffffffff ,
1103
1142
cfg -> res .start , resource_size (& cfg -> res ));
1104
1143
1105
- return mc_pcie_setup_windows (pdev , port );
1144
+ ret = mc_pcie_setup_windows (pdev , port );
1145
+ if (ret )
1146
+ return ret ;
1147
+
1148
+ /* Address translation is up; safe to enable interrupts */
1149
+ return mc_init_interrupts (pdev , port );
1106
1150
}
1107
1151
1108
1152
static const struct pci_ecam_ops mc_ecam_ops = {
0 commit comments