Commit f2302023 authored by Paul Burton's avatar Paul Burton Committed by Ralf Baechle

MIPS: Sanitise coherentio semantics

The coherentio variable has previously been used as a boolean value,
indicating whether the user specified that coherent I/O should be
enabled or disabled. It failed to take into account the case where the
user does not specify any preference, in which case it makes sense that
we should default to coherent I/O if the hardware supports it
(hw_coherentio is non-zero).

Introduce an enum to clarify the 3 different values of coherentio & use
it throughout the code, modifying plat_device_is_coherent() &
r4k_cache_init() to take into account the default case.
Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: Paul Burton <paul.burton@imgtec.com>
Patchwork: https://patchwork.linux-mips.org/patch/14347/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 87dd9a4d
...@@ -48,17 +48,17 @@ void __init plat_mem_setup(void) ...@@ -48,17 +48,17 @@ void __init plat_mem_setup(void)
clear_c0_config(1 << 19); /* Clear Config[OD] */ clear_c0_config(1 << 19); /* Clear Config[OD] */
hw_coherentio = 0; hw_coherentio = 0;
coherentio = 1; coherentio = IO_COHERENCE_ENABLED;
switch (alchemy_get_cputype()) { switch (alchemy_get_cputype()) {
case ALCHEMY_CPU_AU1000: case ALCHEMY_CPU_AU1000:
case ALCHEMY_CPU_AU1500: case ALCHEMY_CPU_AU1500:
case ALCHEMY_CPU_AU1100: case ALCHEMY_CPU_AU1100:
coherentio = 0; coherentio = IO_COHERENCE_DISABLED;
break; break;
case ALCHEMY_CPU_AU1200: case ALCHEMY_CPU_AU1200:
/* Au1200 AB USB does not support coherent memory */ /* Au1200 AB USB does not support coherent memory */
if (0 == (read_c0_prid() & PRID_REV_MASK)) if (0 == (read_c0_prid() & PRID_REV_MASK))
coherentio = 0; coherentio = IO_COHERENCE_DISABLED;
break; break;
} }
......
...@@ -9,14 +9,20 @@ ...@@ -9,14 +9,20 @@
#ifndef __ASM_DMA_COHERENCE_H #ifndef __ASM_DMA_COHERENCE_H
#define __ASM_DMA_COHERENCE_H #define __ASM_DMA_COHERENCE_H
enum coherent_io_user_state {
IO_COHERENCE_DEFAULT,
IO_COHERENCE_ENABLED,
IO_COHERENCE_DISABLED,
};
#ifdef CONFIG_DMA_MAYBE_COHERENT #ifdef CONFIG_DMA_MAYBE_COHERENT
extern int coherentio; extern enum coherent_io_user_state coherentio;
extern int hw_coherentio; extern int hw_coherentio;
#else #else
#ifdef CONFIG_DMA_COHERENT #ifdef CONFIG_DMA_COHERENT
#define coherentio 1 #define coherentio IO_COHERENCE_ENABLED
#else #else
#define coherentio 0 #define coherentio IO_COHERENCE_DISABLED
#endif #endif
#define hw_coherentio 0 #define hw_coherentio 0
#endif /* CONFIG_DMA_MAYBE_COHERENT */ #endif /* CONFIG_DMA_MAYBE_COHERENT */
......
...@@ -49,7 +49,15 @@ static inline int plat_dma_supported(struct device *dev, u64 mask) ...@@ -49,7 +49,15 @@ static inline int plat_dma_supported(struct device *dev, u64 mask)
static inline int plat_device_is_coherent(struct device *dev) static inline int plat_device_is_coherent(struct device *dev)
{ {
return coherentio; switch (coherentio) {
default:
case IO_COHERENCE_DEFAULT:
return hw_coherentio;
case IO_COHERENCE_ENABLED:
return 1;
case IO_COHERENCE_DISABLED:
return 0;
}
} }
#ifndef plat_post_dma_flush #ifndef plat_post_dma_flush
......
...@@ -1935,7 +1935,8 @@ void r4k_cache_init(void) ...@@ -1935,7 +1935,8 @@ void r4k_cache_init(void)
__local_flush_icache_user_range = local_r4k_flush_icache_user_range; __local_flush_icache_user_range = local_r4k_flush_icache_user_range;
#if defined(CONFIG_DMA_NONCOHERENT) || defined(CONFIG_DMA_MAYBE_COHERENT) #if defined(CONFIG_DMA_NONCOHERENT) || defined(CONFIG_DMA_MAYBE_COHERENT)
if (coherentio) { if ((coherentio == IO_COHERENCE_ENABLED) ||
((coherentio == IO_COHERENCE_DEFAULT) && hw_coherentio)) {
_dma_cache_wback_inv = (void *)cache_noop; _dma_cache_wback_inv = (void *)cache_noop;
_dma_cache_wback = (void *)cache_noop; _dma_cache_wback = (void *)cache_noop;
_dma_cache_inv = (void *)cache_noop; _dma_cache_inv = (void *)cache_noop;
......
...@@ -25,13 +25,14 @@ ...@@ -25,13 +25,14 @@
#include <dma-coherence.h> #include <dma-coherence.h>
#ifdef CONFIG_DMA_MAYBE_COHERENT #ifdef CONFIG_DMA_MAYBE_COHERENT
int coherentio = 0; /* User defined DMA coherency from command line. */ /* User defined DMA coherency from command line. */
enum coherent_io_user_state coherentio = IO_COHERENCE_DEFAULT;
EXPORT_SYMBOL_GPL(coherentio); EXPORT_SYMBOL_GPL(coherentio);
int hw_coherentio = 0; /* Actual hardware supported DMA coherency setting. */ int hw_coherentio = 0; /* Actual hardware supported DMA coherency setting. */
static int __init setcoherentio(char *str) static int __init setcoherentio(char *str)
{ {
coherentio = 1; coherentio = IO_COHERENCE_ENABLED;
pr_info("Hardware DMA cache coherency (command line)\n"); pr_info("Hardware DMA cache coherency (command line)\n");
return 0; return 0;
} }
...@@ -39,7 +40,7 @@ early_param("coherentio", setcoherentio); ...@@ -39,7 +40,7 @@ early_param("coherentio", setcoherentio);
static int __init setnocoherentio(char *str) static int __init setnocoherentio(char *str)
{ {
coherentio = 0; coherentio = IO_COHERENCE_DISABLED;
pr_info("Software DMA cache coherency (command line)\n"); pr_info("Software DMA cache coherency (command line)\n");
return 0; return 0;
} }
......
...@@ -154,12 +154,12 @@ static void __init plat_setup_iocoherency(void) ...@@ -154,12 +154,12 @@ static void __init plat_setup_iocoherency(void)
* coherency instead. * coherency instead.
*/ */
if (plat_enable_iocoherency()) { if (plat_enable_iocoherency()) {
if (coherentio == 0) if (coherentio == IO_COHERENCE_DISABLED)
pr_info("Hardware DMA cache coherency disabled\n"); pr_info("Hardware DMA cache coherency disabled\n");
else else
pr_info("Hardware DMA cache coherency enabled\n"); pr_info("Hardware DMA cache coherency enabled\n");
} else { } else {
if (coherentio == 1) if (coherentio == IO_COHERENCE_ENABLED)
pr_info("Hardware DMA cache coherency unsupported, but enabled from command line!\n"); pr_info("Hardware DMA cache coherency unsupported, but enabled from command line!\n");
else else
pr_info("Software DMA cache coherency enabled\n"); pr_info("Software DMA cache coherency enabled\n");
......
...@@ -429,7 +429,8 @@ static int alchemy_pci_probe(struct platform_device *pdev) ...@@ -429,7 +429,8 @@ static int alchemy_pci_probe(struct platform_device *pdev)
/* Au1500 revisions older than AD have borked coherent PCI */ /* Au1500 revisions older than AD have borked coherent PCI */
if ((alchemy_get_cputype() == ALCHEMY_CPU_AU1500) && if ((alchemy_get_cputype() == ALCHEMY_CPU_AU1500) &&
(read_c0_prid() < 0x01030202) && !coherentio) { (read_c0_prid() < 0x01030202) &&
(coherentio == IO_COHERENCE_DISABLED)) {
val = __raw_readl(ctx->regs + PCI_REG_CONFIG); val = __raw_readl(ctx->regs + PCI_REG_CONFIG);
val |= PCI_CONFIG_NC; val |= PCI_CONFIG_NC;
__raw_writel(val, ctx->regs + PCI_REG_CONFIG); __raw_writel(val, ctx->regs + PCI_REG_CONFIG);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment