/* * Even in 32bit systems that use LPAE, there is no guarantee that the I/O * interface provides true 64bit atomic accesses, so using strd/ldrd doesn't * make much sense. * Moreover, 64bit I/O emulation is extremely difficult to implement on * AArch32, since the syndrome register doesn't provide any information for * them. * Consequently, the following IO helpers use 32bit accesses.
*/ staticinlinevoid __gic_writeq_nonatomic(u64 val, volatilevoid __iomem *addr)
{
writel_relaxed((u32)val, addr);
writel_relaxed((u32)(val >> 32), addr + 4);
}
/* * GICD_IROUTERn, contain the affinity values associated to each interrupt. * The upper-word (aff3) will always be 0, so there is no need for a lock.
*/ #define gic_write_irouter(v, c) __gic_writeq_nonatomic(v, c)
/* * GICR_TYPER is an ID register and doesn't need atomicity.
*/ #define gic_read_typer(c) __gic_readq_nonatomic(c)
/* * GITS_BASER - hi and lo bits may be accessed independently.
*/ #define gits_read_baser(c) __gic_readq_nonatomic(c) #define gits_write_baser(v, c) __gic_writeq_nonatomic(v, c)
/* * GICR_PENDBASER and GICR_PROPBASE are changed with LPIs disabled, so they * won't be being used during any updates and can be changed non-atomically
*/ #define gicr_read_propbaser(c) __gic_readq_nonatomic(c) #define gicr_write_propbaser(v, c) __gic_writeq_nonatomic(v, c) #define gicr_read_pendbaser(c) __gic_readq_nonatomic(c) #define gicr_write_pendbaser(v, c) __gic_writeq_nonatomic(v, c)
/* * GICR_xLPIR - only the lower bits are significant
*/ #define gic_read_lpir(c) readl_relaxed(c) #define gic_write_lpir(v, c) writel_relaxed(lower_32_bits(v), c)
/* * GITS_TYPER is an ID register and doesn't need atomicity.
*/ #define gits_read_typer(c) __gic_readq_nonatomic(c)
/* * GITS_CBASER - hi and lo bits may be accessed independently.
*/ #define gits_read_cbaser(c) __gic_readq_nonatomic(c) #define gits_write_cbaser(v, c) __gic_writeq_nonatomic(v, c)
/* * GITS_CWRITER - hi and lo bits may be accessed independently.
*/ #define gits_write_cwriter(v, c) __gic_writeq_nonatomic(v, c)
/* * GICR_VPROPBASER - hi and lo bits may be accessed independently.
*/ #define gicr_read_vpropbaser(c) __gic_readq_nonatomic(c) #define gicr_write_vpropbaser(v, c) __gic_writeq_nonatomic(v, c)
/* * GICR_VPENDBASER - the Valid bit must be cleared before changing * anything else.
*/ staticinlinevoid gicr_write_vpendbaser(u64 val, void __iomem *addr)
{
u32 tmp;
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.