#include "pciutils.h"
-#define MARGIN_STEP_MS 1000
-
enum margin_hw { MARGIN_HW_DEFAULT, MARGIN_ICE_LAKE_RC };
// in ps
u64 steps_utility; // For ETA logging
bool save_csv;
char *dir_for_csv;
+ u8 dwell_time;
};
struct margin_recv_args {
u8 parallel_lanes;
u8 error_limit;
+ u8 dwell_time;
};
struct margin_lanes_data {
pci_write_word(arg.recv->dev->dev, ctrl_addr, step_cmd);
}
}
- msleep(MARGIN_STEP_MS);
+ msleep(arg.recv->dwell_time * 1000);
for (int i = 0; i < arg.lanes_n; i++)
{
.lane_reversal = false,
.params = ¶ms,
.parallel_lanes = args->parallel_lanes ? args->parallel_lanes : 1,
- .error_limit = args->common->error_limit };
+ .error_limit = args->common->error_limit,
+ .dwell_time = args->common->dwell_time };
results->recvn = recvn;
results->lanes_n = lanes_n;
com_args->steps_utility = 0;
com_args->dir_for_csv = NULL;
com_args->save_csv = false;
+ com_args->dwell_time = 1;
int c;
- while ((c = getopt(argc, argv, "+e:co:")) != -1)
+ while ((c = getopt(argc, argv, "+e:co:d:")) != -1)
{
switch (c)
{
com_args->dir_for_csv = optarg;
com_args->save_csv = true;
break;
+ case 'd':
+ com_args->dwell_time = atoi(optarg);
+ break;
default:
die("Invalid arguments\n\n%s", usage);
}
margin_log_receiver(struct margin_recv *recv)
{
margin_log("\nError Count Limit = %d\n", recv->error_limit);
- margin_log("Parallel Lanes: %d\n\n", recv->parallel_lanes);
+ margin_log("Parallel Lanes: %d\n", recv->parallel_lanes);
+ margin_log("Margining dwell time: %d s\n\n", recv->dwell_time);
margin_log_params(recv->params);
}
margin_log("]");
- u64 lane_eta_s = (arg.steps_lane_total - arg.steps_lane_done) * MARGIN_STEP_MS / 1000;
- u64 total_eta_s = *arg.steps_utility * MARGIN_STEP_MS / 1000 + lane_eta_s;
+ u64 lane_eta_s = (arg.steps_lane_total - arg.steps_lane_done) * arg.recv->dwell_time;
+ u64 total_eta_s = *arg.steps_utility * arg.recv->dwell_time + lane_eta_s;
margin_log(" - ETA: %3ds Steps: %3d Total ETA: %3dm %2ds", lane_eta_s, arg.steps_lane_done,
total_eta_s / 60, total_eta_s % 60);