From 054c88011b7bc1b8c489f41a3c933bdc97e1b853 Mon Sep 17 00:00:00 2001
From: Armin Luntzer <armin.luntzer@univie.ac.at>
Date: Tue, 19 Nov 2019 16:14:14 +0100
Subject: [PATCH] consolidate gr740 merge

---
 arch/sparc/Makefile            | 17 +++++++++---
 arch/sparc/kernel/clockevent.c |  4 ++-
 arch/sparc/kernel/irq.c        |  2 +-
 arch/sparc/kernel/setup.c      | 47 +++++++++++++++++-----------------
 arch/sparc/kernel/smp.c        | 22 ++++++++++------
 init/main.c                    | 39 +++++++++++++++-------------
 kernel/sched/core.c            |  2 +-
 kernel/tick.c                  |  2 +-
 8 files changed, 77 insertions(+), 58 deletions(-)

diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile
index 571d650..2aee129 100644
--- a/arch/sparc/Makefile
+++ b/arch/sparc/Makefile
@@ -1,8 +1,17 @@
-# gcc (7.2.0)
-#
-#ARCH_CFLAGS = -mcpu=leon3 -mfix-gr712rc
-ARCH_CFLAGS = -mcpu=leon3 -mhard-float
 # gcc (4.x)
 #ARCH_CFLAGS = -mcpu=v8 -mfix-gr712rc
 # clang
 #ARCH_CFLAGS = -mcpu=gr712rc
+
+
+# gcc (7.2.0)
+ifeq ($(CONFIG_LEON4),y)
+KBUILD_CFLAGS  += -m32 -mcpu=leon3 -mhard-float
+endif
+
+ifeq ($(CONFIG_LEON3),y)
+ARCH_CFLAGS = -mcpu=leon3 -mfix-gr712rc
+endif
+
+
+
diff --git a/arch/sparc/kernel/clockevent.c b/arch/sparc/kernel/clockevent.c
index 5f77e63..f94205b 100644
--- a/arch/sparc/kernel/clockevent.c
+++ b/arch/sparc/kernel/clockevent.c
@@ -20,9 +20,11 @@
  * blocks
  */
 
+#ifdef CONFIG_LEON4
 #define LEON3_GPTIMERS	5
-
+#else
 #define LEON3_GPTIMERS	4
+#endif
 
 #ifdef CONFIG_LEON4
 #define GPTIMER_0_IRQ	1
diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c
index dff3b33..6ccf1a8 100644
--- a/arch/sparc/kernel/irq.c
+++ b/arch/sparc/kernel/irq.c
@@ -507,7 +507,7 @@ void leon_disable_irq(unsigned int irq, int cpu)
 
 void leon_force_irq(unsigned int irq, int cpu)
 {
-#ifdef CONFIG_LEON3
+#if defined(CONFIG_LEON3) || defined(CONFIG_LEON4)
 	if (cpu >= 0) {
 		iowrite32be((1 << irq), &leon_irqctrl_regs->irq_mpforce[cpu]);
 		return;
diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c
index d4b417d..55c85d2 100644
--- a/arch/sparc/kernel/setup.c
+++ b/arch/sparc/kernel/setup.c
@@ -77,7 +77,9 @@ static void mem_init(void)
 #ifdef CONFIG_MPPB
 	sp_banks[0].base_addr = 0x40000000;
 	sp_banks[0].num_bytes = 0x10000000;
-#elif CONFIG_LEON4
+#endif
+
+#ifdef CONFIG_LEON4
 	sp_banks[0].base_addr = 0x00000000;
 	sp_banks[0].num_bytes = 0x10000000;
 #else /* e.g. GR712 eval */
@@ -95,7 +97,7 @@ static void mem_init(void)
 }
 
 
-int cpu_ready[4];
+int cpu_ready[CONFIG_SMP_CPUS_MAX];
 
 
 #include <asm/io.h>
@@ -103,34 +105,28 @@ int cpu_ready[4];
 void cpu_wake(uint32_t cpu_id)
 {
 #ifdef CONFIG_LEON3
-	iowrite32be(cpu_id, (uint32_t *) 0x80000210);
+	iowrite32be(1 << cpu_id, (uint32_t *) 0x80000210);
 #endif
 #ifdef CONFIG_LEON4
-	iowrite32be(cpu_id, (uint32_t *) 0xFF904010);
+	iowrite32be(1 << cpu_id, (uint32_t *) 0xFF904010);
 #endif
 }
 
 /** XXX crappy */
 static void boot_cpus(void)
 {
-	printk("booting cpu1\n");
-	cpu_wake(0x2); /*cpu 1 */
-
-        while (!ioread32be(&cpu_ready[1]));
-	printk("cpu1 booted\n");
+	int i;
 
-	printk("booting cpu2\n");
-	cpu_wake(0x4); /*cpu 2 */
 
-        while (!ioread32be(&cpu_ready[2]));
-	printk("cpu2 booted\n");
+	for (i = 1; i < CONFIG_SMP_CPUS_MAX; i++) {
 
+		printk("booting cpu %d\n", i);
+		cpu_wake(i);
 
-	printk("booting cpu3\n");
-	cpu_wake(0x8); /*cpu 3 */
+		while (!ioread32be(&cpu_ready[i]));
+		printk("cpu %d booted\n", i);
 
-        while (!ioread32be(&cpu_ready[3]));
-	printk("cpu3 booted\n");
+	}
 }
 
 
@@ -140,20 +136,23 @@ extern struct task_struct *kernel[];
 void smp_cpu_entry(void)
 {
 
-     reserve_kernel_stack();
-     BUG_ON(stack_migrate(NULL, _kernel_stack_top));
+	reserve_kernel_stack();
+	BUG_ON(stack_migrate(NULL, _kernel_stack_top));
 
-     printk("hi i'm cpu %d\n", leon3_cpuid());
+	arch_local_irq_enable();
 
-     BUG_ON(!leon3_cpuid());
-      /* signal ready */
-      iowrite32be(0x1, &cpu_ready[leon3_cpuid()]);
+	printk("hi i'm cpu %d\n", leon3_cpuid());
+
+	BUG_ON(!leon3_cpuid());
+	/* signal ready */
+	iowrite32be(0x1, &cpu_ready[leon3_cpuid()]);
 
 	while (ioread32be(&cpu_ready[leon3_cpuid()]) != 0x2);
+
 	BUG_ON(clockevents_offer_device()); /* XXX CLOCK */
 	kthread_init_main();
 
-      iowrite32be(0x3, &cpu_ready[leon3_cpuid()]);
+	iowrite32be(0x3, &cpu_ready[leon3_cpuid()]);
 	while (ioread32be(&cpu_ready[leon3_cpuid()]) != 0x4);
 
 	sched_enable();
diff --git a/arch/sparc/kernel/smp.c b/arch/sparc/kernel/smp.c
index f50a053..3305d09 100644
--- a/arch/sparc/kernel/smp.c
+++ b/arch/sparc/kernel/smp.c
@@ -14,20 +14,25 @@
 #include <asm/leon.h>
 #endif
 
+#ifdef CONFIG_LEON4
+#include <asm/leon.h>
+#endif
+
 
 int smp_cpu_id(void)
 {
-#ifdef CONFIG_LEON3
+
+#if defined(CONFIG_LEON4) || defined(CONFIG_LEON3)
 	return leon3_cpuid();
-#else /* !CONFIG_LEON3 */
+#endif
+	/* everything else */
 	return 0;
-#endif /* CONFIG_LEON3 */
 }
 
 
 void smp_send_reschedule(int cpu)
 {
-#ifdef CONFIG_LEON3
+#if defined(CONFIG_LEON4) || defined(CONFIG_LEON3)
 	/* trigger reschedule via forced IRQMP extended interrupt */
 	/* TODO sanity check for cpu id */
 	leon_force_irq(LEON3_IPIRQ, cpu);
@@ -37,11 +42,12 @@ void smp_send_reschedule(int cpu)
 
 void smp_init(void)
 {
-#ifdef CONFIG_LEON3
+#if defined(CONFIG_LEON4) || defined(CONFIG_LEON3)
+
+	int i;
 
-	/* XXX need number of CPUs here */
-	leon_enable_irq(LEON3_IPIRQ, 0);
-	leon_enable_irq(LEON3_IPIRQ, 1);
+	for (i = 0; i < CONFIG_SMP_CPUS_MAX; i++)
+		leon_enable_irq(LEON3_IPIRQ, i);
 
 #endif /* CONFIG_LEON3 */
 }
diff --git a/init/main.c b/init/main.c
index 338d615..063716f 100644
--- a/init/main.c
+++ b/init/main.c
@@ -108,7 +108,7 @@ int task(void *p)
 		printk("IRQ total: %s timer1: %s timer2: %s, %d %d\n",
 		       buf1, buf2, buf3, ioread32be(&xp), xd);
 
-//		sched_yield();
+		sched_yield();
 	}
 
 	return 0;
@@ -117,12 +117,13 @@ int task(void *p)
 
 
 /** XXX dummy **/
-extern int cpu_ready[4];
+extern int cpu_ready[CONFIG_SMP_CPUS_MAX];
 /**
  * @brief kernel main functionputchar( *((char *) data) );
  */
 int kernel_main(void)
 {
+	int i;
 	struct task_struct *t;
 	struct sched_attr attr;
 
@@ -183,17 +184,16 @@ int kernel_main(void)
 	kthread_init_main();
 
 	/* wait for cpus */
-	cpu_ready[1] = 2;
-	while (ioread32be(&cpu_ready[1]) != 0x3);
-	iowrite32be(0x4, &cpu_ready[1]);
 
-	cpu_ready[2] = 2;
-	while (ioread32be(&cpu_ready[2]) != 0x3);
-	iowrite32be(0x4, &cpu_ready[2]);
+	for (i = 1; i < CONFIG_SMP_CPUS_MAX; i++) {
+
+		//printk("waiting for cpu %d, flag at %d\n", i, cpu_ready[i]);
+		cpu_ready[i] = 2;
+		while (ioread32be(&cpu_ready[i]) != 0x3);
+		iowrite32be(0x4, &cpu_ready[i]);
+
+	}
 
-	cpu_ready[3] = 2;
-	while (ioread32be(&cpu_ready[3]) != 0x3);
-	iowrite32be(0x4, &cpu_ready[3]);
 	printk(MSG "Boot complete\n");
 
 
@@ -210,41 +210,44 @@ int kernel_main(void)
 	} else {
 		printk("Got an error in kthread_create!");
 	}
+	printk("%s runs on CPU %d\n", t->name, t->on_cpu);
 
 	t = kthread_create(task1, NULL, KTHREAD_CPU_AFFINITY_NONE, "task1");
 	if (!IS_ERR(t)) {
 		sched_get_attr(t, &attr);
 		attr.policy = SCHED_EDF;
-		attr.period       = us_to_ktime(140);
-		attr.deadline_rel = us_to_ktime(115);
-		attr.wcet         = us_to_ktime(90);
+		attr.period       = us_to_ktime(300);
+		attr.deadline_rel = us_to_ktime(200);
+		attr.wcet         = us_to_ktime(100);
 		sched_set_attr(t, &attr);
 		if (kthread_wake_up(t) < 0)
 			printk("---- %s NOT SCHEDUL-ABLE---\n", t->name);
 	} else {
 		printk("Got an error in kthread_create!");
 	}
+	printk("%s runs on CPU %d\n", t->name, t->on_cpu);
 
 
 	t = kthread_create(task2, NULL, KTHREAD_CPU_AFFINITY_NONE, "task2");
 	if (!IS_ERR(t)) {
 		sched_get_attr(t, &attr);
 		attr.policy = SCHED_EDF;
-		attr.period       = us_to_ktime(140);
-		attr.deadline_rel = us_to_ktime(115);
-		attr.wcet         = us_to_ktime(90);
+		attr.period       = us_to_ktime(300);
+		attr.deadline_rel = us_to_ktime(200);
+		attr.wcet         = us_to_ktime(100);
 		sched_set_attr(t, &attr);
 		if (kthread_wake_up(t) < 0)
 			printk("---- %s NOT SCHEDUL-ABLE---\n", t->name);
 	} else {
 		printk("Got an error in kthread_create!");
 	}
-
+	printk("%s runs on CPU %d\n", t->name, t->on_cpu);
 
 
 	while(1)
 		cpu_relax();
 
+
 	/* never reached */
 	BUG();
 
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index dd1052c..55cf009 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -23,7 +23,7 @@
 
 
 static LIST_HEAD(kernel_schedulers);
-static bool sched_enabled[2] = {false, false};
+static bool sched_enabled[CONFIG_SMP_CPUS_MAX];
 
 
 /* XXX: per-cpu... */
diff --git a/kernel/tick.c b/kernel/tick.c
index 12a33f4..c309b18 100644
--- a/kernel/tick.c
+++ b/kernel/tick.c
@@ -36,7 +36,7 @@ static struct {
 
 	struct clock_event_device *dev;
 
-} tick_device[2];
+} tick_device[CONFIG_SMP_CPUS_MAX];
 
 
 static void tick_calibrate_handler(struct clock_event_device *dev)
-- 
GitLab