• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/microblaze/include/asm/
1/*
2 * Copyright (C) 2006 Atmark Techno, Inc.
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 */
8
9#ifndef _ASM_MICROBLAZE_SYSTEM_H
10#define _ASM_MICROBLAZE_SYSTEM_H
11
12#include <asm/registers.h>
13#include <asm/setup.h>
14#include <asm/irqflags.h>
15#include <asm/cache.h>
16
17#include <asm-generic/cmpxchg.h>
18#include <asm-generic/cmpxchg-local.h>
19
20#define __ARCH_WANT_INTERRUPTS_ON_CTXSW
21
22struct task_struct;
23struct thread_info;
24
25extern struct task_struct *_switch_to(struct thread_info *prev,
26					struct thread_info *next);
27
28#define switch_to(prev, next, last)					\
29	do {								\
30		(last) = _switch_to(task_thread_info(prev),		\
31					task_thread_info(next));	\
32	} while (0)
33
34#define smp_read_barrier_depends()	do {} while (0)
35#define read_barrier_depends()		do {} while (0)
36
37#define nop()			asm volatile ("nop")
38#define mb()			barrier()
39#define rmb()			mb()
40#define wmb()			mb()
41#define set_mb(var, value)	do { var = value; mb(); } while (0)
42#define set_wmb(var, value)	do { var = value; wmb(); } while (0)
43
44#define smp_mb()		mb()
45#define smp_rmb()		rmb()
46#define smp_wmb()		wmb()
47
48void __bad_xchg(volatile void *ptr, int size);
49
50static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
51								int size)
52{
53	unsigned long ret;
54	unsigned long flags;
55
56	switch (size) {
57	case 1:
58		local_irq_save(flags);
59		ret = *(volatile unsigned char *)ptr;
60		*(volatile unsigned char *)ptr = x;
61		local_irq_restore(flags);
62		break;
63
64	case 4:
65		local_irq_save(flags);
66		ret = *(volatile unsigned long *)ptr;
67		*(volatile unsigned long *)ptr = x;
68		local_irq_restore(flags);
69		break;
70	default:
71		__bad_xchg(ptr, size), ret = 0;
72		break;
73	}
74
75	return ret;
76}
77
78void disable_hlt(void);
79void enable_hlt(void);
80void default_idle(void);
81
82#define xchg(ptr, x) \
83	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
84
85void free_init_pages(char *what, unsigned long begin, unsigned long end);
86void free_initmem(void);
87extern char *klimit;
88extern void ret_from_fork(void);
89
90extern void *alloc_maybe_bootmem(size_t size, gfp_t mask);
91extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
92
93#ifdef CONFIG_DEBUG_FS
94extern struct dentry *of_debugfs_root;
95#endif
96
97#define arch_align_stack(x) (x)
98
99/*
100 * MicroBlaze doesn't handle unaligned accesses in hardware.
101 *
102 * Based on this we force the IP header alignment in network drivers.
103 */
104#define NET_IP_ALIGN	2
105
106#endif /* _ASM_MICROBLAZE_SYSTEM_H */
107