9
9
#define ICE_CGU_STATE_ACQ_ERR_THRESHOLD 50
10
10
#define ICE_DPLL_PIN_IDX_INVALID 0xff
11
11
#define ICE_DPLL_RCLK_NUM_PER_PF 1
12
+ #define ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT 25
12
13
13
14
/**
14
15
* enum ice_dpll_pin_type - enumerate ice pin types:
@@ -30,6 +31,10 @@ static const char * const pin_type_name[] = {
30
31
[ICE_DPLL_PIN_TYPE_RCLK_INPUT ] = "rclk-input" ,
31
32
};
32
33
34
+ static const struct dpll_pin_frequency ice_esync_range [] = {
35
+ DPLL_PIN_FREQUENCY_RANGE (0 , DPLL_PIN_FREQUENCY_1_HZ ),
36
+ };
37
+
33
38
/**
34
39
* ice_dpll_is_reset - check if reset is in progress
35
40
* @pf: private board structure
@@ -394,8 +399,8 @@ ice_dpll_pin_state_update(struct ice_pf *pf, struct ice_dpll_pin *pin,
394
399
395
400
switch (pin_type ) {
396
401
case ICE_DPLL_PIN_TYPE_INPUT :
397
- ret = ice_aq_get_input_pin_cfg (& pf -> hw , pin -> idx , NULL , NULL ,
398
- NULL , & pin -> flags [0 ],
402
+ ret = ice_aq_get_input_pin_cfg (& pf -> hw , pin -> idx , & pin -> status ,
403
+ NULL , NULL , & pin -> flags [0 ],
399
404
& pin -> freq , & pin -> phase_adjust );
400
405
if (ret )
401
406
goto err ;
@@ -430,7 +435,7 @@ ice_dpll_pin_state_update(struct ice_pf *pf, struct ice_dpll_pin *pin,
430
435
goto err ;
431
436
432
437
parent &= ICE_AQC_GET_CGU_OUT_CFG_DPLL_SRC_SEL ;
433
- if (ICE_AQC_SET_CGU_OUT_CFG_OUT_EN & pin -> flags [0 ]) {
438
+ if (ICE_AQC_GET_CGU_OUT_CFG_OUT_EN & pin -> flags [0 ]) {
434
439
pin -> state [pf -> dplls .eec .dpll_idx ] =
435
440
parent == pf -> dplls .eec .dpll_idx ?
436
441
DPLL_PIN_STATE_CONNECTED :
@@ -1098,6 +1103,214 @@ ice_dpll_phase_offset_get(const struct dpll_pin *pin, void *pin_priv,
1098
1103
return 0 ;
1099
1104
}
1100
1105
1106
+ /**
1107
+ * ice_dpll_output_esync_set - callback for setting embedded sync
1108
+ * @pin: pointer to a pin
1109
+ * @pin_priv: private data pointer passed on pin registration
1110
+ * @dpll: registered dpll pointer
1111
+ * @dpll_priv: private data pointer passed on dpll registration
1112
+ * @freq: requested embedded sync frequency
1113
+ * @extack: error reporting
1114
+ *
1115
+ * Dpll subsystem callback. Handler for setting embedded sync frequency value
1116
+ * on output pin.
1117
+ *
1118
+ * Context: Acquires pf->dplls.lock
1119
+ * Return:
1120
+ * * 0 - success
1121
+ * * negative - error
1122
+ */
1123
+ static int
1124
+ ice_dpll_output_esync_set (const struct dpll_pin * pin , void * pin_priv ,
1125
+ const struct dpll_device * dpll , void * dpll_priv ,
1126
+ u64 freq , struct netlink_ext_ack * extack )
1127
+ {
1128
+ struct ice_dpll_pin * p = pin_priv ;
1129
+ struct ice_dpll * d = dpll_priv ;
1130
+ struct ice_pf * pf = d -> pf ;
1131
+ u8 flags = 0 ;
1132
+ int ret ;
1133
+
1134
+ if (ice_dpll_is_reset (pf , extack ))
1135
+ return - EBUSY ;
1136
+ mutex_lock (& pf -> dplls .lock );
1137
+ if (p -> flags [0 ] & ICE_AQC_GET_CGU_OUT_CFG_OUT_EN )
1138
+ flags = ICE_AQC_SET_CGU_OUT_CFG_OUT_EN ;
1139
+ if (freq == DPLL_PIN_FREQUENCY_1_HZ ) {
1140
+ if (p -> flags [0 ] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN ) {
1141
+ ret = 0 ;
1142
+ } else {
1143
+ flags |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN ;
1144
+ ret = ice_aq_set_output_pin_cfg (& pf -> hw , p -> idx , flags ,
1145
+ 0 , 0 , 0 );
1146
+ }
1147
+ } else {
1148
+ if (!(p -> flags [0 ] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN )) {
1149
+ ret = 0 ;
1150
+ } else {
1151
+ flags &= ~ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN ;
1152
+ ret = ice_aq_set_output_pin_cfg (& pf -> hw , p -> idx , flags ,
1153
+ 0 , 0 , 0 );
1154
+ }
1155
+ }
1156
+ mutex_unlock (& pf -> dplls .lock );
1157
+
1158
+ return ret ;
1159
+ }
1160
+
1161
+ /**
1162
+ * ice_dpll_output_esync_get - callback for getting embedded sync config
1163
+ * @pin: pointer to a pin
1164
+ * @pin_priv: private data pointer passed on pin registration
1165
+ * @dpll: registered dpll pointer
1166
+ * @dpll_priv: private data pointer passed on dpll registration
1167
+ * @esync: on success holds embedded sync pin properties
1168
+ * @extack: error reporting
1169
+ *
1170
+ * Dpll subsystem callback. Handler for getting embedded sync frequency value
1171
+ * and capabilities on output pin.
1172
+ *
1173
+ * Context: Acquires pf->dplls.lock
1174
+ * Return:
1175
+ * * 0 - success
1176
+ * * negative - error
1177
+ */
1178
+ static int
1179
+ ice_dpll_output_esync_get (const struct dpll_pin * pin , void * pin_priv ,
1180
+ const struct dpll_device * dpll , void * dpll_priv ,
1181
+ struct dpll_pin_esync * esync ,
1182
+ struct netlink_ext_ack * extack )
1183
+ {
1184
+ struct ice_dpll_pin * p = pin_priv ;
1185
+ struct ice_dpll * d = dpll_priv ;
1186
+ struct ice_pf * pf = d -> pf ;
1187
+
1188
+ if (ice_dpll_is_reset (pf , extack ))
1189
+ return - EBUSY ;
1190
+ mutex_lock (& pf -> dplls .lock );
1191
+ if (!(p -> flags [0 ] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_ABILITY ) ||
1192
+ p -> freq != DPLL_PIN_FREQUENCY_10_MHZ ) {
1193
+ mutex_unlock (& pf -> dplls .lock );
1194
+ return - EOPNOTSUPP ;
1195
+ }
1196
+ esync -> range = ice_esync_range ;
1197
+ esync -> range_num = ARRAY_SIZE (ice_esync_range );
1198
+ if (p -> flags [0 ] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN ) {
1199
+ esync -> freq = DPLL_PIN_FREQUENCY_1_HZ ;
1200
+ esync -> pulse = ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT ;
1201
+ } else {
1202
+ esync -> freq = 0 ;
1203
+ esync -> pulse = 0 ;
1204
+ }
1205
+ mutex_unlock (& pf -> dplls .lock );
1206
+
1207
+ return 0 ;
1208
+ }
1209
+
1210
+ /**
1211
+ * ice_dpll_input_esync_set - callback for setting embedded sync
1212
+ * @pin: pointer to a pin
1213
+ * @pin_priv: private data pointer passed on pin registration
1214
+ * @dpll: registered dpll pointer
1215
+ * @dpll_priv: private data pointer passed on dpll registration
1216
+ * @freq: requested embedded sync frequency
1217
+ * @extack: error reporting
1218
+ *
1219
+ * Dpll subsystem callback. Handler for setting embedded sync frequency value
1220
+ * on input pin.
1221
+ *
1222
+ * Context: Acquires pf->dplls.lock
1223
+ * Return:
1224
+ * * 0 - success
1225
+ * * negative - error
1226
+ */
1227
+ static int
1228
+ ice_dpll_input_esync_set (const struct dpll_pin * pin , void * pin_priv ,
1229
+ const struct dpll_device * dpll , void * dpll_priv ,
1230
+ u64 freq , struct netlink_ext_ack * extack )
1231
+ {
1232
+ struct ice_dpll_pin * p = pin_priv ;
1233
+ struct ice_dpll * d = dpll_priv ;
1234
+ struct ice_pf * pf = d -> pf ;
1235
+ u8 flags_en = 0 ;
1236
+ int ret ;
1237
+
1238
+ if (ice_dpll_is_reset (pf , extack ))
1239
+ return - EBUSY ;
1240
+ mutex_lock (& pf -> dplls .lock );
1241
+ if (p -> flags [0 ] & ICE_AQC_GET_CGU_IN_CFG_FLG2_INPUT_EN )
1242
+ flags_en = ICE_AQC_SET_CGU_IN_CFG_FLG2_INPUT_EN ;
1243
+ if (freq == DPLL_PIN_FREQUENCY_1_HZ ) {
1244
+ if (p -> flags [0 ] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN ) {
1245
+ ret = 0 ;
1246
+ } else {
1247
+ flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN ;
1248
+ ret = ice_aq_set_input_pin_cfg (& pf -> hw , p -> idx , 0 ,
1249
+ flags_en , 0 , 0 );
1250
+ }
1251
+ } else {
1252
+ if (!(p -> flags [0 ] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN )) {
1253
+ ret = 0 ;
1254
+ } else {
1255
+ flags_en &= ~ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN ;
1256
+ ret = ice_aq_set_input_pin_cfg (& pf -> hw , p -> idx , 0 ,
1257
+ flags_en , 0 , 0 );
1258
+ }
1259
+ }
1260
+ mutex_unlock (& pf -> dplls .lock );
1261
+
1262
+ return ret ;
1263
+ }
1264
+
1265
+ /**
1266
+ * ice_dpll_input_esync_get - callback for getting embedded sync config
1267
+ * @pin: pointer to a pin
1268
+ * @pin_priv: private data pointer passed on pin registration
1269
+ * @dpll: registered dpll pointer
1270
+ * @dpll_priv: private data pointer passed on dpll registration
1271
+ * @esync: on success holds embedded sync pin properties
1272
+ * @extack: error reporting
1273
+ *
1274
+ * Dpll subsystem callback. Handler for getting embedded sync frequency value
1275
+ * and capabilities on input pin.
1276
+ *
1277
+ * Context: Acquires pf->dplls.lock
1278
+ * Return:
1279
+ * * 0 - success
1280
+ * * negative - error
1281
+ */
1282
+ static int
1283
+ ice_dpll_input_esync_get (const struct dpll_pin * pin , void * pin_priv ,
1284
+ const struct dpll_device * dpll , void * dpll_priv ,
1285
+ struct dpll_pin_esync * esync ,
1286
+ struct netlink_ext_ack * extack )
1287
+ {
1288
+ struct ice_dpll_pin * p = pin_priv ;
1289
+ struct ice_dpll * d = dpll_priv ;
1290
+ struct ice_pf * pf = d -> pf ;
1291
+
1292
+ if (ice_dpll_is_reset (pf , extack ))
1293
+ return - EBUSY ;
1294
+ mutex_lock (& pf -> dplls .lock );
1295
+ if (!(p -> status & ICE_AQC_GET_CGU_IN_CFG_STATUS_ESYNC_CAP ) ||
1296
+ p -> freq != DPLL_PIN_FREQUENCY_10_MHZ ) {
1297
+ mutex_unlock (& pf -> dplls .lock );
1298
+ return - EOPNOTSUPP ;
1299
+ }
1300
+ esync -> range = ice_esync_range ;
1301
+ esync -> range_num = ARRAY_SIZE (ice_esync_range );
1302
+ if (p -> flags [0 ] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN ) {
1303
+ esync -> freq = DPLL_PIN_FREQUENCY_1_HZ ;
1304
+ esync -> pulse = ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT ;
1305
+ } else {
1306
+ esync -> freq = 0 ;
1307
+ esync -> pulse = 0 ;
1308
+ }
1309
+ mutex_unlock (& pf -> dplls .lock );
1310
+
1311
+ return 0 ;
1312
+ }
1313
+
1101
1314
/**
1102
1315
* ice_dpll_rclk_state_on_pin_set - set a state on rclk pin
1103
1316
* @pin: pointer to a pin
@@ -1222,6 +1435,8 @@ static const struct dpll_pin_ops ice_dpll_input_ops = {
1222
1435
.phase_adjust_get = ice_dpll_pin_phase_adjust_get ,
1223
1436
.phase_adjust_set = ice_dpll_input_phase_adjust_set ,
1224
1437
.phase_offset_get = ice_dpll_phase_offset_get ,
1438
+ .esync_set = ice_dpll_input_esync_set ,
1439
+ .esync_get = ice_dpll_input_esync_get ,
1225
1440
};
1226
1441
1227
1442
static const struct dpll_pin_ops ice_dpll_output_ops = {
@@ -1232,6 +1447,8 @@ static const struct dpll_pin_ops ice_dpll_output_ops = {
1232
1447
.direction_get = ice_dpll_output_direction ,
1233
1448
.phase_adjust_get = ice_dpll_pin_phase_adjust_get ,
1234
1449
.phase_adjust_set = ice_dpll_output_phase_adjust_set ,
1450
+ .esync_set = ice_dpll_output_esync_set ,
1451
+ .esync_get = ice_dpll_output_esync_get ,
1235
1452
};
1236
1453
1237
1454
static const struct dpll_device_ops ice_dpll_ops = {
0 commit comments