/* * Generate a mask that covers the number of bytes required to address * up to 1024 interrupts, each represented by <bits> bits. This assumes * that <bits> is a power of two.
*/ #define VGIC_ADDR_IRQ_MASK(bits) (((bits) * 1024 / 8) - 1)
/* * (addr & mask) gives us the _byte_ offset for the INT ID. * We multiply this by 8 the get the _bit_ offset, then divide this by * the number of bits to learn the actual INT ID. * But instead of a division (which requires a "long long div" implementation), * we shift by the binary logarithm of <bits>. * This assumes that <bits> is a power of two.
*/ #define VGIC_ADDR_TO_INTID(addr, bits) (((addr) & VGIC_ADDR_IRQ_MASK(bits)) * \
8 >> ilog2(bits))
/* * Some VGIC registers store per-IRQ information, with a different number * of bits per IRQ. For those registers this macro is used. * The _WITH_LENGTH version instantiates registers with a fixed length * and is mutually exclusive with the _PER_IRQ version.
*/ #define REGISTER_DESC_WITH_BITS_PER_IRQ(off, rd, wr, ur, uw, bpi, acc) \
{ \
.reg_offset = off, \
.bits_per_irq = bpi, \
.len = bpi * 1024 / 8, \
.access_flags = acc, \
.read = rd, \
.write = wr, \
.uaccess_read = ur, \
.uaccess_write = uw, \
}
/* Find the proper register handler entry given a certain address offset */ conststruct vgic_register_region *
vgic_find_mmio_region(conststruct vgic_register_region *regions, int nr_regions, unsignedint offset);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.