[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 3/3] ARM: GICv3 ITS: flush all buffers, not just command queue
On 9/19/23 09:14, Julien Grall wrote: > Hi, > > On 19/09/2023 14:10, Julien Grall wrote: >> On 19/09/2023 12:28, Volodymyr Babchuk wrote: >>> ITS manages Device Tables and Interrupt Translation Tables on its own, >>> so generally we are not interested which shareability and cacheability >>> attributes it uses. But there is one exception: ITS requires that DT >>> and ITT must be initialized with zeroes. If ITS belongs to the Inner >>> Cacheability domain there is no problem at all. >>> >>> But in all other cases we need to do clean CPU caches manually, or >>> otherwise CPU can overwrite DT and ITT entries. From user perspective >>> this looks like interrupts are not delivered from a device. >>> >>> Also, we will rename HOST_ITS_FLUSH_CMD_QUEUE flag to >>> HOST_ITS_FLUSH_BUFFERS because now this flag controls not only command >>> queue. >> >> Reading the specification, CBASER will indicate the cacheability for the >> command queue. But I couldn't find any reference saying this will apply >> to the ITT as well. >> >> If such reference doesn't exist then... >> >>> >>> Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx> >>> --- >>> xen/arch/arm/gic-v3-its.c | 7 +++++-- >>> xen/arch/arm/include/asm/gic_v3_its.h | 2 +- >>> 2 files changed, 6 insertions(+), 3 deletions(-) >>> >>> diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c >>> index 72cf318810..63e28a7706 100644 >>> --- a/xen/arch/arm/gic-v3-its.c >>> +++ b/xen/arch/arm/gic-v3-its.c >>> @@ -107,7 +107,7 @@ static int its_send_command(struct host_its >>> *hw_its, const void *its_cmd) >>> } >>> memcpy(hw_its->cmd_buf + writep, its_cmd, ITS_CMD_SIZE); >>> - if ( hw_its->flags & HOST_ITS_FLUSH_CMD_QUEUE ) >>> + if ( hw_its->flags & HOST_ITS_FLUSH_BUFFERS ) >>> clean_dcache_va_range(hw_its->cmd_buf + writep, ITS_CMD_SIZE); >>> else >>> dsb(ishst); >>> @@ -335,7 +335,7 @@ static void *its_map_cbaser(struct host_its *its) >>> */ >>> if ( !(reg & GITS_BASER_INNER_CACHEABILITY_MASK) ) >>> { >>> - its->flags |= HOST_ITS_FLUSH_CMD_QUEUE; >>> + its->flags |= HOST_ITS_FLUSH_BUFFERS; >>> printk(XENLOG_WARNING "using non-cacheable ITS command >>> queue\n"); >>> } >>> @@ -699,6 +699,9 @@ int gicv3_its_map_guest_device(struct domain *d, >>> if ( !itt_addr ) >>> goto out_unlock; >>> + if ( hw_its->flags & HOST_ITS_FLUSH_BUFFERS ) >>> + clean_dcache_va_range(itt_addr, nr_events * hw_its->itte_size); >> >> ... I think we need to have this flush unconditional like Linux does. > > I forgot to mention that this likely want to be a > clean_dcache_and_invalidate_va_range() (see my comment in patch #2). I turned it into an unconditional clean_and_invalidate_dcache_va_range() and did a quick test, and it still fixes my test case on VCK190. So feel free to add: Tested-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |