Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755976AbbFRRTv (ORCPT ); Thu, 18 Jun 2015 13:19:51 -0400 Received: from mail-ig0-f175.google.com ([209.85.213.175]:37835 "EHLO mail-ig0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754101AbbFRRTV (ORCPT ); Thu, 18 Jun 2015 13:19:21 -0400 Date: Thu, 18 Jun 2015 10:19:19 -0700 (PDT) To: Greg Kroah-Hartman , Jiri Slaby , Andrew Morton , Geert Uytterhoeven , Kevin Hilman , "Rafael J. Wysocki" , Vivek Goyal , "Steven Rostedt (Red Hat)" , "Kirill A. Shutemov" , Riku Voipio , Jiri Kosina , Paul Bolle , Ingo Molnar , Peter Zijlstra , Davidlohr Bueso , Richard Weinberger , Zhigang Lu , Vineet Gupta , Richard Kuo , Max Filippov , Pranith Kumar , linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, ysato@users.sourceforge.jp Message-Id: <1434647946.861922@landley.net> From: Rob Landley In-Reply-To: <1434647946.861556@landley.net> Subject: [PATCH 2/2] Changes to existing files for 0PF FPGA board. Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 13664 Lines: 438 Changes to existing files to add 0pf j2 board support. diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 50057fe..c121a92 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -66,7 +66,7 @@ config SUPERH32 select HAVE_MIXED_BREAKPOINTS_REGS select PERF_EVENTS select ARCH_HIBERNATION_POSSIBLE if MMU - select SPARSE_IRQ + select SPARSE_IRQ if !CPU_SUBTYPE_0PF select HAVE_CC_STACKPROTECTOR config SUPERH64 @@ -108,6 +108,9 @@ config ARCH_SUSPEND_POSSIBLE config ARCH_HIBERNATION_POSSIBLE def_bool n +config ARCH_USES_GETTIMEOFFSET + def_bool n + config SYS_SUPPORTS_APM_EMULATION bool select ARCH_SUSPEND_POSSIBLE @@ -184,6 +187,11 @@ config CPU_SH2A select CPU_SH2 select UNCACHED_MAPPING +config CPU_SH2J + bool + select CPU_SH2 + select ARCH_USES_GETTIMEOFFSET + config CPU_SH3 bool select CPU_HAS_INTEVT @@ -303,6 +311,12 @@ config CPU_SUBTYPE_MXG help Select MX-G if running on an R8A03022BG part. +# SH-2J Processor Support + +config CPU_SUBTYPE_0PF + bool "Support 0PF J2 SoftCore" + select CPU_SH2J + # SH-3 Processor Support config CPU_SUBTYPE_SH7705 @@ -753,6 +767,7 @@ config ZERO_PAGE_OFFSET SH_7751_SOLUTION_ENGINE default "0x00004000" if PAGE_SIZE_16KB || SH_SH03 default "0x00002000" if PAGE_SIZE_8KB + default "0x0003F000" if CPU_SUBTYPE_0PF default "0x00001000" help This sets the default offset of zero page. diff --git a/arch/sh/Makefile b/arch/sh/Makefile index bf5b3f5..e609157 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile @@ -4,6 +4,7 @@ # Copyright (C) 1999 Kaz Kojima # Copyright (C) 2002 - 2008 Paul Mundt # Copyright (C) 2002 M. R. Brown +# Copyright (C) 2012 SEI, Inc. (sh2j) # # 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 @@ -19,6 +20,7 @@ isa-y := any isa-$(CONFIG_SH_DSP) := sh isa-$(CONFIG_CPU_SH2) := sh2 isa-$(CONFIG_CPU_SH2A) := sh2a +isa-$(CONFIG_CPU_SH2J) := sh2j isa-$(CONFIG_CPU_SH3) := sh3 isa-$(CONFIG_CPU_SH4) := sh4 isa-$(CONFIG_CPU_SH4A) := sh4a @@ -31,6 +33,7 @@ isa-y := $(isa-y)-up endif cflags-$(CONFIG_CPU_SH2) := $(call cc-option,-m2,) +cflags-$(CONFIG_CPU_SH2J) := $(call cc-option,-m2,) cflags-$(CONFIG_CPU_SH2A) += $(call cc-option,-m2a,) \ $(call cc-option,-m2a-nofpu,) \ $(call cc-option,-m4-nofpu,) @@ -91,6 +94,7 @@ defaultimage-$(CONFIG_SH_SH7757LCR) := uImage defaultimage-$(CONFIG_SH_7724_SOLUTION_ENGINE) := uImage defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux +defaultimage-$(CONFIG_SH_0PF) := vmlinux # Set some sensible Kbuild defaults KBUILD_IMAGE := $(defaultimage-y) @@ -173,6 +177,7 @@ core-$(CONFIG_HD6446X_SERIES) += arch/sh/cchips/hd6446x/ # As an example, in order of preference, SH-2A > SH-2 > common definitions. # cpuincdir-$(CONFIG_CPU_SH2A) += cpu-sh2a +cpuincdir-$(CONFIG_CPU_SH2J) += cpu-sh2j cpuincdir-$(CONFIG_CPU_SH2) += cpu-sh2 cpuincdir-$(CONFIG_CPU_SH3) += cpu-sh3 cpuincdir-$(CONFIG_CPU_SH4A) += cpu-sh4a diff --git a/arch/sh/boards/Kconfig b/arch/sh/boards/Kconfig index 89963d13..c6721d2 100644 --- a/arch/sh/boards/Kconfig +++ b/arch/sh/boards/Kconfig @@ -90,6 +90,13 @@ config SH_7343_SOLUTION_ENGINE Select 7343 SolutionEngine if configuring for a Hitachi SH7343 (SH-Mobile 3AS) evaluation board. +config 0PF_FPGA + bool "0PF FPGA" + depends on CPU_SUBTYPE_0PF + help + Select 0PF_FPGA if you are configuring for an FPGA with + the SH2j-workalike SoftCore from http://0pf.org + config SH_HP6XX bool "HP6XX" select SYS_SUPPORTS_APM_EMULATION diff --git a/arch/sh/boards/Makefile b/arch/sh/boards/Makefile index 975a0f6..51a7eb3 100644 --- a/arch/sh/boards/Makefile +++ b/arch/sh/boards/Makefile @@ -15,3 +15,4 @@ obj-$(CONFIG_SH_TITAN) += board-titan.o obj-$(CONFIG_SH_SH7757LCR) += board-sh7757lcr.o obj-$(CONFIG_SH_APSH4A3A) += board-apsh4a3a.o obj-$(CONFIG_SH_APSH4AD0A) += board-apsh4ad0a.o +obj-$(CONFIG_0PF_FPGA) += board-0pf.o diff --git a/arch/sh/include/asm/processor.h b/arch/sh/include/asm/processor.h index 1506897..aedabf2 100644 --- a/arch/sh/include/asm/processor.h +++ b/arch/sh/include/asm/processor.h @@ -15,7 +15,7 @@ */ enum cpu_type { /* SH-2 types */ - CPU_SH7619, + CPU_SH7619, CPU_0PF, /* SH-2A types */ CPU_SH7201, CPU_SH7203, CPU_SH7206, CPU_SH7263, CPU_SH7264, CPU_SH7269, diff --git a/arch/sh/include/cpu-sh2/cpu/cache.h b/arch/sh/include/cpu-sh2/cpu/cache.h index aa1b2b9..1da5abb 100644 --- a/arch/sh/include/cpu-sh2/cpu/cache.h +++ b/arch/sh/include/cpu-sh2/cpu/cache.h @@ -38,6 +38,10 @@ #define CCR_CACHE_INVALIDATE CCR_CACHE_CF #define CACHE_PHYSADDR_MASK 0x1ffffc00 +#elif defined(CONFIG_CPU_SUBTYPE_0PF) +#define CCR 0xabcd00c0 +#define CCR_CACHE_ENABLE 0x80000000 +#define CCR_CACHE_RESET 0x101 #endif #endif /* __ASM_CPU_SH2_CACHE_H */ diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index 0d7360d..cda35ce 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c @@ -106,7 +106,7 @@ void __attribute__ ((weak)) l2_cache_init(void) /* * Generic first-level cache init */ -#ifdef CONFIG_SUPERH32 +#if defined(CONFIG_SUPERH32) && !defined(CONFIG_CPU_SUBTYPE_0PF) static void cache_init(void) { unsigned long ccr, flags; diff --git a/arch/sh/kernel/cpu/proc.c b/arch/sh/kernel/cpu/proc.c index 9e6624c..4381fc2 100644 --- a/arch/sh/kernel/cpu/proc.c +++ b/arch/sh/kernel/cpu/proc.c @@ -26,6 +26,7 @@ static const char *cpu_name[] = { [CPU_SH5_101] = "SH5-101", [CPU_SH5_103] = "SH5-103", [CPU_MXG] = "MX-G", [CPU_SH7723] = "SH7723", [CPU_SH7366] = "SH7366", [CPU_SH7724] = "SH7724", + [CPU_0PF] = "SH2J-0PF", [CPU_SH7372] = "SH7372", [CPU_SH7734] = "SH7734", [CPU_SH_NONE] = "Unknown" }; diff --git a/arch/sh/kernel/cpu/sh2/Makefile b/arch/sh/kernel/cpu/sh2/Makefile index f0f059a..7502611 100644 --- a/arch/sh/kernel/cpu/sh2/Makefile +++ b/arch/sh/kernel/cpu/sh2/Makefile @@ -5,3 +5,4 @@ obj-y := ex.o probe.o entry.o obj-$(CONFIG_CPU_SUBTYPE_SH7619) += setup-sh7619.o clock-sh7619.o +obj-$(CONFIG_CPU_SUBTYPE_0PF) += setup-0pf.o clock-0pf.o diff --git a/arch/sh/kernel/cpu/sh2/entry.S b/arch/sh/kernel/cpu/sh2/entry.S index c8a4331..3c997c9 100644 --- a/arch/sh/kernel/cpu/sh2/entry.S +++ b/arch/sh/kernel/cpu/sh2/entry.S @@ -3,6 +3,7 @@ * * The SH-2 exception entry * + * Copyright (C) 2012 SEI,Inc. * Copyright (C) 2005-2008 Yoshinori Sato * Copyright (C) 2005 AXE,Inc. * @@ -147,7 +148,11 @@ ENTRY(exception_handler) mov #32,r8 cmp/hs r8,r9 bt trap_entry ! 64 > vec >= 32 is trap - +#if defined(CONFIG_CPU_SUBTYPE_0PF) + mov #16,r8 + cmp/hs r8,r9 + bt interrupt_entry ! 32 > vec >= 16 is interrupt +#endif mov.l 4f,r8 mov r9,r4 shll2 r9 @@ -245,6 +250,19 @@ ENTRY(address_error_trap_handler) .align 2 1: .long do_address_error +#if defined(CONFIG_CPU_SUBTYPE_0PF) +ENTRY(pc_address_error_trap_handler) + mov r15,r4 ! regs + mov #OFF_PC,r0 + mov.l @(r0,r15),r6 ! pc + mov.l 1f,r0 + jmp @r0 + mov #0,r5 ! writeaccess is unknown + + .align 2 +1: .long do_pc_address_error +#endif // CONFIG_CPU_SUBTYPE_0PF + restore_all: stc sr,r0 or #0xf0,r0 diff --git a/arch/sh/kernel/cpu/sh2/probe.c b/arch/sh/kernel/cpu/sh2/probe.c index 6c687ae..9c9e401 100644 --- a/arch/sh/kernel/cpu/sh2/probe.c +++ b/arch/sh/kernel/cpu/sh2/probe.c @@ -24,6 +24,12 @@ void cpu_probe(void) boot_cpu_data.dcache.linesz = L1_CACHE_BYTES; boot_cpu_data.dcache.flags = 0; #endif + +#if defined(CONFIG_CPU_SUBTYPE_0PF) + boot_cpu_data.type = CPU_0PF; + boot_cpu_data.dcache.flags = 0; +#endif + /* * SH-2 doesn't have separate caches */ diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index eb10ff8..7de9bcb 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c @@ -20,6 +20,8 @@ #include #include +#include + atomic_t irq_err_count; /* @@ -175,11 +177,24 @@ void do_softirq_own_stack(void) ); } #else +#define noinline __attribute__((noinline)) +static noinline void handle_irq_UART0(unsigned int irq) { generic_handle_irq(irq); } +static noinline void handle_irq_UART1(unsigned int irq) { generic_handle_irq(irq); } +static noinline void handle_irq_GPS(unsigned int irq) { generic_handle_irq(irq); } +static noinline void handle_irq_EMAC(unsigned int irq) { generic_handle_irq(irq); } static inline void handle_one_irq(unsigned int irq) { - generic_handle_irq(irq); + switch(irq) { + case Irq_UART0: handle_irq_UART0(irq); break; + case Irq_UART1: handle_irq_UART1(irq); break; + case Irq_GPS: handle_irq_GPS(irq); break; + case Irq_EMAC: handle_irq_EMAC(irq); break; + default: + generic_handle_irq(irq); + break; + } } -#endif +#endif // CONFIG_IRQSTACKS asmlinkage __irq_entry int do_IRQ(unsigned int irq, struct pt_regs *regs) { diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index ff63934..cd09376 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c @@ -34,6 +34,7 @@ #ifdef CONFIG_CPU_SH2 # define TRAP_RESERVED_INST 4 # define TRAP_ILLEGAL_SLOT_INST 6 +# define TRAP_PC_ADDRESS_ERROR 8 // Aug 20, 2012 ulianov - SEI extension - PC governor # define TRAP_ADDRESS_ERROR 9 # ifdef CONFIG_CPU_SH2A # define TRAP_UBC 12 @@ -458,6 +459,14 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, return ret; } +#if defined(CONFIG_CPU_SUBTYPE_0PF) +asmlinkage void do_pc_address_error(struct pt_regs *regs, + unsigned long writeaccess, + unsigned long address) +{ +} +#endif // CONFIG_CPU_SUBTYPE_0PF + /* * Handle various address error exceptions: * - instruction address error: @@ -779,6 +788,9 @@ void __init trap_init(void) #endif #ifdef CONFIG_CPU_SH2 + #if defined(CONFIG_CPU_SUBTYPE_0PF) + set_exception_table_vec(TRAP_PC_ADDRESS_ERROR, address_error_trap_handler); + #endif set_exception_table_vec(TRAP_ADDRESS_ERROR, address_error_trap_handler); #endif #ifdef CONFIG_CPU_SH2A diff --git a/arch/sh/mm/cache-sh2.c b/arch/sh/mm/cache-sh2.c index a74259f..438eadb 100644 --- a/arch/sh/mm/cache-sh2.c +++ b/arch/sh/mm/cache-sh2.c @@ -3,6 +3,7 @@ * * Copyright (C) 2002 Paul Mundt * Copyright (C) 2008 Yoshinori Sato + * Copyright (C) 2012 SEI, Inc. * * Released under the terms of the GNU GPL v2.0. */ @@ -16,6 +17,30 @@ #include #include +#if defined(CONFIG_CPU_SUBTYPE_0PF) + +// Just flush the whole thing each time +static void j2_flush_icache_range(void *fwoosh) +{ + __raw_writel(CCR_CACHE_RESET, CCR); +} + +// This should never happen, but... +static void j2_flush_icache_page(void *fwoosh) +{ + __raw_writel(CCR_CACHE_RESET, CCR); +} + +void __init sh2_cache_init(void) +{ + local_flush_icache_range = j2_flush_icache_range; + local_flush_icache_page = j2_flush_icache_page; + boot_cpu_data.dcache.n_aliases = 0; + + __raw_writel(CCR_CACHE_RESET, CCR); +} + +#else static void sh2__flush_wback_region(void *start, int size) { unsigned long v; @@ -89,3 +114,4 @@ void __init sh2_cache_init(void) __flush_purge_region = sh2__flush_purge_region; __flush_invalidate_region = sh2__flush_invalidate_region; } +#endif diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index f770e39..17908f7 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c @@ -258,14 +258,16 @@ static void __init emit_cache_params(void) boot_cpu_data.icache.entry_mask, boot_cpu_data.icache.alias_mask, boot_cpu_data.icache.n_aliases); - printk(KERN_NOTICE "D-cache : n_ways=%d n_sets=%d way_incr=%d\n", - boot_cpu_data.dcache.ways, - boot_cpu_data.dcache.sets, - boot_cpu_data.dcache.way_incr); - printk(KERN_NOTICE "D-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n", - boot_cpu_data.dcache.entry_mask, - boot_cpu_data.dcache.alias_mask, - boot_cpu_data.dcache.n_aliases); + if (boot_cpu_data.dcache.n_aliases) { + printk(KERN_NOTICE "D-cache : n_ways=%d n_sets=%d way_incr=%d\n", + boot_cpu_data.dcache.ways, + boot_cpu_data.dcache.sets, + boot_cpu_data.dcache.way_incr); + printk(KERN_NOTICE "D-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n", + boot_cpu_data.dcache.entry_mask, + boot_cpu_data.dcache.alias_mask, + boot_cpu_data.dcache.n_aliases); + } /* * Emit Secondary Cache parameters if the CPU has a probed L2. diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index f8120c1b..aae8d72 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -594,7 +594,7 @@ config SERIAL_IMX_CONSOLE config SERIAL_UARTLITE tristate "Xilinx uartlite serial port support" - depends on PPC32 || MICROBLAZE || MFD_TIMBERDALE || ARCH_ZYNQ + depends on PPC32 || MICROBLAZE || MFD_TIMBERDALE || ARCH_ZYNQ || CPU_SUBTYPE_0PF select SERIAL_CORE help Say Y here if you want to use the Xilinx uartlite serial controller. @@ -611,6 +611,12 @@ config SERIAL_UARTLITE_CONSOLE console (the system console is the device which receives all kernel messages and warnings and which allows logins in single user mode). +config SERIAL_UARTLITE_0PF + tristate "Support 0PF UARTLITEs" + depends on SERIAL_UARTLITE = y && CPU_SUBTYPE_0PF + help + Say Y here to set up 0PF's UARTLITEs. + config SERIAL_SUNCORE bool depends on SPARC -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/