#ifndef _MIPS_MIPS_PARAM_H_
#define _MIPS_MIPS_PARAM_H_
#ifdef _KERNEL_OPT
#include "opt_cputype.h"
#include "opt_param.h"
#endif
#if defined(__MIPSEB__)
# define _MACHINE_SUFFIX eb
# define MACHINE_SUFFIX "eb"
#elif defined(__MIPSEL__)
# define _MACHINE_SUFFIX el
# define MACHINE_SUFFIX "el"
#else
# error neither __MIPSEL__ nor __MIPSEB__ are defined.
#endif
#define ___MACHINE32_OARCH mips##_MACHINE_SUFFIX
#define __MACHINE32_OARCH "mips" MACHINE_SUFFIX
#define ___MACHINE32_NARCH mips64##_MACHINE_SUFFIX
#define __MACHINE32_NARCH "mips64" MACHINE_SUFFIX
#define ___MACHINE64_NARCH mipsn64##_MACHINE_SUFFIX
#define __MACHINE64_NARCH "mipsn64" MACHINE_SUFFIX
#if defined(__mips_n32) || defined(__mips_n64)
# if defined(__mips_n32)
# define _MACHINE_ARCH ___MACHINE32_NARCH
# define MACHINE_ARCH __MACHINE32_NARCH
# else
# define _MACHINE_ARCH ___MACHINE64_NARCH
# define MACHINE_ARCH __MACHINE64_NARCH
# define _MACHINE32_NARCH ___MACHINE32_NARCH
# define MACHINE32_NARCH __MACHINE32_NARCH
# endif
# define _MACHINE32_OARCH ___MACHINE32_OARCH
# define MACHINE32_OARCH __MACHINE32_OARCH
#else
# define _MACHINE_ARCH ___MACHINE32_OARCH
# define MACHINE_ARCH __MACHINE32_OARCH
#endif
#ifndef _KERNEL
#undef MACHINE
#define MACHINE "mips"
#endif
#if defined(__mips_n64) || defined(__mips_n32)
#define STACK_ALIGNBYTES (16 - 1)
#else
#define STACK_ALIGNBYTES (8 - 1)
#endif
#define STACK_ALIGNBYTES_O32 (8 - 1)
#define ALIGNBYTES32 (sizeof(double) - 1)
#define ALIGN32(p) (((uintptr_t)(p) + ALIGNBYTES32) &~ALIGNBYTES32)
#if (ENABLE_MIPS_16KB_PAGE + ENABLE_MIPS_8KB_PAGE + ENABLE_MIPS_4KB_PAGE) > 1
#error only one of ENABLE_MIPS_{4,8,16}KB_PAGE can be defined.
#endif
#ifndef MSGBUFSIZE
#define MSGBUFSIZE NBPG
#endif
#define COHERENCY_UNIT 128
#define CACHE_LINE_SIZE 128
#ifdef ENABLE_MIPS_16KB_PAGE
#define PGSHIFT 14
#elif defined(ENABLE_MIPS_8KB_PAGE) \
|| (!defined(ENABLE_MIPS_4KB_PAGE) && __mips >= 3)
#define PGSHIFT 13
#else
#define PGSHIFT 12
#endif
#define NBPG (1 << PGSHIFT)
#define PGOFSET (NBPG - 1)
#define PTPSHIFT 2
#define PTPLENGTH (PGSHIFT - PTPSHIFT)
#define NPTEPG (1 << PTPLENGTH)
#define SEGSHIFT (PGSHIFT + PTPLENGTH)
#define NBSEG (1 << SEGSHIFT)
#define SEGOFSET (NBSEG - 1)
#ifdef _LP64
#define SEGLENGTH (PGSHIFT - 3)
#define XSEGSHIFT (SEGSHIFT + SEGLENGTH)
#define NBXSEG (1UL << XSEGSHIFT)
#define XSEGOFSET (NBXSEG - 1)
#define XSEGLENGTH (PGSHIFT - 3)
#define NXSEGPG (1 << XSEGLENGTH)
#else
#define SEGLENGTH (31 - SEGSHIFT)
#endif
#define NSEGPG (1 << SEGLENGTH)
#ifdef _LP64
#define __MIN_USPACE 16384
#else
#define __MIN_USPACE 8192
#endif
#define USPACE MAX(__MIN_USPACE, PAGE_SIZE)
#define UPAGES (USPACE / PAGE_SIZE)
#define USPACE_ALIGN USPACE
#define UPAGES_MAX 8
#define NKMEMPAGES_MIN_DEFAULT ((8 * 1024 * 1024) >> PAGE_SHIFT)
#define NKMEMPAGES_MAX_DEFAULT ((128 * 1024 * 1024) >> PAGE_SHIFT)
#define mips_round_page(x) ((((uintptr_t)(x)) + NBPG - 1) & ~(NBPG-1))
#define mips_trunc_page(x) ((uintptr_t)(x) & ~(NBPG-1))
#define mips_btop(x) ((paddr_t)(x) >> PGSHIFT)
#define mips_ptob(x) ((paddr_t)(x) << PGSHIFT)
#ifdef __MIPSEL__
#define MID_MACHINE MID_PMAX
#endif
#ifdef __MIPSEB__
#define MID_MACHINE MID_MIPS
#endif
#ifndef MSIZE
#ifdef _LP64
#define MSIZE 512
#else
#define MSIZE 256
#endif
#ifndef MCLSHIFT
# define MCLSHIFT 11
#endif
#define MCLBYTES (1 << MCLSHIFT)
#endif
#endif