From af36c98dabf785e6224aaa88a89e4e0bdb3feece Mon Sep 17 00:00:00 2001 From: NicJA Date: Tue, 31 Mar 2015 17:58:14 +0000 Subject: [PATCH] start moving arm core/bcm support into platform specific functions git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@50271 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- arch/arm-raspi/kernel/kernel_arm.h | 7 +++++ arch/arm-raspi/kernel/kernel_cpu.c | 40 ++++++++++++++++++++++++ arch/arm-raspi/kernel/kernel_intern.h | 7 ++++- arch/arm-raspi/kernel/kernel_startup.c | 53 +++++++------------------------- arch/arm-raspi/kernel/platform_bcm283x.c | 37 +++++++++++++++++++--- arch/arm-raspi/kernel/platform_init.c | 12 +++++--- 6 files changed, 105 insertions(+), 51 deletions(-) diff --git a/arch/arm-raspi/kernel/kernel_arm.h b/arch/arm-raspi/kernel/kernel_arm.h index f9118a2a62..4aca560cd0 100644 --- a/arch/arm-raspi/kernel/kernel_arm.h +++ b/arch/arm-raspi/kernel/kernel_arm.h @@ -3,6 +3,13 @@ $Id$ */ +struct ARM_Implementation +{ + IPTR ARMI_Family; + IPTR ARMI_Platform; + void (*ARMI_LED_Toggle) (IPTR, IPTR) +}; + // values for arm_toggle_led #define ARM_LED_ON 1 diff --git a/arch/arm-raspi/kernel/kernel_cpu.c b/arch/arm-raspi/kernel/kernel_cpu.c index f070e26adb..8f5240acfb 100644 --- a/arch/arm-raspi/kernel/kernel_cpu.c +++ b/arch/arm-raspi/kernel/kernel_cpu.c @@ -30,6 +30,46 @@ extern struct Task *sysIdleTask; +void cpu_Probe(struct ARM_Implementation *kernARM) +{ + uint32_t tmp; + + asm volatile ("mrc p15, 0, %0, c0, c0, 0" : "=r" (tmp)); + if ((tmp & 0xfff0) == 0xc070) /* armv7 */ + kernARM->ARMI_Family = 7; + else + kernARM->ARMI_Family = 6; +} + +void cpu_Init(struct ARM_Implementation *kernARM, struct TagItem *msg) +{ + register unsigned int fpuflags; + unsigned int delay; + + core_SetupMMU(msg); + + if (kernARM->ARMI_LED_Toggle) + { + for (delay = 0; delay < 100000; delay++) asm volatile ("mov r0, r0\n"); + kernARM->ARMI_LED_Toggle(ARM_LED_POWER, ARM_LED_OFF); + } + + /* Enable Vector Floating Point Calculations */ + asm volatile("mrc p15,0,%[fpuflags],c1,c0,2\n" : [fpuflags] "=r" (fpuflags)); // Read Access Control Register + fpuflags |= (VFPSingle | VFPDouble); // Enable Single & Double Precision + asm volatile("mcr p15,0,%[fpuflags],c1,c0,2\n" : : [fpuflags] "r" (fpuflags)); // Set Access Control Register + asm volatile( + " mov %[fpuflags],%[vfpenable] \n" // Enable VFP + " fmxr fpexc,%[fpuflags] \n" + : [fpuflags] "=r" (fpuflags) : [vfpenable] "I" (VFPEnable)); + + if (kernARM->ARMI_LED_Toggle) + { + for (delay = 0; delay < 100000; delay++) asm volatile ("mov r0, r0\n"); + kernARM->ARMI_LED_Toggle(ARM_LED_POWER, ARM_LED_ON); + } +} + void cpu_Switch(regs_t *regs) { struct Task *task; diff --git a/arch/arm-raspi/kernel/kernel_intern.h b/arch/arm-raspi/kernel/kernel_intern.h index 5d5eddfbb8..cd41c5626d 100644 --- a/arch/arm-raspi/kernel/kernel_intern.h +++ b/arch/arm-raspi/kernel/kernel_intern.h @@ -15,6 +15,8 @@ #include #include +#include "kernel_arm.h" + extern uint32_t __arm_periiobase; #define ARM_PERIIOBASE (__arm_periiobase) #include @@ -33,7 +35,10 @@ struct KernelBase; #define VFPSingle (3 << 20) #define VFPDouble (3 << 22) -void platform_Init(struct KernelBase *); +void cpu_Probe(struct ARM_Implementation *); +void cpu_Init(struct ARM_Implementation *, struct TagItem *); + +void platform_Init(struct ARM_Implementation *, struct TagItem *); void core_SetupMMU(struct TagItem *msg); void core_SetupIntr(void); diff --git a/arch/arm-raspi/kernel/kernel_startup.c b/arch/arm-raspi/kernel/kernel_startup.c index 559b87613b..fc4a6e0245 100644 --- a/arch/arm-raspi/kernel/kernel_startup.c +++ b/arch/arm-raspi/kernel/kernel_startup.c @@ -62,7 +62,8 @@ static uint32_t * const stack_super_end __attribute__((used, section(".aros.init static uint32_t * const stack_abort_end __attribute__((used, section(".aros.init"))) = &stack_abort[STACK_SIZE - sizeof(IPTR)]; static uint32_t * const stack_irq_end __attribute__((used, section(".aros.init"))) = &stack_irq[STACK_SIZE - sizeof(IPTR)]; -__attribute__((section(".data"))) struct ExecBase *SysBase = NULL; +struct ExecBase *SysBase __attribute__((section(".data"))) = NULL; +struct ARM_Implementation krnARMImpl __attribute__((section(".data"))); extern struct TagItem *BootMsg; @@ -118,49 +119,14 @@ void __attribute__((used)) kernel_cstart(struct TagItem *msg) long unsigned int memlower = 0, memupper = 0, protlower = 0, protupper = 0; unsigned int delay; BootMsg = msg; - register unsigned int fpuflags; - uint32_t tmp; - /* Guess the cpu type and adjust __arm_periiobase accordingly */ - asm volatile ("mrc p15, 0, %0, c0, c0, 0" : "=r" (tmp)); - if ((tmp & 0xfff0) == 0xc070) /* armv7, also RaspberryPi 2 */ - { - __arm_periiobase = BCM2836_PERIPHYSBASE; - - /* Power LED back on */ - *(volatile unsigned int *)GPSET1 = (1 << (35-32)); // Power LED ON - } - else - { - __arm_periiobase = BCM2835_PERIPHYSBASE; - /* Need to detect the plus board here in order to control LEDs properly */ - - *(volatile unsigned int *)GPCLR0 = (1 << 16); // Activity LED ON - } + cpu_Probe(&krnARMImpl); + platform_Init(&krnARMImpl, msg); + cpu_Init(&krnARMImpl, msg); /* NB: the bootstrap has conveniently setup the framebuffer and initialised the serial port and led for us */ - - core_SetupMMU(msg); - - for (delay = 0; delay < 100000; delay++) asm volatile ("mov r0, r0\n"); - - *(volatile unsigned int *)GPSET0 = (1 << 16); // LED OFF - - /* Enable Vector Floating Point Calculations */ - asm volatile("mrc p15,0,%[fpuflags],c1,c0,2\n" : [fpuflags] "=r" (fpuflags)); // Read Access Control Register - fpuflags |= (VFPSingle | VFPDouble); // Enable Single & Double Precision - asm volatile("mcr p15,0,%[fpuflags],c1,c0,2\n" : : [fpuflags] "r" (fpuflags)); // Set Access Control Register - asm volatile( - " mov %[fpuflags],%[vfpenable] \n" // Enable VFP - " fmxr fpexc,%[fpuflags] \n" - : [fpuflags] "=r" (fpuflags) : [vfpenable] "I" (VFPEnable)); - - for (delay = 0; delay < 100000; delay++) asm volatile ("mov r0, r0\n"); - - *(volatile unsigned int *)GPCLR0 = (1 << 16); // LED ON - while(msg->ti_Tag != TAG_DONE) { switch (msg->ti_Tag) @@ -209,9 +175,12 @@ void __attribute__((used)) kernel_cstart(struct TagItem *msg) core_SetupIntr(); - *(volatile unsigned int *)GPSET0 = 1<<16; // LED OFF - for (delay = 0; delay < 1500; delay++) asm volatile("mov r0, r0\n"); - *(volatile unsigned int *)GPCLR0 = 1<<16; // LED ON + if (krnARMImpl.ARMI_LED_Toggle) + { + krnARMImpl.ARMI_LED_Toggle(ARM_LED_POWER, ARM_LED_OFF); + for (delay = 0; delay < 1500; delay++) asm volatile ("mov r0, r0\n"); + krnARMImpl.ARMI_LED_Toggle(ARM_LED_POWER, ARM_LED_ON); + } NEWLIST(&memList); diff --git a/arch/arm-raspi/kernel/platform_bcm283x.c b/arch/arm-raspi/kernel/platform_bcm283x.c index 5b548296e0..6c1cc9cbd0 100644 --- a/arch/arm-raspi/kernel/platform_bcm283x.c +++ b/arch/arm-raspi/kernel/platform_bcm283x.c @@ -6,7 +6,6 @@ #include #include #include "kernel_intern.h" -#include "kernel_arm.h" static void bcm283x_init(void) { @@ -38,13 +37,43 @@ static void bcm283x_init(void) #endif } -static void bcm283x_toggle_led(void) +static void bcm283x_toggle_led(IPTR LED, IPTR state) { - + if (__arm_periiobase == BCM2836_PERIPHYSBASE) + { + int pin = 35; + IPTR gpiofunc = GPSET1; + + if (LED == ARM_LED_ACTIVITY) + pin = 47; + + if (state == ARM_LED_ON) + gpiofunc = GPCLR1; + + /* Power LED back on */ + *(volatile unsigned int *)gpiofunc = (1 << (35-32)); // Power LED ON + } + else + { + // RasPi 1 only allows us to toggle the activity LED + if (state) + *(volatile unsigned int *)GPCLR0 = (1 << 16); + else + *(volatile unsigned int *)GPSET0 = (1 << 16); + } + } -static IPTR bcm283x_probe(struct KernelBase *KernelBase) +static IPTR bcm283x_probe(struct ARM_Implementation *krnARMImpl, struct TagItem *msg) { + //TODO: really detect if we are running on a broadcom 2835/2836 + if (krnARMImpl->ARMI_Family == 7) /* bcm2836 uses armv7 */ + __arm_periiobase = BCM2836_PERIPHYSBASE; + else + __arm_periiobase = BCM2835_PERIPHYSBASE; + + krnARMImpl->ARMI_LED_Toggle = bcm283x_toggle_led; + return TRUE; } diff --git a/arch/arm-raspi/kernel/platform_init.c b/arch/arm-raspi/kernel/platform_init.c index afd6f09d10..968f08528a 100644 --- a/arch/arm-raspi/kernel/platform_init.c +++ b/arch/arm-raspi/kernel/platform_init.c @@ -21,21 +21,25 @@ #include "kernel_intern.h" #include "kernel_arch.h" #include "kernel_romtags.h" -#include "kernel_arm.h" THIS_PROGRAM_HANDLES_SYMBOLSET(ARMPLATFORMS) DEFINESET(ARMPLATFORMS) -void platform_Init(struct KernelBase *KernelBase) +void platform_Init(struct ARM_Implementation *krnARMImpl, struct TagItem *msg) { - IPTR (*platprobe) (struct KernelBase *); + IPTR (*platprobe) (struct ARM_Implementation *, struct TagItem *); int cur = 0; for ( ; ((long *)SETNAME(ARMPLATFORMS)[cur]) != NULL; cur++) { platprobe = SETNAME(ARMPLATFORMS)[cur]; - if (platprobe(KernelBase)) + if (platprobe(krnARMImpl, msg)) + { + if (krnARMImpl->ARMI_LED_Toggle) + krnARMImpl->ARMI_LED_Toggle(ARM_LED_POWER, ARM_LED_ON); + break; + } } return; -- 2.11.4.GIT