23 #ifndef _INCLUDE_LEON_h 24 #define _INCLUDE_LEON_h 33 #define LEON_INTERRUPT_EXTERNAL_1 5 45 #define LEON_TRAP_TYPE( _source ) SPARC_ASYNCHRONOUS_TRAP((_source) + 0x10) 47 #define LEON_TRAP_SOURCE( _trap ) ((_trap) - 0x10) 49 #define LEON_INT_TRAP( _trap ) \ 50 ( (_trap) >= 0x11 && \ 69 #define LEON_MEMORY_CONFIGURATION_PROM_SIZE_MASK 0x0003C000 75 #define LEON_MEMORY_CONFIGURATION_RAM_SIZE_MASK 0x00001E00 82 #define LEON_REG_TIMER_CONTROL_EN 0x00000001 84 #define LEON_REG_TIMER_CONTROL_RL 0x00000002 86 #define LEON_REG_TIMER_CONTROL_LD 0x00000004 93 #define LEON_REG_UART_CONTROL_RTD 0x000000FF 99 #define LEON_REG_UART_STATUS_DR 0x00000001 100 #define LEON_REG_UART_STATUS_TSE 0x00000002 101 #define LEON_REG_UART_STATUS_THE 0x00000004 102 #define LEON_REG_UART_STATUS_BR 0x00000008 103 #define LEON_REG_UART_STATUS_OE 0x00000010 104 #define LEON_REG_UART_STATUS_PE 0x00000020 105 #define LEON_REG_UART_STATUS_FE 0x00000040 106 #define LEON_REG_UART_STATUS_TF 0x00000200 107 #define LEON_REG_UART_STATUS_ERR 0x00000078 113 #define LEON_REG_UART_CTRL_RE 0x00000001 114 #define LEON_REG_UART_CTRL_TE 0x00000002 115 #define LEON_REG_UART_CTRL_RI 0x00000004 116 #define LEON_REG_UART_CTRL_TI 0x00000008 117 #define LEON_REG_UART_CTRL_PS 0x00000010 118 #define LEON_REG_UART_CTRL_PE 0x00000020 119 #define LEON_REG_UART_CTRL_FL 0x00000040 120 #define LEON_REG_UART_CTRL_LB 0x00000080 121 #define LEON_REG_UART_CTRL_DB 0x00000800 122 #define LEON_REG_UART_CTRL_SI 0x00004000 123 #define LEON_REG_UART_CTRL_FA 0x80000000 124 #define LEON_REG_UART_CTRL_FA_BIT 31 129 #define LEON3_REG_CACHE_CTRL_FI 0x00200000 130 #define LEON3_REG_CACHE_CTRL_DS 0x00800000 133 extern volatile struct irqmp_regs *LEON3_IrqCtrl_Regs;
141 extern uint32_t LEON3_Cpu_Index;
144 extern int LEON3_IrqCtrl_EIrq;
146 static __inline__
int bsp_irq_fixup(
int irq)
150 if (LEON3_IrqCtrl_EIrq != 0 && irq == LEON3_IrqCtrl_EIrq) {
152 cpu = _LEON3_Get_current_processor();
153 eirq = LEON3_IrqCtrl_Regs->intid[cpu] & 0x1f;
163 #define LEON3_IRQMPSTATUS_CPUNR 28 164 #define LEON3_IRQMPSTATUS_BROADCAST 27 181 #define LEON3_IRQCTRL_ACQUIRE( _lock_context ) \ 182 rtems_interrupt_lock_acquire( &LEON3_IrqCtrl_Lock, _lock_context ) 184 #define LEON3_IRQCTRL_RELEASE( _lock_context ) \ 185 rtems_interrupt_lock_release( &LEON3_IrqCtrl_Lock, _lock_context ) 187 #define LEON_Clear_interrupt( _source ) \ 189 LEON3_IrqCtrl_Regs->iclear = (1U << (_source)); \ 192 #define LEON_Force_interrupt( _source ) \ 194 LEON3_IrqCtrl_Regs->iforce = (1U << (_source)); \ 197 #define LEON_Enable_interrupt_broadcast( _source ) \ 199 rtems_interrupt_lock_context _lock_context; \ 200 uint32_t _mask = 1U << ( _source ); \ 201 LEON3_IRQCTRL_ACQUIRE( &_lock_context ); \ 202 LEON3_IrqCtrl_Regs->bcast |= _mask; \ 203 LEON3_IRQCTRL_RELEASE( &_lock_context ); \ 206 #define LEON_Disable_interrupt_broadcast( _source ) \ 208 rtems_interrupt_lock_context _lock_context; \ 209 uint32_t _mask = 1U << ( _source ); \ 210 LEON3_IRQCTRL_ACQUIRE( &_lock_context ); \ 211 LEON3_IrqCtrl_Regs->bcast &= ~_mask; \ 212 LEON3_IRQCTRL_RELEASE( &_lock_context ); \ 215 #define LEON_Is_interrupt_pending( _source ) \ 216 (LEON3_IrqCtrl_Regs->ipend & (1U << (_source))) 218 #define LEON_Cpu_Is_interrupt_masked( _source, _cpu ) \ 219 (!(LEON3_IrqCtrl_Regs->mask[_cpu] & (1U << (_source)))) 221 #define LEON_Cpu_Mask_interrupt( _source, _cpu ) \ 223 rtems_interrupt_lock_context _lock_context; \ 224 LEON3_IRQCTRL_ACQUIRE( &_lock_context ); \ 225 LEON3_IrqCtrl_Regs->mask[_cpu] &= ~(1U << (_source)); \ 226 LEON3_IRQCTRL_RELEASE( &_lock_context ); \ 229 #define LEON_Cpu_Unmask_interrupt( _source, _cpu ) \ 231 rtems_interrupt_lock_context _lock_context; \ 232 LEON3_IRQCTRL_ACQUIRE( &_lock_context ); \ 233 LEON3_IrqCtrl_Regs->mask[_cpu] |= (1U << (_source)); \ 234 LEON3_IRQCTRL_RELEASE( &_lock_context ); \ 237 #define LEON_Cpu_Disable_interrupt( _source, _previous, _cpu ) \ 239 rtems_interrupt_lock_context _lock_context; \ 240 uint32_t _mask = 1U << (_source); \ 241 LEON3_IRQCTRL_ACQUIRE( &_lock_context ); \ 242 (_previous) = LEON3_IrqCtrl_Regs->mask[_cpu]; \ 243 LEON3_IrqCtrl_Regs->mask[_cpu] = _previous & ~_mask; \ 244 LEON3_IRQCTRL_RELEASE( &_lock_context ); \ 245 (_previous) &= _mask; \ 248 #define LEON_Cpu_Restore_interrupt( _source, _previous, _cpu ) \ 250 rtems_interrupt_lock_context _lock_context; \ 251 uint32_t _mask = 1U << (_source); \ 252 LEON3_IRQCTRL_ACQUIRE( &_lock_context ); \ 253 LEON3_IrqCtrl_Regs->mask[_cpu] = \ 254 (LEON3_IrqCtrl_Regs->mask[_cpu] & ~_mask) | (_previous); \ 255 LEON3_IRQCTRL_RELEASE( &_lock_context ); \ 259 #define LEON_Is_interrupt_masked( _source ) \ 260 LEON_Cpu_Is_interrupt_masked(_source, _LEON3_Get_current_processor()) 262 #define LEON_Mask_interrupt(_source) \ 263 LEON_Cpu_Mask_interrupt(_source, _LEON3_Get_current_processor()) 265 #define LEON_Unmask_interrupt(_source) \ 266 LEON_Cpu_Unmask_interrupt(_source, _LEON3_Get_current_processor()) 268 #define LEON_Disable_interrupt(_source, _previous) \ 269 LEON_Cpu_Disable_interrupt(_source, _previous, _LEON3_Get_current_processor()) 271 #define LEON_Restore_interrupt(_source, _previous) \ 272 LEON_Cpu_Restore_interrupt(_source, _previous, _LEON3_Get_current_processor()) 275 #define BSP_Clear_interrupt(_source) LEON_Clear_interrupt(_source) 276 #define BSP_Force_interrupt(_source) LEON_Force_interrupt(_source) 277 #define BSP_Is_interrupt_pending(_source) LEON_Is_interrupt_pending(_source) 278 #define BSP_Is_interrupt_masked(_source) LEON_Is_interrupt_masked(_source) 279 #define BSP_Unmask_interrupt(_source) LEON_Unmask_interrupt(_source) 280 #define BSP_Mask_interrupt(_source) LEON_Mask_interrupt(_source) 281 #define BSP_Disable_interrupt(_source, _previous) \ 282 LEON_Disable_interrupt(_source, _prev) 283 #define BSP_Restore_interrupt(_source, _previous) \ 284 LEON_Restore_interrupt(_source, _previous) 287 #define BSP_Cpu_Is_interrupt_masked(_source, _cpu) \ 288 LEON_Cpu_Is_interrupt_masked(_source, _cpu) 289 #define BSP_Cpu_Unmask_interrupt(_source, _cpu) \ 290 LEON_Cpu_Unmask_interrupt(_source, _cpu) 291 #define BSP_Cpu_Mask_interrupt(_source, _cpu) \ 292 LEON_Cpu_Mask_interrupt(_source, _cpu) 293 #define BSP_Cpu_Disable_interrupt(_source, _previous, _cpu) \ 294 LEON_Cpu_Disable_interrupt(_source, _prev, _cpu) 295 #define BSP_Cpu_Restore_interrupt(_source, _previous, _cpu) \ 296 LEON_Cpu_Restore_interrupt(_source, _previous, _cpu) 315 #define LEON_REG_TIMER_COUNTER_RELOAD_AT_ZERO 0x00000002 316 #define LEON_REG_TIMER_COUNTER_STOP_AT_ZERO 0x00000000 318 #define LEON_REG_TIMER_COUNTER_LOAD_COUNTER 0x00000004 320 #define LEON_REG_TIMER_COUNTER_ENABLE_COUNTING 0x00000001 321 #define LEON_REG_TIMER_COUNTER_DISABLE_COUNTING 0x00000000 323 #define LEON_REG_TIMER_COUNTER_RELOAD_MASK 0x00000002 324 #define LEON_REG_TIMER_COUNTER_ENABLE_MASK 0x00000001 326 #define LEON_REG_TIMER_COUNTER_DEFINED_MASK 0x00000003 327 #define LEON_REG_TIMER_COUNTER_CURRENT_MODE_MASK 0x00000003 329 #if defined(RTEMS_MULTIPROCESSING) 330 #define LEON3_CLOCK_INDEX \ 331 (rtems_configuration_get_user_multiprocessing_table() ? LEON3_Cpu_Index : 0) 333 #define LEON3_CLOCK_INDEX 0 336 #if defined(RTEMS_SMP) 337 #define LEON3_COUNTER_GPTIMER_INDEX (LEON3_CLOCK_INDEX + 1) 339 #define LEON3_COUNTER_GPTIMER_INDEX LEON3_CLOCK_INDEX 347 #define LEON3_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER 1000000 350 static inline unsigned int leon_r32_no_cache(uintptr_t addr)
353 __asm__ volatile (
" lda [%1] 1, %0\n" :
"=r"(tmp) :
"r"(addr));
364 extern int syscon_uart_index;
373 extern int leon3_debug_uart_index;
384 extern int leon3_timer_core_index;
394 extern unsigned int leon3_timer_prescaler;
397 void leon3_ext_irq_init(
void);
401 static inline uint32_t leon3_get_cpu_count(
405 uint32_t mpstat = irqmp->mpstat;
407 return ((mpstat >> LEON3_IRQMPSTATUS_CPUNR) & 0xf) + 1;
410 static inline void leon3_set_system_register(uint32_t addr, uint32_t val)
415 :
"r" (addr),
"r" (val)
419 static inline uint32_t leon3_get_system_register(uint32_t addr)
432 static inline void leon3_set_cache_control_register(uint32_t val)
434 leon3_set_system_register(0x0, val);
437 static inline uint32_t leon3_get_cache_control_register(
void)
439 return leon3_get_system_register(0x0);
442 static inline bool leon3_data_cache_snooping_enabled(
void)
444 return leon3_get_cache_control_register() & LEON3_REG_CACHE_CTRL_DS;
447 static inline uint32_t leon3_get_inst_cache_config_register(
void)
449 return leon3_get_system_register(0x8);
452 static inline uint32_t leon3_get_data_cache_config_register(
void)
454 return leon3_get_system_register(0xc);
457 static inline bool leon3_irqmp_has_timestamp(
461 return (irqmp_ts->control >> 27) > 0;
464 static inline uint32_t leon3_up_counter_low(
void)
476 static inline uint32_t leon3_up_counter_high(
void)
488 static inline void leon3_up_counter_enable(
void)
495 static inline bool leon3_up_counter_is_available(
void)
497 return leon3_up_counter_low() != leon3_up_counter_low();
500 static inline uint32_t leon3_up_counter_frequency(
void)
506 return ambapp_freq_get(&ambapp_plb, LEON3_IrqCtrl_Adev);
#define RTEMS_NO_RETURN
Definition: basedefs.h:102
ISR lock control.
Definition: isrlock.h:56
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.