Commit af5abf1b authored by Vineet Gupta's avatar Vineet Gupta

ARC: help gcc elide icache helper for !SMP

Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent 1b1a22b1
...@@ -396,8 +396,16 @@ static inline void __dc_line_op(unsigned long paddr, unsigned long vaddr, ...@@ -396,8 +396,16 @@ static inline void __dc_line_op(unsigned long paddr, unsigned long vaddr,
/*********************************************************** /***********************************************************
* Machine specific helper for per line I-Cache invalidate. * Machine specific helper for per line I-Cache invalidate.
*/ */
static void __ic_line_inv_vaddr_local(unsigned long paddr, unsigned long vaddr,
unsigned long sz) static inline void __ic_entire_inv(void)
{
write_aux_reg(ARC_REG_IC_IVIC, 1);
read_aux_reg(ARC_REG_IC_CTRL); /* blocks */
}
static inline void
__ic_line_inv_vaddr_local(unsigned long paddr, unsigned long vaddr,
unsigned long sz)
{ {
unsigned long flags; unsigned long flags;
...@@ -406,30 +414,39 @@ static void __ic_line_inv_vaddr_local(unsigned long paddr, unsigned long vaddr, ...@@ -406,30 +414,39 @@ static void __ic_line_inv_vaddr_local(unsigned long paddr, unsigned long vaddr,
local_irq_restore(flags); local_irq_restore(flags);
} }
static inline void __ic_entire_inv(void) #ifndef CONFIG_SMP
{
write_aux_reg(ARC_REG_IC_IVIC, 1); #define __ic_line_inv_vaddr(p, v, s) __ic_line_inv_vaddr_local(p, v, s)
read_aux_reg(ARC_REG_IC_CTRL); /* blocks */
} #else
struct ic_line_inv_vaddr_ipi { struct ic_inv_args {
unsigned long paddr, vaddr; unsigned long paddr, vaddr;
int sz; int sz;
}; };
static void __ic_line_inv_vaddr_helper(void *info) static void __ic_line_inv_vaddr_helper(void *info)
{ {
struct ic_line_inv_vaddr_ipi *ic_inv = (struct ic_line_inv_vaddr_ipi*) info; struct ic_inv *ic_inv_args = (struct ic_inv_args *) info;
__ic_line_inv_vaddr_local(ic_inv->paddr, ic_inv->vaddr, ic_inv->sz); __ic_line_inv_vaddr_local(ic_inv->paddr, ic_inv->vaddr, ic_inv->sz);
} }
static void __ic_line_inv_vaddr(unsigned long paddr, unsigned long vaddr, static void __ic_line_inv_vaddr(unsigned long paddr, unsigned long vaddr,
unsigned long sz) unsigned long sz)
{ {
struct ic_line_inv_vaddr_ipi ic_inv = { paddr, vaddr , sz}; struct ic_inv_args ic_inv = {
.paddr = paddr,
.vaddr = vaddr,
.sz = sz
};
on_each_cpu(__ic_line_inv_vaddr_helper, &ic_inv, 1); on_each_cpu(__ic_line_inv_vaddr_helper, &ic_inv, 1);
} }
#else
#endif /* CONFIG_SMP */
#else /* !CONFIG_ARC_HAS_ICACHE */
#define __ic_entire_inv() #define __ic_entire_inv()
#define __ic_line_inv_vaddr(pstart, vstart, sz) #define __ic_line_inv_vaddr(pstart, vstart, sz)
......
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