Re: [PATCH V2 3/4] MIPS: Loongson: Introduce and use cpu_has_coherent_cache feature

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Ralf,

Can this patch be merged? or does it have problems to be fix?

Huacai

On Wed, Oct 7, 2015 at 2:08 PM, Huacai Chen <chenhc@xxxxxxxxxx> wrote:
> Loongson-3 maintains cache coherency by hardware. So we introduce a cpu
> feature named cpu_has_coherent_cache and use it to modify MIPS's cache
> flushing functions.
>
> Signed-off-by: Huacai Chen <chenhc@xxxxxxxxxx>
> Signed-off-by: Hongliang Tao <taohl@xxxxxxxxxx>
> ---
>  arch/mips/Kconfig                                   |  3 +++
>  arch/mips/include/asm/cpu-features.h                |  3 +++
>  .../asm/mach-loongson64/cpu-feature-overrides.h     |  1 +
>  arch/mips/mm/c-r4k.c                                | 21 +++++++++++++++++++++
>  4 files changed, 28 insertions(+)
>
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 9322d26..3a8b7e5 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -1769,6 +1769,7 @@ config CPU_BMIPS5000
>  config SYS_HAS_CPU_LOONGSON3
>         bool
>         select CPU_SUPPORTS_CPUFREQ
> +       select CPU_SUPPORTS_COHERENT_CACHE
>
>  config SYS_HAS_CPU_LOONGSON2E
>         bool
> @@ -1950,6 +1951,8 @@ config CPU_SUPPORTS_HUGEPAGES
>         bool
>  config CPU_SUPPORTS_UNCACHED_ACCELERATED
>         bool
> +config CPU_SUPPORTS_COHERENT_CACHE
> +       bool
>  config MIPS_PGD_C0_CONTEXT
>         bool
>         default y if 64BIT && CPU_MIPSR2 && !CPU_XLP
> diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h
> index d1e04c9..565940e 100644
> --- a/arch/mips/include/asm/cpu-features.h
> +++ b/arch/mips/include/asm/cpu-features.h
> @@ -157,6 +157,9 @@
>  #ifndef cpu_has_pindexed_dcache
>  #define cpu_has_pindexed_dcache        (cpu_data[0].dcache.flags & MIPS_CACHE_PINDEX)
>  #endif
> +#ifndef cpu_has_coherent_cache
> +#define cpu_has_coherent_cache 0
> +#endif
>  #ifndef cpu_has_local_ebase
>  #define cpu_has_local_ebase    1
>  #endif
> diff --git a/arch/mips/include/asm/mach-loongson64/cpu-feature-overrides.h b/arch/mips/include/asm/mach-loongson64/cpu-feature-overrides.h
> index 98963c2..e0bef38 100644
> --- a/arch/mips/include/asm/mach-loongson64/cpu-feature-overrides.h
> +++ b/arch/mips/include/asm/mach-loongson64/cpu-feature-overrides.h
> @@ -57,5 +57,6 @@
>  #define cpu_has_local_ebase    0
>
>  #define cpu_has_wsbh           IS_ENABLED(CONFIG_CPU_LOONGSON3)
> +#define cpu_has_coherent_cache IS_ENABLED(CONFIG_CPU_SUPPORTS_COHERENT_CACHE)
>
>  #endif /* __ASM_MACH_LOONGSON64_CPU_FEATURE_OVERRIDES_H */
> diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
> index 5d3a25e..ed6e36e 100644
> --- a/arch/mips/mm/c-r4k.c
> +++ b/arch/mips/mm/c-r4k.c
> @@ -428,6 +428,9 @@ static void r4k_blast_scache_setup(void)
>
>  static inline void local_r4k___flush_cache_all(void * args)
>  {
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         switch (current_cpu_type()) {
>         case CPU_LOONGSON2:
>         case CPU_LOONGSON3:
> @@ -456,6 +459,9 @@ static inline void local_r4k___flush_cache_all(void * args)
>
>  static void r4k___flush_cache_all(void)
>  {
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         r4k_on_each_cpu(local_r4k___flush_cache_all, NULL);
>  }
>
> @@ -502,6 +508,9 @@ static void r4k_flush_cache_range(struct vm_area_struct *vma,
>  {
>         int exec = vma->vm_flags & VM_EXEC;
>
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         if (cpu_has_dc_aliases || (exec && !cpu_has_ic_fills_f_dc))
>                 r4k_on_each_cpu(local_r4k_flush_cache_range, vma);
>  }
> @@ -625,6 +634,9 @@ static void r4k_flush_cache_page(struct vm_area_struct *vma,
>  {
>         struct flush_cache_page_args args;
>
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         args.vma = vma;
>         args.addr = addr;
>         args.pfn = pfn;
> @@ -634,11 +646,17 @@ static void r4k_flush_cache_page(struct vm_area_struct *vma,
>
>  static inline void local_r4k_flush_data_cache_page(void * addr)
>  {
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         r4k_blast_dcache_page((unsigned long) addr);
>  }
>
>  static void r4k_flush_data_cache_page(unsigned long addr)
>  {
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         if (in_atomic())
>                 local_r4k_flush_data_cache_page((void *)addr);
>         else
> @@ -823,6 +841,9 @@ static void local_r4k_flush_cache_sigtramp(void * arg)
>
>  static void r4k_flush_cache_sigtramp(unsigned long addr)
>  {
> +       if (cpu_has_coherent_cache)
> +               return;
> +
>         r4k_on_each_cpu(local_r4k_flush_cache_sigtramp, (void *) addr);
>  }
>
> --
> 2.4.6
>
>
>
>
>




[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux