* Re: [PATCH] MIPS: Workaround bugged BCM4704 & BCM5354 that crash with kmap_coherent()
[not found] <20190207155200.16880-1-zajec5@gmail.com>
@ 2019-02-07 19:42 ` Paul Burton
0 siblings, 0 replies; only message in thread
From: Paul Burton @ 2019-02-07 19:42 UTC (permalink / raw)
To: Rafał Miłecki
Cc: Ralf Baechle, James Hogan, Hauke Mehrtens, Matt Redfearn,
Michal Hocko, Andrew Morton, Mike Rapoport, Alexandre Belloni,
Pravin Shedge, linux-mips, Rafał Miłecki, linux-mips
Hi Rafał,
On Thu, Feb 07, 2019 at 04:52:00PM +0100, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
>
> This workarounds what seems to be a hardware bug present in some early
> Broadcom MIPS CPUs. For some reason using kmap_coherent() for copying a
> memory causes a "Data bus error" or SoC reboot.
>
>%
>
> diff --git a/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h b/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
> index b23ff47ea475..553505dea60b 100644
> --- a/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
> +++ b/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
> @@ -80,4 +80,12 @@
> #define cpu_scache_line_size() 0
> #define cpu_has_vz 0
>
> +/*
> + * Workaround for the bugged BCM4704 & BCM5354:
> + * copy_from_user_page() + kmap_coherent() causes "Data bus error"
> + * copy_to_user_page() + kmap_coherent() causes immediate reboot
> + */
> +#define cpu_has_kmap_coherent (cpu_data[0].processor_id != 0x29006 && \
> + cpu_data[0].processor_id != 0x29029)
> +
> #endif /* __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H */
> diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
> index c3b45e248806..67007bf15543 100644
> --- a/arch/mips/mm/init.c
> +++ b/arch/mips/mm/init.c
> @@ -174,7 +174,7 @@ void copy_user_highpage(struct page *to, struct page *from,
> void *vfrom, *vto;
>
> vto = kmap_atomic(to);
> - if (cpu_has_dc_aliases &&
> + if (cpu_has_kmap_coherent && cpu_has_dc_aliases &&
> page_mapcount(from) && !Page_dcache_dirty(from)) {
> vfrom = kmap_coherent(from, vaddr);
> copy_page(vto, vfrom);
Won't this introduce cache aliasing problems?
The reason for using kmap_coherent at all is to ensure we use a mapping
with the same cache colouring as the user's mapping. If the CPU suffers
from dcache aliasing & we don't do that colouring then it seems like
this might lead to us reading/copying stale data?
Thanks,
Paul
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2019-02-07 19:42 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20190207155200.16880-1-zajec5@gmail.com>
2019-02-07 19:42 ` [PATCH] MIPS: Workaround bugged BCM4704 & BCM5354 that crash with kmap_coherent() Paul Burton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).