hw: add Timer re-init/resume support

Add explicit init() to Timer infrastructure to re-initialize the hardware
based on the parameters given during constructing time of the timer object.

Issue #4669
This commit is contained in:
Alexander Boettcher 2023-01-23 14:56:28 +01:00 committed by Christian Helmuth
parent 1b5bfec8f9
commit 5587476b4e
12 changed files with 47 additions and 0 deletions

View File

@ -88,6 +88,9 @@ class Kernel::Cpu : public Genode::Cpu, private Irq::Pool, private Timeout
Ipi(Cpu & cpu);
void init();
/*********************
** Irq interface **
*********************/

View File

@ -52,5 +52,12 @@ Cpu::Ipi::Ipi(Cpu & cpu)
:
Irq(Board::Pic::IPI, cpu, cpu.pic()), cpu(cpu)
{
init();
}
void Cpu::Ipi::init()
{
pending = false;
cpu.pic().unmask(Board::Pic::IPI, cpu.id());
}

View File

@ -110,6 +110,9 @@ class Kernel::Timer
unsigned interrupt_id() const;
time_t time() const { return _time + _duration(); }
void init() { _device.init(); }
};
#endif /* _CORE__KERNEL__TIMER_H_ */

View File

@ -61,6 +61,8 @@ struct Board::Timer : Genode::Mmio
Kernel::time_t current_ticks() const;
Timer(unsigned);
void init();
};
#endif /* _SRC__CORE__SPEC__ARM__CORTEX_A9_GLOBAL_TIMER_H_ */

View File

@ -25,6 +25,12 @@ unsigned long Board::Timer::_freq() { return Genode::Cpu::Cntfrq::read(); }
Board::Timer::Timer(unsigned) : ticks_per_ms((unsigned)(_freq() / 1000))
{
init();
}
void Board::Timer::init()
{
Cpu::Cntp_ctl::access_t ctl = 0;
Cpu::Cntp_ctl::Enable::set(ctl, 1);

View File

@ -27,6 +27,8 @@ struct Board::Timer
unsigned const ticks_per_ms;
Timer(unsigned);
void init();
};
#endif /* _SRC__CORE__SPEC__ARM__GENERIC_TIMER_H_ */

View File

@ -29,6 +29,12 @@ unsigned Timer::interrupt_id() const { return Board::EPIT_1_IRQ; }
Board::Timer::Timer(unsigned)
:
Mmio(Platform::mmio_to_virt(Board::EPIT_1_MMIO_BASE))
{
init();
}
void Board::Timer::init()
{
reset();

View File

@ -88,6 +88,8 @@ struct Board::Timer : Genode::Mmio
}
Timer(unsigned);
void init();
};
#endif /* _SRC__CORE__SPEC__ARM__IMX_EPIT_H_ */

View File

@ -21,6 +21,12 @@ using namespace Kernel;
Board::Timer::Timer(unsigned)
{
init();
}
void Board::Timer::init()
{
/* enable timer interrupt */
enum { STIE = 0x20 };

View File

@ -34,6 +34,8 @@ struct Board::Timer
Kernel::time_t stime() const;
Timer(unsigned);
void init();
};
#endif /* _SRC__CORE__SPEC__RISCV__TIMER_H_ */

View File

@ -56,6 +56,12 @@ uint32_t Board::Timer::pit_calc_timer_freq(void)
Board::Timer::Timer(unsigned)
:
Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::lapic_phys_base()))
{
init();
}
void Board::Timer::init()
{
/* enable LAPIC timer in one-shot mode */
write<Tmr_lvt::Vector>(Board::TIMER_VECTOR_KERNEL);

View File

@ -72,6 +72,8 @@ struct Board::Timer: Genode::Mmio
Genode::uint32_t pit_calc_timer_freq(void);
Timer(unsigned);
void init();
};
#endif /* _SRC__CORE__SPEC__ARM__PIT_H_ */