blob: a36ad8dac0681914dd067af2a6c1609d39e475c5 [file] [log] [blame]
Bryan Wu1394f032007-05-06 14:50:22 -07001#ifndef __ASM_BFIN_PROCESSOR_H
2#define __ASM_BFIN_PROCESSOR_H
3
4/*
5 * Default implementation of macro that returns current
6 * instruction pointer ("program counter").
7 */
8#define current_text_addr() ({ __label__ _l; _l: &&_l;})
9
Mike Frysingerd5ce5282009-06-13 11:32:34 -040010#include <asm/ptrace.h>
Bryan Wu1394f032007-05-06 14:50:22 -070011#include <asm/blackfin.h>
Bryan Wu1394f032007-05-06 14:50:22 -070012
13static inline unsigned long rdusp(void)
14{
15 unsigned long usp;
16
17 __asm__ __volatile__("%0 = usp;\n\t":"=da"(usp));
18 return usp;
19}
20
21static inline void wrusp(unsigned long usp)
22{
23 __asm__ __volatile__("usp = %0;\n\t"::"da"(usp));
24}
25
Robin Getza45d5752009-01-07 23:14:38 +080026static inline unsigned long __get_SP(void)
27{
28 unsigned long sp;
29
30 __asm__ __volatile__("%0 = sp;\n\t" : "=da"(sp));
31 return sp;
32}
33
Bryan Wu1394f032007-05-06 14:50:22 -070034/*
35 * User space process size: 1st byte beyond user address space.
Bernd Schmidtd5adb022008-04-24 03:06:15 +080036 * Fairly meaningless on nommu. Parts of user programs can be scattered
37 * in a lot of places, so just disable this by setting it to 0xFFFFFFFF.
Bryan Wu1394f032007-05-06 14:50:22 -070038 */
Bernd Schmidtd5adb022008-04-24 03:06:15 +080039#define TASK_SIZE 0xFFFFFFFF
Bryan Wu1394f032007-05-06 14:50:22 -070040
David Howells922a70d2008-02-08 04:19:26 -080041#ifdef __KERNEL__
42#define STACK_TOP TASK_SIZE
43#endif
44
Bryan Wu1394f032007-05-06 14:50:22 -070045#define TASK_UNMAPPED_BASE 0
46
47struct thread_struct {
48 unsigned long ksp; /* kernel stack pointer */
49 unsigned long usp; /* user stack pointer */
50 unsigned short seqstat; /* saved status register */
51 unsigned long esp0; /* points to SR of stack frame pt_regs */
52 unsigned long pc; /* instruction pointer */
53 void * debuggerinfo;
54};
55
56#define INIT_THREAD { \
57 sizeof(init_stack) + (unsigned long) init_stack, 0, \
58 PS_S, 0, 0 \
59}
60
Mike Frysingerd5ce5282009-06-13 11:32:34 -040061extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
62 unsigned long new_sp);
Bryan Wu1394f032007-05-06 14:50:22 -070063
64/* Forward declaration, a strange C thing */
65struct task_struct;
66
67/* Free all resources held by a thread. */
68static inline void release_thread(struct task_struct *dead_task)
69{
70}
71
72#define prepare_to_copy(tsk) do { } while (0)
73
74extern int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags);
75
76/*
77 * Free current thread data structures etc..
78 */
79static inline void exit_thread(void)
80{
81}
82
83/*
84 * Return saved PC of a blocked thread.
85 */
86#define thread_saved_pc(tsk) (tsk->thread.pc)
87
88unsigned long get_wchan(struct task_struct *p);
89
90#define KSTK_EIP(tsk) \
91 ({ \
92 unsigned long eip = 0; \
93 if ((tsk)->thread.esp0 > PAGE_SIZE && \
94 MAP_NR((tsk)->thread.esp0) < max_mapnr) \
95 eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
96 eip; })
97#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
98
Graf Yang6b3087c2009-01-07 23:14:39 +080099#define cpu_relax() smp_mb()
100
Bryan Wu1394f032007-05-06 14:50:22 -0700101
102/* Get the Silicon Revision of the chip */
Ralf Baechlee8c44312007-10-18 03:07:07 -0700103static inline uint32_t __pure bfin_revid(void)
Bryan Wu1394f032007-05-06 14:50:22 -0700104{
Robin Getzbc4d6f32009-04-23 14:15:04 +0000105 /* Always use CHIPID, to work around ANOMALY_05000234 */
106 uint32_t revid = (bfin_read_CHIPID() & CHIPID_VERSION) >> 28;
Michael Hennerich0138da62008-07-19 16:56:53 +0800107
Graf Yang10a5ecd2009-07-01 04:08:01 +0000108#ifdef _BOOTROM_GET_DXE_ADDRESS_TWI
109 /*
110 * ANOMALY_05000364
Michael Hennerich0138da62008-07-19 16:56:53 +0800111 * Incorrect Revision Number in DSPID Register
112 */
Graf Yang10a5ecd2009-07-01 04:08:01 +0000113 if (ANOMALY_05000364 &&
114 bfin_read16(_BOOTROM_GET_DXE_ADDRESS_TWI) == 0x2796)
115 revid = 1;
Michael Hennerich0138da62008-07-19 16:56:53 +0800116#endif
Graf Yang10a5ecd2009-07-01 04:08:01 +0000117
Michael Hennerich0138da62008-07-19 16:56:53 +0800118 return revid;
Bryan Wu1394f032007-05-06 14:50:22 -0700119}
120
Robin Getze482cad2008-10-10 18:21:45 +0800121static inline uint16_t __pure bfin_cpuid(void)
122{
123 return (bfin_read_CHIPID() & CHIPID_FAMILY) >> 12;
Graf Yang6b3087c2009-01-07 23:14:39 +0800124}
Robin Getze482cad2008-10-10 18:21:45 +0800125
Graf Yang6b3087c2009-01-07 23:14:39 +0800126static inline uint32_t __pure bfin_dspid(void)
127{
128 return bfin_read_DSPID();
Robin Getze482cad2008-10-10 18:21:45 +0800129}
130
Ralf Baechlee8c44312007-10-18 03:07:07 -0700131static inline uint32_t __pure bfin_compiled_revid(void)
Bryan Wu1394f032007-05-06 14:50:22 -0700132{
133#if defined(CONFIG_BF_REV_0_0)
134 return 0;
135#elif defined(CONFIG_BF_REV_0_1)
136 return 1;
137#elif defined(CONFIG_BF_REV_0_2)
138 return 2;
139#elif defined(CONFIG_BF_REV_0_3)
140 return 3;
141#elif defined(CONFIG_BF_REV_0_4)
142 return 4;
143#elif defined(CONFIG_BF_REV_0_5)
144 return 5;
Bryan Wu2e8ca592008-11-18 17:48:22 +0800145#elif defined(CONFIG_BF_REV_0_6)
146 return 6;
Jie Zhangde3025f2007-06-25 18:04:12 +0800147#elif defined(CONFIG_BF_REV_ANY)
148 return 0xffff;
149#else
150 return -1;
Bryan Wu1394f032007-05-06 14:50:22 -0700151#endif
152}
153
154#endif