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
133extern volatile struct irqmp_regs *LEON3_IrqCtrl_Regs;
141extern uint32_t LEON3_Cpu_Index;
144extern int LEON3_IrqCtrl_EIrq;
146static __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
350static inline unsigned int leon_r32_no_cache(uintptr_t addr)
353 __asm__ volatile (
" lda [%1] 1, %0\n" :
"=r"(tmp) :
"r"(addr));
364extern int syscon_uart_index;
373extern int leon3_debug_uart_index;
384extern int leon3_timer_core_index;
394extern unsigned int leon3_timer_prescaler;
397void leon3_ext_irq_init(
void);
401static inline uint32_t leon3_get_cpu_count(
405 uint32_t mpstat = irqmp->mpstat;
407 return ((mpstat >> LEON3_IRQMPSTATUS_CPUNR) & 0xf) + 1;
410static inline void leon3_set_system_register(uint32_t addr, uint32_t val)
415 :
"r" (addr),
"r" (val)
419static inline uint32_t leon3_get_system_register(uint32_t addr)
432static inline void leon3_set_cache_control_register(uint32_t val)
434 leon3_set_system_register(0x0, val);
437static inline uint32_t leon3_get_cache_control_register(
void)
439 return leon3_get_system_register(0x0);
442static inline bool leon3_data_cache_snooping_enabled(
void)
444 return leon3_get_cache_control_register() & LEON3_REG_CACHE_CTRL_DS;
447static inline uint32_t leon3_get_inst_cache_config_register(
void)
449 return leon3_get_system_register(0x8);
452static inline uint32_t leon3_get_data_cache_config_register(
void)
454 return leon3_get_system_register(0xc);
457static inline bool leon3_irqmp_has_timestamp(
461 return (irqmp_ts->control >> 27) > 0;
464static inline uint32_t leon3_up_counter_low(
void)
476static inline uint32_t leon3_up_counter_high(
void)
488static inline void leon3_up_counter_enable(
void)
495static inline bool leon3_up_counter_is_available(
void)
497 return leon3_up_counter_low() != leon3_up_counter_low();
500static 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
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.
ISR lock control.
Definition: isrlock.h:56