new: USE_MSR_INTR support
This commit is contained in:
parent
a7bac7e9b5
commit
fb05f6da35
|
@ -29,11 +29,12 @@
|
|||
#define XILINX_CLOCK_FREQ 100000000
|
||||
|
||||
/* Microblaze is microblaze_0 */
|
||||
#define XILINX_USE_MSR_INSTR 1
|
||||
#define XILINX_FSL_NUMBER 3
|
||||
|
||||
/* Interrupt controller is opb_intc_0 */
|
||||
#define XILINX_INTC_BASEADDR 0x41200000
|
||||
#define XILINX_INTC_NUM_INTR_INPUTS 5
|
||||
#define XILINX_INTC_NUM_INTR_INPUTS 6
|
||||
|
||||
/* Timer pheriphery is opb_timer_1 */
|
||||
#define XILINX_TIMER_BASEADDR 0x41c00000
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
|
||||
|
||||
|
@ -47,18 +48,18 @@ int icache_status (void)
|
|||
}
|
||||
|
||||
void icache_enable (void) {
|
||||
__asm__ __volatile__ ("msrset r0, 0x80");
|
||||
MSRSET(0x20);
|
||||
}
|
||||
|
||||
void icache_disable(void) {
|
||||
__asm__ __volatile__ ("msrclr r0, 0x80");
|
||||
MSRCLR(0x20);
|
||||
}
|
||||
|
||||
void dcache_enable (void) {
|
||||
__asm__ __volatile__ ("msrset r0, 0x20");
|
||||
MSRSET(0x80);
|
||||
}
|
||||
|
||||
void dcache_disable(void) {
|
||||
__asm__ __volatile__ ("msrclr r0, 0x20");
|
||||
MSRCLR(0x80);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -36,12 +36,12 @@ extern void microblaze_enable_interrupts (void);
|
|||
|
||||
void enable_interrupts (void)
|
||||
{
|
||||
__asm__ __volatile__ ("msrset r0, 0x2");
|
||||
MSRSET(0x2);
|
||||
}
|
||||
|
||||
int disable_interrupts (void)
|
||||
{
|
||||
__asm__ __volatile__ ("msrclr r0, 0x2");
|
||||
MSRCLR(0x2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <asm/asm.h>
|
||||
.text
|
||||
.global _interrupt_handler
|
||||
_interrupt_handler:
|
||||
|
@ -151,7 +152,20 @@ _interrupt_handler:
|
|||
addi r1, r1, 4
|
||||
|
||||
/* enable_interrupt */
|
||||
#ifdef XILINX_USE_MSR_INSTR
|
||||
msrset r0, 2
|
||||
#else
|
||||
/* FIXME unstable in stressed mode - two irqs */
|
||||
nop
|
||||
addi r1, r1, -4
|
||||
swi r12, r1, 0
|
||||
mfs r12, rmsr
|
||||
ori r12, r12, 2
|
||||
mts rmsr, r12
|
||||
lwi r12, r1, 0
|
||||
addi r1, r1, 4
|
||||
nop
|
||||
#endif
|
||||
bra r14
|
||||
nop
|
||||
nop
|
||||
|
|
|
@ -39,5 +39,42 @@
|
|||
#define MTS(val) \
|
||||
__asm__ __volatile__ ("mts rmsr, %0"::"r" (val));
|
||||
|
||||
/* get return address from interrupt */
|
||||
#define R14(val) \
|
||||
__asm__ __volatile__ ("addi %0, r14, 0":"=r" (val));
|
||||
|
||||
/* use machine status registe USE_MSR_REG */
|
||||
#ifdef XILINX_USE_MSR_INSTR
|
||||
#define MSRSET(val) \
|
||||
__asm__ __volatile__ ("msrset r0," #val );
|
||||
|
||||
#define MSRCLR(val) \
|
||||
__asm__ __volatile__ ("msrclr r0," #val );
|
||||
|
||||
#else
|
||||
#define MSRSET(val) \
|
||||
{ \
|
||||
register unsigned tmp; \
|
||||
__asm__ __volatile__ (" \
|
||||
mfs %0, rmsr; \
|
||||
ori %0, %0, "#val"; \
|
||||
mts rmsr, %0; \
|
||||
nop;" \
|
||||
: "=r" (tmp) \
|
||||
: "d" (val) \
|
||||
: "memory"); \
|
||||
}
|
||||
|
||||
#define MSRCLR(val) \
|
||||
{ \
|
||||
register unsigned tmp; \
|
||||
__asm__ __volatile__ (" \
|
||||
mfs %0, rmsr; \
|
||||
andi %0, %0, ~"#val"; \
|
||||
mts rmsr, %0; \
|
||||
nop;" \
|
||||
: "=r" (tmp) \
|
||||
: "d" (val) \
|
||||
: "memory"); \
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue