--- zzzz-none-000/linux-3.10.107/arch/mips/mti-malta/malta-setup.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/arch/mips/mti-malta/malta-setup.c 2021-11-10 11:53:54.000000000 +0000 @@ -157,13 +157,17 @@ if (plat_enable_iocoherency()) { if (coherentio == 0) pr_info("Hardware DMA cache coherency disabled\n"); - else + else { + coherentio = 1; pr_info("Hardware DMA cache coherency enabled\n"); + } } else { if (coherentio == 1) pr_info("Hardware DMA cache coherency unsupported, but enabled from command line!\n"); - else + else { + coherentio = 0; pr_info("Software DMA cache coherency enabled\n"); + } } #else if (!plat_enable_iocoherency()) @@ -249,10 +253,143 @@ #endif } +#ifdef CONFIG_EVA +extern unsigned int mips_cca; + +void __init plat_eva_setup(void) +{ + unsigned int val; + +#ifdef CONFIG_EVA_OLD_MALTA_MAP + +#ifdef CONFIG_EVA_3GB + val = ((MIPS_SEGCFG_UK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (2 << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + write_c0_segctl0(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); +#else /* !CONFIG_EVA_3G */ + val = ((MIPS_SEGCFG_MK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + write_c0_segctl0(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (2 << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); +#endif /* CONFIG_EVA_3G */ +#ifdef CONFIG_SMP + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); +#else + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (4 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); +#endif + write_c0_segctl1(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (6 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (4 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + +#else /* !CONFIG_EVA_OLD_MALTA_MAP */ + +#ifdef CONFIG_EVA_3GB + val = ((MIPS_SEGCFG_UK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (2 << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + write_c0_segctl0(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (6 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (5 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + write_c0_segctl1(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (3 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (1 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); +#else /* !CONFIG_EVA_3G */ + val = ((MIPS_SEGCFG_MK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + write_c0_segctl0(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (2 << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); + write_c0_segctl1(val); + + val = ((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (2 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)); + val |= (((MIPS_SEGCFG_MUSUK << MIPS_SEGCFG_AM_SHIFT) | + (0 << MIPS_SEGCFG_PA_SHIFT) | (mips_cca << MIPS_SEGCFG_C_SHIFT) | + (1 << MIPS_SEGCFG_EU_SHIFT)) << 16); +#endif /* CONFIG_EVA_3G */ + +#endif /* CONFIG_EVA_OLD_MALTA_MAP */ + + write_c0_segctl2(val); + back_to_back_c0_hazard(); + + val = read_c0_config5(); + write_c0_config5(val|MIPS_CONF5_K|MIPS_CONF5_CV); + back_to_back_c0_hazard(); + + printk("Enhanced Virtual Addressing (EVA) active\n"); +} + +extern int gcmp_present; +void BEV_overlay_segment(void); +#endif + void __init plat_mem_setup(void) { unsigned int i; +#ifdef CONFIG_EVA +#ifdef CONFIG_MIPS_CMP + if (gcmp_present) + BEV_overlay_segment(); +#endif + + if ((cpu_has_segments) && (cpu_has_eva)) + plat_eva_setup(); + else { + printk("cpu_has_segments=%ld cpu_has_eva=%ld\n",cpu_has_segments,cpu_has_eva); + printk("Kernel is built for EVA support but EVA or segment control registers are not found\n"); + panic("EVA absent"); + } +#endif + mips_pcibios_init(); /* Request I/O space for devices used on the Malta board. */