mirror of https://gitee.com/openkylin/linux.git
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS fixes from Ralf Baechle: "Another round of fixes: - CM: Fix mips_cm_max_vp_width for non-MT kernels on MT systems - CPS: Avoid BUG() when offlining pre-r6 CPUs - DEC: Avoid gas warnings due to suspicious instruction scheduling by manually expanding assembler macros. - FTLB: Fix configuration by moving confiuguratoin after probing - FTLB: clear execution hazard after changing FTLB enable - Highmem: Fix detection of unsupported highmem with cache aliases - I6400: Don't touch FTLBP chicken bits - microMIPS: Fix BUILD_ROLLBACK_PROLOGUE - Malta: Fix IOCU disable switch read for MIPS64 - Octeon: Fix probing of devices attached to GPIO lines - uprobes: Misc small fixes" * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: MIPS: CM: Fix mips_cm_max_vp_width for non-MT kernels on MT systems MIPS: Fix detection of unsupported highmem with cache aliases MIPS: Malta: Fix IOCU disable switch read for MIPS64 MIPS: Fix BUILD_ROLLBACK_PROLOGUE for microMIPS MIPS: clear execution hazard after changing FTLB enable MIPS: Configure FTLB after probing TLB sizes from config4 MIPS: Stop setting I6400 FTLBP MIPS: DEC: Avoid la pseudo-instruction in delay slots MIPS: Octeon: mark GPIO controller node not populated after IRQ init. MIPS: uprobes: fix use of uninitialised variable MIPS: uprobes: remove incorrect set_orig_insn MIPS: fix uretprobe implementation MIPS: smp-cps: Avoid BUG() when offlining pre-r6 CPUs
This commit is contained in:
commit
66188fb11a
|
@ -1619,6 +1619,12 @@ static int __init octeon_irq_init_gpio(
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear the OF_POPULATED flag that was set by of_irq_init()
|
||||||
|
* so that all GPIO devices will be probed.
|
||||||
|
*/
|
||||||
|
of_node_clear_flag(gpio_node, OF_POPULATED);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -146,7 +146,25 @@
|
||||||
/*
|
/*
|
||||||
* Find irq with highest priority
|
* Find irq with highest priority
|
||||||
*/
|
*/
|
||||||
PTR_LA t1,cpu_mask_nr_tbl
|
# open coded PTR_LA t1, cpu_mask_nr_tbl
|
||||||
|
#if (_MIPS_SZPTR == 32)
|
||||||
|
# open coded la t1, cpu_mask_nr_tbl
|
||||||
|
lui t1, %hi(cpu_mask_nr_tbl)
|
||||||
|
addiu t1, %lo(cpu_mask_nr_tbl)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if (_MIPS_SZPTR == 64)
|
||||||
|
# open coded dla t1, cpu_mask_nr_tbl
|
||||||
|
.set push
|
||||||
|
.set noat
|
||||||
|
lui t1, %highest(cpu_mask_nr_tbl)
|
||||||
|
lui AT, %hi(cpu_mask_nr_tbl)
|
||||||
|
daddiu t1, t1, %higher(cpu_mask_nr_tbl)
|
||||||
|
daddiu AT, AT, %lo(cpu_mask_nr_tbl)
|
||||||
|
dsll t1, 32
|
||||||
|
daddu t1, t1, AT
|
||||||
|
.set pop
|
||||||
|
#endif
|
||||||
1: lw t2,(t1)
|
1: lw t2,(t1)
|
||||||
nop
|
nop
|
||||||
and t2,t0
|
and t2,t0
|
||||||
|
@ -195,7 +213,25 @@
|
||||||
/*
|
/*
|
||||||
* Find irq with highest priority
|
* Find irq with highest priority
|
||||||
*/
|
*/
|
||||||
PTR_LA t1,asic_mask_nr_tbl
|
# open coded PTR_LA t1,asic_mask_nr_tbl
|
||||||
|
#if (_MIPS_SZPTR == 32)
|
||||||
|
# open coded la t1, asic_mask_nr_tbl
|
||||||
|
lui t1, %hi(asic_mask_nr_tbl)
|
||||||
|
addiu t1, %lo(asic_mask_nr_tbl)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if (_MIPS_SZPTR == 64)
|
||||||
|
# open coded dla t1, asic_mask_nr_tbl
|
||||||
|
.set push
|
||||||
|
.set noat
|
||||||
|
lui t1, %highest(asic_mask_nr_tbl)
|
||||||
|
lui AT, %hi(asic_mask_nr_tbl)
|
||||||
|
daddiu t1, t1, %higher(asic_mask_nr_tbl)
|
||||||
|
daddiu AT, AT, %lo(asic_mask_nr_tbl)
|
||||||
|
dsll t1, 32
|
||||||
|
daddu t1, t1, AT
|
||||||
|
.set pop
|
||||||
|
#endif
|
||||||
2: lw t2,(t1)
|
2: lw t2,(t1)
|
||||||
nop
|
nop
|
||||||
and t2,t0
|
and t2,t0
|
||||||
|
|
|
@ -458,10 +458,21 @@ static inline int mips_cm_revision(void)
|
||||||
static inline unsigned int mips_cm_max_vp_width(void)
|
static inline unsigned int mips_cm_max_vp_width(void)
|
||||||
{
|
{
|
||||||
extern int smp_num_siblings;
|
extern int smp_num_siblings;
|
||||||
|
uint32_t cfg;
|
||||||
|
|
||||||
if (mips_cm_revision() >= CM_REV_CM3)
|
if (mips_cm_revision() >= CM_REV_CM3)
|
||||||
return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW_MSK;
|
return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW_MSK;
|
||||||
|
|
||||||
|
if (mips_cm_present()) {
|
||||||
|
/*
|
||||||
|
* We presume that all cores in the system will have the same
|
||||||
|
* number of VP(E)s, and if that ever changes then this will
|
||||||
|
* need revisiting.
|
||||||
|
*/
|
||||||
|
cfg = read_gcr_cl_config() & CM_GCR_Cx_CONFIG_PVPE_MSK;
|
||||||
|
return (cfg >> CM_GCR_Cx_CONFIG_PVPE_SHF) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_SMP))
|
if (IS_ENABLED(CONFIG_SMP))
|
||||||
return smp_num_siblings;
|
return smp_num_siblings;
|
||||||
|
|
||||||
|
|
|
@ -660,8 +660,6 @@
|
||||||
|
|
||||||
#define MIPS_CONF7_IAR (_ULCAST_(1) << 10)
|
#define MIPS_CONF7_IAR (_ULCAST_(1) << 10)
|
||||||
#define MIPS_CONF7_AR (_ULCAST_(1) << 16)
|
#define MIPS_CONF7_AR (_ULCAST_(1) << 16)
|
||||||
/* FTLB probability bits for R6 */
|
|
||||||
#define MIPS_CONF7_FTLBP_SHIFT (18)
|
|
||||||
|
|
||||||
/* WatchLo* register definitions */
|
/* WatchLo* register definitions */
|
||||||
#define MIPS_WATCHLO_IRW (_ULCAST_(0x7) << 0)
|
#define MIPS_WATCHLO_IRW (_ULCAST_(0x7) << 0)
|
||||||
|
|
|
@ -36,7 +36,6 @@ struct arch_uprobe {
|
||||||
unsigned long resume_epc;
|
unsigned long resume_epc;
|
||||||
u32 insn[2];
|
u32 insn[2];
|
||||||
u32 ixol[2];
|
u32 ixol[2];
|
||||||
union mips_instruction orig_inst[MAX_UINSN_BYTES / 4];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct arch_uprobe_task {
|
struct arch_uprobe_task {
|
||||||
|
|
|
@ -352,7 +352,12 @@ __setup("nohtw", htw_disable);
|
||||||
static int mips_ftlb_disabled;
|
static int mips_ftlb_disabled;
|
||||||
static int mips_has_ftlb_configured;
|
static int mips_has_ftlb_configured;
|
||||||
|
|
||||||
static int set_ftlb_enable(struct cpuinfo_mips *c, int enable);
|
enum ftlb_flags {
|
||||||
|
FTLB_EN = 1 << 0,
|
||||||
|
FTLB_SET_PROB = 1 << 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags);
|
||||||
|
|
||||||
static int __init ftlb_disable(char *s)
|
static int __init ftlb_disable(char *s)
|
||||||
{
|
{
|
||||||
|
@ -371,8 +376,6 @@ static int __init ftlb_disable(char *s)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
back_to_back_c0_hazard();
|
|
||||||
|
|
||||||
config4 = read_c0_config4();
|
config4 = read_c0_config4();
|
||||||
|
|
||||||
/* Check that FTLB has been disabled */
|
/* Check that FTLB has been disabled */
|
||||||
|
@ -531,7 +534,7 @@ static unsigned int calculate_ftlb_probability(struct cpuinfo_mips *c)
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_ftlb_enable(struct cpuinfo_mips *c, int enable)
|
static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags)
|
||||||
{
|
{
|
||||||
unsigned int config;
|
unsigned int config;
|
||||||
|
|
||||||
|
@ -542,33 +545,33 @@ static int set_ftlb_enable(struct cpuinfo_mips *c, int enable)
|
||||||
case CPU_P6600:
|
case CPU_P6600:
|
||||||
/* proAptiv & related cores use Config6 to enable the FTLB */
|
/* proAptiv & related cores use Config6 to enable the FTLB */
|
||||||
config = read_c0_config6();
|
config = read_c0_config6();
|
||||||
/* Clear the old probability value */
|
|
||||||
config &= ~(3 << MIPS_CONF6_FTLBP_SHIFT);
|
if (flags & FTLB_EN)
|
||||||
if (enable)
|
config |= MIPS_CONF6_FTLBEN;
|
||||||
/* Enable FTLB */
|
|
||||||
write_c0_config6(config |
|
|
||||||
(calculate_ftlb_probability(c)
|
|
||||||
<< MIPS_CONF6_FTLBP_SHIFT)
|
|
||||||
| MIPS_CONF6_FTLBEN);
|
|
||||||
else
|
else
|
||||||
/* Disable FTLB */
|
config &= ~MIPS_CONF6_FTLBEN;
|
||||||
write_c0_config6(config & ~MIPS_CONF6_FTLBEN);
|
|
||||||
|
if (flags & FTLB_SET_PROB) {
|
||||||
|
config &= ~(3 << MIPS_CONF6_FTLBP_SHIFT);
|
||||||
|
config |= calculate_ftlb_probability(c)
|
||||||
|
<< MIPS_CONF6_FTLBP_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
write_c0_config6(config);
|
||||||
|
back_to_back_c0_hazard();
|
||||||
break;
|
break;
|
||||||
case CPU_I6400:
|
case CPU_I6400:
|
||||||
/* I6400 & related cores use Config7 to configure FTLB */
|
/* There's no way to disable the FTLB */
|
||||||
config = read_c0_config7();
|
if (!(flags & FTLB_EN))
|
||||||
/* Clear the old probability value */
|
return 1;
|
||||||
config &= ~(3 << MIPS_CONF7_FTLBP_SHIFT);
|
return 0;
|
||||||
write_c0_config7(config | (calculate_ftlb_probability(c)
|
|
||||||
<< MIPS_CONF7_FTLBP_SHIFT));
|
|
||||||
break;
|
|
||||||
case CPU_LOONGSON3:
|
case CPU_LOONGSON3:
|
||||||
/* Flush ITLB, DTLB, VTLB and FTLB */
|
/* Flush ITLB, DTLB, VTLB and FTLB */
|
||||||
write_c0_diag(LOONGSON_DIAG_ITLB | LOONGSON_DIAG_DTLB |
|
write_c0_diag(LOONGSON_DIAG_ITLB | LOONGSON_DIAG_DTLB |
|
||||||
LOONGSON_DIAG_VTLB | LOONGSON_DIAG_FTLB);
|
LOONGSON_DIAG_VTLB | LOONGSON_DIAG_FTLB);
|
||||||
/* Loongson-3 cores use Config6 to enable the FTLB */
|
/* Loongson-3 cores use Config6 to enable the FTLB */
|
||||||
config = read_c0_config6();
|
config = read_c0_config6();
|
||||||
if (enable)
|
if (flags & FTLB_EN)
|
||||||
/* Enable FTLB */
|
/* Enable FTLB */
|
||||||
write_c0_config6(config & ~MIPS_CONF6_FTLBDIS);
|
write_c0_config6(config & ~MIPS_CONF6_FTLBDIS);
|
||||||
else
|
else
|
||||||
|
@ -788,6 +791,7 @@ static inline unsigned int decode_config4(struct cpuinfo_mips *c)
|
||||||
PAGE_SIZE, config4);
|
PAGE_SIZE, config4);
|
||||||
/* Switch FTLB off */
|
/* Switch FTLB off */
|
||||||
set_ftlb_enable(c, 0);
|
set_ftlb_enable(c, 0);
|
||||||
|
mips_ftlb_disabled = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c->tlbsizeftlbsets = 1 <<
|
c->tlbsizeftlbsets = 1 <<
|
||||||
|
@ -852,7 +856,7 @@ static void decode_configs(struct cpuinfo_mips *c)
|
||||||
c->scache.flags = MIPS_CACHE_NOT_PRESENT;
|
c->scache.flags = MIPS_CACHE_NOT_PRESENT;
|
||||||
|
|
||||||
/* Enable FTLB if present and not disabled */
|
/* Enable FTLB if present and not disabled */
|
||||||
set_ftlb_enable(c, !mips_ftlb_disabled);
|
set_ftlb_enable(c, mips_ftlb_disabled ? 0 : FTLB_EN);
|
||||||
|
|
||||||
ok = decode_config0(c); /* Read Config registers. */
|
ok = decode_config0(c); /* Read Config registers. */
|
||||||
BUG_ON(!ok); /* Arch spec violation! */
|
BUG_ON(!ok); /* Arch spec violation! */
|
||||||
|
@ -902,6 +906,9 @@ static void decode_configs(struct cpuinfo_mips *c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* configure the FTLB write probability */
|
||||||
|
set_ftlb_enable(c, (mips_ftlb_disabled ? 0 : FTLB_EN) | FTLB_SET_PROB);
|
||||||
|
|
||||||
mips_probe_watch_registers(c);
|
mips_probe_watch_registers(c);
|
||||||
|
|
||||||
#ifndef CONFIG_MIPS_CPS
|
#ifndef CONFIG_MIPS_CPS
|
||||||
|
|
|
@ -142,9 +142,8 @@ LEAF(__r4k_wait)
|
||||||
PTR_LA k1, __r4k_wait
|
PTR_LA k1, __r4k_wait
|
||||||
ori k0, 0x1f /* 32 byte rollback region */
|
ori k0, 0x1f /* 32 byte rollback region */
|
||||||
xori k0, 0x1f
|
xori k0, 0x1f
|
||||||
bne k0, k1, 9f
|
bne k0, k1, \handler
|
||||||
MTC0 k0, CP0_EPC
|
MTC0 k0, CP0_EPC
|
||||||
9:
|
|
||||||
.set pop
|
.set pop
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
|
@ -764,7 +764,6 @@ static void __init arch_mem_init(char **cmdline_p)
|
||||||
device_tree_init();
|
device_tree_init();
|
||||||
sparse_init();
|
sparse_init();
|
||||||
plat_swiotlb_setup();
|
plat_swiotlb_setup();
|
||||||
paging_init();
|
|
||||||
|
|
||||||
dma_contiguous_reserve(PFN_PHYS(max_low_pfn));
|
dma_contiguous_reserve(PFN_PHYS(max_low_pfn));
|
||||||
/* Tell bootmem about cma reserved memblock section */
|
/* Tell bootmem about cma reserved memblock section */
|
||||||
|
@ -877,6 +876,7 @@ void __init setup_arch(char **cmdline_p)
|
||||||
prefill_possible_map();
|
prefill_possible_map();
|
||||||
|
|
||||||
cpu_cache_init();
|
cpu_cache_init();
|
||||||
|
paging_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long kernelsp[NR_CPUS];
|
unsigned long kernelsp[NR_CPUS];
|
||||||
|
|
|
@ -513,7 +513,7 @@ static void cps_cpu_die(unsigned int cpu)
|
||||||
* in which case the CPC will refuse to power down the core.
|
* in which case the CPC will refuse to power down the core.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
mips_cm_lock_other(core, vpe_id);
|
mips_cm_lock_other(core, 0);
|
||||||
mips_cpc_lock_other(core);
|
mips_cpc_lock_other(core);
|
||||||
stat = read_cpc_co_stat_conf();
|
stat = read_cpc_co_stat_conf();
|
||||||
stat &= CPC_Cx_STAT_CONF_SEQSTATE_MSK;
|
stat &= CPC_Cx_STAT_CONF_SEQSTATE_MSK;
|
||||||
|
|
|
@ -157,7 +157,6 @@ bool is_trap_insn(uprobe_opcode_t *insn)
|
||||||
int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs)
|
int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct uprobe_task *utask = current->utask;
|
struct uprobe_task *utask = current->utask;
|
||||||
union mips_instruction insn;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now find the EPC where to resume after the breakpoint has been
|
* Now find the EPC where to resume after the breakpoint has been
|
||||||
|
@ -168,10 +167,10 @@ int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs)
|
||||||
unsigned long epc;
|
unsigned long epc;
|
||||||
|
|
||||||
epc = regs->cp0_epc;
|
epc = regs->cp0_epc;
|
||||||
__compute_return_epc_for_insn(regs, insn);
|
__compute_return_epc_for_insn(regs,
|
||||||
|
(union mips_instruction) aup->insn[0]);
|
||||||
aup->resume_epc = regs->cp0_epc;
|
aup->resume_epc = regs->cp0_epc;
|
||||||
}
|
}
|
||||||
|
|
||||||
utask->autask.saved_trap_nr = current->thread.trap_nr;
|
utask->autask.saved_trap_nr = current->thread.trap_nr;
|
||||||
current->thread.trap_nr = UPROBE_TRAP_NR;
|
current->thread.trap_nr = UPROBE_TRAP_NR;
|
||||||
regs->cp0_epc = current->utask->xol_vaddr;
|
regs->cp0_epc = current->utask->xol_vaddr;
|
||||||
|
@ -257,7 +256,7 @@ unsigned long arch_uretprobe_hijack_return_addr(
|
||||||
ra = regs->regs[31];
|
ra = regs->regs[31];
|
||||||
|
|
||||||
/* Replace the return address with the trampoline address */
|
/* Replace the return address with the trampoline address */
|
||||||
regs->regs[31] = ra;
|
regs->regs[31] = trampoline_vaddr;
|
||||||
|
|
||||||
return ra;
|
return ra;
|
||||||
}
|
}
|
||||||
|
@ -280,24 +279,6 @@ int __weak set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm,
|
||||||
return uprobe_write_opcode(mm, vaddr, UPROBE_SWBP_INSN);
|
return uprobe_write_opcode(mm, vaddr, UPROBE_SWBP_INSN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* set_orig_insn - Restore the original instruction.
|
|
||||||
* @mm: the probed process address space.
|
|
||||||
* @auprobe: arch specific probepoint information.
|
|
||||||
* @vaddr: the virtual address to insert the opcode.
|
|
||||||
*
|
|
||||||
* For mm @mm, restore the original opcode (opcode) at @vaddr.
|
|
||||||
* Return 0 (success) or a negative errno.
|
|
||||||
*
|
|
||||||
* This overrides the weak version in kernel/events/uprobes.c.
|
|
||||||
*/
|
|
||||||
int set_orig_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,
|
|
||||||
unsigned long vaddr)
|
|
||||||
{
|
|
||||||
return uprobe_write_opcode(mm, vaddr,
|
|
||||||
*(uprobe_opcode_t *)&auprobe->orig_inst[0].word);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __weak arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,
|
void __weak arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,
|
||||||
void *src, unsigned long len)
|
void *src, unsigned long len)
|
||||||
{
|
{
|
||||||
|
|
|
@ -440,6 +440,9 @@ static inline void mem_init_free_highmem(void)
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
|
|
||||||
|
if (cpu_has_dc_aliases)
|
||||||
|
return;
|
||||||
|
|
||||||
for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) {
|
for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) {
|
||||||
struct page *page = pfn_to_page(tmp);
|
struct page *page = pfn_to_page(tmp);
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,9 @@
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ROCIT_CONFIG_GEN0 0x1f403000
|
||||||
|
#define ROCIT_CONFIG_GEN0_PCI_IOCU BIT(7)
|
||||||
|
|
||||||
extern void malta_be_init(void);
|
extern void malta_be_init(void);
|
||||||
extern int malta_be_handler(struct pt_regs *regs, int is_fixup);
|
extern int malta_be_handler(struct pt_regs *regs, int is_fixup);
|
||||||
|
|
||||||
|
@ -107,6 +110,8 @@ static void __init fd_activate(void)
|
||||||
static int __init plat_enable_iocoherency(void)
|
static int __init plat_enable_iocoherency(void)
|
||||||
{
|
{
|
||||||
int supported = 0;
|
int supported = 0;
|
||||||
|
u32 cfg;
|
||||||
|
|
||||||
if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO) {
|
if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO) {
|
||||||
if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) {
|
if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) {
|
||||||
BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN;
|
BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN;
|
||||||
|
@ -129,7 +134,8 @@ static int __init plat_enable_iocoherency(void)
|
||||||
} else if (mips_cm_numiocu() != 0) {
|
} else if (mips_cm_numiocu() != 0) {
|
||||||
/* Nothing special needs to be done to enable coherency */
|
/* Nothing special needs to be done to enable coherency */
|
||||||
pr_info("CMP IOCU detected\n");
|
pr_info("CMP IOCU detected\n");
|
||||||
if ((*(unsigned int *)0xbf403000 & 0x81) != 0x81) {
|
cfg = __raw_readl((u32 *)CKSEG1ADDR(ROCIT_CONFIG_GEN0));
|
||||||
|
if (!(cfg & ROCIT_CONFIG_GEN0_PCI_IOCU)) {
|
||||||
pr_crit("IOCU OPERATION DISABLED BY SWITCH - DEFAULTING TO SW IO COHERENCY\n");
|
pr_crit("IOCU OPERATION DISABLED BY SWITCH - DEFAULTING TO SW IO COHERENCY\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue