mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-31 10:17:56 +08:00
bsp/leon3: Use ambapp_freq_get() for CPU counter
This commit is contained in:
@@ -88,7 +88,11 @@ void amba_initialize(void)
|
||||
LEON3_Timer_Regs = (volatile struct gptimer_regs *)DEV_TO_APB(adev)->start;
|
||||
|
||||
/* Register AMBA Bus Frequency */
|
||||
ambapp_freq_init(&ambapp_plb, adev,
|
||||
(LEON3_Timer_Regs->scaler_reload + 1) * 1000000);
|
||||
ambapp_freq_init(
|
||||
&ambapp_plb,
|
||||
adev,
|
||||
(LEON3_Timer_Regs->scaler_reload + 1)
|
||||
* LEON3_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,6 +280,13 @@ extern rtems_interrupt_lock LEON3_IrqCtrl_Lock;
|
||||
#define LEON3_CLOCK_INDEX 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We assume that a boot loader (usually GRMON) initialized the GPTIMER 0 to
|
||||
* run with 1MHz. This is used to determine all clock frequencies of the PnP
|
||||
* devices. See also ambapp_freq_init() and ambapp_freq_get().
|
||||
*/
|
||||
#define LEON3_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER 1000000
|
||||
|
||||
/* Load 32-bit word by forcing a cache-miss */
|
||||
static inline unsigned int leon_r32_no_cache(uintptr_t addr)
|
||||
{
|
||||
|
||||
@@ -57,6 +57,7 @@ static void gpt_counter_initialize(
|
||||
void leon3_cpu_counter_initialize(void)
|
||||
{
|
||||
struct ambapp_dev *adev;
|
||||
int idx = 1;
|
||||
|
||||
adev = (void *) ambapp_for_each(
|
||||
&ambapp_plb,
|
||||
@@ -64,47 +65,28 @@ void leon3_cpu_counter_initialize(void)
|
||||
VENDOR_GAISLER,
|
||||
GAISLER_GPTIMER,
|
||||
ambapp_find_by_idx,
|
||||
NULL
|
||||
&idx
|
||||
);
|
||||
if (adev != NULL) {
|
||||
/* Use the second GPTIMER if available */
|
||||
volatile struct gptimer_regs *gpt = adev_to_gpt(adev);
|
||||
unsigned prescaler = gpt->scaler_reload + 1;
|
||||
uint32_t max_frequency = ambapp_freq_get(&ambapp_plb, adev);
|
||||
unsigned min_prescaler = 8;
|
||||
uint32_t frequency = max_frequency / min_prescaler;
|
||||
|
||||
/* Assume that GRMON initialized the first GPTIMER to 1MHz */
|
||||
uint32_t frequency = 1000000;
|
||||
gpt->scaler_reload = min_prescaler - 1;
|
||||
gpt->timer[0].reload = 0xffffffff;
|
||||
gpt->timer[0].ctrl = LEON3_GPTIMER_EN | LEON3_GPTIMER_RL
|
||||
| LEON3_GPTIMER_LD;
|
||||
|
||||
uint32_t max_frequency = frequency * prescaler;
|
||||
int idx = 1;
|
||||
|
||||
adev = (void *) ambapp_for_each(
|
||||
&ambapp_plb,
|
||||
OPTIONS_ALL | OPTIONS_APB_SLVS,
|
||||
VENDOR_GAISLER,
|
||||
GAISLER_GPTIMER,
|
||||
ambapp_find_by_idx,
|
||||
&idx
|
||||
gpt_counter_initialize(gpt, 0, frequency, free_counter_difference);
|
||||
} else if (LEON3_Timer_Regs != NULL) {
|
||||
/* Fall back to the first GPTIMER if available */
|
||||
gpt_counter_initialize(
|
||||
LEON3_Timer_Regs,
|
||||
LEON3_CLOCK_INDEX,
|
||||
LEON3_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER,
|
||||
clock_counter_difference
|
||||
);
|
||||
if (adev != NULL) {
|
||||
/* Use the second GPTIMER if available */
|
||||
unsigned min_prescaler = 8;
|
||||
|
||||
gpt = adev_to_gpt(adev);
|
||||
|
||||
gpt->scaler_reload = min_prescaler - 1;
|
||||
gpt->timer[0].reload = 0xffffffff;
|
||||
gpt->timer[0].ctrl = LEON3_GPTIMER_EN | LEON3_GPTIMER_RL
|
||||
| LEON3_GPTIMER_LD;
|
||||
|
||||
frequency = max_frequency / min_prescaler;
|
||||
gpt_counter_initialize(gpt, 0, frequency, free_counter_difference);
|
||||
} else {
|
||||
/* Fall back to the first GPTIMER */
|
||||
gpt_counter_initialize(
|
||||
gpt,
|
||||
LEON3_CLOCK_INDEX,
|
||||
frequency,
|
||||
clock_counter_difference
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user