| /* |
| * Copyright (C) 2008 Imagination Technologies |
| */ |
| #ifndef __METAG_HWTHREAD_H |
| #define __METAG_HWTHREAD_H |
| |
| #include <linux/bug.h> |
| #include <linux/io.h> |
| |
| #include <asm/metag_mem.h> |
| |
| #define BAD_HWTHREAD_ID (0xFFU) |
| #define BAD_CPU_ID (0xFFU) |
| |
| extern u8 cpu_2_hwthread_id[]; |
| extern u8 hwthread_id_2_cpu[]; |
| |
| /* |
| * Each hardware thread's Control Unit registers are memory-mapped |
| * and can therefore be accessed by any other hardware thread. |
| * |
| * This helper function returns the memory address where "thread"'s |
| * register "regnum" is mapped. |
| */ |
| static inline |
| void __iomem *__CU_addr(unsigned int thread, unsigned int regnum) |
| { |
| unsigned int base, thread_offset, thread_regnum; |
| |
| WARN_ON(thread == BAD_HWTHREAD_ID); |
| |
| base = T0UCTREG0; /* Control unit base */ |
| |
| thread_offset = TnUCTRX_STRIDE * thread; |
| thread_regnum = TXUCTREGn_STRIDE * regnum; |
| |
| return (void __iomem *)(base + thread_offset + thread_regnum); |
| } |
| |
| #endif /* __METAG_HWTHREAD_H */ |