ms: prettify scheduling + add odroid

Change-Id: Icaf42fd5f76dc2d53dc526558aa8ceaa9c190f7b
diff --git a/Transceiver52M/ms/ms.cpp b/Transceiver52M/ms/ms.cpp
index d191ed5..1dc2587 100644
--- a/Transceiver52M/ms/ms.cpp
+++ b/Transceiver52M/ms/ms.cpp
@@ -278,12 +278,13 @@
 {
 	auto fn = get_rx_burst_handler_fn(rx_bh());
 	rx_task = std::thread(fn);
-	set_name_aff_sched(rx_task.native_handle(), "rxrun", 2, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 2);
+	set_name_aff_sched(rx_task.native_handle(), sched_params::thread_names::RXRUN);
 
 	usleep(1000);
 	auto fn2 = get_tx_burst_handler_fn(tx_bh());
 	tx_task = std::thread(fn2);
-	set_name_aff_sched(tx_task.native_handle(), "txrun", 2, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 1);
+	set_name_aff_sched(tx_task.native_handle(), sched_params::thread_names::TXRUN);
+
 }
 
 void ms_trx::set_upper_ready(bool is_ready)
diff --git a/Transceiver52M/ms/ms.h b/Transceiver52M/ms/ms.h
index 8ea9932..dbf2e9a 100644
--- a/Transceiver52M/ms/ms.h
+++ b/Transceiver52M/ms/ms.h
@@ -200,6 +200,40 @@
 	}
 };
 
+static struct sched_params {
+	enum thread_names { U_CTL = 0, U_RX, U_TX, SCH_SEARCH, MAIN, LEAKCHECK, RXRUN, TXRUN, _THRD_NAME_COUNT };
+	enum target { ODROID = 0, PI4 };
+	const char *name;
+	int core;
+	int schedtype;
+	int prio;
+} schdp[][sched_params::_THRD_NAME_COUNT]{
+	{
+		{ "upper_ctrl", 2, SCHED_RR, sched_get_priority_max(SCHED_RR) },
+		{ "upper_rx", 2, SCHED_RR, sched_get_priority_max(SCHED_RR) - 5 },
+		{ "upper_tx", 2, SCHED_RR, sched_get_priority_max(SCHED_RR) - 1 },
+
+		{ "sch_search", 3, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 5 },
+		{ "main", 3, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 5 },
+		{ "leakcheck", 3, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 10 },
+
+		{ "rxrun", 4, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 2 },
+		{ "txrun", 5, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 1 },
+	},
+	{
+		{ "upper_ctrl", 1, SCHED_RR, sched_get_priority_max(SCHED_RR) },
+		{ "upper_rx", 1, SCHED_RR, sched_get_priority_max(SCHED_RR) - 5 },
+		{ "upper_tx", 1, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 1 },
+
+		{ "sch_search", 1, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 5 },
+		{ "main", 3, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 5 },
+		{ "leakcheck", 1, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 10 },
+
+		{ "rxrun", 2, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 2 },
+		{ "txrun", 3, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 1 },
+	},
+};
+
 using ts_hitter_q_t = spsc_cond<64, GSM::Time, true, false>;
 
 struct ms_trx : public BASET {
@@ -230,6 +264,8 @@
 	int64_t first_sch_ts_start = -1;
 
 	time_keeper timekeeper;
+	int hw_cpus;
+	sched_params::target hw_target;
 
 	void start();
 	std::atomic<bool> upper_is_ready;
@@ -250,8 +286,11 @@
 
 	ms_trx()
 		: timing_advance(0), do_auto_gain(false), rxqueue(), first_sch_buf(new blade_sample_type[SCH_LEN_SPS]),
-		  burst_copy_buffer(new blade_sample_type[ONE_TS_BURST_LEN]), rcv_done{ false }, sch_thread_done{ false }
+		  burst_copy_buffer(new blade_sample_type[ONE_TS_BURST_LEN]), rcv_done{ false },
+		  sch_thread_done{ false }, hw_cpus(std::thread::hardware_concurrency()),
+		  hw_target(hw_cpus > 4 ? sched_params::target::ODROID : sched_params::target::PI4)
 	{
+		std::cerr << "scheduling for: " << (hw_cpus > 4 ? "odroid" : "pi4") << std::endl;
 	}
 
 	virtual ~ms_trx()
@@ -269,11 +308,19 @@
 		timing_advance = val * 4;
 	}
 
-	void set_name_aff_sched(const char *name, int cpunum, int schedtype, int prio)
+	void set_name_aff_sched(sched_params::thread_names name)
 	{
-		set_name_aff_sched(pthread_self(), name, cpunum, schedtype, prio);
+		set_name_aff_sched(pthread_self(), name);
 	}
 
+	void set_name_aff_sched(std::thread::native_handle_type h, sched_params::thread_names name)
+	{
+		auto tgt = schdp[hw_target][name];
+		// std::cerr << "scheduling for: " << tgt.name << ":" << tgt.core << std::endl;
+		set_name_aff_sched(h, tgt.name, tgt.core, tgt.schedtype, tgt.prio);
+	}
+
+    private:
 	void set_name_aff_sched(std::thread::native_handle_type h, const char *name, int cpunum, int schedtype,
 				int prio)
 	{
@@ -284,16 +331,14 @@
 		CPU_ZERO(&cpuset);
 		CPU_SET(cpunum, &cpuset);
 
-		auto rv = pthread_setaffinity_np(h, sizeof(cpuset), &cpuset);
-		if (rv < 0) {
+		if (pthread_setaffinity_np(h, sizeof(cpuset), &cpuset) < 0) {
 			std::cerr << name << " affinity: errreur! " << std::strerror(errno);
 			return exit(0);
 		}
 
 		sched_param sch_params;
 		sch_params.sched_priority = prio;
-		rv = pthread_setschedparam(h, schedtype, &sch_params);
-		if (rv < 0) {
+		if (pthread_setschedparam(h, schedtype, &sch_params) < 0) {
 			std::cerr << name << " sched: errreur! " << std::strerror(errno);
 			return exit(0);
 		}
diff --git a/Transceiver52M/ms/ms_rx_lower.cpp b/Transceiver52M/ms/ms_rx_lower.cpp
index e39d72d..e8d8e0e 100644
--- a/Transceiver52M/ms/ms_rx_lower.cpp
+++ b/Transceiver52M/ms/ms_rx_lower.cpp
@@ -235,7 +235,7 @@
 		sch_pos = 0;
 		rcv_done = true;
 		std::thread([this] {
-			set_name_aff_sched("sch_search", 1, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 5);
+			set_name_aff_sched(sched_params::thread_names::SCH_SEARCH);
 
 			auto ptr = reinterpret_cast<const int16_t *>(first_sch_buf);
 			const auto target_val = rxFullScale / 8;
diff --git a/Transceiver52M/ms/ms_upper.cpp b/Transceiver52M/ms/ms_upper.cpp
index 63f5926..3cb27e3 100644
--- a/Transceiver52M/ms/ms_upper.cpp
+++ b/Transceiver52M/ms/ms_upper.cpp
@@ -97,14 +97,14 @@
 void upper_trx::start_threads()
 {
 	thr_control = std::thread([this] {
-		set_name_aff_sched("upper_ctrl", 1, SCHED_RR, sched_get_priority_max(SCHED_RR));
+		set_name_aff_sched(sched_params::thread_names::U_CTL);
 		while (!g_exit_flag) {
 			driveControl();
 		}
 	});
 	msleep(1);
 	thr_tx = std::thread([this] {
-		set_name_aff_sched("upper_tx", 1, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 1);
+		set_name_aff_sched(sched_params::thread_names::U_TX);
 		while (!g_exit_flag) {
 			driveTx();
 		}
@@ -113,7 +113,7 @@
 	// atomic ensures data is not written to q until loop reads
 	start_lower_ms();
 
-	set_name_aff_sched("upper_rx", 1, SCHED_FIFO, sched_get_priority_max(SCHED_RR) - 5);
+	set_name_aff_sched(sched_params::thread_names::U_RX);
 	while (!g_exit_flag) {
 		// set_upper_ready(true);
 		driveReceiveFIFO();
@@ -128,7 +128,7 @@
 
 #ifdef LSANDEBUG
 	std::thread([this] {
-		set_name_aff_sched("leakcheck", 1, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 10);
+		set_name_aff_sched(sched_params::thread_names::LEAKCHECK);
 
 		while (1) {
 			std::this_thread::sleep_for(std::chrono::seconds{ 5 });
@@ -485,7 +485,7 @@
 		std::cerr << "Error initializing hardware, quitting.." << std::endl;
 		return -1;
 	}
-	trx->set_name_aff_sched("main", 3, SCHED_FIFO, sched_get_priority_max(SCHED_FIFO) - 5);
+	trx->set_name_aff_sched(sched_params::thread_names::MAIN);
 
 	if (!trxcon::trxc_l1ctl_init(tall_trxcon_ctx)) {
 		std::cerr << "Error initializing l1ctl, quitting.." << std::endl;