@@ -1072,6 +1072,22 @@ int cxl_pci_get_bandwidth(struct pci_dev *pdev, struct access_coordinate *c)
1072
1072
#define GPF_TIMEOUT_BASE_MAX 2
1073
1073
#define GPF_TIMEOUT_SCALE_MAX 7 /* 10 seconds */
1074
1074
1075
+ u16 cxl_gpf_get_dvsec (struct device * dev , bool is_port )
1076
+ {
1077
+ u16 dvsec ;
1078
+
1079
+ if (!dev_is_pci (dev ))
1080
+ return 0 ;
1081
+
1082
+ dvsec = pci_find_dvsec_capability (to_pci_dev (dev ), PCI_VENDOR_ID_CXL ,
1083
+ is_port ? CXL_DVSEC_PORT_GPF : CXL_DVSEC_DEVICE_GPF );
1084
+ if (!dvsec )
1085
+ dev_warn (dev , "%s GPF DVSEC not present\n" ,
1086
+ is_port ? "Port" : "Device" );
1087
+ return dvsec ;
1088
+ }
1089
+ EXPORT_SYMBOL_NS_GPL (cxl_gpf_get_dvsec , "CXL" );
1090
+
1075
1091
static int update_gpf_port_dvsec (struct pci_dev * pdev , int dvsec , int phase )
1076
1092
{
1077
1093
u64 base , scale ;
@@ -1116,26 +1132,20 @@ int cxl_gpf_port_setup(struct device *dport_dev, struct cxl_port *port)
1116
1132
{
1117
1133
struct pci_dev * pdev ;
1118
1134
1119
- if (!dev_is_pci (dport_dev ))
1120
- return 0 ;
1121
-
1122
- pdev = to_pci_dev (dport_dev );
1123
- if (!pdev || !port )
1135
+ if (!port )
1124
1136
return - EINVAL ;
1125
1137
1126
1138
if (!port -> gpf_dvsec ) {
1127
1139
int dvsec ;
1128
1140
1129
- dvsec = pci_find_dvsec_capability (pdev , PCI_VENDOR_ID_CXL ,
1130
- CXL_DVSEC_PORT_GPF );
1131
- if (!dvsec ) {
1132
- pci_warn (pdev , "Port GPF DVSEC not present\n" );
1141
+ dvsec = cxl_gpf_get_dvsec (dport_dev , true);
1142
+ if (!dvsec )
1133
1143
return - EINVAL ;
1134
- }
1135
1144
1136
1145
port -> gpf_dvsec = dvsec ;
1137
1146
}
1138
1147
1148
+ pdev = to_pci_dev (dport_dev );
1139
1149
update_gpf_port_dvsec (pdev , port -> gpf_dvsec , 1 );
1140
1150
update_gpf_port_dvsec (pdev , port -> gpf_dvsec , 2 );
1141
1151
0 commit comments