Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (197 commits) sh: add spi header and r2d platform data V3 sh: update r7780rp interrupt code sh: remove consistent alloc stuff from the machine vector sh: use declared coherent memory for dreamcast pci ethernet adapter sh: declared coherent memory support V2 sh: Add support for SDK7780 board. sh: constify function pointer tables sh: Kill off -traditional for linker script. cdrom: Add support for Sega Dreamcast GD-ROM. sh: Kill off hs7751rvoip reference from arch/sh/Kconfig. sh: Drop r7780rp_defconfig, use r7780mp_defconfig as kbuild default. sh: Kill off dead HS771RVoIP board support. sh: r7785rp: Fix up DECLARE_INTC_DESC() arg mismatch. sh: r7785rp: Hook up the rest of the HL7785 FPGA IRQ vectors. sh: r2d - enable sm501 usb host function sh: remove voyagergx sh: r2d - add lcd planel timings to sm501 platform data sh: Add OHCI and UDC platform devices for SH7720. sh: intc - remove default interrupt priority tables sh: Correct pte size mismatch for X2 TLB. ...
This commit is contained in:
Коммит
e189f3495c
2
Makefile
2
Makefile
|
@ -169,7 +169,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
|
|||
-e s/arm.*/arm/ -e s/sa110/arm/ \
|
||||
-e s/s390x/s390/ -e s/parisc64/parisc/ \
|
||||
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
|
||||
-e s/sh[234].*/sh/ )
|
||||
-e s/sh.*/sh/ )
|
||||
|
||||
# Cross compiling and selecting different set of gcc/bin-utils
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
412
arch/sh/Kconfig
412
arch/sh/Kconfig
|
@ -6,8 +6,7 @@
|
|||
mainmenu "Linux/SuperH Kernel Configuration"
|
||||
|
||||
config SUPERH
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
select EMBEDDED
|
||||
help
|
||||
The SuperH is a RISC processor targeted for use in embedded systems
|
||||
|
@ -15,36 +14,36 @@ config SUPERH
|
|||
gaming console. The SuperH port has a home page at
|
||||
<http://www.linux-sh.org/>.
|
||||
|
||||
config SUPERH32
|
||||
def_bool !SUPERH64
|
||||
|
||||
config SUPERH64
|
||||
def_bool y if CPU_SH5
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config RWSEM_XCHGADD_ALGORITHM
|
||||
bool
|
||||
|
||||
config GENERIC_BUG
|
||||
def_bool y
|
||||
depends on BUG
|
||||
depends on BUG && SUPERH32
|
||||
|
||||
config GENERIC_FIND_NEXT_BIT
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config GENERIC_HWEIGHT
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config GENERIC_HARDIRQS
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config GENERIC_IRQ_PROBE
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config GENERIC_CALIBRATE_DELAY
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config GENERIC_IOMAP
|
||||
bool
|
||||
|
@ -75,20 +74,16 @@ config ARCH_MAY_HAVE_PC_FDC
|
|||
bool
|
||||
|
||||
config STACKTRACE_SUPPORT
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config LOCKDEP_SUPPORT
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
config ARCH_HAS_ILOG2_U32
|
||||
bool
|
||||
default n
|
||||
def_bool n
|
||||
|
||||
config ARCH_HAS_ILOG2_U64
|
||||
bool
|
||||
default n
|
||||
def_bool n
|
||||
|
||||
config ARCH_NO_VIRT_TO_BUS
|
||||
def_bool y
|
||||
|
@ -97,110 +92,234 @@ source "init/Kconfig"
|
|||
|
||||
menu "System type"
|
||||
|
||||
source "arch/sh/mm/Kconfig"
|
||||
#
|
||||
# Processor families
|
||||
#
|
||||
config CPU_SH2
|
||||
bool
|
||||
|
||||
menu "Processor features"
|
||||
config CPU_SH2A
|
||||
bool
|
||||
select CPU_SH2
|
||||
|
||||
config CPU_SH3
|
||||
bool
|
||||
select CPU_HAS_INTEVT
|
||||
select CPU_HAS_SR_RB
|
||||
|
||||
config CPU_SH4
|
||||
bool
|
||||
select CPU_HAS_INTEVT
|
||||
select CPU_HAS_SR_RB
|
||||
select CPU_HAS_PTEA if !CPU_SH4A || CPU_SHX2
|
||||
select CPU_HAS_FPU if !CPU_SH4AL_DSP
|
||||
|
||||
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
|
||||
|
||||
config CPU_SHX2
|
||||
bool
|
||||
|
||||
config CPU_SHX3
|
||||
bool
|
||||
|
||||
choice
|
||||
prompt "Endianess selection"
|
||||
default CPU_LITTLE_ENDIAN
|
||||
prompt "Processor sub-type selection"
|
||||
|
||||
#
|
||||
# Processor subtypes
|
||||
#
|
||||
|
||||
# SH-2 Processor Support
|
||||
|
||||
config CPU_SUBTYPE_SH7619
|
||||
bool "Support SH7619 processor"
|
||||
select CPU_SH2
|
||||
|
||||
# SH-2A Processor Support
|
||||
|
||||
config CPU_SUBTYPE_SH7203
|
||||
bool "Support SH7203 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
|
||||
config CPU_SUBTYPE_SH7206
|
||||
bool "Support SH7206 processor"
|
||||
select CPU_SH2A
|
||||
|
||||
config CPU_SUBTYPE_SH7263
|
||||
bool "Support SH7263 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
|
||||
# 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
|
||||
Some SuperH machines can be configured for either little or big
|
||||
endian byte order. These modes require different kernels.
|
||||
Select SH7706 if you have a 133 Mhz SH-3 HD6417706 CPU.
|
||||
|
||||
config CPU_LITTLE_ENDIAN
|
||||
bool "Little Endian"
|
||||
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_BIG_ENDIAN
|
||||
bool "Big Endian"
|
||||
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
|
||||
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
|
||||
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_SH7763
|
||||
bool "Support SH7763 processor"
|
||||
select CPU_SH4A
|
||||
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
|
||||
|
||||
config CPU_SUBTYPE_SHX3
|
||||
bool "Support SH-X3 processor"
|
||||
select CPU_SH4A
|
||||
select CPU_SHX3
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select SYS_SUPPORTS_NUMA
|
||||
select SYS_SUPPORTS_SMP
|
||||
|
||||
# SH4AL-DSP Processor Support
|
||||
|
||||
config CPU_SUBTYPE_SH7343
|
||||
bool "Support SH7343 processor"
|
||||
select CPU_SH4AL_DSP
|
||||
|
||||
config CPU_SUBTYPE_SH7722
|
||||
bool "Support SH7722 processor"
|
||||
select CPU_SH4AL_DSP
|
||||
select CPU_SHX2
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select SYS_SUPPORTS_NUMA
|
||||
|
||||
# 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"
|
||||
|
||||
endchoice
|
||||
|
||||
config SH_FPU
|
||||
bool "FPU support"
|
||||
depends on CPU_HAS_FPU
|
||||
default y
|
||||
help
|
||||
Selecting this option will enable support for SH processors that
|
||||
have FPU units (ie, SH77xx).
|
||||
|
||||
This option must be set in order to enable the FPU.
|
||||
|
||||
config SH_FPU_EMU
|
||||
bool "FPU emulation support"
|
||||
depends on !SH_FPU && EXPERIMENTAL
|
||||
default n
|
||||
help
|
||||
Selecting this option will enable support for software FPU emulation.
|
||||
Most SH-3 users will want to say Y here, whereas most SH-4 users will
|
||||
want to say N.
|
||||
|
||||
config SH_DSP
|
||||
bool "DSP support"
|
||||
depends on CPU_HAS_DSP
|
||||
default y
|
||||
help
|
||||
Selecting this option will enable support for SH processors that
|
||||
have DSP units (ie, SH2-DSP, SH3-DSP, and SH4AL-DSP).
|
||||
|
||||
This option must be set in order to enable the DSP.
|
||||
|
||||
config SH_ADC
|
||||
bool "ADC support"
|
||||
depends on CPU_SH3
|
||||
default y
|
||||
help
|
||||
Selecting this option will allow the Linux kernel to use SH3 on-chip
|
||||
ADC module.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config SH_STORE_QUEUES
|
||||
bool "Support for Store Queues"
|
||||
depends on CPU_SH4
|
||||
help
|
||||
Selecting this option will enable an in-kernel API for manipulating
|
||||
the store queues integrated in the SH-4 processors.
|
||||
|
||||
config SPECULATIVE_EXECUTION
|
||||
bool "Speculative subroutine return"
|
||||
depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL
|
||||
help
|
||||
This enables support for a speculative instruction fetch for
|
||||
subroutine return. There are various pitfalls associated with
|
||||
this, as outlined in the SH7780 hardware manual.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config CPU_HAS_INTEVT
|
||||
bool
|
||||
|
||||
config CPU_HAS_MASKREG_IRQ
|
||||
bool
|
||||
|
||||
config CPU_HAS_IPR_IRQ
|
||||
bool
|
||||
|
||||
config CPU_HAS_SR_RB
|
||||
bool
|
||||
help
|
||||
This will enable the use of SR.RB register bank usage. Processors
|
||||
that are lacking this bit must have another method in place for
|
||||
accomplishing what is taken care of by the banked registers.
|
||||
|
||||
See <file:Documentation/sh/register-banks.txt> for further
|
||||
information on SR.RB and register banking in the kernel in general.
|
||||
|
||||
config CPU_HAS_PTEA
|
||||
bool
|
||||
|
||||
config CPU_HAS_DSP
|
||||
bool
|
||||
|
||||
config CPU_HAS_FPU
|
||||
bool
|
||||
|
||||
endmenu
|
||||
source "arch/sh/mm/Kconfig"
|
||||
source "arch/sh/Kconfig.cpu"
|
||||
|
||||
menu "Board support"
|
||||
|
||||
|
@ -321,13 +440,6 @@ config SH_SECUREEDGE5410
|
|||
This includes both the OEM SecureEdge products as well as the
|
||||
SME product line.
|
||||
|
||||
config SH_HS7751RVOIP
|
||||
bool "HS7751RVOIP"
|
||||
depends on CPU_SUBTYPE_SH7751R
|
||||
help
|
||||
Select HS7751RVOIP if configuring for a Renesas Technology
|
||||
Sales VoIP board.
|
||||
|
||||
config SH_7710VOIPGW
|
||||
bool "SH7710-VOIP-GW"
|
||||
depends on CPU_SUBTYPE_SH7710
|
||||
|
@ -343,6 +455,14 @@ config SH_RTS7751R2D
|
|||
Select RTS7751R2D if configuring for a Renesas Technology
|
||||
Sales SH-Graphics board.
|
||||
|
||||
config SH_SDK7780
|
||||
bool "SDK7780R3"
|
||||
depends on CPU_SUBTYPE_SH7780
|
||||
select SYS_SUPPORTS_PCI
|
||||
help
|
||||
Select SDK7780 if configuring for a Renesas SH7780 SDK7780R3
|
||||
evaluation board.
|
||||
|
||||
config SH_HIGHLANDER
|
||||
bool "Highlander"
|
||||
depends on CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785
|
||||
|
@ -399,41 +519,47 @@ config SH_MAGIC_PANEL_R2
|
|||
help
|
||||
Select Magic Panel R2 if configuring for Magic Panel R2.
|
||||
|
||||
config SH_CAYMAN
|
||||
bool "Hitachi Cayman"
|
||||
depends on CPU_SUBTYPE_SH5_101 || CPU_SUBTYPE_SH5_103
|
||||
select SYS_SUPPORTS_PCI
|
||||
|
||||
endmenu
|
||||
|
||||
source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
|
||||
source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
|
||||
source "arch/sh/boards/renesas/r7780rp/Kconfig"
|
||||
source "arch/sh/boards/renesas/sdk7780/Kconfig"
|
||||
source "arch/sh/boards/magicpanelr2/Kconfig"
|
||||
|
||||
menu "Timer and clock configuration"
|
||||
|
||||
config SH_TMU
|
||||
bool "TMU timer support"
|
||||
def_bool y
|
||||
prompt "TMU timer support"
|
||||
depends on CPU_SH3 || CPU_SH4
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
default y
|
||||
help
|
||||
This enables the use of the TMU as the system timer.
|
||||
|
||||
config SH_CMT
|
||||
bool "CMT timer support"
|
||||
def_bool y
|
||||
prompt "CMT timer support"
|
||||
depends on CPU_SH2
|
||||
default y
|
||||
help
|
||||
This enables the use of the CMT as the system timer.
|
||||
|
||||
config SH_MTU2
|
||||
bool "MTU2 timer support"
|
||||
def_bool n
|
||||
prompt "MTU2 timer support"
|
||||
depends on CPU_SH2A
|
||||
default n
|
||||
help
|
||||
This enables the use of the MTU2 as the system timer.
|
||||
|
||||
config SH_TIMER_IRQ
|
||||
int
|
||||
default "28" if CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785
|
||||
default "28" if CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \
|
||||
CPU_SUBTYPE_SH7763
|
||||
default "86" if CPU_SUBTYPE_SH7619
|
||||
default "140" if CPU_SUBTYPE_SH7206
|
||||
default "16"
|
||||
|
@ -445,7 +571,8 @@ config SH_PCLK_FREQ
|
|||
default "32000000" if CPU_SUBTYPE_SH7722
|
||||
default "33333333" if CPU_SUBTYPE_SH7770 || \
|
||||
CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7705 || \
|
||||
CPU_SUBTYPE_SH7206
|
||||
CPU_SUBTYPE_SH7203 || CPU_SUBTYPE_SH7206 || \
|
||||
CPU_SUBTYPE_SH7263
|
||||
default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R
|
||||
default "66000000" if CPU_SUBTYPE_SH4_202
|
||||
default "50000000"
|
||||
|
@ -456,7 +583,7 @@ config SH_PCLK_FREQ
|
|||
|
||||
config SH_CLK_MD
|
||||
int "CPU Mode Pin Setting"
|
||||
depends on CPU_SUBTYPE_SH7619 || CPU_SUBTYPE_SH7206
|
||||
depends on CPU_SH2
|
||||
default 6 if CPU_SUBTYPE_SH7206
|
||||
default 5 if CPU_SUBTYPE_SH7619
|
||||
default 0
|
||||
|
@ -490,9 +617,8 @@ source "arch/sh/drivers/Kconfig"
|
|||
endmenu
|
||||
|
||||
config ISA_DMA_API
|
||||
bool
|
||||
def_bool y
|
||||
depends on SH_MPC1211
|
||||
default y
|
||||
|
||||
menu "Kernel features"
|
||||
|
||||
|
@ -570,7 +696,7 @@ source "kernel/Kconfig.preempt"
|
|||
|
||||
config GUSA
|
||||
def_bool y
|
||||
depends on !SMP
|
||||
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
|
||||
|
@ -582,6 +708,16 @@ config GUSA
|
|||
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 implemention 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 insterrupts around the atomic sequence.
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Boot options"
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
menu "Processor features"
|
||||
|
||||
choice
|
||||
prompt "Endianess selection"
|
||||
default CPU_LITTLE_ENDIAN
|
||||
help
|
||||
Some SuperH machines can be configured for either little or big
|
||||
endian byte order. These modes require different kernels.
|
||||
|
||||
config CPU_LITTLE_ENDIAN
|
||||
bool "Little Endian"
|
||||
|
||||
config CPU_BIG_ENDIAN
|
||||
bool "Big Endian"
|
||||
|
||||
endchoice
|
||||
|
||||
config SH_FPU
|
||||
def_bool y
|
||||
prompt "FPU support"
|
||||
depends on CPU_HAS_FPU
|
||||
help
|
||||
Selecting this option will enable support for SH processors that
|
||||
have FPU units (ie, SH77xx).
|
||||
|
||||
This option must be set in order to enable the FPU.
|
||||
|
||||
config SH64_FPU_DENORM_FLUSH
|
||||
bool "Flush floating point denorms to zero"
|
||||
depends on SH_FPU && SUPERH64
|
||||
|
||||
config SH_FPU_EMU
|
||||
def_bool n
|
||||
prompt "FPU emulation support"
|
||||
depends on !SH_FPU && EXPERIMENTAL
|
||||
help
|
||||
Selecting this option will enable support for software FPU emulation.
|
||||
Most SH-3 users will want to say Y here, whereas most SH-4 users will
|
||||
want to say N.
|
||||
|
||||
config SH_DSP
|
||||
def_bool y
|
||||
prompt "DSP support"
|
||||
depends on CPU_HAS_DSP
|
||||
help
|
||||
Selecting this option will enable support for SH processors that
|
||||
have DSP units (ie, SH2-DSP, SH3-DSP, and SH4AL-DSP).
|
||||
|
||||
This option must be set in order to enable the DSP.
|
||||
|
||||
config SH_ADC
|
||||
def_bool y
|
||||
prompt "ADC support"
|
||||
depends on CPU_SH3
|
||||
help
|
||||
Selecting this option will allow the Linux kernel to use SH3 on-chip
|
||||
ADC module.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config SH_STORE_QUEUES
|
||||
bool "Support for Store Queues"
|
||||
depends on CPU_SH4
|
||||
help
|
||||
Selecting this option will enable an in-kernel API for manipulating
|
||||
the store queues integrated in the SH-4 processors.
|
||||
|
||||
config SPECULATIVE_EXECUTION
|
||||
bool "Speculative subroutine return"
|
||||
depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL
|
||||
help
|
||||
This enables support for a speculative instruction fetch for
|
||||
subroutine return. There are various pitfalls associated with
|
||||
this, as outlined in the SH7780 hardware manual.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config SH64_USER_MISALIGNED_FIXUP
|
||||
def_bool y
|
||||
prompt "Fixup misaligned loads/stores occurring in user mode"
|
||||
depends on SUPERH64
|
||||
|
||||
config SH64_ID2815_WORKAROUND
|
||||
bool "Include workaround for SH5-101 cut2 silicon defect ID2815"
|
||||
depends on CPU_SUBTYPE_SH5_101
|
||||
|
||||
config CPU_HAS_INTEVT
|
||||
bool
|
||||
|
||||
config CPU_HAS_MASKREG_IRQ
|
||||
bool
|
||||
|
||||
config CPU_HAS_IPR_IRQ
|
||||
bool
|
||||
|
||||
config CPU_HAS_SR_RB
|
||||
bool
|
||||
help
|
||||
This will enable the use of SR.RB register bank usage. Processors
|
||||
that are lacking this bit must have another method in place for
|
||||
accomplishing what is taken care of by the banked registers.
|
||||
|
||||
See <file:Documentation/sh/register-banks.txt> for further
|
||||
information on SR.RB and register banking in the kernel in general.
|
||||
|
||||
config CPU_HAS_PTEA
|
||||
bool
|
||||
|
||||
config CPU_HAS_DSP
|
||||
bool
|
||||
|
||||
config CPU_HAS_FPU
|
||||
bool
|
||||
|
||||
endmenu
|
|
@ -1,8 +1,7 @@
|
|||
menu "Kernel hacking"
|
||||
|
||||
config TRACE_IRQFLAGS_SUPPORT
|
||||
bool
|
||||
default y
|
||||
def_bool y
|
||||
|
||||
source "lib/Kconfig.debug"
|
||||
|
||||
|
@ -30,12 +29,13 @@ config EARLY_SCIF_CONSOLE
|
|||
config EARLY_SCIF_CONSOLE_PORT
|
||||
hex
|
||||
depends on EARLY_SCIF_CONSOLE
|
||||
default "0xffe00000" if CPU_SUBTYPE_SH7780
|
||||
default "0xffe00000" if CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7763
|
||||
default "0xffea0000" if CPU_SUBTYPE_SH7785
|
||||
default "0xfffe9800" if CPU_SUBTYPE_SH7206
|
||||
default "0xfffe8000" if CPU_SUBTYPE_SH7203
|
||||
default "0xfffe9800" if CPU_SUBTYPE_SH7206 || CPU_SUBTYPE_SH7263
|
||||
default "0xf8420000" if CPU_SUBTYPE_SH7619
|
||||
default "0xa4400000" if CPU_SUBTYPE_SH7712 || CPU_SUBTYPE_SH7705
|
||||
default "0xa4430000" if CPU_SUBTYPE_SH7720
|
||||
default "0xa4430000" if CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721
|
||||
default "0xffc30000" if CPU_SUBTYPE_SHX3
|
||||
default "0xffe80000" if CPU_SH4
|
||||
default "0x00000000"
|
||||
|
@ -62,7 +62,7 @@ config DEBUG_BOOTMEM
|
|||
|
||||
config DEBUG_STACKOVERFLOW
|
||||
bool "Check for stack overflows"
|
||||
depends on DEBUG_KERNEL
|
||||
depends on DEBUG_KERNEL && SUPERH32
|
||||
help
|
||||
This option will cause messages to be printed if free stack space
|
||||
drops below a certain limit.
|
||||
|
@ -88,7 +88,7 @@ config 4KSTACKS
|
|||
|
||||
config IRQSTACKS
|
||||
bool "Use separate kernel stacks when processing interrupts"
|
||||
depends on DEBUG_KERNEL
|
||||
depends on DEBUG_KERNEL && SUPERH32
|
||||
help
|
||||
If you say Y here the kernel will use separate kernel stacks
|
||||
for handling hard and soft interrupts. This can help avoid
|
||||
|
@ -119,19 +119,19 @@ config COMPILE_OPTIONS
|
|||
depends on MORE_COMPILE_OPTIONS
|
||||
|
||||
config KGDB_NMI
|
||||
bool "Enter KGDB on NMI"
|
||||
default n
|
||||
def_bool n
|
||||
prompt "Enter KGDB on NMI"
|
||||
|
||||
config SH_KGDB_CONSOLE
|
||||
bool "Console messages through GDB"
|
||||
def_bool n
|
||||
prompt "Console messages through GDB"
|
||||
depends on !SERIAL_SH_SCI_CONSOLE && SERIAL_SH_SCI=y
|
||||
select SERIAL_CORE_CONSOLE
|
||||
default n
|
||||
|
||||
config KGDB_SYSRQ
|
||||
bool "Allow SysRq 'G' to enter KGDB"
|
||||
def_bool y
|
||||
prompt "Allow SysRq 'G' to enter KGDB"
|
||||
depends on MAGIC_SYSRQ
|
||||
default y
|
||||
|
||||
comment "Serial port setup"
|
||||
|
||||
|
@ -174,4 +174,29 @@ endchoice
|
|||
|
||||
endmenu
|
||||
|
||||
if SUPERH64
|
||||
|
||||
config SH64_PROC_ASIDS
|
||||
bool "Debug: report ASIDs through /proc/asids"
|
||||
depends on PROC_FS
|
||||
|
||||
config SH64_SR_WATCH
|
||||
bool "Debug: set SR.WATCH to enable hardware watchpoints and trace"
|
||||
|
||||
config POOR_MANS_STRACE
|
||||
bool "Debug: enable rudimentary strace facility"
|
||||
help
|
||||
This option allows system calls to be traced to the console. It also
|
||||
aids in detecting kernel stack underflow. It is useful for debugging
|
||||
early-userland problems (e.g. init incurring fatal exceptions.)
|
||||
|
||||
config SH_ALPHANUMERIC
|
||||
bool "Enable debug outputs to on-board alphanumeric display"
|
||||
depends on SH_CAYMAN
|
||||
|
||||
config SH_NO_BSS_INIT
|
||||
bool "Avoid zeroing BSS (to speed-up startup on suitable platforms)"
|
||||
|
||||
endif
|
||||
|
||||
endmenu
|
||||
|
|
103
arch/sh/Makefile
103
arch/sh/Makefile
|
@ -1,17 +1,13 @@
|
|||
# $Id: Makefile,v 1.35 2004/04/15 03:39:20 sugioka Exp $
|
||||
#
|
||||
# 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.
|
||||
# arch/sh/Makefile
|
||||
#
|
||||
# Copyright (C) 1999 Kaz Kojima
|
||||
# Copyright (C) 2002, 2003, 2004 Paul Mundt
|
||||
# Copyright (C) 2002 M. R. Brown
|
||||
#
|
||||
# This file is included by the global makefile so that you can add your own
|
||||
# architecture-specific flags and dependencies. Remember to do have actions
|
||||
# for "archclean" and "archdep" for cleaning up and making dependencies for
|
||||
# this architecture
|
||||
# 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.
|
||||
#
|
||||
isa-y := any
|
||||
isa-$(CONFIG_SH_DSP) := sh
|
||||
|
@ -21,13 +17,9 @@ isa-$(CONFIG_CPU_SH3) := sh3
|
|||
isa-$(CONFIG_CPU_SH4) := sh4
|
||||
isa-$(CONFIG_CPU_SH4A) := sh4a
|
||||
isa-$(CONFIG_CPU_SH4AL_DSP) := sh4al
|
||||
|
||||
isa-$(CONFIG_CPU_SH5) := shmedia
|
||||
isa-$(CONFIG_SH_DSP) := $(isa-y)-dsp
|
||||
|
||||
ifndef CONFIG_MMU
|
||||
isa-y := $(isa-y)-nommu
|
||||
endif
|
||||
|
||||
ifndef CONFIG_SH_DSP
|
||||
ifndef CONFIG_SH_FPU
|
||||
isa-y := $(isa-y)-nofpu
|
||||
|
@ -44,6 +36,7 @@ cflags-$(CONFIG_CPU_SH4) := $(call cc-option,-m4,) \
|
|||
$(call cc-option,-mno-implicit-fp,-m4-nofpu)
|
||||
cflags-$(CONFIG_CPU_SH4A) += $(call cc-option,-m4a,) \
|
||||
$(call cc-option,-m4a-nofpu,)
|
||||
cflags-$(CONFIG_CPU_SH5) := $(call cc-option,-m5-32media-nofpu,)
|
||||
|
||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mb
|
||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -ml
|
||||
|
@ -66,22 +59,27 @@ cflags-y += $(isaflags-y) -ffreestanding
|
|||
cflags-$(CONFIG_MORE_COMPILE_OPTIONS) += \
|
||||
$(shell echo $(CONFIG_COMPILE_OPTIONS) | sed -e 's/"//g')
|
||||
|
||||
OBJCOPYFLAGS := -O binary -R .note -R .note.gnu.build-id -R .comment -R .stab -R .stabstr -S
|
||||
OBJCOPYFLAGS := -O binary -R .note -R .note.gnu.build-id -R .comment \
|
||||
-R .stab -R .stabstr -S
|
||||
|
||||
#
|
||||
# arch/sh/defconfig doesn't reflect any real hardware, and as such should
|
||||
# never be used by anyone. Use a board-specific defconfig that has a
|
||||
# reasonable chance of being current instead.
|
||||
#
|
||||
KBUILD_DEFCONFIG := r7780rp_defconfig
|
||||
# Give the various platforms the opportunity to set default image types
|
||||
defaultimage-$(CONFIG_SUPERH32) := zImage
|
||||
|
||||
KBUILD_IMAGE := arch/sh/boot/zImage
|
||||
# Set some sensible Kbuild defaults
|
||||
KBUILD_DEFCONFIG := r7780mp_defconfig
|
||||
KBUILD_IMAGE := $(defaultimage-y)
|
||||
|
||||
#
|
||||
# Choosing incompatible machines durings configuration will result in
|
||||
# error messages during linking.
|
||||
#
|
||||
LDFLAGS_vmlinux += -e _stext
|
||||
ifdef CONFIG_SUPERH32
|
||||
LDFLAGS_vmlinux += -e _stext
|
||||
else
|
||||
LDFLAGS_vmlinux += --defsym phys_stext=_stext-$(CONFIG_PAGE_OFFSET) \
|
||||
--defsym phys_stext_shmedia=phys_stext+1 \
|
||||
-e phys_stext_shmedia
|
||||
endif
|
||||
|
||||
ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
LDFLAGS_vmlinux += --defsym 'jiffies=jiffies_64'
|
||||
|
@ -94,7 +92,9 @@ endif
|
|||
KBUILD_CFLAGS += -pipe $(cflags-y)
|
||||
KBUILD_AFLAGS += $(cflags-y)
|
||||
|
||||
head-y := arch/sh/kernel/head.o arch/sh/kernel/init_task.o
|
||||
head-y := arch/sh/kernel/init_task.o
|
||||
head-$(CONFIG_SUPERH32) += arch/sh/kernel/head_32.o
|
||||
head-$(CONFIG_SUPERH64) += arch/sh/kernel/head_64.o
|
||||
|
||||
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
||||
|
||||
|
@ -112,11 +112,11 @@ machdir-$(CONFIG_SH_DREAMCAST) += dreamcast
|
|||
machdir-$(CONFIG_SH_MPC1211) += mpc1211
|
||||
machdir-$(CONFIG_SH_SH03) += sh03
|
||||
machdir-$(CONFIG_SH_SECUREEDGE5410) += snapgear
|
||||
machdir-$(CONFIG_SH_HS7751RVOIP) += renesas/hs7751rvoip
|
||||
machdir-$(CONFIG_SH_RTS7751R2D) += renesas/rts7751r2d
|
||||
machdir-$(CONFIG_SH_7751_SYSTEMH) += renesas/systemh
|
||||
machdir-$(CONFIG_SH_EDOSK7705) += renesas/edosk7705
|
||||
machdir-$(CONFIG_SH_HIGHLANDER) += renesas/r7780rp
|
||||
machdir-$(CONFIG_SH_SDK7780) += renesas/sdk7780
|
||||
machdir-$(CONFIG_SH_7710VOIPGW) += renesas/sh7710voipgw
|
||||
machdir-$(CONFIG_SH_X3PROTO) += renesas/x3proto
|
||||
machdir-$(CONFIG_SH_SH4202_MICRODEV) += superh/microdev
|
||||
|
@ -127,6 +127,7 @@ machdir-$(CONFIG_SH_7206_SOLUTION_ENGINE) += se/7206
|
|||
machdir-$(CONFIG_SH_7619_SOLUTION_ENGINE) += se/7619
|
||||
machdir-$(CONFIG_SH_LBOX_RE2) += lboxre2
|
||||
machdir-$(CONFIG_SH_MAGIC_PANEL_R2) += magicpanelr2
|
||||
machdir-$(CONFIG_SH_CAYMAN) += cayman
|
||||
|
||||
incdir-y := $(notdir $(machdir-y))
|
||||
|
||||
|
@ -137,22 +138,22 @@ endif
|
|||
|
||||
# Companion chips
|
||||
core-$(CONFIG_HD6446X_SERIES) += arch/sh/cchips/hd6446x/
|
||||
core-$(CONFIG_MFD_SM501) += arch/sh/cchips/voyagergx/
|
||||
|
||||
cpuincdir-$(CONFIG_CPU_SH2) := cpu-sh2
|
||||
cpuincdir-$(CONFIG_CPU_SH2A) := cpu-sh2a
|
||||
cpuincdir-$(CONFIG_CPU_SH3) := cpu-sh3
|
||||
cpuincdir-$(CONFIG_CPU_SH4) := cpu-sh4
|
||||
cpuincdir-$(CONFIG_CPU_SH5) := cpu-sh5
|
||||
|
||||
libs-y := arch/sh/lib/ $(libs-y) $(LIBGCC)
|
||||
libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y)
|
||||
libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y)
|
||||
libs-y += $(LIBGCC)
|
||||
|
||||
drivers-y += arch/sh/drivers/
|
||||
drivers-$(CONFIG_OPROFILE) += arch/sh/oprofile/
|
||||
|
||||
boot := arch/sh/boot
|
||||
|
||||
CPPFLAGS_vmlinux.lds := -traditional
|
||||
|
||||
incdir-prefix := $(srctree)/include/asm-sh/
|
||||
|
||||
# Update machine arch and proc symlinks if something which affects
|
||||
|
@ -196,29 +197,61 @@ include/asm-sh/.mach: $(wildcard include/config/sh/*.h) \
|
|||
done
|
||||
@touch $@
|
||||
|
||||
archprepare: include/asm-sh/.cpu include/asm-sh/.mach maketools
|
||||
|
||||
PHONY += maketools FORCE
|
||||
|
||||
maketools: include/linux/version.h FORCE
|
||||
$(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h
|
||||
|
||||
all: zImage
|
||||
all: $(KBUILD_IMAGE)
|
||||
|
||||
zImage uImage uImage.srec vmlinux.srec: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
compressed: zImage
|
||||
|
||||
archprepare: include/asm-sh/.cpu include/asm-sh/.mach maketools \
|
||||
arch/sh/lib64/syscalltab.h
|
||||
|
||||
archclean:
|
||||
$(Q)$(MAKE) $(clean)=$(boot)
|
||||
|
||||
CLEAN_FILES += include/asm-sh/machtypes.h \
|
||||
include/asm-sh/cpu include/asm-sh/.cpu \
|
||||
include/asm-sh/mach include/asm-sh/.mach
|
||||
|
||||
define archhelp
|
||||
@echo '* zImage - Compressed kernel image'
|
||||
@echo ' vmlinux.srec - Create an ELF S-record'
|
||||
@echo ' uImage - Create a bootable image for U-Boot'
|
||||
@echo ' uImage.srec - Create an S-record for U-Boot'
|
||||
endef
|
||||
|
||||
define filechk_gen-syscalltab
|
||||
(set -e; \
|
||||
echo "/*"; \
|
||||
echo " * DO NOT MODIFY."; \
|
||||
echo " *"; \
|
||||
echo " * This file was generated by arch/sh/Makefile"; \
|
||||
echo " * Any changes will be reverted at build time."; \
|
||||
echo " */"; \
|
||||
echo ""; \
|
||||
echo "#ifndef __SYSCALLTAB_H"; \
|
||||
echo "#define __SYSCALLTAB_H"; \
|
||||
echo ""; \
|
||||
echo "#include <linux/kernel.h>"; \
|
||||
echo ""; \
|
||||
echo "struct syscall_info {"; \
|
||||
echo " const char *name;"; \
|
||||
echo "} syscall_info_table[] = {"; \
|
||||
sed -e '/^.*\.long /!d;s// { "/;s/\(\([^/]*\)\/\)\{1\}.*/\2/; \
|
||||
s/[ \t]*$$//g;s/$$/" },/;s/\("\)sys_/\1/g'; \
|
||||
echo "};"; \
|
||||
echo ""; \
|
||||
echo "#define NUM_SYSCALL_INFO_ENTRIES ARRAY_SIZE(syscall_info_table)";\
|
||||
echo ""; \
|
||||
echo "#endif /* __SYSCALLTAB_H */" )
|
||||
endef
|
||||
|
||||
arch/sh/lib64/syscalltab.h: arch/sh/kernel/syscalls_64.S
|
||||
$(call filechk,gen-syscalltab)
|
||||
|
||||
CLEAN_FILES += arch/sh/lib64/syscalltab.h \
|
||||
include/asm-sh/machtypes.h \
|
||||
include/asm-sh/cpu include/asm-sh/.cpu \
|
||||
include/asm-sh/mach include/asm-sh/.mach
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
#
|
||||
# Makefile for the Hitachi Cayman specific parts of the kernel
|
||||
#
|
||||
obj-y := setup.o irq.o
|
||||
obj-$(CONFIG_HEARTBEAT) += led.o
|
|
@ -1,24 +1,26 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* arch/sh64/kernel/irq_cayman.c
|
||||
*
|
||||
* SH-5 Cayman Interrupt Support
|
||||
* arch/sh/mach-cayman/irq.c - SH-5 Cayman Interrupt Support
|
||||
*
|
||||
* This file handles the board specific parts of the Cayman interrupt system
|
||||
*
|
||||
* Copyright (C) 2002 Stuart Menefy
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/signal.h>
|
||||
#include <asm/cayman.h>
|
||||
#include <asm/cpu/irq.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/* Setup for the SMSC FDC37C935 / LAN91C100FD */
|
||||
#define SMSC_IRQ IRQ_IRL1
|
||||
|
||||
/* Setup for PCI Bus 2, which transmits interrupts via the EPLD */
|
||||
#define PCI2_IRQ IRQ_IRL3
|
||||
|
||||
unsigned long epld_virt;
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/sh64/mach-cayman/led.c
|
||||
* arch/sh/boards/cayman/led.c
|
||||
*
|
||||
* Copyright (C) 2002 Stuart Menefy <stuart.menefy@st.com>
|
||||
*
|
|
@ -1,28 +1,19 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* arch/sh64/mach-cayman/setup.c
|
||||
* arch/sh/mach-cayman/setup.c
|
||||
*
|
||||
* SH5 Cayman support
|
||||
*
|
||||
* This file handles the architecture-dependent parts of initialization
|
||||
* Copyright (C) 2002 David J. Mckay & Benedict Gaster
|
||||
* Copyright (C) 2003 - 2007 Paul Mundt
|
||||
*
|
||||
* Copyright David J. Mckay.
|
||||
* Needs major work!
|
||||
*
|
||||
* benedict.gaster@superh.com: 3rd May 2002
|
||||
* Added support for ramdisk, removing statically linked romfs at the same time.
|
||||
*
|
||||
* lethal@linux-sh.org: 15th May 2003
|
||||
* Use the generic procfs cpuinfo interface, just return a valid board name.
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/platform.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/cpu/irq.h>
|
||||
|
||||
/*
|
||||
* Platform Dependent Interrupt Priorities.
|
||||
|
@ -96,42 +87,6 @@
|
|||
|
||||
unsigned long smsc_superio_virt;
|
||||
|
||||
/*
|
||||
* Platform dependent structures: maps and parms block.
|
||||
*/
|
||||
struct resource io_resources[] = {
|
||||
/* To be updated with external devices */
|
||||
};
|
||||
|
||||
struct resource kram_resources[] = {
|
||||
/* These must be last in the array */
|
||||
{ .name = "Kernel code", .start = 0, .end = 0 },
|
||||
/* These must be last in the array */
|
||||
{ .name = "Kernel data", .start = 0, .end = 0 }
|
||||
};
|
||||
|
||||
struct resource xram_resources[] = {
|
||||
/* To be updated with external devices */
|
||||
};
|
||||
|
||||
struct resource rom_resources[] = {
|
||||
/* To be updated with external devices */
|
||||
};
|
||||
|
||||
struct sh64_platform platform_parms = {
|
||||
.readonly_rootfs = 1,
|
||||
.initial_root_dev = 0x0100,
|
||||
.loader_type = 1,
|
||||
.io_res_p = io_resources,
|
||||
.io_res_count = ARRAY_SIZE(io_resources),
|
||||
.kram_res_p = kram_resources,
|
||||
.kram_res_count = ARRAY_SIZE(kram_resources),
|
||||
.xram_res_p = xram_resources,
|
||||
.xram_res_count = ARRAY_SIZE(xram_resources),
|
||||
.rom_res_p = rom_resources,
|
||||
.rom_res_count = ARRAY_SIZE(rom_resources),
|
||||
};
|
||||
|
||||
int platform_int_priority[NR_INTC_IRQS] = {
|
||||
IR0, IR1, IR2, IR3, PCA, PCB, PCC, PCD, /* IRQ 0- 7 */
|
||||
RES, RES, RES, RES, SER, ERR, PW3, PW2, /* IRQ 8-15 */
|
||||
|
@ -210,30 +165,23 @@ static int __init smsc_superio_setup(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This is grotty, but, because kernel is always referenced on the link line
|
||||
* before any devices, this is safe.
|
||||
*/
|
||||
__initcall(smsc_superio_setup);
|
||||
|
||||
void __init platform_setup(void)
|
||||
static void __iomem *cayman_ioport_map(unsigned long port, unsigned int len)
|
||||
{
|
||||
/* Cayman platform leaves the decision to head.S, for now */
|
||||
platform_parms.fpu_flags = fpu_in_use;
|
||||
if (port < 0x400) {
|
||||
extern unsigned long smsc_superio_virt;
|
||||
return (void __iomem *)((port << 2) | smsc_superio_virt);
|
||||
}
|
||||
|
||||
return (void __iomem *)port;
|
||||
}
|
||||
|
||||
void __init platform_monitor(void)
|
||||
{
|
||||
/* Nothing yet .. */
|
||||
}
|
||||
|
||||
void __init platform_reserve(void)
|
||||
{
|
||||
/* Nothing yet .. */
|
||||
}
|
||||
|
||||
const char *get_system_type(void)
|
||||
{
|
||||
return "Hitachi Cayman";
|
||||
}
|
||||
extern void init_cayman_irq(void);
|
||||
|
||||
static struct sh_machine_vector mv_cayman __initmv = {
|
||||
.mv_name = "Hitachi Cayman",
|
||||
.mv_nr_irqs = 64,
|
||||
.mv_ioport_map = cayman_ioport_map,
|
||||
.mv_init_irq = init_cayman_irq,
|
||||
};
|
|
@ -136,7 +136,7 @@ int systemasic_irq_demux(int irq)
|
|||
emr = EMR_BASE + (level << 4) + (level << 2);
|
||||
esr = ESR_BASE + (level << 2);
|
||||
|
||||
/* Mask the ESR to filter any spurious, unwanted interrtupts */
|
||||
/* Mask the ESR to filter any spurious, unwanted interrupts */
|
||||
status = inl(esr);
|
||||
status &= inl(emr);
|
||||
|
||||
|
|
|
@ -33,9 +33,6 @@ extern void aica_time_init(void);
|
|||
extern int gapspci_init(void);
|
||||
extern int systemasic_irq_demux(int);
|
||||
|
||||
void *dreamcast_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t);
|
||||
int dreamcast_consistent_free(struct device *, size_t, void *, dma_addr_t);
|
||||
|
||||
static void __init dreamcast_setup(char **cmdline_p)
|
||||
{
|
||||
int i;
|
||||
|
@ -64,9 +61,4 @@ static struct sh_machine_vector mv_dreamcast __initmv = {
|
|||
.mv_name = "Sega Dreamcast",
|
||||
.mv_setup = dreamcast_setup,
|
||||
.mv_irq_demux = systemasic_irq_demux,
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
.mv_consistent_alloc = dreamcast_consistent_alloc,
|
||||
.mv_consistent_free = dreamcast_consistent_free,
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -121,7 +121,7 @@ static int gio_ioctl(struct inode *inode, struct file *filp,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct file_operations gio_fops = {
|
||||
static const struct file_operations gio_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = gio_open, /* open */
|
||||
.release = gio_close, /* release */
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
if SH_HS7751RVOIP
|
||||
|
||||
menu "HS7751RVoIP options"
|
||||
|
||||
config HS7751RVOIP_CODEC
|
||||
bool "Support VoIP Codec section"
|
||||
help
|
||||
Selecting this option will support CODEC section.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
|
@ -1,8 +0,0 @@
|
|||
#
|
||||
# Makefile for the HS7751RVoIP specific parts of the kernel
|
||||
#
|
||||
|
||||
obj-y := setup.o io.o irq.o
|
||||
|
||||
obj-$(CONFIG_PCI) += pci.o
|
||||
|
|
@ -1,283 +0,0 @@
|
|||
/*
|
||||
* linux/arch/sh/boards/renesas/hs7751rvoip/io.c
|
||||
*
|
||||
* Copyright (C) 2001 Ian da Silva, Jeremy Siegel
|
||||
* Based largely on io_se.c.
|
||||
*
|
||||
* I/O routine for Renesas Technology sales HS7751RVoIP
|
||||
*
|
||||
* Initial version only to support LAN access; some
|
||||
* placeholder code from io_hs7751rvoip.c left in with the
|
||||
* expectation of later SuperIO and PCMCIA access.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/hs7751rvoip.h>
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
extern void *area6_io8_base; /* Area 6 8bit I/O Base address */
|
||||
extern void *area5_io16_base; /* Area 5 16bit I/O Base address */
|
||||
|
||||
/*
|
||||
* The 7751R HS7751RVoIP uses the built-in PCI controller (PCIC)
|
||||
* of the 7751R processor, and has a SuperIO accessible via the PCI.
|
||||
* The board also includes a PCMCIA controller on its memory bus,
|
||||
* like the other Solution Engine boards.
|
||||
*/
|
||||
|
||||
#define CODEC_IO_BASE 0x1000
|
||||
#define CODEC_IOMAP(a) ((unsigned long)area6_io8_base + ((a) - CODEC_IO_BASE))
|
||||
|
||||
static inline unsigned long port2adr(unsigned int port)
|
||||
{
|
||||
if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
|
||||
if (port == 0x3f6)
|
||||
return ((unsigned long)area5_io16_base + 0x0c);
|
||||
else
|
||||
return ((unsigned long)area5_io16_base + 0x800 +
|
||||
((port-0x1f0) << 1));
|
||||
else
|
||||
maybebadio((unsigned long)port);
|
||||
return port;
|
||||
}
|
||||
|
||||
/* The 7751R HS7751RVoIP seems to have everything hooked */
|
||||
/* up pretty normally (nothing on high-bytes only...) so this */
|
||||
/* shouldn't be needed */
|
||||
static inline int shifted_port(unsigned long port)
|
||||
{
|
||||
/* For IDE registers, value is not shifted */
|
||||
if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_HS7751RVOIP_CODEC)
|
||||
#define codec_port(port) \
|
||||
((CODEC_IO_BASE <= (port)) && ((port) < (CODEC_IO_BASE + 0x20)))
|
||||
#else
|
||||
#define codec_port(port) (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* General outline: remap really low stuff [eventually] to SuperIO,
|
||||
* stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
|
||||
* is mapped through the PCI IO window. Stuff with high bits (PXSEG)
|
||||
* should be way beyond the window, and is used w/o translation for
|
||||
* compatibility.
|
||||
*/
|
||||
unsigned char hs7751rvoip_inb(unsigned long port)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
return ctrl_inb(port);
|
||||
else if (codec_port(port))
|
||||
return ctrl_inb(CODEC_IOMAP(port));
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
return ctrl_inb(pci_ioaddr(port));
|
||||
else
|
||||
return ctrl_inw(port2adr(port)) & 0xff;
|
||||
}
|
||||
|
||||
unsigned char hs7751rvoip_inb_p(unsigned long port)
|
||||
{
|
||||
unsigned char v;
|
||||
|
||||
if (PXSEG(port))
|
||||
v = ctrl_inb(port);
|
||||
else if (codec_port(port))
|
||||
v = ctrl_inb(CODEC_IOMAP(port));
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
v = ctrl_inb(pci_ioaddr(port));
|
||||
else
|
||||
v = ctrl_inw(port2adr(port)) & 0xff;
|
||||
ctrl_delay();
|
||||
return v;
|
||||
}
|
||||
|
||||
unsigned short hs7751rvoip_inw(unsigned long port)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
return ctrl_inw(port);
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
return ctrl_inw(pci_ioaddr(port));
|
||||
else
|
||||
maybebadio(port);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int hs7751rvoip_inl(unsigned long port)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
return ctrl_inl(port);
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
return ctrl_inl(pci_ioaddr(port));
|
||||
else
|
||||
maybebadio(port);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hs7751rvoip_outb(unsigned char value, unsigned long port)
|
||||
{
|
||||
|
||||
if (PXSEG(port))
|
||||
ctrl_outb(value, port);
|
||||
else if (codec_port(port))
|
||||
ctrl_outb(value, CODEC_IOMAP(port));
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
ctrl_outb(value, pci_ioaddr(port));
|
||||
else
|
||||
ctrl_outb(value, port2adr(port));
|
||||
}
|
||||
|
||||
void hs7751rvoip_outb_p(unsigned char value, unsigned long port)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
ctrl_outb(value, port);
|
||||
else if (codec_port(port))
|
||||
ctrl_outb(value, CODEC_IOMAP(port));
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
ctrl_outb(value, pci_ioaddr(port));
|
||||
else
|
||||
ctrl_outw(value, port2adr(port));
|
||||
|
||||
ctrl_delay();
|
||||
}
|
||||
|
||||
void hs7751rvoip_outw(unsigned short value, unsigned long port)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
ctrl_outw(value, port);
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
ctrl_outw(value, pci_ioaddr(port));
|
||||
else
|
||||
maybebadio(port);
|
||||
}
|
||||
|
||||
void hs7751rvoip_outl(unsigned int value, unsigned long port)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
ctrl_outl(value, port);
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
ctrl_outl(value, pci_ioaddr(port));
|
||||
else
|
||||
maybebadio(port);
|
||||
}
|
||||
|
||||
void hs7751rvoip_insb(unsigned long port, void *addr, unsigned long count)
|
||||
{
|
||||
u8 *buf = addr;
|
||||
|
||||
if (PXSEG(port))
|
||||
while (count--)
|
||||
*buf++ = ctrl_inb(port);
|
||||
else if (codec_port(port))
|
||||
while (count--)
|
||||
*buf++ = ctrl_inb(CODEC_IOMAP(port));
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port)) {
|
||||
volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
|
||||
|
||||
while (count--)
|
||||
*buf++ = *bp;
|
||||
} else {
|
||||
volatile u16 *p = (volatile u16 *)port2adr(port);
|
||||
|
||||
while (count--)
|
||||
*buf++ = *p & 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
void hs7751rvoip_insw(unsigned long port, void *addr, unsigned long count)
|
||||
{
|
||||
volatile u16 *p;
|
||||
u16 *buf = addr;
|
||||
|
||||
if (PXSEG(port))
|
||||
p = (volatile u16 *)port;
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
p = (volatile u16 *)pci_ioaddr(port);
|
||||
else
|
||||
p = (volatile u16 *)port2adr(port);
|
||||
while (count--)
|
||||
*buf++ = *p;
|
||||
}
|
||||
|
||||
void hs7751rvoip_insl(unsigned long port, void *addr, unsigned long count)
|
||||
{
|
||||
|
||||
if (is_pci_ioaddr(port) || shifted_port(port)) {
|
||||
volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
|
||||
u32 *buf = addr;
|
||||
|
||||
while (count--)
|
||||
*buf++ = *p;
|
||||
} else
|
||||
maybebadio(port);
|
||||
}
|
||||
|
||||
void hs7751rvoip_outsb(unsigned long port, const void *addr, unsigned long count)
|
||||
{
|
||||
const u8 *buf = addr;
|
||||
|
||||
if (PXSEG(port))
|
||||
while (count--)
|
||||
ctrl_outb(*buf++, port);
|
||||
else if (codec_port(port))
|
||||
while (count--)
|
||||
ctrl_outb(*buf++, CODEC_IOMAP(port));
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port)) {
|
||||
volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
|
||||
|
||||
while (count--)
|
||||
*bp = *buf++;
|
||||
} else {
|
||||
volatile u16 *p = (volatile u16 *)port2adr(port);
|
||||
|
||||
while (count--)
|
||||
*p = *buf++;
|
||||
}
|
||||
}
|
||||
|
||||
void hs7751rvoip_outsw(unsigned long port, const void *addr, unsigned long count)
|
||||
{
|
||||
volatile u16 *p;
|
||||
const u16 *buf = addr;
|
||||
|
||||
if (PXSEG(port))
|
||||
p = (volatile u16 *)port;
|
||||
else if (is_pci_ioaddr(port) || shifted_port(port))
|
||||
p = (volatile u16 *)pci_ioaddr(port);
|
||||
else
|
||||
p = (volatile u16 *)port2adr(port);
|
||||
|
||||
while (count--)
|
||||
*p = *buf++;
|
||||
}
|
||||
|
||||
void hs7751rvoip_outsl(unsigned long port, const void *addr, unsigned long count)
|
||||
{
|
||||
const u32 *buf = addr;
|
||||
|
||||
if (is_pci_ioaddr(port) || shifted_port(port)) {
|
||||
volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
|
||||
|
||||
while (count--)
|
||||
*p = *buf++;
|
||||
} else
|
||||
maybebadio(port);
|
||||
}
|
||||
|
||||
void __iomem *hs7751rvoip_ioport_map(unsigned long port, unsigned int size)
|
||||
{
|
||||
if (PXSEG(port))
|
||||
return (void __iomem *)port;
|
||||
else if (unlikely(codec_port(port) && (size == 1)))
|
||||
return (void __iomem *)CODEC_IOMAP(port);
|
||||
else if (is_pci_ioaddr(port))
|
||||
return (void __iomem *)pci_ioaddr(port);
|
||||
|
||||
return (void __iomem *)port2adr(port);
|
||||
}
|
|
@ -1,116 +0,0 @@
|
|||
/*
|
||||
* linux/arch/sh/boards/renesas/hs7751rvoip/irq.c
|
||||
*
|
||||
* Copyright (C) 2000 Kazumoto Kojima
|
||||
*
|
||||
* Renesas Technology Sales HS7751RVoIP Support.
|
||||
*
|
||||
* Modified for HS7751RVoIP by
|
||||
* Atom Create Engineering Co., Ltd. 2002.
|
||||
* Lineo uSolutions, Inc. 2003.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/hs7751rvoip.h>
|
||||
|
||||
static int mask_pos[] = {8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7};
|
||||
|
||||
static void enable_hs7751rvoip_irq(unsigned int irq);
|
||||
static void disable_hs7751rvoip_irq(unsigned int irq);
|
||||
|
||||
/* shutdown is same as "disable" */
|
||||
#define shutdown_hs7751rvoip_irq disable_hs7751rvoip_irq
|
||||
|
||||
static void ack_hs7751rvoip_irq(unsigned int irq);
|
||||
static void end_hs7751rvoip_irq(unsigned int irq);
|
||||
|
||||
static unsigned int startup_hs7751rvoip_irq(unsigned int irq)
|
||||
{
|
||||
enable_hs7751rvoip_irq(irq);
|
||||
return 0; /* never anything pending */
|
||||
}
|
||||
|
||||
static void disable_hs7751rvoip_irq(unsigned int irq)
|
||||
{
|
||||
unsigned short val;
|
||||
unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]);
|
||||
|
||||
/* Set the priority in IPR to 0 */
|
||||
val = ctrl_inw(IRLCNTR3);
|
||||
val &= mask;
|
||||
ctrl_outw(val, IRLCNTR3);
|
||||
}
|
||||
|
||||
static void enable_hs7751rvoip_irq(unsigned int irq)
|
||||
{
|
||||
unsigned short val;
|
||||
unsigned short value = (0x0001 << mask_pos[irq]);
|
||||
|
||||
/* Set priority in IPR back to original value */
|
||||
val = ctrl_inw(IRLCNTR3);
|
||||
val |= value;
|
||||
ctrl_outw(val, IRLCNTR3);
|
||||
}
|
||||
|
||||
static void ack_hs7751rvoip_irq(unsigned int irq)
|
||||
{
|
||||
disable_hs7751rvoip_irq(irq);
|
||||
}
|
||||
|
||||
static void end_hs7751rvoip_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
enable_hs7751rvoip_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type hs7751rvoip_irq_type = {
|
||||
.typename = "HS7751RVoIP IRQ",
|
||||
.startup = startup_hs7751rvoip_irq,
|
||||
.shutdown = shutdown_hs7751rvoip_irq,
|
||||
.enable = enable_hs7751rvoip_irq,
|
||||
.disable = disable_hs7751rvoip_irq,
|
||||
.ack = ack_hs7751rvoip_irq,
|
||||
.end = end_hs7751rvoip_irq,
|
||||
};
|
||||
|
||||
static void make_hs7751rvoip_irq(unsigned int irq)
|
||||
{
|
||||
disable_irq_nosync(irq);
|
||||
irq_desc[irq].chip = &hs7751rvoip_irq_type;
|
||||
disable_hs7751rvoip_irq(irq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize IRQ setting
|
||||
*/
|
||||
void __init init_hs7751rvoip_IRQ(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* IRL0=ON HOOK1
|
||||
* IRL1=OFF HOOK1
|
||||
* IRL2=ON HOOK2
|
||||
* IRL3=OFF HOOK2
|
||||
* IRL4=Ringing Detection
|
||||
* IRL5=CODEC
|
||||
* IRL6=Ethernet
|
||||
* IRL7=Ethernet Hub
|
||||
* IRL8=USB Communication
|
||||
* IRL9=USB Connection
|
||||
* IRL10=USB DMA
|
||||
* IRL11=CF Card
|
||||
* IRL12=PCMCIA
|
||||
* IRL13=PCI Slot
|
||||
*/
|
||||
ctrl_outw(0x9876, IRLCNTR1);
|
||||
ctrl_outw(0xdcba, IRLCNTR2);
|
||||
ctrl_outw(0x0050, IRLCNTR4);
|
||||
ctrl_outw(0x4321, IRLCNTR5);
|
||||
|
||||
for (i=0; i<14; i++)
|
||||
make_hs7751rvoip_irq(i);
|
||||
}
|
|
@ -1,149 +0,0 @@
|
|||
/*
|
||||
* linux/arch/sh/boards/renesas/hs7751rvoip/pci.c
|
||||
*
|
||||
* Author: Ian DaSilva (idasilva@mvista.com)
|
||||
*
|
||||
* Highly leveraged from pci-bigsur.c, written by Dustin McIntire.
|
||||
*
|
||||
* May be copied or modified under the terms of the GNU General Public
|
||||
* License. See linux/COPYING for more information.
|
||||
*
|
||||
* PCI initialization for the Renesas SH7751R HS7751RVoIP board
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include "../../../drivers/pci/pci-sh7751.h"
|
||||
#include <asm/hs7751rvoip/hs7751rvoip.h>
|
||||
|
||||
#define PCIMCR_MRSET_OFF 0xBFFFFFFF
|
||||
#define PCIMCR_RFSH_OFF 0xFFFFFFFB
|
||||
|
||||
/*
|
||||
* Only long word accesses of the PCIC's internal local registers and the
|
||||
* configuration registers from the CPU is supported.
|
||||
*/
|
||||
#define PCIC_WRITE(x,v) writel((v), PCI_REG(x))
|
||||
#define PCIC_READ(x) readl(PCI_REG(x))
|
||||
|
||||
/*
|
||||
* Description: This function sets up and initializes the pcic, sets
|
||||
* up the BARS, maps the DRAM into the address space etc, etc.
|
||||
*/
|
||||
int __init pcibios_init_platform(void)
|
||||
{
|
||||
unsigned long bcr1, wcr1, wcr2, wcr3, mcr;
|
||||
unsigned short bcr2, bcr3;
|
||||
|
||||
/*
|
||||
* Initialize the slave bus controller on the pcic. The values used
|
||||
* here should not be hardcoded, but they should be taken from the bsc
|
||||
* on the processor, to make this function as generic as possible.
|
||||
* (i.e. Another sbc may usr different SDRAM timing settings -- in order
|
||||
* for the pcic to work, its settings need to be exactly the same.)
|
||||
*/
|
||||
bcr1 = (*(volatile unsigned long *)(SH7751_BCR1));
|
||||
bcr2 = (*(volatile unsigned short *)(SH7751_BCR2));
|
||||
bcr3 = (*(volatile unsigned short *)(SH7751_BCR3));
|
||||
wcr1 = (*(volatile unsigned long *)(SH7751_WCR1));
|
||||
wcr2 = (*(volatile unsigned long *)(SH7751_WCR2));
|
||||
wcr3 = (*(volatile unsigned long *)(SH7751_WCR3));
|
||||
mcr = (*(volatile unsigned long *)(SH7751_MCR));
|
||||
|
||||
bcr1 = bcr1 | 0x00080000; /* Enable Bit 19, BREQEN */
|
||||
(*(volatile unsigned long *)(SH7751_BCR1)) = bcr1;
|
||||
|
||||
bcr1 = bcr1 | 0x40080000; /* Enable Bit 19 BREQEN, set PCIC to slave */
|
||||
PCIC_WRITE(SH7751_PCIBCR1, bcr1); /* PCIC BCR1 */
|
||||
PCIC_WRITE(SH7751_PCIBCR2, bcr2); /* PCIC BCR2 */
|
||||
PCIC_WRITE(SH7751_PCIBCR3, bcr3); /* PCIC BCR3 */
|
||||
PCIC_WRITE(SH7751_PCIWCR1, wcr1); /* PCIC WCR1 */
|
||||
PCIC_WRITE(SH7751_PCIWCR2, wcr2); /* PCIC WCR2 */
|
||||
PCIC_WRITE(SH7751_PCIWCR3, wcr3); /* PCIC WCR3 */
|
||||
mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF;
|
||||
PCIC_WRITE(SH7751_PCIMCR, mcr); /* PCIC MCR */
|
||||
|
||||
/* Enable all interrupts, so we know what to fix */
|
||||
PCIC_WRITE(SH7751_PCIINTM, 0x0000c3ff);
|
||||
PCIC_WRITE(SH7751_PCIAINTM, 0x0000380f);
|
||||
|
||||
/* Set up standard PCI config registers */
|
||||
PCIC_WRITE(SH7751_PCICONF1, 0xFB900047); /* Bus Master, Mem & I/O access */
|
||||
PCIC_WRITE(SH7751_PCICONF2, 0x00000000); /* PCI Class code & Revision ID */
|
||||
PCIC_WRITE(SH7751_PCICONF4, 0xab000001); /* PCI I/O address (local regs) */
|
||||
PCIC_WRITE(SH7751_PCICONF5, 0x0c000000); /* PCI MEM address (local RAM) */
|
||||
PCIC_WRITE(SH7751_PCICONF6, 0xd0000000); /* PCI MEM address (unused) */
|
||||
PCIC_WRITE(SH7751_PCICONF11, 0x35051054); /* PCI Subsystem ID & Vendor ID */
|
||||
PCIC_WRITE(SH7751_PCILSR0, 0x03f00000); /* MEM (full 64M exposed) */
|
||||
PCIC_WRITE(SH7751_PCILSR1, 0x00000000); /* MEM (unused) */
|
||||
PCIC_WRITE(SH7751_PCILAR0, 0x0c000000); /* MEM (direct map from PCI) */
|
||||
PCIC_WRITE(SH7751_PCILAR1, 0x00000000); /* MEM (unused) */
|
||||
|
||||
/* Now turn it on... */
|
||||
PCIC_WRITE(SH7751_PCICR, 0xa5000001);
|
||||
|
||||
/*
|
||||
* Set PCIMBR and PCIIOBR here, assuming a single window
|
||||
* (16M MEM, 256K IO) is enough. If a larger space is
|
||||
* needed, the readx/writex and inx/outx functions will
|
||||
* have to do more (e.g. setting registers for each call).
|
||||
*/
|
||||
|
||||
/*
|
||||
* Set the MBR so PCI address is one-to-one with window,
|
||||
* meaning all calls go straight through... use ifdef to
|
||||
* catch erroneous assumption.
|
||||
*/
|
||||
BUG_ON(PCIBIOS_MIN_MEM != SH7751_PCI_MEMORY_BASE);
|
||||
|
||||
PCIC_WRITE(SH7751_PCIMBR, PCIBIOS_MIN_MEM);
|
||||
|
||||
/* Set IOBR for window containing area specified in pci.h */
|
||||
PCIC_WRITE(SH7751_PCIIOBR, (PCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK));
|
||||
|
||||
/* All done, may as well say so... */
|
||||
printk("SH7751R PCI: Finished initialization of the PCI controller\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int __init pcibios_map_platform_irq(u8 slot, u8 pin)
|
||||
{
|
||||
switch (slot) {
|
||||
case 0: return IRQ_PCISLOT; /* PCI Extend slot */
|
||||
case 1: return IRQ_PCMCIA; /* PCI Cardbus Bridge */
|
||||
case 2: return IRQ_PCIETH; /* Realtek Ethernet controller */
|
||||
case 3: return IRQ_PCIHUB; /* Realtek Ethernet Hub controller */
|
||||
default:
|
||||
printk("PCI: Bad IRQ mapping request for slot %d\n", slot);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static struct resource sh7751_io_resource = {
|
||||
.name = "SH7751_IO",
|
||||
.start = 0x4000,
|
||||
.end = 0x4000 + SH7751_PCI_IO_SIZE - 1,
|
||||
.flags = IORESOURCE_IO
|
||||
};
|
||||
|
||||
static struct resource sh7751_mem_resource = {
|
||||
.name = "SH7751_mem",
|
||||
.start = SH7751_PCI_MEMORY_BASE,
|
||||
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM
|
||||
};
|
||||
|
||||
extern struct pci_ops sh7751_pci_ops;
|
||||
|
||||
struct pci_channel board_pci_channels[] = {
|
||||
{ &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
|
||||
{ NULL, NULL, NULL, 0, 0 },
|
||||
};
|
||||
EXPORT_SYMBOL(board_pci_channels);
|
|
@ -1,105 +0,0 @@
|
|||
/*
|
||||
* Renesas Technology Sales HS7751RVoIP Support.
|
||||
*
|
||||
* Copyright (C) 2000 Kazumoto Kojima
|
||||
*
|
||||
* Modified for HS7751RVoIP by
|
||||
* Atom Create Engineering Co., Ltd. 2002.
|
||||
* Lineo uSolutions, Inc. 2003.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pm.h>
|
||||
#include <asm/hs7751rvoip.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/machvec.h>
|
||||
|
||||
static void hs7751rvoip_power_off(void)
|
||||
{
|
||||
ctrl_outw(ctrl_inw(PA_OUTPORTR) & 0xffdf, PA_OUTPORTR);
|
||||
}
|
||||
|
||||
void *area5_io8_base;
|
||||
void *area6_io8_base;
|
||||
void *area5_io16_base;
|
||||
void *area6_io16_base;
|
||||
|
||||
static int __init hs7751rvoip_cf_init(void)
|
||||
{
|
||||
pgprot_t prot;
|
||||
unsigned long paddrbase;
|
||||
|
||||
/* open I/O area window */
|
||||
paddrbase = virt_to_phys((void *)(PA_AREA5_IO+0x00000800));
|
||||
prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_COM16);
|
||||
area5_io16_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot);
|
||||
if (!area5_io16_base) {
|
||||
printk("allocate_cf_area : can't open CF I/O window!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* XXX : do we need attribute and common-memory area also? */
|
||||
|
||||
paddrbase = virt_to_phys((void *)PA_AREA6_IO);
|
||||
#if defined(CONFIG_HS7751RVOIP_CODEC)
|
||||
prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_COM8);
|
||||
#else
|
||||
prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO8);
|
||||
#endif
|
||||
area6_io8_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot);
|
||||
if (!area6_io8_base) {
|
||||
printk("allocate_cf_area : can't open CODEC I/O 8bit window!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16);
|
||||
area6_io16_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot);
|
||||
if (!area6_io16_base) {
|
||||
printk("allocate_cf_area : can't open CODEC I/O 16bit window!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
device_initcall(hs7751rvoip_cf_init);
|
||||
|
||||
/*
|
||||
* Initialize the board
|
||||
*/
|
||||
static void __init hs7751rvoip_setup(char **cmdline_p)
|
||||
{
|
||||
ctrl_outb(0xf0, PA_OUTPORTR);
|
||||
pm_power_off = hs7751rvoip_power_off;
|
||||
|
||||
printk(KERN_INFO "Renesas Technology Sales HS7751RVoIP-2 support.\n");
|
||||
}
|
||||
|
||||
static struct sh_machine_vector mv_hs7751rvoip __initmv = {
|
||||
.mv_name = "HS7751RVoIP",
|
||||
.mv_setup = hs7751rvoip_setup,
|
||||
.mv_nr_irqs = 72,
|
||||
|
||||
.mv_inb = hs7751rvoip_inb,
|
||||
.mv_inw = hs7751rvoip_inw,
|
||||
.mv_inl = hs7751rvoip_inl,
|
||||
.mv_outb = hs7751rvoip_outb,
|
||||
.mv_outw = hs7751rvoip_outw,
|
||||
.mv_outl = hs7751rvoip_outl,
|
||||
|
||||
.mv_inb_p = hs7751rvoip_inb_p,
|
||||
.mv_inw_p = hs7751rvoip_inw,
|
||||
.mv_inl_p = hs7751rvoip_inl,
|
||||
.mv_outb_p = hs7751rvoip_outb_p,
|
||||
.mv_outw_p = hs7751rvoip_outw,
|
||||
.mv_outl_p = hs7751rvoip_outl,
|
||||
|
||||
.mv_insb = hs7751rvoip_insb,
|
||||
.mv_insw = hs7751rvoip_insw,
|
||||
.mv_insl = hs7751rvoip_insl,
|
||||
.mv_outsb = hs7751rvoip_outsb,
|
||||
.mv_outsw = hs7751rvoip_outsw,
|
||||
.mv_outsl = hs7751rvoip_outsl,
|
||||
|
||||
.mv_init_irq = init_hs7751rvoip_IRQ,
|
||||
.mv_ioport_map = hs7751rvoip_ioport_map,
|
||||
};
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
irqinit-$(CONFIG_SH_R7780MP) := irq-r7780mp.o
|
||||
irqinit-$(CONFIG_SH_R7785RP) := irq-r7785rp.o
|
||||
irqinit-$(CONFIG_SH_R7780RP) := irq-r7780rp.o irq.o
|
||||
irqinit-$(CONFIG_SH_R7780RP) := irq-r7780rp.o
|
||||
obj-y := setup.o $(irqinit-y)
|
||||
|
||||
ifneq ($(CONFIG_SH_R7785RP),y)
|
||||
|
|
|
@ -47,7 +47,7 @@ static unsigned char irl2irq[HL_NR_IRL] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "r7780mp", vectors,
|
||||
NULL, NULL, mask_registers, NULL, NULL);
|
||||
NULL, mask_registers, NULL, NULL);
|
||||
|
||||
unsigned char * __init highlander_init_irq_r7780mp(void)
|
||||
{
|
||||
|
|
|
@ -3,21 +3,65 @@
|
|||
*
|
||||
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
||||
* Copyright (C) 2006 Paul Mundt
|
||||
* Copyright (C) 2008 Magnus Damm
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/r7780rp.h>
|
||||
|
||||
enum {
|
||||
UNUSED = 0,
|
||||
|
||||
/* board specific interrupt sources */
|
||||
|
||||
AX88796, /* Ethernet controller */
|
||||
PSW, /* Push Switch */
|
||||
CF, /* Compact Flash */
|
||||
|
||||
PCI_A,
|
||||
PCI_B,
|
||||
PCI_C,
|
||||
PCI_D,
|
||||
};
|
||||
|
||||
static struct intc_vect vectors[] __initdata = {
|
||||
INTC_IRQ(PCI_A, 65), /* dirty: overwrite cpu vectors for pci */
|
||||
INTC_IRQ(PCI_B, 66),
|
||||
INTC_IRQ(PCI_C, 67),
|
||||
INTC_IRQ(PCI_D, 68),
|
||||
INTC_IRQ(CF, IRQ_CF),
|
||||
INTC_IRQ(PSW, IRQ_PSW),
|
||||
INTC_IRQ(AX88796, IRQ_AX88796),
|
||||
};
|
||||
|
||||
static struct intc_mask_reg mask_registers[] __initdata = {
|
||||
{ 0xa5000000, 0, 16, /* IRLMSK */
|
||||
{ PCI_A, PCI_B, PCI_C, PCI_D, CF, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, PSW, AX88796 } },
|
||||
};
|
||||
|
||||
static unsigned char irl2irq[HL_NR_IRL] __initdata = {
|
||||
65, 66, 67, 68,
|
||||
IRQ_CF, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
IRQ_AX88796, IRQ_PSW
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "r7780rp", vectors,
|
||||
NULL, mask_registers, NULL, NULL);
|
||||
|
||||
unsigned char * __init highlander_init_irq_r7780rp(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 15; i++)
|
||||
make_r7780rp_irq(i);
|
||||
if (ctrl_inw(0xa5000600)) {
|
||||
printk(KERN_INFO "Using r7780rp interrupt controller.\n");
|
||||
register_intc_controller(&intc_desc);
|
||||
return irl2irq;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Renesas Solutions Highlander R7785RP Support.
|
||||
*
|
||||
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
||||
* Copyright (C) 2006 Paul Mundt
|
||||
* Copyright (C) 2006 - 2008 Paul Mundt
|
||||
* Copyright (C) 2007 Magnus Damm
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
|
@ -17,31 +17,52 @@
|
|||
enum {
|
||||
UNUSED = 0,
|
||||
|
||||
/* board specific interrupt sources */
|
||||
AX88796, /* Ethernet controller */
|
||||
CF, /* Compact Flash */
|
||||
/* FPGA specific interrupt sources */
|
||||
CF, /* Compact Flash */
|
||||
SMBUS, /* SMBUS */
|
||||
TP, /* Touch panel */
|
||||
RTC, /* RTC Alarm */
|
||||
TH_ALERT, /* Temperature sensor */
|
||||
AX88796, /* Ethernet controller */
|
||||
|
||||
/* external bus connector */
|
||||
EXT0, EXT1, EXT2, EXT3, EXT4, EXT5, EXT6, EXT7,
|
||||
};
|
||||
|
||||
static struct intc_vect vectors[] __initdata = {
|
||||
INTC_IRQ(CF, IRQ_CF),
|
||||
INTC_IRQ(SMBUS, IRQ_SMBUS),
|
||||
INTC_IRQ(TP, IRQ_TP),
|
||||
INTC_IRQ(RTC, IRQ_RTC),
|
||||
INTC_IRQ(TH_ALERT, IRQ_TH_ALERT),
|
||||
|
||||
INTC_IRQ(EXT0, IRQ_EXT0), INTC_IRQ(EXT1, IRQ_EXT1),
|
||||
INTC_IRQ(EXT2, IRQ_EXT2), INTC_IRQ(EXT3, IRQ_EXT3),
|
||||
|
||||
INTC_IRQ(EXT4, IRQ_EXT4), INTC_IRQ(EXT5, IRQ_EXT5),
|
||||
INTC_IRQ(EXT6, IRQ_EXT6), INTC_IRQ(EXT7, IRQ_EXT7),
|
||||
|
||||
INTC_IRQ(AX88796, IRQ_AX88796),
|
||||
};
|
||||
|
||||
static struct intc_mask_reg mask_registers[] __initdata = {
|
||||
{ 0xa4000010, 0, 16, /* IRLMCR1 */
|
||||
{ 0, 0, 0, 0, CF, AX88796, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 } },
|
||||
{ 0, 0, 0, 0, CF, AX88796, SMBUS, TP,
|
||||
RTC, 0, TH_ALERT, 0, 0, 0, 0, 0 } },
|
||||
{ 0xa4000012, 0, 16, /* IRLMCR2 */
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
EXT7, EXT6, EXT5, EXT4, EXT3, EXT2, EXT1, EXT0 } },
|
||||
};
|
||||
|
||||
static unsigned char irl2irq[HL_NR_IRL] __initdata = {
|
||||
0, IRQ_CF, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, IRQ_AX88796, 0,
|
||||
0, 0, 0,
|
||||
0, IRQ_CF, IRQ_EXT4, IRQ_EXT5,
|
||||
IRQ_EXT6, IRQ_EXT7, IRQ_SMBUS, IRQ_TP,
|
||||
IRQ_RTC, IRQ_TH_ALERT, IRQ_AX88796, IRQ_EXT0,
|
||||
IRQ_EXT1, IRQ_EXT2, IRQ_EXT3,
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "r7785rp", vectors,
|
||||
NULL, NULL, mask_registers, NULL, NULL);
|
||||
NULL, mask_registers, NULL, NULL);
|
||||
|
||||
unsigned char * __init highlander_init_irq_r7785rp(void)
|
||||
{
|
||||
|
@ -58,7 +79,7 @@ unsigned char * __init highlander_init_irq_r7785rp(void)
|
|||
ctrl_outw(0x7060, PA_IRLPRC); /* FPGA IRLC */
|
||||
ctrl_outw(0x0000, PA_IRLPRD); /* FPGA IRLD */
|
||||
ctrl_outw(0x4321, PA_IRLPRE); /* FPGA IRLE */
|
||||
ctrl_outw(0x0000, PA_IRLPRF); /* FPGA IRLF */
|
||||
ctrl_outw(0xdcba, PA_IRLPRF); /* FPGA IRLF */
|
||||
|
||||
register_intc_controller(&intc_desc);
|
||||
return irl2irq;
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* Renesas Solutions Highlander R7780RP-1 Support.
|
||||
*
|
||||
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
||||
* Copyright (C) 2006 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/r7780rp.h>
|
||||
|
||||
#ifdef CONFIG_SH_R7780RP
|
||||
static int mask_pos[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 5, 6, 4, 0, 1, 2, 0};
|
||||
#elif defined(CONFIG_SH_R7780MP)
|
||||
static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0};
|
||||
#elif defined(CONFIG_SH_R7785RP)
|
||||
static int mask_pos[] = {2, 11, 2, 2, 2, 2, 9, 8, 7, 5, 10, 2, 2, 2, 2, 2};
|
||||
#endif
|
||||
|
||||
static void enable_r7780rp_irq(unsigned int irq)
|
||||
{
|
||||
/* Set priority in IPR back to original value */
|
||||
ctrl_outw(ctrl_inw(IRLCNTR1) | (1 << mask_pos[irq]), IRLCNTR1);
|
||||
}
|
||||
|
||||
static void disable_r7780rp_irq(unsigned int irq)
|
||||
{
|
||||
/* Set the priority in IPR to 0 */
|
||||
ctrl_outw(ctrl_inw(IRLCNTR1) & (0xffff ^ (1 << mask_pos[irq])),
|
||||
IRLCNTR1);
|
||||
}
|
||||
|
||||
static struct irq_chip r7780rp_irq_chip __read_mostly = {
|
||||
.name = "R7780RP",
|
||||
.mask = disable_r7780rp_irq,
|
||||
.unmask = enable_r7780rp_irq,
|
||||
.mask_ack = disable_r7780rp_irq,
|
||||
};
|
||||
|
||||
void make_r7780rp_irq(unsigned int irq)
|
||||
{
|
||||
disable_irq_nosync(irq);
|
||||
set_irq_chip_and_handler_name(irq, &r7780rp_irq_chip,
|
||||
handle_level_irq, "level");
|
||||
enable_r7780rp_irq(irq);
|
||||
}
|
|
@ -179,9 +179,11 @@ static struct platform_device ax88796_device = {
|
|||
static struct platform_device *r7780rp_devices[] __initdata = {
|
||||
&r8a66597_usb_host_device,
|
||||
&m66592_usb_peripheral_device,
|
||||
&cf_ide_device,
|
||||
&heartbeat_device,
|
||||
#ifndef CONFIG_SH_R7780RP
|
||||
&cf_ide_device,
|
||||
&ax88796_device,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init r7780rp_devices_setup(void)
|
||||
|
@ -316,9 +318,9 @@ void __init highlander_init_irq(void)
|
|||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_SH_R7780RP
|
||||
highlander_init_irq_r7780rp();
|
||||
ucp = irl2irq;
|
||||
break;
|
||||
ucp = highlander_init_irq_r7780rp();
|
||||
if (ucp)
|
||||
break;
|
||||
#endif
|
||||
} while (0);
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/voyagergx.h>
|
||||
#include <asm/rts7751r2d.h>
|
||||
|
||||
#define R2D_NR_IRL 13
|
||||
|
@ -71,7 +70,7 @@ static unsigned char irl2irq_r2d_1[R2D_NR_IRL] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_r2d_1, "r2d-1", vectors_r2d_1,
|
||||
NULL, NULL, mask_registers_r2d_1, NULL, NULL);
|
||||
NULL, mask_registers_r2d_1, NULL, NULL);
|
||||
|
||||
#endif /* CONFIG_RTS7751R2D_1 */
|
||||
|
||||
|
@ -109,7 +108,7 @@ static unsigned char irl2irq_r2d_plus[R2D_NR_IRL] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_r2d_plus, "r2d-plus", vectors_r2d_plus,
|
||||
NULL, NULL, mask_registers_r2d_plus, NULL, NULL);
|
||||
NULL, mask_registers_r2d_plus, NULL, NULL);
|
||||
|
||||
#endif /* CONFIG_RTS7751R2D_PLUS */
|
||||
|
||||
|
@ -153,7 +152,4 @@ void __init init_rts7751r2d_IRQ(void)
|
|||
}
|
||||
|
||||
register_intc_controller(d);
|
||||
#ifdef CONFIG_MFD_SM501
|
||||
setup_voyagergx_irq();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -13,34 +13,15 @@
|
|||
#include <linux/pata_platform.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/sm501.h>
|
||||
#include <linux/sm501-regs.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/spi_bitbang.h>
|
||||
#include <asm/machvec.h>
|
||||
#include <asm/rts7751r2d.h>
|
||||
#include <asm/voyagergx.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static void __init voyagergx_serial_init(void)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
/*
|
||||
* GPIO Control
|
||||
*/
|
||||
val = readl((void __iomem *)GPIO_MUX_HIGH);
|
||||
val |= 0x00001fe0;
|
||||
writel(val, (void __iomem *)GPIO_MUX_HIGH);
|
||||
|
||||
/*
|
||||
* Power Mode Gate
|
||||
*/
|
||||
val = readl((void __iomem *)POWER_MODE0_GATE);
|
||||
val |= (POWER_MODE0_GATE_U0 | POWER_MODE0_GATE_U1);
|
||||
writel(val, (void __iomem *)POWER_MODE0_GATE);
|
||||
|
||||
val = readl((void __iomem *)POWER_MODE1_GATE);
|
||||
val |= (POWER_MODE1_GATE_U0 | POWER_MODE1_GATE_U1);
|
||||
writel(val, (void __iomem *)POWER_MODE1_GATE);
|
||||
}
|
||||
#include <asm/spi.h>
|
||||
|
||||
static struct resource cf_ide_resources[] = {
|
||||
[0] = {
|
||||
|
@ -75,6 +56,43 @@ static struct platform_device cf_ide_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct spi_board_info spi_bus[] = {
|
||||
{
|
||||
.modalias = "rtc-r9701",
|
||||
.max_speed_hz = 1000000,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
};
|
||||
|
||||
static void r2d_chip_select(struct sh_spi_info *spi, int cs, int state)
|
||||
{
|
||||
BUG_ON(cs != 0); /* Single Epson RTC-9701JE attached on CS0 */
|
||||
ctrl_outw(state == BITBANG_CS_ACTIVE, PA_RTCCE);
|
||||
}
|
||||
|
||||
static struct sh_spi_info spi_info = {
|
||||
.num_chipselect = 1,
|
||||
.chip_select = r2d_chip_select,
|
||||
};
|
||||
|
||||
static struct resource spi_sh_sci_resources[] = {
|
||||
{
|
||||
.start = 0xffe00000,
|
||||
.end = 0xffe0001f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device spi_sh_sci_device = {
|
||||
.name = "spi_sh_sci",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(spi_sh_sci_resources),
|
||||
.resource = spi_sh_sci_resources,
|
||||
.dev = {
|
||||
.platform_data = &spi_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource heartbeat_resources[] = {
|
||||
[0] = {
|
||||
.start = PA_OUTPORT,
|
||||
|
@ -93,11 +111,11 @@ static struct platform_device heartbeat_device = {
|
|||
#ifdef CONFIG_MFD_SM501
|
||||
static struct plat_serial8250_port uart_platform_data[] = {
|
||||
{
|
||||
.membase = (void __iomem *)VOYAGER_UART_BASE,
|
||||
.mapbase = VOYAGER_UART_BASE,
|
||||
.membase = (void __iomem *)0xb3e30000,
|
||||
.mapbase = 0xb3e30000,
|
||||
.iotype = UPIO_MEM,
|
||||
.irq = IRQ_SM501_U0,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.irq = IRQ_VOYAGER,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ,
|
||||
.regshift = 2,
|
||||
.uartclk = (9600 * 16),
|
||||
},
|
||||
|
@ -124,14 +142,67 @@ static struct resource sm501_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = IRQ_SM501_CV,
|
||||
.start = IRQ_VOYAGER,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct fb_videomode sm501_default_mode = {
|
||||
.pixclock = 35714,
|
||||
.xres = 640,
|
||||
.yres = 480,
|
||||
.left_margin = 105,
|
||||
.right_margin = 50,
|
||||
.upper_margin = 35,
|
||||
.lower_margin = 0,
|
||||
.hsync_len = 96,
|
||||
.vsync_len = 2,
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
};
|
||||
|
||||
static struct sm501_platdata_fbsub sm501_pdata_fbsub_pnl = {
|
||||
.def_bpp = 16,
|
||||
.def_mode = &sm501_default_mode,
|
||||
.flags = SM501FB_FLAG_USE_INIT_MODE |
|
||||
SM501FB_FLAG_USE_HWCURSOR |
|
||||
SM501FB_FLAG_USE_HWACCEL |
|
||||
SM501FB_FLAG_DISABLE_AT_EXIT,
|
||||
};
|
||||
|
||||
static struct sm501_platdata_fbsub sm501_pdata_fbsub_crt = {
|
||||
.flags = (SM501FB_FLAG_USE_INIT_MODE |
|
||||
SM501FB_FLAG_USE_HWCURSOR |
|
||||
SM501FB_FLAG_USE_HWACCEL |
|
||||
SM501FB_FLAG_DISABLE_AT_EXIT),
|
||||
|
||||
};
|
||||
|
||||
static struct sm501_platdata_fb sm501_fb_pdata = {
|
||||
.fb_route = SM501_FB_OWN,
|
||||
.fb_crt = &sm501_pdata_fbsub_crt,
|
||||
.fb_pnl = &sm501_pdata_fbsub_pnl,
|
||||
.flags = SM501_FBPD_SWAP_FB_ENDIAN,
|
||||
};
|
||||
|
||||
static struct sm501_initdata sm501_initdata = {
|
||||
.gpio_high = {
|
||||
.set = 0x00001fe0,
|
||||
.mask = 0x0,
|
||||
},
|
||||
.devices = SM501_USE_USB_HOST,
|
||||
};
|
||||
|
||||
static struct sm501_platdata sm501_platform_data = {
|
||||
.init = &sm501_initdata,
|
||||
.fb = &sm501_fb_pdata,
|
||||
};
|
||||
|
||||
static struct platform_device sm501_device = {
|
||||
.name = "sm501",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &sm501_platform_data,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sm501_resources),
|
||||
.resource = sm501_resources,
|
||||
};
|
||||
|
@ -145,10 +216,12 @@ static struct platform_device *rts7751r2d_devices[] __initdata = {
|
|||
#endif
|
||||
&cf_ide_device,
|
||||
&heartbeat_device,
|
||||
&spi_sh_sci_device,
|
||||
};
|
||||
|
||||
static int __init rts7751r2d_devices_setup(void)
|
||||
{
|
||||
spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
|
||||
return platform_add_devices(rts7751r2d_devices,
|
||||
ARRAY_SIZE(rts7751r2d_devices));
|
||||
}
|
||||
|
@ -192,6 +265,7 @@ u8 rts7751r2d_readb(void __iomem *addr)
|
|||
*/
|
||||
static void __init rts7751r2d_setup(char **cmdline_p)
|
||||
{
|
||||
void __iomem *sm501_reg;
|
||||
u16 ver = ctrl_inw(PA_VERREG);
|
||||
|
||||
printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
|
||||
|
@ -202,7 +276,30 @@ static void __init rts7751r2d_setup(char **cmdline_p)
|
|||
ctrl_outw(0x0000, PA_OUTPORT);
|
||||
pm_power_off = rts7751r2d_power_off;
|
||||
|
||||
voyagergx_serial_init();
|
||||
/* sm501 dram configuration:
|
||||
* ColSizeX = 11 - External Memory Column Size: 256 words.
|
||||
* APX = 1 - External Memory Active to Pre-Charge Delay: 7 clocks.
|
||||
* RstX = 1 - External Memory Reset: Normal.
|
||||
* Rfsh = 1 - Local Memory Refresh to Command Delay: 12 clocks.
|
||||
* BwC = 1 - Local Memory Block Write Cycle Time: 2 clocks.
|
||||
* BwP = 1 - Local Memory Block Write to Pre-Charge Delay: 1 clock.
|
||||
* AP = 1 - Internal Memory Active to Pre-Charge Delay: 7 clocks.
|
||||
* Rst = 1 - Internal Memory Reset: Normal.
|
||||
* RA = 1 - Internal Memory Remain in Active State: Do not remain.
|
||||
*/
|
||||
|
||||
sm501_reg = (void __iomem *)0xb3e00000 + SM501_DRAM_CONTROL;
|
||||
writel(readl(sm501_reg) | 0x00f107c0, sm501_reg);
|
||||
|
||||
/*
|
||||
* Power Mode Gate - Enable UART0
|
||||
*/
|
||||
|
||||
sm501_reg = (void __iomem *)0xb3e00000 + SM501_POWER_MODE_0_GATE;
|
||||
writel(readl(sm501_reg) | (1 << SM501_GATE_UART0), sm501_reg);
|
||||
|
||||
sm501_reg = (void __iomem *)0xb3e00000 + SM501_POWER_MODE_1_GATE;
|
||||
writel(readl(sm501_reg) | (1 << SM501_GATE_UART0), sm501_reg);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -215,8 +312,4 @@ static struct sh_machine_vector mv_rts7751r2d __initmv = {
|
|||
.mv_irq_demux = rts7751r2d_irq_demux,
|
||||
.mv_writeb = rts7751r2d_writeb,
|
||||
.mv_readb = rts7751r2d_readb,
|
||||
#if defined(CONFIG_MFD_SM501) && defined(CONFIG_USB_OHCI_HCD)
|
||||
.mv_consistent_alloc = voyagergx_consistent_alloc,
|
||||
.mv_consistent_free = voyagergx_consistent_free,
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
if SH_SDK7780
|
||||
|
||||
choice
|
||||
prompt "SDK7780 options"
|
||||
default SH_SDK7780_BASE
|
||||
|
||||
config SH_SDK7780_STANDALONE
|
||||
bool "SDK7780 board support"
|
||||
depends on CPU_SUBTYPE_SH7780
|
||||
help
|
||||
Selecting this option will enable support for the
|
||||
standalone version of the SDK7780. If in doubt, say Y.
|
||||
|
||||
config SH_SDK7780_BASE
|
||||
bool "SDK7780 with base-board support"
|
||||
depends on CPU_SUBTYPE_SH7780
|
||||
help
|
||||
Selecting this option will enable support for the expansion
|
||||
baseboard devices. If in doubt, say Y.
|
||||
|
||||
endchoice
|
||||
|
||||
endif
|
|
@ -0,0 +1,5 @@
|
|||
#
|
||||
# Makefile for the SDK7780 specific parts of the kernel
|
||||
#
|
||||
obj-y := setup.o irq.o
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* linux/arch/sh/boards/renesas/sdk7780/irq.c
|
||||
*
|
||||
* Renesas Technology Europe SDK7780 Support.
|
||||
*
|
||||
* Copyright (C) 2008 Nicholas Beck <nbeck@mpc-data.co.uk>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/sdk7780.h>
|
||||
|
||||
enum {
|
||||
UNUSED = 0,
|
||||
/* board specific interrupt sources */
|
||||
SMC91C111, /* Ethernet controller */
|
||||
};
|
||||
|
||||
static struct intc_vect fpga_vectors[] __initdata = {
|
||||
INTC_IRQ(SMC91C111, IRQ_ETHERNET),
|
||||
};
|
||||
|
||||
static struct intc_mask_reg fpga_mask_registers[] __initdata = {
|
||||
{ 0, FPGA_IRQ0MR, 16,
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, SMC91C111, 0, 0, 0, 0 } },
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(fpga_intc_desc, "sdk7780-irq", fpga_vectors,
|
||||
NULL, fpga_mask_registers, NULL, NULL);
|
||||
|
||||
void __init init_sdk7780_IRQ(void)
|
||||
{
|
||||
printk(KERN_INFO "Using SDK7780 interrupt controller.\n");
|
||||
|
||||
ctrl_outw(0xFFFF, FPGA_IRQ0MR);
|
||||
/* Setup IRL 0-3 */
|
||||
ctrl_outw(0x0003, FPGA_IMSR);
|
||||
plat_irq_setup_pins(IRQ_MODE_IRL3210);
|
||||
|
||||
register_intc_controller(&fpga_intc_desc);
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* arch/sh/boards/renesas/sdk7780/setup.c
|
||||
*
|
||||
* Renesas Solutions SH7780 SDK Support
|
||||
* Copyright (C) 2008 Nicholas Beck <nbeck@mpc-data.co.uk>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pata_platform.h>
|
||||
#include <asm/machvec.h>
|
||||
#include <asm/sdk7780.h>
|
||||
#include <asm/heartbeat.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
#define GPIO_PECR 0xFFEA0008
|
||||
|
||||
//* Heartbeat */
|
||||
static struct heartbeat_data heartbeat_data = {
|
||||
.regsize = 16,
|
||||
};
|
||||
|
||||
static struct resource heartbeat_resources[] = {
|
||||
[0] = {
|
||||
.start = PA_LED,
|
||||
.end = PA_LED,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device heartbeat_device = {
|
||||
.name = "heartbeat",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &heartbeat_data,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(heartbeat_resources),
|
||||
.resource = heartbeat_resources,
|
||||
};
|
||||
|
||||
/* SMC91x */
|
||||
static struct resource smc91x_eth_resources[] = {
|
||||
[0] = {
|
||||
.name = "smc91x-regs" ,
|
||||
.start = PA_LAN + 0x300,
|
||||
.end = PA_LAN + 0x300 + 0x10 ,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_ETHERNET,
|
||||
.end = IRQ_ETHERNET,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device smc91x_eth_device = {
|
||||
.name = "smc91x",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = NULL, /* don't use dma */
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(smc91x_eth_resources),
|
||||
.resource = smc91x_eth_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *sdk7780_devices[] __initdata = {
|
||||
&heartbeat_device,
|
||||
&smc91x_eth_device,
|
||||
};
|
||||
|
||||
static int __init sdk7780_devices_setup(void)
|
||||
{
|
||||
return platform_add_devices(sdk7780_devices,
|
||||
ARRAY_SIZE(sdk7780_devices));
|
||||
}
|
||||
device_initcall(sdk7780_devices_setup);
|
||||
|
||||
static void __init sdk7780_setup(char **cmdline_p)
|
||||
{
|
||||
u16 ver = ctrl_inw(FPGA_FPVERR);
|
||||
u16 dateStamp = ctrl_inw(FPGA_FPDATER);
|
||||
|
||||
printk(KERN_INFO "Renesas Technology Europe SDK7780 support.\n");
|
||||
printk(KERN_INFO "Board version: %d (revision %d), "
|
||||
"FPGA version: %d (revision %d), datestamp : %d\n",
|
||||
(ver >> 12) & 0xf, (ver >> 8) & 0xf,
|
||||
(ver >> 4) & 0xf, ver & 0xf,
|
||||
dateStamp);
|
||||
|
||||
/* Setup pin mux'ing for PCIC */
|
||||
ctrl_outw(0x0000, GPIO_PECR);
|
||||
}
|
||||
|
||||
/*
|
||||
* The Machine Vector
|
||||
*/
|
||||
static struct sh_machine_vector mv_se7780 __initmv = {
|
||||
.mv_name = "Renesas SDK7780-R3" ,
|
||||
.mv_setup = sdk7780_setup,
|
||||
.mv_nr_irqs = 111,
|
||||
.mv_init_irq = init_sdk7780_IRQ,
|
||||
};
|
||||
|
|
@ -33,19 +33,30 @@ $(obj)/compressed/vmlinux: FORCE
|
|||
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
|
||||
|
||||
KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%8x" \
|
||||
$$[$(CONFIG_PAGE_OFFSET) + \
|
||||
$(CONFIG_MEMORY_START) + \
|
||||
$(CONFIG_ZERO_PAGE_OFFSET)]')
|
||||
|
||||
KERNEL_ENTRY := $(shell /bin/bash -c 'printf "0x%8x" \
|
||||
$$[$(CONFIG_PAGE_OFFSET) + \
|
||||
$(CONFIG_MEMORY_START) + \
|
||||
$(CONFIG_ZERO_PAGE_OFFSET)+0x1000]')
|
||||
|
||||
quiet_cmd_uimage = UIMAGE $@
|
||||
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A sh -O linux -T kernel \
|
||||
-C none -a $(KERNEL_LOAD) -e $(KERNEL_LOAD) \
|
||||
-C none -a $(KERNEL_LOAD) -e $(KERNEL_ENTRY) \
|
||||
-n 'Linux-$(KERNELRELEASE)' -d $< $@
|
||||
|
||||
$(obj)/uImage: $(obj)/zImage FORCE
|
||||
$(obj)/uImage: $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,uimage)
|
||||
@echo ' Image $@ is ready'
|
||||
|
||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
OBJCOPYFLAGS_vmlinux.srec := -I binary -O srec
|
||||
$(obj)/vmlinux.srec: $(obj)/compressed/vmlinux
|
||||
$(call if_changed,objcopy)
|
||||
|
@ -54,4 +65,5 @@ OBJCOPYFLAGS_uImage.srec := -I binary -O srec
|
|||
$(obj)/uImage.srec: $(obj)/uImage
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
clean-files += uImage uImage.srec vmlinux.srec
|
||||
clean-files += uImage uImage.srec vmlinux.srec \
|
||||
vmlinux.bin vmlinux.bin.gz
|
||||
|
|
|
@ -1,43 +1,5 @@
|
|||
#
|
||||
# linux/arch/sh/boot/compressed/Makefile
|
||||
#
|
||||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
OBJECTS = $(obj)/head.o $(obj)/misc.o
|
||||
|
||||
ifdef CONFIG_SH_STANDARD_BIOS
|
||||
OBJECTS += $(obj)/../../kernel/sh_bios.o
|
||||
ifeq ($(CONFIG_SUPERH32),y)
|
||||
include ${srctree}/arch/sh/boot/compressed/Makefile_32
|
||||
else
|
||||
include ${srctree}/arch/sh/boot/compressed/Makefile_64
|
||||
endif
|
||||
|
||||
#
|
||||
# IMAGE_OFFSET is the load offset of the compression loader
|
||||
#
|
||||
IMAGE_OFFSET := $(shell /bin/bash -c 'printf "0x%08x" \
|
||||
$$[$(CONFIG_PAGE_OFFSET) + \
|
||||
$(CONFIG_MEMORY_START) + \
|
||||
$(CONFIG_BOOT_LINK_OFFSET)]')
|
||||
|
||||
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup -T $(obj)/../../kernel/vmlinux.lds
|
||||
|
||||
|
||||
$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-sh-linux -T
|
||||
OBJCOPYFLAGS += -R .empty_zero_page
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
#
|
||||
# linux/arch/sh/boot/compressed/Makefile
|
||||
#
|
||||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz \
|
||||
head_32.o misc_32.o piggy.o
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
OBJECTS = $(obj)/head_32.o $(obj)/misc_32.o
|
||||
|
||||
ifdef CONFIG_SH_STANDARD_BIOS
|
||||
OBJECTS += $(obj)/../../kernel/sh_bios.o
|
||||
endif
|
||||
|
||||
#
|
||||
# IMAGE_OFFSET is the load offset of the compression loader
|
||||
#
|
||||
IMAGE_OFFSET := $(shell /bin/bash -c 'printf "0x%08x" \
|
||||
$$[$(CONFIG_PAGE_OFFSET) + \
|
||||
$(CONFIG_MEMORY_START) + \
|
||||
$(CONFIG_BOOT_LINK_OFFSET)]')
|
||||
|
||||
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup -T $(obj)/../../kernel/vmlinux.lds
|
||||
|
||||
$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-sh-linux -T
|
||||
OBJCOPYFLAGS += -R .empty_zero_page
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
|
@ -1,32 +1,32 @@
|
|||
#
|
||||
# linux/arch/sh64/boot/compressed/Makefile
|
||||
# arch/sh/boot/compressed/Makefile_64
|
||||
#
|
||||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
# Copyright (C) 2002 Stuart Menefy
|
||||
# Copyright (C) 2004 Paul Mundt
|
||||
#
|
||||
# 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) 2002 Stuart Menefy
|
||||
# Copyright (C) 2004 Paul Mundt
|
||||
#
|
||||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz \
|
||||
head.o misc.o cache.o piggy.o vmlinux.lds
|
||||
|
||||
head_64.o misc_64.o cache.o piggy.o
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
OBJECTS := $(obj)/head.o $(obj)/misc.o $(obj)/cache.o
|
||||
OBJECTS := $(obj)/vmlinux_64.lds $(obj)/head_64.o $(obj)/misc_64.o \
|
||||
$(obj)/cache.o
|
||||
|
||||
#
|
||||
# ZIMAGE_OFFSET is the load offset of the compression loader
|
||||
# (4M for the kernel plus 64K for this loader)
|
||||
#
|
||||
ZIMAGE_OFFSET = $(shell printf "0x%8x" $$[$(CONFIG_MEMORY_START)+0x400000+0x10000])
|
||||
ZIMAGE_OFFSET := $(shell /bin/bash -c 'printf "0x%08x" \
|
||||
$$[$(CONFIG_PAGE_OFFSET)+0x400000+0x10000]')
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(ZIMAGE_OFFSET) -e startup \
|
||||
-T $(obj)/../../kernel/vmlinux.lds \
|
||||
--no-warn-mismatch
|
||||
-T $(obj)/../../kernel/vmlinux.lds
|
||||
|
||||
$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o FORCE
|
||||
$(call if_changed,ld)
|
||||
|
@ -41,6 +41,5 @@ $(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
|||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-sh64-linux -T
|
||||
OBJCOPYFLAGS += -R .empty_zero_page
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.lds $(obj)/vmlinux.bin.gz FORCE
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
int cache_control(unsigned int command)
|
||||
{
|
||||
volatile unsigned int *p = (volatile unsigned int *) 0x80000000;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (32 * 1024); i += 32) {
|
||||
(void)*p;
|
||||
p += (32 / sizeof (int));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -13,11 +13,10 @@
|
|||
* Modification for compressed loader:
|
||||
* Copyright (C) 2002 Stuart Menefy (stuart.menefy@st.com)
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/registers.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/cpu/mmu_context.h>
|
||||
#include <asm/cpu/registers.h>
|
||||
|
||||
/*
|
||||
* Fixed TLB entries to identity map the beginning of RAM
|
||||
|
@ -51,14 +50,14 @@ startup:
|
|||
* uninitialized target registers.
|
||||
* This must be executed before the first branch.
|
||||
*/
|
||||
ptabs/u ZERO, tr0
|
||||
ptabs/u ZERO, tr1
|
||||
ptabs/u ZERO, tr2
|
||||
ptabs/u ZERO, tr3
|
||||
ptabs/u ZERO, tr4
|
||||
ptabs/u ZERO, tr5
|
||||
ptabs/u ZERO, tr6
|
||||
ptabs/u ZERO, tr7
|
||||
ptabs/u r63, tr0
|
||||
ptabs/u r63, tr1
|
||||
ptabs/u r63, tr2
|
||||
ptabs/u r63, tr3
|
||||
ptabs/u r63, tr4
|
||||
ptabs/u r63, tr5
|
||||
ptabs/u r63, tr6
|
||||
ptabs/u r63, tr7
|
||||
synci
|
||||
|
||||
/*
|
||||
|
@ -69,7 +68,7 @@ startup:
|
|||
pta 1f, tr1
|
||||
movi ITLB_FIXED, r21
|
||||
movi ITLB_LAST_VAR_UNRESTRICTED+TLB_STEP, r22
|
||||
1: putcfg r21, 0, ZERO /* Clear MMUIR[n].PTEH.V */
|
||||
1: putcfg r21, 0, r63 /* Clear MMUIR[n].PTEH.V */
|
||||
addi r21, TLB_STEP, r21
|
||||
bne r21, r22, tr1
|
||||
|
||||
|
@ -77,7 +76,7 @@ startup:
|
|||
pta 1f, tr1
|
||||
movi DTLB_FIXED, r21
|
||||
movi DTLB_LAST_VAR_UNRESTRICTED+TLB_STEP, r22
|
||||
1: putcfg r21, 0, ZERO /* Clear MMUDR[n].PTEH.V */
|
||||
1: putcfg r21, 0, r63 /* Clear MMUDR[n].PTEH.V */
|
||||
addi r21, TLB_STEP, r21
|
||||
bne r21, r22, tr1
|
||||
|
||||
|
@ -133,7 +132,7 @@ startup:
|
|||
pt 1f, tr1
|
||||
movi datalabel __bss_start, r22
|
||||
movi datalabel _end, r23
|
||||
1: st.l r22, 0, ZERO
|
||||
1: st.l r22, 0, r63
|
||||
addi r22, 4, r22
|
||||
bne r22, r23, tr1
|
||||
|
||||
|
@ -161,4 +160,4 @@ startup:
|
|||
|
||||
/* Shouldn't return here, but just in case, loop forever */
|
||||
pt 1f, tr0
|
||||
1: blink tr0, ZERO
|
||||
1: blink tr0, r63
|
|
@ -230,7 +230,10 @@ long* stack_start = &user_stack[STACK_SIZE];
|
|||
void decompress_kernel(void)
|
||||
{
|
||||
output_data = 0;
|
||||
output_ptr = P2SEGADDR((unsigned long)&_text+PAGE_SIZE);
|
||||
output_ptr = PHYSADDR((unsigned long)&_text+PAGE_SIZE);
|
||||
#ifdef CONFIG_29BIT
|
||||
output_ptr |= P2SEG;
|
||||
#endif
|
||||
free_mem_ptr = (unsigned long)&_end;
|
||||
free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/sh64/boot/compressed/misc.c
|
||||
* arch/sh/boot/compressed/misc_64.c
|
||||
*
|
||||
* This is a collection of several routines from gzip-1.0.3
|
||||
* adapted for Linux.
|
|
@ -1,9 +0,0 @@
|
|||
#
|
||||
# Makefile for VoyagerGX
|
||||
#
|
||||
|
||||
obj-y := irq.o setup.o
|
||||
|
||||
obj-$(CONFIG_USB_OHCI_HCD) += consistent.o
|
||||
|
||||
EXTRA_CFLAGS += -Werror
|
|
@ -1,121 +0,0 @@
|
|||
/*
|
||||
* arch/sh/cchips/voyagergx/consistent.c
|
||||
*
|
||||
* Copyright (C) 2004 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/mm.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
|
||||
struct voya_alloc_entry {
|
||||
struct list_head list;
|
||||
unsigned long ofs;
|
||||
unsigned long len;
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(voya_list_lock);
|
||||
static LIST_HEAD(voya_alloc_list);
|
||||
|
||||
#define OHCI_SRAM_START 0xb0000000
|
||||
#define OHCI_HCCA_SIZE 0x100
|
||||
#define OHCI_SRAM_SIZE 0x10000
|
||||
|
||||
#define VOYAGER_OHCI_NAME "voyager-ohci"
|
||||
|
||||
void *voyagergx_consistent_alloc(struct device *dev, size_t size,
|
||||
dma_addr_t *handle, gfp_t flag)
|
||||
{
|
||||
struct list_head *list = &voya_alloc_list;
|
||||
struct voya_alloc_entry *entry;
|
||||
unsigned long start, end;
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* The SM501 contains an integrated 8051 with its own SRAM.
|
||||
* Devices within the cchip can all hook into the 8051 SRAM.
|
||||
* We presently use this for the OHCI.
|
||||
*
|
||||
* Everything else goes through consistent_alloc().
|
||||
*/
|
||||
if (!dev || strcmp(dev->driver->name, VOYAGER_OHCI_NAME))
|
||||
return NULL;
|
||||
|
||||
start = OHCI_SRAM_START + OHCI_HCCA_SIZE;
|
||||
|
||||
entry = kmalloc(sizeof(struct voya_alloc_entry), GFP_ATOMIC);
|
||||
if (!entry)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
entry->len = (size + 15) & ~15;
|
||||
|
||||
/*
|
||||
* The basis for this allocator is dwmw2's malloc.. the
|
||||
* Matrox allocator :-)
|
||||
*/
|
||||
spin_lock_irqsave(&voya_list_lock, flags);
|
||||
list_for_each(list, &voya_alloc_list) {
|
||||
struct voya_alloc_entry *p;
|
||||
|
||||
p = list_entry(list, struct voya_alloc_entry, list);
|
||||
|
||||
if (p->ofs - start >= size)
|
||||
goto out;
|
||||
|
||||
start = p->ofs + p->len;
|
||||
}
|
||||
|
||||
end = start + (OHCI_SRAM_SIZE - OHCI_HCCA_SIZE);
|
||||
list = &voya_alloc_list;
|
||||
|
||||
if (end - start >= size) {
|
||||
out:
|
||||
entry->ofs = start;
|
||||
list_add_tail(&entry->list, list);
|
||||
spin_unlock_irqrestore(&voya_list_lock, flags);
|
||||
|
||||
*handle = start;
|
||||
return (void *)start;
|
||||
}
|
||||
|
||||
kfree(entry);
|
||||
spin_unlock_irqrestore(&voya_list_lock, flags);
|
||||
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
int voyagergx_consistent_free(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t handle)
|
||||
{
|
||||
struct voya_alloc_entry *entry;
|
||||
unsigned long flags;
|
||||
|
||||
if (!dev || strcmp(dev->driver->name, VOYAGER_OHCI_NAME))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&voya_list_lock, flags);
|
||||
list_for_each_entry(entry, &voya_alloc_list, list) {
|
||||
if (entry->ofs != handle)
|
||||
continue;
|
||||
|
||||
list_del(&entry->list);
|
||||
kfree(entry);
|
||||
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&voya_list_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(voyagergx_consistent_alloc);
|
||||
EXPORT_SYMBOL(voyagergx_consistent_free);
|
|
@ -1,101 +0,0 @@
|
|||
/* -------------------------------------------------------------------- */
|
||||
/* setup_voyagergx.c: */
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Copyright 2003 (c) Lineo uSolutions,Inc.
|
||||
*/
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/voyagergx.h>
|
||||
#include <asm/rts7751r2d.h>
|
||||
|
||||
enum {
|
||||
UNUSED = 0,
|
||||
|
||||
/* voyager specific interrupt sources */
|
||||
UP, G54, G53, G52, G51, G50, G49, G48,
|
||||
I2C, PW, DMA, PCI, I2S, AC, US,
|
||||
U1, U0, CV, MC, S1, S0,
|
||||
UH, TWOD, ZD, PV, CI,
|
||||
};
|
||||
|
||||
static struct intc_vect vectors[] __initdata = {
|
||||
INTC_IRQ(UP, IRQ_SM501_UP), INTC_IRQ(G54, IRQ_SM501_G54),
|
||||
INTC_IRQ(G53, IRQ_SM501_G53), INTC_IRQ(G52, IRQ_SM501_G52),
|
||||
INTC_IRQ(G51, IRQ_SM501_G51), INTC_IRQ(G50, IRQ_SM501_G50),
|
||||
INTC_IRQ(G49, IRQ_SM501_G49), INTC_IRQ(G48, IRQ_SM501_G48),
|
||||
INTC_IRQ(I2C, IRQ_SM501_I2C), INTC_IRQ(PW, IRQ_SM501_PW),
|
||||
INTC_IRQ(DMA, IRQ_SM501_DMA), INTC_IRQ(PCI, IRQ_SM501_PCI),
|
||||
INTC_IRQ(I2S, IRQ_SM501_I2S), INTC_IRQ(AC, IRQ_SM501_AC),
|
||||
INTC_IRQ(US, IRQ_SM501_US), INTC_IRQ(U1, IRQ_SM501_U1),
|
||||
INTC_IRQ(U0, IRQ_SM501_U0), INTC_IRQ(CV, IRQ_SM501_CV),
|
||||
INTC_IRQ(MC, IRQ_SM501_MC), INTC_IRQ(S1, IRQ_SM501_S1),
|
||||
INTC_IRQ(S0, IRQ_SM501_S0), INTC_IRQ(UH, IRQ_SM501_UH),
|
||||
INTC_IRQ(TWOD, IRQ_SM501_2D), INTC_IRQ(ZD, IRQ_SM501_ZD),
|
||||
INTC_IRQ(PV, IRQ_SM501_PV), INTC_IRQ(CI, IRQ_SM501_CI),
|
||||
};
|
||||
|
||||
static struct intc_mask_reg mask_registers[] __initdata = {
|
||||
{ VOYAGER_INT_MASK, 0, 32, /* "Interrupt Mask", MMIO_base + 0x30 */
|
||||
{ UP, G54, G53, G52, G51, G50, G49, G48,
|
||||
I2C, PW, 0, DMA, PCI, I2S, AC, US,
|
||||
0, 0, U1, U0, CV, MC, S1, S0,
|
||||
0, UH, 0, 0, TWOD, ZD, PV, CI } },
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "voyagergx", vectors,
|
||||
NULL, NULL, mask_registers, NULL, NULL);
|
||||
|
||||
static unsigned int voyagergx_stat2irq[32] = {
|
||||
IRQ_SM501_CI, IRQ_SM501_PV, IRQ_SM501_ZD, IRQ_SM501_2D,
|
||||
0, 0, IRQ_SM501_UH, 0,
|
||||
IRQ_SM501_S0, IRQ_SM501_S1, IRQ_SM501_MC, IRQ_SM501_CV,
|
||||
IRQ_SM501_U0, IRQ_SM501_U1, 0, 0,
|
||||
IRQ_SM501_US, IRQ_SM501_AC, IRQ_SM501_I2S, IRQ_SM501_PCI,
|
||||
IRQ_SM501_DMA, 0, IRQ_SM501_PW, IRQ_SM501_I2C,
|
||||
IRQ_SM501_G48, IRQ_SM501_G49, IRQ_SM501_G50, IRQ_SM501_G51,
|
||||
IRQ_SM501_G52, IRQ_SM501_G53, IRQ_SM501_G54, IRQ_SM501_UP
|
||||
};
|
||||
|
||||
static void voyagergx_irq_demux(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
unsigned long intv = ctrl_inl(INT_STATUS);
|
||||
struct irq_desc *ext_desc;
|
||||
unsigned int ext_irq;
|
||||
unsigned int k = 0;
|
||||
|
||||
while (intv) {
|
||||
ext_irq = voyagergx_stat2irq[k];
|
||||
if (ext_irq && (intv & 1)) {
|
||||
ext_desc = irq_desc + ext_irq;
|
||||
handle_level_irq(ext_irq, ext_desc);
|
||||
}
|
||||
intv >>= 1;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
|
||||
void __init setup_voyagergx_irq(void)
|
||||
{
|
||||
printk(KERN_INFO "VoyagerGX on irq %d (mapped into %d to %d)\n",
|
||||
IRQ_VOYAGER,
|
||||
VOYAGER_IRQ_BASE,
|
||||
VOYAGER_IRQ_BASE + VOYAGER_IRQ_NUM - 1);
|
||||
|
||||
register_intc_controller(&intc_desc);
|
||||
set_irq_chained_handler(IRQ_VOYAGER, voyagergx_irq_demux);
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* arch/sh/cchips/voyagergx/setup.c
|
||||
*
|
||||
* Setup routines for VoyagerGX cchip.
|
||||
*
|
||||
* Copyright (C) 2003 Lineo uSolutions, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/voyagergx.h>
|
||||
|
||||
static int __init setup_voyagergx(void)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
val = readl((void __iomem *)DRAM_CTRL);
|
||||
val |= (DRAM_CTRL_CPU_COLUMN_SIZE_256 |
|
||||
DRAM_CTRL_CPU_ACTIVE_PRECHARGE |
|
||||
DRAM_CTRL_CPU_RESET |
|
||||
DRAM_CTRL_REFRESH_COMMAND |
|
||||
DRAM_CTRL_BLOCK_WRITE_TIME |
|
||||
DRAM_CTRL_BLOCK_WRITE_PRECHARGE |
|
||||
DRAM_CTRL_ACTIVE_PRECHARGE |
|
||||
DRAM_CTRL_RESET |
|
||||
DRAM_CTRL_REMAIN_ACTIVE);
|
||||
writel(val, (void __iomem *)DRAM_CTRL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(setup_voyagergx);
|
|
@ -1,18 +1,22 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.24-rc1
|
||||
# Fri Nov 2 14:35:27 2007
|
||||
# Linux kernel version: 2.6.24-rc3
|
||||
# Fri Nov 23 14:15:55 2007
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
# CONFIG_SUPERH32 is not set
|
||||
CONFIG_SUPERH64=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_QUICKLIST=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
# CONFIG_GENERIC_TIME is not set
|
||||
# CONFIG_GENERIC_CLOCKEVENTS is not set
|
||||
CONFIG_SYS_SUPPORTS_PCI=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||
|
@ -33,6 +37,7 @@ CONFIG_POSIX_MQUEUE=y
|
|||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
|
@ -45,7 +50,7 @@ CONFIG_SYSFS_DEPRECATED=y
|
|||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
|
@ -97,73 +102,153 @@ CONFIG_DEFAULT_IOSCHED="cfq"
|
|||
#
|
||||
# System type
|
||||
#
|
||||
# CONFIG_SH_SIMULATOR is not set
|
||||
CONFIG_SH_CAYMAN=y
|
||||
# CONFIG_SH_HARP is not set
|
||||
CONFIG_CPU_SH5=y
|
||||
# CONFIG_CPU_SUBTYPE_SH7619 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7206 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7705 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7706 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7707 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7708 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7709 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7710 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7712 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7720 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7750 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7091 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7750R is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7750S is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7751 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7751R is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7760 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH4_202 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7770 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7780 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7785 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SHX3 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7343 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7722 is not set
|
||||
CONFIG_CPU_SUBTYPE_SH5_101=y
|
||||
# CONFIG_CPU_SUBTYPE_SH5_103 is not set
|
||||
CONFIG_LITTLE_ENDIAN=y
|
||||
# CONFIG_BIG_ENDIAN is not set
|
||||
CONFIG_SH_FPU=y
|
||||
# CONFIG_SH64_FPU_DENORM_FLUSH is not set
|
||||
CONFIG_SH64_PGTABLE_2_LEVEL=y
|
||||
# CONFIG_SH64_PGTABLE_3_LEVEL is not set
|
||||
CONFIG_HUGETLB_PAGE_SIZE_64K=y
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_512MB is not set
|
||||
CONFIG_SH64_USER_MISALIGNED_FIXUP=y
|
||||
|
||||
#
|
||||
# Memory options
|
||||
# Memory management options
|
||||
#
|
||||
CONFIG_CACHED_MEMORY_OFFSET=0x20000000
|
||||
CONFIG_QUICKLIST=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_PAGE_OFFSET=0x20000000
|
||||
CONFIG_MEMORY_START=0x80000000
|
||||
CONFIG_MEMORY_SIZE_IN_MB=128
|
||||
|
||||
#
|
||||
# Cache options
|
||||
#
|
||||
CONFIG_DCACHE_WRITE_BACK=y
|
||||
# CONFIG_DCACHE_WRITE_THROUGH is not set
|
||||
# CONFIG_DCACHE_DISABLED is not set
|
||||
# CONFIG_ICACHE_DISABLED is not set
|
||||
CONFIG_PCIDEVICE_MEMORY_START=C0000000
|
||||
CONFIG_DEVICE_MEMORY_START=E0000000
|
||||
CONFIG_FLASH_MEMORY_START=0x00000000
|
||||
CONFIG_PCI_BLOCK_START=0x40000000
|
||||
|
||||
#
|
||||
# CPU Subtype specific options
|
||||
#
|
||||
CONFIG_SH64_ID2815_WORKAROUND=y
|
||||
|
||||
#
|
||||
# Misc options
|
||||
#
|
||||
CONFIG_HEARTBEAT=y
|
||||
CONFIG_HDSP253_LED=y
|
||||
# CONFIG_SH_DMA is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_MEMORY_SIZE=0x00400000
|
||||
CONFIG_32BIT=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_MAX_ACTIVE_REGIONS=1
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_PAGE_SIZE_4KB=y
|
||||
# CONFIG_PAGE_SIZE_8KB is not set
|
||||
# CONFIG_PAGE_SIZE_64KB is not set
|
||||
CONFIG_HUGETLB_PAGE_SIZE_64K=y
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_256K is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_512MB is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPARSEMEM_STATIC=y
|
||||
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_NR_QUICK=1
|
||||
CONFIG_NR_QUICK=2
|
||||
|
||||
#
|
||||
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
||||
# Cache configuration
|
||||
#
|
||||
# CONFIG_SH_DIRECT_MAPPED is not set
|
||||
# CONFIG_CACHE_WRITEBACK is not set
|
||||
# CONFIG_CACHE_WRITETHROUGH is not set
|
||||
CONFIG_CACHE_OFF=y
|
||||
|
||||
#
|
||||
# Processor features
|
||||
#
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
# CONFIG_CPU_BIG_ENDIAN is not set
|
||||
CONFIG_SH_FPU=y
|
||||
# CONFIG_SH64_FPU_DENORM_FLUSH is not set
|
||||
CONFIG_SH64_USER_MISALIGNED_FIXUP=y
|
||||
CONFIG_SH64_ID2815_WORKAROUND=y
|
||||
CONFIG_CPU_HAS_FPU=y
|
||||
|
||||
#
|
||||
# Board support
|
||||
#
|
||||
CONFIG_SH_CAYMAN=y
|
||||
|
||||
#
|
||||
# Timer and clock configuration
|
||||
#
|
||||
CONFIG_SH_TIMER_IRQ=16
|
||||
CONFIG_SH_PCLK_FREQ=50000000
|
||||
# CONFIG_TICK_ONESHOT is not set
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
|
||||
#
|
||||
# DMA support
|
||||
#
|
||||
|
||||
#
|
||||
# Companion Chips
|
||||
#
|
||||
|
||||
#
|
||||
# Additional SuperH Device Drivers
|
||||
#
|
||||
CONFIG_HEARTBEAT=y
|
||||
# CONFIG_PUSH_SWITCH is not set
|
||||
|
||||
#
|
||||
# Kernel features
|
||||
#
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
CONFIG_GUSA=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZERO_PAGE_OFFSET=0x00001000
|
||||
CONFIG_BOOT_LINK_OFFSET=0x00800000
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
|
||||
#
|
||||
# Bus options
|
||||
#
|
||||
CONFIG_PCI=y
|
||||
CONFIG_SH_PCIDMA_NONCOHERENT=y
|
||||
CONFIG_PCI_AUTO=y
|
||||
CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_PCI_LEGACY=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
# CONFIG_PCCARD is not set
|
||||
# CONFIG_HOTPLUG_PCI is not set
|
||||
|
@ -354,11 +439,7 @@ CONFIG_SCSI_LOWLEVEL=y
|
|||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_STEX is not set
|
||||
CONFIG_SCSI_SYM53C8XX_2=y
|
||||
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
|
||||
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
||||
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
||||
CONFIG_SCSI_SYM53C8XX_MMIO=y
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
# CONFIG_SCSI_QLA_FC is not set
|
||||
# CONFIG_SCSI_QLA_ISCSI is not set
|
||||
|
@ -391,6 +472,7 @@ CONFIG_NETDEVICES=y
|
|||
# CONFIG_PHYLIB is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
# CONFIG_AX88796 is not set
|
||||
# CONFIG_STNIC is not set
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
|
@ -398,40 +480,14 @@ CONFIG_NET_ETHERNET=y
|
|||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_SMC911X is not set
|
||||
CONFIG_NET_TULIP=y
|
||||
# CONFIG_DE2104X is not set
|
||||
CONFIG_TULIP=y
|
||||
# CONFIG_TULIP_MWI is not set
|
||||
# CONFIG_TULIP_MMIO is not set
|
||||
# CONFIG_TULIP_NAPI is not set
|
||||
# CONFIG_DE4X5 is not set
|
||||
# CONFIG_WINBOND_840 is not set
|
||||
# CONFIG_DM9102 is not set
|
||||
# CONFIG_ULI526X is not set
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
# CONFIG_PCNET32 is not set
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_NET_PCI is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
# CONFIG_E100 is not set
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
# CONFIG_NE2K_PCI is not set
|
||||
# CONFIG_8139CP is not set
|
||||
# CONFIG_8139TOO is not set
|
||||
# CONFIG_SIS900 is not set
|
||||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_TLAN is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
# CONFIG_SC92031 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
|
@ -492,7 +548,7 @@ CONFIG_INPUT=y
|
|||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
|
@ -502,24 +558,8 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_STOWAWAY is not set
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
CONFIG_MOUSE_PS2_ALPS=y
|
||||
CONFIG_MOUSE_PS2_LOGIPS2PP=y
|
||||
CONFIG_MOUSE_PS2_SYNAPTICS=y
|
||||
CONFIG_MOUSE_PS2_LIFEBOOK=y
|
||||
CONFIG_MOUSE_PS2_TRACKPOINT=y
|
||||
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_APPLETOUCH is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
|
@ -528,12 +568,7 @@ CONFIG_MOUSE_PS2_TRACKPOINT=y
|
|||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_I8042=y
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
|
@ -553,11 +588,7 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_SH_SCI=y
|
||||
CONFIG_SERIAL_SH_SCI_NR_UARTS=2
|
||||
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_SH_SCI is not set
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
|
@ -642,6 +673,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_ADT7470 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_I5K_AMB is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_F71882FG is not set
|
||||
# CONFIG_SENSORS_F75375S is not set
|
||||
|
@ -832,9 +864,9 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y
|
|||
CONFIG_FB=y
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
# CONFIG_FB_DDC is not set
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_CFB_FILLRECT is not set
|
||||
# CONFIG_FB_CFB_COPYAREA is not set
|
||||
# CONFIG_FB_CFB_IMAGEBLIT is not set
|
||||
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
|
||||
# CONFIG_FB_SYS_FILLRECT is not set
|
||||
# CONFIG_FB_SYS_COPYAREA is not set
|
||||
|
@ -866,7 +898,7 @@ CONFIG_FB_MODE_HELPERS=y
|
|||
# CONFIG_FB_SAVAGE is not set
|
||||
# CONFIG_FB_SIS is not set
|
||||
# CONFIG_FB_NEOMAGIC is not set
|
||||
CONFIG_FB_KYRO=y
|
||||
# CONFIG_FB_KYRO is not set
|
||||
# CONFIG_FB_3DFX is not set
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_VT8623 is not set
|
||||
|
@ -1062,6 +1094,7 @@ CONFIG_INSTRUMENTATION=y
|
|||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
|
@ -1076,10 +1109,14 @@ CONFIG_SCHED_DEBUG=y
|
|||
CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
|
@ -1094,8 +1131,11 @@ CONFIG_FORCED_INLINING=y
|
|||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
# CONFIG_EARLY_PRINTK is not set
|
||||
CONFIG_SH64_PROC_TLB=y
|
||||
# CONFIG_SH_STANDARD_BIOS is not set
|
||||
# CONFIG_EARLY_SCIF_CONSOLE is not set
|
||||
# CONFIG_DEBUG_BOOTMEM is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_4KSTACKS is not set
|
||||
CONFIG_SH64_PROC_ASIDS=y
|
||||
CONFIG_SH64_SR_WATCH=y
|
||||
# CONFIG_POOR_MANS_STRACE is not set
|
|
@ -1,908 +0,0 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.18
|
||||
# Tue Oct 3 13:04:52 2006
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_IPC_NS is not set
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
# CONFIG_KALLSYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System type
|
||||
#
|
||||
# CONFIG_SH_SOLUTION_ENGINE is not set
|
||||
# CONFIG_SH_7751_SOLUTION_ENGINE is not set
|
||||
# CONFIG_SH_7300_SOLUTION_ENGINE is not set
|
||||
# CONFIG_SH_7343_SOLUTION_ENGINE is not set
|
||||
# CONFIG_SH_73180_SOLUTION_ENGINE is not set
|
||||
# CONFIG_SH_7751_SYSTEMH is not set
|
||||
# CONFIG_SH_HP6XX is not set
|
||||
# CONFIG_SH_EC3104 is not set
|
||||
# CONFIG_SH_SATURN is not set
|
||||
# CONFIG_SH_DREAMCAST is not set
|
||||
# CONFIG_SH_BIGSUR is not set
|
||||
# CONFIG_SH_MPC1211 is not set
|
||||
# CONFIG_SH_SH03 is not set
|
||||
# CONFIG_SH_SECUREEDGE5410 is not set
|
||||
CONFIG_SH_HS7751RVOIP=y
|
||||
# CONFIG_SH_7710VOIPGW is not set
|
||||
# CONFIG_SH_RTS7751R2D is not set
|
||||
# CONFIG_SH_R7780RP is not set
|
||||
# CONFIG_SH_EDOSK7705 is not set
|
||||
# CONFIG_SH_SH4202_MICRODEV is not set
|
||||
# CONFIG_SH_LANDISK is not set
|
||||
# CONFIG_SH_TITAN is not set
|
||||
# CONFIG_SH_SHMIN is not set
|
||||
# CONFIG_SH_UNKNOWN is not set
|
||||
|
||||
#
|
||||
# Processor selection
|
||||
#
|
||||
CONFIG_CPU_SH4=y
|
||||
|
||||
#
|
||||
# SH-2 Processor Support
|
||||
#
|
||||
# CONFIG_CPU_SUBTYPE_SH7604 is not set
|
||||
|
||||
#
|
||||
# SH-3 Processor Support
|
||||
#
|
||||
# CONFIG_CPU_SUBTYPE_SH7300 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7705 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7706 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7707 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7708 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7709 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7710 is not set
|
||||
|
||||
#
|
||||
# SH-4 Processor Support
|
||||
#
|
||||
# CONFIG_CPU_SUBTYPE_SH7750 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7091 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7750R is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7750S is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7751 is not set
|
||||
CONFIG_CPU_SUBTYPE_SH7751R=y
|
||||
# CONFIG_CPU_SUBTYPE_SH7760 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH4_202 is not set
|
||||
|
||||
#
|
||||
# ST40 Processor Support
|
||||
#
|
||||
# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
|
||||
# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
|
||||
|
||||
#
|
||||
# SH-4A Processor Support
|
||||
#
|
||||
# CONFIG_CPU_SUBTYPE_SH7770 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7780 is not set
|
||||
|
||||
#
|
||||
# SH4AL-DSP Processor Support
|
||||
#
|
||||
# CONFIG_CPU_SUBTYPE_SH73180 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7343 is not set
|
||||
|
||||
#
|
||||
# Memory management options
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_PAGE_OFFSET=0x80000000
|
||||
CONFIG_MEMORY_START=0x0c000000
|
||||
CONFIG_MEMORY_SIZE=0x04000000
|
||||
CONFIG_VSYSCALL=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
|
||||
#
|
||||
# Cache configuration
|
||||
#
|
||||
# CONFIG_SH_DIRECT_MAPPED is not set
|
||||
# CONFIG_SH_WRITETHROUGH is not set
|
||||
# CONFIG_SH_OCRAM is not set
|
||||
|
||||
#
|
||||
# Processor features
|
||||
#
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_SH_FPU=y
|
||||
# CONFIG_SH_DSP is not set
|
||||
# CONFIG_SH_STORE_QUEUES is not set
|
||||
CONFIG_CPU_HAS_INTEVT=y
|
||||
CONFIG_CPU_HAS_SR_RB=y
|
||||
|
||||
#
|
||||
# Timer support
|
||||
#
|
||||
CONFIG_SH_TMU=y
|
||||
|
||||
#
|
||||
# HS7751RVoIP options
|
||||
#
|
||||
CONFIG_HS7751RVOIP_CODEC=y
|
||||
CONFIG_SH_PCLK_FREQ=60000000
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
|
||||
#
|
||||
# DMA support
|
||||
#
|
||||
# CONFIG_SH_DMA is not set
|
||||
|
||||
#
|
||||
# Companion Chips
|
||||
#
|
||||
# CONFIG_HD6446X_SERIES is not set
|
||||
|
||||
#
|
||||
# Kernel features
|
||||
#
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZERO_PAGE_OFFSET=0x00001000
|
||||
CONFIG_BOOT_LINK_OFFSET=0x00800000
|
||||
# CONFIG_UBC_WAKEUP is not set
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="mem=64M console=ttySC1,115200 root=/dev/hda1"
|
||||
|
||||
#
|
||||
# Bus options
|
||||
#
|
||||
# CONFIG_PCI is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
|
||||
#
|
||||
# Executable file formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_FLAT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
|
||||
#
|
||||
# Power management options (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
# CONFIG_XFRM_USER is not set
|
||||
# CONFIG_XFRM_SUB_POLICY is not set
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_ASK_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_MULTIPLE_TABLES is not set
|
||||
# CONFIG_IP_ROUTE_MULTIPATH is not set
|
||||
# CONFIG_IP_ROUTE_VERBOSE is not set
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=m
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_MAX_HWIFS=1
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=y
|
||||
# CONFIG_IDEDISK_MULTI_MODE is not set
|
||||
# CONFIG_BLK_DEV_IDECD is not set
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
|
||||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
CONFIG_IDE_GENERIC=y
|
||||
# CONFIG_IDE_ARM is not set
|
||||
# CONFIG_BLK_DEV_IDEDMA is not set
|
||||
# CONFIG_IDEDMA_AUTO is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
|
||||
#
|
||||
# Serial ATA (prod) and Parallel ATA (experimental) drivers
|
||||
#
|
||||
# CONFIG_ATA is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_STNIC is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_I8042=y
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_LIBPS2 is not set
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_SH_SCI=y
|
||||
CONFIG_SERIAL_SH_SCI_NR_UARTS=2
|
||||
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ABITUGURU is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
CONFIG_VIDEO_V4L2=y
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_DIRECTIO=y
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_ACORN_PARTITION is not set
|
||||
# CONFIG_OSF_PARTITION is not set
|
||||
# CONFIG_AMIGA_PARTITION is not set
|
||||
# CONFIG_ATARI_PARTITION is not set
|
||||
# CONFIG_MAC_PARTITION is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_BSD_DISKLABEL is not set
|
||||
# CONFIG_MINIX_SUBPARTITION is not set
|
||||
# CONFIG_SOLARIS_X86_PARTITION is not set
|
||||
# CONFIG_UNIXWARE_DISKLABEL is not set
|
||||
# CONFIG_LDM_PARTITION is not set
|
||||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_SH_STANDARD_BIOS is not set
|
||||
# CONFIG_EARLY_SCIF_CONSOLE is not set
|
||||
# CONFIG_KGDB is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=m
|
||||
CONFIG_CRYPTO_MANAGER=m
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_CBC=m
|
||||
CONFIG_CRYPTO_DES=y
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
# CONFIG_CRYPTO_DEFLATE is not set
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_PLIST=y
|
|
@ -1,9 +1,10 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.24-rc2
|
||||
# Tue Nov 13 20:34:57 2007
|
||||
# Linux kernel version: 2.6.24-rc3
|
||||
# Fri Nov 23 14:03:57 2007
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
CONFIG_SUPERH32=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
|
@ -39,6 +40,7 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
|
@ -130,6 +132,8 @@ CONFIG_CPU_SUBTYPE_SH7785=y
|
|||
# CONFIG_CPU_SUBTYPE_SHX3 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7343 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH7722 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH5_101 is not set
|
||||
# CONFIG_CPU_SUBTYPE_SH5_103 is not set
|
||||
|
||||
#
|
||||
# Memory management options
|
||||
|
@ -139,7 +143,8 @@ CONFIG_MMU=y
|
|||
CONFIG_PAGE_OFFSET=0x80000000
|
||||
CONFIG_MEMORY_START=0x08000000
|
||||
CONFIG_MEMORY_SIZE=0x08000000
|
||||
# CONFIG_32BIT is not set
|
||||
CONFIG_29BIT=y
|
||||
# CONFIG_PMB is not set
|
||||
# CONFIG_X2TLB is not set
|
||||
CONFIG_VSYSCALL=y
|
||||
# CONFIG_NUMA is not set
|
||||
|
@ -158,6 +163,7 @@ CONFIG_PAGE_SIZE_4KB=y
|
|||
CONFIG_HUGETLB_PAGE_SIZE_1MB=y
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_512MB is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
|
@ -701,6 +707,7 @@ CONFIG_DEVPORT=y
|
|||
# CONFIG_POWER_SUPPLY is not set
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_I5K_AMB is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_F71882FG is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -237,7 +237,7 @@ CONFIG_CPU_HAS_SR_RB=y
|
|||
CONFIG_SH_TMU=y
|
||||
CONFIG_SH_TIMER_IRQ=16
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
CONFIG_SH_PCLK_FREQ=33333333
|
||||
CONFIG_SH_PCLK_FREQ=66666666
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
|
|
|
@ -12,7 +12,7 @@ config SH_DMA
|
|||
config NR_ONCHIP_DMA_CHANNELS
|
||||
int
|
||||
depends on SH_DMA
|
||||
default "6" if CPU_SUBTYPE_SH7720
|
||||
default "6" if CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721
|
||||
default "8" if CPU_SUBTYPE_SH7750R || CPU_SUBTYPE_SH7751R
|
||||
default "12" if CPU_SUBTYPE_SH7780
|
||||
default "4"
|
||||
|
|
|
@ -25,6 +25,7 @@ static int dmte_irq_map[] = {
|
|||
DMTE2_IRQ,
|
||||
DMTE3_IRQ,
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7720) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7721) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7751R) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7760) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7709) || \
|
||||
|
@ -203,6 +204,7 @@ static int sh_dmac_get_dma_residue(struct dma_channel *chan)
|
|||
}
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7720) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7721) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7780)
|
||||
#define dmaor_read_reg() ctrl_inw(DMAOR)
|
||||
#define dmaor_write_reg(data) ctrl_outw(data, DMAOR)
|
||||
|
|
|
@ -7,16 +7,19 @@ obj-$(CONFIG_PCI_AUTO) += pci-auto.o
|
|||
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o ops-sh4.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7751R) += pci-sh7751.o ops-sh4.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7763) += pci-sh7780.o ops-sh4.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7785) += pci-sh7780.o ops-sh4.o
|
||||
obj-$(CONFIG_CPU_SH5) += pci-sh5.o ops-sh5.o
|
||||
|
||||
obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \
|
||||
dma-dreamcast.o
|
||||
obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o
|
||||
obj-$(CONFIG_SH_SECUREEDGE5410) += ops-snapgear.o
|
||||
obj-$(CONFIG_SH_RTS7751R2D) += ops-rts7751r2d.o fixups-rts7751r2d.o
|
||||
obj-$(CONFIG_SH_SH03) += ops-sh03.o fixups-sh03.o
|
||||
obj-$(CONFIG_SH_HIGHLANDER) += ops-r7780rp.o fixups-r7780rp.o
|
||||
obj-$(CONFIG_SH_SDK7780) += ops-sdk7780.o fixups-sdk7780.o
|
||||
obj-$(CONFIG_SH_TITAN) += ops-titan.o
|
||||
obj-$(CONFIG_SH_LANDISK) += ops-landisk.o
|
||||
obj-$(CONFIG_SH_LBOX_RE2) += ops-lboxre2.o fixups-lboxre2.o
|
||||
obj-$(CONFIG_SH_7780_SOLUTION_ENGINE) += ops-se7780.o fixups-se7780.o
|
||||
obj-$(CONFIG_SH_CAYMAN) += ops-cayman.o
|
||||
|
|
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* arch/sh/drivers/pci/dma-dreamcast.c
|
||||
*
|
||||
* PCI DMA support for the Sega Dreamcast
|
||||
*
|
||||
* Copyright (C) 2001, 2002 M. R. Brown
|
||||
* Copyright (C) 2002, 2003 Paul Mundt
|
||||
*
|
||||
* This file originally bore the message (with enclosed-$):
|
||||
* Id: pci.c,v 1.3 2003/05/04 19:29:46 lethal Exp
|
||||
* Dreamcast PCI: Supports SEGA Broadband Adaptor only.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
static int gapspci_dma_used = 0;
|
||||
|
||||
void *dreamcast_consistent_alloc(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
unsigned long buf;
|
||||
|
||||
if (dev && dev->bus != &pci_bus_type)
|
||||
return NULL;
|
||||
|
||||
if (gapspci_dma_used + size > GAPSPCI_DMA_SIZE)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
buf = GAPSPCI_DMA_BASE + gapspci_dma_used;
|
||||
|
||||
gapspci_dma_used = PAGE_ALIGN(gapspci_dma_used+size);
|
||||
|
||||
*dma_handle = (dma_addr_t)buf;
|
||||
|
||||
buf = P2SEGADDR(buf);
|
||||
|
||||
/* Flush the dcache before we hand off the buffer */
|
||||
__flush_purge_region((void *)buf, size);
|
||||
|
||||
return (void *)buf;
|
||||
}
|
||||
|
||||
int dreamcast_consistent_free(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle)
|
||||
{
|
||||
if (dev && dev->bus != &pci_bus_type)
|
||||
return -EINVAL;
|
||||
|
||||
/* XXX */
|
||||
gapspci_dma_used = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -40,6 +41,15 @@ static void __init gapspci_fixup_resources(struct pci_dev *dev)
|
|||
*/
|
||||
dev->resource[1].start = p->io_resource->start + 0x100;
|
||||
dev->resource[1].end = dev->resource[1].start + 0x200 - 1;
|
||||
/*
|
||||
* Redirect dma memory allocations to special memory window.
|
||||
*/
|
||||
BUG_ON(!dma_declare_coherent_memory(&dev->dev,
|
||||
GAPSPCI_DMA_BASE,
|
||||
GAPSPCI_DMA_BASE,
|
||||
GAPSPCI_DMA_SIZE,
|
||||
DMA_MEMORY_MAP |
|
||||
DMA_MEMORY_EXCLUSIVE));
|
||||
break;
|
||||
default:
|
||||
printk("PCI: Failed resource fixup\n");
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* arch/sh/drivers/pci/fixups-sdk7780.c
|
||||
*
|
||||
* PCI fixups for the SDK7780SE03
|
||||
*
|
||||
* Copyright (C) 2003 Lineo uSolutions, Inc.
|
||||
* Copyright (C) 2004 - 2006 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/pci.h>
|
||||
#include "pci-sh4.h"
|
||||
#include <asm/io.h>
|
||||
|
||||
int pci_fixup_pcic(void)
|
||||
{
|
||||
ctrl_outl(0x00000001, SH7780_PCI_VCR2);
|
||||
|
||||
/* Enable all interrupts, so we know what to fix */
|
||||
pci_write_reg(0x0000C3FF, SH7780_PCIIMR);
|
||||
pci_write_reg(0x0000380F, SH7780_PCIAINTM);
|
||||
|
||||
/* Set up standard PCI config registers */
|
||||
pci_write_reg(0xFB00, SH7780_PCISTATUS);
|
||||
pci_write_reg(0x0047, SH7780_PCICMD);
|
||||
pci_write_reg(0x00, SH7780_PCIPIF);
|
||||
pci_write_reg(0x00, SH7780_PCISUB);
|
||||
pci_write_reg(0x06, SH7780_PCIBCC);
|
||||
pci_write_reg(0x1912, SH7780_PCISVID);
|
||||
pci_write_reg(0x0001, SH7780_PCISID);
|
||||
|
||||
pci_write_reg(0x08000000, SH7780_PCIMBAR0); /* PCI */
|
||||
pci_write_reg(0x08000000, SH7780_PCILAR0); /* SHwy */
|
||||
pci_write_reg(0x07F00001, SH7780_PCILSR); /* size 128M w/ MBAR */
|
||||
|
||||
pci_write_reg(0x00000000, SH7780_PCIMBAR1);
|
||||
pci_write_reg(0x00000000, SH7780_PCILAR1);
|
||||
pci_write_reg(0x00000000, SH7780_PCILSR1);
|
||||
|
||||
pci_write_reg(0xAB000801, SH7780_PCIIBAR);
|
||||
|
||||
/*
|
||||
* Set the MBR so PCI address is one-to-one with window,
|
||||
* meaning all calls go straight through... use ifdef to
|
||||
* catch erroneous assumption.
|
||||
*/
|
||||
pci_write_reg(0xFD000000 , SH7780_PCIMBR0);
|
||||
pci_write_reg(0x00FC0000 , SH7780_PCIMBMR0); /* 16M */
|
||||
|
||||
/* Set IOBR for window containing area specified in pci.h */
|
||||
pci_write_reg(PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE-1), SH7780_PCIIOBR);
|
||||
pci_write_reg((SH7780_PCI_IO_SIZE-1) & (7 << 18), SH7780_PCIIOBMR);
|
||||
|
||||
pci_write_reg(0xA5000C01, SH7780_PCICR);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/cpu/irq.h>
|
||||
#include "pci-sh5.h"
|
||||
|
||||
static inline u8 bridge_swizzle(u8 pin, u8 slot)
|
||||
{
|
||||
return (((pin - 1) + slot) % 4) + 1;
|
||||
}
|
||||
|
||||
int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int result = -1;
|
||||
|
||||
/* The complication here is that the PCI IRQ lines from the Cayman's 2
|
||||
5V slots get into the CPU via a different path from the IRQ lines
|
||||
from the 3 3.3V slots. Thus, we have to detect whether the card's
|
||||
interrupts go via the 5V or 3.3V path, i.e. the 'bridge swizzling'
|
||||
at the point where we cross from 5V to 3.3V is not the normal case.
|
||||
|
||||
The added complication is that we don't know that the 5V slots are
|
||||
always bus 2, because a card containing a PCI-PCI bridge may be
|
||||
plugged into a 3.3V slot, and this changes the bus numbering.
|
||||
|
||||
Also, the Cayman has an intermediate PCI bus that goes a custom
|
||||
expansion board header (and to the secondary bridge). This bus has
|
||||
never been used in practice.
|
||||
|
||||
The 1ary onboard PCI-PCI bridge is device 3 on bus 0
|
||||
The 2ary onboard PCI-PCI bridge is device 0 on the 2ary bus of
|
||||
the 1ary bridge.
|
||||
*/
|
||||
|
||||
struct slot_pin {
|
||||
int slot;
|
||||
int pin;
|
||||
} path[4];
|
||||
int i=0;
|
||||
|
||||
while (dev->bus->number > 0) {
|
||||
|
||||
slot = path[i].slot = PCI_SLOT(dev->devfn);
|
||||
pin = path[i].pin = bridge_swizzle(pin, slot);
|
||||
dev = dev->bus->self;
|
||||
i++;
|
||||
if (i > 3) panic("PCI path to root bus too long!\n");
|
||||
}
|
||||
|
||||
slot = PCI_SLOT(dev->devfn);
|
||||
/* This is the slot on bus 0 through which the device is eventually
|
||||
reachable. */
|
||||
|
||||
/* Now work back up. */
|
||||
if ((slot < 3) || (i == 0)) {
|
||||
/* Bus 0 (incl. PCI-PCI bridge itself) : perform the final
|
||||
swizzle now. */
|
||||
result = IRQ_INTA + bridge_swizzle(pin, slot) - 1;
|
||||
} else {
|
||||
i--;
|
||||
slot = path[i].slot;
|
||||
pin = path[i].pin;
|
||||
if (slot > 0) {
|
||||
panic("PCI expansion bus device found - not handled!\n");
|
||||
} else {
|
||||
if (i > 0) {
|
||||
/* 5V slots */
|
||||
i--;
|
||||
slot = path[i].slot;
|
||||
pin = path[i].pin;
|
||||
/* 'pin' was swizzled earlier wrt slot, don't do it again. */
|
||||
result = IRQ_P2INTA + (pin - 1);
|
||||
} else {
|
||||
/* IRQ for 2ary PCI-PCI bridge : unused */
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct pci_channel board_pci_channels[] = {
|
||||
{ &sh5_pci_ops, NULL, NULL, 0, 0xff },
|
||||
{ NULL, NULL, NULL, 0, 0 },
|
||||
};
|
||||
EXPORT_SYMBOL(board_pci_channels);
|
||||
|
||||
int __init pcibios_init_platform(void)
|
||||
{
|
||||
return sh5pci_init(__pa(memory_start),
|
||||
__pa(memory_end) - __pa(memory_start));
|
||||
}
|
|
@ -17,25 +17,13 @@
|
|||
#include <asm/io.h>
|
||||
#include "pci-sh4.h"
|
||||
|
||||
static char r7780rp_irq_tab[] __initdata = {
|
||||
0, 1, 2, 3,
|
||||
};
|
||||
|
||||
static char r7780mp_irq_tab[] __initdata = {
|
||||
static char irq_tab[] __initdata = {
|
||||
65, 66, 67, 68,
|
||||
};
|
||||
|
||||
int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
||||
{
|
||||
if (mach_is_r7780rp())
|
||||
return r7780rp_irq_tab[slot];
|
||||
if (mach_is_r7780mp() || mach_is_r7785rp())
|
||||
return r7780mp_irq_tab[slot];
|
||||
|
||||
printk(KERN_ERR "PCI: Bad IRQ mapping "
|
||||
"request for slot %d, func %d\n", slot, pin-1);
|
||||
|
||||
return -1;
|
||||
return irq_tab[slot];
|
||||
}
|
||||
|
||||
static struct resource sh7780_io_resource = {
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* linux/arch/sh/drivers/pci/ops-sdk7780.c
|
||||
*
|
||||
* Copyright (C) 2006 Nobuhiro Iwamatsu
|
||||
*
|
||||
* PCI initialization for the SDK7780SE03
|
||||
*
|
||||
* May be copied or modified under the terms of the GNU General Public
|
||||
* License. See linux/COPYING for more information.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
#include <asm/sdk7780.h>
|
||||
#include <asm/io.h>
|
||||
#include "pci-sh4.h"
|
||||
|
||||
/* IDSEL [16][17][18][19][20][21][22][23][24][25][26][27][28][29][30][31] */
|
||||
static char sdk7780_irq_tab[4][16] __initdata = {
|
||||
/* INTA */
|
||||
{ 65, 68, 67, 68, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
/* INTB */
|
||||
{ 66, 65, -1, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
/* INTC */
|
||||
{ 67, 66, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
/* INTD */
|
||||
{ 68, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
};
|
||||
|
||||
int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
||||
{
|
||||
return sdk7780_irq_tab[pin-1][slot];
|
||||
}
|
||||
|
||||
static struct resource sdk7780_io_resource = {
|
||||
.name = "SH7780_IO",
|
||||
.start = SH7780_PCI_IO_BASE,
|
||||
.end = SH7780_PCI_IO_BASE + SH7780_PCI_IO_SIZE - 1,
|
||||
.flags = IORESOURCE_IO
|
||||
};
|
||||
|
||||
static struct resource sdk7780_mem_resource = {
|
||||
.name = "SH7780_mem",
|
||||
.start = SH7780_PCI_MEMORY_BASE,
|
||||
.end = SH7780_PCI_MEMORY_BASE + SH7780_PCI_MEM_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM
|
||||
};
|
||||
|
||||
struct pci_channel board_pci_channels[] = {
|
||||
{ &sh4_pci_ops, &sdk7780_io_resource, &sdk7780_mem_resource, 0, 0xff },
|
||||
{ NULL, NULL, NULL, 0, 0 },
|
||||
};
|
||||
EXPORT_SYMBOL(board_pci_channels);
|
||||
|
||||
static struct sh4_pci_address_map sdk7780_pci_map = {
|
||||
.window0 = {
|
||||
.base = SH7780_CS2_BASE_ADDR,
|
||||
.size = 0x04000000,
|
||||
},
|
||||
.window1 = {
|
||||
.base = SH7780_CS3_BASE_ADDR,
|
||||
.size = 0x04000000,
|
||||
},
|
||||
.flags = SH4_PCIC_NO_RESET,
|
||||
};
|
||||
|
||||
int __init pcibios_init_platform(void)
|
||||
{
|
||||
printk(KERN_INFO "SH7780 PCI: Finished initializing PCI controller\n");
|
||||
return sh7780_pcic_init(&sdk7780_pci_map);
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Support functions for the SH5 PCI hardware.
|
||||
*
|
||||
* Copyright (C) 2001 David J. Mckay (david.mckay@st.com)
|
||||
* Copyright (C) 2003, 2004 Paul Mundt
|
||||
* Copyright (C) 2004 Richard Curnow
|
||||
*
|
||||
* May be copied or modified under the terms of the GNU General Public
|
||||
* License. See linux/COPYING for more information.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/pci.h>
|
||||
#include <asm/io.h>
|
||||
#include "pci-sh5.h"
|
||||
|
||||
static void __init pci_fixup_ide_bases(struct pci_dev *d)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* PCI IDE controllers use non-standard I/O port decoding, respect it.
|
||||
*/
|
||||
if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
|
||||
return;
|
||||
printk("PCI: IDE base address fixup for %s\n", pci_name(d));
|
||||
for(i=0; i<4; i++) {
|
||||
struct resource *r = &d->resource[i];
|
||||
if ((r->start & ~0x80) == 0x374) {
|
||||
r->start |= 2;
|
||||
r->end = r->start;
|
||||
}
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);
|
||||
|
||||
char * __devinit pcibios_setup(char *str)
|
||||
{
|
||||
return str;
|
||||
}
|
||||
|
||||
static int sh5pci_read(struct pci_bus *bus, unsigned int devfn, int where,
|
||||
int size, u32 *val)
|
||||
{
|
||||
SH5PCI_WRITE(PAR, CONFIG_CMD(bus, devfn, where));
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
*val = (u8)SH5PCI_READ_BYTE(PDR + (where & 3));
|
||||
break;
|
||||
case 2:
|
||||
*val = (u16)SH5PCI_READ_SHORT(PDR + (where & 2));
|
||||
break;
|
||||
case 4:
|
||||
*val = SH5PCI_READ(PDR);
|
||||
break;
|
||||
}
|
||||
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static int sh5pci_write(struct pci_bus *bus, unsigned int devfn, int where,
|
||||
int size, u32 val)
|
||||
{
|
||||
SH5PCI_WRITE(PAR, CONFIG_CMD(bus, devfn, where));
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
SH5PCI_WRITE_BYTE(PDR + (where & 3), (u8)val);
|
||||
break;
|
||||
case 2:
|
||||
SH5PCI_WRITE_SHORT(PDR + (where & 2), (u16)val);
|
||||
break;
|
||||
case 4:
|
||||
SH5PCI_WRITE(PDR, val);
|
||||
break;
|
||||
}
|
||||
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
struct pci_ops sh5_pci_ops = {
|
||||
.read = sh5pci_read,
|
||||
.write = sh5pci_write,
|
||||
};
|
|
@ -516,10 +516,8 @@ pciauto_bus_scan(struct pci_channel *hose, int top_bus, int current_bus)
|
|||
PCI_COMMAND, cmdstat | PCI_COMMAND_IO |
|
||||
PCI_COMMAND_MEMORY |
|
||||
PCI_COMMAND_MASTER);
|
||||
#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
|
||||
early_write_config_byte(hose, top_bus, current_bus, pci_devfn,
|
||||
PCI_LATENCY_TIMER, 0x80);
|
||||
#endif
|
||||
|
||||
/* Allocate PCI I/O and/or memory space */
|
||||
pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_5);
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
#ifndef __PCI_SH4_H
|
||||
#define __PCI_SH4_H
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7780) || defined(CONFIG_CPU_SUBTYPE_SH7785)
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7780) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7785) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7763)
|
||||
#include "pci-sh7780.h"
|
||||
#else
|
||||
#include "pci-sh7751.h"
|
||||
|
|
|
@ -0,0 +1,228 @@
|
|||
/*
|
||||
* Copyright (C) 2001 David J. Mckay (david.mckay@st.com)
|
||||
* Copyright (C) 2003, 2004 Paul Mundt
|
||||
* Copyright (C) 2004 Richard Curnow
|
||||
*
|
||||
* May be copied or modified under the terms of the GNU General Public
|
||||
* License. See linux/COPYING for more information.
|
||||
*
|
||||
* Support functions for the SH5 PCI hardware.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/cpu/irq.h>
|
||||
#include <asm/pci.h>
|
||||
#include <asm/io.h>
|
||||
#include "pci-sh5.h"
|
||||
|
||||
unsigned long pcicr_virt;
|
||||
unsigned long PCI_IO_AREA;
|
||||
|
||||
/* Rounds a number UP to the nearest power of two. Used for
|
||||
* sizing the PCI window.
|
||||
*/
|
||||
static u32 __init r2p2(u32 num)
|
||||
{
|
||||
int i = 31;
|
||||
u32 tmp = num;
|
||||
|
||||
if (num == 0)
|
||||
return 0;
|
||||
|
||||
do {
|
||||
if (tmp & (1 << 31))
|
||||
break;
|
||||
i--;
|
||||
tmp <<= 1;
|
||||
} while (i >= 0);
|
||||
|
||||
tmp = 1 << i;
|
||||
/* If the original number isn't a power of 2, round it up */
|
||||
if (tmp != num)
|
||||
tmp <<= 1;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
static irqreturn_t pcish5_err_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
unsigned pci_int, pci_air, pci_cir, pci_aint;
|
||||
|
||||
pci_int = SH5PCI_READ(INT);
|
||||
pci_cir = SH5PCI_READ(CIR);
|
||||
pci_air = SH5PCI_READ(AIR);
|
||||
|
||||
if (pci_int) {
|
||||
printk("PCI INTERRUPT (at %08llx)!\n", regs->pc);
|
||||
printk("PCI INT -> 0x%x\n", pci_int & 0xffff);
|
||||
printk("PCI AIR -> 0x%x\n", pci_air);
|
||||
printk("PCI CIR -> 0x%x\n", pci_cir);
|
||||
SH5PCI_WRITE(INT, ~0);
|
||||
}
|
||||
|
||||
pci_aint = SH5PCI_READ(AINT);
|
||||
if (pci_aint) {
|
||||
printk("PCI ARB INTERRUPT!\n");
|
||||
printk("PCI AINT -> 0x%x\n", pci_aint);
|
||||
printk("PCI AIR -> 0x%x\n", pci_air);
|
||||
printk("PCI CIR -> 0x%x\n", pci_cir);
|
||||
SH5PCI_WRITE(AINT, ~0);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static irqreturn_t pcish5_serr_irq(int irq, void *dev_id)
|
||||
{
|
||||
printk("SERR IRQ\n");
|
||||
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
int __init sh5pci_init(unsigned long memStart, unsigned long memSize)
|
||||
{
|
||||
u32 lsr0;
|
||||
u32 uval;
|
||||
|
||||
if (request_irq(IRQ_ERR, pcish5_err_irq,
|
||||
IRQF_DISABLED, "PCI Error",NULL) < 0) {
|
||||
printk(KERN_ERR "PCISH5: Cannot hook PCI_PERR interrupt\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (request_irq(IRQ_SERR, pcish5_serr_irq,
|
||||
IRQF_DISABLED, "PCI SERR interrupt", NULL) < 0) {
|
||||
printk(KERN_ERR "PCISH5: Cannot hook PCI_SERR interrupt\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pcicr_virt = onchip_remap(SH5PCI_ICR_BASE, 1024, "PCICR");
|
||||
if (!pcicr_virt) {
|
||||
panic("Unable to remap PCICR\n");
|
||||
}
|
||||
|
||||
PCI_IO_AREA = onchip_remap(SH5PCI_IO_BASE, 0x10000, "PCIIO");
|
||||
if (!PCI_IO_AREA) {
|
||||
panic("Unable to remap PCIIO\n");
|
||||
}
|
||||
|
||||
/* Clear snoop registers */
|
||||
SH5PCI_WRITE(CSCR0, 0);
|
||||
SH5PCI_WRITE(CSCR1, 0);
|
||||
|
||||
/* Switch off interrupts */
|
||||
SH5PCI_WRITE(INTM, 0);
|
||||
SH5PCI_WRITE(AINTM, 0);
|
||||
SH5PCI_WRITE(PINTM, 0);
|
||||
|
||||
/* Set bus active, take it out of reset */
|
||||
uval = SH5PCI_READ(CR);
|
||||
|
||||
/* Set command Register */
|
||||
SH5PCI_WRITE(CR, uval | CR_LOCK_MASK | CR_CFINT| CR_FTO | CR_PFE |
|
||||
CR_PFCS | CR_BMAM);
|
||||
|
||||
uval=SH5PCI_READ(CR);
|
||||
|
||||
/* Allow it to be a master */
|
||||
/* NB - WE DISABLE I/O ACCESS to stop overlap */
|
||||
/* set WAIT bit to enable stepping, an attempt to improve stability */
|
||||
SH5PCI_WRITE_SHORT(CSR_CMD,
|
||||
PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
|
||||
PCI_COMMAND_WAIT);
|
||||
|
||||
/*
|
||||
** Set translation mapping memory in order to convert the address
|
||||
** used for the main bus, to the PCI internal address.
|
||||
*/
|
||||
SH5PCI_WRITE(MBR,0x40000000);
|
||||
|
||||
/* Always set the max size 512M */
|
||||
SH5PCI_WRITE(MBMR, PCISH5_MEM_SIZCONV(512*1024*1024));
|
||||
|
||||
/*
|
||||
** I/O addresses are mapped at internal PCI specific address
|
||||
** as is described into the configuration bridge table.
|
||||
** These are changed to 0, to allow cards that have legacy
|
||||
** io such as vga to function correctly. We set the SH5 IOBAR to
|
||||
** 256K, which is a bit big as we can only have 64K of address space
|
||||
*/
|
||||
|
||||
SH5PCI_WRITE(IOBR,0x0);
|
||||
|
||||
/* Set up a 256K window. Totally pointless waste of address space */
|
||||
SH5PCI_WRITE(IOBMR,0);
|
||||
|
||||
/* The SH5 has a HUGE 256K I/O region, which breaks the PCI spec.
|
||||
* Ideally, we would want to map the I/O region somewhere, but it
|
||||
* is so big this is not that easy!
|
||||
*/
|
||||
SH5PCI_WRITE(CSR_IBAR0,~0);
|
||||
/* Set memory size value */
|
||||
memSize = memory_end - memory_start;
|
||||
|
||||
/* Now we set up the mbars so the PCI bus can see the memory of
|
||||
* the machine */
|
||||
if (memSize < (1024 * 1024)) {
|
||||
printk(KERN_ERR "PCISH5: Ridiculous memory size of 0x%lx?\n",
|
||||
memSize);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Set LSR 0 */
|
||||
lsr0 = (memSize > (512 * 1024 * 1024)) ? 0x1ff00001 :
|
||||
((r2p2(memSize) - 0x100000) | 0x1);
|
||||
SH5PCI_WRITE(LSR0, lsr0);
|
||||
|
||||
/* Set MBAR 0 */
|
||||
SH5PCI_WRITE(CSR_MBAR0, memory_start);
|
||||
SH5PCI_WRITE(LAR0, memory_start);
|
||||
|
||||
SH5PCI_WRITE(CSR_MBAR1,0);
|
||||
SH5PCI_WRITE(LAR1,0);
|
||||
SH5PCI_WRITE(LSR1,0);
|
||||
|
||||
/* Enable the PCI interrupts on the device */
|
||||
SH5PCI_WRITE(INTM, ~0);
|
||||
SH5PCI_WRITE(AINTM, ~0);
|
||||
SH5PCI_WRITE(PINTM, ~0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *dev = bus->self;
|
||||
int i;
|
||||
|
||||
if (dev) {
|
||||
for (i= 0; i < 3; i++) {
|
||||
bus->resource[i] =
|
||||
&dev->resource[PCI_BRIDGE_RESOURCES+i];
|
||||
bus->resource[i]->name = bus->name;
|
||||
}
|
||||
bus->resource[0]->flags |= IORESOURCE_IO;
|
||||
bus->resource[1]->flags |= IORESOURCE_MEM;
|
||||
|
||||
/* For now, propagate host limits to the bus;
|
||||
* we'll adjust them later. */
|
||||
bus->resource[0]->end = 64*1024 - 1 ;
|
||||
bus->resource[1]->end = PCIBIOS_MIN_MEM+(256*1024*1024)-1;
|
||||
bus->resource[0]->start = PCIBIOS_MIN_IO;
|
||||
bus->resource[1]->start = PCIBIOS_MIN_MEM;
|
||||
|
||||
/* Turn off downstream PF memory address range by default */
|
||||
bus->resource[2]->start = 1024*1024;
|
||||
bus->resource[2]->end = bus->resource[2]->start - 1;
|
||||
}
|
||||
}
|
|
@ -6,6 +6,8 @@
|
|||
*
|
||||
* Definitions for the SH5 PCI hardware.
|
||||
*/
|
||||
#ifndef __PCI_SH5_H
|
||||
#define __PCI_SH5_H
|
||||
|
||||
/* Product ID */
|
||||
#define PCISH5_PID 0x350d
|
||||
|
@ -73,13 +75,12 @@
|
|||
#define PCISH5_ICR_CSR_MBAR0 0x014 /* First Memory base address register */
|
||||
#define PCISH5_ICR_CSR_MBAR1 0x018 /* Second Memory base address register */
|
||||
|
||||
|
||||
|
||||
/* Base address of registers */
|
||||
#define SH5PCI_ICR_BASE (PHYS_PCI_BLOCK + 0x00040000)
|
||||
#define SH5PCI_IO_BASE (PHYS_PCI_BLOCK + 0x00800000)
|
||||
/* #define SH5PCI_VCR_BASE (P2SEG_PCICB_BLOCK + P2SEG) */
|
||||
|
||||
extern unsigned long pcicr_virt;
|
||||
/* Register selection macro */
|
||||
#define PCISH5_ICR_REG(x) ( pcicr_virt + (PCISH5_ICR_##x))
|
||||
/* #define PCISH5_VCR_REG(x) ( SH5PCI_VCR_BASE (PCISH5_VCR_##x)) */
|
||||
|
@ -104,4 +105,9 @@
|
|||
#define PCISH5_MEM_SIZCONV(x) (((x / 0x40000) - 1) << 18)
|
||||
#define PCISH5_IO_SIZCONV(x) (((x / 0x40000) - 1) << 18)
|
||||
|
||||
extern struct pci_ops sh5_pci_ops;
|
||||
|
||||
/* arch/sh/drivers/pci/pci-sh5.c */
|
||||
int sh5pci_init(unsigned long memStart, unsigned long memSize);
|
||||
|
||||
#endif /* __PCI_SH5_H */
|
|
@ -58,6 +58,7 @@ static int __init sh7780_pci_init(void)
|
|||
id = pci_read_reg(SH7780_PCIVID);
|
||||
if ((id & 0xffff) == SH7780_VENDOR_ID) {
|
||||
switch ((id >> 16) & 0xffff) {
|
||||
case SH7763_DEVICE_ID:
|
||||
case SH7780_DEVICE_ID:
|
||||
case SH7781_DEVICE_ID:
|
||||
case SH7785_DEVICE_ID:
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#define SH7780_VENDOR_ID 0x1912
|
||||
#define SH7781_DEVICE_ID 0x0001
|
||||
#define SH7780_DEVICE_ID 0x0002
|
||||
#define SH7763_DEVICE_ID 0x0004
|
||||
#define SH7785_DEVICE_ID 0x0007
|
||||
|
||||
/* SH7780 Control Registers */
|
||||
|
|
|
@ -71,7 +71,7 @@ subsys_initcall(pcibios_init);
|
|||
* Called after each bus is probed, but before its children
|
||||
* are examined.
|
||||
*/
|
||||
void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
||||
void __devinit __weak pcibios_fixup_bus(struct pci_bus *bus)
|
||||
{
|
||||
pci_read_bridge_bases(bus);
|
||||
}
|
||||
|
|
|
@ -1,25 +1,5 @@
|
|||
#
|
||||
# Makefile for the Linux/SuperH kernel.
|
||||
#
|
||||
|
||||
extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := debugtraps.o io.o io_generic.o irq.o machvec.o process.o ptrace.o \
|
||||
semaphore.o setup.o signal.o sys_sh.o syscalls.o \
|
||||
time.o topology.o traps.o
|
||||
|
||||
obj-y += cpu/ timers/
|
||||
obj-$(CONFIG_VSYSCALL) += vsyscall/
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_CF_ENABLER) += cf-enabler.o
|
||||
obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o
|
||||
obj-$(CONFIG_SH_KGDB) += kgdb_stub.o kgdb_jmp.o
|
||||
obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o
|
||||
obj-$(CONFIG_MODULES) += sh_ksyms.o module.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
|
||||
EXTRA_CFLAGS += -Werror
|
||||
ifeq ($(CONFIG_SUPERH32),y)
|
||||
include ${srctree}/arch/sh/kernel/Makefile_32
|
||||
else
|
||||
include ${srctree}/arch/sh/kernel/Makefile_64
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
#
|
||||
# Makefile for the Linux/SuperH kernel.
|
||||
#
|
||||
|
||||
extra-y := head_32.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := debugtraps.o io.o io_generic.o irq.o machvec.o process_32.o \
|
||||
ptrace_32.o semaphore.o setup.o signal_32.o sys_sh.o sys_sh32.o \
|
||||
syscalls_32.o time_32.o topology.o traps.o traps_32.o
|
||||
|
||||
obj-y += cpu/ timers/
|
||||
obj-$(CONFIG_VSYSCALL) += vsyscall/
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_CF_ENABLER) += cf-enabler.o
|
||||
obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o
|
||||
obj-$(CONFIG_SH_KGDB) += kgdb_stub.o kgdb_jmp.o
|
||||
obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o
|
||||
obj-$(CONFIG_MODULES) += sh_ksyms_32.o module.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
obj-$(CONFIG_BINFMT_ELF) += dump_task.o
|
||||
|
||||
EXTRA_CFLAGS += -Werror
|
|
@ -0,0 +1,22 @@
|
|||
extra-y := head_64.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := debugtraps.o io.o io_generic.o irq.o machvec.o process_64.o \
|
||||
ptrace_64.o semaphore.o setup.o signal_64.o sys_sh.o sys_sh64.o \
|
||||
syscalls_64.o time_64.o topology.o traps.o traps_64.o
|
||||
|
||||
obj-y += cpu/ timers/
|
||||
obj-$(CONFIG_VSYSCALL) += vsyscall/
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_CF_ENABLER) += cf-enabler.o
|
||||
obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o
|
||||
obj-$(CONFIG_SH_KGDB) += kgdb_stub.o kgdb_jmp.o
|
||||
obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o
|
||||
obj-$(CONFIG_MODULES) += sh_ksyms_64.o module.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
obj-$(CONFIG_BINFMT_ELF) += dump_task.o
|
||||
|
||||
EXTRA_CFLAGS += -Werror
|
|
@ -6,8 +6,14 @@ obj-$(CONFIG_CPU_SH2) = sh2/
|
|||
obj-$(CONFIG_CPU_SH2A) = sh2a/
|
||||
obj-$(CONFIG_CPU_SH3) = sh3/
|
||||
obj-$(CONFIG_CPU_SH4) = sh4/
|
||||
obj-$(CONFIG_CPU_SH5) = sh5/
|
||||
|
||||
# Special cases for family ancestry.
|
||||
|
||||
obj-$(CONFIG_CPU_SH4A) += sh4a/
|
||||
|
||||
# Common interfaces.
|
||||
|
||||
obj-$(CONFIG_UBC_WAKEUP) += ubc.o
|
||||
obj-$(CONFIG_SH_ADC) += adc.o
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/log2.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -20,9 +21,12 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/elf.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/ubc.h>
|
||||
#include <asm/smp.h>
|
||||
#ifdef CONFIG_SUPERH32
|
||||
#include <asm/ubc.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generic wrapper for command line arguments to disable on-chip
|
||||
|
@ -61,25 +65,12 @@ static void __init speculative_execution_init(void)
|
|||
/*
|
||||
* Generic first-level cache init
|
||||
*/
|
||||
static void __init cache_init(void)
|
||||
#ifdef CONFIG_SUPERH32
|
||||
static void __uses_jump_to_uncached cache_init(void)
|
||||
{
|
||||
unsigned long ccr, flags;
|
||||
|
||||
/* First setup the rest of the I-cache info */
|
||||
current_cpu_data.icache.entry_mask = current_cpu_data.icache.way_incr -
|
||||
current_cpu_data.icache.linesz;
|
||||
|
||||
current_cpu_data.icache.way_size = current_cpu_data.icache.sets *
|
||||
current_cpu_data.icache.linesz;
|
||||
|
||||
/* And the D-cache too */
|
||||
current_cpu_data.dcache.entry_mask = current_cpu_data.dcache.way_incr -
|
||||
current_cpu_data.dcache.linesz;
|
||||
|
||||
current_cpu_data.dcache.way_size = current_cpu_data.dcache.sets *
|
||||
current_cpu_data.dcache.linesz;
|
||||
|
||||
jump_to_P2();
|
||||
jump_to_uncached();
|
||||
ccr = ctrl_inl(CCR);
|
||||
|
||||
/*
|
||||
|
@ -156,7 +147,31 @@ static void __init cache_init(void)
|
|||
#endif
|
||||
|
||||
ctrl_outl(flags, CCR);
|
||||
back_to_P1();
|
||||
back_to_cached();
|
||||
}
|
||||
#else
|
||||
#define cache_init() do { } while (0)
|
||||
#endif
|
||||
|
||||
#define CSHAPE(totalsize, linesize, assoc) \
|
||||
((totalsize & ~0xff) | (linesize << 4) | assoc)
|
||||
|
||||
#define CACHE_DESC_SHAPE(desc) \
|
||||
CSHAPE((desc).way_size * (desc).ways, ilog2((desc).linesz), (desc).ways)
|
||||
|
||||
static void detect_cache_shape(void)
|
||||
{
|
||||
l1d_cache_shape = CACHE_DESC_SHAPE(current_cpu_data.dcache);
|
||||
|
||||
if (current_cpu_data.dcache.flags & SH_CACHE_COMBINED)
|
||||
l1i_cache_shape = l1d_cache_shape;
|
||||
else
|
||||
l1i_cache_shape = CACHE_DESC_SHAPE(current_cpu_data.icache);
|
||||
|
||||
if (current_cpu_data.flags & CPU_HAS_L2_CACHE)
|
||||
l2_cache_shape = CACHE_DESC_SHAPE(current_cpu_data.scache);
|
||||
else
|
||||
l2_cache_shape = -1; /* No S-cache */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SH_DSP
|
||||
|
@ -228,14 +243,32 @@ asmlinkage void __cpuinit sh_cpu_init(void)
|
|||
if (current_cpu_data.type == CPU_SH_NONE)
|
||||
panic("Unknown CPU");
|
||||
|
||||
/* First setup the rest of the I-cache info */
|
||||
current_cpu_data.icache.entry_mask = current_cpu_data.icache.way_incr -
|
||||
current_cpu_data.icache.linesz;
|
||||
|
||||
current_cpu_data.icache.way_size = current_cpu_data.icache.sets *
|
||||
current_cpu_data.icache.linesz;
|
||||
|
||||
/* And the D-cache too */
|
||||
current_cpu_data.dcache.entry_mask = current_cpu_data.dcache.way_incr -
|
||||
current_cpu_data.dcache.linesz;
|
||||
|
||||
current_cpu_data.dcache.way_size = current_cpu_data.dcache.sets *
|
||||
current_cpu_data.dcache.linesz;
|
||||
|
||||
/* Init the cache */
|
||||
cache_init();
|
||||
|
||||
if (raw_smp_processor_id() == 0)
|
||||
if (raw_smp_processor_id() == 0) {
|
||||
shm_align_mask = max_t(unsigned long,
|
||||
current_cpu_data.dcache.way_size - 1,
|
||||
PAGE_SIZE - 1);
|
||||
|
||||
/* Boot CPU sets the cache shape */
|
||||
detect_cache_shape();
|
||||
}
|
||||
|
||||
/* Disable the FPU */
|
||||
if (fpu_disabled) {
|
||||
printk("FPU Disabled\n");
|
||||
|
@ -273,7 +306,10 @@ asmlinkage void __cpuinit sh_cpu_init(void)
|
|||
* like PTRACE_SINGLESTEP or doing hardware watchpoints in GDB. So ..
|
||||
* we wake it up and hope that all is well.
|
||||
*/
|
||||
#ifdef CONFIG_SUPERH32
|
||||
if (raw_smp_processor_id() == 0)
|
||||
ubc_wakeup();
|
||||
#endif
|
||||
|
||||
speculative_execution_init();
|
||||
}
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
#
|
||||
# Makefile for the Linux/SuperH CPU-specifc IRQ handlers.
|
||||
#
|
||||
obj-y += imask.o intc.o
|
||||
obj-y += intc.o
|
||||
|
||||
obj-$(CONFIG_SUPERH32) += imask.o
|
||||
obj-$(CONFIG_CPU_SH5) += intc-sh5.o
|
||||
obj-$(CONFIG_CPU_HAS_IPR_IRQ) += ipr.o
|
||||
obj-$(CONFIG_CPU_HAS_MASKREG_IRQ) += maskreg.o
|
||||
|
|
|
@ -1,34 +1,27 @@
|
|||
/*
|
||||
* 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.
|
||||
* arch/sh/kernel/cpu/irq/intc-sh5.c
|
||||
*
|
||||
* arch/sh64/kernel/irq_intc.c
|
||||
* Interrupt Controller support for SH5 INTC.
|
||||
*
|
||||
* Copyright (C) 2000, 2001 Paolo Alberelli
|
||||
* Copyright (C) 2003 Paul Mundt
|
||||
*
|
||||
* Interrupt Controller support for SH5 INTC.
|
||||
* Per-interrupt selective. IRLM=0 (Fixed priority) is not
|
||||
* supported being useless without a cascaded interrupt
|
||||
* controller.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/bitops.h> /* this includes also <asm/registers.h */
|
||||
/* which is required to remap register */
|
||||
/* names used into __asm__ blocks... */
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/platform.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <asm/cpu/irq.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
/*
|
||||
* Maybe the generic Peripheral block could move to a more
|
||||
|
@ -192,7 +185,7 @@ int intc_irq_describe(char* p, int irq)
|
|||
}
|
||||
#endif
|
||||
|
||||
void __init init_IRQ(void)
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
unsigned long long __dummy0, __dummy1=~0x00000000100000f0;
|
||||
unsigned long reg;
|
||||
|
@ -251,14 +244,6 @@ void __init init_IRQ(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SH_CAYMAN
|
||||
{
|
||||
extern void init_cayman_irq(void);
|
||||
|
||||
init_cayman_irq();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* And now let interrupts come in.
|
||||
* sti() is not enough, we need to
|
|
@ -335,31 +335,6 @@ static intc_enum __init intc_grp_id(struct intc_desc *desc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int __init intc_prio_value(struct intc_desc *desc,
|
||||
intc_enum enum_id, int do_grps)
|
||||
{
|
||||
struct intc_prio *p = desc->priorities;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; p && enum_id && i < desc->nr_priorities; i++) {
|
||||
p = desc->priorities + i;
|
||||
|
||||
if (p->enum_id != enum_id)
|
||||
continue;
|
||||
|
||||
return p->priority;
|
||||
}
|
||||
|
||||
if (do_grps)
|
||||
return intc_prio_value(desc, intc_grp_id(desc, enum_id), 0);
|
||||
|
||||
/* default to the lowest priority possible if no priority is set
|
||||
* - this needs to be at least 2 for 5-bit priorities on 7780
|
||||
*/
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
static unsigned int __init intc_mask_data(struct intc_desc *desc,
|
||||
struct intc_desc_int *d,
|
||||
intc_enum enum_id, int do_grps)
|
||||
|
@ -518,8 +493,10 @@ static void __init intc_register_irq(struct intc_desc *desc,
|
|||
handle_level_irq, "level");
|
||||
set_irq_chip_data(irq, (void *)data[primary]);
|
||||
|
||||
/* record the desired priority level */
|
||||
intc_prio_level[irq] = intc_prio_value(desc, enum_id, 1);
|
||||
/* set priority level
|
||||
* - this needs to be at least 2 for 5-bit priorities on 7780
|
||||
*/
|
||||
intc_prio_level[irq] = 2;
|
||||
|
||||
/* enable secondary masking method if present */
|
||||
if (data[!primary])
|
||||
|
|
|
@ -149,6 +149,14 @@ ENTRY(exception_handler)
|
|||
mov #32,r8
|
||||
cmp/hs r8,r9
|
||||
bt trap_entry ! 64 > vec >= 32 is trap
|
||||
|
||||
#if defined(CONFIG_SH_FPU)
|
||||
mov #13,r8
|
||||
cmp/eq r8,r9
|
||||
bt 10f ! fpu
|
||||
nop
|
||||
#endif
|
||||
|
||||
mov.l 4f,r8
|
||||
mov r9,r4
|
||||
shll2 r9
|
||||
|
@ -158,6 +166,10 @@ ENTRY(exception_handler)
|
|||
cmp/eq r9,r8
|
||||
bf 3f
|
||||
mov.l 8f,r8 ! unhandled exception
|
||||
#if defined(CONFIG_SH_FPU)
|
||||
10:
|
||||
mov.l 9f, r8 ! unhandled exception
|
||||
#endif
|
||||
3:
|
||||
mov.l 5f,r10
|
||||
jmp @r8
|
||||
|
@ -177,7 +189,10 @@ interrupt_entry:
|
|||
6: .long ret_from_irq
|
||||
7: .long do_IRQ
|
||||
8: .long do_exception_error
|
||||
|
||||
#ifdef CONFIG_SH_FPU
|
||||
9: .long fpu_error_trap_handler
|
||||
#endif
|
||||
|
||||
trap_entry:
|
||||
mov #0x30,r8
|
||||
cmp/ge r8,r9 ! vector 0x20-0x2f is systemcall
|
||||
|
@ -250,7 +265,7 @@ ENTRY(sh_bios_handler)
|
|||
1: .long gdb_vbr_vector
|
||||
#endif /* CONFIG_SH_STANDARD_BIOS */
|
||||
|
||||
ENTRY(address_error_handler)
|
||||
ENTRY(address_error_trap_handler)
|
||||
mov r15,r4 ! regs
|
||||
add #4,r4
|
||||
mov #OFF_PC,r0
|
||||
|
|
|
@ -65,7 +65,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, groups,
|
||||
NULL, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
static struct plat_sci_port sci_platform_data[] = {
|
||||
{
|
||||
|
|
|
@ -6,4 +6,8 @@ obj-y := common.o probe.o opcode_helper.o
|
|||
|
||||
common-y += $(addprefix ../sh2/, ex.o entry.o)
|
||||
|
||||
obj-$(CONFIG_SH_FPU) += fpu.o
|
||||
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7206) += setup-sh7206.o clock-sh7206.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7203) += setup-sh7203.o clock-sh7203.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7263) += setup-sh7203.o clock-sh7203.o
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* arch/sh/kernel/cpu/sh2a/clock-sh7203.c
|
||||
*
|
||||
* SH7203 support for the clock framework
|
||||
*
|
||||
* Copyright (C) 2007 Kieran Bingham (MPC-Data Ltd)
|
||||
*
|
||||
* Based on clock-sh7263.c
|
||||
* Copyright (C) 2006 Yoshinori Sato
|
||||
*
|
||||
* Based on clock-sh4.c
|
||||
* Copyright (C) 2005 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/clock.h>
|
||||
#include <asm/freq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
const static int pll1rate[]={8,12,16,0};
|
||||
const static int pfc_divisors[]={1,2,3,4,6,8,12};
|
||||
#define ifc_divisors pfc_divisors
|
||||
|
||||
#if (CONFIG_SH_CLK_MD == 0)
|
||||
#define PLL2 (1)
|
||||
#elif (CONFIG_SH_CLK_MD == 1)
|
||||
#define PLL2 (2)
|
||||
#elif (CONFIG_SH_CLK_MD == 2)
|
||||
#define PLL2 (4)
|
||||
#elif (CONFIG_SH_CLK_MD == 3)
|
||||
#define PLL2 (4)
|
||||
#else
|
||||
#error "Illegal Clock Mode!"
|
||||
#endif
|
||||
|
||||
static void master_clk_init(struct clk *clk)
|
||||
{
|
||||
clk->rate *= pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0003] * PLL2 ;
|
||||
}
|
||||
|
||||
static struct clk_ops sh7203_master_clk_ops = {
|
||||
.init = master_clk_init,
|
||||
};
|
||||
|
||||
static void module_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int idx = (ctrl_inw(FREQCR) & 0x0007);
|
||||
clk->rate = clk->parent->rate / pfc_divisors[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7203_module_clk_ops = {
|
||||
.recalc = module_clk_recalc,
|
||||
};
|
||||
|
||||
static void bus_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int idx = (ctrl_inw(FREQCR) & 0x0007);
|
||||
clk->rate = clk->parent->rate / pfc_divisors[idx-2];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7203_bus_clk_ops = {
|
||||
.recalc = bus_clk_recalc,
|
||||
};
|
||||
|
||||
static void cpu_clk_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = clk->parent->rate;
|
||||
}
|
||||
|
||||
static struct clk_ops sh7203_cpu_clk_ops = {
|
||||
.recalc = cpu_clk_recalc,
|
||||
};
|
||||
|
||||
static struct clk_ops *sh7203_clk_ops[] = {
|
||||
&sh7203_master_clk_ops,
|
||||
&sh7203_module_clk_ops,
|
||||
&sh7203_bus_clk_ops,
|
||||
&sh7203_cpu_clk_ops,
|
||||
};
|
||||
|
||||
void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
|
||||
{
|
||||
if (idx < ARRAY_SIZE(sh7203_clk_ops))
|
||||
*ops = sh7203_clk_ops[idx];
|
||||
}
|
|
@ -0,0 +1,633 @@
|
|||
/*
|
||||
* Save/restore floating point context for signal handlers.
|
||||
*
|
||||
* Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* FIXME! These routines can be optimized in big endian case.
|
||||
*/
|
||||
#include <linux/sched.h>
|
||||
#include <linux/signal.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/* The PR (precision) bit in the FP Status Register must be clear when
|
||||
* an frchg instruction is executed, otherwise the instruction is undefined.
|
||||
* Executing frchg with PR set causes a trap on some SH4 implementations.
|
||||
*/
|
||||
|
||||
#define FPSCR_RCHG 0x00000000
|
||||
|
||||
|
||||
/*
|
||||
* Save FPU registers onto task structure.
|
||||
* Assume called with FPU enabled (SR.FD=0).
|
||||
*/
|
||||
void
|
||||
save_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
||||
{
|
||||
unsigned long dummy;
|
||||
|
||||
clear_tsk_thread_flag(tsk, TIF_USEDFPU);
|
||||
enable_fpu();
|
||||
asm volatile("sts.l fpul, @-%0\n\t"
|
||||
"sts.l fpscr, @-%0\n\t"
|
||||
"fmov.s fr15, @-%0\n\t"
|
||||
"fmov.s fr14, @-%0\n\t"
|
||||
"fmov.s fr13, @-%0\n\t"
|
||||
"fmov.s fr12, @-%0\n\t"
|
||||
"fmov.s fr11, @-%0\n\t"
|
||||
"fmov.s fr10, @-%0\n\t"
|
||||
"fmov.s fr9, @-%0\n\t"
|
||||
"fmov.s fr8, @-%0\n\t"
|
||||
"fmov.s fr7, @-%0\n\t"
|
||||
"fmov.s fr6, @-%0\n\t"
|
||||
"fmov.s fr5, @-%0\n\t"
|
||||
"fmov.s fr4, @-%0\n\t"
|
||||
"fmov.s fr3, @-%0\n\t"
|
||||
"fmov.s fr2, @-%0\n\t"
|
||||
"fmov.s fr1, @-%0\n\t"
|
||||
"fmov.s fr0, @-%0\n\t"
|
||||
"lds %3, fpscr\n\t"
|
||||
: "=r" (dummy)
|
||||
: "0" ((char *)(&tsk->thread.fpu.hard.status)),
|
||||
"r" (FPSCR_RCHG),
|
||||
"r" (FPSCR_INIT)
|
||||
: "memory");
|
||||
|
||||
disable_fpu();
|
||||
release_fpu(regs);
|
||||
}
|
||||
|
||||
static void
|
||||
restore_fpu(struct task_struct *tsk)
|
||||
{
|
||||
unsigned long dummy;
|
||||
|
||||
enable_fpu();
|
||||
asm volatile("fmov.s @%0+, fr0\n\t"
|
||||
"fmov.s @%0+, fr1\n\t"
|
||||
"fmov.s @%0+, fr2\n\t"
|
||||
"fmov.s @%0+, fr3\n\t"
|
||||
"fmov.s @%0+, fr4\n\t"
|
||||
"fmov.s @%0+, fr5\n\t"
|
||||
"fmov.s @%0+, fr6\n\t"
|
||||
"fmov.s @%0+, fr7\n\t"
|
||||
"fmov.s @%0+, fr8\n\t"
|
||||
"fmov.s @%0+, fr9\n\t"
|
||||
"fmov.s @%0+, fr10\n\t"
|
||||
"fmov.s @%0+, fr11\n\t"
|
||||
"fmov.s @%0+, fr12\n\t"
|
||||
"fmov.s @%0+, fr13\n\t"
|
||||
"fmov.s @%0+, fr14\n\t"
|
||||
"fmov.s @%0+, fr15\n\t"
|
||||
"lds.l @%0+, fpscr\n\t"
|
||||
"lds.l @%0+, fpul\n\t"
|
||||
: "=r" (dummy)
|
||||
: "0" (&tsk->thread.fpu), "r" (FPSCR_RCHG)
|
||||
: "memory");
|
||||
disable_fpu();
|
||||
}
|
||||
|
||||
/*
|
||||
* Load the FPU with signalling NANS. This bit pattern we're using
|
||||
* has the property that no matter wether considered as single or as
|
||||
* double precission represents signaling NANS.
|
||||
*/
|
||||
|
||||
static void
|
||||
fpu_init(void)
|
||||
{
|
||||
enable_fpu();
|
||||
asm volatile("lds %0, fpul\n\t"
|
||||
"fsts fpul, fr0\n\t"
|
||||
"fsts fpul, fr1\n\t"
|
||||
"fsts fpul, fr2\n\t"
|
||||
"fsts fpul, fr3\n\t"
|
||||
"fsts fpul, fr4\n\t"
|
||||
"fsts fpul, fr5\n\t"
|
||||
"fsts fpul, fr6\n\t"
|
||||
"fsts fpul, fr7\n\t"
|
||||
"fsts fpul, fr8\n\t"
|
||||
"fsts fpul, fr9\n\t"
|
||||
"fsts fpul, fr10\n\t"
|
||||
"fsts fpul, fr11\n\t"
|
||||
"fsts fpul, fr12\n\t"
|
||||
"fsts fpul, fr13\n\t"
|
||||
"fsts fpul, fr14\n\t"
|
||||
"fsts fpul, fr15\n\t"
|
||||
"lds %2, fpscr\n\t"
|
||||
: /* no output */
|
||||
: "r" (0), "r" (FPSCR_RCHG), "r" (FPSCR_INIT));
|
||||
disable_fpu();
|
||||
}
|
||||
|
||||
/*
|
||||
* Emulate arithmetic ops on denormalized number for some FPU insns.
|
||||
*/
|
||||
|
||||
/* denormalized float * float */
|
||||
static int denormal_mulf(int hx, int hy)
|
||||
{
|
||||
unsigned int ix, iy;
|
||||
unsigned long long m, n;
|
||||
int exp, w;
|
||||
|
||||
ix = hx & 0x7fffffff;
|
||||
iy = hy & 0x7fffffff;
|
||||
if (iy < 0x00800000 || ix == 0)
|
||||
return ((hx ^ hy) & 0x80000000);
|
||||
|
||||
exp = (iy & 0x7f800000) >> 23;
|
||||
ix &= 0x007fffff;
|
||||
iy = (iy & 0x007fffff) | 0x00800000;
|
||||
m = (unsigned long long)ix * iy;
|
||||
n = m;
|
||||
w = -1;
|
||||
while (n) { n >>= 1; w++; }
|
||||
|
||||
/* FIXME: use guard bits */
|
||||
exp += w - 126 - 46;
|
||||
if (exp > 0)
|
||||
ix = ((int) (m >> (w - 23)) & 0x007fffff) | (exp << 23);
|
||||
else if (exp + 22 >= 0)
|
||||
ix = (int) (m >> (w - 22 - exp)) & 0x007fffff;
|
||||
else
|
||||
ix = 0;
|
||||
|
||||
ix |= (hx ^ hy) & 0x80000000;
|
||||
return ix;
|
||||
}
|
||||
|
||||
/* denormalized double * double */
|
||||
static void mult64(unsigned long long x, unsigned long long y,
|
||||
unsigned long long *highp, unsigned long long *lowp)
|
||||
{
|
||||
unsigned long long sub0, sub1, sub2, sub3;
|
||||
unsigned long long high, low;
|
||||
|
||||
sub0 = (x >> 32) * (unsigned long) (y >> 32);
|
||||
sub1 = (x & 0xffffffffLL) * (unsigned long) (y >> 32);
|
||||
sub2 = (x >> 32) * (unsigned long) (y & 0xffffffffLL);
|
||||
sub3 = (x & 0xffffffffLL) * (unsigned long) (y & 0xffffffffLL);
|
||||
low = sub3;
|
||||
high = 0LL;
|
||||
sub3 += (sub1 << 32);
|
||||
if (low > sub3)
|
||||
high++;
|
||||
low = sub3;
|
||||
sub3 += (sub2 << 32);
|
||||
if (low > sub3)
|
||||
high++;
|
||||
low = sub3;
|
||||
high += (sub1 >> 32) + (sub2 >> 32);
|
||||
high += sub0;
|
||||
*lowp = low;
|
||||
*highp = high;
|
||||
}
|
||||
|
||||
static inline long long rshift64(unsigned long long mh,
|
||||
unsigned long long ml, int n)
|
||||
{
|
||||
if (n >= 64)
|
||||
return mh >> (n - 64);
|
||||
return (mh << (64 - n)) | (ml >> n);
|
||||
}
|
||||
|
||||
static long long denormal_muld(long long hx, long long hy)
|
||||
{
|
||||
unsigned long long ix, iy;
|
||||
unsigned long long mh, ml, nh, nl;
|
||||
int exp, w;
|
||||
|
||||
ix = hx & 0x7fffffffffffffffLL;
|
||||
iy = hy & 0x7fffffffffffffffLL;
|
||||
if (iy < 0x0010000000000000LL || ix == 0)
|
||||
return ((hx ^ hy) & 0x8000000000000000LL);
|
||||
|
||||
exp = (iy & 0x7ff0000000000000LL) >> 52;
|
||||
ix &= 0x000fffffffffffffLL;
|
||||
iy = (iy & 0x000fffffffffffffLL) | 0x0010000000000000LL;
|
||||
mult64(ix, iy, &mh, &ml);
|
||||
nh = mh;
|
||||
nl = ml;
|
||||
w = -1;
|
||||
if (nh) {
|
||||
while (nh) { nh >>= 1; w++;}
|
||||
w += 64;
|
||||
} else
|
||||
while (nl) { nl >>= 1; w++;}
|
||||
|
||||
/* FIXME: use guard bits */
|
||||
exp += w - 1022 - 52 * 2;
|
||||
if (exp > 0)
|
||||
ix = (rshift64(mh, ml, w - 52) & 0x000fffffffffffffLL)
|
||||
| ((long long)exp << 52);
|
||||
else if (exp + 51 >= 0)
|
||||
ix = rshift64(mh, ml, w - 51 - exp) & 0x000fffffffffffffLL;
|
||||
else
|
||||
ix = 0;
|
||||
|
||||
ix |= (hx ^ hy) & 0x8000000000000000LL;
|
||||
return ix;
|
||||
}
|
||||
|
||||
/* ix - iy where iy: denormal and ix, iy >= 0 */
|
||||
static int denormal_subf1(unsigned int ix, unsigned int iy)
|
||||
{
|
||||
int frac;
|
||||
int exp;
|
||||
|
||||
if (ix < 0x00800000)
|
||||
return ix - iy;
|
||||
|
||||
exp = (ix & 0x7f800000) >> 23;
|
||||
if (exp - 1 > 31)
|
||||
return ix;
|
||||
iy >>= exp - 1;
|
||||
if (iy == 0)
|
||||
return ix;
|
||||
|
||||
frac = (ix & 0x007fffff) | 0x00800000;
|
||||
frac -= iy;
|
||||
while (frac < 0x00800000) {
|
||||
if (--exp == 0)
|
||||
return frac;
|
||||
frac <<= 1;
|
||||
}
|
||||
|
||||
return (exp << 23) | (frac & 0x007fffff);
|
||||
}
|
||||
|
||||
/* ix + iy where iy: denormal and ix, iy >= 0 */
|
||||
static int denormal_addf1(unsigned int ix, unsigned int iy)
|
||||
{
|
||||
int frac;
|
||||
int exp;
|
||||
|
||||
if (ix < 0x00800000)
|
||||
return ix + iy;
|
||||
|
||||
exp = (ix & 0x7f800000) >> 23;
|
||||
if (exp - 1 > 31)
|
||||
return ix;
|
||||
iy >>= exp - 1;
|
||||
if (iy == 0)
|
||||
return ix;
|
||||
|
||||
frac = (ix & 0x007fffff) | 0x00800000;
|
||||
frac += iy;
|
||||
if (frac >= 0x01000000) {
|
||||
frac >>= 1;
|
||||
++exp;
|
||||
}
|
||||
|
||||
return (exp << 23) | (frac & 0x007fffff);
|
||||
}
|
||||
|
||||
static int denormal_addf(int hx, int hy)
|
||||
{
|
||||
unsigned int ix, iy;
|
||||
int sign;
|
||||
|
||||
if ((hx ^ hy) & 0x80000000) {
|
||||
sign = hx & 0x80000000;
|
||||
ix = hx & 0x7fffffff;
|
||||
iy = hy & 0x7fffffff;
|
||||
if (iy < 0x00800000) {
|
||||
ix = denormal_subf1(ix, iy);
|
||||
if (ix < 0) {
|
||||
ix = -ix;
|
||||
sign ^= 0x80000000;
|
||||
}
|
||||
} else {
|
||||
ix = denormal_subf1(iy, ix);
|
||||
sign ^= 0x80000000;
|
||||
}
|
||||
} else {
|
||||
sign = hx & 0x80000000;
|
||||
ix = hx & 0x7fffffff;
|
||||
iy = hy & 0x7fffffff;
|
||||
if (iy < 0x00800000)
|
||||
ix = denormal_addf1(ix, iy);
|
||||
else
|
||||
ix = denormal_addf1(iy, ix);
|
||||
}
|
||||
|
||||
return sign | ix;
|
||||
}
|
||||
|
||||
/* ix - iy where iy: denormal and ix, iy >= 0 */
|
||||
static long long denormal_subd1(unsigned long long ix, unsigned long long iy)
|
||||
{
|
||||
long long frac;
|
||||
int exp;
|
||||
|
||||
if (ix < 0x0010000000000000LL)
|
||||
return ix - iy;
|
||||
|
||||
exp = (ix & 0x7ff0000000000000LL) >> 52;
|
||||
if (exp - 1 > 63)
|
||||
return ix;
|
||||
iy >>= exp - 1;
|
||||
if (iy == 0)
|
||||
return ix;
|
||||
|
||||
frac = (ix & 0x000fffffffffffffLL) | 0x0010000000000000LL;
|
||||
frac -= iy;
|
||||
while (frac < 0x0010000000000000LL) {
|
||||
if (--exp == 0)
|
||||
return frac;
|
||||
frac <<= 1;
|
||||
}
|
||||
|
||||
return ((long long)exp << 52) | (frac & 0x000fffffffffffffLL);
|
||||
}
|
||||
|
||||
/* ix + iy where iy: denormal and ix, iy >= 0 */
|
||||
static long long denormal_addd1(unsigned long long ix, unsigned long long iy)
|
||||
{
|
||||
long long frac;
|
||||
long long exp;
|
||||
|
||||
if (ix < 0x0010000000000000LL)
|
||||
return ix + iy;
|
||||
|
||||
exp = (ix & 0x7ff0000000000000LL) >> 52;
|
||||
if (exp - 1 > 63)
|
||||
return ix;
|
||||
iy >>= exp - 1;
|
||||
if (iy == 0)
|
||||
return ix;
|
||||
|
||||
frac = (ix & 0x000fffffffffffffLL) | 0x0010000000000000LL;
|
||||
frac += iy;
|
||||
if (frac >= 0x0020000000000000LL) {
|
||||
frac >>= 1;
|
||||
++exp;
|
||||
}
|
||||
|
||||
return (exp << 52) | (frac & 0x000fffffffffffffLL);
|
||||
}
|
||||
|
||||
static long long denormal_addd(long long hx, long long hy)
|
||||
{
|
||||
unsigned long long ix, iy;
|
||||
long long sign;
|
||||
|
||||
if ((hx ^ hy) & 0x8000000000000000LL) {
|
||||
sign = hx & 0x8000000000000000LL;
|
||||
ix = hx & 0x7fffffffffffffffLL;
|
||||
iy = hy & 0x7fffffffffffffffLL;
|
||||
if (iy < 0x0010000000000000LL) {
|
||||
ix = denormal_subd1(ix, iy);
|
||||
if (ix < 0) {
|
||||
ix = -ix;
|
||||
sign ^= 0x8000000000000000LL;
|
||||
}
|
||||
} else {
|
||||
ix = denormal_subd1(iy, ix);
|
||||
sign ^= 0x8000000000000000LL;
|
||||
}
|
||||
} else {
|
||||
sign = hx & 0x8000000000000000LL;
|
||||
ix = hx & 0x7fffffffffffffffLL;
|
||||
iy = hy & 0x7fffffffffffffffLL;
|
||||
if (iy < 0x0010000000000000LL)
|
||||
ix = denormal_addd1(ix, iy);
|
||||
else
|
||||
ix = denormal_addd1(iy, ix);
|
||||
}
|
||||
|
||||
return sign | ix;
|
||||
}
|
||||
|
||||
/**
|
||||
* denormal_to_double - Given denormalized float number,
|
||||
* store double float
|
||||
*
|
||||
* @fpu: Pointer to sh_fpu_hard structure
|
||||
* @n: Index to FP register
|
||||
*/
|
||||
static void
|
||||
denormal_to_double (struct sh_fpu_hard_struct *fpu, int n)
|
||||
{
|
||||
unsigned long du, dl;
|
||||
unsigned long x = fpu->fpul;
|
||||
int exp = 1023 - 126;
|
||||
|
||||
if (x != 0 && (x & 0x7f800000) == 0) {
|
||||
du = (x & 0x80000000);
|
||||
while ((x & 0x00800000) == 0) {
|
||||
x <<= 1;
|
||||
exp--;
|
||||
}
|
||||
x &= 0x007fffff;
|
||||
du |= (exp << 20) | (x >> 3);
|
||||
dl = x << 29;
|
||||
|
||||
fpu->fp_regs[n] = du;
|
||||
fpu->fp_regs[n+1] = dl;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee_fpe_handler - Handle denormalized number exception
|
||||
*
|
||||
* @regs: Pointer to register structure
|
||||
*
|
||||
* Returns 1 when it's handled (should not cause exception).
|
||||
*/
|
||||
static int
|
||||
ieee_fpe_handler (struct pt_regs *regs)
|
||||
{
|
||||
unsigned short insn = *(unsigned short *) regs->pc;
|
||||
unsigned short finsn;
|
||||
unsigned long nextpc;
|
||||
int nib[4] = {
|
||||
(insn >> 12) & 0xf,
|
||||
(insn >> 8) & 0xf,
|
||||
(insn >> 4) & 0xf,
|
||||
insn & 0xf};
|
||||
|
||||
if (nib[0] == 0xb ||
|
||||
(nib[0] == 0x4 && nib[2] == 0x0 && nib[3] == 0xb)) /* bsr & jsr */
|
||||
regs->pr = regs->pc + 4;
|
||||
if (nib[0] == 0xa || nib[0] == 0xb) { /* bra & bsr */
|
||||
nextpc = regs->pc + 4 + ((short) ((insn & 0xfff) << 4) >> 3);
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (nib[0] == 0x8 && nib[1] == 0xd) { /* bt/s */
|
||||
if (regs->sr & 1)
|
||||
nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
|
||||
else
|
||||
nextpc = regs->pc + 4;
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (nib[0] == 0x8 && nib[1] == 0xf) { /* bf/s */
|
||||
if (regs->sr & 1)
|
||||
nextpc = regs->pc + 4;
|
||||
else
|
||||
nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (nib[0] == 0x4 && nib[3] == 0xb &&
|
||||
(nib[2] == 0x0 || nib[2] == 0x2)) { /* jmp & jsr */
|
||||
nextpc = regs->regs[nib[1]];
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (nib[0] == 0x0 && nib[3] == 0x3 &&
|
||||
(nib[2] == 0x0 || nib[2] == 0x2)) { /* braf & bsrf */
|
||||
nextpc = regs->pc + 4 + regs->regs[nib[1]];
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (insn == 0x000b) { /* rts */
|
||||
nextpc = regs->pr;
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else {
|
||||
nextpc = regs->pc + 2;
|
||||
finsn = insn;
|
||||
}
|
||||
|
||||
#define FPSCR_FPU_ERROR (1 << 17)
|
||||
|
||||
if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
if ((tsk->thread.fpu.hard.fpscr & FPSCR_FPU_ERROR)) {
|
||||
/* FPU error */
|
||||
denormal_to_double (&tsk->thread.fpu.hard,
|
||||
(finsn >> 8) & 0xf);
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
} else if ((finsn & 0xf00f) == 0xf002) { /* fmul */
|
||||
struct task_struct *tsk = current;
|
||||
int fpscr;
|
||||
int n, m, prec;
|
||||
unsigned int hx, hy;
|
||||
|
||||
n = (finsn >> 8) & 0xf;
|
||||
m = (finsn >> 4) & 0xf;
|
||||
hx = tsk->thread.fpu.hard.fp_regs[n];
|
||||
hy = tsk->thread.fpu.hard.fp_regs[m];
|
||||
fpscr = tsk->thread.fpu.hard.fpscr;
|
||||
prec = fpscr & (1 << 19);
|
||||
|
||||
if ((fpscr & FPSCR_FPU_ERROR)
|
||||
&& (prec && ((hx & 0x7fffffff) < 0x00100000
|
||||
|| (hy & 0x7fffffff) < 0x00100000))) {
|
||||
long long llx, lly;
|
||||
|
||||
/* FPU error because of denormal */
|
||||
llx = ((long long) hx << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[n+1];
|
||||
lly = ((long long) hy << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[m+1];
|
||||
if ((hx & 0x7fffffff) >= 0x00100000)
|
||||
llx = denormal_muld(lly, llx);
|
||||
else
|
||||
llx = denormal_muld(llx, lly);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = llx >> 32;
|
||||
tsk->thread.fpu.hard.fp_regs[n+1] = llx & 0xffffffff;
|
||||
} else if ((fpscr & FPSCR_FPU_ERROR)
|
||||
&& (!prec && ((hx & 0x7fffffff) < 0x00800000
|
||||
|| (hy & 0x7fffffff) < 0x00800000))) {
|
||||
/* FPU error because of denormal */
|
||||
if ((hx & 0x7fffffff) >= 0x00800000)
|
||||
hx = denormal_mulf(hy, hx);
|
||||
else
|
||||
hx = denormal_mulf(hx, hy);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = hx;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
} else if ((finsn & 0xf00e) == 0xf000) { /* fadd, fsub */
|
||||
struct task_struct *tsk = current;
|
||||
int fpscr;
|
||||
int n, m, prec;
|
||||
unsigned int hx, hy;
|
||||
|
||||
n = (finsn >> 8) & 0xf;
|
||||
m = (finsn >> 4) & 0xf;
|
||||
hx = tsk->thread.fpu.hard.fp_regs[n];
|
||||
hy = tsk->thread.fpu.hard.fp_regs[m];
|
||||
fpscr = tsk->thread.fpu.hard.fpscr;
|
||||
prec = fpscr & (1 << 19);
|
||||
|
||||
if ((fpscr & FPSCR_FPU_ERROR)
|
||||
&& (prec && ((hx & 0x7fffffff) < 0x00100000
|
||||
|| (hy & 0x7fffffff) < 0x00100000))) {
|
||||
long long llx, lly;
|
||||
|
||||
/* FPU error because of denormal */
|
||||
llx = ((long long) hx << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[n+1];
|
||||
lly = ((long long) hy << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[m+1];
|
||||
if ((finsn & 0xf00f) == 0xf000)
|
||||
llx = denormal_addd(llx, lly);
|
||||
else
|
||||
llx = denormal_addd(llx, lly ^ (1LL << 63));
|
||||
tsk->thread.fpu.hard.fp_regs[n] = llx >> 32;
|
||||
tsk->thread.fpu.hard.fp_regs[n+1] = llx & 0xffffffff;
|
||||
} else if ((fpscr & FPSCR_FPU_ERROR)
|
||||
&& (!prec && ((hx & 0x7fffffff) < 0x00800000
|
||||
|| (hy & 0x7fffffff) < 0x00800000))) {
|
||||
/* FPU error because of denormal */
|
||||
if ((finsn & 0xf00f) == 0xf000)
|
||||
hx = denormal_addf(hx, hy);
|
||||
else
|
||||
hx = denormal_addf(hx, hy ^ 0x80000000);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = hx;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
BUILD_TRAP_HANDLER(fpu_error)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
TRAP_HANDLER_DECL;
|
||||
|
||||
save_fpu(tsk, regs);
|
||||
if (ieee_fpe_handler(regs)) {
|
||||
tsk->thread.fpu.hard.fpscr &=
|
||||
~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
|
||||
grab_fpu(regs);
|
||||
restore_fpu(tsk);
|
||||
set_tsk_thread_flag(tsk, TIF_USEDFPU);
|
||||
return;
|
||||
}
|
||||
|
||||
force_sig(SIGFPE, tsk);
|
||||
}
|
||||
|
||||
BUILD_TRAP_HANDLER(fpu_state_restore)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
TRAP_HANDLER_DECL;
|
||||
|
||||
grab_fpu(regs);
|
||||
if (!user_mode(regs)) {
|
||||
printk(KERN_ERR "BUG: FPU is used in kernel mode.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (used_math()) {
|
||||
/* Using the FPU again. */
|
||||
restore_fpu(tsk);
|
||||
} else {
|
||||
/* First time FPU user. */
|
||||
fpu_init();
|
||||
set_used_math();
|
||||
}
|
||||
set_tsk_thread_flag(tsk, TIF_USEDFPU);
|
||||
}
|
|
@ -3,25 +3,36 @@
|
|||
*
|
||||
* CPU Subtype Probing for SH-2A.
|
||||
*
|
||||
* Copyright (C) 2004, 2005 Paul Mundt
|
||||
* Copyright (C) 2004 - 2007 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
int __init detect_cpu_and_cache_system(void)
|
||||
{
|
||||
/* Just SH7206 for now .. */
|
||||
boot_cpu_data.type = CPU_SH7206;
|
||||
/* All SH-2A CPUs have support for 16 and 32-bit opcodes.. */
|
||||
boot_cpu_data.flags |= CPU_HAS_OP32;
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7203)
|
||||
boot_cpu_data.type = CPU_SH7203;
|
||||
/* SH7203 has an FPU.. */
|
||||
boot_cpu_data.flags |= CPU_HAS_FPU;
|
||||
#elif defined(CONFIG_CPU_SUBTYPE_SH7263)
|
||||
boot_cpu_data.type = CPU_SH7263;
|
||||
boot_cpu_data.flags |= CPU_HAS_FPU;
|
||||
#elif defined(CONFIG_CPU_SUBTYPE_SH7206)
|
||||
boot_cpu_data.type = CPU_SH7206;
|
||||
/* While SH7206 has a DSP.. */
|
||||
boot_cpu_data.flags |= CPU_HAS_DSP;
|
||||
#endif
|
||||
|
||||
boot_cpu_data.dcache.ways = 4;
|
||||
boot_cpu_data.dcache.way_incr = (1 << 11);
|
||||
boot_cpu_data.dcache.way_incr = (1 << 11);
|
||||
boot_cpu_data.dcache.sets = 128;
|
||||
boot_cpu_data.dcache.entry_shift = 4;
|
||||
boot_cpu_data.dcache.linesz = L1_CACHE_BYTES;
|
||||
|
@ -37,4 +48,3 @@ int __init detect_cpu_and_cache_system(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,319 @@
|
|||
/*
|
||||
* SH7203 and SH7263 Setup
|
||||
*
|
||||
* Copyright (C) 2007 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/serial.h>
|
||||
#include <asm/sci.h>
|
||||
|
||||
enum {
|
||||
UNUSED = 0,
|
||||
|
||||
/* interrupt sources */
|
||||
IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
|
||||
PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7,
|
||||
DMAC0_DEI, DMAC0_HEI, DMAC1_DEI, DMAC1_HEI,
|
||||
DMAC2_DEI, DMAC2_HEI, DMAC3_DEI, DMAC3_HEI,
|
||||
DMAC4_DEI, DMAC4_HEI, DMAC5_DEI, DMAC5_HEI,
|
||||
DMAC6_DEI, DMAC6_HEI, DMAC7_DEI, DMAC7_HEI,
|
||||
USB, LCDC, CMT0, CMT1, BSC, WDT,
|
||||
MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D,
|
||||
MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F,
|
||||
MTU2_TGI1A, MTU2_TGI1B, MTU2_TCI1V, MTU2_TCI1U,
|
||||
MTU2_TGI2A, MTU2_TGI2B, MTU2_TCI2V, MTU2_TCI2U,
|
||||
MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D, MTU2_TCI3V,
|
||||
MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D, MTU2_TCI4V,
|
||||
ADC_ADI,
|
||||
IIC30_STPI, IIC30_NAKI, IIC30_RXI, IIC30_TXI, IIC30_TEI,
|
||||
IIC31_STPI, IIC31_NAKI, IIC31_RXI, IIC31_TXI, IIC31_TEI,
|
||||
IIC32_STPI, IIC32_NAKI, IIC32_RXI, IIC32_TXI, IIC32_TEI,
|
||||
IIC33_STPI, IIC33_NAKI, IIC33_RXI, IIC33_TXI, IIC33_TEI,
|
||||
SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI,
|
||||
SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI,
|
||||
SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI,
|
||||
SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI,
|
||||
SSU0_SSERI, SSU0_SSRXI, SSU0_SSTXI,
|
||||
SSU1_SSERI, SSU1_SSRXI, SSU1_SSTXI,
|
||||
SSI0_SSII, SSI1_SSII, SSI2_SSII, SSI3_SSII,
|
||||
|
||||
/* ROM-DEC, SDHI, SRC, and IEB are SH7263 specific */
|
||||
ROMDEC_ISY, ROMDEC_IERR, ROMDEC_IARG, ROMDEC_ISEC, ROMDEC_IBUF,
|
||||
ROMDEC_IREADY,
|
||||
|
||||
FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I,
|
||||
|
||||
SDHI3, SDHI0, SDHI1,
|
||||
|
||||
RTC_ARM, RTC_PRD, RTC_CUP,
|
||||
RCAN0_ERS, RCAN0_OVR, RCAN0_RM0, RCAN0_RM1, RCAN0_SLE,
|
||||
RCAN1_ERS, RCAN1_OVR, RCAN1_RM0, RCAN1_RM1, RCAN1_SLE,
|
||||
|
||||
SRC_OVF, SRC_ODFI, SRC_IDEI, IEBI,
|
||||
|
||||
/* interrupt groups */
|
||||
PINT, DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7,
|
||||
MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU,
|
||||
MTU3_ABCD, MTU4_ABCD,
|
||||
IIC30, IIC31, IIC32, IIC33, SCIF0, SCIF1, SCIF2, SCIF3,
|
||||
SSU0, SSU1, ROMDEC, SDHI, FLCTL, RTC, RCAN0, RCAN1, SRC
|
||||
};
|
||||
|
||||
static struct intc_vect vectors[] __initdata = {
|
||||
INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),
|
||||
INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),
|
||||
INTC_IRQ(IRQ4, 68), INTC_IRQ(IRQ5, 69),
|
||||
INTC_IRQ(IRQ6, 70), INTC_IRQ(IRQ7, 71),
|
||||
INTC_IRQ(PINT0, 80), INTC_IRQ(PINT1, 81),
|
||||
INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83),
|
||||
INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85),
|
||||
INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87),
|
||||
INTC_IRQ(DMAC0_DEI, 108), INTC_IRQ(DMAC0_HEI, 109),
|
||||
INTC_IRQ(DMAC1_DEI, 112), INTC_IRQ(DMAC1_HEI, 113),
|
||||
INTC_IRQ(DMAC2_DEI, 116), INTC_IRQ(DMAC2_HEI, 117),
|
||||
INTC_IRQ(DMAC3_DEI, 120), INTC_IRQ(DMAC3_HEI, 121),
|
||||
INTC_IRQ(DMAC4_DEI, 124), INTC_IRQ(DMAC4_HEI, 125),
|
||||
INTC_IRQ(DMAC5_DEI, 128), INTC_IRQ(DMAC5_HEI, 129),
|
||||
INTC_IRQ(DMAC6_DEI, 132), INTC_IRQ(DMAC6_HEI, 133),
|
||||
INTC_IRQ(DMAC7_DEI, 136), INTC_IRQ(DMAC7_HEI, 137),
|
||||
INTC_IRQ(USB, 140), INTC_IRQ(LCDC, 141),
|
||||
INTC_IRQ(CMT0, 142), INTC_IRQ(CMT1, 143),
|
||||
INTC_IRQ(BSC, 144), INTC_IRQ(WDT, 145),
|
||||
INTC_IRQ(MTU2_TGI0A, 146), INTC_IRQ(MTU2_TGI0B, 147),
|
||||
INTC_IRQ(MTU2_TGI0C, 148), INTC_IRQ(MTU2_TGI0D, 149),
|
||||
INTC_IRQ(MTU2_TCI0V, 150),
|
||||
INTC_IRQ(MTU2_TGI0E, 151), INTC_IRQ(MTU2_TGI0F, 152),
|
||||
INTC_IRQ(MTU2_TGI1A, 153), INTC_IRQ(MTU2_TGI1B, 154),
|
||||
INTC_IRQ(MTU2_TCI1V, 155), INTC_IRQ(MTU2_TCI1U, 156),
|
||||
INTC_IRQ(MTU2_TGI2A, 157), INTC_IRQ(MTU2_TGI2B, 158),
|
||||
INTC_IRQ(MTU2_TCI2V, 159), INTC_IRQ(MTU2_TCI2U, 160),
|
||||
INTC_IRQ(MTU2_TGI3A, 161), INTC_IRQ(MTU2_TGI3B, 162),
|
||||
INTC_IRQ(MTU2_TGI3C, 163), INTC_IRQ(MTU2_TGI3D, 164),
|
||||
INTC_IRQ(MTU2_TCI3V, 165),
|
||||
INTC_IRQ(MTU2_TGI4A, 166), INTC_IRQ(MTU2_TGI4B, 167),
|
||||
INTC_IRQ(MTU2_TGI4C, 168), INTC_IRQ(MTU2_TGI4D, 169),
|
||||
INTC_IRQ(MTU2_TCI4V, 170),
|
||||
INTC_IRQ(ADC_ADI, 171),
|
||||
INTC_IRQ(IIC30_STPI, 172), INTC_IRQ(IIC30_NAKI, 173),
|
||||
INTC_IRQ(IIC30_RXI, 174), INTC_IRQ(IIC30_TXI, 175),
|
||||
INTC_IRQ(IIC30_TEI, 176),
|
||||
INTC_IRQ(IIC31_STPI, 177), INTC_IRQ(IIC31_NAKI, 178),
|
||||
INTC_IRQ(IIC31_RXI, 179), INTC_IRQ(IIC31_TXI, 180),
|
||||
INTC_IRQ(IIC31_TEI, 181),
|
||||
INTC_IRQ(IIC32_STPI, 182), INTC_IRQ(IIC32_NAKI, 183),
|
||||
INTC_IRQ(IIC32_RXI, 184), INTC_IRQ(IIC32_TXI, 185),
|
||||
INTC_IRQ(IIC32_TEI, 186),
|
||||
INTC_IRQ(IIC33_STPI, 187), INTC_IRQ(IIC33_NAKI, 188),
|
||||
INTC_IRQ(IIC33_RXI, 189), INTC_IRQ(IIC33_TXI, 190),
|
||||
INTC_IRQ(IIC33_TEI, 191),
|
||||
INTC_IRQ(SCIF0_BRI, 192), INTC_IRQ(SCIF0_ERI, 193),
|
||||
INTC_IRQ(SCIF0_RXI, 194), INTC_IRQ(SCIF0_TXI, 195),
|
||||
INTC_IRQ(SCIF1_BRI, 196), INTC_IRQ(SCIF1_ERI, 197),
|
||||
INTC_IRQ(SCIF1_RXI, 198), INTC_IRQ(SCIF1_TXI, 199),
|
||||
INTC_IRQ(SCIF2_BRI, 200), INTC_IRQ(SCIF2_ERI, 201),
|
||||
INTC_IRQ(SCIF2_RXI, 202), INTC_IRQ(SCIF2_TXI, 203),
|
||||
INTC_IRQ(SCIF3_BRI, 204), INTC_IRQ(SCIF3_ERI, 205),
|
||||
INTC_IRQ(SCIF3_RXI, 206), INTC_IRQ(SCIF3_TXI, 207),
|
||||
INTC_IRQ(SSU0_SSERI, 208), INTC_IRQ(SSU0_SSRXI, 209),
|
||||
INTC_IRQ(SSU0_SSTXI, 210),
|
||||
INTC_IRQ(SSU1_SSERI, 211), INTC_IRQ(SSU1_SSRXI, 212),
|
||||
INTC_IRQ(SSU1_SSTXI, 213),
|
||||
INTC_IRQ(SSI0_SSII, 214), INTC_IRQ(SSI1_SSII, 215),
|
||||
INTC_IRQ(SSI2_SSII, 216), INTC_IRQ(SSI3_SSII, 217),
|
||||
INTC_IRQ(FLCTL_FLSTEI, 224), INTC_IRQ(FLCTL_FLTENDI, 225),
|
||||
INTC_IRQ(FLCTL_FLTREQ0I, 226), INTC_IRQ(FLCTL_FLTREQ1I, 227),
|
||||
INTC_IRQ(RTC_ARM, 231), INTC_IRQ(RTC_PRD, 232),
|
||||
INTC_IRQ(RTC_CUP, 233),
|
||||
INTC_IRQ(RCAN0_ERS, 234), INTC_IRQ(RCAN0_OVR, 235),
|
||||
INTC_IRQ(RCAN0_RM0, 236), INTC_IRQ(RCAN0_RM1, 237),
|
||||
INTC_IRQ(RCAN0_SLE, 238),
|
||||
INTC_IRQ(RCAN1_ERS, 239), INTC_IRQ(RCAN1_OVR, 240),
|
||||
INTC_IRQ(RCAN1_RM0, 241), INTC_IRQ(RCAN1_RM1, 242),
|
||||
INTC_IRQ(RCAN1_SLE, 243),
|
||||
|
||||
/* SH7263-specific trash */
|
||||
#ifdef CONFIG_CPU_SUBTYPE_SH7263
|
||||
INTC_IRQ(ROMDEC_ISY, 218), INTC_IRQ(ROMDEC_IERR, 219),
|
||||
INTC_IRQ(ROMDEC_IARG, 220), INTC_IRQ(ROMDEC_ISEC, 221),
|
||||
INTC_IRQ(ROMDEC_IBUF, 222), INTC_IRQ(ROMDEC_IREADY, 223),
|
||||
|
||||
INTC_IRQ(SDHI3, 228), INTC_IRQ(SDHI0, 229), INTC_IRQ(SDHI1, 230),
|
||||
|
||||
INTC_IRQ(SRC_OVF, 244), INTC_IRQ(SRC_ODFI, 245),
|
||||
INTC_IRQ(SRC_IDEI, 246),
|
||||
|
||||
INTC_IRQ(IEBI, 247),
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct intc_group groups[] __initdata = {
|
||||
INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3,
|
||||
PINT4, PINT5, PINT6, PINT7),
|
||||
INTC_GROUP(DMAC0, DMAC0_DEI, DMAC0_HEI),
|
||||
INTC_GROUP(DMAC1, DMAC1_DEI, DMAC1_HEI),
|
||||
INTC_GROUP(DMAC2, DMAC2_DEI, DMAC2_HEI),
|
||||
INTC_GROUP(DMAC3, DMAC3_DEI, DMAC3_HEI),
|
||||
INTC_GROUP(DMAC4, DMAC4_DEI, DMAC4_HEI),
|
||||
INTC_GROUP(DMAC5, DMAC5_DEI, DMAC5_HEI),
|
||||
INTC_GROUP(DMAC6, DMAC6_DEI, DMAC6_HEI),
|
||||
INTC_GROUP(DMAC7, DMAC7_DEI, DMAC7_HEI),
|
||||
INTC_GROUP(MTU0_ABCD, MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D),
|
||||
INTC_GROUP(MTU0_VEF, MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F),
|
||||
INTC_GROUP(MTU1_AB, MTU2_TGI1A, MTU2_TGI1B),
|
||||
INTC_GROUP(MTU1_VU, MTU2_TCI1V, MTU2_TCI1U),
|
||||
INTC_GROUP(MTU2_AB, MTU2_TGI2A, MTU2_TGI2B),
|
||||
INTC_GROUP(MTU2_VU, MTU2_TCI2V, MTU2_TCI2U),
|
||||
INTC_GROUP(MTU3_ABCD, MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D),
|
||||
INTC_GROUP(MTU4_ABCD, MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D),
|
||||
INTC_GROUP(IIC30, IIC30_STPI, IIC30_NAKI, IIC30_RXI, IIC30_TXI,
|
||||
IIC30_TEI),
|
||||
INTC_GROUP(IIC31, IIC31_STPI, IIC31_NAKI, IIC31_RXI, IIC31_TXI,
|
||||
IIC31_TEI),
|
||||
INTC_GROUP(IIC32, IIC32_STPI, IIC32_NAKI, IIC32_RXI, IIC32_TXI,
|
||||
IIC32_TEI),
|
||||
INTC_GROUP(IIC33, IIC33_STPI, IIC33_NAKI, IIC33_RXI, IIC33_TXI,
|
||||
IIC33_TEI),
|
||||
INTC_GROUP(SCIF0, SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI),
|
||||
INTC_GROUP(SCIF1, SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI),
|
||||
INTC_GROUP(SCIF2, SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI),
|
||||
INTC_GROUP(SCIF3, SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI),
|
||||
INTC_GROUP(SSU0, SSU0_SSERI, SSU0_SSRXI, SSU0_SSTXI),
|
||||
INTC_GROUP(SSU1, SSU1_SSERI, SSU1_SSRXI, SSU1_SSTXI),
|
||||
INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I,
|
||||
FLCTL_FLTREQ1I),
|
||||
INTC_GROUP(RTC, RTC_ARM, RTC_PRD, RTC_CUP),
|
||||
INTC_GROUP(RCAN0, RCAN0_ERS, RCAN0_OVR, RCAN0_RM0, RCAN0_RM1,
|
||||
RCAN0_SLE),
|
||||
INTC_GROUP(RCAN1, RCAN1_ERS, RCAN1_OVR, RCAN1_RM0, RCAN1_RM1,
|
||||
RCAN1_SLE),
|
||||
|
||||
#ifdef CONFIG_CPU_SUBTYPE_SH7263
|
||||
INTC_GROUP(ROMDEC, ROMDEC_ISY, ROMDEC_IERR, ROMDEC_IARG,
|
||||
ROMDEC_ISEC, ROMDEC_IBUF, ROMDEC_IREADY),
|
||||
INTC_GROUP(SDHI, SDHI3, SDHI0, SDHI1),
|
||||
INTC_GROUP(SRC, SRC_OVF, SRC_ODFI, SRC_IDEI),
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct intc_prio_reg prio_registers[] __initdata = {
|
||||
{ 0xfffe0818, 0, 16, 4, /* IPR01 */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
|
||||
{ 0xfffe081a, 0, 16, 4, /* IPR02 */ { IRQ4, IRQ5, IRQ6, IRQ7 } },
|
||||
{ 0xfffe0820, 0, 16, 4, /* IPR05 */ { PINT, 0, 0, 0 } },
|
||||
{ 0xfffe0c00, 0, 16, 4, /* IPR06 */ { DMAC0, DMAC1, DMAC2, DMAC3 } },
|
||||
{ 0xfffe0c02, 0, 16, 4, /* IPR07 */ { DMAC4, DMAC5, DMAC6, DMAC7 } },
|
||||
{ 0xfffe0c04, 0, 16, 4, /* IPR08 */ { USB, LCDC, CMT0, CMT1 } },
|
||||
{ 0xfffe0c06, 0, 16, 4, /* IPR09 */ { BSC, WDT, MTU0_ABCD, MTU0_VEF } },
|
||||
{ 0xfffe0c08, 0, 16, 4, /* IPR10 */ { MTU1_AB, MTU1_VU, MTU2_AB,
|
||||
MTU2_VU } },
|
||||
{ 0xfffe0c0a, 0, 16, 4, /* IPR11 */ { MTU3_ABCD, MTU2_TCI3V, MTU4_ABCD,
|
||||
MTU2_TCI4V } },
|
||||
{ 0xfffe0c0c, 0, 16, 4, /* IPR12 */ { ADC_ADI, IIC30, IIC31, IIC32 } },
|
||||
{ 0xfffe0c0e, 0, 16, 4, /* IPR13 */ { IIC33, SCIF0, SCIF1, SCIF2 } },
|
||||
{ 0xfffe0c10, 0, 16, 4, /* IPR14 */ { SCIF3, SSU0, SSU1, SSI0_SSII } },
|
||||
#ifdef CONFIG_CPU_SUBTYPE_SH7203
|
||||
{ 0xfffe0c12, 0, 16, 4, /* IPR15 */ { SSI1_SSII, SSI2_SSII,
|
||||
SSI3_SSII, 0 } },
|
||||
{ 0xfffe0c14, 0, 16, 4, /* IPR16 */ { FLCTL, 0, RTC, RCAN0 } },
|
||||
{ 0xfffe0c16, 0, 16, 4, /* IPR17 */ { RCAN1, 0, 0, 0 } },
|
||||
#else
|
||||
{ 0xfffe0c12, 0, 16, 4, /* IPR15 */ { SSI1_SSII, SSI2_SSII,
|
||||
SSI3_SSII, ROMDEC } },
|
||||
{ 0xfffe0c14, 0, 16, 4, /* IPR16 */ { FLCTL, SDHI, RTC, RCAN0 } },
|
||||
{ 0xfffe0c16, 0, 16, 4, /* IPR17 */ { RCAN1, SRC, IEBI, 0 } },
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct intc_mask_reg mask_registers[] __initdata = {
|
||||
{ 0xfffe0808, 0, 16, /* PINTER */
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
PINT7, PINT6, PINT5, PINT4, PINT3, PINT2, PINT1, PINT0 } },
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7203", vectors, groups,
|
||||
mask_registers, prio_registers, NULL);
|
||||
|
||||
static struct plat_sci_port sci_platform_data[] = {
|
||||
{
|
||||
.mapbase = 0xfffe8000,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCIF,
|
||||
.irqs = { 193, 194, 195, 192 },
|
||||
}, {
|
||||
.mapbase = 0xfffe8800,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCIF,
|
||||
.irqs = { 197, 198, 199, 196 },
|
||||
}, {
|
||||
.mapbase = 0xfffe9000,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCIF,
|
||||
.irqs = { 201, 202, 203, 200 },
|
||||
}, {
|
||||
.mapbase = 0xfffe9800,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCIF,
|
||||
.irqs = { 205, 206, 207, 204 },
|
||||
}, {
|
||||
.flags = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device sci_device = {
|
||||
.name = "sh-sci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = sci_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource rtc_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xffff2000,
|
||||
.end = 0xffff2000 + 0x58 - 1,
|
||||
.flags = IORESOURCE_IO,
|
||||
},
|
||||
[1] = {
|
||||
/* Period IRQ */
|
||||
.start = 232,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
/* Carry IRQ */
|
||||
.start = 233,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[3] = {
|
||||
/* Alarm IRQ */
|
||||
.start = 231,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device rtc_device = {
|
||||
.name = "sh-rtc",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(rtc_resources),
|
||||
.resource = rtc_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *sh7203_devices[] __initdata = {
|
||||
&sci_device,
|
||||
&rtc_device,
|
||||
};
|
||||
|
||||
static int __init sh7203_devices_setup(void)
|
||||
{
|
||||
return platform_add_devices(sh7203_devices,
|
||||
ARRAY_SIZE(sh7203_devices));
|
||||
}
|
||||
__initcall(sh7203_devices_setup);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
register_intc_controller(&intc_desc);
|
||||
}
|
|
@ -167,7 +167,7 @@ static struct intc_mask_reg mask_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7206", vectors, groups,
|
||||
NULL, mask_registers, prio_registers, NULL);
|
||||
mask_registers, prio_registers, NULL);
|
||||
|
||||
static struct plat_sci_port sci_platform_data[] = {
|
||||
{
|
||||
|
|
|
@ -13,6 +13,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7709) += setup-sh770x.o
|
|||
obj-$(CONFIG_CPU_SUBTYPE_SH7710) += setup-sh7710.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7712) += setup-sh7710.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7720) += setup-sh7720.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7721) += setup-sh7720.o
|
||||
|
||||
# Primary on-chip clocks (common)
|
||||
clock-$(CONFIG_CPU_SH3) := clock-sh3.o
|
||||
|
@ -21,5 +22,6 @@ clock-$(CONFIG_CPU_SUBTYPE_SH7706) := clock-sh7706.o
|
|||
clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7710) := clock-sh7710.o
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7720) := clock-sh7710.o
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7712) := clock-sh7712.o
|
||||
|
||||
obj-y += $(clock-y)
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* arch/sh/kernel/cpu/sh3/clock-sh7712.c
|
||||
*
|
||||
* SH7712 support for the clock framework
|
||||
*
|
||||
* Copyright (C) 2007 Andrew Murray <amurray@mpc-data.co.uk>
|
||||
*
|
||||
* Based on arch/sh/kernel/cpu/sh3/clock-sh3.c
|
||||
* Copyright (C) 2005 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/clock.h>
|
||||
#include <asm/freq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static int multipliers[] = { 1, 2, 3 };
|
||||
static int divisors[] = { 1, 2, 3, 4, 6 };
|
||||
|
||||
static void master_clk_init(struct clk *clk)
|
||||
{
|
||||
int frqcr = ctrl_inw(FRQCR);
|
||||
int idx = (frqcr & 0x0300) >> 8;
|
||||
|
||||
clk->rate *= multipliers[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7712_master_clk_ops = {
|
||||
.init = master_clk_init,
|
||||
};
|
||||
|
||||
static void module_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int frqcr = ctrl_inw(FRQCR);
|
||||
int idx = frqcr & 0x0007;
|
||||
|
||||
clk->rate = clk->parent->rate / divisors[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7712_module_clk_ops = {
|
||||
.recalc = module_clk_recalc,
|
||||
};
|
||||
|
||||
static void cpu_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int frqcr = ctrl_inw(FRQCR);
|
||||
int idx = (frqcr & 0x0030) >> 4;
|
||||
|
||||
clk->rate = clk->parent->rate / divisors[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7712_cpu_clk_ops = {
|
||||
.recalc = cpu_clk_recalc,
|
||||
};
|
||||
|
||||
static struct clk_ops *sh7712_clk_ops[] = {
|
||||
&sh7712_master_clk_ops,
|
||||
&sh7712_module_clk_ops,
|
||||
&sh7712_cpu_clk_ops,
|
||||
};
|
||||
|
||||
void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
|
||||
{
|
||||
if (idx < ARRAY_SIZE(sh7712_clk_ops))
|
||||
*ops = sh7712_clk_ops[idx];
|
||||
}
|
||||
|
|
@ -13,8 +13,9 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/cpu/mmu_context.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/cpu/mmu_context.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
! NOTE:
|
||||
! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
|
||||
|
@ -409,6 +410,27 @@ ENTRY(handle_exception)
|
|||
! Using k0, k1 for scratch registers (r0_bank1, r1_bank),
|
||||
! save all registers onto stack.
|
||||
!
|
||||
|
||||
#ifdef CONFIG_GUSA
|
||||
! Check for roll back gRB (User and Kernel)
|
||||
mov r15, k0
|
||||
shll k0
|
||||
bf/s 1f
|
||||
shll k0
|
||||
bf/s 1f
|
||||
stc spc, k1
|
||||
stc r0_bank, k0
|
||||
cmp/hs k0, k1 ! test k1 (saved PC) >= k0 (saved r0)
|
||||
bt/s 2f
|
||||
stc r1_bank, k1
|
||||
|
||||
add #-2, k0
|
||||
add r15, k0
|
||||
ldc k0, spc ! PC = saved r0 + r15 - 2
|
||||
2: mov k1, r15 ! SP = r1
|
||||
1:
|
||||
#endif
|
||||
|
||||
stc ssr, k0 ! Is it from kernel space?
|
||||
shll k0 ! Check MD bit (bit30) by shifting it into...
|
||||
shll k0 ! ...the T bit
|
||||
|
|
|
@ -36,7 +36,7 @@ ENTRY(exception_handling_table)
|
|||
.long exception_error ! address error store /* 100 */
|
||||
#endif
|
||||
#if defined(CONFIG_SH_FPU)
|
||||
.long do_fpu_error /* 120 */
|
||||
.long fpu_error_trap_handler /* 120 */
|
||||
#else
|
||||
.long exception_error /* 120 */
|
||||
#endif
|
||||
|
|
|
@ -16,11 +16,11 @@
|
|||
#include <asm/cache.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
int __init detect_cpu_and_cache_system(void)
|
||||
int __uses_jump_to_uncached detect_cpu_and_cache_system(void)
|
||||
{
|
||||
unsigned long addr0, addr1, data0, data1, data2, data3;
|
||||
|
||||
jump_to_P2();
|
||||
jump_to_uncached();
|
||||
/*
|
||||
* Check if the entry shadows or not.
|
||||
* When shadowed, it's 128-entry system.
|
||||
|
@ -48,7 +48,7 @@ int __init detect_cpu_and_cache_system(void)
|
|||
ctrl_outl(data0&~SH_CACHE_VALID, addr0);
|
||||
ctrl_outl(data2&~SH_CACHE_VALID, addr1);
|
||||
|
||||
back_to_P1();
|
||||
back_to_cached();
|
||||
|
||||
boot_cpu_data.dcache.ways = 4;
|
||||
boot_cpu_data.dcache.entry_shift = 4;
|
||||
|
@ -84,6 +84,9 @@ int __init detect_cpu_and_cache_system(void)
|
|||
#if defined(CONFIG_CPU_SUBTYPE_SH7720)
|
||||
boot_cpu_data.type = CPU_SH7720;
|
||||
#endif
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7721)
|
||||
boot_cpu_data.type = CPU_SH7721;
|
||||
#endif
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7705)
|
||||
boot_cpu_data.type = CPU_SH7705;
|
||||
|
||||
|
|
|
@ -66,12 +66,6 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(DMAC, 7),
|
||||
INTC_PRIO(SCIF2, 3),
|
||||
INTC_PRIO(SCIF0, 3),
|
||||
};
|
||||
|
||||
static struct intc_prio_reg prio_registers[] __initdata = {
|
||||
{ 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
|
||||
{ 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF_RCMI, 0, 0 } },
|
||||
|
@ -85,7 +79,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7705", vectors, groups,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
static struct intc_vect vectors_irq[] __initdata = {
|
||||
INTC_VECT(IRQ0, 0x600), INTC_VECT(IRQ1, 0x620),
|
||||
|
@ -93,7 +87,7 @@ static struct intc_vect vectors_irq[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_irq, "sh7705-irq", vectors_irq, NULL,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
static struct plat_sci_port sci_platform_data[] = {
|
||||
{
|
||||
|
|
|
@ -81,13 +81,6 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(DMAC, 7),
|
||||
INTC_PRIO(SCI, 3),
|
||||
INTC_PRIO(SCIF2, 3),
|
||||
INTC_PRIO(SCIF0, 3),
|
||||
};
|
||||
|
||||
static struct intc_prio_reg prio_registers[] __initdata = {
|
||||
{ 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
|
||||
{ 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, SCI, 0 } },
|
||||
|
@ -109,7 +102,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh770x", vectors, groups,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7707) || \
|
||||
|
@ -120,7 +113,7 @@ static struct intc_vect vectors_irq[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_irq, "sh770x-irq", vectors_irq, NULL,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
#endif
|
||||
|
||||
static struct resource rtc_resources[] = {
|
||||
|
|
|
@ -73,18 +73,6 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(SIOF1, SIOF1_ERI, SIOF1_TXI, SIOF1_RXI, SIOF1_CCI),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(DMAC1, 7),
|
||||
INTC_PRIO(DMAC2, 7),
|
||||
INTC_PRIO(SCIF0, 3),
|
||||
INTC_PRIO(SCIF1, 3),
|
||||
INTC_PRIO(SIOF0, 3),
|
||||
INTC_PRIO(SIOF1, 3),
|
||||
INTC_PRIO(EDMAC0, 5),
|
||||
INTC_PRIO(EDMAC1, 5),
|
||||
INTC_PRIO(EDMAC2, 5),
|
||||
};
|
||||
|
||||
static struct intc_prio_reg prio_registers[] __initdata = {
|
||||
{ 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
|
||||
{ 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, 0, 0 } },
|
||||
|
@ -101,7 +89,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, groups,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
static struct intc_vect vectors_irq[] __initdata = {
|
||||
INTC_VECT(IRQ0, 0x600), INTC_VECT(IRQ1, 0x620),
|
||||
|
@ -109,7 +97,7 @@ static struct intc_vect vectors_irq[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_irq, "sh7710-irq", vectors_irq, NULL,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
static struct resource rtc_resources[] = {
|
||||
[0] = {
|
||||
|
|
|
@ -85,9 +85,62 @@ static struct platform_device sci_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct resource usb_ohci_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xA4428000,
|
||||
.end = 0xA44280FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 67,
|
||||
.end = 67,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 usb_ohci_dma_mask = 0xffffffffUL;
|
||||
static struct platform_device usb_ohci_device = {
|
||||
.name = "sh_ohci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &usb_ohci_dma_mask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(usb_ohci_resources),
|
||||
.resource = usb_ohci_resources,
|
||||
};
|
||||
|
||||
static struct resource usbf_resources[] = {
|
||||
[0] = {
|
||||
.name = "sh_udc",
|
||||
.start = 0xA4420000,
|
||||
.end = 0xA44200FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.name = "sh_udc",
|
||||
.start = 65,
|
||||
.end = 65,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device usbf_device = {
|
||||
.name = "sh_udc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = NULL,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(usbf_resources),
|
||||
.resource = usbf_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *sh7720_devices[] __initdata = {
|
||||
&rtc_device,
|
||||
&sci_device,
|
||||
&usb_ohci_device,
|
||||
&usbf_device,
|
||||
};
|
||||
|
||||
static int __init sh7720_devices_setup(void)
|
||||
|
@ -127,8 +180,11 @@ static struct intc_vect vectors[] __initdata = {
|
|||
INTC_VECT(USBF_SPD, 0x6e0), INTC_VECT(DMAC1_DEI0, 0x800),
|
||||
INTC_VECT(DMAC1_DEI1, 0x820), INTC_VECT(DMAC1_DEI2, 0x840),
|
||||
INTC_VECT(DMAC1_DEI3, 0x860), INTC_VECT(LCDC, 0x900),
|
||||
INTC_VECT(SSL, 0x980), INTC_VECT(USBFI0, 0xa20),
|
||||
INTC_VECT(USBFI1, 0xa40), INTC_VECT(USBHI, 0xa60),
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7720)
|
||||
INTC_VECT(SSL, 0x980),
|
||||
#endif
|
||||
INTC_VECT(USBFI0, 0xa20), INTC_VECT(USBFI1, 0xa40),
|
||||
INTC_VECT(USBHI, 0xa60),
|
||||
INTC_VECT(DMAC2_DEI4, 0xb80), INTC_VECT(DMAC2_DEI5, 0xba0),
|
||||
INTC_VECT(ADC, 0xbe0), INTC_VECT(SCIF0, 0xc00),
|
||||
INTC_VECT(SCIF1, 0xc20), INTC_VECT(PINT07, 0xc80),
|
||||
|
@ -153,22 +209,16 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(MMC, MMCI0, MMCI1, MMCI2, MMCI3),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(SCIF0, 2),
|
||||
INTC_PRIO(SCIF1, 2),
|
||||
INTC_PRIO(DMAC1, 1),
|
||||
INTC_PRIO(DMAC2, 1),
|
||||
INTC_PRIO(RTC, 2),
|
||||
INTC_PRIO(TMU, 2),
|
||||
INTC_PRIO(TPU, 2),
|
||||
};
|
||||
|
||||
static struct intc_prio_reg prio_registers[] __initdata = {
|
||||
{ 0xA414FEE2UL, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
|
||||
{ 0xA414FEE4UL, 0, 16, 4, /* IPRB */ { WDT, REF_RCMI, SIM, 0 } },
|
||||
{ 0xA4140016UL, 0, 16, 4, /* IPRC */ { IRQ3, IRQ2, IRQ1, IRQ0 } },
|
||||
{ 0xA4140018UL, 0, 16, 4, /* IPRD */ { USBF_SPD, TMU_SUNI, IRQ5, IRQ4 } },
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7720)
|
||||
{ 0xA414001AUL, 0, 16, 4, /* IPRE */ { DMAC1, 0, LCDC, SSL } },
|
||||
#else
|
||||
{ 0xA414001AUL, 0, 16, 4, /* IPRE */ { DMAC1, 0, LCDC, 0 } },
|
||||
#endif
|
||||
{ 0xA4080000UL, 0, 16, 4, /* IPRF */ { ADC, DMAC2, USBFI, CMT } },
|
||||
{ 0xA4080002UL, 0, 16, 4, /* IPRG */ { SCIF0, SCIF1, 0, 0 } },
|
||||
{ 0xA4080004UL, 0, 16, 4, /* IPRH */ { PINT07, PINT815, TPU, IIC } },
|
||||
|
@ -177,7 +227,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7720", vectors, groups,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
static struct intc_sense_reg sense_registers[] __initdata = {
|
||||
{ INTC_ICR1, 16, 2, { 0, 0, IRQ5, IRQ4, IRQ3, IRQ2, IRQ1, IRQ0 } },
|
||||
|
@ -190,7 +240,7 @@ static struct intc_vect vectors_irq[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_irq_desc, "sh7720-irq", vectors_irq,
|
||||
NULL, priorities, NULL, prio_registers, sense_registers);
|
||||
NULL, NULL, prio_registers, sense_registers);
|
||||
|
||||
void __init plat_irq_setup_pins(int mode)
|
||||
{
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
obj-y := probe.o common.o
|
||||
common-y += $(addprefix ../sh3/, entry.o ex.o)
|
||||
|
||||
obj-$(CONFIG_SH_FPU) += fpu.o
|
||||
obj-$(CONFIG_SH_FPU) += fpu.o softfloat.o
|
||||
obj-$(CONFIG_SH_STORE_QUEUES) += sq.o
|
||||
|
||||
# CPU subtype setup
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
/* $Id: fpu.c,v 1.4 2004/01/13 05:52:11 kkojima Exp $
|
||||
*
|
||||
* linux/arch/sh/kernel/fpu.c
|
||||
*
|
||||
/*
|
||||
* Save/restore floating point context for signal handlers.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
|
@ -9,15 +6,16 @@
|
|||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka
|
||||
* Copyright (C) 2006 ST Microelectronics Ltd. (denorm support)
|
||||
*
|
||||
* FIXME! These routines can be optimized in big endian case.
|
||||
* FIXME! These routines have not been tested for big endian case.
|
||||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/cpu/fpu.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/* The PR (precision) bit in the FP Status Register must be clear when
|
||||
* an frchg instruction is executed, otherwise the instruction is undefined.
|
||||
|
@ -25,177 +23,184 @@
|
|||
*/
|
||||
|
||||
#define FPSCR_RCHG 0x00000000
|
||||
extern unsigned long long float64_div(unsigned long long a,
|
||||
unsigned long long b);
|
||||
extern unsigned long int float32_div(unsigned long int a, unsigned long int b);
|
||||
extern unsigned long long float64_mul(unsigned long long a,
|
||||
unsigned long long b);
|
||||
extern unsigned long int float32_mul(unsigned long int a, unsigned long int b);
|
||||
extern unsigned long long float64_add(unsigned long long a,
|
||||
unsigned long long b);
|
||||
extern unsigned long int float32_add(unsigned long int a, unsigned long int b);
|
||||
extern unsigned long long float64_sub(unsigned long long a,
|
||||
unsigned long long b);
|
||||
extern unsigned long int float32_sub(unsigned long int a, unsigned long int b);
|
||||
|
||||
static unsigned int fpu_exception_flags;
|
||||
|
||||
/*
|
||||
* Save FPU registers onto task structure.
|
||||
* Assume called with FPU enabled (SR.FD=0).
|
||||
*/
|
||||
void
|
||||
save_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
||||
void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
||||
{
|
||||
unsigned long dummy;
|
||||
|
||||
clear_tsk_thread_flag(tsk, TIF_USEDFPU);
|
||||
enable_fpu();
|
||||
asm volatile("sts.l fpul, @-%0\n\t"
|
||||
"sts.l fpscr, @-%0\n\t"
|
||||
"lds %2, fpscr\n\t"
|
||||
"frchg\n\t"
|
||||
"fmov.s fr15, @-%0\n\t"
|
||||
"fmov.s fr14, @-%0\n\t"
|
||||
"fmov.s fr13, @-%0\n\t"
|
||||
"fmov.s fr12, @-%0\n\t"
|
||||
"fmov.s fr11, @-%0\n\t"
|
||||
"fmov.s fr10, @-%0\n\t"
|
||||
"fmov.s fr9, @-%0\n\t"
|
||||
"fmov.s fr8, @-%0\n\t"
|
||||
"fmov.s fr7, @-%0\n\t"
|
||||
"fmov.s fr6, @-%0\n\t"
|
||||
"fmov.s fr5, @-%0\n\t"
|
||||
"fmov.s fr4, @-%0\n\t"
|
||||
"fmov.s fr3, @-%0\n\t"
|
||||
"fmov.s fr2, @-%0\n\t"
|
||||
"fmov.s fr1, @-%0\n\t"
|
||||
"fmov.s fr0, @-%0\n\t"
|
||||
"frchg\n\t"
|
||||
"fmov.s fr15, @-%0\n\t"
|
||||
"fmov.s fr14, @-%0\n\t"
|
||||
"fmov.s fr13, @-%0\n\t"
|
||||
"fmov.s fr12, @-%0\n\t"
|
||||
"fmov.s fr11, @-%0\n\t"
|
||||
"fmov.s fr10, @-%0\n\t"
|
||||
"fmov.s fr9, @-%0\n\t"
|
||||
"fmov.s fr8, @-%0\n\t"
|
||||
"fmov.s fr7, @-%0\n\t"
|
||||
"fmov.s fr6, @-%0\n\t"
|
||||
"fmov.s fr5, @-%0\n\t"
|
||||
"fmov.s fr4, @-%0\n\t"
|
||||
"fmov.s fr3, @-%0\n\t"
|
||||
"fmov.s fr2, @-%0\n\t"
|
||||
"fmov.s fr1, @-%0\n\t"
|
||||
"fmov.s fr0, @-%0\n\t"
|
||||
"lds %3, fpscr\n\t"
|
||||
: "=r" (dummy)
|
||||
: "0" ((char *)(&tsk->thread.fpu.hard.status)),
|
||||
"r" (FPSCR_RCHG),
|
||||
"r" (FPSCR_INIT)
|
||||
: "memory");
|
||||
asm volatile ("sts.l fpul, @-%0\n\t"
|
||||
"sts.l fpscr, @-%0\n\t"
|
||||
"lds %2, fpscr\n\t"
|
||||
"frchg\n\t"
|
||||
"fmov.s fr15, @-%0\n\t"
|
||||
"fmov.s fr14, @-%0\n\t"
|
||||
"fmov.s fr13, @-%0\n\t"
|
||||
"fmov.s fr12, @-%0\n\t"
|
||||
"fmov.s fr11, @-%0\n\t"
|
||||
"fmov.s fr10, @-%0\n\t"
|
||||
"fmov.s fr9, @-%0\n\t"
|
||||
"fmov.s fr8, @-%0\n\t"
|
||||
"fmov.s fr7, @-%0\n\t"
|
||||
"fmov.s fr6, @-%0\n\t"
|
||||
"fmov.s fr5, @-%0\n\t"
|
||||
"fmov.s fr4, @-%0\n\t"
|
||||
"fmov.s fr3, @-%0\n\t"
|
||||
"fmov.s fr2, @-%0\n\t"
|
||||
"fmov.s fr1, @-%0\n\t"
|
||||
"fmov.s fr0, @-%0\n\t"
|
||||
"frchg\n\t"
|
||||
"fmov.s fr15, @-%0\n\t"
|
||||
"fmov.s fr14, @-%0\n\t"
|
||||
"fmov.s fr13, @-%0\n\t"
|
||||
"fmov.s fr12, @-%0\n\t"
|
||||
"fmov.s fr11, @-%0\n\t"
|
||||
"fmov.s fr10, @-%0\n\t"
|
||||
"fmov.s fr9, @-%0\n\t"
|
||||
"fmov.s fr8, @-%0\n\t"
|
||||
"fmov.s fr7, @-%0\n\t"
|
||||
"fmov.s fr6, @-%0\n\t"
|
||||
"fmov.s fr5, @-%0\n\t"
|
||||
"fmov.s fr4, @-%0\n\t"
|
||||
"fmov.s fr3, @-%0\n\t"
|
||||
"fmov.s fr2, @-%0\n\t"
|
||||
"fmov.s fr1, @-%0\n\t"
|
||||
"fmov.s fr0, @-%0\n\t"
|
||||
"lds %3, fpscr\n\t":"=r" (dummy)
|
||||
:"0"((char *)(&tsk->thread.fpu.hard.status)),
|
||||
"r"(FPSCR_RCHG), "r"(FPSCR_INIT)
|
||||
:"memory");
|
||||
|
||||
disable_fpu();
|
||||
release_fpu(regs);
|
||||
disable_fpu();
|
||||
release_fpu(regs);
|
||||
}
|
||||
|
||||
static void
|
||||
restore_fpu(struct task_struct *tsk)
|
||||
static void restore_fpu(struct task_struct *tsk)
|
||||
{
|
||||
unsigned long dummy;
|
||||
|
||||
enable_fpu();
|
||||
asm volatile("lds %2, fpscr\n\t"
|
||||
"fmov.s @%0+, fr0\n\t"
|
||||
"fmov.s @%0+, fr1\n\t"
|
||||
"fmov.s @%0+, fr2\n\t"
|
||||
"fmov.s @%0+, fr3\n\t"
|
||||
"fmov.s @%0+, fr4\n\t"
|
||||
"fmov.s @%0+, fr5\n\t"
|
||||
"fmov.s @%0+, fr6\n\t"
|
||||
"fmov.s @%0+, fr7\n\t"
|
||||
"fmov.s @%0+, fr8\n\t"
|
||||
"fmov.s @%0+, fr9\n\t"
|
||||
"fmov.s @%0+, fr10\n\t"
|
||||
"fmov.s @%0+, fr11\n\t"
|
||||
"fmov.s @%0+, fr12\n\t"
|
||||
"fmov.s @%0+, fr13\n\t"
|
||||
"fmov.s @%0+, fr14\n\t"
|
||||
"fmov.s @%0+, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"fmov.s @%0+, fr0\n\t"
|
||||
"fmov.s @%0+, fr1\n\t"
|
||||
"fmov.s @%0+, fr2\n\t"
|
||||
"fmov.s @%0+, fr3\n\t"
|
||||
"fmov.s @%0+, fr4\n\t"
|
||||
"fmov.s @%0+, fr5\n\t"
|
||||
"fmov.s @%0+, fr6\n\t"
|
||||
"fmov.s @%0+, fr7\n\t"
|
||||
"fmov.s @%0+, fr8\n\t"
|
||||
"fmov.s @%0+, fr9\n\t"
|
||||
"fmov.s @%0+, fr10\n\t"
|
||||
"fmov.s @%0+, fr11\n\t"
|
||||
"fmov.s @%0+, fr12\n\t"
|
||||
"fmov.s @%0+, fr13\n\t"
|
||||
"fmov.s @%0+, fr14\n\t"
|
||||
"fmov.s @%0+, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"lds.l @%0+, fpscr\n\t"
|
||||
"lds.l @%0+, fpul\n\t"
|
||||
: "=r" (dummy)
|
||||
: "0" (&tsk->thread.fpu), "r" (FPSCR_RCHG)
|
||||
: "memory");
|
||||
enable_fpu();
|
||||
asm volatile ("lds %2, fpscr\n\t"
|
||||
"fmov.s @%0+, fr0\n\t"
|
||||
"fmov.s @%0+, fr1\n\t"
|
||||
"fmov.s @%0+, fr2\n\t"
|
||||
"fmov.s @%0+, fr3\n\t"
|
||||
"fmov.s @%0+, fr4\n\t"
|
||||
"fmov.s @%0+, fr5\n\t"
|
||||
"fmov.s @%0+, fr6\n\t"
|
||||
"fmov.s @%0+, fr7\n\t"
|
||||
"fmov.s @%0+, fr8\n\t"
|
||||
"fmov.s @%0+, fr9\n\t"
|
||||
"fmov.s @%0+, fr10\n\t"
|
||||
"fmov.s @%0+, fr11\n\t"
|
||||
"fmov.s @%0+, fr12\n\t"
|
||||
"fmov.s @%0+, fr13\n\t"
|
||||
"fmov.s @%0+, fr14\n\t"
|
||||
"fmov.s @%0+, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"fmov.s @%0+, fr0\n\t"
|
||||
"fmov.s @%0+, fr1\n\t"
|
||||
"fmov.s @%0+, fr2\n\t"
|
||||
"fmov.s @%0+, fr3\n\t"
|
||||
"fmov.s @%0+, fr4\n\t"
|
||||
"fmov.s @%0+, fr5\n\t"
|
||||
"fmov.s @%0+, fr6\n\t"
|
||||
"fmov.s @%0+, fr7\n\t"
|
||||
"fmov.s @%0+, fr8\n\t"
|
||||
"fmov.s @%0+, fr9\n\t"
|
||||
"fmov.s @%0+, fr10\n\t"
|
||||
"fmov.s @%0+, fr11\n\t"
|
||||
"fmov.s @%0+, fr12\n\t"
|
||||
"fmov.s @%0+, fr13\n\t"
|
||||
"fmov.s @%0+, fr14\n\t"
|
||||
"fmov.s @%0+, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"lds.l @%0+, fpscr\n\t"
|
||||
"lds.l @%0+, fpul\n\t"
|
||||
:"=r" (dummy)
|
||||
:"0"(&tsk->thread.fpu), "r"(FPSCR_RCHG)
|
||||
:"memory");
|
||||
disable_fpu();
|
||||
}
|
||||
|
||||
/*
|
||||
* Load the FPU with signalling NANS. This bit pattern we're using
|
||||
* has the property that no matter wether considered as single or as
|
||||
* double precision represents signaling NANS.
|
||||
* double precision represents signaling NANS.
|
||||
*/
|
||||
|
||||
static void
|
||||
fpu_init(void)
|
||||
static void fpu_init(void)
|
||||
{
|
||||
enable_fpu();
|
||||
asm volatile("lds %0, fpul\n\t"
|
||||
"lds %1, fpscr\n\t"
|
||||
"fsts fpul, fr0\n\t"
|
||||
"fsts fpul, fr1\n\t"
|
||||
"fsts fpul, fr2\n\t"
|
||||
"fsts fpul, fr3\n\t"
|
||||
"fsts fpul, fr4\n\t"
|
||||
"fsts fpul, fr5\n\t"
|
||||
"fsts fpul, fr6\n\t"
|
||||
"fsts fpul, fr7\n\t"
|
||||
"fsts fpul, fr8\n\t"
|
||||
"fsts fpul, fr9\n\t"
|
||||
"fsts fpul, fr10\n\t"
|
||||
"fsts fpul, fr11\n\t"
|
||||
"fsts fpul, fr12\n\t"
|
||||
"fsts fpul, fr13\n\t"
|
||||
"fsts fpul, fr14\n\t"
|
||||
"fsts fpul, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"fsts fpul, fr0\n\t"
|
||||
"fsts fpul, fr1\n\t"
|
||||
"fsts fpul, fr2\n\t"
|
||||
"fsts fpul, fr3\n\t"
|
||||
"fsts fpul, fr4\n\t"
|
||||
"fsts fpul, fr5\n\t"
|
||||
"fsts fpul, fr6\n\t"
|
||||
"fsts fpul, fr7\n\t"
|
||||
"fsts fpul, fr8\n\t"
|
||||
"fsts fpul, fr9\n\t"
|
||||
"fsts fpul, fr10\n\t"
|
||||
"fsts fpul, fr11\n\t"
|
||||
"fsts fpul, fr12\n\t"
|
||||
"fsts fpul, fr13\n\t"
|
||||
"fsts fpul, fr14\n\t"
|
||||
"fsts fpul, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"lds %2, fpscr\n\t"
|
||||
: /* no output */
|
||||
: "r" (0), "r" (FPSCR_RCHG), "r" (FPSCR_INIT));
|
||||
disable_fpu();
|
||||
asm volatile ( "lds %0, fpul\n\t"
|
||||
"lds %1, fpscr\n\t"
|
||||
"fsts fpul, fr0\n\t"
|
||||
"fsts fpul, fr1\n\t"
|
||||
"fsts fpul, fr2\n\t"
|
||||
"fsts fpul, fr3\n\t"
|
||||
"fsts fpul, fr4\n\t"
|
||||
"fsts fpul, fr5\n\t"
|
||||
"fsts fpul, fr6\n\t"
|
||||
"fsts fpul, fr7\n\t"
|
||||
"fsts fpul, fr8\n\t"
|
||||
"fsts fpul, fr9\n\t"
|
||||
"fsts fpul, fr10\n\t"
|
||||
"fsts fpul, fr11\n\t"
|
||||
"fsts fpul, fr12\n\t"
|
||||
"fsts fpul, fr13\n\t"
|
||||
"fsts fpul, fr14\n\t"
|
||||
"fsts fpul, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"fsts fpul, fr0\n\t"
|
||||
"fsts fpul, fr1\n\t"
|
||||
"fsts fpul, fr2\n\t"
|
||||
"fsts fpul, fr3\n\t"
|
||||
"fsts fpul, fr4\n\t"
|
||||
"fsts fpul, fr5\n\t"
|
||||
"fsts fpul, fr6\n\t"
|
||||
"fsts fpul, fr7\n\t"
|
||||
"fsts fpul, fr8\n\t"
|
||||
"fsts fpul, fr9\n\t"
|
||||
"fsts fpul, fr10\n\t"
|
||||
"fsts fpul, fr11\n\t"
|
||||
"fsts fpul, fr12\n\t"
|
||||
"fsts fpul, fr13\n\t"
|
||||
"fsts fpul, fr14\n\t"
|
||||
"fsts fpul, fr15\n\t"
|
||||
"frchg\n\t"
|
||||
"lds %2, fpscr\n\t"
|
||||
: /* no output */
|
||||
:"r" (0), "r"(FPSCR_RCHG), "r"(FPSCR_INIT));
|
||||
disable_fpu();
|
||||
}
|
||||
|
||||
/**
|
||||
* denormal_to_double - Given denormalized float number,
|
||||
* store double float
|
||||
* denormal_to_double - Given denormalized float number,
|
||||
* store double float
|
||||
*
|
||||
* @fpu: Pointer to sh_fpu_hard structure
|
||||
* @n: Index to FP register
|
||||
* @fpu: Pointer to sh_fpu_hard structure
|
||||
* @n: Index to FP register
|
||||
*/
|
||||
static void
|
||||
denormal_to_double (struct sh_fpu_hard_struct *fpu, int n)
|
||||
static void denormal_to_double(struct sh_fpu_hard_struct *fpu, int n)
|
||||
{
|
||||
unsigned long du, dl;
|
||||
unsigned long x = fpu->fpul;
|
||||
|
@ -212,7 +217,7 @@ denormal_to_double (struct sh_fpu_hard_struct *fpu, int n)
|
|||
dl = x << 29;
|
||||
|
||||
fpu->fp_regs[n] = du;
|
||||
fpu->fp_regs[n+1] = dl;
|
||||
fpu->fp_regs[n + 1] = dl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -223,68 +228,191 @@ denormal_to_double (struct sh_fpu_hard_struct *fpu, int n)
|
|||
*
|
||||
* Returns 1 when it's handled (should not cause exception).
|
||||
*/
|
||||
static int
|
||||
ieee_fpe_handler (struct pt_regs *regs)
|
||||
static int ieee_fpe_handler(struct pt_regs *regs)
|
||||
{
|
||||
unsigned short insn = *(unsigned short *) regs->pc;
|
||||
unsigned short insn = *(unsigned short *)regs->pc;
|
||||
unsigned short finsn;
|
||||
unsigned long nextpc;
|
||||
int nib[4] = {
|
||||
(insn >> 12) & 0xf,
|
||||
(insn >> 8) & 0xf,
|
||||
(insn >> 4) & 0xf,
|
||||
insn & 0xf};
|
||||
insn & 0xf
|
||||
};
|
||||
|
||||
if (nib[0] == 0xb ||
|
||||
(nib[0] == 0x4 && nib[2] == 0x0 && nib[3] == 0xb)) /* bsr & jsr */
|
||||
regs->pr = regs->pc + 4;
|
||||
|
||||
if (nib[0] == 0xa || nib[0] == 0xb) { /* bra & bsr */
|
||||
nextpc = regs->pc + 4 + ((short) ((insn & 0xfff) << 4) >> 3);
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (nib[0] == 0x8 && nib[1] == 0xd) { /* bt/s */
|
||||
if (nib[0] == 0xb || (nib[0] == 0x4 && nib[2] == 0x0 && nib[3] == 0xb))
|
||||
regs->pr = regs->pc + 4; /* bsr & jsr */
|
||||
|
||||
if (nib[0] == 0xa || nib[0] == 0xb) {
|
||||
/* bra & bsr */
|
||||
nextpc = regs->pc + 4 + ((short)((insn & 0xfff) << 4) >> 3);
|
||||
finsn = *(unsigned short *)(regs->pc + 2);
|
||||
} else if (nib[0] == 0x8 && nib[1] == 0xd) {
|
||||
/* bt/s */
|
||||
if (regs->sr & 1)
|
||||
nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
|
||||
nextpc = regs->pc + 4 + ((char)(insn & 0xff) << 1);
|
||||
else
|
||||
nextpc = regs->pc + 4;
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (nib[0] == 0x8 && nib[1] == 0xf) { /* bf/s */
|
||||
finsn = *(unsigned short *)(regs->pc + 2);
|
||||
} else if (nib[0] == 0x8 && nib[1] == 0xf) {
|
||||
/* bf/s */
|
||||
if (regs->sr & 1)
|
||||
nextpc = regs->pc + 4;
|
||||
else
|
||||
nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
nextpc = regs->pc + 4 + ((char)(insn & 0xff) << 1);
|
||||
finsn = *(unsigned short *)(regs->pc + 2);
|
||||
} else if (nib[0] == 0x4 && nib[3] == 0xb &&
|
||||
(nib[2] == 0x0 || nib[2] == 0x2)) { /* jmp & jsr */
|
||||
(nib[2] == 0x0 || nib[2] == 0x2)) {
|
||||
/* jmp & jsr */
|
||||
nextpc = regs->regs[nib[1]];
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
finsn = *(unsigned short *)(regs->pc + 2);
|
||||
} else if (nib[0] == 0x0 && nib[3] == 0x3 &&
|
||||
(nib[2] == 0x0 || nib[2] == 0x2)) { /* braf & bsrf */
|
||||
(nib[2] == 0x0 || nib[2] == 0x2)) {
|
||||
/* braf & bsrf */
|
||||
nextpc = regs->pc + 4 + regs->regs[nib[1]];
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
} else if (insn == 0x000b) { /* rts */
|
||||
finsn = *(unsigned short *)(regs->pc + 2);
|
||||
} else if (insn == 0x000b) {
|
||||
/* rts */
|
||||
nextpc = regs->pr;
|
||||
finsn = *(unsigned short *) (regs->pc + 2);
|
||||
finsn = *(unsigned short *)(regs->pc + 2);
|
||||
} else {
|
||||
nextpc = regs->pc + instruction_size(insn);
|
||||
finsn = insn;
|
||||
}
|
||||
|
||||
if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */
|
||||
if ((finsn & 0xf1ff) == 0xf0ad) {
|
||||
/* fcnvsd */
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
save_fpu(tsk, regs);
|
||||
if ((tsk->thread.fpu.hard.fpscr & (1 << 17))) {
|
||||
if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR))
|
||||
/* FPU error */
|
||||
denormal_to_double (&tsk->thread.fpu.hard,
|
||||
(finsn >> 8) & 0xf);
|
||||
tsk->thread.fpu.hard.fpscr &=
|
||||
~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
|
||||
grab_fpu(regs);
|
||||
restore_fpu(tsk);
|
||||
set_tsk_thread_flag(tsk, TIF_USEDFPU);
|
||||
denormal_to_double(&tsk->thread.fpu.hard,
|
||||
(finsn >> 8) & 0xf);
|
||||
else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
} else if ((finsn & 0xf00f) == 0xf002) {
|
||||
/* fmul */
|
||||
struct task_struct *tsk = current;
|
||||
int fpscr;
|
||||
int n, m, prec;
|
||||
unsigned int hx, hy;
|
||||
|
||||
n = (finsn >> 8) & 0xf;
|
||||
m = (finsn >> 4) & 0xf;
|
||||
hx = tsk->thread.fpu.hard.fp_regs[n];
|
||||
hy = tsk->thread.fpu.hard.fp_regs[m];
|
||||
fpscr = tsk->thread.fpu.hard.fpscr;
|
||||
prec = fpscr & FPSCR_DBL_PRECISION;
|
||||
|
||||
if ((fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& (prec && ((hx & 0x7fffffff) < 0x00100000
|
||||
|| (hy & 0x7fffffff) < 0x00100000))) {
|
||||
long long llx, lly;
|
||||
|
||||
/* FPU error because of denormal (doubles) */
|
||||
llx = ((long long)hx << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[n + 1];
|
||||
lly = ((long long)hy << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[m + 1];
|
||||
llx = float64_mul(llx, lly);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = llx >> 32;
|
||||
tsk->thread.fpu.hard.fp_regs[n + 1] = llx & 0xffffffff;
|
||||
} else if ((fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& (!prec && ((hx & 0x7fffffff) < 0x00800000
|
||||
|| (hy & 0x7fffffff) < 0x00800000))) {
|
||||
/* FPU error because of denormal (floats) */
|
||||
hx = float32_mul(hx, hy);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = hx;
|
||||
} else
|
||||
force_sig(SIGFPE, tsk);
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
} else if ((finsn & 0xf00e) == 0xf000) {
|
||||
/* fadd, fsub */
|
||||
struct task_struct *tsk = current;
|
||||
int fpscr;
|
||||
int n, m, prec;
|
||||
unsigned int hx, hy;
|
||||
|
||||
n = (finsn >> 8) & 0xf;
|
||||
m = (finsn >> 4) & 0xf;
|
||||
hx = tsk->thread.fpu.hard.fp_regs[n];
|
||||
hy = tsk->thread.fpu.hard.fp_regs[m];
|
||||
fpscr = tsk->thread.fpu.hard.fpscr;
|
||||
prec = fpscr & FPSCR_DBL_PRECISION;
|
||||
|
||||
if ((fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& (prec && ((hx & 0x7fffffff) < 0x00100000
|
||||
|| (hy & 0x7fffffff) < 0x00100000))) {
|
||||
long long llx, lly;
|
||||
|
||||
/* FPU error because of denormal (doubles) */
|
||||
llx = ((long long)hx << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[n + 1];
|
||||
lly = ((long long)hy << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[m + 1];
|
||||
if ((finsn & 0xf00f) == 0xf000)
|
||||
llx = float64_add(llx, lly);
|
||||
else
|
||||
llx = float64_sub(llx, lly);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = llx >> 32;
|
||||
tsk->thread.fpu.hard.fp_regs[n + 1] = llx & 0xffffffff;
|
||||
} else if ((fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& (!prec && ((hx & 0x7fffffff) < 0x00800000
|
||||
|| (hy & 0x7fffffff) < 0x00800000))) {
|
||||
/* FPU error because of denormal (floats) */
|
||||
if ((finsn & 0xf00f) == 0xf000)
|
||||
hx = float32_add(hx, hy);
|
||||
else
|
||||
hx = float32_sub(hx, hy);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = hx;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
} else if ((finsn & 0xf003) == 0xf003) {
|
||||
/* fdiv */
|
||||
struct task_struct *tsk = current;
|
||||
int fpscr;
|
||||
int n, m, prec;
|
||||
unsigned int hx, hy;
|
||||
|
||||
n = (finsn >> 8) & 0xf;
|
||||
m = (finsn >> 4) & 0xf;
|
||||
hx = tsk->thread.fpu.hard.fp_regs[n];
|
||||
hy = tsk->thread.fpu.hard.fp_regs[m];
|
||||
fpscr = tsk->thread.fpu.hard.fpscr;
|
||||
prec = fpscr & FPSCR_DBL_PRECISION;
|
||||
|
||||
if ((fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& (prec && ((hx & 0x7fffffff) < 0x00100000
|
||||
|| (hy & 0x7fffffff) < 0x00100000))) {
|
||||
long long llx, lly;
|
||||
|
||||
/* FPU error because of denormal (doubles) */
|
||||
llx = ((long long)hx << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[n + 1];
|
||||
lly = ((long long)hy << 32)
|
||||
| tsk->thread.fpu.hard.fp_regs[m + 1];
|
||||
|
||||
llx = float64_div(llx, lly);
|
||||
|
||||
tsk->thread.fpu.hard.fp_regs[n] = llx >> 32;
|
||||
tsk->thread.fpu.hard.fp_regs[n + 1] = llx & 0xffffffff;
|
||||
} else if ((fpscr & FPSCR_CAUSE_ERROR)
|
||||
&& (!prec && ((hx & 0x7fffffff) < 0x00800000
|
||||
|| (hy & 0x7fffffff) < 0x00800000))) {
|
||||
/* FPU error because of denormal (floats) */
|
||||
hx = float32_div(hx, hy);
|
||||
tsk->thread.fpu.hard.fp_regs[n] = hx;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
regs->pc = nextpc;
|
||||
return 1;
|
||||
|
@ -293,27 +421,48 @@ ieee_fpe_handler (struct pt_regs *regs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage void
|
||||
do_fpu_error(unsigned long r4, unsigned long r5, unsigned long r6,
|
||||
unsigned long r7, struct pt_regs __regs)
|
||||
void float_raise(unsigned int flags)
|
||||
{
|
||||
fpu_exception_flags |= flags;
|
||||
}
|
||||
|
||||
int float_rounding_mode(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct task_struct *tsk = current;
|
||||
int roundingMode = FPSCR_ROUNDING_MODE(tsk->thread.fpu.hard.fpscr);
|
||||
return roundingMode;
|
||||
}
|
||||
|
||||
if (ieee_fpe_handler(regs))
|
||||
return;
|
||||
BUILD_TRAP_HANDLER(fpu_error)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
TRAP_HANDLER_DECL;
|
||||
|
||||
regs->pc += 2;
|
||||
save_fpu(tsk, regs);
|
||||
fpu_exception_flags = 0;
|
||||
if (ieee_fpe_handler(regs)) {
|
||||
tsk->thread.fpu.hard.fpscr &=
|
||||
~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
|
||||
tsk->thread.fpu.hard.fpscr |= fpu_exception_flags;
|
||||
/* Set the FPSCR flag as well as cause bits - simply
|
||||
* replicate the cause */
|
||||
tsk->thread.fpu.hard.fpscr |= (fpu_exception_flags >> 10);
|
||||
grab_fpu(regs);
|
||||
restore_fpu(tsk);
|
||||
set_tsk_thread_flag(tsk, TIF_USEDFPU);
|
||||
if ((((tsk->thread.fpu.hard.fpscr & FPSCR_ENABLE_MASK) >> 7) &
|
||||
(fpu_exception_flags >> 2)) == 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
force_sig(SIGFPE, tsk);
|
||||
}
|
||||
|
||||
asmlinkage void
|
||||
do_fpu_state_restore(unsigned long r4, unsigned long r5, unsigned long r6,
|
||||
unsigned long r7, struct pt_regs __regs)
|
||||
BUILD_TRAP_HANDLER(fpu_state_restore)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct task_struct *tsk = current;
|
||||
TRAP_HANDLER_DECL;
|
||||
|
||||
grab_fpu(regs);
|
||||
if (!user_mode(regs)) {
|
||||
|
@ -324,7 +473,7 @@ do_fpu_state_restore(unsigned long r4, unsigned long r5, unsigned long r6,
|
|||
if (used_math()) {
|
||||
/* Using the FPU again. */
|
||||
restore_fpu(tsk);
|
||||
} else {
|
||||
} else {
|
||||
/* First time FPU user. */
|
||||
fpu_init();
|
||||
set_used_math();
|
||||
|
|
|
@ -98,6 +98,8 @@ int __init detect_cpu_and_cache_system(void)
|
|||
case 0x200A:
|
||||
if (prr == 0x61)
|
||||
boot_cpu_data.type = CPU_SH7781;
|
||||
else if (prr == 0xa1)
|
||||
boot_cpu_data.type = CPU_SH7763;
|
||||
else
|
||||
boot_cpu_data.type = CPU_SH7780;
|
||||
|
||||
|
|
|
@ -126,12 +126,6 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(REF, REF_RCMI, REF_ROVI),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(SCIF, 3),
|
||||
INTC_PRIO(SCI1, 3),
|
||||
INTC_PRIO(DMAC, 7),
|
||||
};
|
||||
|
||||
static struct intc_prio_reg prio_registers[] __initdata = {
|
||||
{ 0xffd00004, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
|
||||
{ 0xffd00008, 0, 16, 4, /* IPRB */ { WDT, REF, SCI1, 0 } },
|
||||
|
@ -143,7 +137,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, groups,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
/* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7750) || \
|
||||
|
@ -163,7 +157,7 @@ static struct intc_group groups_dma4[] __initdata = {
|
|||
|
||||
static DECLARE_INTC_DESC(intc_desc_dma4, "sh7750_dma4",
|
||||
vectors_dma4, groups_dma4,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
#endif
|
||||
|
||||
/* SH7750R and SH7751R both have 8-channel DMA controllers */
|
||||
|
@ -184,7 +178,7 @@ static struct intc_group groups_dma8[] __initdata = {
|
|||
|
||||
static DECLARE_INTC_DESC(intc_desc_dma8, "sh7750_dma8",
|
||||
vectors_dma8, groups_dma8,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
#endif
|
||||
|
||||
/* SH7750R, SH7751 and SH7751R all have two extra timer channels */
|
||||
|
@ -205,7 +199,7 @@ static struct intc_mask_reg mask_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_tmu34, "sh7750_tmu34",
|
||||
vectors_tmu34, NULL, priorities,
|
||||
vectors_tmu34, NULL,
|
||||
mask_registers, prio_registers, NULL);
|
||||
#endif
|
||||
|
||||
|
@ -216,7 +210,7 @@ static struct intc_vect vectors_irlm[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_irlm, "sh7750_irlm", vectors_irlm, NULL,
|
||||
priorities, NULL, prio_registers, NULL);
|
||||
NULL, prio_registers, NULL);
|
||||
|
||||
/* SH7751 and SH7751R both have PCI */
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH7751R)
|
||||
|
@ -233,7 +227,7 @@ static struct intc_group groups_pci[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_pci, "sh7750_pci", vectors_pci, groups_pci,
|
||||
priorities, mask_registers, prio_registers, NULL);
|
||||
mask_registers, prio_registers, NULL);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH7750) || \
|
||||
|
|
|
@ -92,15 +92,6 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(REF, REF_RCMI, REF_ROVI),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(SCIF0, 3),
|
||||
INTC_PRIO(SCIF1, 3),
|
||||
INTC_PRIO(SCIF2, 3),
|
||||
INTC_PRIO(SIM, 3),
|
||||
INTC_PRIO(DMAC, 7),
|
||||
INTC_PRIO(DMABRG, 13),
|
||||
};
|
||||
|
||||
static struct intc_mask_reg mask_registers[] __initdata = {
|
||||
{ 0xfe080040, 0xfe080060, 32, /* INTMSK00 / INTMSKCLR00 */
|
||||
{ IRQ4, IRQ5, IRQ6, IRQ7, 0, 0, HCAN20, HCAN21,
|
||||
|
@ -132,7 +123,7 @@ static struct intc_prio_reg prio_registers[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7760", vectors, groups,
|
||||
priorities, mask_registers, prio_registers, NULL);
|
||||
mask_registers, prio_registers, NULL);
|
||||
|
||||
static struct intc_vect vectors_irq[] __initdata = {
|
||||
INTC_VECT(IRL0, 0x240), INTC_VECT(IRL1, 0x2a0),
|
||||
|
@ -140,7 +131,7 @@ static struct intc_vect vectors_irq[] __initdata = {
|
|||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc_irq, "sh7760-irq", vectors_irq, groups,
|
||||
priorities, mask_registers, prio_registers, NULL);
|
||||
mask_registers, prio_registers, NULL);
|
||||
|
||||
static struct plat_sci_port sci_platform_data[] = {
|
||||
{
|
||||
|
|
|
@ -0,0 +1,892 @@
|
|||
/*
|
||||
* Floating point emulation support for subnormalised numbers on SH4
|
||||
* architecture This file is derived from the SoftFloat IEC/IEEE
|
||||
* Floating-point Arithmetic Package, Release 2 the original license of
|
||||
* which is reproduced below.
|
||||
*
|
||||
* ========================================================================
|
||||
*
|
||||
* This C source file is part of the SoftFloat IEC/IEEE Floating-point
|
||||
* Arithmetic Package, Release 2.
|
||||
*
|
||||
* Written by John R. Hauser. This work was made possible in part by the
|
||||
* International Computer Science Institute, located at Suite 600, 1947 Center
|
||||
* Street, Berkeley, California 94704. Funding was partially provided by the
|
||||
* National Science Foundation under grant MIP-9311980. The original version
|
||||
* of this code was written as part of a project to build a fixed-point vector
|
||||
* processor in collaboration with the University of California at Berkeley,
|
||||
* overseen by Profs. Nelson Morgan and John Wawrzynek. More information
|
||||
* is available through the web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
|
||||
* arithmetic/softfloat.html'.
|
||||
*
|
||||
* THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
|
||||
* has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
|
||||
* TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
|
||||
* PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
|
||||
* AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
|
||||
*
|
||||
* Derivative works are acceptable, even for commercial purposes, so long as
|
||||
* (1) they include prominent notice that the work is derivative, and (2) they
|
||||
* include prominent notice akin to these three paragraphs for those parts of
|
||||
* this code that are retained.
|
||||
*
|
||||
* ========================================================================
|
||||
*
|
||||
* SH4 modifications by Ismail Dhaoui <ismail.dhaoui@st.com>
|
||||
* and Kamel Khelifi <kamel.khelifi@st.com>
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/cpu/fpu.h>
|
||||
|
||||
#define LIT64( a ) a##LL
|
||||
|
||||
typedef char flag;
|
||||
typedef unsigned char uint8;
|
||||
typedef signed char int8;
|
||||
typedef int uint16;
|
||||
typedef int int16;
|
||||
typedef unsigned int uint32;
|
||||
typedef signed int int32;
|
||||
|
||||
typedef unsigned long long int bits64;
|
||||
typedef signed long long int sbits64;
|
||||
|
||||
typedef unsigned char bits8;
|
||||
typedef signed char sbits8;
|
||||
typedef unsigned short int bits16;
|
||||
typedef signed short int sbits16;
|
||||
typedef unsigned int bits32;
|
||||
typedef signed int sbits32;
|
||||
|
||||
typedef unsigned long long int uint64;
|
||||
typedef signed long long int int64;
|
||||
|
||||
typedef unsigned long int float32;
|
||||
typedef unsigned long long float64;
|
||||
|
||||
extern void float_raise(unsigned int flags); /* in fpu.c */
|
||||
extern int float_rounding_mode(void); /* in fpu.c */
|
||||
|
||||
inline bits64 extractFloat64Frac(float64 a);
|
||||
inline flag extractFloat64Sign(float64 a);
|
||||
inline int16 extractFloat64Exp(float64 a);
|
||||
inline int16 extractFloat32Exp(float32 a);
|
||||
inline flag extractFloat32Sign(float32 a);
|
||||
inline bits32 extractFloat32Frac(float32 a);
|
||||
inline float64 packFloat64(flag zSign, int16 zExp, bits64 zSig);
|
||||
inline void shift64RightJamming(bits64 a, int16 count, bits64 * zPtr);
|
||||
inline float32 packFloat32(flag zSign, int16 zExp, bits32 zSig);
|
||||
inline void shift32RightJamming(bits32 a, int16 count, bits32 * zPtr);
|
||||
float64 float64_sub(float64 a, float64 b);
|
||||
float32 float32_sub(float32 a, float32 b);
|
||||
float32 float32_add(float32 a, float32 b);
|
||||
float64 float64_add(float64 a, float64 b);
|
||||
float64 float64_div(float64 a, float64 b);
|
||||
float32 float32_div(float32 a, float32 b);
|
||||
float32 float32_mul(float32 a, float32 b);
|
||||
float64 float64_mul(float64 a, float64 b);
|
||||
inline void add128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
|
||||
bits64 * z1Ptr);
|
||||
inline void sub128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
|
||||
bits64 * z1Ptr);
|
||||
inline void mul64To128(bits64 a, bits64 b, bits64 * z0Ptr, bits64 * z1Ptr);
|
||||
|
||||
static int8 countLeadingZeros32(bits32 a);
|
||||
static int8 countLeadingZeros64(bits64 a);
|
||||
static float64 normalizeRoundAndPackFloat64(flag zSign, int16 zExp,
|
||||
bits64 zSig);
|
||||
static float64 subFloat64Sigs(float64 a, float64 b, flag zSign);
|
||||
static float64 addFloat64Sigs(float64 a, float64 b, flag zSign);
|
||||
static float32 roundAndPackFloat32(flag zSign, int16 zExp, bits32 zSig);
|
||||
static float32 normalizeRoundAndPackFloat32(flag zSign, int16 zExp,
|
||||
bits32 zSig);
|
||||
static float64 roundAndPackFloat64(flag zSign, int16 zExp, bits64 zSig);
|
||||
static float32 subFloat32Sigs(float32 a, float32 b, flag zSign);
|
||||
static float32 addFloat32Sigs(float32 a, float32 b, flag zSign);
|
||||
static void normalizeFloat64Subnormal(bits64 aSig, int16 * zExpPtr,
|
||||
bits64 * zSigPtr);
|
||||
static bits64 estimateDiv128To64(bits64 a0, bits64 a1, bits64 b);
|
||||
static void normalizeFloat32Subnormal(bits32 aSig, int16 * zExpPtr,
|
||||
bits32 * zSigPtr);
|
||||
|
||||
inline bits64 extractFloat64Frac(float64 a)
|
||||
{
|
||||
return a & LIT64(0x000FFFFFFFFFFFFF);
|
||||
}
|
||||
|
||||
inline flag extractFloat64Sign(float64 a)
|
||||
{
|
||||
return a >> 63;
|
||||
}
|
||||
|
||||
inline int16 extractFloat64Exp(float64 a)
|
||||
{
|
||||
return (a >> 52) & 0x7FF;
|
||||
}
|
||||
|
||||
inline int16 extractFloat32Exp(float32 a)
|
||||
{
|
||||
return (a >> 23) & 0xFF;
|
||||
}
|
||||
|
||||
inline flag extractFloat32Sign(float32 a)
|
||||
{
|
||||
return a >> 31;
|
||||
}
|
||||
|
||||
inline bits32 extractFloat32Frac(float32 a)
|
||||
{
|
||||
return a & 0x007FFFFF;
|
||||
}
|
||||
|
||||
inline float64 packFloat64(flag zSign, int16 zExp, bits64 zSig)
|
||||
{
|
||||
return (((bits64) zSign) << 63) + (((bits64) zExp) << 52) + zSig;
|
||||
}
|
||||
|
||||
inline void shift64RightJamming(bits64 a, int16 count, bits64 * zPtr)
|
||||
{
|
||||
bits64 z;
|
||||
|
||||
if (count == 0) {
|
||||
z = a;
|
||||
} else if (count < 64) {
|
||||
z = (a >> count) | ((a << ((-count) & 63)) != 0);
|
||||
} else {
|
||||
z = (a != 0);
|
||||
}
|
||||
*zPtr = z;
|
||||
}
|
||||
|
||||
static int8 countLeadingZeros32(bits32 a)
|
||||
{
|
||||
static const int8 countLeadingZerosHigh[] = {
|
||||
8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
int8 shiftCount;
|
||||
|
||||
shiftCount = 0;
|
||||
if (a < 0x10000) {
|
||||
shiftCount += 16;
|
||||
a <<= 16;
|
||||
}
|
||||
if (a < 0x1000000) {
|
||||
shiftCount += 8;
|
||||
a <<= 8;
|
||||
}
|
||||
shiftCount += countLeadingZerosHigh[a >> 24];
|
||||
return shiftCount;
|
||||
|
||||
}
|
||||
|
||||
static int8 countLeadingZeros64(bits64 a)
|
||||
{
|
||||
int8 shiftCount;
|
||||
|
||||
shiftCount = 0;
|
||||
if (a < ((bits64) 1) << 32) {
|
||||
shiftCount += 32;
|
||||
} else {
|
||||
a >>= 32;
|
||||
}
|
||||
shiftCount += countLeadingZeros32(a);
|
||||
return shiftCount;
|
||||
|
||||
}
|
||||
|
||||
static float64 normalizeRoundAndPackFloat64(flag zSign, int16 zExp, bits64 zSig)
|
||||
{
|
||||
int8 shiftCount;
|
||||
|
||||
shiftCount = countLeadingZeros64(zSig) - 1;
|
||||
return roundAndPackFloat64(zSign, zExp - shiftCount,
|
||||
zSig << shiftCount);
|
||||
|
||||
}
|
||||
|
||||
static float64 subFloat64Sigs(float64 a, float64 b, flag zSign)
|
||||
{
|
||||
int16 aExp, bExp, zExp;
|
||||
bits64 aSig, bSig, zSig;
|
||||
int16 expDiff;
|
||||
|
||||
aSig = extractFloat64Frac(a);
|
||||
aExp = extractFloat64Exp(a);
|
||||
bSig = extractFloat64Frac(b);
|
||||
bExp = extractFloat64Exp(b);
|
||||
expDiff = aExp - bExp;
|
||||
aSig <<= 10;
|
||||
bSig <<= 10;
|
||||
if (0 < expDiff)
|
||||
goto aExpBigger;
|
||||
if (expDiff < 0)
|
||||
goto bExpBigger;
|
||||
if (aExp == 0) {
|
||||
aExp = 1;
|
||||
bExp = 1;
|
||||
}
|
||||
if (bSig < aSig)
|
||||
goto aBigger;
|
||||
if (aSig < bSig)
|
||||
goto bBigger;
|
||||
return packFloat64(float_rounding_mode() == FPSCR_RM_ZERO, 0, 0);
|
||||
bExpBigger:
|
||||
if (bExp == 0x7FF) {
|
||||
return packFloat64(zSign ^ 1, 0x7FF, 0);
|
||||
}
|
||||
if (aExp == 0) {
|
||||
++expDiff;
|
||||
} else {
|
||||
aSig |= LIT64(0x4000000000000000);
|
||||
}
|
||||
shift64RightJamming(aSig, -expDiff, &aSig);
|
||||
bSig |= LIT64(0x4000000000000000);
|
||||
bBigger:
|
||||
zSig = bSig - aSig;
|
||||
zExp = bExp;
|
||||
zSign ^= 1;
|
||||
goto normalizeRoundAndPack;
|
||||
aExpBigger:
|
||||
if (aExp == 0x7FF) {
|
||||
return a;
|
||||
}
|
||||
if (bExp == 0) {
|
||||
--expDiff;
|
||||
} else {
|
||||
bSig |= LIT64(0x4000000000000000);
|
||||
}
|
||||
shift64RightJamming(bSig, expDiff, &bSig);
|
||||
aSig |= LIT64(0x4000000000000000);
|
||||
aBigger:
|
||||
zSig = aSig - bSig;
|
||||
zExp = aExp;
|
||||
normalizeRoundAndPack:
|
||||
--zExp;
|
||||
return normalizeRoundAndPackFloat64(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
static float64 addFloat64Sigs(float64 a, float64 b, flag zSign)
|
||||
{
|
||||
int16 aExp, bExp, zExp;
|
||||
bits64 aSig, bSig, zSig;
|
||||
int16 expDiff;
|
||||
|
||||
aSig = extractFloat64Frac(a);
|
||||
aExp = extractFloat64Exp(a);
|
||||
bSig = extractFloat64Frac(b);
|
||||
bExp = extractFloat64Exp(b);
|
||||
expDiff = aExp - bExp;
|
||||
aSig <<= 9;
|
||||
bSig <<= 9;
|
||||
if (0 < expDiff) {
|
||||
if (aExp == 0x7FF) {
|
||||
return a;
|
||||
}
|
||||
if (bExp == 0) {
|
||||
--expDiff;
|
||||
} else {
|
||||
bSig |= LIT64(0x2000000000000000);
|
||||
}
|
||||
shift64RightJamming(bSig, expDiff, &bSig);
|
||||
zExp = aExp;
|
||||
} else if (expDiff < 0) {
|
||||
if (bExp == 0x7FF) {
|
||||
return packFloat64(zSign, 0x7FF, 0);
|
||||
}
|
||||
if (aExp == 0) {
|
||||
++expDiff;
|
||||
} else {
|
||||
aSig |= LIT64(0x2000000000000000);
|
||||
}
|
||||
shift64RightJamming(aSig, -expDiff, &aSig);
|
||||
zExp = bExp;
|
||||
} else {
|
||||
if (aExp == 0x7FF) {
|
||||
return a;
|
||||
}
|
||||
if (aExp == 0)
|
||||
return packFloat64(zSign, 0, (aSig + bSig) >> 9);
|
||||
zSig = LIT64(0x4000000000000000) + aSig + bSig;
|
||||
zExp = aExp;
|
||||
goto roundAndPack;
|
||||
}
|
||||
aSig |= LIT64(0x2000000000000000);
|
||||
zSig = (aSig + bSig) << 1;
|
||||
--zExp;
|
||||
if ((sbits64) zSig < 0) {
|
||||
zSig = aSig + bSig;
|
||||
++zExp;
|
||||
}
|
||||
roundAndPack:
|
||||
return roundAndPackFloat64(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
inline float32 packFloat32(flag zSign, int16 zExp, bits32 zSig)
|
||||
{
|
||||
return (((bits32) zSign) << 31) + (((bits32) zExp) << 23) + zSig;
|
||||
}
|
||||
|
||||
inline void shift32RightJamming(bits32 a, int16 count, bits32 * zPtr)
|
||||
{
|
||||
bits32 z;
|
||||
if (count == 0) {
|
||||
z = a;
|
||||
} else if (count < 32) {
|
||||
z = (a >> count) | ((a << ((-count) & 31)) != 0);
|
||||
} else {
|
||||
z = (a != 0);
|
||||
}
|
||||
*zPtr = z;
|
||||
}
|
||||
|
||||
static float32 roundAndPackFloat32(flag zSign, int16 zExp, bits32 zSig)
|
||||
{
|
||||
flag roundNearestEven;
|
||||
int8 roundIncrement, roundBits;
|
||||
flag isTiny;
|
||||
|
||||
/* SH4 has only 2 rounding modes - round to nearest and round to zero */
|
||||
roundNearestEven = (float_rounding_mode() == FPSCR_RM_NEAREST);
|
||||
roundIncrement = 0x40;
|
||||
if (!roundNearestEven) {
|
||||
roundIncrement = 0;
|
||||
}
|
||||
roundBits = zSig & 0x7F;
|
||||
if (0xFD <= (bits16) zExp) {
|
||||
if ((0xFD < zExp)
|
||||
|| ((zExp == 0xFD)
|
||||
&& ((sbits32) (zSig + roundIncrement) < 0))
|
||||
) {
|
||||
float_raise(FPSCR_CAUSE_OVERFLOW | FPSCR_CAUSE_INEXACT);
|
||||
return packFloat32(zSign, 0xFF,
|
||||
0) - (roundIncrement == 0);
|
||||
}
|
||||
if (zExp < 0) {
|
||||
isTiny = (zExp < -1)
|
||||
|| (zSig + roundIncrement < 0x80000000);
|
||||
shift32RightJamming(zSig, -zExp, &zSig);
|
||||
zExp = 0;
|
||||
roundBits = zSig & 0x7F;
|
||||
if (isTiny && roundBits)
|
||||
float_raise(FPSCR_CAUSE_UNDERFLOW);
|
||||
}
|
||||
}
|
||||
if (roundBits)
|
||||
float_raise(FPSCR_CAUSE_INEXACT);
|
||||
zSig = (zSig + roundIncrement) >> 7;
|
||||
zSig &= ~(((roundBits ^ 0x40) == 0) & roundNearestEven);
|
||||
if (zSig == 0)
|
||||
zExp = 0;
|
||||
return packFloat32(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
static float32 normalizeRoundAndPackFloat32(flag zSign, int16 zExp, bits32 zSig)
|
||||
{
|
||||
int8 shiftCount;
|
||||
|
||||
shiftCount = countLeadingZeros32(zSig) - 1;
|
||||
return roundAndPackFloat32(zSign, zExp - shiftCount,
|
||||
zSig << shiftCount);
|
||||
}
|
||||
|
||||
static float64 roundAndPackFloat64(flag zSign, int16 zExp, bits64 zSig)
|
||||
{
|
||||
flag roundNearestEven;
|
||||
int16 roundIncrement, roundBits;
|
||||
flag isTiny;
|
||||
|
||||
/* SH4 has only 2 rounding modes - round to nearest and round to zero */
|
||||
roundNearestEven = (float_rounding_mode() == FPSCR_RM_NEAREST);
|
||||
roundIncrement = 0x200;
|
||||
if (!roundNearestEven) {
|
||||
roundIncrement = 0;
|
||||
}
|
||||
roundBits = zSig & 0x3FF;
|
||||
if (0x7FD <= (bits16) zExp) {
|
||||
if ((0x7FD < zExp)
|
||||
|| ((zExp == 0x7FD)
|
||||
&& ((sbits64) (zSig + roundIncrement) < 0))
|
||||
) {
|
||||
float_raise(FPSCR_CAUSE_OVERFLOW | FPSCR_CAUSE_INEXACT);
|
||||
return packFloat64(zSign, 0x7FF,
|
||||
0) - (roundIncrement == 0);
|
||||
}
|
||||
if (zExp < 0) {
|
||||
isTiny = (zExp < -1)
|
||||
|| (zSig + roundIncrement <
|
||||
LIT64(0x8000000000000000));
|
||||
shift64RightJamming(zSig, -zExp, &zSig);
|
||||
zExp = 0;
|
||||
roundBits = zSig & 0x3FF;
|
||||
if (isTiny && roundBits)
|
||||
float_raise(FPSCR_CAUSE_UNDERFLOW);
|
||||
}
|
||||
}
|
||||
if (roundBits)
|
||||
float_raise(FPSCR_CAUSE_INEXACT);
|
||||
zSig = (zSig + roundIncrement) >> 10;
|
||||
zSig &= ~(((roundBits ^ 0x200) == 0) & roundNearestEven);
|
||||
if (zSig == 0)
|
||||
zExp = 0;
|
||||
return packFloat64(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
static float32 subFloat32Sigs(float32 a, float32 b, flag zSign)
|
||||
{
|
||||
int16 aExp, bExp, zExp;
|
||||
bits32 aSig, bSig, zSig;
|
||||
int16 expDiff;
|
||||
|
||||
aSig = extractFloat32Frac(a);
|
||||
aExp = extractFloat32Exp(a);
|
||||
bSig = extractFloat32Frac(b);
|
||||
bExp = extractFloat32Exp(b);
|
||||
expDiff = aExp - bExp;
|
||||
aSig <<= 7;
|
||||
bSig <<= 7;
|
||||
if (0 < expDiff)
|
||||
goto aExpBigger;
|
||||
if (expDiff < 0)
|
||||
goto bExpBigger;
|
||||
if (aExp == 0) {
|
||||
aExp = 1;
|
||||
bExp = 1;
|
||||
}
|
||||
if (bSig < aSig)
|
||||
goto aBigger;
|
||||
if (aSig < bSig)
|
||||
goto bBigger;
|
||||
return packFloat32(float_rounding_mode() == FPSCR_RM_ZERO, 0, 0);
|
||||
bExpBigger:
|
||||
if (bExp == 0xFF) {
|
||||
return packFloat32(zSign ^ 1, 0xFF, 0);
|
||||
}
|
||||
if (aExp == 0) {
|
||||
++expDiff;
|
||||
} else {
|
||||
aSig |= 0x40000000;
|
||||
}
|
||||
shift32RightJamming(aSig, -expDiff, &aSig);
|
||||
bSig |= 0x40000000;
|
||||
bBigger:
|
||||
zSig = bSig - aSig;
|
||||
zExp = bExp;
|
||||
zSign ^= 1;
|
||||
goto normalizeRoundAndPack;
|
||||
aExpBigger:
|
||||
if (aExp == 0xFF) {
|
||||
return a;
|
||||
}
|
||||
if (bExp == 0) {
|
||||
--expDiff;
|
||||
} else {
|
||||
bSig |= 0x40000000;
|
||||
}
|
||||
shift32RightJamming(bSig, expDiff, &bSig);
|
||||
aSig |= 0x40000000;
|
||||
aBigger:
|
||||
zSig = aSig - bSig;
|
||||
zExp = aExp;
|
||||
normalizeRoundAndPack:
|
||||
--zExp;
|
||||
return normalizeRoundAndPackFloat32(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
static float32 addFloat32Sigs(float32 a, float32 b, flag zSign)
|
||||
{
|
||||
int16 aExp, bExp, zExp;
|
||||
bits32 aSig, bSig, zSig;
|
||||
int16 expDiff;
|
||||
|
||||
aSig = extractFloat32Frac(a);
|
||||
aExp = extractFloat32Exp(a);
|
||||
bSig = extractFloat32Frac(b);
|
||||
bExp = extractFloat32Exp(b);
|
||||
expDiff = aExp - bExp;
|
||||
aSig <<= 6;
|
||||
bSig <<= 6;
|
||||
if (0 < expDiff) {
|
||||
if (aExp == 0xFF) {
|
||||
return a;
|
||||
}
|
||||
if (bExp == 0) {
|
||||
--expDiff;
|
||||
} else {
|
||||
bSig |= 0x20000000;
|
||||
}
|
||||
shift32RightJamming(bSig, expDiff, &bSig);
|
||||
zExp = aExp;
|
||||
} else if (expDiff < 0) {
|
||||
if (bExp == 0xFF) {
|
||||
return packFloat32(zSign, 0xFF, 0);
|
||||
}
|
||||
if (aExp == 0) {
|
||||
++expDiff;
|
||||
} else {
|
||||
aSig |= 0x20000000;
|
||||
}
|
||||
shift32RightJamming(aSig, -expDiff, &aSig);
|
||||
zExp = bExp;
|
||||
} else {
|
||||
if (aExp == 0xFF) {
|
||||
return a;
|
||||
}
|
||||
if (aExp == 0)
|
||||
return packFloat32(zSign, 0, (aSig + bSig) >> 6);
|
||||
zSig = 0x40000000 + aSig + bSig;
|
||||
zExp = aExp;
|
||||
goto roundAndPack;
|
||||
}
|
||||
aSig |= 0x20000000;
|
||||
zSig = (aSig + bSig) << 1;
|
||||
--zExp;
|
||||
if ((sbits32) zSig < 0) {
|
||||
zSig = aSig + bSig;
|
||||
++zExp;
|
||||
}
|
||||
roundAndPack:
|
||||
return roundAndPackFloat32(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
float64 float64_sub(float64 a, float64 b)
|
||||
{
|
||||
flag aSign, bSign;
|
||||
|
||||
aSign = extractFloat64Sign(a);
|
||||
bSign = extractFloat64Sign(b);
|
||||
if (aSign == bSign) {
|
||||
return subFloat64Sigs(a, b, aSign);
|
||||
} else {
|
||||
return addFloat64Sigs(a, b, aSign);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
float32 float32_sub(float32 a, float32 b)
|
||||
{
|
||||
flag aSign, bSign;
|
||||
|
||||
aSign = extractFloat32Sign(a);
|
||||
bSign = extractFloat32Sign(b);
|
||||
if (aSign == bSign) {
|
||||
return subFloat32Sigs(a, b, aSign);
|
||||
} else {
|
||||
return addFloat32Sigs(a, b, aSign);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
float32 float32_add(float32 a, float32 b)
|
||||
{
|
||||
flag aSign, bSign;
|
||||
|
||||
aSign = extractFloat32Sign(a);
|
||||
bSign = extractFloat32Sign(b);
|
||||
if (aSign == bSign) {
|
||||
return addFloat32Sigs(a, b, aSign);
|
||||
} else {
|
||||
return subFloat32Sigs(a, b, aSign);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
float64 float64_add(float64 a, float64 b)
|
||||
{
|
||||
flag aSign, bSign;
|
||||
|
||||
aSign = extractFloat64Sign(a);
|
||||
bSign = extractFloat64Sign(b);
|
||||
if (aSign == bSign) {
|
||||
return addFloat64Sigs(a, b, aSign);
|
||||
} else {
|
||||
return subFloat64Sigs(a, b, aSign);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
normalizeFloat64Subnormal(bits64 aSig, int16 * zExpPtr, bits64 * zSigPtr)
|
||||
{
|
||||
int8 shiftCount;
|
||||
|
||||
shiftCount = countLeadingZeros64(aSig) - 11;
|
||||
*zSigPtr = aSig << shiftCount;
|
||||
*zExpPtr = 1 - shiftCount;
|
||||
}
|
||||
|
||||
inline void add128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
|
||||
bits64 * z1Ptr)
|
||||
{
|
||||
bits64 z1;
|
||||
|
||||
z1 = a1 + b1;
|
||||
*z1Ptr = z1;
|
||||
*z0Ptr = a0 + b0 + (z1 < a1);
|
||||
}
|
||||
|
||||
inline void
|
||||
sub128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
|
||||
bits64 * z1Ptr)
|
||||
{
|
||||
*z1Ptr = a1 - b1;
|
||||
*z0Ptr = a0 - b0 - (a1 < b1);
|
||||
}
|
||||
|
||||
static bits64 estimateDiv128To64(bits64 a0, bits64 a1, bits64 b)
|
||||
{
|
||||
bits64 b0, b1;
|
||||
bits64 rem0, rem1, term0, term1;
|
||||
bits64 z;
|
||||
if (b <= a0)
|
||||
return LIT64(0xFFFFFFFFFFFFFFFF);
|
||||
b0 = b >> 32;
|
||||
z = (b0 << 32 <= a0) ? LIT64(0xFFFFFFFF00000000) : (a0 / b0) << 32;
|
||||
mul64To128(b, z, &term0, &term1);
|
||||
sub128(a0, a1, term0, term1, &rem0, &rem1);
|
||||
while (((sbits64) rem0) < 0) {
|
||||
z -= LIT64(0x100000000);
|
||||
b1 = b << 32;
|
||||
add128(rem0, rem1, b0, b1, &rem0, &rem1);
|
||||
}
|
||||
rem0 = (rem0 << 32) | (rem1 >> 32);
|
||||
z |= (b0 << 32 <= rem0) ? 0xFFFFFFFF : rem0 / b0;
|
||||
return z;
|
||||
}
|
||||
|
||||
inline void mul64To128(bits64 a, bits64 b, bits64 * z0Ptr, bits64 * z1Ptr)
|
||||
{
|
||||
bits32 aHigh, aLow, bHigh, bLow;
|
||||
bits64 z0, zMiddleA, zMiddleB, z1;
|
||||
|
||||
aLow = a;
|
||||
aHigh = a >> 32;
|
||||
bLow = b;
|
||||
bHigh = b >> 32;
|
||||
z1 = ((bits64) aLow) * bLow;
|
||||
zMiddleA = ((bits64) aLow) * bHigh;
|
||||
zMiddleB = ((bits64) aHigh) * bLow;
|
||||
z0 = ((bits64) aHigh) * bHigh;
|
||||
zMiddleA += zMiddleB;
|
||||
z0 += (((bits64) (zMiddleA < zMiddleB)) << 32) + (zMiddleA >> 32);
|
||||
zMiddleA <<= 32;
|
||||
z1 += zMiddleA;
|
||||
z0 += (z1 < zMiddleA);
|
||||
*z1Ptr = z1;
|
||||
*z0Ptr = z0;
|
||||
|
||||
}
|
||||
|
||||
static void normalizeFloat32Subnormal(bits32 aSig, int16 * zExpPtr,
|
||||
bits32 * zSigPtr)
|
||||
{
|
||||
int8 shiftCount;
|
||||
|
||||
shiftCount = countLeadingZeros32(aSig) - 8;
|
||||
*zSigPtr = aSig << shiftCount;
|
||||
*zExpPtr = 1 - shiftCount;
|
||||
|
||||
}
|
||||
|
||||
float64 float64_div(float64 a, float64 b)
|
||||
{
|
||||
flag aSign, bSign, zSign;
|
||||
int16 aExp, bExp, zExp;
|
||||
bits64 aSig, bSig, zSig;
|
||||
bits64 rem0, rem1;
|
||||
bits64 term0, term1;
|
||||
|
||||
aSig = extractFloat64Frac(a);
|
||||
aExp = extractFloat64Exp(a);
|
||||
aSign = extractFloat64Sign(a);
|
||||
bSig = extractFloat64Frac(b);
|
||||
bExp = extractFloat64Exp(b);
|
||||
bSign = extractFloat64Sign(b);
|
||||
zSign = aSign ^ bSign;
|
||||
if (aExp == 0x7FF) {
|
||||
if (bExp == 0x7FF) {
|
||||
}
|
||||
return packFloat64(zSign, 0x7FF, 0);
|
||||
}
|
||||
if (bExp == 0x7FF) {
|
||||
return packFloat64(zSign, 0, 0);
|
||||
}
|
||||
if (bExp == 0) {
|
||||
if (bSig == 0) {
|
||||
if ((aExp | aSig) == 0) {
|
||||
float_raise(FPSCR_CAUSE_INVALID);
|
||||
}
|
||||
return packFloat64(zSign, 0x7FF, 0);
|
||||
}
|
||||
normalizeFloat64Subnormal(bSig, &bExp, &bSig);
|
||||
}
|
||||
if (aExp == 0) {
|
||||
if (aSig == 0)
|
||||
return packFloat64(zSign, 0, 0);
|
||||
normalizeFloat64Subnormal(aSig, &aExp, &aSig);
|
||||
}
|
||||
zExp = aExp - bExp + 0x3FD;
|
||||
aSig = (aSig | LIT64(0x0010000000000000)) << 10;
|
||||
bSig = (bSig | LIT64(0x0010000000000000)) << 11;
|
||||
if (bSig <= (aSig + aSig)) {
|
||||
aSig >>= 1;
|
||||
++zExp;
|
||||
}
|
||||
zSig = estimateDiv128To64(aSig, 0, bSig);
|
||||
if ((zSig & 0x1FF) <= 2) {
|
||||
mul64To128(bSig, zSig, &term0, &term1);
|
||||
sub128(aSig, 0, term0, term1, &rem0, &rem1);
|
||||
while ((sbits64) rem0 < 0) {
|
||||
--zSig;
|
||||
add128(rem0, rem1, 0, bSig, &rem0, &rem1);
|
||||
}
|
||||
zSig |= (rem1 != 0);
|
||||
}
|
||||
return roundAndPackFloat64(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
float32 float32_div(float32 a, float32 b)
|
||||
{
|
||||
flag aSign, bSign, zSign;
|
||||
int16 aExp, bExp, zExp;
|
||||
bits32 aSig, bSig, zSig;
|
||||
|
||||
aSig = extractFloat32Frac(a);
|
||||
aExp = extractFloat32Exp(a);
|
||||
aSign = extractFloat32Sign(a);
|
||||
bSig = extractFloat32Frac(b);
|
||||
bExp = extractFloat32Exp(b);
|
||||
bSign = extractFloat32Sign(b);
|
||||
zSign = aSign ^ bSign;
|
||||
if (aExp == 0xFF) {
|
||||
if (bExp == 0xFF) {
|
||||
}
|
||||
return packFloat32(zSign, 0xFF, 0);
|
||||
}
|
||||
if (bExp == 0xFF) {
|
||||
return packFloat32(zSign, 0, 0);
|
||||
}
|
||||
if (bExp == 0) {
|
||||
if (bSig == 0) {
|
||||
return packFloat32(zSign, 0xFF, 0);
|
||||
}
|
||||
normalizeFloat32Subnormal(bSig, &bExp, &bSig);
|
||||
}
|
||||
if (aExp == 0) {
|
||||
if (aSig == 0)
|
||||
return packFloat32(zSign, 0, 0);
|
||||
normalizeFloat32Subnormal(aSig, &aExp, &aSig);
|
||||
}
|
||||
zExp = aExp - bExp + 0x7D;
|
||||
aSig = (aSig | 0x00800000) << 7;
|
||||
bSig = (bSig | 0x00800000) << 8;
|
||||
if (bSig <= (aSig + aSig)) {
|
||||
aSig >>= 1;
|
||||
++zExp;
|
||||
}
|
||||
zSig = (((bits64) aSig) << 32) / bSig;
|
||||
if ((zSig & 0x3F) == 0) {
|
||||
zSig |= (((bits64) bSig) * zSig != ((bits64) aSig) << 32);
|
||||
}
|
||||
return roundAndPackFloat32(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
float32 float32_mul(float32 a, float32 b)
|
||||
{
|
||||
char aSign, bSign, zSign;
|
||||
int aExp, bExp, zExp;
|
||||
unsigned int aSig, bSig;
|
||||
unsigned long long zSig64;
|
||||
unsigned int zSig;
|
||||
|
||||
aSig = extractFloat32Frac(a);
|
||||
aExp = extractFloat32Exp(a);
|
||||
aSign = extractFloat32Sign(a);
|
||||
bSig = extractFloat32Frac(b);
|
||||
bExp = extractFloat32Exp(b);
|
||||
bSign = extractFloat32Sign(b);
|
||||
zSign = aSign ^ bSign;
|
||||
if (aExp == 0) {
|
||||
if (aSig == 0)
|
||||
return packFloat32(zSign, 0, 0);
|
||||
normalizeFloat32Subnormal(aSig, &aExp, &aSig);
|
||||
}
|
||||
if (bExp == 0) {
|
||||
if (bSig == 0)
|
||||
return packFloat32(zSign, 0, 0);
|
||||
normalizeFloat32Subnormal(bSig, &bExp, &bSig);
|
||||
}
|
||||
if ((bExp == 0xff && bSig == 0) || (aExp == 0xff && aSig == 0))
|
||||
return roundAndPackFloat32(zSign, 0xff, 0);
|
||||
|
||||
zExp = aExp + bExp - 0x7F;
|
||||
aSig = (aSig | 0x00800000) << 7;
|
||||
bSig = (bSig | 0x00800000) << 8;
|
||||
shift64RightJamming(((unsigned long long)aSig) * bSig, 32, &zSig64);
|
||||
zSig = zSig64;
|
||||
if (0 <= (signed int)(zSig << 1)) {
|
||||
zSig <<= 1;
|
||||
--zExp;
|
||||
}
|
||||
return roundAndPackFloat32(zSign, zExp, zSig);
|
||||
|
||||
}
|
||||
|
||||
float64 float64_mul(float64 a, float64 b)
|
||||
{
|
||||
char aSign, bSign, zSign;
|
||||
int aExp, bExp, zExp;
|
||||
unsigned long long int aSig, bSig, zSig0, zSig1;
|
||||
|
||||
aSig = extractFloat64Frac(a);
|
||||
aExp = extractFloat64Exp(a);
|
||||
aSign = extractFloat64Sign(a);
|
||||
bSig = extractFloat64Frac(b);
|
||||
bExp = extractFloat64Exp(b);
|
||||
bSign = extractFloat64Sign(b);
|
||||
zSign = aSign ^ bSign;
|
||||
|
||||
if (aExp == 0) {
|
||||
if (aSig == 0)
|
||||
return packFloat64(zSign, 0, 0);
|
||||
normalizeFloat64Subnormal(aSig, &aExp, &aSig);
|
||||
}
|
||||
if (bExp == 0) {
|
||||
if (bSig == 0)
|
||||
return packFloat64(zSign, 0, 0);
|
||||
normalizeFloat64Subnormal(bSig, &bExp, &bSig);
|
||||
}
|
||||
if ((aExp == 0x7ff && aSig == 0) || (bExp == 0x7ff && bSig == 0))
|
||||
return roundAndPackFloat64(zSign, 0x7ff, 0);
|
||||
|
||||
zExp = aExp + bExp - 0x3FF;
|
||||
aSig = (aSig | 0x0010000000000000LL) << 10;
|
||||
bSig = (bSig | 0x0010000000000000LL) << 11;
|
||||
mul64To128(aSig, bSig, &zSig0, &zSig1);
|
||||
zSig0 |= (zSig1 != 0);
|
||||
if (0 <= (signed long long int)(zSig0 << 1)) {
|
||||
zSig0 <<= 1;
|
||||
--zExp;
|
||||
}
|
||||
return roundAndPackFloat64(zSign, zExp, zSig0);
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
#
|
||||
|
||||
# CPU subtype setup
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7763) += setup-sh7763.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7770) += setup-sh7770.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7780) += setup-sh7780.o
|
||||
obj-$(CONFIG_CPU_SUBTYPE_SH7785) += setup-sh7785.o
|
||||
|
@ -14,6 +15,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SHX3) += setup-shx3.o
|
|||
smp-$(CONFIG_CPU_SUBTYPE_SHX3) := smp-shx3.o
|
||||
|
||||
# Primary on-chip clocks (common)
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7770) := clock-sh7770.o
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7780) := clock-sh7780.o
|
||||
clock-$(CONFIG_CPU_SUBTYPE_SH7785) := clock-sh7785.o
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* arch/sh/kernel/cpu/sh4a/clock-sh7763.c
|
||||
*
|
||||
* SH7763 support for the clock framework
|
||||
*
|
||||
* Copyright (C) 2005 Paul Mundt
|
||||
* Copyright (C) 2007 Yoshihiro Shimoda
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/clock.h>
|
||||
#include <asm/freq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static int bfc_divisors[] = { 1, 1, 1, 8, 1, 1, 1, 1 };
|
||||
static int p0fc_divisors[] = { 1, 1, 1, 8, 1, 1, 1, 1 };
|
||||
static int p1fc_divisors[] = { 1, 1, 1, 16, 1, 1, 1, 1 };
|
||||
static int cfc_divisors[] = { 1, 1, 4, 1, 1, 1, 1, 1 };
|
||||
|
||||
static void master_clk_init(struct clk *clk)
|
||||
{
|
||||
clk->rate *= p0fc_divisors[(ctrl_inl(FRQCR) >> 4) & 0x07];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7763_master_clk_ops = {
|
||||
.init = master_clk_init,
|
||||
};
|
||||
|
||||
static void module_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int idx = ((ctrl_inl(FRQCR) >> 4) & 0x07);
|
||||
clk->rate = clk->parent->rate / p0fc_divisors[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7763_module_clk_ops = {
|
||||
.recalc = module_clk_recalc,
|
||||
};
|
||||
|
||||
static void bus_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int idx = ((ctrl_inl(FRQCR) >> 16) & 0x07);
|
||||
clk->rate = clk->parent->rate / bfc_divisors[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7763_bus_clk_ops = {
|
||||
.recalc = bus_clk_recalc,
|
||||
};
|
||||
|
||||
static void cpu_clk_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = clk->parent->rate;
|
||||
}
|
||||
|
||||
static struct clk_ops sh7763_cpu_clk_ops = {
|
||||
.recalc = cpu_clk_recalc,
|
||||
};
|
||||
|
||||
static struct clk_ops *sh7763_clk_ops[] = {
|
||||
&sh7763_master_clk_ops,
|
||||
&sh7763_module_clk_ops,
|
||||
&sh7763_bus_clk_ops,
|
||||
&sh7763_cpu_clk_ops,
|
||||
};
|
||||
|
||||
void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
|
||||
{
|
||||
if (idx < ARRAY_SIZE(sh7763_clk_ops))
|
||||
*ops = sh7763_clk_ops[idx];
|
||||
}
|
||||
|
||||
static void shyway_clk_recalc(struct clk *clk)
|
||||
{
|
||||
int idx = ((ctrl_inl(FRQCR) >> 20) & 0x07);
|
||||
clk->rate = clk->parent->rate / cfc_divisors[idx];
|
||||
}
|
||||
|
||||
static struct clk_ops sh7763_shyway_clk_ops = {
|
||||
.recalc = shyway_clk_recalc,
|
||||
};
|
||||
|
||||
static struct clk sh7763_shyway_clk = {
|
||||
.name = "shyway_clk",
|
||||
.flags = CLK_ALWAYS_ENABLED,
|
||||
.ops = &sh7763_shyway_clk_ops,
|
||||
};
|
||||
|
||||
/*
|
||||
* Additional SH7763-specific on-chip clocks that aren't already part of the
|
||||
* clock framework
|
||||
*/
|
||||
static struct clk *sh7763_onchip_clocks[] = {
|
||||
&sh7763_shyway_clk,
|
||||
};
|
||||
|
||||
static int __init sh7763_clk_init(void)
|
||||
{
|
||||
struct clk *clk = clk_get(NULL, "master_clk");
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sh7763_onchip_clocks); i++) {
|
||||
struct clk *clkp = sh7763_onchip_clocks[i];
|
||||
|
||||
clkp->parent = clk;
|
||||
clk_register(clkp);
|
||||
clk_enable(clkp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now that we have the rest of the clocks registered, we need to
|
||||
* force the parent clock to propagate so that these clocks will
|
||||
* automatically figure out their rate. We cheat by handing the
|
||||
* parent clock its current rate and forcing child propagation.
|
||||
*/
|
||||
clk_set_rate(clk, clk_get_rate(clk));
|
||||
|
||||
clk_put(clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(sh7763_clk_init);
|
||||
|
|
@ -157,14 +157,6 @@ static struct intc_group groups[] __initdata = {
|
|||
INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2, SDHI3),
|
||||
};
|
||||
|
||||
static struct intc_prio priorities[] __initdata = {
|
||||
INTC_PRIO(SCIF0, 3),
|
||||
INTC_PRIO(SCIF1, 3),
|
||||
INTC_PRIO(SCIF2, 3),
|
||||
INTC_PRIO(TMU0, 2),
|
||||
INTC_PRIO(TMU1, 2),
|
||||
};
|
||||
|
||||
static struct intc_mask_reg mask_registers[] __initdata = {
|
||||
{ 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */
|
||||
{ } },
|
||||
|
@ -217,7 +209,7 @@ static struct intc_sense_reg sense_registers[] __initdata = {
|
|||
{ IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
|
||||
};
|
||||
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7722", vectors, groups, priorities,
|
||||
static DECLARE_INTC_DESC(intc_desc, "sh7722", vectors, groups,
|
||||
mask_registers, prio_registers, sense_registers);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче