The binary GCD algorithm is based on the following facts:
1. If a and b are all evens, then gcd(a,b) = 2 * gcd(a/2, b/2)
2. If a is even and b is odd, then gcd(a,b) = gcd(a/2, b)
3. If a and b are all odds, then gcd(a,b) = gcd((a-b)/2, b) = gcd((a+b)/2, b)
Even on x86 machines with reasonable division hardware, the binary
algorithm runs about 25% faster (80% the execution time) than the
division-based Euclidian algorithm.
On platforms like Alpha and ARMv6 where division is a function call to
emulation code, it's even more significant.
There are two variants of the code here, depending on whether a fast
__ffs (find least significant set bit) instruction is available. This
allows the unpredictable branches in the bit-at-a-time shifting loop to
be eliminated.
If fast __ffs is not available, the "even/odd" GCD variant is used.
I use the following code to benchmark:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define swap(a, b) \
do { \
a ^= b; \
b ^= a; \
a ^= b; \
} while (0)
unsigned long gcd0(unsigned long a, unsigned long b)
{
unsigned long r;
if (a < b) {
swap(a, b);
}
if (b == 0)
return a;
while ((r = a % b) != 0) {
a = b;
b = r;
}
return b;
}
unsigned long gcd1(unsigned long a, unsigned long b)
{
unsigned long r = a | b;
if (!a || !b)
return r;
b >>= __builtin_ctzl(b);
for (;;) {
a >>= __builtin_ctzl(a);
if (a == b)
return a << __builtin_ctzl(r);
if (a < b)
swap(a, b);
a -= b;
}
}
unsigned long gcd2(unsigned long a, unsigned long b)
{
unsigned long r = a | b;
if (!a || !b)
return r;
r &= -r;
while (!(b & r))
b >>= 1;
for (;;) {
while (!(a & r))
a >>= 1;
if (a == b)
return a;
if (a < b)
swap(a, b);
a -= b;
a >>= 1;
if (a & r)
a += b;
a >>= 1;
}
}
unsigned long gcd3(unsigned long a, unsigned long b)
{
unsigned long r = a | b;
if (!a || !b)
return r;
b >>= __builtin_ctzl(b);
if (b == 1)
return r & -r;
for (;;) {
a >>= __builtin_ctzl(a);
if (a == 1)
return r & -r;
if (a == b)
return a << __builtin_ctzl(r);
if (a < b)
swap(a, b);
a -= b;
}
}
unsigned long gcd4(unsigned long a, unsigned long b)
{
unsigned long r = a | b;
if (!a || !b)
return r;
r &= -r;
while (!(b & r))
b >>= 1;
if (b == r)
return r;
for (;;) {
while (!(a & r))
a >>= 1;
if (a == r)
return r;
if (a == b)
return a;
if (a < b)
swap(a, b);
a -= b;
a >>= 1;
if (a & r)
a += b;
a >>= 1;
}
}
static unsigned long (*gcd_func[])(unsigned long a, unsigned long b) = {
gcd0, gcd1, gcd2, gcd3, gcd4,
};
#define TEST_ENTRIES (sizeof(gcd_func) / sizeof(gcd_func[0]))
#if defined(__x86_64__)
#define rdtscll(val) do { \
unsigned long __a,__d; \
__asm__ __volatile__("rdtsc" : "=a" (__a), "=d" (__d)); \
(val) = ((unsigned long long)__a) | (((unsigned long long)__d)<<32); \
} while(0)
static unsigned long long benchmark_gcd_func(unsigned long (*gcd)(unsigned long, unsigned long),
unsigned long a, unsigned long b, unsigned long *res)
{
unsigned long long start, end;
unsigned long long ret;
unsigned long gcd_res;
rdtscll(start);
gcd_res = gcd(a, b);
rdtscll(end);
if (end >= start)
ret = end - start;
else
ret = ~0ULL - start + 1 + end;
*res = gcd_res;
return ret;
}
#else
static inline struct timespec read_time(void)
{
struct timespec time;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time);
return time;
}
static inline unsigned long long diff_time(struct timespec start, struct timespec end)
{
struct timespec temp;
if ((end.tv_nsec - start.tv_nsec) < 0) {
temp.tv_sec = end.tv_sec - start.tv_sec - 1;
temp.tv_nsec = 1000000000ULL + end.tv_nsec - start.tv_nsec;
} else {
temp.tv_sec = end.tv_sec - start.tv_sec;
temp.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return temp.tv_sec * 1000000000ULL + temp.tv_nsec;
}
static unsigned long long benchmark_gcd_func(unsigned long (*gcd)(unsigned long, unsigned long),
unsigned long a, unsigned long b, unsigned long *res)
{
struct timespec start, end;
unsigned long gcd_res;
start = read_time();
gcd_res = gcd(a, b);
end = read_time();
*res = gcd_res;
return diff_time(start, end);
}
#endif
static inline unsigned long get_rand()
{
if (sizeof(long) == 8)
return (unsigned long)rand() << 32 | rand();
else
return rand();
}
int main(int argc, char **argv)
{
unsigned int seed = time(0);
int loops = 100;
int repeats = 1000;
unsigned long (*res)[TEST_ENTRIES];
unsigned long long elapsed[TEST_ENTRIES];
int i, j, k;
for (;;) {
int opt = getopt(argc, argv, "n:r:s:");
/* End condition always first */
if (opt == -1)
break;
switch (opt) {
case 'n':
loops = atoi(optarg);
break;
case 'r':
repeats = atoi(optarg);
break;
case 's':
seed = strtoul(optarg, NULL, 10);
break;
default:
/* You won't actually get here. */
break;
}
}
res = malloc(sizeof(unsigned long) * TEST_ENTRIES * loops);
memset(elapsed, 0, sizeof(elapsed));
srand(seed);
for (j = 0; j < loops; j++) {
unsigned long a = get_rand();
/* Do we have args? */
unsigned long b = argc > optind ? strtoul(argv[optind], NULL, 10) : get_rand();
unsigned long long min_elapsed[TEST_ENTRIES];
for (k = 0; k < repeats; k++) {
for (i = 0; i < TEST_ENTRIES; i++) {
unsigned long long tmp = benchmark_gcd_func(gcd_func[i], a, b, &res[j][i]);
if (k == 0 || min_elapsed[i] > tmp)
min_elapsed[i] = tmp;
}
}
for (i = 0; i < TEST_ENTRIES; i++)
elapsed[i] += min_elapsed[i];
}
for (i = 0; i < TEST_ENTRIES; i++)
printf("gcd%d: elapsed %llu\n", i, elapsed[i]);
k = 0;
srand(seed);
for (j = 0; j < loops; j++) {
unsigned long a = get_rand();
unsigned long b = argc > optind ? strtoul(argv[optind], NULL, 10) : get_rand();
for (i = 1; i < TEST_ENTRIES; i++) {
if (res[j][i] != res[j][0])
break;
}
if (i < TEST_ENTRIES) {
if (k == 0) {
k = 1;
fprintf(stderr, "Error:\n");
}
fprintf(stderr, "gcd(%lu, %lu): ", a, b);
for (i = 0; i < TEST_ENTRIES; i++)
fprintf(stderr, "%ld%s", res[j][i], i < TEST_ENTRIES - 1 ? ", " : "\n");
}
}
if (k == 0)
fprintf(stderr, "PASS\n");
free(res);
return 0;
}
Compiled with "-O2", on "VirtualBox 4.4.0-22-generic #38-Ubuntu x86_64" got:
zhaoxiuzeng@zhaoxiuzeng-VirtualBox:~/develop$ ./gcd -r 500000 -n 10
gcd0: elapsed 10174
gcd1: elapsed 2120
gcd2: elapsed 2902
gcd3: elapsed 2039
gcd4: elapsed 2812
PASS
zhaoxiuzeng@zhaoxiuzeng-VirtualBox:~/develop$ ./gcd -r 500000 -n 10
gcd0: elapsed 9309
gcd1: elapsed 2280
gcd2: elapsed 2822
gcd3: elapsed 2217
gcd4: elapsed 2710
PASS
zhaoxiuzeng@zhaoxiuzeng-VirtualBox:~/develop$ ./gcd -r 500000 -n 10
gcd0: elapsed 9589
gcd1: elapsed 2098
gcd2: elapsed 2815
gcd3: elapsed 2030
gcd4: elapsed 2718
PASS
zhaoxiuzeng@zhaoxiuzeng-VirtualBox:~/develop$ ./gcd -r 500000 -n 10
gcd0: elapsed 9914
gcd1: elapsed 2309
gcd2: elapsed 2779
gcd3: elapsed 2228
gcd4: elapsed 2709
PASS
[akpm@linux-foundation.org: avoid #defining a CONFIG_ variable]
Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Signed-off-by: George Spelvin <linux@horizon.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
887 lines
21 KiB
Plaintext
887 lines
21 KiB
Plaintext
config SUPERH
|
|
def_bool y
|
|
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
|
select HAVE_PATA_PLATFORM
|
|
select CLKDEV_LOOKUP
|
|
select HAVE_IDE if HAS_IOPORT_MAP
|
|
select HAVE_MEMBLOCK
|
|
select HAVE_MEMBLOCK_NODE_MAP
|
|
select ARCH_DISCARD_MEMBLOCK
|
|
select HAVE_OPROFILE
|
|
select HAVE_GENERIC_DMA_COHERENT
|
|
select HAVE_ARCH_TRACEHOOK
|
|
select HAVE_DMA_API_DEBUG
|
|
select HAVE_PERF_EVENTS
|
|
select HAVE_DEBUG_BUGVERBOSE
|
|
select ARCH_HAVE_CUSTOM_GPIO_H
|
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG if (GUSA_RB || CPU_SH4A)
|
|
select ARCH_HAS_GCOV_PROFILE_ALL
|
|
select PERF_USE_VMALLOC
|
|
select HAVE_DEBUG_KMEMLEAK
|
|
select HAVE_KERNEL_GZIP
|
|
select CPU_NO_EFFICIENT_FFS
|
|
select HAVE_KERNEL_BZIP2
|
|
select HAVE_KERNEL_LZMA
|
|
select HAVE_KERNEL_XZ
|
|
select HAVE_KERNEL_LZO
|
|
select HAVE_UID16
|
|
select ARCH_WANT_IPC_PARSE_VERSION
|
|
select HAVE_SYSCALL_TRACEPOINTS
|
|
select HAVE_REGS_AND_STACK_ACCESS_API
|
|
select MAY_HAVE_SPARSE_IRQ
|
|
select IRQ_FORCED_THREADING
|
|
select RTC_LIB
|
|
select GENERIC_ATOMIC64
|
|
select GENERIC_IRQ_SHOW
|
|
select GENERIC_SMP_IDLE_THREAD
|
|
select GENERIC_IDLE_POLL_SETUP
|
|
select GENERIC_CLOCKEVENTS
|
|
select GENERIC_CMOS_UPDATE if SH_SH03 || SH_DREAMCAST
|
|
select GENERIC_STRNCPY_FROM_USER
|
|
select GENERIC_STRNLEN_USER
|
|
select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER
|
|
select MODULES_USE_ELF_RELA
|
|
select OLD_SIGSUSPEND
|
|
select OLD_SIGACTION
|
|
select HAVE_ARCH_AUDITSYSCALL
|
|
select HAVE_NMI
|
|
help
|
|
The SuperH is a RISC processor targeted for use in embedded systems
|
|
and consumer electronics; it was also used in the Sega Dreamcast
|
|
gaming console. The SuperH port has a home page at
|
|
<http://www.linux-sh.org/>.
|
|
|
|
config SUPERH32
|
|
def_bool ARCH = "sh"
|
|
select HAVE_KPROBES
|
|
select HAVE_KRETPROBES
|
|
select HAVE_IOREMAP_PROT if MMU && !X2TLB
|
|
select HAVE_FUNCTION_TRACER
|
|
select HAVE_FTRACE_MCOUNT_RECORD
|
|
select HAVE_DYNAMIC_FTRACE
|
|
select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE
|
|
select ARCH_WANT_IPC_PARSE_VERSION
|
|
select HAVE_FUNCTION_GRAPH_TRACER
|
|
select HAVE_ARCH_KGDB
|
|
select HAVE_HW_BREAKPOINT
|
|
select HAVE_MIXED_BREAKPOINTS_REGS
|
|
select PERF_EVENTS
|
|
select ARCH_HIBERNATION_POSSIBLE if MMU
|
|
select SPARSE_IRQ
|
|
select HAVE_CC_STACKPROTECTOR
|
|
|
|
config SUPERH64
|
|
def_bool ARCH = "sh64"
|
|
select HAVE_EXIT_THREAD
|
|
select KALLSYMS
|
|
|
|
config ARCH_DEFCONFIG
|
|
string
|
|
default "arch/sh/configs/shx3_defconfig" if SUPERH32
|
|
default "arch/sh/configs/cayman_defconfig" if SUPERH64
|
|
|
|
config RWSEM_GENERIC_SPINLOCK
|
|
def_bool y
|
|
|
|
config RWSEM_XCHGADD_ALGORITHM
|
|
bool
|
|
|
|
config GENERIC_BUG
|
|
def_bool y
|
|
depends on BUG && SUPERH32
|
|
|
|
config GENERIC_CSUM
|
|
def_bool y
|
|
depends on SUPERH64
|
|
|
|
config GENERIC_HWEIGHT
|
|
def_bool y
|
|
|
|
config GENERIC_CALIBRATE_DELAY
|
|
bool
|
|
|
|
config GENERIC_LOCKBREAK
|
|
def_bool y
|
|
depends on SMP && PREEMPT
|
|
|
|
config ARCH_SUSPEND_POSSIBLE
|
|
def_bool n
|
|
|
|
config ARCH_HIBERNATION_POSSIBLE
|
|
def_bool n
|
|
|
|
config SYS_SUPPORTS_APM_EMULATION
|
|
bool
|
|
select ARCH_SUSPEND_POSSIBLE
|
|
|
|
config SYS_SUPPORTS_HUGETLBFS
|
|
bool
|
|
|
|
config SYS_SUPPORTS_SMP
|
|
bool
|
|
|
|
config SYS_SUPPORTS_NUMA
|
|
bool
|
|
|
|
config SYS_SUPPORTS_PCI
|
|
bool
|
|
|
|
config STACKTRACE_SUPPORT
|
|
def_bool y
|
|
|
|
config LOCKDEP_SUPPORT
|
|
def_bool y
|
|
|
|
config ARCH_HAS_ILOG2_U32
|
|
def_bool n
|
|
|
|
config ARCH_HAS_ILOG2_U64
|
|
def_bool n
|
|
|
|
config NO_IOPORT_MAP
|
|
def_bool !PCI
|
|
depends on !SH_CAYMAN && !SH_SH4202_MICRODEV && !SH_SHMIN && \
|
|
!SH_HP6XX && !SH_SOLUTION_ENGINE
|
|
|
|
config IO_TRAPPED
|
|
bool
|
|
|
|
config SWAP_IO_SPACE
|
|
bool
|
|
|
|
config DMA_COHERENT
|
|
bool
|
|
|
|
config DMA_NONCOHERENT
|
|
def_bool !DMA_COHERENT
|
|
|
|
config NEED_DMA_MAP_STATE
|
|
def_bool DMA_NONCOHERENT
|
|
|
|
config NEED_SG_DMA_LENGTH
|
|
def_bool y
|
|
|
|
config PGTABLE_LEVELS
|
|
default 3 if X2TLB
|
|
default 2
|
|
|
|
source "init/Kconfig"
|
|
|
|
source "kernel/Kconfig.freezer"
|
|
|
|
menu "System type"
|
|
|
|
#
|
|
# Processor families
|
|
#
|
|
config CPU_SH2
|
|
bool
|
|
select SH_INTC
|
|
|
|
config CPU_SH2A
|
|
bool
|
|
select CPU_SH2
|
|
select UNCACHED_MAPPING
|
|
|
|
config CPU_SH3
|
|
bool
|
|
select CPU_HAS_INTEVT
|
|
select CPU_HAS_SR_RB
|
|
select SH_INTC
|
|
select SYS_SUPPORTS_SH_TMU
|
|
|
|
config CPU_SH4
|
|
bool
|
|
select CPU_HAS_INTEVT
|
|
select CPU_HAS_SR_RB
|
|
select CPU_HAS_FPU if !CPU_SH4AL_DSP
|
|
select SH_INTC
|
|
select SYS_SUPPORTS_SH_TMU
|
|
select SYS_SUPPORTS_HUGETLBFS if MMU
|
|
|
|
config CPU_SH4A
|
|
bool
|
|
select CPU_SH4
|
|
|
|
config CPU_SH4AL_DSP
|
|
bool
|
|
select CPU_SH4A
|
|
select CPU_HAS_DSP
|
|
|
|
config CPU_SH5
|
|
bool
|
|
select CPU_HAS_FPU
|
|
select SYS_SUPPORTS_SH_TMU
|
|
select SYS_SUPPORTS_HUGETLBFS if MMU
|
|
|
|
config CPU_SHX2
|
|
bool
|
|
|
|
config CPU_SHX3
|
|
bool
|
|
select DMA_COHERENT
|
|
select SYS_SUPPORTS_SMP
|
|
select SYS_SUPPORTS_NUMA
|
|
|
|
config ARCH_SHMOBILE
|
|
bool
|
|
select ARCH_SUSPEND_POSSIBLE
|
|
select PM
|
|
|
|
config CPU_HAS_PMU
|
|
depends on CPU_SH4 || CPU_SH4A
|
|
default y
|
|
bool
|
|
|
|
if SUPERH32
|
|
|
|
choice
|
|
prompt "Processor sub-type selection"
|
|
|
|
#
|
|
# Processor subtypes
|
|
#
|
|
|
|
# SH-2 Processor Support
|
|
|
|
config CPU_SUBTYPE_SH7619
|
|
bool "Support SH7619 processor"
|
|
select CPU_SH2
|
|
select SYS_SUPPORTS_SH_CMT
|
|
|
|
# SH-2A Processor Support
|
|
|
|
config CPU_SUBTYPE_SH7201
|
|
bool "Support SH7201 processor"
|
|
select CPU_SH2A
|
|
select CPU_HAS_FPU
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
|
|
config CPU_SUBTYPE_SH7203
|
|
bool "Support SH7203 processor"
|
|
select CPU_SH2A
|
|
select CPU_HAS_FPU
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
|
|
config CPU_SUBTYPE_SH7206
|
|
bool "Support SH7206 processor"
|
|
select CPU_SH2A
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
|
|
config CPU_SUBTYPE_SH7263
|
|
bool "Support SH7263 processor"
|
|
select CPU_SH2A
|
|
select CPU_HAS_FPU
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
|
|
config CPU_SUBTYPE_SH7264
|
|
bool "Support SH7264 processor"
|
|
select CPU_SH2A
|
|
select CPU_HAS_FPU
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
select PINCTRL
|
|
|
|
config CPU_SUBTYPE_SH7269
|
|
bool "Support SH7269 processor"
|
|
select CPU_SH2A
|
|
select CPU_HAS_FPU
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
select PINCTRL
|
|
|
|
config CPU_SUBTYPE_MXG
|
|
bool "Support MX-G processor"
|
|
select CPU_SH2A
|
|
select SYS_SUPPORTS_SH_MTU2
|
|
help
|
|
Select MX-G if running on an R8A03022BG part.
|
|
|
|
# SH-3 Processor Support
|
|
|
|
config CPU_SUBTYPE_SH7705
|
|
bool "Support SH7705 processor"
|
|
select CPU_SH3
|
|
|
|
config CPU_SUBTYPE_SH7706
|
|
bool "Support SH7706 processor"
|
|
select CPU_SH3
|
|
help
|
|
Select SH7706 if you have a 133 Mhz SH-3 HD6417706 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7707
|
|
bool "Support SH7707 processor"
|
|
select CPU_SH3
|
|
help
|
|
Select SH7707 if you have a 60 Mhz SH-3 HD6417707 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7708
|
|
bool "Support SH7708 processor"
|
|
select CPU_SH3
|
|
help
|
|
Select SH7708 if you have a 60 Mhz SH-3 HD6417708S or
|
|
if you have a 100 Mhz SH-3 HD6417708R CPU.
|
|
|
|
config CPU_SUBTYPE_SH7709
|
|
bool "Support SH7709 processor"
|
|
select CPU_SH3
|
|
help
|
|
Select SH7709 if you have a 80 Mhz SH-3 HD6417709 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7710
|
|
bool "Support SH7710 processor"
|
|
select CPU_SH3
|
|
select CPU_HAS_DSP
|
|
help
|
|
Select SH7710 if you have a SH3-DSP SH7710 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7712
|
|
bool "Support SH7712 processor"
|
|
select CPU_SH3
|
|
select CPU_HAS_DSP
|
|
help
|
|
Select SH7712 if you have a SH3-DSP SH7712 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7720
|
|
bool "Support SH7720 processor"
|
|
select CPU_SH3
|
|
select CPU_HAS_DSP
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select USB_OHCI_SH if USB_OHCI_HCD
|
|
select PINCTRL
|
|
help
|
|
Select SH7720 if you have a SH3-DSP SH7720 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7721
|
|
bool "Support SH7721 processor"
|
|
select CPU_SH3
|
|
select CPU_HAS_DSP
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select USB_OHCI_SH if USB_OHCI_HCD
|
|
help
|
|
Select SH7721 if you have a SH3-DSP SH7721 CPU.
|
|
|
|
# SH-4 Processor Support
|
|
|
|
config CPU_SUBTYPE_SH7750
|
|
bool "Support SH7750 processor"
|
|
select CPU_SH4
|
|
help
|
|
Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7091
|
|
bool "Support SH7091 processor"
|
|
select CPU_SH4
|
|
help
|
|
Select SH7091 if you have an SH-4 based Sega device (such as
|
|
the Dreamcast, Naomi, and Naomi 2).
|
|
|
|
config CPU_SUBTYPE_SH7750R
|
|
bool "Support SH7750R processor"
|
|
select CPU_SH4
|
|
|
|
config CPU_SUBTYPE_SH7750S
|
|
bool "Support SH7750S processor"
|
|
select CPU_SH4
|
|
|
|
config CPU_SUBTYPE_SH7751
|
|
bool "Support SH7751 processor"
|
|
select CPU_SH4
|
|
help
|
|
Select SH7751 if you have a 166 Mhz SH-4 HD6417751 CPU,
|
|
or if you have a HD6417751R CPU.
|
|
|
|
config CPU_SUBTYPE_SH7751R
|
|
bool "Support SH7751R processor"
|
|
select CPU_SH4
|
|
|
|
config CPU_SUBTYPE_SH7760
|
|
bool "Support SH7760 processor"
|
|
select CPU_SH4
|
|
|
|
config CPU_SUBTYPE_SH4_202
|
|
bool "Support SH4-202 processor"
|
|
select CPU_SH4
|
|
|
|
# SH-4A Processor Support
|
|
|
|
config CPU_SUBTYPE_SH7723
|
|
bool "Support SH7723 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX2
|
|
select ARCH_SHMOBILE
|
|
select ARCH_SPARSEMEM_ENABLE
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
help
|
|
Select SH7723 if you have an SH-MobileR2 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7724
|
|
bool "Support SH7724 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX2
|
|
select ARCH_SHMOBILE
|
|
select ARCH_SPARSEMEM_ENABLE
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
help
|
|
Select SH7724 if you have an SH-MobileR2R CPU.
|
|
|
|
config CPU_SUBTYPE_SH7734
|
|
bool "Support SH7734 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX2
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
help
|
|
Select SH7734 if you have a SH4A SH7734 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7757
|
|
bool "Support SH7757 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX2
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
help
|
|
Select SH7757 if you have a SH4A SH7757 CPU.
|
|
|
|
config CPU_SUBTYPE_SH7763
|
|
bool "Support SH7763 processor"
|
|
select CPU_SH4A
|
|
select USB_OHCI_SH if USB_OHCI_HCD
|
|
help
|
|
Select SH7763 if you have a SH4A SH7763(R5S77631) CPU.
|
|
|
|
config CPU_SUBTYPE_SH7770
|
|
bool "Support SH7770 processor"
|
|
select CPU_SH4A
|
|
|
|
config CPU_SUBTYPE_SH7780
|
|
bool "Support SH7780 processor"
|
|
select CPU_SH4A
|
|
|
|
config CPU_SUBTYPE_SH7785
|
|
bool "Support SH7785 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX2
|
|
select ARCH_SPARSEMEM_ENABLE
|
|
select SYS_SUPPORTS_NUMA
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
|
|
config CPU_SUBTYPE_SH7786
|
|
bool "Support SH7786 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX3
|
|
select CPU_HAS_PTEAEX
|
|
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select USB_OHCI_SH if USB_OHCI_HCD
|
|
select USB_EHCI_SH if USB_EHCI_HCD
|
|
select PINCTRL
|
|
|
|
config CPU_SUBTYPE_SHX3
|
|
bool "Support SH-X3 processor"
|
|
select CPU_SH4A
|
|
select CPU_SHX3
|
|
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
|
select ARCH_REQUIRE_GPIOLIB
|
|
select PINCTRL
|
|
|
|
# SH4AL-DSP Processor Support
|
|
|
|
config CPU_SUBTYPE_SH7343
|
|
bool "Support SH7343 processor"
|
|
select CPU_SH4AL_DSP
|
|
select ARCH_SHMOBILE
|
|
select SYS_SUPPORTS_SH_CMT
|
|
|
|
config CPU_SUBTYPE_SH7722
|
|
bool "Support SH7722 processor"
|
|
select CPU_SH4AL_DSP
|
|
select CPU_SHX2
|
|
select ARCH_SHMOBILE
|
|
select ARCH_SPARSEMEM_ENABLE
|
|
select SYS_SUPPORTS_NUMA
|
|
select SYS_SUPPORTS_SH_CMT
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select PINCTRL
|
|
|
|
config CPU_SUBTYPE_SH7366
|
|
bool "Support SH7366 processor"
|
|
select CPU_SH4AL_DSP
|
|
select CPU_SHX2
|
|
select ARCH_SHMOBILE
|
|
select ARCH_SPARSEMEM_ENABLE
|
|
select SYS_SUPPORTS_NUMA
|
|
select SYS_SUPPORTS_SH_CMT
|
|
|
|
endchoice
|
|
|
|
endif
|
|
|
|
if SUPERH64
|
|
|
|
choice
|
|
prompt "Processor sub-type selection"
|
|
|
|
# SH-5 Processor Support
|
|
|
|
config CPU_SUBTYPE_SH5_101
|
|
bool "Support SH5-101 processor"
|
|
select CPU_SH5
|
|
|
|
config CPU_SUBTYPE_SH5_103
|
|
bool "Support SH5-103 processor"
|
|
select CPU_SH5
|
|
|
|
endchoice
|
|
|
|
endif
|
|
|
|
source "arch/sh/mm/Kconfig"
|
|
|
|
source "arch/sh/Kconfig.cpu"
|
|
|
|
source "arch/sh/boards/Kconfig"
|
|
|
|
menu "Timer and clock configuration"
|
|
|
|
config SH_PCLK_FREQ
|
|
int "Peripheral clock frequency (in Hz)"
|
|
depends on SH_CLK_CPG_LEGACY
|
|
default "31250000" if CPU_SUBTYPE_SH7619
|
|
default "33333333" if CPU_SUBTYPE_SH7770 || \
|
|
CPU_SUBTYPE_SH7760 || \
|
|
CPU_SUBTYPE_SH7705 || \
|
|
CPU_SUBTYPE_SH7203 || \
|
|
CPU_SUBTYPE_SH7206 || \
|
|
CPU_SUBTYPE_SH7263 || \
|
|
CPU_SUBTYPE_MXG
|
|
default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R
|
|
default "66000000" if CPU_SUBTYPE_SH4_202
|
|
default "50000000"
|
|
help
|
|
This option is used to specify the peripheral clock frequency.
|
|
This is necessary for determining the reference clock value on
|
|
platforms lacking an RTC.
|
|
|
|
config SH_CLK_CPG
|
|
def_bool y
|
|
|
|
config SH_CLK_CPG_LEGACY
|
|
depends on SH_CLK_CPG
|
|
def_bool y if !CPU_SUBTYPE_SH7785 && !ARCH_SHMOBILE && \
|
|
!CPU_SHX3 && !CPU_SUBTYPE_SH7757 && \
|
|
!CPU_SUBTYPE_SH7734 && !CPU_SUBTYPE_SH7264 && \
|
|
!CPU_SUBTYPE_SH7269
|
|
|
|
endmenu
|
|
|
|
menu "CPU Frequency scaling"
|
|
source "drivers/cpufreq/Kconfig"
|
|
endmenu
|
|
|
|
source "arch/sh/drivers/Kconfig"
|
|
|
|
endmenu
|
|
|
|
menu "Kernel features"
|
|
|
|
source kernel/Kconfig.hz
|
|
|
|
config KEXEC
|
|
bool "kexec system call (EXPERIMENTAL)"
|
|
depends on SUPERH32 && MMU
|
|
select KEXEC_CORE
|
|
help
|
|
kexec is a system call that implements the ability to shutdown your
|
|
current kernel, and to start another kernel. It is like a reboot
|
|
but it is independent of the system firmware. And like a reboot
|
|
you can start any kernel with it, not just Linux.
|
|
|
|
The name comes from the similarity to the exec system call.
|
|
|
|
It is an ongoing process to be certain the hardware in a machine
|
|
is properly shutdown, so do not be surprised if this code does not
|
|
initially work for you. As of this writing the exact hardware
|
|
interface is strongly in flux, so no good recommendation can be
|
|
made.
|
|
|
|
config CRASH_DUMP
|
|
bool "kernel crash dumps (EXPERIMENTAL)"
|
|
depends on SUPERH32 && BROKEN_ON_SMP
|
|
help
|
|
Generate crash dump after being started by kexec.
|
|
This should be normally only set in special crash dump kernels
|
|
which are loaded in the main kernel with kexec-tools into
|
|
a specially reserved region and then later executed after
|
|
a crash by kdump/kexec. The crash dump kernel must be compiled
|
|
to a memory address not used by the main kernel using
|
|
PHYSICAL_START.
|
|
|
|
For more details see Documentation/kdump/kdump.txt
|
|
|
|
config KEXEC_JUMP
|
|
bool "kexec jump (EXPERIMENTAL)"
|
|
depends on SUPERH32 && KEXEC && HIBERNATION
|
|
help
|
|
Jump between original kernel and kexeced kernel and invoke
|
|
code via KEXEC
|
|
|
|
config PHYSICAL_START
|
|
hex "Physical address where the kernel is loaded" if (EXPERT || CRASH_DUMP)
|
|
default MEMORY_START
|
|
---help---
|
|
This gives the physical address where the kernel is loaded
|
|
and is ordinarily the same as MEMORY_START.
|
|
|
|
Different values are primarily used in the case of kexec on panic
|
|
where the fail safe kernel needs to run at a different address
|
|
than the panic-ed kernel.
|
|
|
|
config SECCOMP
|
|
bool "Enable seccomp to safely compute untrusted bytecode"
|
|
depends on PROC_FS
|
|
help
|
|
This kernel feature is useful for number crunching applications
|
|
that may need to compute untrusted bytecode during their
|
|
execution. By using pipes or other transports made available to
|
|
the process as file descriptors supporting the read/write
|
|
syscalls, it's possible to isolate those applications in
|
|
their own address space using seccomp. Once seccomp is
|
|
enabled via prctl, it cannot be disabled and the task is only
|
|
allowed to execute a few safe syscalls defined by each seccomp
|
|
mode.
|
|
|
|
If unsure, say N.
|
|
|
|
config SMP
|
|
bool "Symmetric multi-processing support"
|
|
depends on SYS_SUPPORTS_SMP
|
|
---help---
|
|
This enables support for systems with more than one CPU. If you have
|
|
a system with only one CPU, say N. If you have a system with more
|
|
than one CPU, say Y.
|
|
|
|
If you say N here, the kernel will run on uni- and multiprocessor
|
|
machines, but will use only one CPU of a multiprocessor machine. If
|
|
you say Y here, the kernel will run on many, but not all,
|
|
uniprocessor machines. On a uniprocessor machine, the kernel
|
|
will run faster if you say N here.
|
|
|
|
People using multiprocessor machines who say Y here should also say
|
|
Y to "Enhanced Real Time Clock Support", below.
|
|
|
|
See also <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO
|
|
available at <http://www.tldp.org/docs.html#howto>.
|
|
|
|
If you don't know what to do here, say N.
|
|
|
|
config NR_CPUS
|
|
int "Maximum number of CPUs (2-32)"
|
|
range 2 32
|
|
depends on SMP
|
|
default "4" if CPU_SUBTYPE_SHX3
|
|
default "2"
|
|
help
|
|
This allows you to specify the maximum number of CPUs which this
|
|
kernel will support. The maximum supported value is 32 and the
|
|
minimum value which makes sense is 2.
|
|
|
|
This is purely to save memory - each supported CPU adds
|
|
approximately eight kilobytes to the kernel image.
|
|
|
|
config HOTPLUG_CPU
|
|
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
|
depends on SMP
|
|
help
|
|
Say Y here to experiment with turning CPUs off and on. CPUs
|
|
can be controlled through /sys/devices/system/cpu.
|
|
|
|
source "kernel/Kconfig.preempt"
|
|
|
|
config GUSA
|
|
def_bool y
|
|
depends on !SMP && SUPERH32
|
|
help
|
|
This enables support for gUSA (general UserSpace Atomicity).
|
|
This is the default implementation for both UP and non-ll/sc
|
|
CPUs, and is used by the libc, amongst others.
|
|
|
|
For additional information, design information can be found
|
|
in <http://lc.linux.or.jp/lc2002/papers/niibe0919p.pdf>.
|
|
|
|
This should only be disabled for special cases where alternate
|
|
atomicity implementations exist.
|
|
|
|
config GUSA_RB
|
|
bool "Implement atomic operations by roll-back (gRB) (EXPERIMENTAL)"
|
|
depends on GUSA && CPU_SH3 || (CPU_SH4 && !CPU_SH4A)
|
|
help
|
|
Enabling this option will allow the kernel to implement some
|
|
atomic operations using a software implementation of load-locked/
|
|
store-conditional (LLSC). On machines which do not have hardware
|
|
LLSC, this should be more efficient than the other alternative of
|
|
disabling interrupts around the atomic sequence.
|
|
|
|
config HW_PERF_EVENTS
|
|
bool "Enable hardware performance counter support for perf events"
|
|
depends on PERF_EVENTS && CPU_HAS_PMU
|
|
default y
|
|
help
|
|
Enable hardware performance counter support for perf events. If
|
|
disabled, perf events will use software events only.
|
|
|
|
source "drivers/sh/Kconfig"
|
|
|
|
endmenu
|
|
|
|
menu "Boot options"
|
|
|
|
config ZERO_PAGE_OFFSET
|
|
hex
|
|
default "0x00010000" if PAGE_SIZE_64KB || SH_RTS7751R2D || \
|
|
SH_7751_SOLUTION_ENGINE
|
|
default "0x00004000" if PAGE_SIZE_16KB || SH_SH03
|
|
default "0x00002000" if PAGE_SIZE_8KB
|
|
default "0x00001000"
|
|
help
|
|
This sets the default offset of zero page.
|
|
|
|
config BOOT_LINK_OFFSET
|
|
hex
|
|
default "0x00210000" if SH_SHMIN
|
|
default "0x00400000" if SH_CAYMAN
|
|
default "0x00810000" if SH_7780_SOLUTION_ENGINE
|
|
default "0x009e0000" if SH_TITAN
|
|
default "0x01800000" if SH_SDK7780
|
|
default "0x02000000" if SH_EDOSK7760
|
|
default "0x00800000"
|
|
help
|
|
This option allows you to set the link address offset of the zImage.
|
|
This can be useful if you are on a board which has a small amount of
|
|
memory.
|
|
|
|
config ENTRY_OFFSET
|
|
hex
|
|
default "0x00001000" if PAGE_SIZE_4KB
|
|
default "0x00002000" if PAGE_SIZE_8KB
|
|
default "0x00004000" if PAGE_SIZE_16KB
|
|
default "0x00010000" if PAGE_SIZE_64KB
|
|
default "0x00000000"
|
|
|
|
config ROMIMAGE_MMCIF
|
|
bool "Include MMCIF loader in romImage (EXPERIMENTAL)"
|
|
depends on CPU_SUBTYPE_SH7724
|
|
help
|
|
Say Y here to include experimental MMCIF loading code in
|
|
romImage. With this enabled it is possible to write the romImage
|
|
kernel image to an MMC card and boot the kernel straight from
|
|
the reset vector. At reset the processor Mask ROM will load the
|
|
first part of the romImage which in turn loads the rest the kernel
|
|
image to RAM using the MMCIF hardware block.
|
|
|
|
choice
|
|
prompt "Kernel command line"
|
|
optional
|
|
default CMDLINE_OVERWRITE
|
|
help
|
|
Setting this option allows the kernel command line arguments
|
|
to be set.
|
|
|
|
config CMDLINE_OVERWRITE
|
|
bool "Overwrite bootloader kernel arguments"
|
|
help
|
|
Given string will overwrite any arguments passed in by
|
|
a bootloader.
|
|
|
|
config CMDLINE_EXTEND
|
|
bool "Extend bootloader kernel arguments"
|
|
help
|
|
Given string will be concatenated with arguments passed in
|
|
by a bootloader.
|
|
|
|
endchoice
|
|
|
|
config CMDLINE
|
|
string "Kernel command line arguments string"
|
|
depends on CMDLINE_OVERWRITE || CMDLINE_EXTEND
|
|
default "console=ttySC1,115200"
|
|
|
|
endmenu
|
|
|
|
menu "Bus options"
|
|
|
|
config SUPERHYWAY
|
|
tristate "SuperHyway Bus support"
|
|
depends on CPU_SUBTYPE_SH4_202
|
|
|
|
config MAPLE
|
|
bool "Maple Bus support"
|
|
depends on SH_DREAMCAST
|
|
help
|
|
The Maple Bus is SEGA's serial communication bus for peripherals
|
|
on the Dreamcast. Without this bus support you won't be able to
|
|
get your Dreamcast keyboard etc to work, so most users
|
|
probably want to say 'Y' here, unless you are only using the
|
|
Dreamcast with a serial line terminal or a remote network
|
|
connection.
|
|
|
|
config PCI
|
|
bool "PCI support"
|
|
depends on SYS_SUPPORTS_PCI
|
|
select PCI_DOMAINS
|
|
select GENERIC_PCI_IOMAP
|
|
select NO_GENERIC_PCI_IOPORT_MAP
|
|
help
|
|
Find out whether you have a PCI motherboard. PCI is the name of a
|
|
bus system, i.e. the way the CPU talks to the other stuff inside
|
|
your box. If you have PCI, say Y, otherwise N.
|
|
|
|
config PCI_DOMAINS
|
|
bool
|
|
|
|
source "drivers/pci/Kconfig"
|
|
|
|
source "drivers/pcmcia/Kconfig"
|
|
|
|
endmenu
|
|
|
|
menu "Executable file formats"
|
|
|
|
source "fs/Kconfig.binfmt"
|
|
|
|
endmenu
|
|
|
|
menu "Power management options (EXPERIMENTAL)"
|
|
|
|
source "kernel/power/Kconfig"
|
|
|
|
source "drivers/cpuidle/Kconfig"
|
|
|
|
endmenu
|
|
|
|
source "net/Kconfig"
|
|
|
|
source "drivers/Kconfig"
|
|
|
|
source "fs/Kconfig"
|
|
|
|
source "arch/sh/Kconfig.debug"
|
|
|
|
source "security/Kconfig"
|
|
|
|
source "crypto/Kconfig"
|
|
|
|
source "lib/Kconfig"
|