2005-04-16 15:20:36 -07:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 1999 by Kaz Kojima
*
* Defitions for the address spaces of the SH CPUs .
*/
# ifndef __ASM_SH_ADDRSPACE_H
# define __ASM_SH_ADDRSPACE_H
2007-11-08 18:42:46 +09:00
2005-04-16 15:20:36 -07:00
# ifdef __KERNEL__
2008-07-29 08:09:44 +09:00
# include <cpu/addrspace.h>
2005-04-16 15:20:36 -07:00
2007-11-08 18:42:46 +09:00
/* If this CPU supports segmentation, hook up the helpers */
# ifdef P1SEG
2005-04-16 15:20:36 -07:00
2007-11-21 15:34:02 +09:00
/*
[ P0 / U0 ( virtual ) ] 0x00000000 < - - - - - - User space
[ P1 ( fixed ) cached ] 0x80000000 < - - - - - - Kernel space
[ P2 ( fixed ) non - cachable ] 0xA0000000 < - - - - - - Physical access
[ P3 ( virtual ) cached ] 0xC0000000 < - - - - - - vmalloced area
[ P4 control ] 0xE0000000
*/
2005-04-16 15:20:36 -07:00
/* Returns the privileged segment base of a given address */
# define PXSEG(a) (((unsigned long)(a)) & 0xe0000000)
2010-01-13 18:31:48 +09:00
# ifdef CONFIG_29BIT
2005-04-16 15:20:36 -07:00
/*
* Map an address to a certain privileged segment
*/
2007-11-08 18:42:46 +09:00
# define P1SEGADDR(a) \
( ( __typeof__ ( a ) ) ( ( ( unsigned long ) ( a ) & 0x1fffffff ) | P1SEG ) )
# define P2SEGADDR(a) \
( ( __typeof__ ( a ) ) ( ( ( unsigned long ) ( a ) & 0x1fffffff ) | P2SEG ) )
# define P3SEGADDR(a) \
( ( __typeof__ ( a ) ) ( ( ( unsigned long ) ( a ) & 0x1fffffff ) | P3SEG ) )
# define P4SEGADDR(a) \
( ( __typeof__ ( a ) ) ( ( ( unsigned long ) ( a ) & 0x1fffffff ) | P4SEG ) )
2010-01-13 18:45:12 +09:00
# else
/*
* These will never work in 32 - bit , don ' t even bother .
*/
2010-11-04 12:32:24 +09:00
# define P1SEGADDR(a) ({ (void)(a); BUG(); NULL; })
# define P2SEGADDR(a) ({ (void)(a); BUG(); NULL; })
# define P3SEGADDR(a) ({ (void)(a); BUG(); NULL; })
# define P4SEGADDR(a) ({ (void)(a); BUG(); NULL; })
2010-01-13 18:45:12 +09:00
# endif
2007-11-08 18:42:46 +09:00
# endif /* P1SEG */
2005-04-16 15:20:36 -07:00
2007-11-30 17:52:53 +09:00
/* Check if an address can be reached in 29 bits */
# define IS_29BIT(a) (((unsigned long)(a)) < 0x20000000)
2008-11-25 21:57:29 +09:00
# ifdef CONFIG_SH_STORE_QUEUES
/*
* This is a special case for the SH - 4 store queues , as pages for this
* space still need to be faulted in before it ' s possible to flush the
* store queue cache for writeout to the remapped region .
*/
# define P3_ADDR_MAX (P4SEG_STORE_QUE + 0x04000000)
# else
# define P3_ADDR_MAX P4SEG
# endif
2005-04-16 15:20:36 -07:00
# endif /* __KERNEL__ */
# endif /* __ASM_SH_ADDRSPACE_H */