mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-01 23:20:55 +00:00
hw_x86_64: read number of I/O redirection table entries from IOAPIC
Fixes #2475
This commit is contained in:
parent
47dc708887
commit
60ae6721db
@ -170,6 +170,9 @@ Irte::access_t Ioapic::_create_irt_entry(unsigned const irq)
|
|||||||
|
|
||||||
Ioapic::Ioapic() : Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::MMIO_IOAPIC_BASE))
|
Ioapic::Ioapic() : Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::MMIO_IOAPIC_BASE))
|
||||||
{
|
{
|
||||||
|
write<Ioregsel>(IOAPICVER);
|
||||||
|
_irte_count = read<Iowin::Maximum_redirection_entry>() + 1;
|
||||||
|
|
||||||
for (unsigned i = 0; i < IRQ_COUNT; i++)
|
for (unsigned i = 0; i < IRQ_COUNT; i++)
|
||||||
{
|
{
|
||||||
/* set legacy/ISA IRQs to edge, high */
|
/* set legacy/ISA IRQs to edge, high */
|
||||||
@ -182,7 +185,7 @@ Ioapic::Ioapic() : Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::MMIO_IOAPIC_B
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* remap all IRQs managed by I/O APIC */
|
/* remap all IRQs managed by I/O APIC */
|
||||||
if (i < IRTE_COUNT) {
|
if (i < _irte_count) {
|
||||||
Irte::access_t irte = _create_irt_entry(i);
|
Irte::access_t irte = _create_irt_entry(i);
|
||||||
write<Ioregsel>(IOREDTBL + 2 * i + 1);
|
write<Ioregsel>(IOREDTBL + 2 * i + 1);
|
||||||
write<Iowin>(irte >> Iowin::ACCESS_WIDTH);
|
write<Iowin>(irte >> Iowin::ACCESS_WIDTH);
|
||||||
@ -198,7 +201,7 @@ void Ioapic::toggle_mask(unsigned const vector, bool const set)
|
|||||||
/*
|
/*
|
||||||
* Ignore toggle requests for vectors not handled by the I/O APIC.
|
* Ignore toggle requests for vectors not handled by the I/O APIC.
|
||||||
*/
|
*/
|
||||||
if (vector < REMAP_BASE || vector >= REMAP_BASE + IRTE_COUNT) {
|
if (vector < REMAP_BASE || vector >= REMAP_BASE + _irte_count) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,12 +53,10 @@ class Genode::Ioapic : public Mmio
|
|||||||
|
|
||||||
enum { REMAP_BASE = Board::VECTOR_REMAP_BASE };
|
enum { REMAP_BASE = Board::VECTOR_REMAP_BASE };
|
||||||
|
|
||||||
uint8_t _irt_count;
|
/* Number of Redirection Table entries */
|
||||||
|
unsigned _irte_count;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
/* Number of Redirection Table entries */
|
|
||||||
IRTE_COUNT = 24,
|
|
||||||
|
|
||||||
/* Register selectors */
|
/* Register selectors */
|
||||||
IOAPICVER = 0x01,
|
IOAPICVER = 0x01,
|
||||||
IOREDTBL = 0x10,
|
IOREDTBL = 0x10,
|
||||||
@ -130,7 +128,10 @@ class Genode::Ioapic : public Mmio
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct Ioregsel : Register<0x00, 32> { };
|
struct Ioregsel : Register<0x00, 32> { };
|
||||||
struct Iowin : Register<0x10, 32> { };
|
struct Iowin : Register<0x10, 32>
|
||||||
|
{
|
||||||
|
struct Maximum_redirection_entry : Bitfield<16, 8> { };
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class Genode::Pic : public Mmio
|
class Genode::Pic : public Mmio
|
||||||
|
Loading…
x
Reference in New Issue
Block a user