Linux 3.9
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAABAgAGBQJRfcB+AAoJEHm+PkMAQRiGmLAH/0bIpdOYylJhRDmVOztXpANP jRYYH00UiSIBz8XO463dbbtevT2pB8pIw5TCxBWBi/V5rnJS9X5pvAHyNZBDUvYd 3BQCQ2cnQ+6stFpi4o6NciZzQShDGMmUxAOD6ejZM35/P2l+ZKrNqBwy3R4oeMuZ /WUYZTCfFF3G7qgkHoOwIjM6c34v0tpqLfx4R5CdTnKe0Ow0OGb5ko5+lefD6i9m 6cd2GFlWeIUvw0FSMLyB+HN6Tkf3JnwrklP+vuLNV+uOq5BLwggGc6A1eS51IuVJ e/ZkGTtirz+mZiG5lvqSXHaVEObPsbm32XfVVHp1SiE+TIugDb2uhtEQEv+a43w= =UOGY -----END PGP SIGNATURE----- Merge tag 'v3.9' into efi-for-tip2 Resolve conflicts for Ingo. Conflicts: drivers/firmware/Kconfig drivers/firmware/efivars.c Signed-off-by: Matt Fleming <matt.fleming@intel.com>
This commit is contained in:
commit
a614e1923d
|
@ -227,7 +227,7 @@ X!Isound/sound_firmware.c
|
||||||
<chapter id="uart16x50">
|
<chapter id="uart16x50">
|
||||||
<title>16x50 UART Driver</title>
|
<title>16x50 UART Driver</title>
|
||||||
!Edrivers/tty/serial/serial_core.c
|
!Edrivers/tty/serial/serial_core.c
|
||||||
!Edrivers/tty/serial/8250/8250.c
|
!Edrivers/tty/serial/8250/8250_core.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="fbdev">
|
<chapter id="fbdev">
|
||||||
|
|
|
@ -596,9 +596,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
is selected automatically. Check
|
is selected automatically. Check
|
||||||
Documentation/kdump/kdump.txt for further details.
|
Documentation/kdump/kdump.txt for further details.
|
||||||
|
|
||||||
crashkernel_low=size[KMG]
|
|
||||||
[KNL, x86] parts under 4G.
|
|
||||||
|
|
||||||
crashkernel=range1:size1[,range2:size2,...][@offset]
|
crashkernel=range1:size1[,range2:size2,...][@offset]
|
||||||
[KNL] Same as above, but depends on the memory
|
[KNL] Same as above, but depends on the memory
|
||||||
in the running system. The syntax of range is
|
in the running system. The syntax of range is
|
||||||
|
@ -606,6 +603,26 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
a memory unit (amount[KMG]). See also
|
a memory unit (amount[KMG]). See also
|
||||||
Documentation/kdump/kdump.txt for an example.
|
Documentation/kdump/kdump.txt for an example.
|
||||||
|
|
||||||
|
crashkernel=size[KMG],high
|
||||||
|
[KNL, x86_64] range could be above 4G. Allow kernel
|
||||||
|
to allocate physical memory region from top, so could
|
||||||
|
be above 4G if system have more than 4G ram installed.
|
||||||
|
Otherwise memory region will be allocated below 4G, if
|
||||||
|
available.
|
||||||
|
It will be ignored if crashkernel=X is specified.
|
||||||
|
crashkernel=size[KMG],low
|
||||||
|
[KNL, x86_64] range under 4G. When crashkernel=X,high
|
||||||
|
is passed, kernel could allocate physical memory region
|
||||||
|
above 4G, that cause second kernel crash on system
|
||||||
|
that require some amount of low memory, e.g. swiotlb
|
||||||
|
requires at least 64M+32K low memory. Kernel would
|
||||||
|
try to allocate 72M below 4G automatically.
|
||||||
|
This one let user to specify own low range under 4G
|
||||||
|
for second kernel instead.
|
||||||
|
0: to disable low allocation.
|
||||||
|
It will be ignored when crashkernel=X,high is not used
|
||||||
|
or memory reserved is below 4G.
|
||||||
|
|
||||||
cs89x0_dma= [HW,NET]
|
cs89x0_dma= [HW,NET]
|
||||||
Format: <dma>
|
Format: <dma>
|
||||||
|
|
||||||
|
@ -788,6 +805,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
edd= [EDD]
|
edd= [EDD]
|
||||||
Format: {"off" | "on" | "skip[mbr]"}
|
Format: {"off" | "on" | "skip[mbr]"}
|
||||||
|
|
||||||
|
efi_no_storage_paranoia [EFI; X86]
|
||||||
|
Using this parameter you can use more than 50% of
|
||||||
|
your efi variable storage. Use this parameter only if
|
||||||
|
you are really sure that your UEFI does sane gc and
|
||||||
|
fulfills the spec otherwise your board may brick.
|
||||||
|
|
||||||
eisa_irq_edge= [PARISC,HW]
|
eisa_irq_edge= [PARISC,HW]
|
||||||
See header of drivers/parisc/eisa.c.
|
See header of drivers/parisc/eisa.c.
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2003-2012 QLogic Corporation
|
Copyright (c) 2003-2013 QLogic Corporation
|
||||||
QLogic Linux FC-FCoE Driver
|
QLogic Linux FC-FCoE Driver
|
||||||
|
|
||||||
This program includes a device driver for Linux 3.x.
|
This program includes a device driver for Linux 3.x.
|
||||||
|
|
|
@ -890,9 +890,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
|
enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
|
||||||
power_save - Automatic power-saving timeout (in second, 0 =
|
power_save - Automatic power-saving timeout (in second, 0 =
|
||||||
disable)
|
disable)
|
||||||
power_save_controller - Support runtime D3 of HD-audio controller
|
power_save_controller - Reset HD-audio controller in power-saving mode
|
||||||
(-1 = on for supported chip (default), false = off,
|
(default = on)
|
||||||
true = force to on even for unsupported hardware)
|
|
||||||
align_buffer_size - Force rounding of buffer/period sizes to multiples
|
align_buffer_size - Force rounding of buffer/period sizes to multiples
|
||||||
of 128 bytes. This is more efficient in terms of memory
|
of 128 bytes. This is more efficient in terms of memory
|
||||||
access but isn't required by the HDA spec and prevents
|
access but isn't required by the HDA spec and prevents
|
||||||
|
|
19
MAINTAINERS
19
MAINTAINERS
|
@ -4950,6 +4950,12 @@ W: logfs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: fs/logfs/
|
F: fs/logfs/
|
||||||
|
|
||||||
|
LPC32XX MACHINE SUPPORT
|
||||||
|
M: Roland Stigge <stigge@antcom.de>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-lpc32xx/
|
||||||
|
|
||||||
LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
|
LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
|
||||||
M: Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
|
M: Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
|
||||||
M: Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
|
M: Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
|
||||||
|
@ -5074,9 +5080,8 @@ S: Maintained
|
||||||
F: drivers/net/ethernet/marvell/sk*
|
F: drivers/net/ethernet/marvell/sk*
|
||||||
|
|
||||||
MARVELL LIBERTAS WIRELESS DRIVER
|
MARVELL LIBERTAS WIRELESS DRIVER
|
||||||
M: Dan Williams <dcbw@redhat.com>
|
|
||||||
L: libertas-dev@lists.infradead.org
|
L: libertas-dev@lists.infradead.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: drivers/net/wireless/libertas/
|
F: drivers/net/wireless/libertas/
|
||||||
|
|
||||||
MARVELL MV643XX ETHERNET DRIVER
|
MARVELL MV643XX ETHERNET DRIVER
|
||||||
|
@ -5578,6 +5583,7 @@ F: include/uapi/linux/if_*
|
||||||
F: include/uapi/linux/netdevice.h
|
F: include/uapi/linux/netdevice.h
|
||||||
|
|
||||||
NETXEN (1/10) GbE SUPPORT
|
NETXEN (1/10) GbE SUPPORT
|
||||||
|
M: Manish Chopra <manish.chopra@qlogic.com>
|
||||||
M: Sony Chacko <sony.chacko@qlogic.com>
|
M: Sony Chacko <sony.chacko@qlogic.com>
|
||||||
M: Rajesh Borundia <rajesh.borundia@qlogic.com>
|
M: Rajesh Borundia <rajesh.borundia@qlogic.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -6634,7 +6640,7 @@ S: Supported
|
||||||
F: fs/reiserfs/
|
F: fs/reiserfs/
|
||||||
|
|
||||||
REGISTER MAP ABSTRACTION
|
REGISTER MAP ABSTRACTION
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/base/regmap/
|
F: drivers/base/regmap/
|
||||||
|
@ -6960,7 +6966,6 @@ F: drivers/scsi/st*
|
||||||
|
|
||||||
SCTP PROTOCOL
|
SCTP PROTOCOL
|
||||||
M: Vlad Yasevich <vyasevich@gmail.com>
|
M: Vlad Yasevich <vyasevich@gmail.com>
|
||||||
M: Sridhar Samudrala <sri@us.ibm.com>
|
|
||||||
M: Neil Horman <nhorman@tuxdriver.com>
|
M: Neil Horman <nhorman@tuxdriver.com>
|
||||||
L: linux-sctp@vger.kernel.org
|
L: linux-sctp@vger.kernel.org
|
||||||
W: http://lksctp.sourceforge.net
|
W: http://lksctp.sourceforge.net
|
||||||
|
@ -7383,7 +7388,7 @@ F: sound/
|
||||||
|
|
||||||
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
|
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
|
||||||
M: Liam Girdwood <lgirdwood@gmail.com>
|
M: Liam Girdwood <lgirdwood@gmail.com>
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
W: http://alsa-project.org/main/index.php/ASoC
|
W: http://alsa-project.org/main/index.php/ASoC
|
||||||
|
@ -7472,7 +7477,7 @@ F: drivers/clk/spear/
|
||||||
|
|
||||||
SPI SUBSYSTEM
|
SPI SUBSYSTEM
|
||||||
M: Grant Likely <grant.likely@secretlab.ca>
|
M: Grant Likely <grant.likely@secretlab.ca>
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
L: spi-devel-general@lists.sourceforge.net
|
L: spi-devel-general@lists.sourceforge.net
|
||||||
Q: http://patchwork.kernel.org/project/spi-devel-general/list/
|
Q: http://patchwork.kernel.org/project/spi-devel-general/list/
|
||||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||||
|
@ -8717,7 +8722,7 @@ F: drivers/scsi/vmw_pvscsi.h
|
||||||
|
|
||||||
VOLTAGE AND CURRENT REGULATOR FRAMEWORK
|
VOLTAGE AND CURRENT REGULATOR FRAMEWORK
|
||||||
M: Liam Girdwood <lrg@ti.com>
|
M: Liam Girdwood <lrg@ti.com>
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
W: http://opensource.wolfsonmicro.com/node/15
|
W: http://opensource.wolfsonmicro.com/node/15
|
||||||
W: http://www.slimlogic.co.uk/?p=48
|
W: http://www.slimlogic.co.uk/?p=48
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/regulator.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/regulator.git
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION =
|
||||||
NAME = Unicycling Gorilla
|
NAME = Unicycling Gorilla
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -513,7 +513,8 @@ ifeq ($(KBUILD_EXTMOD),)
|
||||||
# Carefully list dependencies so we do not try to build scripts twice
|
# Carefully list dependencies so we do not try to build scripts twice
|
||||||
# in parallel
|
# in parallel
|
||||||
PHONY += scripts
|
PHONY += scripts
|
||||||
scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
|
scripts: scripts_basic include/config/auto.conf include/config/tristate.conf \
|
||||||
|
asm-generic
|
||||||
$(Q)$(MAKE) $(build)=$(@)
|
$(Q)$(MAKE) $(build)=$(@)
|
||||||
|
|
||||||
# Objects we will link into vmlinux / subdirs we need to visit
|
# Objects we will link into vmlinux / subdirs we need to visit
|
||||||
|
|
|
@ -12,7 +12,7 @@ NM := $(NM) -B
|
||||||
|
|
||||||
LDFLAGS_vmlinux := -static -N #-relax
|
LDFLAGS_vmlinux := -static -N #-relax
|
||||||
CHECKFLAGS += -D__alpha__ -m64
|
CHECKFLAGS += -D__alpha__ -m64
|
||||||
cflags-y := -pipe -mno-fp-regs -ffixed-8 -msmall-data
|
cflags-y := -pipe -mno-fp-regs -ffixed-8
|
||||||
cflags-y += $(call cc-option, -fno-jump-tables)
|
cflags-y += $(call cc-option, -fno-jump-tables)
|
||||||
|
|
||||||
cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4
|
cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#define fd_disable_irq() disable_irq(FLOPPY_IRQ)
|
#define fd_disable_irq() disable_irq(FLOPPY_IRQ)
|
||||||
#define fd_cacheflush(addr,size) /* nothing */
|
#define fd_cacheflush(addr,size) /* nothing */
|
||||||
#define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt,\
|
#define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt,\
|
||||||
IRQF_DISABLED, "floppy", NULL)
|
0, "floppy", NULL)
|
||||||
#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL)
|
#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL)
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
|
|
|
@ -117,13 +117,6 @@ handle_irq(int irq)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* From here we must proceed with IPL_MAX. Note that we do not
|
|
||||||
* explicitly enable interrupts afterwards - some MILO PALcode
|
|
||||||
* (namely LX164 one) seems to have severe problems with RTI
|
|
||||||
* at IPL 0.
|
|
||||||
*/
|
|
||||||
local_irq_disable();
|
|
||||||
irq_enter();
|
irq_enter();
|
||||||
generic_handle_irq_desc(irq, desc);
|
generic_handle_irq_desc(irq, desc);
|
||||||
irq_exit();
|
irq_exit();
|
||||||
|
|
|
@ -45,6 +45,14 @@ do_entInt(unsigned long type, unsigned long vector,
|
||||||
unsigned long la_ptr, struct pt_regs *regs)
|
unsigned long la_ptr, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs;
|
struct pt_regs *old_regs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disable interrupts during IRQ handling.
|
||||||
|
* Note that there is no matching local_irq_enable() due to
|
||||||
|
* severe problems with RTI at IPL0 and some MILO PALcode
|
||||||
|
* (namely LX164).
|
||||||
|
*/
|
||||||
|
local_irq_disable();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0:
|
case 0:
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -62,7 +70,6 @@ do_entInt(unsigned long type, unsigned long vector,
|
||||||
{
|
{
|
||||||
long cpu;
|
long cpu;
|
||||||
|
|
||||||
local_irq_disable();
|
|
||||||
smp_percpu_timer_interrupt(regs);
|
smp_percpu_timer_interrupt(regs);
|
||||||
cpu = smp_processor_id();
|
cpu = smp_processor_id();
|
||||||
if (cpu != boot_cpuid) {
|
if (cpu != boot_cpuid) {
|
||||||
|
@ -222,7 +229,6 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,
|
||||||
|
|
||||||
struct irqaction timer_irqaction = {
|
struct irqaction timer_irqaction = {
|
||||||
.handler = timer_interrupt,
|
.handler = timer_interrupt,
|
||||||
.flags = IRQF_DISABLED,
|
|
||||||
.name = "timer",
|
.name = "timer",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -188,6 +188,10 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||||
extern void free_reserved_mem(void *, void *);
|
extern void free_reserved_mem(void *, void *);
|
||||||
extern void pcibios_claim_one_bus(struct pci_bus *);
|
extern void pcibios_claim_one_bus(struct pci_bus *);
|
||||||
|
|
||||||
|
static struct resource irongate_io = {
|
||||||
|
.name = "Irongate PCI IO",
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
};
|
||||||
static struct resource irongate_mem = {
|
static struct resource irongate_mem = {
|
||||||
.name = "Irongate PCI MEM",
|
.name = "Irongate PCI MEM",
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
|
@ -209,6 +213,7 @@ nautilus_init_pci(void)
|
||||||
|
|
||||||
irongate = pci_get_bus_and_slot(0, 0);
|
irongate = pci_get_bus_and_slot(0, 0);
|
||||||
bus->self = irongate;
|
bus->self = irongate;
|
||||||
|
bus->resource[0] = &irongate_io;
|
||||||
bus->resource[1] = &irongate_mem;
|
bus->resource[1] = &irongate_mem;
|
||||||
|
|
||||||
pci_bus_size_bridges(bus);
|
pci_bus_size_bridges(bus);
|
||||||
|
|
|
@ -280,15 +280,15 @@ titan_late_init(void)
|
||||||
* all reported to the kernel as machine checks, so the handler
|
* all reported to the kernel as machine checks, so the handler
|
||||||
* is a nop so it can be called to count the individual events.
|
* is a nop so it can be called to count the individual events.
|
||||||
*/
|
*/
|
||||||
titan_request_irq(63+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(63+16, titan_intr_nop, 0,
|
||||||
"CChip Error", NULL);
|
"CChip Error", NULL);
|
||||||
titan_request_irq(62+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(62+16, titan_intr_nop, 0,
|
||||||
"PChip 0 H_Error", NULL);
|
"PChip 0 H_Error", NULL);
|
||||||
titan_request_irq(61+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(61+16, titan_intr_nop, 0,
|
||||||
"PChip 1 H_Error", NULL);
|
"PChip 1 H_Error", NULL);
|
||||||
titan_request_irq(60+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(60+16, titan_intr_nop, 0,
|
||||||
"PChip 0 C_Error", NULL);
|
"PChip 0 C_Error", NULL);
|
||||||
titan_request_irq(59+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(59+16, titan_intr_nop, 0,
|
||||||
"PChip 1 C_Error", NULL);
|
"PChip 1 C_Error", NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -348,9 +348,9 @@ privateer_init_pci(void)
|
||||||
* Hook a couple of extra err interrupts that the
|
* Hook a couple of extra err interrupts that the
|
||||||
* common titan code won't.
|
* common titan code won't.
|
||||||
*/
|
*/
|
||||||
titan_request_irq(53+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(53+16, titan_intr_nop, 0,
|
||||||
"NMI", NULL);
|
"NMI", NULL);
|
||||||
titan_request_irq(50+16, titan_intr_nop, IRQF_DISABLED,
|
titan_request_irq(50+16, titan_intr_nop, 0,
|
||||||
"Temperature Warning", NULL);
|
"Temperature Warning", NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -39,7 +39,7 @@ static inline long arch_local_irq_save(void)
|
||||||
" flag.nz %0 \n"
|
" flag.nz %0 \n"
|
||||||
: "=r"(temp), "=r"(flags)
|
: "=r"(temp), "=r"(flags)
|
||||||
: "n"((STATUS_E1_MASK | STATUS_E2_MASK))
|
: "n"((STATUS_E1_MASK | STATUS_E2_MASK))
|
||||||
: "cc");
|
: "memory", "cc");
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,8 @@ static inline void arch_local_irq_restore(unsigned long flags)
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" flag %0 \n"
|
" flag %0 \n"
|
||||||
:
|
:
|
||||||
: "r"(flags));
|
: "r"(flags)
|
||||||
|
: "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -73,7 +74,8 @@ static inline void arch_local_irq_disable(void)
|
||||||
" and %0, %0, %1 \n"
|
" and %0, %0, %1 \n"
|
||||||
" flag %0 \n"
|
" flag %0 \n"
|
||||||
: "=&r"(temp)
|
: "=&r"(temp)
|
||||||
: "n"(~(STATUS_E1_MASK | STATUS_E2_MASK)));
|
: "n"(~(STATUS_E1_MASK | STATUS_E2_MASK))
|
||||||
|
: "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -85,7 +87,9 @@ static inline long arch_local_save_flags(void)
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" lr %0, [status32] \n"
|
" lr %0, [status32] \n"
|
||||||
: "=&r"(temp));
|
: "=&r"(temp)
|
||||||
|
:
|
||||||
|
: "memory");
|
||||||
|
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1183,9 +1183,9 @@ config ARM_NR_BANKS
|
||||||
default 8
|
default 8
|
||||||
|
|
||||||
config IWMMXT
|
config IWMMXT
|
||||||
bool "Enable iWMMXt support"
|
bool "Enable iWMMXt support" if !CPU_PJ4
|
||||||
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
|
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
|
||||||
default y if PXA27x || PXA3xx || ARCH_MMP
|
default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4
|
||||||
help
|
help
|
||||||
Enable support for iWMMXt context switching at run time if
|
Enable support for iWMMXt context switching at run time if
|
||||||
running on a CPU that supports it.
|
running on a CPU that supports it.
|
||||||
|
@ -1439,6 +1439,16 @@ config ARM_ERRATA_775420
|
||||||
to deadlock. This workaround puts DSB before executing ISB if
|
to deadlock. This workaround puts DSB before executing ISB if
|
||||||
an abort may occur on cache maintenance.
|
an abort may occur on cache maintenance.
|
||||||
|
|
||||||
|
config ARM_ERRATA_798181
|
||||||
|
bool "ARM errata: TLBI/DSB failure on Cortex-A15"
|
||||||
|
depends on CPU_V7 && SMP
|
||||||
|
help
|
||||||
|
On Cortex-A15 (r0p0..r3p2) the TLBI*IS/DSB operations are not
|
||||||
|
adequately shooting down all use of the old entries. This
|
||||||
|
option enables the Linux kernel workaround for this erratum
|
||||||
|
which sends an IPI to the CPUs that are running the same ASID
|
||||||
|
as the one being invalidated.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "arch/arm/common/Kconfig"
|
source "arch/arm/common/Kconfig"
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
mvsdio@d00d4000 {
|
mvsdio@d00d4000 {
|
||||||
pinctrl-0 = <&sdio_pins2>;
|
pinctrl-0 = <&sdio_pins3>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -59,6 +59,12 @@
|
||||||
"mpp50", "mpp51", "mpp52";
|
"mpp50", "mpp51", "mpp52";
|
||||||
marvell,function = "sd0";
|
marvell,function = "sd0";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sdio_pins3: sdio-pins3 {
|
||||||
|
marvell,pins = "mpp48", "mpp49", "mpp50",
|
||||||
|
"mpp51", "mpp52", "mpp53";
|
||||||
|
marvell,function = "sd0";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio@d0018100 {
|
gpio0: gpio@d0018100 {
|
||||||
|
|
|
@ -191,8 +191,8 @@
|
||||||
|
|
||||||
prcmu: prcmu@80157000 {
|
prcmu: prcmu@80157000 {
|
||||||
compatible = "stericsson,db8500-prcmu";
|
compatible = "stericsson,db8500-prcmu";
|
||||||
reg = <0x80157000 0x1000>;
|
reg = <0x80157000 0x1000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>;
|
||||||
reg-names = "prcmu";
|
reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm";
|
||||||
interrupts = <0 47 0x4>;
|
interrupts = <0 47 0x4>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -152,7 +152,6 @@
|
||||||
i2c0: i2c@80058000 {
|
i2c0: i2c@80058000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c0_pins_a>;
|
pinctrl-0 = <&i2c0_pins_a>;
|
||||||
clock-frequency = <400000>;
|
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
sgtl5000: codec@0a {
|
sgtl5000: codec@0a {
|
||||||
|
|
|
@ -70,7 +70,6 @@
|
||||||
i2c0: i2c@80058000 {
|
i2c0: i2c@80058000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c0_pins_a>;
|
pinctrl-0 = <&i2c0_pins_a>;
|
||||||
clock-frequency = <400000>;
|
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
rtc: rtc@51 {
|
rtc: rtc@51 {
|
||||||
|
|
|
@ -91,6 +91,7 @@
|
||||||
compatible = "arm,cortex-a9-twd-timer";
|
compatible = "arm,cortex-a9-twd-timer";
|
||||||
reg = <0x00a00600 0x20>;
|
reg = <0x00a00600 0x20>;
|
||||||
interrupts = <1 13 0xf01>;
|
interrupts = <1 13 0xf01>;
|
||||||
|
clocks = <&clks 15>;
|
||||||
};
|
};
|
||||||
|
|
||||||
L2: l2-cache@00a02000 {
|
L2: l2-cache@00a02000 {
|
||||||
|
|
|
@ -77,6 +77,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
nand@3000000 {
|
nand@3000000 {
|
||||||
|
chip-delay = <40>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
partition@0 {
|
partition@0 {
|
||||||
|
|
|
@ -96,11 +96,11 @@
|
||||||
marvell,function = "gpio";
|
marvell,function = "gpio";
|
||||||
};
|
};
|
||||||
pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 {
|
pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 {
|
||||||
marvell,pins = "mpp44";
|
marvell,pins = "mpp46";
|
||||||
marvell,function = "gpio";
|
marvell,function = "gpio";
|
||||||
};
|
};
|
||||||
pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 {
|
pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 {
|
||||||
marvell,pins = "mpp45";
|
marvell,pins = "mpp47";
|
||||||
marvell,function = "gpio";
|
marvell,function = "gpio";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -157,14 +157,14 @@
|
||||||
gpios = <&gpio0 16 0>;
|
gpios = <&gpio0 16 0>;
|
||||||
linux,default-trigger = "default-on";
|
linux,default-trigger = "default-on";
|
||||||
};
|
};
|
||||||
health_led1 {
|
rebuild_led {
|
||||||
|
label = "status:white:rebuild_led";
|
||||||
|
gpios = <&gpio1 4 0>;
|
||||||
|
};
|
||||||
|
health_led {
|
||||||
label = "status:red:health_led";
|
label = "status:red:health_led";
|
||||||
gpios = <&gpio1 5 0>;
|
gpios = <&gpio1 5 0>;
|
||||||
};
|
};
|
||||||
health_led2 {
|
|
||||||
label = "status:white:health_led";
|
|
||||||
gpios = <&gpio1 4 0>;
|
|
||||||
};
|
|
||||||
backup_led {
|
backup_led {
|
||||||
label = "status:blue:backup_led";
|
label = "status:blue:backup_led";
|
||||||
gpios = <&gpio0 15 0>;
|
gpios = <&gpio0 15 0>;
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
compatible = "marvell,orion5x";
|
compatible = "marvell,orion5x";
|
||||||
interrupt-parent = <&intc>;
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
gpio0 = &gpio0;
|
||||||
|
};
|
||||||
intc: interrupt-controller {
|
intc: interrupt-controller {
|
||||||
compatible = "marvell,orion-intc", "marvell,intc";
|
compatible = "marvell,orion-intc", "marvell,intc";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
|
@ -32,7 +35,9 @@
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
reg = <0x10100 0x40>;
|
reg = <0x10100 0x40>;
|
||||||
ngpio = <32>;
|
ngpios = <32>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
interrupts = <6>, <7>, <8>, <9>;
|
interrupts = <6>, <7>, <8>, <9>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -91,7 +96,7 @@
|
||||||
reg = <0x90000 0x10000>,
|
reg = <0x90000 0x10000>,
|
||||||
<0xf2200000 0x800>;
|
<0xf2200000 0x800>;
|
||||||
reg-names = "regs", "sram";
|
reg-names = "regs", "sram";
|
||||||
interrupts = <22>;
|
interrupts = <28>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,7 +24,7 @@ extern struct arm_delay_ops {
|
||||||
void (*delay)(unsigned long);
|
void (*delay)(unsigned long);
|
||||||
void (*const_udelay)(unsigned long);
|
void (*const_udelay)(unsigned long);
|
||||||
void (*udelay)(unsigned long);
|
void (*udelay)(unsigned long);
|
||||||
bool const_clock;
|
unsigned long ticks_per_jiffy;
|
||||||
} arm_delay_ops;
|
} arm_delay_ops;
|
||||||
|
|
||||||
#define __delay(n) arm_delay_ops.delay(n)
|
#define __delay(n) arm_delay_ops.delay(n)
|
||||||
|
|
|
@ -19,14 +19,6 @@
|
||||||
#undef _CACHE
|
#undef _CACHE
|
||||||
#undef MULTI_CACHE
|
#undef MULTI_CACHE
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_CACHE_V3)
|
|
||||||
# ifdef _CACHE
|
|
||||||
# define MULTI_CACHE 1
|
|
||||||
# else
|
|
||||||
# define _CACHE v3
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_CACHE_V4)
|
#if defined(CONFIG_CPU_CACHE_V4)
|
||||||
# ifdef _CACHE
|
# ifdef _CACHE
|
||||||
# define MULTI_CACHE 1
|
# define MULTI_CACHE 1
|
||||||
|
|
|
@ -37,7 +37,7 @@ extern int iop3xx_get_init_atu(void);
|
||||||
* IOP3XX processor registers
|
* IOP3XX processor registers
|
||||||
*/
|
*/
|
||||||
#define IOP3XX_PERIPHERAL_PHYS_BASE 0xffffe000
|
#define IOP3XX_PERIPHERAL_PHYS_BASE 0xffffe000
|
||||||
#define IOP3XX_PERIPHERAL_VIRT_BASE 0xfeffe000
|
#define IOP3XX_PERIPHERAL_VIRT_BASE 0xfedfe000
|
||||||
#define IOP3XX_PERIPHERAL_SIZE 0x00002000
|
#define IOP3XX_PERIPHERAL_SIZE 0x00002000
|
||||||
#define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
|
#define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
|
||||||
IOP3XX_PERIPHERAL_SIZE - 1)
|
IOP3XX_PERIPHERAL_SIZE - 1)
|
||||||
|
|
|
@ -41,6 +41,13 @@ extern void kunmap_high(struct page *page);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Needed to be able to broadcast the TLB invalidation for kmap.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_798181
|
||||||
|
#undef ARCH_NEEDS_KMAP_HIGH_GET
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ARCH_NEEDS_KMAP_HIGH_GET
|
#ifdef ARCH_NEEDS_KMAP_HIGH_GET
|
||||||
extern void *kmap_high_get(struct page *page);
|
extern void *kmap_high_get(struct page *page);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -27,6 +27,8 @@ void __check_vmalloc_seq(struct mm_struct *mm);
|
||||||
void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk);
|
void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk);
|
||||||
#define init_new_context(tsk,mm) ({ atomic64_set(&mm->context.id, 0); 0; })
|
#define init_new_context(tsk,mm) ({ atomic64_set(&mm->context.id, 0); 0; })
|
||||||
|
|
||||||
|
DECLARE_PER_CPU(atomic64_t, active_asids);
|
||||||
|
|
||||||
#else /* !CONFIG_CPU_HAS_ASID */
|
#else /* !CONFIG_CPU_HAS_ASID */
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
|
|
|
@ -111,7 +111,7 @@
|
||||||
#define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */
|
#define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */
|
||||||
#define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */
|
#define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */
|
||||||
#define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */
|
#define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */
|
||||||
#define L_PTE_S2_RDWR (_AT(pteval_t, 2) << 6) /* HAP[2:1] */
|
#define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hyp-mode PL2 PTE definitions for LPAE.
|
* Hyp-mode PL2 PTE definitions for LPAE.
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
#include <asm/glue.h>
|
#include <asm/glue.h>
|
||||||
|
|
||||||
#define TLB_V3_PAGE (1 << 0)
|
|
||||||
#define TLB_V4_U_PAGE (1 << 1)
|
#define TLB_V4_U_PAGE (1 << 1)
|
||||||
#define TLB_V4_D_PAGE (1 << 2)
|
#define TLB_V4_D_PAGE (1 << 2)
|
||||||
#define TLB_V4_I_PAGE (1 << 3)
|
#define TLB_V4_I_PAGE (1 << 3)
|
||||||
|
@ -22,7 +21,6 @@
|
||||||
#define TLB_V6_D_PAGE (1 << 5)
|
#define TLB_V6_D_PAGE (1 << 5)
|
||||||
#define TLB_V6_I_PAGE (1 << 6)
|
#define TLB_V6_I_PAGE (1 << 6)
|
||||||
|
|
||||||
#define TLB_V3_FULL (1 << 8)
|
|
||||||
#define TLB_V4_U_FULL (1 << 9)
|
#define TLB_V4_U_FULL (1 << 9)
|
||||||
#define TLB_V4_D_FULL (1 << 10)
|
#define TLB_V4_D_FULL (1 << 10)
|
||||||
#define TLB_V4_I_FULL (1 << 11)
|
#define TLB_V4_I_FULL (1 << 11)
|
||||||
|
@ -52,7 +50,6 @@
|
||||||
* =============
|
* =============
|
||||||
*
|
*
|
||||||
* We have the following to choose from:
|
* We have the following to choose from:
|
||||||
* v3 - ARMv3
|
|
||||||
* v4 - ARMv4 without write buffer
|
* v4 - ARMv4 without write buffer
|
||||||
* v4wb - ARMv4 with write buffer without I TLB flush entry instruction
|
* v4wb - ARMv4 with write buffer without I TLB flush entry instruction
|
||||||
* v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
|
* v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
|
||||||
|
@ -330,7 +327,6 @@ static inline void local_flush_tlb_all(void)
|
||||||
if (tlb_flag(TLB_WB))
|
if (tlb_flag(TLB_WB))
|
||||||
dsb();
|
dsb();
|
||||||
|
|
||||||
tlb_op(TLB_V3_FULL, "c6, c0, 0", zero);
|
|
||||||
tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero);
|
tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero);
|
||||||
tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero);
|
tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero);
|
||||||
tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero);
|
tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero);
|
||||||
|
@ -351,9 +347,8 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)
|
||||||
if (tlb_flag(TLB_WB))
|
if (tlb_flag(TLB_WB))
|
||||||
dsb();
|
dsb();
|
||||||
|
|
||||||
if (possible_tlb_flags & (TLB_V3_FULL|TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) {
|
if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) {
|
||||||
if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) {
|
if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) {
|
||||||
tlb_op(TLB_V3_FULL, "c6, c0, 0", zero);
|
|
||||||
tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero);
|
tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero);
|
||||||
tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero);
|
tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero);
|
||||||
tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero);
|
tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero);
|
||||||
|
@ -385,9 +380,8 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
|
||||||
if (tlb_flag(TLB_WB))
|
if (tlb_flag(TLB_WB))
|
||||||
dsb();
|
dsb();
|
||||||
|
|
||||||
if (possible_tlb_flags & (TLB_V3_PAGE|TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) &&
|
if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) &&
|
||||||
cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
|
cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
|
||||||
tlb_op(TLB_V3_PAGE, "c6, c0, 0", uaddr);
|
|
||||||
tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr);
|
tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr);
|
||||||
tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", uaddr);
|
tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", uaddr);
|
||||||
tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", uaddr);
|
tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", uaddr);
|
||||||
|
@ -418,7 +412,6 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
|
||||||
if (tlb_flag(TLB_WB))
|
if (tlb_flag(TLB_WB))
|
||||||
dsb();
|
dsb();
|
||||||
|
|
||||||
tlb_op(TLB_V3_PAGE, "c6, c0, 0", kaddr);
|
|
||||||
tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr);
|
tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr);
|
||||||
tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr);
|
tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr);
|
||||||
tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr);
|
tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr);
|
||||||
|
@ -450,6 +443,21 @@ static inline void local_flush_bp_all(void)
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_798181
|
||||||
|
static inline void dummy_flush_tlb_a15_erratum(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0.
|
||||||
|
*/
|
||||||
|
asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0));
|
||||||
|
dsb();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void dummy_flush_tlb_a15_erratum(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* flush_pmd_entry
|
* flush_pmd_entry
|
||||||
*
|
*
|
||||||
|
|
|
@ -276,7 +276,13 @@ ENDPROC(ftrace_graph_caller_old)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.macro mcount_enter
|
.macro mcount_enter
|
||||||
|
/*
|
||||||
|
* This pad compensates for the push {lr} at the call site. Note that we are
|
||||||
|
* unable to unwind through a function which does not otherwise save its lr.
|
||||||
|
*/
|
||||||
|
UNWIND(.pad #4)
|
||||||
stmdb sp!, {r0-r3, lr}
|
stmdb sp!, {r0-r3, lr}
|
||||||
|
UNWIND(.save {r0-r3, lr})
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro mcount_get_lr reg
|
.macro mcount_get_lr reg
|
||||||
|
@ -289,6 +295,7 @@ ENDPROC(ftrace_graph_caller_old)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
ENTRY(__gnu_mcount_nc)
|
ENTRY(__gnu_mcount_nc)
|
||||||
|
UNWIND(.fnstart)
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
mov ip, lr
|
mov ip, lr
|
||||||
ldmia sp!, {lr}
|
ldmia sp!, {lr}
|
||||||
|
@ -296,17 +303,22 @@ ENTRY(__gnu_mcount_nc)
|
||||||
#else
|
#else
|
||||||
__mcount
|
__mcount
|
||||||
#endif
|
#endif
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(__gnu_mcount_nc)
|
ENDPROC(__gnu_mcount_nc)
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
ENTRY(ftrace_caller)
|
ENTRY(ftrace_caller)
|
||||||
|
UNWIND(.fnstart)
|
||||||
__ftrace_caller
|
__ftrace_caller
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(ftrace_caller)
|
ENDPROC(ftrace_caller)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
ENTRY(ftrace_graph_caller)
|
ENTRY(ftrace_graph_caller)
|
||||||
|
UNWIND(.fnstart)
|
||||||
__ftrace_graph_caller
|
__ftrace_graph_caller
|
||||||
|
UNWIND(.fnend)
|
||||||
ENDPROC(ftrace_graph_caller)
|
ENDPROC(ftrace_graph_caller)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -267,7 +267,7 @@ __create_page_tables:
|
||||||
addne r6, r6, #1 << SECTION_SHIFT
|
addne r6, r6, #1 << SECTION_SHIFT
|
||||||
strne r6, [r3]
|
strne r6, [r3]
|
||||||
|
|
||||||
#if defined(CONFIG_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8)
|
#if defined(CONFIG_ARM_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8)
|
||||||
sub r4, r4, #4 @ Fixup page table pointer
|
sub r4, r4, #4 @ Fixup page table pointer
|
||||||
@ for 64-bit descriptors
|
@ for 64-bit descriptors
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -966,7 +966,7 @@ static void reset_ctrl_regs(void *unused)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_warning("CPU %d debug is powered down!\n", cpu);
|
pr_warn_once("CPU %d debug is powered down!\n", cpu);
|
||||||
cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
|
cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -987,7 +987,7 @@ clear_vcr:
|
||||||
isb();
|
isb();
|
||||||
|
|
||||||
if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
|
if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
|
||||||
pr_warning("CPU %d failed to disable vector catch\n", cpu);
|
pr_warn_once("CPU %d failed to disable vector catch\n", cpu);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1007,7 +1007,7 @@ clear_vcr:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
|
if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
|
||||||
pr_warning("CPU %d failed to clear debug register pairs\n", cpu);
|
pr_warn_once("CPU %d failed to clear debug register pairs\n", cpu);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1043,7 +1043,7 @@ static int dbg_cpu_pm_notify(struct notifier_block *self, unsigned long action,
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct notifier_block __cpuinitdata dbg_cpu_pm_nb = {
|
static struct notifier_block dbg_cpu_pm_nb = {
|
||||||
.notifier_call = dbg_cpu_pm_notify,
|
.notifier_call = dbg_cpu_pm_notify,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,10 @@ validate_event(struct pmu_hw_events *hw_events,
|
||||||
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
||||||
struct pmu *leader_pmu = event->group_leader->pmu;
|
struct pmu *leader_pmu = event->group_leader->pmu;
|
||||||
|
|
||||||
if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF)
|
if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return armpmu->get_event_idx(hw_events, event) >= 0;
|
return armpmu->get_event_idx(hw_events, event) >= 0;
|
||||||
|
|
|
@ -45,12 +45,12 @@ static u32 notrace jiffy_sched_clock_read(void)
|
||||||
|
|
||||||
static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read;
|
static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read;
|
||||||
|
|
||||||
static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift)
|
static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift)
|
||||||
{
|
{
|
||||||
return (cyc * mult) >> shift;
|
return (cyc * mult) >> shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long long cyc_to_sched_clock(u32 cyc, u32 mask)
|
static unsigned long long notrace cyc_to_sched_clock(u32 cyc, u32 mask)
|
||||||
{
|
{
|
||||||
u64 epoch_ns;
|
u64 epoch_ns;
|
||||||
u32 epoch_cyc;
|
u32 epoch_cyc;
|
||||||
|
|
|
@ -56,7 +56,6 @@
|
||||||
#include <asm/virt.h>
|
#include <asm/virt.h>
|
||||||
|
|
||||||
#include "atags.h"
|
#include "atags.h"
|
||||||
#include "tcm.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
|
#if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
|
||||||
|
@ -353,6 +352,23 @@ void __init early_print(const char *str, ...)
|
||||||
printk("%s", buf);
|
printk("%s", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init cpuid_init_hwcaps(void)
|
||||||
|
{
|
||||||
|
unsigned int divide_instrs;
|
||||||
|
|
||||||
|
if (cpu_architecture() < CPU_ARCH_ARMv7)
|
||||||
|
return;
|
||||||
|
|
||||||
|
divide_instrs = (read_cpuid_ext(CPUID_EXT_ISAR0) & 0x0f000000) >> 24;
|
||||||
|
|
||||||
|
switch (divide_instrs) {
|
||||||
|
case 2:
|
||||||
|
elf_hwcap |= HWCAP_IDIVA;
|
||||||
|
case 1:
|
||||||
|
elf_hwcap |= HWCAP_IDIVT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void __init feat_v6_fixup(void)
|
static void __init feat_v6_fixup(void)
|
||||||
{
|
{
|
||||||
int id = read_cpuid_id();
|
int id = read_cpuid_id();
|
||||||
|
@ -483,8 +499,11 @@ static void __init setup_processor(void)
|
||||||
snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
|
snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
|
||||||
list->elf_name, ENDIANNESS);
|
list->elf_name, ENDIANNESS);
|
||||||
elf_hwcap = list->elf_hwcap;
|
elf_hwcap = list->elf_hwcap;
|
||||||
|
|
||||||
|
cpuid_init_hwcaps();
|
||||||
|
|
||||||
#ifndef CONFIG_ARM_THUMB
|
#ifndef CONFIG_ARM_THUMB
|
||||||
elf_hwcap &= ~HWCAP_THUMB;
|
elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
feat_v6_fixup();
|
feat_v6_fixup();
|
||||||
|
@ -524,7 +543,7 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size)
|
||||||
size -= start & ~PAGE_MASK;
|
size -= start & ~PAGE_MASK;
|
||||||
bank->start = PAGE_ALIGN(start);
|
bank->start = PAGE_ALIGN(start);
|
||||||
|
|
||||||
#ifndef CONFIG_LPAE
|
#ifndef CONFIG_ARM_LPAE
|
||||||
if (bank->start + size < bank->start) {
|
if (bank->start + size < bank->start) {
|
||||||
printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
|
printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
|
||||||
"32-bit physical address space\n", (long long)start);
|
"32-bit physical address space\n", (long long)start);
|
||||||
|
@ -778,8 +797,6 @@ void __init setup_arch(char **cmdline_p)
|
||||||
|
|
||||||
reserve_crashkernel();
|
reserve_crashkernel();
|
||||||
|
|
||||||
tcm_init();
|
|
||||||
|
|
||||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
||||||
handle_arch_irq = mdesc->handle_irq;
|
handle_arch_irq = mdesc->handle_irq;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -673,9 +673,6 @@ static int cpufreq_callback(struct notifier_block *nb,
|
||||||
if (freq->flags & CPUFREQ_CONST_LOOPS)
|
if (freq->flags & CPUFREQ_CONST_LOOPS)
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
|
||||||
if (arm_delay_ops.const_clock)
|
|
||||||
return NOTIFY_OK;
|
|
||||||
|
|
||||||
if (!per_cpu(l_p_j_ref, cpu)) {
|
if (!per_cpu(l_p_j_ref, cpu)) {
|
||||||
per_cpu(l_p_j_ref, cpu) =
|
per_cpu(l_p_j_ref, cpu) =
|
||||||
per_cpu(cpu_data, cpu).loops_per_jiffy;
|
per_cpu(cpu_data, cpu).loops_per_jiffy;
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include <asm/smp_plat.h>
|
#include <asm/smp_plat.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
#include <asm/mmu_context.h>
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
|
@ -69,12 +70,72 @@ static inline void ipi_flush_bp_all(void *ignored)
|
||||||
local_flush_bp_all();
|
local_flush_bp_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_798181
|
||||||
|
static int erratum_a15_798181(void)
|
||||||
|
{
|
||||||
|
unsigned int midr = read_cpuid_id();
|
||||||
|
|
||||||
|
/* Cortex-A15 r0p0..r3p2 affected */
|
||||||
|
if ((midr & 0xff0ffff0) != 0x410fc0f0 || midr > 0x413fc0f2)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static int erratum_a15_798181(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void ipi_flush_tlb_a15_erratum(void *arg)
|
||||||
|
{
|
||||||
|
dmb();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void broadcast_tlb_a15_erratum(void)
|
||||||
|
{
|
||||||
|
if (!erratum_a15_798181())
|
||||||
|
return;
|
||||||
|
|
||||||
|
dummy_flush_tlb_a15_erratum();
|
||||||
|
smp_call_function_many(cpu_online_mask, ipi_flush_tlb_a15_erratum,
|
||||||
|
NULL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void broadcast_tlb_mm_a15_erratum(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
cpumask_t mask = { CPU_BITS_NONE };
|
||||||
|
|
||||||
|
if (!erratum_a15_798181())
|
||||||
|
return;
|
||||||
|
|
||||||
|
dummy_flush_tlb_a15_erratum();
|
||||||
|
for_each_online_cpu(cpu) {
|
||||||
|
if (cpu == smp_processor_id())
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
* We only need to send an IPI if the other CPUs are running
|
||||||
|
* the same ASID as the one being invalidated. There is no
|
||||||
|
* need for locking around the active_asids check since the
|
||||||
|
* switch_mm() function has at least one dmb() (as required by
|
||||||
|
* this workaround) in case a context switch happens on
|
||||||
|
* another CPU after the condition below.
|
||||||
|
*/
|
||||||
|
if (atomic64_read(&mm->context.id) ==
|
||||||
|
atomic64_read(&per_cpu(active_asids, cpu)))
|
||||||
|
cpumask_set_cpu(cpu, &mask);
|
||||||
|
}
|
||||||
|
smp_call_function_many(&mask, ipi_flush_tlb_a15_erratum, NULL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
void flush_tlb_all(void)
|
void flush_tlb_all(void)
|
||||||
{
|
{
|
||||||
if (tlb_ops_need_broadcast())
|
if (tlb_ops_need_broadcast())
|
||||||
on_each_cpu(ipi_flush_tlb_all, NULL, 1);
|
on_each_cpu(ipi_flush_tlb_all, NULL, 1);
|
||||||
else
|
else
|
||||||
local_flush_tlb_all();
|
local_flush_tlb_all();
|
||||||
|
broadcast_tlb_a15_erratum();
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_tlb_mm(struct mm_struct *mm)
|
void flush_tlb_mm(struct mm_struct *mm)
|
||||||
|
@ -83,6 +144,7 @@ void flush_tlb_mm(struct mm_struct *mm)
|
||||||
on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
|
on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
|
||||||
else
|
else
|
||||||
local_flush_tlb_mm(mm);
|
local_flush_tlb_mm(mm);
|
||||||
|
broadcast_tlb_mm_a15_erratum(mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
|
void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
|
||||||
|
@ -95,6 +157,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
|
||||||
&ta, 1);
|
&ta, 1);
|
||||||
} else
|
} else
|
||||||
local_flush_tlb_page(vma, uaddr);
|
local_flush_tlb_page(vma, uaddr);
|
||||||
|
broadcast_tlb_mm_a15_erratum(vma->vm_mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_tlb_kernel_page(unsigned long kaddr)
|
void flush_tlb_kernel_page(unsigned long kaddr)
|
||||||
|
@ -105,6 +168,7 @@ void flush_tlb_kernel_page(unsigned long kaddr)
|
||||||
on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1);
|
on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1);
|
||||||
} else
|
} else
|
||||||
local_flush_tlb_kernel_page(kaddr);
|
local_flush_tlb_kernel_page(kaddr);
|
||||||
|
broadcast_tlb_a15_erratum();
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_tlb_range(struct vm_area_struct *vma,
|
void flush_tlb_range(struct vm_area_struct *vma,
|
||||||
|
@ -119,6 +183,7 @@ void flush_tlb_range(struct vm_area_struct *vma,
|
||||||
&ta, 1);
|
&ta, 1);
|
||||||
} else
|
} else
|
||||||
local_flush_tlb_range(vma, start, end);
|
local_flush_tlb_range(vma, start, end);
|
||||||
|
broadcast_tlb_mm_a15_erratum(vma->vm_mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
void flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||||
|
@ -130,6 +195,7 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||||
on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
|
on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
|
||||||
} else
|
} else
|
||||||
local_flush_tlb_kernel_range(start, end);
|
local_flush_tlb_kernel_range(start, end);
|
||||||
|
broadcast_tlb_a15_erratum();
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_bp_all(void)
|
void flush_bp_all(void)
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/system_info.h>
|
#include <asm/system_info.h>
|
||||||
#include "tcm.h"
|
|
||||||
|
|
||||||
static struct gen_pool *tcm_pool;
|
static struct gen_pool *tcm_pool;
|
||||||
static bool dtcm_present;
|
static bool dtcm_present;
|
||||||
|
|
|
@ -201,6 +201,7 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||||
break;
|
break;
|
||||||
case KVM_CAP_ARM_SET_DEVICE_ADDR:
|
case KVM_CAP_ARM_SET_DEVICE_ADDR:
|
||||||
r = 1;
|
r = 1;
|
||||||
|
break;
|
||||||
case KVM_CAP_NR_VCPUS:
|
case KVM_CAP_NR_VCPUS:
|
||||||
r = num_online_cpus();
|
r = num_online_cpus();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -79,11 +79,11 @@ static bool access_dcsw(struct kvm_vcpu *vcpu,
|
||||||
u32 val;
|
u32 val;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
cpu = get_cpu();
|
|
||||||
|
|
||||||
if (!p->is_write)
|
if (!p->is_write)
|
||||||
return read_from_write_only(vcpu, p);
|
return read_from_write_only(vcpu, p);
|
||||||
|
|
||||||
|
cpu = get_cpu();
|
||||||
|
|
||||||
cpumask_setall(&vcpu->arch.require_dcache_flush);
|
cpumask_setall(&vcpu->arch.require_dcache_flush);
|
||||||
cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush);
|
cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush);
|
||||||
|
|
||||||
|
|
|
@ -883,8 +883,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
|
||||||
lr, irq, vgic_cpu->vgic_lr[lr]);
|
lr, irq, vgic_cpu->vgic_lr[lr]);
|
||||||
BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
|
BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
|
||||||
vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
|
vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
|
||||||
|
return true;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to use another LR for this interrupt */
|
/* Try to use another LR for this interrupt */
|
||||||
|
@ -898,7 +897,6 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
|
||||||
vgic_cpu->vgic_irq_lr_map[irq] = lr;
|
vgic_cpu->vgic_irq_lr_map[irq] = lr;
|
||||||
set_bit(lr, vgic_cpu->lr_used);
|
set_bit(lr, vgic_cpu->lr_used);
|
||||||
|
|
||||||
out:
|
|
||||||
if (!vgic_irq_is_edge(vcpu, irq))
|
if (!vgic_irq_is_edge(vcpu, irq))
|
||||||
vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
|
vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
|
||||||
|
|
||||||
|
@ -1018,21 +1016,6 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
|
kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
|
||||||
|
|
||||||
/*
|
|
||||||
* We do not need to take the distributor lock here, since the only
|
|
||||||
* action we perform is clearing the irq_active_bit for an EOIed
|
|
||||||
* level interrupt. There is a potential race with
|
|
||||||
* the queuing of an interrupt in __kvm_vgic_flush_hwstate(), where we
|
|
||||||
* check if the interrupt is already active. Two possibilities:
|
|
||||||
*
|
|
||||||
* - The queuing is occurring on the same vcpu: cannot happen,
|
|
||||||
* as we're already in the context of this vcpu, and
|
|
||||||
* executing the handler
|
|
||||||
* - The interrupt has been migrated to another vcpu, and we
|
|
||||||
* ignore this interrupt for this run. Big deal. It is still
|
|
||||||
* pending though, and will get considered when this vcpu
|
|
||||||
* exits.
|
|
||||||
*/
|
|
||||||
if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
|
if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
|
||||||
/*
|
/*
|
||||||
* Some level interrupts have been EOIed. Clear their
|
* Some level interrupts have been EOIed. Clear their
|
||||||
|
@ -1054,6 +1037,13 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
|
||||||
} else {
|
} else {
|
||||||
vgic_cpu_irq_clear(vcpu, irq);
|
vgic_cpu_irq_clear(vcpu, irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Despite being EOIed, the LR may not have
|
||||||
|
* been marked as empty.
|
||||||
|
*/
|
||||||
|
set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr);
|
||||||
|
vgic_cpu->vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,9 +1054,8 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sync back the VGIC state after a guest run. We do not really touch
|
* Sync back the VGIC state after a guest run. The distributor lock is
|
||||||
* the distributor here (the irq_pending_on_cpu bit is safe to set),
|
* needed so we don't get preempted in the middle of the state processing.
|
||||||
* so there is no need for taking its lock.
|
|
||||||
*/
|
*/
|
||||||
static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
|
static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
@ -1112,10 +1101,14 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
|
void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
|
||||||
|
|
||||||
if (!irqchip_in_kernel(vcpu->kvm))
|
if (!irqchip_in_kernel(vcpu->kvm))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
spin_lock(&dist->lock);
|
||||||
__kvm_vgic_sync_hwstate(vcpu);
|
__kvm_vgic_sync_hwstate(vcpu);
|
||||||
|
spin_unlock(&dist->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)
|
int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void __timer_delay(unsigned long cycles)
|
||||||
static void __timer_const_udelay(unsigned long xloops)
|
static void __timer_const_udelay(unsigned long xloops)
|
||||||
{
|
{
|
||||||
unsigned long long loops = xloops;
|
unsigned long long loops = xloops;
|
||||||
loops *= loops_per_jiffy;
|
loops *= arm_delay_ops.ticks_per_jiffy;
|
||||||
__timer_delay(loops >> UDELAY_SHIFT);
|
__timer_delay(loops >> UDELAY_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,11 +73,13 @@ void __init register_current_timer_delay(const struct delay_timer *timer)
|
||||||
pr_info("Switching to timer-based delay loop\n");
|
pr_info("Switching to timer-based delay loop\n");
|
||||||
delay_timer = timer;
|
delay_timer = timer;
|
||||||
lpj_fine = timer->freq / HZ;
|
lpj_fine = timer->freq / HZ;
|
||||||
loops_per_jiffy = lpj_fine;
|
|
||||||
|
/* cpufreq may scale loops_per_jiffy, so keep a private copy */
|
||||||
|
arm_delay_ops.ticks_per_jiffy = lpj_fine;
|
||||||
arm_delay_ops.delay = __timer_delay;
|
arm_delay_ops.delay = __timer_delay;
|
||||||
arm_delay_ops.const_udelay = __timer_const_udelay;
|
arm_delay_ops.const_udelay = __timer_const_udelay;
|
||||||
arm_delay_ops.udelay = __timer_udelay;
|
arm_delay_ops.udelay = __timer_udelay;
|
||||||
arm_delay_ops.const_clock = true;
|
|
||||||
delay_calibrated = true;
|
delay_calibrated = true;
|
||||||
} else {
|
} else {
|
||||||
pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");
|
pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");
|
||||||
|
|
|
@ -22,19 +22,9 @@
|
||||||
|
|
||||||
static struct map_desc cns3xxx_io_desc[] __initdata = {
|
static struct map_desc cns3xxx_io_desc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = CNS3XXX_TC11MP_TWD_BASE_VIRT,
|
.virtual = CNS3XXX_TC11MP_SCU_BASE_VIRT,
|
||||||
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_TWD_BASE),
|
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_SCU_BASE),
|
||||||
.length = SZ_4K,
|
.length = SZ_8K,
|
||||||
.type = MT_DEVICE,
|
|
||||||
}, {
|
|
||||||
.virtual = CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT,
|
|
||||||
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_GIC_CPU_BASE),
|
|
||||||
.length = SZ_4K,
|
|
||||||
.type = MT_DEVICE,
|
|
||||||
}, {
|
|
||||||
.virtual = CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT,
|
|
||||||
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_GIC_DIST_BASE),
|
|
||||||
.length = SZ_4K,
|
|
||||||
.type = MT_DEVICE,
|
.type = MT_DEVICE,
|
||||||
}, {
|
}, {
|
||||||
.virtual = CNS3XXX_TIMER1_2_3_BASE_VIRT,
|
.virtual = CNS3XXX_TIMER1_2_3_BASE_VIRT,
|
||||||
|
|
|
@ -94,10 +94,10 @@
|
||||||
#define RTC_INTR_STS_OFFSET 0x34
|
#define RTC_INTR_STS_OFFSET 0x34
|
||||||
|
|
||||||
#define CNS3XXX_MISC_BASE 0x76000000 /* Misc Control */
|
#define CNS3XXX_MISC_BASE 0x76000000 /* Misc Control */
|
||||||
#define CNS3XXX_MISC_BASE_VIRT 0xFFF07000 /* Misc Control */
|
#define CNS3XXX_MISC_BASE_VIRT 0xFB000000 /* Misc Control */
|
||||||
|
|
||||||
#define CNS3XXX_PM_BASE 0x77000000 /* Power Management Control */
|
#define CNS3XXX_PM_BASE 0x77000000 /* Power Management Control */
|
||||||
#define CNS3XXX_PM_BASE_VIRT 0xFFF08000
|
#define CNS3XXX_PM_BASE_VIRT 0xFB001000
|
||||||
|
|
||||||
#define PM_CLK_GATE_OFFSET 0x00
|
#define PM_CLK_GATE_OFFSET 0x00
|
||||||
#define PM_SOFT_RST_OFFSET 0x04
|
#define PM_SOFT_RST_OFFSET 0x04
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
#define PM_PLL_HM_PD_OFFSET 0x1C
|
#define PM_PLL_HM_PD_OFFSET 0x1C
|
||||||
|
|
||||||
#define CNS3XXX_UART0_BASE 0x78000000 /* UART 0 */
|
#define CNS3XXX_UART0_BASE 0x78000000 /* UART 0 */
|
||||||
#define CNS3XXX_UART0_BASE_VIRT 0xFFF09000
|
#define CNS3XXX_UART0_BASE_VIRT 0xFB002000
|
||||||
|
|
||||||
#define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */
|
#define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */
|
||||||
#define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000
|
#define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
#define CNS3XXX_I2S_BASE_VIRT 0xFFF10000
|
#define CNS3XXX_I2S_BASE_VIRT 0xFFF10000
|
||||||
|
|
||||||
#define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */
|
#define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */
|
||||||
#define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFFF10800
|
#define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFB003000
|
||||||
|
|
||||||
#define TIMER1_COUNTER_OFFSET 0x00
|
#define TIMER1_COUNTER_OFFSET 0x00
|
||||||
#define TIMER1_AUTO_RELOAD_OFFSET 0x04
|
#define TIMER1_AUTO_RELOAD_OFFSET 0x04
|
||||||
|
@ -227,16 +227,16 @@
|
||||||
* Testchip peripheral and fpga gic regions
|
* Testchip peripheral and fpga gic regions
|
||||||
*/
|
*/
|
||||||
#define CNS3XXX_TC11MP_SCU_BASE 0x90000000 /* IRQ, Test chip */
|
#define CNS3XXX_TC11MP_SCU_BASE 0x90000000 /* IRQ, Test chip */
|
||||||
#define CNS3XXX_TC11MP_SCU_BASE_VIRT 0xFF000000
|
#define CNS3XXX_TC11MP_SCU_BASE_VIRT 0xFB004000
|
||||||
|
|
||||||
#define CNS3XXX_TC11MP_GIC_CPU_BASE 0x90000100 /* Test chip interrupt controller CPU interface */
|
#define CNS3XXX_TC11MP_GIC_CPU_BASE 0x90000100 /* Test chip interrupt controller CPU interface */
|
||||||
#define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT 0xFF000100
|
#define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x100)
|
||||||
|
|
||||||
#define CNS3XXX_TC11MP_TWD_BASE 0x90000600
|
#define CNS3XXX_TC11MP_TWD_BASE 0x90000600
|
||||||
#define CNS3XXX_TC11MP_TWD_BASE_VIRT 0xFF000600
|
#define CNS3XXX_TC11MP_TWD_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x600)
|
||||||
|
|
||||||
#define CNS3XXX_TC11MP_GIC_DIST_BASE 0x90001000 /* Test chip interrupt controller distributor */
|
#define CNS3XXX_TC11MP_GIC_DIST_BASE 0x90001000 /* Test chip interrupt controller distributor */
|
||||||
#define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT 0xFF001000
|
#define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000)
|
||||||
|
|
||||||
#define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */
|
#define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */
|
||||||
#define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000
|
#define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000
|
||||||
|
|
|
@ -47,9 +47,13 @@ static void __raw_writel(unsigned int value, unsigned int ptr)
|
||||||
|
|
||||||
static inline void putc(int c)
|
static inline void putc(int c)
|
||||||
{
|
{
|
||||||
/* Transmit fifo not full? */
|
int i;
|
||||||
while (__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF)
|
|
||||||
;
|
for (i = 0; i < 10000; i++) {
|
||||||
|
/* Transmit fifo not full? */
|
||||||
|
if (!(__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
__raw_writeb(c, PHYS_UART_DATA);
|
__raw_writeb(c, PHYS_UART_DATA);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,13 +28,11 @@ extern void secondary_startup(void);
|
||||||
*/
|
*/
|
||||||
void __ref highbank_cpu_die(unsigned int cpu)
|
void __ref highbank_cpu_die(unsigned int cpu)
|
||||||
{
|
{
|
||||||
flush_cache_all();
|
|
||||||
|
|
||||||
highbank_set_cpu_jump(cpu, phys_to_virt(0));
|
highbank_set_cpu_jump(cpu, phys_to_virt(0));
|
||||||
|
|
||||||
|
flush_cache_louis();
|
||||||
highbank_set_core_pwr();
|
highbank_set_core_pwr();
|
||||||
|
|
||||||
cpu_do_idle();
|
while (1)
|
||||||
|
cpu_do_idle();
|
||||||
/* We should never return from idle */
|
|
||||||
panic("highbank: cpu %d unexpectedly exit from shutdown\n", cpu);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,6 +257,7 @@ int __init mx35_clocks_init(void)
|
||||||
clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
|
clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
|
||||||
clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0");
|
clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0");
|
||||||
clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");
|
clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");
|
||||||
|
clk_register_clkdev(clk[admux_gate], "audmux", NULL);
|
||||||
|
|
||||||
clk_prepare_enable(clk[spba_gate]);
|
clk_prepare_enable(clk[spba_gate]);
|
||||||
clk_prepare_enable(clk[gpio1_gate]);
|
clk_prepare_enable(clk[gpio1_gate]);
|
||||||
|
@ -265,6 +266,7 @@ int __init mx35_clocks_init(void)
|
||||||
clk_prepare_enable(clk[iim_gate]);
|
clk_prepare_enable(clk[iim_gate]);
|
||||||
clk_prepare_enable(clk[emi_gate]);
|
clk_prepare_enable(clk[emi_gate]);
|
||||||
clk_prepare_enable(clk[max_gate]);
|
clk_prepare_enable(clk[max_gate]);
|
||||||
|
clk_prepare_enable(clk[iomuxc_gate]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SCC is needed to boot via mmc after a watchdog reset. The clock code
|
* SCC is needed to boot via mmc after a watchdog reset. The clock code
|
||||||
|
|
|
@ -115,7 +115,7 @@ static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m"
|
||||||
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
||||||
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };
|
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };
|
||||||
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
||||||
static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_pfd1_540m", };
|
static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
||||||
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
||||||
static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
||||||
static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
||||||
|
@ -443,7 +443,6 @@ int __init mx6q_clocks_init(void)
|
||||||
|
|
||||||
clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");
|
clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");
|
||||||
clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
|
clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
|
||||||
clk_register_clkdev(clk[twd], NULL, "smp_twd");
|
|
||||||
clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL);
|
clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL);
|
||||||
clk_register_clkdev(clk[ahb], "ahb", NULL);
|
clk_register_clkdev(clk[ahb], "ahb", NULL);
|
||||||
clk_register_clkdev(clk[cko1], "cko1", NULL);
|
clk_register_clkdev(clk[cko1], "cko1", NULL);
|
||||||
|
|
|
@ -110,6 +110,8 @@ void tzic_handle_irq(struct pt_regs *);
|
||||||
|
|
||||||
extern void imx_enable_cpu(int cpu, bool enable);
|
extern void imx_enable_cpu(int cpu, bool enable);
|
||||||
extern void imx_set_cpu_jump(int cpu, void *jump_addr);
|
extern void imx_set_cpu_jump(int cpu, void *jump_addr);
|
||||||
|
extern u32 imx_get_cpu_arg(int cpu);
|
||||||
|
extern void imx_set_cpu_arg(int cpu, u32 arg);
|
||||||
extern void v7_cpu_resume(void);
|
extern void v7_cpu_resume(void);
|
||||||
extern u32 *pl310_get_save_ptr(void);
|
extern u32 *pl310_get_save_ptr(void);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
|
@ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void)
|
||||||
void imx_cpu_die(unsigned int cpu)
|
void imx_cpu_die(unsigned int cpu)
|
||||||
{
|
{
|
||||||
cpu_enter_lowpower();
|
cpu_enter_lowpower();
|
||||||
|
/*
|
||||||
|
* We use the cpu jumping argument register to sync with
|
||||||
|
* imx_cpu_kill() which is running on cpu0 and waiting for
|
||||||
|
* the register being cleared to kill the cpu.
|
||||||
|
*/
|
||||||
|
imx_set_cpu_arg(cpu, ~0);
|
||||||
cpu_do_idle();
|
cpu_do_idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
int imx_cpu_kill(unsigned int cpu)
|
int imx_cpu_kill(unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
unsigned long timeout = jiffies + msecs_to_jiffies(50);
|
||||||
|
|
||||||
|
while (imx_get_cpu_arg(cpu) == 0)
|
||||||
|
if (time_after(jiffies, timeout))
|
||||||
|
return 0;
|
||||||
imx_enable_cpu(cpu, false);
|
imx_enable_cpu(cpu, false);
|
||||||
|
imx_set_cpu_arg(cpu, 0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,18 @@ void imx_set_cpu_jump(int cpu, void *jump_addr)
|
||||||
src_base + SRC_GPR1 + cpu * 8);
|
src_base + SRC_GPR1 + cpu * 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 imx_get_cpu_arg(int cpu)
|
||||||
|
{
|
||||||
|
cpu = cpu_logical_map(cpu);
|
||||||
|
return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void imx_set_cpu_arg(int cpu, u32 arg)
|
||||||
|
{
|
||||||
|
cpu = cpu_logical_map(cpu);
|
||||||
|
writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4);
|
||||||
|
}
|
||||||
|
|
||||||
void imx_src_prepare_restart(void)
|
void imx_src_prepare_restart(void)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
|
@ -20,10 +20,15 @@ static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = {
|
||||||
.duplex = DUPLEX_FULL,
|
.duplex = DUPLEX_FULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct mv643xx_eth_platform_data iomega_ix2_200_ge01_data = {
|
||||||
|
.phy_addr = MV643XX_ETH_PHY_ADDR(11),
|
||||||
|
};
|
||||||
|
|
||||||
void __init iomega_ix2_200_init(void)
|
void __init iomega_ix2_200_init(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Basic setup. Needs to be called early.
|
* Basic setup. Needs to be called early.
|
||||||
*/
|
*/
|
||||||
kirkwood_ge01_init(&iomega_ix2_200_ge00_data);
|
kirkwood_ge00_init(&iomega_ix2_200_ge00_data);
|
||||||
|
kirkwood_ge01_init(&iomega_ix2_200_ge01_data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,8 @@ static struct mv_sata_platform_data guruplug_sata_data = {
|
||||||
|
|
||||||
static struct mvsdio_platform_data guruplug_mvsdio_data = {
|
static struct mvsdio_platform_data guruplug_mvsdio_data = {
|
||||||
/* unfortunately the CD signal has not been connected */
|
/* unfortunately the CD signal has not been connected */
|
||||||
|
.gpio_card_detect = -1,
|
||||||
|
.gpio_write_protect = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gpio_led guruplug_led_pins[] = {
|
static struct gpio_led guruplug_led_pins[] = {
|
||||||
|
|
|
@ -55,6 +55,7 @@ static struct mv_sata_platform_data openrd_sata_data = {
|
||||||
|
|
||||||
static struct mvsdio_platform_data openrd_mvsdio_data = {
|
static struct mvsdio_platform_data openrd_mvsdio_data = {
|
||||||
.gpio_card_detect = 29, /* MPP29 used as SD card detect */
|
.gpio_card_detect = 29, /* MPP29 used as SD card detect */
|
||||||
|
.gpio_write_protect = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int openrd_mpp_config[] __initdata = {
|
static unsigned int openrd_mpp_config[] __initdata = {
|
||||||
|
|
|
@ -69,6 +69,7 @@ static struct mv_sata_platform_data rd88f6281_sata_data = {
|
||||||
|
|
||||||
static struct mvsdio_platform_data rd88f6281_mvsdio_data = {
|
static struct mvsdio_platform_data rd88f6281_mvsdio_data = {
|
||||||
.gpio_card_detect = 28,
|
.gpio_card_detect = 28,
|
||||||
|
.gpio_write_protect = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int rd88f6281_mpp_config[] __initdata = {
|
static unsigned int rd88f6281_mpp_config[] __initdata = {
|
||||||
|
|
|
@ -62,7 +62,10 @@ static int msm_timer_set_next_event(unsigned long cycles,
|
||||||
{
|
{
|
||||||
u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
|
u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
|
||||||
|
|
||||||
writel_relaxed(0, event_base + TIMER_CLEAR);
|
ctrl &= ~TIMER_ENABLE_EN;
|
||||||
|
writel_relaxed(ctrl, event_base + TIMER_ENABLE);
|
||||||
|
|
||||||
|
writel_relaxed(ctrl, event_base + TIMER_CLEAR);
|
||||||
writel_relaxed(cycles, event_base + TIMER_MATCH_VAL);
|
writel_relaxed(cycles, event_base + TIMER_MATCH_VAL);
|
||||||
writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE);
|
writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
|
|
||||||
#define ARMADA_370_XP_MAX_PER_CPU_IRQS (28)
|
#define ARMADA_370_XP_MAX_PER_CPU_IRQS (28)
|
||||||
|
|
||||||
|
#define ARMADA_370_XP_TIMER0_PER_CPU_IRQ (5)
|
||||||
|
|
||||||
#define ACTIVE_DOORBELLS (8)
|
#define ACTIVE_DOORBELLS (8)
|
||||||
|
|
||||||
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
|
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
|
||||||
|
@ -59,36 +61,26 @@ static struct irq_domain *armada_370_xp_mpic_domain;
|
||||||
*/
|
*/
|
||||||
static void armada_370_xp_irq_mask(struct irq_data *d)
|
static void armada_370_xp_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS)
|
if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
|
||||||
writel(hwirq, main_int_base +
|
writel(hwirq, main_int_base +
|
||||||
ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS);
|
ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS);
|
||||||
else
|
else
|
||||||
writel(hwirq, per_cpu_int_base +
|
writel(hwirq, per_cpu_int_base +
|
||||||
ARMADA_370_XP_INT_SET_MASK_OFFS);
|
ARMADA_370_XP_INT_SET_MASK_OFFS);
|
||||||
#else
|
|
||||||
writel(irqd_to_hwirq(d),
|
|
||||||
per_cpu_int_base + ARMADA_370_XP_INT_SET_MASK_OFFS);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void armada_370_xp_irq_unmask(struct irq_data *d)
|
static void armada_370_xp_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS)
|
if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
|
||||||
writel(hwirq, main_int_base +
|
writel(hwirq, main_int_base +
|
||||||
ARMADA_370_XP_INT_SET_ENABLE_OFFS);
|
ARMADA_370_XP_INT_SET_ENABLE_OFFS);
|
||||||
else
|
else
|
||||||
writel(hwirq, per_cpu_int_base +
|
writel(hwirq, per_cpu_int_base +
|
||||||
ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
||||||
#else
|
|
||||||
writel(irqd_to_hwirq(d),
|
|
||||||
per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -144,10 +136,14 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
|
||||||
unsigned int virq, irq_hw_number_t hw)
|
unsigned int virq, irq_hw_number_t hw)
|
||||||
{
|
{
|
||||||
armada_370_xp_irq_mask(irq_get_irq_data(virq));
|
armada_370_xp_irq_mask(irq_get_irq_data(virq));
|
||||||
writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS);
|
if (hw != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
|
||||||
|
writel(hw, per_cpu_int_base +
|
||||||
|
ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
||||||
|
else
|
||||||
|
writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS);
|
||||||
irq_set_status_flags(virq, IRQ_LEVEL);
|
irq_set_status_flags(virq, IRQ_LEVEL);
|
||||||
|
|
||||||
if (hw < ARMADA_370_XP_MAX_PER_CPU_IRQS) {
|
if (hw == ARMADA_370_XP_TIMER0_PER_CPU_IRQ) {
|
||||||
irq_set_percpu_devid(virq);
|
irq_set_percpu_devid(virq);
|
||||||
irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
|
irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
|
||||||
handle_percpu_devid_irq);
|
handle_percpu_devid_irq);
|
||||||
|
|
|
@ -538,15 +538,6 @@ static struct clk usb_hhc_ck16xx = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk usb_dc_ck = {
|
static struct clk usb_dc_ck = {
|
||||||
.name = "usb_dc_ck",
|
|
||||||
.ops = &clkops_generic,
|
|
||||||
/* Direct from ULPD, no parent */
|
|
||||||
.rate = 48000000,
|
|
||||||
.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
|
|
||||||
.enable_bit = USB_REQ_EN_SHIFT,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk usb_dc_ck7xx = {
|
|
||||||
.name = "usb_dc_ck",
|
.name = "usb_dc_ck",
|
||||||
.ops = &clkops_generic,
|
.ops = &clkops_generic,
|
||||||
/* Direct from ULPD, no parent */
|
/* Direct from ULPD, no parent */
|
||||||
|
@ -727,8 +718,7 @@ static struct omap_clk omap_clks[] = {
|
||||||
CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310),
|
CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310),
|
||||||
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310),
|
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310),
|
||||||
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),
|
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),
|
||||||
CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX),
|
CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX | CK_7XX),
|
||||||
CLK(NULL, "usb_dc_ck", &usb_dc_ck7xx, CK_7XX),
|
|
||||||
CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310),
|
CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310),
|
||||||
CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
|
CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
|
||||||
CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),
|
CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),
|
||||||
|
|
|
@ -52,6 +52,13 @@
|
||||||
*/
|
*/
|
||||||
#define OMAP4_DPLL_ABE_DEFFREQ 98304000
|
#define OMAP4_DPLL_ABE_DEFFREQ 98304000
|
||||||
|
|
||||||
|
/*
|
||||||
|
* OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section
|
||||||
|
* "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred
|
||||||
|
* locked frequency for the USB DPLL is 960MHz.
|
||||||
|
*/
|
||||||
|
#define OMAP4_DPLL_USB_DEFFREQ 960000000
|
||||||
|
|
||||||
/* Root clocks */
|
/* Root clocks */
|
||||||
|
|
||||||
DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
|
DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
|
||||||
|
@ -1011,6 +1018,10 @@ DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel,
|
||||||
OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
|
OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
|
||||||
hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
|
hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
|
||||||
|
|
||||||
|
DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0,
|
||||||
|
OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
|
||||||
|
OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL);
|
||||||
|
|
||||||
DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
|
DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
|
||||||
OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
|
OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
|
||||||
OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
|
OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
|
||||||
|
@ -1538,6 +1549,7 @@ static struct omap_clk omap44xx_clks[] = {
|
||||||
CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X),
|
CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X),
|
||||||
CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X),
|
CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X),
|
||||||
CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X),
|
CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X),
|
||||||
|
CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m, CK_443X),
|
||||||
CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X),
|
CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X),
|
||||||
CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X),
|
CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X),
|
||||||
CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X),
|
CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X),
|
||||||
|
@ -1705,5 +1717,13 @@ int __init omap4xxx_clk_init(void)
|
||||||
if (rc)
|
if (rc)
|
||||||
pr_err("%s: failed to configure ABE DPLL!\n", __func__);
|
pr_err("%s: failed to configure ABE DPLL!\n", __func__);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lock USB DPLL on OMAP4 devices so that the L3INIT power
|
||||||
|
* domain can transition to retention state when not in use.
|
||||||
|
*/
|
||||||
|
rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
|
||||||
|
if (rc)
|
||||||
|
pr_err("%s: failed to configure USB DPLL!\n", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,5 +293,8 @@ extern void omap_reserve(void);
|
||||||
struct omap_hwmod;
|
struct omap_hwmod;
|
||||||
extern int omap_dss_reset(struct omap_hwmod *);
|
extern int omap_dss_reset(struct omap_hwmod *);
|
||||||
|
|
||||||
|
/* SoC specific clock initializer */
|
||||||
|
extern int (*omap_clk_init)(void);
|
||||||
|
|
||||||
#endif /* __ASSEMBLER__ */
|
#endif /* __ASSEMBLER__ */
|
||||||
#endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */
|
#endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */
|
||||||
|
|
|
@ -54,6 +54,12 @@
|
||||||
#include "prm3xxx.h"
|
#include "prm3xxx.h"
|
||||||
#include "prm44xx.h"
|
#include "prm44xx.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* omap_clk_init: points to a function that does the SoC-specific
|
||||||
|
* clock initializations
|
||||||
|
*/
|
||||||
|
int (*omap_clk_init)(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The machine specific code may provide the extra mapping besides the
|
* The machine specific code may provide the extra mapping besides the
|
||||||
* default mapping provided here.
|
* default mapping provided here.
|
||||||
|
@ -397,7 +403,7 @@ void __init omap2420_init_early(void)
|
||||||
omap242x_clockdomains_init();
|
omap242x_clockdomains_init();
|
||||||
omap2420_hwmod_init();
|
omap2420_hwmod_init();
|
||||||
omap_hwmod_init_postsetup();
|
omap_hwmod_init_postsetup();
|
||||||
omap2420_clk_init();
|
omap_clk_init = omap2420_clk_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init omap2420_init_late(void)
|
void __init omap2420_init_late(void)
|
||||||
|
@ -427,7 +433,7 @@ void __init omap2430_init_early(void)
|
||||||
omap243x_clockdomains_init();
|
omap243x_clockdomains_init();
|
||||||
omap2430_hwmod_init();
|
omap2430_hwmod_init();
|
||||||
omap_hwmod_init_postsetup();
|
omap_hwmod_init_postsetup();
|
||||||
omap2430_clk_init();
|
omap_clk_init = omap2430_clk_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init omap2430_init_late(void)
|
void __init omap2430_init_late(void)
|
||||||
|
@ -462,7 +468,7 @@ void __init omap3_init_early(void)
|
||||||
omap3xxx_clockdomains_init();
|
omap3xxx_clockdomains_init();
|
||||||
omap3xxx_hwmod_init();
|
omap3xxx_hwmod_init();
|
||||||
omap_hwmod_init_postsetup();
|
omap_hwmod_init_postsetup();
|
||||||
omap3xxx_clk_init();
|
omap_clk_init = omap3xxx_clk_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init omap3430_init_early(void)
|
void __init omap3430_init_early(void)
|
||||||
|
@ -500,7 +506,7 @@ void __init ti81xx_init_early(void)
|
||||||
omap3xxx_clockdomains_init();
|
omap3xxx_clockdomains_init();
|
||||||
omap3xxx_hwmod_init();
|
omap3xxx_hwmod_init();
|
||||||
omap_hwmod_init_postsetup();
|
omap_hwmod_init_postsetup();
|
||||||
omap3xxx_clk_init();
|
omap_clk_init = omap3xxx_clk_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init omap3_init_late(void)
|
void __init omap3_init_late(void)
|
||||||
|
@ -568,7 +574,7 @@ void __init am33xx_init_early(void)
|
||||||
am33xx_clockdomains_init();
|
am33xx_clockdomains_init();
|
||||||
am33xx_hwmod_init();
|
am33xx_hwmod_init();
|
||||||
omap_hwmod_init_postsetup();
|
omap_hwmod_init_postsetup();
|
||||||
am33xx_clk_init();
|
omap_clk_init = am33xx_clk_init;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -593,7 +599,7 @@ void __init omap4430_init_early(void)
|
||||||
omap44xx_clockdomains_init();
|
omap44xx_clockdomains_init();
|
||||||
omap44xx_hwmod_init();
|
omap44xx_hwmod_init();
|
||||||
omap_hwmod_init_postsetup();
|
omap_hwmod_init_postsetup();
|
||||||
omap4xxx_clk_init();
|
omap_clk_init = omap4xxx_clk_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init omap4430_init_late(void)
|
void __init omap4430_init_late(void)
|
||||||
|
|
|
@ -1368,7 +1368,9 @@ static void _enable_sysc(struct omap_hwmod *oh)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sf & SYSC_HAS_MIDLEMODE) {
|
if (sf & SYSC_HAS_MIDLEMODE) {
|
||||||
if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
|
if (oh->flags & HWMOD_FORCE_MSTANDBY) {
|
||||||
|
idlemode = HWMOD_IDLEMODE_FORCE;
|
||||||
|
} else if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
|
||||||
idlemode = HWMOD_IDLEMODE_NO;
|
idlemode = HWMOD_IDLEMODE_NO;
|
||||||
} else {
|
} else {
|
||||||
if (sf & SYSC_HAS_ENAWAKEUP)
|
if (sf & SYSC_HAS_ENAWAKEUP)
|
||||||
|
@ -1440,7 +1442,8 @@ static void _idle_sysc(struct omap_hwmod *oh)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sf & SYSC_HAS_MIDLEMODE) {
|
if (sf & SYSC_HAS_MIDLEMODE) {
|
||||||
if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
|
if ((oh->flags & HWMOD_SWSUP_MSTANDBY) ||
|
||||||
|
(oh->flags & HWMOD_FORCE_MSTANDBY)) {
|
||||||
idlemode = HWMOD_IDLEMODE_FORCE;
|
idlemode = HWMOD_IDLEMODE_FORCE;
|
||||||
} else {
|
} else {
|
||||||
if (sf & SYSC_HAS_ENAWAKEUP)
|
if (sf & SYSC_HAS_ENAWAKEUP)
|
||||||
|
|
|
@ -427,8 +427,8 @@ struct omap_hwmod_omap4_prcm {
|
||||||
*
|
*
|
||||||
* HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
|
* HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
|
||||||
* of idle, rather than relying on module smart-idle
|
* of idle, rather than relying on module smart-idle
|
||||||
* HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out
|
* HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and
|
||||||
* of standby, rather than relying on module smart-standby
|
* out of standby, rather than relying on module smart-standby
|
||||||
* HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
|
* HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
|
||||||
* SDRAM controller, etc. XXX probably belongs outside the main hwmod file
|
* SDRAM controller, etc. XXX probably belongs outside the main hwmod file
|
||||||
* XXX Should be HWMOD_SETUP_NO_RESET
|
* XXX Should be HWMOD_SETUP_NO_RESET
|
||||||
|
@ -459,6 +459,10 @@ struct omap_hwmod_omap4_prcm {
|
||||||
* correctly, or this is being abused to deal with some PM latency
|
* correctly, or this is being abused to deal with some PM latency
|
||||||
* issues -- but we're currently suffering from a shortage of
|
* issues -- but we're currently suffering from a shortage of
|
||||||
* folks who are able to track these issues down properly.
|
* folks who are able to track these issues down properly.
|
||||||
|
* HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device
|
||||||
|
* is kept in force-standby mode. Failing to do so causes PM problems
|
||||||
|
* with musb on OMAP3630 at least. Note that musb has a dedicated register
|
||||||
|
* to control MSTANDBY signal when MIDLEMODE is set to force-standby.
|
||||||
*/
|
*/
|
||||||
#define HWMOD_SWSUP_SIDLE (1 << 0)
|
#define HWMOD_SWSUP_SIDLE (1 << 0)
|
||||||
#define HWMOD_SWSUP_MSTANDBY (1 << 1)
|
#define HWMOD_SWSUP_MSTANDBY (1 << 1)
|
||||||
|
@ -471,6 +475,7 @@ struct omap_hwmod_omap4_prcm {
|
||||||
#define HWMOD_16BIT_REG (1 << 8)
|
#define HWMOD_16BIT_REG (1 << 8)
|
||||||
#define HWMOD_EXT_OPT_MAIN_CLK (1 << 9)
|
#define HWMOD_EXT_OPT_MAIN_CLK (1 << 9)
|
||||||
#define HWMOD_BLOCK_WFI (1 << 10)
|
#define HWMOD_BLOCK_WFI (1 << 10)
|
||||||
|
#define HWMOD_FORCE_MSTANDBY (1 << 11)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* omap_hwmod._int_flags definitions
|
* omap_hwmod._int_flags definitions
|
||||||
|
|
|
@ -1707,9 +1707,14 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
|
||||||
* Erratum ID: i479 idle_req / idle_ack mechanism potentially
|
* Erratum ID: i479 idle_req / idle_ack mechanism potentially
|
||||||
* broken when autoidle is enabled
|
* broken when autoidle is enabled
|
||||||
* workaround is to disable the autoidle bit at module level.
|
* workaround is to disable the autoidle bit at module level.
|
||||||
|
*
|
||||||
|
* Enabling the device in any other MIDLEMODE setting but force-idle
|
||||||
|
* causes core_pwrdm not enter idle states at least on OMAP3630.
|
||||||
|
* Note that musb has OTG_FORCESTDBY register that controls MSTANDBY
|
||||||
|
* signal when MIDLEMODE is set to force-idle.
|
||||||
*/
|
*/
|
||||||
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
|
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
|
||||||
| HWMOD_SWSUP_MSTANDBY,
|
| HWMOD_FORCE_MSTANDBY,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* usb_otg_hs */
|
/* usb_otg_hs */
|
||||||
|
|
|
@ -2719,7 +2719,17 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
|
||||||
.name = "ocp2scp_usb_phy",
|
.name = "ocp2scp_usb_phy",
|
||||||
.class = &omap44xx_ocp2scp_hwmod_class,
|
.class = &omap44xx_ocp2scp_hwmod_class,
|
||||||
.clkdm_name = "l3_init_clkdm",
|
.clkdm_name = "l3_init_clkdm",
|
||||||
.main_clk = "func_48m_fclk",
|
/*
|
||||||
|
* ocp2scp_usb_phy_phy_48m is provided by the OMAP4 PRCM IP
|
||||||
|
* block as an "optional clock," and normally should never be
|
||||||
|
* specified as the main_clk for an OMAP IP block. However it
|
||||||
|
* turns out that this clock is actually the main clock for
|
||||||
|
* the ocp2scp_usb_phy IP block:
|
||||||
|
* http://lists.infradead.org/pipermail/linux-arm-kernel/2012-September/119943.html
|
||||||
|
* So listing ocp2scp_usb_phy_phy_48m as a main_clk here seems
|
||||||
|
* to be the best workaround.
|
||||||
|
*/
|
||||||
|
.main_clk = "ocp2scp_usb_phy_phy_48m",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap4 = {
|
.omap4 = {
|
||||||
.clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET,
|
.clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET,
|
||||||
|
|
|
@ -547,6 +547,8 @@ static inline void __init realtime_counter_init(void)
|
||||||
clksrc_nr, clksrc_src) \
|
clksrc_nr, clksrc_src) \
|
||||||
void __init omap##name##_gptimer_timer_init(void) \
|
void __init omap##name##_gptimer_timer_init(void) \
|
||||||
{ \
|
{ \
|
||||||
|
if (omap_clk_init) \
|
||||||
|
omap_clk_init(); \
|
||||||
omap_dmtimer_init(); \
|
omap_dmtimer_init(); \
|
||||||
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
||||||
omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \
|
omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \
|
||||||
|
@ -556,6 +558,8 @@ void __init omap##name##_gptimer_timer_init(void) \
|
||||||
clksrc_nr, clksrc_src) \
|
clksrc_nr, clksrc_src) \
|
||||||
void __init omap##name##_sync32k_timer_init(void) \
|
void __init omap##name##_sync32k_timer_init(void) \
|
||||||
{ \
|
{ \
|
||||||
|
if (omap_clk_init) \
|
||||||
|
omap_clk_init(); \
|
||||||
omap_dmtimer_init(); \
|
omap_dmtimer_init(); \
|
||||||
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
||||||
/* Enable the use of clocksource="gp_timer" kernel parameter */ \
|
/* Enable the use of clocksource="gp_timer" kernel parameter */ \
|
||||||
|
|
|
@ -188,10 +188,8 @@
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_S3C2416)
|
#if defined(CONFIG_CPU_S3C2416)
|
||||||
#define NR_IRQS (IRQ_S3C2416_I2S1 + 1)
|
#define NR_IRQS (IRQ_S3C2416_I2S1 + 1)
|
||||||
#elif defined(CONFIG_CPU_S3C2443)
|
|
||||||
#define NR_IRQS (IRQ_S3C2443_AC97+1)
|
|
||||||
#else
|
#else
|
||||||
#define NR_IRQS (IRQ_S3C2440_AC97+1)
|
#define NR_IRQS (IRQ_S3C2443_AC97 + 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* compatibility define. */
|
/* compatibility define. */
|
||||||
|
|
|
@ -500,7 +500,7 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||||
base = (void *)0xfd000000;
|
base = (void *)0xfd000000;
|
||||||
|
|
||||||
intc->reg_mask = base + 0xa4;
|
intc->reg_mask = base + 0xa4;
|
||||||
intc->reg_pending = base + 0x08;
|
intc->reg_pending = base + 0xa8;
|
||||||
irq_num = 20;
|
irq_num = 20;
|
||||||
irq_start = S3C2410_IRQ(32);
|
irq_start = S3C2410_IRQ(32);
|
||||||
irq_offset = 4;
|
irq_offset = 4;
|
||||||
|
|
|
@ -81,7 +81,6 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct mmci_platform_data mop500_sdi0_data = {
|
struct mmci_platform_data mop500_sdi0_data = {
|
||||||
.ios_handler = mop500_sdi0_ios_handler,
|
|
||||||
.ocr_mask = MMC_VDD_29_30,
|
.ocr_mask = MMC_VDD_29_30,
|
||||||
.f_max = 50000000,
|
.f_max = 50000000,
|
||||||
.capabilities = MMC_CAP_4_BIT_DATA |
|
.capabilities = MMC_CAP_4_BIT_DATA |
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/platform_data/i2c-nomadik.h>
|
#include <linux/platform_data/i2c-nomadik.h>
|
||||||
|
@ -439,6 +440,15 @@ static void mop500_prox_deactivate(struct device *dev)
|
||||||
regulator_put(prox_regulator);
|
regulator_put(prox_regulator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mop500_snowball_ethernet_clock_enable(void)
|
||||||
|
{
|
||||||
|
struct clk *clk;
|
||||||
|
|
||||||
|
clk = clk_get_sys("fsmc", NULL);
|
||||||
|
if (!IS_ERR(clk))
|
||||||
|
clk_prepare_enable(clk);
|
||||||
|
}
|
||||||
|
|
||||||
static struct cryp_platform_data u8500_cryp1_platform_data = {
|
static struct cryp_platform_data u8500_cryp1_platform_data = {
|
||||||
.mem_to_engine = {
|
.mem_to_engine = {
|
||||||
.dir = STEDMA40_MEM_TO_PERIPH,
|
.dir = STEDMA40_MEM_TO_PERIPH,
|
||||||
|
@ -683,6 +693,8 @@ static void __init snowball_init_machine(void)
|
||||||
mop500_audio_init(parent);
|
mop500_audio_init(parent);
|
||||||
mop500_uart_init(parent);
|
mop500_uart_init(parent);
|
||||||
|
|
||||||
|
mop500_snowball_ethernet_clock_enable();
|
||||||
|
|
||||||
/* This board has full regulator constraints */
|
/* This board has full regulator constraints */
|
||||||
regulator_has_full_constraints();
|
regulator_has_full_constraints();
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,6 +104,7 @@ void __init mop500_pinmaps_init(void);
|
||||||
void __init snowball_pinmaps_init(void);
|
void __init snowball_pinmaps_init(void);
|
||||||
void __init hrefv60_pinmaps_init(void);
|
void __init hrefv60_pinmaps_init(void);
|
||||||
void mop500_audio_init(struct device *parent);
|
void mop500_audio_init(struct device *parent);
|
||||||
|
void mop500_snowball_ethernet_clock_enable(void);
|
||||||
|
|
||||||
int __init mop500_uib_init(void);
|
int __init mop500_uib_init(void);
|
||||||
void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
|
void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
|
||||||
|
|
|
@ -312,9 +312,10 @@ static void __init u8500_init_machine(void)
|
||||||
/* Pinmaps must be in place before devices register */
|
/* Pinmaps must be in place before devices register */
|
||||||
if (of_machine_is_compatible("st-ericsson,mop500"))
|
if (of_machine_is_compatible("st-ericsson,mop500"))
|
||||||
mop500_pinmaps_init();
|
mop500_pinmaps_init();
|
||||||
else if (of_machine_is_compatible("calaosystems,snowball-a9500"))
|
else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
|
||||||
snowball_pinmaps_init();
|
snowball_pinmaps_init();
|
||||||
else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
|
mop500_snowball_ethernet_clock_enable();
|
||||||
|
} else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
|
||||||
hrefv60_pinmaps_init();
|
hrefv60_pinmaps_init();
|
||||||
else if (of_machine_is_compatible("st-ericsson,ccu9540")) {}
|
else if (of_machine_is_compatible("st-ericsson,ccu9540")) {}
|
||||||
/* TODO: Add pinmaps for ccu9540 board. */
|
/* TODO: Add pinmaps for ccu9540 board. */
|
||||||
|
|
|
@ -43,7 +43,7 @@ config CPU_ARM740T
|
||||||
depends on !MMU
|
depends on !MMU
|
||||||
select CPU_32v4T
|
select CPU_32v4T
|
||||||
select CPU_ABRT_LV4T
|
select CPU_ABRT_LV4T
|
||||||
select CPU_CACHE_V3 # although the core is v4t
|
select CPU_CACHE_V4
|
||||||
select CPU_CP15_MPU
|
select CPU_CP15_MPU
|
||||||
select CPU_PABRT_LEGACY
|
select CPU_PABRT_LEGACY
|
||||||
help
|
help
|
||||||
|
@ -469,9 +469,6 @@ config CPU_PABRT_V7
|
||||||
bool
|
bool
|
||||||
|
|
||||||
# The cache model
|
# The cache model
|
||||||
config CPU_CACHE_V3
|
|
||||||
bool
|
|
||||||
|
|
||||||
config CPU_CACHE_V4
|
config CPU_CACHE_V4
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ obj-$(CONFIG_CPU_PABRT_LEGACY) += pabort-legacy.o
|
||||||
obj-$(CONFIG_CPU_PABRT_V6) += pabort-v6.o
|
obj-$(CONFIG_CPU_PABRT_V6) += pabort-v6.o
|
||||||
obj-$(CONFIG_CPU_PABRT_V7) += pabort-v7.o
|
obj-$(CONFIG_CPU_PABRT_V7) += pabort-v7.o
|
||||||
|
|
||||||
obj-$(CONFIG_CPU_CACHE_V3) += cache-v3.o
|
|
||||||
obj-$(CONFIG_CPU_CACHE_V4) += cache-v4.o
|
obj-$(CONFIG_CPU_CACHE_V4) += cache-v4.o
|
||||||
obj-$(CONFIG_CPU_CACHE_V4WT) += cache-v4wt.o
|
obj-$(CONFIG_CPU_CACHE_V4WT) += cache-v4wt.o
|
||||||
obj-$(CONFIG_CPU_CACHE_V4WB) += cache-v4wb.o
|
obj-$(CONFIG_CPU_CACHE_V4WB) += cache-v4wb.o
|
||||||
|
|
|
@ -343,6 +343,7 @@ void __init feroceon_l2_init(int __l2_wt_override)
|
||||||
outer_cache.inv_range = feroceon_l2_inv_range;
|
outer_cache.inv_range = feroceon_l2_inv_range;
|
||||||
outer_cache.clean_range = feroceon_l2_clean_range;
|
outer_cache.clean_range = feroceon_l2_clean_range;
|
||||||
outer_cache.flush_range = feroceon_l2_flush_range;
|
outer_cache.flush_range = feroceon_l2_flush_range;
|
||||||
|
outer_cache.inv_all = l2_inv_all;
|
||||||
|
|
||||||
enable_l2();
|
enable_l2();
|
||||||
|
|
||||||
|
|
|
@ -299,7 +299,7 @@ static void l2x0_unlock(u32 cache_id)
|
||||||
int lockregs;
|
int lockregs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
switch (cache_id) {
|
switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
|
||||||
case L2X0_CACHE_ID_PART_L310:
|
case L2X0_CACHE_ID_PART_L310:
|
||||||
lockregs = 8;
|
lockregs = 8;
|
||||||
break;
|
break;
|
||||||
|
@ -333,15 +333,14 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)
|
||||||
if (cache_id_part_number_from_dt)
|
if (cache_id_part_number_from_dt)
|
||||||
cache_id = cache_id_part_number_from_dt;
|
cache_id = cache_id_part_number_from_dt;
|
||||||
else
|
else
|
||||||
cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID)
|
cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID);
|
||||||
& L2X0_CACHE_ID_PART_MASK;
|
|
||||||
aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
|
aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
|
||||||
|
|
||||||
aux &= aux_mask;
|
aux &= aux_mask;
|
||||||
aux |= aux_val;
|
aux |= aux_val;
|
||||||
|
|
||||||
/* Determine the number of ways */
|
/* Determine the number of ways */
|
||||||
switch (cache_id) {
|
switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
|
||||||
case L2X0_CACHE_ID_PART_L310:
|
case L2X0_CACHE_ID_PART_L310:
|
||||||
if (aux & (1 << 16))
|
if (aux & (1 << 16))
|
||||||
ways = 16;
|
ways = 16;
|
||||||
|
@ -725,7 +724,6 @@ static const struct l2x0_of_data pl310_data = {
|
||||||
.flush_all = l2x0_flush_all,
|
.flush_all = l2x0_flush_all,
|
||||||
.inv_all = l2x0_inv_all,
|
.inv_all = l2x0_inv_all,
|
||||||
.disable = l2x0_disable,
|
.disable = l2x0_disable,
|
||||||
.set_debug = pl310_set_debug,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -814,9 +812,8 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)
|
||||||
data->save();
|
data->save();
|
||||||
|
|
||||||
of_init = true;
|
of_init = true;
|
||||||
l2x0_init(l2x0_base, aux_val, aux_mask);
|
|
||||||
|
|
||||||
memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache));
|
memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache));
|
||||||
|
l2x0_init(l2x0_base, aux_val, aux_mask);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/arm/mm/cache-v3.S
|
|
||||||
*
|
|
||||||
* Copyright (C) 1997-2002 Russell king
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*/
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <asm/page.h>
|
|
||||||
#include "proc-macros.S"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* flush_icache_all()
|
|
||||||
*
|
|
||||||
* Unconditionally clean and invalidate the entire icache.
|
|
||||||
*/
|
|
||||||
ENTRY(v3_flush_icache_all)
|
|
||||||
mov pc, lr
|
|
||||||
ENDPROC(v3_flush_icache_all)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* flush_user_cache_all()
|
|
||||||
*
|
|
||||||
* Invalidate all cache entries in a particular address
|
|
||||||
* space.
|
|
||||||
*
|
|
||||||
* - mm - mm_struct describing address space
|
|
||||||
*/
|
|
||||||
ENTRY(v3_flush_user_cache_all)
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
/*
|
|
||||||
* flush_kern_cache_all()
|
|
||||||
*
|
|
||||||
* Clean and invalidate the entire cache.
|
|
||||||
*/
|
|
||||||
ENTRY(v3_flush_kern_cache_all)
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* flush_user_cache_range(start, end, flags)
|
|
||||||
*
|
|
||||||
* Invalidate a range of cache entries in the specified
|
|
||||||
* address space.
|
|
||||||
*
|
|
||||||
* - start - start address (may not be aligned)
|
|
||||||
* - end - end address (exclusive, may not be aligned)
|
|
||||||
* - flags - vma_area_struct flags describing address space
|
|
||||||
*/
|
|
||||||
ENTRY(v3_flush_user_cache_range)
|
|
||||||
mov ip, #0
|
|
||||||
mcreq p15, 0, ip, c7, c0, 0 @ flush ID cache
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
/*
|
|
||||||
* coherent_kern_range(start, end)
|
|
||||||
*
|
|
||||||
* Ensure coherency between the Icache and the Dcache in the
|
|
||||||
* region described by start. If you have non-snooping
|
|
||||||
* Harvard caches, you need to implement this function.
|
|
||||||
*
|
|
||||||
* - start - virtual start address
|
|
||||||
* - end - virtual end address
|
|
||||||
*/
|
|
||||||
ENTRY(v3_coherent_kern_range)
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* coherent_user_range(start, end)
|
|
||||||
*
|
|
||||||
* Ensure coherency between the Icache and the Dcache in the
|
|
||||||
* region described by start. If you have non-snooping
|
|
||||||
* Harvard caches, you need to implement this function.
|
|
||||||
*
|
|
||||||
* - start - virtual start address
|
|
||||||
* - end - virtual end address
|
|
||||||
*/
|
|
||||||
ENTRY(v3_coherent_user_range)
|
|
||||||
mov r0, #0
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
/*
|
|
||||||
* flush_kern_dcache_area(void *page, size_t size)
|
|
||||||
*
|
|
||||||
* Ensure no D cache aliasing occurs, either with itself or
|
|
||||||
* the I cache
|
|
||||||
*
|
|
||||||
* - addr - kernel address
|
|
||||||
* - size - region size
|
|
||||||
*/
|
|
||||||
ENTRY(v3_flush_kern_dcache_area)
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dma_flush_range(start, end)
|
|
||||||
*
|
|
||||||
* Clean and invalidate the specified virtual address range.
|
|
||||||
*
|
|
||||||
* - start - virtual start address
|
|
||||||
* - end - virtual end address
|
|
||||||
*/
|
|
||||||
ENTRY(v3_dma_flush_range)
|
|
||||||
mov r0, #0
|
|
||||||
mcr p15, 0, r0, c7, c0, 0 @ flush ID cache
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dma_unmap_area(start, size, dir)
|
|
||||||
* - start - kernel virtual start address
|
|
||||||
* - size - size of region
|
|
||||||
* - dir - DMA direction
|
|
||||||
*/
|
|
||||||
ENTRY(v3_dma_unmap_area)
|
|
||||||
teq r2, #DMA_TO_DEVICE
|
|
||||||
bne v3_dma_flush_range
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dma_map_area(start, size, dir)
|
|
||||||
* - start - kernel virtual start address
|
|
||||||
* - size - size of region
|
|
||||||
* - dir - DMA direction
|
|
||||||
*/
|
|
||||||
ENTRY(v3_dma_map_area)
|
|
||||||
mov pc, lr
|
|
||||||
ENDPROC(v3_dma_unmap_area)
|
|
||||||
ENDPROC(v3_dma_map_area)
|
|
||||||
|
|
||||||
.globl v3_flush_kern_cache_louis
|
|
||||||
.equ v3_flush_kern_cache_louis, v3_flush_kern_cache_all
|
|
||||||
|
|
||||||
__INITDATA
|
|
||||||
|
|
||||||
@ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
|
|
||||||
define_cache_functions v3
|
|
|
@ -58,7 +58,7 @@ ENTRY(v4_flush_kern_cache_all)
|
||||||
ENTRY(v4_flush_user_cache_range)
|
ENTRY(v4_flush_user_cache_range)
|
||||||
#ifdef CONFIG_CPU_CP15
|
#ifdef CONFIG_CPU_CP15
|
||||||
mov ip, #0
|
mov ip, #0
|
||||||
mcreq p15, 0, ip, c7, c7, 0 @ flush ID cache
|
mcr p15, 0, ip, c7, c7, 0 @ flush ID cache
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
#else
|
#else
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
|
|
|
@ -48,7 +48,7 @@ static DEFINE_RAW_SPINLOCK(cpu_asid_lock);
|
||||||
static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION);
|
static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION);
|
||||||
static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS);
|
static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS);
|
||||||
|
|
||||||
static DEFINE_PER_CPU(atomic64_t, active_asids);
|
DEFINE_PER_CPU(atomic64_t, active_asids);
|
||||||
static DEFINE_PER_CPU(u64, reserved_asids);
|
static DEFINE_PER_CPU(u64, reserved_asids);
|
||||||
static cpumask_t tlb_flush_pending;
|
static cpumask_t tlb_flush_pending;
|
||||||
|
|
||||||
|
@ -215,6 +215,7 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk)
|
||||||
if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) {
|
if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) {
|
||||||
local_flush_bp_all();
|
local_flush_bp_all();
|
||||||
local_flush_tlb_all();
|
local_flush_tlb_all();
|
||||||
|
dummy_flush_tlb_a15_erratum();
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic64_set(&per_cpu(active_asids, cpu), asid);
|
atomic64_set(&per_cpu(active_asids, cpu), asid);
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <asm/mach/pci.h>
|
#include <asm/mach/pci.h>
|
||||||
|
|
||||||
#include "mm.h"
|
#include "mm.h"
|
||||||
|
#include "tcm.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* empty_zero_page is a special page that is used for
|
* empty_zero_page is a special page that is used for
|
||||||
|
@ -598,39 +599,60 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr,
|
||||||
} while (pte++, addr += PAGE_SIZE, addr != end);
|
} while (pte++, addr += PAGE_SIZE, addr != end);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init alloc_init_section(pud_t *pud, unsigned long addr,
|
static void __init map_init_section(pmd_t *pmd, unsigned long addr,
|
||||||
|
unsigned long end, phys_addr_t phys,
|
||||||
|
const struct mem_type *type)
|
||||||
|
{
|
||||||
|
#ifndef CONFIG_ARM_LPAE
|
||||||
|
/*
|
||||||
|
* In classic MMU format, puds and pmds are folded in to
|
||||||
|
* the pgds. pmd_offset gives the PGD entry. PGDs refer to a
|
||||||
|
* group of L1 entries making up one logical pointer to
|
||||||
|
* an L2 table (2MB), where as PMDs refer to the individual
|
||||||
|
* L1 entries (1MB). Hence increment to get the correct
|
||||||
|
* offset for odd 1MB sections.
|
||||||
|
* (See arch/arm/include/asm/pgtable-2level.h)
|
||||||
|
*/
|
||||||
|
if (addr & SECTION_SIZE)
|
||||||
|
pmd++;
|
||||||
|
#endif
|
||||||
|
do {
|
||||||
|
*pmd = __pmd(phys | type->prot_sect);
|
||||||
|
phys += SECTION_SIZE;
|
||||||
|
} while (pmd++, addr += SECTION_SIZE, addr != end);
|
||||||
|
|
||||||
|
flush_pmd_entry(pmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
|
||||||
unsigned long end, phys_addr_t phys,
|
unsigned long end, phys_addr_t phys,
|
||||||
const struct mem_type *type)
|
const struct mem_type *type)
|
||||||
{
|
{
|
||||||
pmd_t *pmd = pmd_offset(pud, addr);
|
pmd_t *pmd = pmd_offset(pud, addr);
|
||||||
|
unsigned long next;
|
||||||
|
|
||||||
/*
|
do {
|
||||||
* Try a section mapping - end, addr and phys must all be aligned
|
|
||||||
* to a section boundary. Note that PMDs refer to the individual
|
|
||||||
* L1 entries, whereas PGDs refer to a group of L1 entries making
|
|
||||||
* up one logical pointer to an L2 table.
|
|
||||||
*/
|
|
||||||
if (type->prot_sect && ((addr | end | phys) & ~SECTION_MASK) == 0) {
|
|
||||||
pmd_t *p = pmd;
|
|
||||||
|
|
||||||
#ifndef CONFIG_ARM_LPAE
|
|
||||||
if (addr & SECTION_SIZE)
|
|
||||||
pmd++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
do {
|
|
||||||
*pmd = __pmd(phys | type->prot_sect);
|
|
||||||
phys += SECTION_SIZE;
|
|
||||||
} while (pmd++, addr += SECTION_SIZE, addr != end);
|
|
||||||
|
|
||||||
flush_pmd_entry(p);
|
|
||||||
} else {
|
|
||||||
/*
|
/*
|
||||||
* No need to loop; pte's aren't interested in the
|
* With LPAE, we must loop over to map
|
||||||
* individual L1 entries.
|
* all the pmds for the given range.
|
||||||
*/
|
*/
|
||||||
alloc_init_pte(pmd, addr, end, __phys_to_pfn(phys), type);
|
next = pmd_addr_end(addr, end);
|
||||||
}
|
|
||||||
|
/*
|
||||||
|
* Try a section mapping - addr, next and phys must all be
|
||||||
|
* aligned to a section boundary.
|
||||||
|
*/
|
||||||
|
if (type->prot_sect &&
|
||||||
|
((addr | next | phys) & ~SECTION_MASK) == 0) {
|
||||||
|
map_init_section(pmd, addr, next, phys, type);
|
||||||
|
} else {
|
||||||
|
alloc_init_pte(pmd, addr, next,
|
||||||
|
__phys_to_pfn(phys), type);
|
||||||
|
}
|
||||||
|
|
||||||
|
phys += next - addr;
|
||||||
|
|
||||||
|
} while (pmd++, addr = next, addr != end);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
|
static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
|
||||||
|
@ -641,7 +663,7 @@ static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
|
||||||
|
|
||||||
do {
|
do {
|
||||||
next = pud_addr_end(addr, end);
|
next = pud_addr_end(addr, end);
|
||||||
alloc_init_section(pud, addr, next, phys, type);
|
alloc_init_pmd(pud, addr, next, phys, type);
|
||||||
phys += next - addr;
|
phys += next - addr;
|
||||||
} while (pud++, addr = next, addr != end);
|
} while (pud++, addr = next, addr != end);
|
||||||
}
|
}
|
||||||
|
@ -1256,6 +1278,7 @@ void __init paging_init(struct machine_desc *mdesc)
|
||||||
dma_contiguous_remap();
|
dma_contiguous_remap();
|
||||||
devicemaps_init(mdesc);
|
devicemaps_init(mdesc);
|
||||||
kmap_init();
|
kmap_init();
|
||||||
|
tcm_init();
|
||||||
|
|
||||||
top_pmd = pmd_off_k(0xffff0000);
|
top_pmd = pmd_off_k(0xffff0000);
|
||||||
|
|
||||||
|
|
|
@ -77,24 +77,27 @@ __arm740_setup:
|
||||||
mcr p15, 0, r0, c6, c0 @ set area 0, default
|
mcr p15, 0, r0, c6, c0 @ set area 0, default
|
||||||
|
|
||||||
ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
|
ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
|
||||||
ldr r1, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB)
|
ldr r3, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB)
|
||||||
mov r2, #10 @ 11 is the minimum (4KB)
|
mov r4, #10 @ 11 is the minimum (4KB)
|
||||||
1: add r2, r2, #1 @ area size *= 2
|
1: add r4, r4, #1 @ area size *= 2
|
||||||
mov r1, r1, lsr #1
|
movs r3, r3, lsr #1
|
||||||
bne 1b @ count not zero r-shift
|
bne 1b @ count not zero r-shift
|
||||||
orr r0, r0, r2, lsl #1 @ the area register value
|
orr r0, r0, r4, lsl #1 @ the area register value
|
||||||
orr r0, r0, #1 @ set enable bit
|
orr r0, r0, #1 @ set enable bit
|
||||||
mcr p15, 0, r0, c6, c1 @ set area 1, RAM
|
mcr p15, 0, r0, c6, c1 @ set area 1, RAM
|
||||||
|
|
||||||
ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
|
ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
|
||||||
ldr r1, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB)
|
ldr r3, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB)
|
||||||
mov r2, #10 @ 11 is the minimum (4KB)
|
cmp r3, #0
|
||||||
1: add r2, r2, #1 @ area size *= 2
|
moveq r0, #0
|
||||||
mov r1, r1, lsr #1
|
beq 2f
|
||||||
|
mov r4, #10 @ 11 is the minimum (4KB)
|
||||||
|
1: add r4, r4, #1 @ area size *= 2
|
||||||
|
movs r3, r3, lsr #1
|
||||||
bne 1b @ count not zero r-shift
|
bne 1b @ count not zero r-shift
|
||||||
orr r0, r0, r2, lsl #1 @ the area register value
|
orr r0, r0, r4, lsl #1 @ the area register value
|
||||||
orr r0, r0, #1 @ set enable bit
|
orr r0, r0, #1 @ set enable bit
|
||||||
mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH
|
2: mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH
|
||||||
|
|
||||||
mov r0, #0x06
|
mov r0, #0x06
|
||||||
mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable
|
mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable
|
||||||
|
@ -137,13 +140,14 @@ __arm740_proc_info:
|
||||||
.long 0x41807400
|
.long 0x41807400
|
||||||
.long 0xfffffff0
|
.long 0xfffffff0
|
||||||
.long 0
|
.long 0
|
||||||
|
.long 0
|
||||||
b __arm740_setup
|
b __arm740_setup
|
||||||
.long cpu_arch_name
|
.long cpu_arch_name
|
||||||
.long cpu_elf_name
|
.long cpu_elf_name
|
||||||
.long HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT
|
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT
|
||||||
.long cpu_arm740_name
|
.long cpu_arm740_name
|
||||||
.long arm740_processor_functions
|
.long arm740_processor_functions
|
||||||
.long 0
|
.long 0
|
||||||
.long 0
|
.long 0
|
||||||
.long v3_cache_fns @ cache model
|
.long v4_cache_fns @ cache model
|
||||||
.size __arm740_proc_info, . - __arm740_proc_info
|
.size __arm740_proc_info, . - __arm740_proc_info
|
||||||
|
|
|
@ -387,7 +387,7 @@ ENTRY(cpu_arm920_set_pte_ext)
|
||||||
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
||||||
.globl cpu_arm920_suspend_size
|
.globl cpu_arm920_suspend_size
|
||||||
.equ cpu_arm920_suspend_size, 4 * 3
|
.equ cpu_arm920_suspend_size, 4 * 3
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_arm920_do_suspend)
|
ENTRY(cpu_arm920_do_suspend)
|
||||||
stmfd sp!, {r4 - r6, lr}
|
stmfd sp!, {r4 - r6, lr}
|
||||||
mrc p15, 0, r4, c13, c0, 0 @ PID
|
mrc p15, 0, r4, c13, c0, 0 @ PID
|
||||||
|
|
|
@ -402,7 +402,7 @@ ENTRY(cpu_arm926_set_pte_ext)
|
||||||
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
||||||
.globl cpu_arm926_suspend_size
|
.globl cpu_arm926_suspend_size
|
||||||
.equ cpu_arm926_suspend_size, 4 * 3
|
.equ cpu_arm926_suspend_size, 4 * 3
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_arm926_do_suspend)
|
ENTRY(cpu_arm926_do_suspend)
|
||||||
stmfd sp!, {r4 - r6, lr}
|
stmfd sp!, {r4 - r6, lr}
|
||||||
mrc p15, 0, r4, c13, c0, 0 @ PID
|
mrc p15, 0, r4, c13, c0, 0 @ PID
|
||||||
|
|
|
@ -350,7 +350,7 @@ ENTRY(cpu_mohawk_set_pte_ext)
|
||||||
|
|
||||||
.globl cpu_mohawk_suspend_size
|
.globl cpu_mohawk_suspend_size
|
||||||
.equ cpu_mohawk_suspend_size, 4 * 6
|
.equ cpu_mohawk_suspend_size, 4 * 6
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_mohawk_do_suspend)
|
ENTRY(cpu_mohawk_do_suspend)
|
||||||
stmfd sp!, {r4 - r9, lr}
|
stmfd sp!, {r4 - r9, lr}
|
||||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||||
|
|
|
@ -172,7 +172,7 @@ ENTRY(cpu_sa1100_set_pte_ext)
|
||||||
|
|
||||||
.globl cpu_sa1100_suspend_size
|
.globl cpu_sa1100_suspend_size
|
||||||
.equ cpu_sa1100_suspend_size, 4 * 3
|
.equ cpu_sa1100_suspend_size, 4 * 3
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_sa1100_do_suspend)
|
ENTRY(cpu_sa1100_do_suspend)
|
||||||
stmfd sp!, {r4 - r6, lr}
|
stmfd sp!, {r4 - r6, lr}
|
||||||
mrc p15, 0, r4, c3, c0, 0 @ domain ID
|
mrc p15, 0, r4, c3, c0, 0 @ domain ID
|
||||||
|
|
|
@ -17,7 +17,9 @@
|
||||||
|
|
||||||
#ifndef MULTI_CPU
|
#ifndef MULTI_CPU
|
||||||
EXPORT_SYMBOL(cpu_dcache_clean_area);
|
EXPORT_SYMBOL(cpu_dcache_clean_area);
|
||||||
|
#ifdef CONFIG_MMU
|
||||||
EXPORT_SYMBOL(cpu_set_pte_ext);
|
EXPORT_SYMBOL(cpu_set_pte_ext);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
EXPORT_SYMBOL(processor);
|
EXPORT_SYMBOL(processor);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -138,7 +138,7 @@ ENTRY(cpu_v6_set_pte_ext)
|
||||||
/* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */
|
/* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */
|
||||||
.globl cpu_v6_suspend_size
|
.globl cpu_v6_suspend_size
|
||||||
.equ cpu_v6_suspend_size, 4 * 6
|
.equ cpu_v6_suspend_size, 4 * 6
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_v6_do_suspend)
|
ENTRY(cpu_v6_do_suspend)
|
||||||
stmfd sp!, {r4 - r9, lr}
|
stmfd sp!, {r4 - r9, lr}
|
||||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||||
|
|
|
@ -420,7 +420,7 @@ __v7_pj4b_proc_info:
|
||||||
__v7_ca7mp_proc_info:
|
__v7_ca7mp_proc_info:
|
||||||
.long 0x410fc070
|
.long 0x410fc070
|
||||||
.long 0xff0ffff0
|
.long 0xff0ffff0
|
||||||
__v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV
|
__v7_proc __v7_ca7mp_setup
|
||||||
.size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
|
.size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -430,9 +430,24 @@ __v7_ca7mp_proc_info:
|
||||||
__v7_ca15mp_proc_info:
|
__v7_ca15mp_proc_info:
|
||||||
.long 0x410fc0f0
|
.long 0x410fc0f0
|
||||||
.long 0xff0ffff0
|
.long 0xff0ffff0
|
||||||
__v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV
|
__v7_proc __v7_ca15mp_setup
|
||||||
.size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
|
.size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Qualcomm Inc. Krait processors.
|
||||||
|
*/
|
||||||
|
.type __krait_proc_info, #object
|
||||||
|
__krait_proc_info:
|
||||||
|
.long 0x510f0400 @ Required ID value
|
||||||
|
.long 0xff0ffc00 @ Mask for ID
|
||||||
|
/*
|
||||||
|
* Some Krait processors don't indicate support for SDIV and UDIV
|
||||||
|
* instructions in the ARM instruction set, even though they actually
|
||||||
|
* do support them.
|
||||||
|
*/
|
||||||
|
__v7_proc __v7_setup, hwcaps = HWCAP_IDIV
|
||||||
|
.size __krait_proc_info, . - __krait_proc_info
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Match any ARMv7 processor core.
|
* Match any ARMv7 processor core.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -413,7 +413,7 @@ ENTRY(cpu_xsc3_set_pte_ext)
|
||||||
|
|
||||||
.globl cpu_xsc3_suspend_size
|
.globl cpu_xsc3_suspend_size
|
||||||
.equ cpu_xsc3_suspend_size, 4 * 6
|
.equ cpu_xsc3_suspend_size, 4 * 6
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_xsc3_do_suspend)
|
ENTRY(cpu_xsc3_do_suspend)
|
||||||
stmfd sp!, {r4 - r9, lr}
|
stmfd sp!, {r4 - r9, lr}
|
||||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||||
|
|
|
@ -528,7 +528,7 @@ ENTRY(cpu_xscale_set_pte_ext)
|
||||||
|
|
||||||
.globl cpu_xscale_suspend_size
|
.globl cpu_xscale_suspend_size
|
||||||
.equ cpu_xscale_suspend_size, 4 * 6
|
.equ cpu_xscale_suspend_size, 4 * 6
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||||
ENTRY(cpu_xscale_do_suspend)
|
ENTRY(cpu_xscale_do_suspend)
|
||||||
stmfd sp!, {r4 - r9, lr}
|
stmfd sp!, {r4 - r9, lr}
|
||||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||||
|
|
|
@ -165,6 +165,10 @@ BUILDIO_IOPORT(l, u32)
|
||||||
#define readw_be __raw_readw
|
#define readw_be __raw_readw
|
||||||
#define readl_be __raw_readl
|
#define readl_be __raw_readl
|
||||||
|
|
||||||
|
#define writeb_relaxed writeb
|
||||||
|
#define writew_relaxed writew
|
||||||
|
#define writel_relaxed writel
|
||||||
|
|
||||||
#define writeb_be __raw_writeb
|
#define writeb_be __raw_writeb
|
||||||
#define writew_be __raw_writew
|
#define writew_be __raw_writew
|
||||||
#define writel_be __raw_writel
|
#define writel_be __raw_writel
|
||||||
|
|
|
@ -27,7 +27,7 @@ static inline unsigned long arch_local_save_flags(void)
|
||||||
/* set interrupt enabled status */
|
/* set interrupt enabled status */
|
||||||
static inline void arch_local_irq_restore(unsigned long flags)
|
static inline void arch_local_irq_restore(unsigned long flags)
|
||||||
{
|
{
|
||||||
asm volatile (" mvc .s2 %0,CSR\n" : : "b"(flags));
|
asm volatile (" mvc .s2 %0,CSR\n" : : "b"(flags) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unconditionally enable interrupts */
|
/* unconditionally enable interrupts */
|
||||||
|
|
|
@ -110,6 +110,7 @@ config DMI
|
||||||
|
|
||||||
config EFI
|
config EFI
|
||||||
bool
|
bool
|
||||||
|
select UCS2_STRING
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config SCHED_OMIT_FRAME_POINTER
|
config SCHED_OMIT_FRAME_POINTER
|
||||||
|
|
|
@ -849,17 +849,6 @@ static palinfo_entry_t palinfo_entries[]={
|
||||||
|
|
||||||
#define NR_PALINFO_ENTRIES (int) ARRAY_SIZE(palinfo_entries)
|
#define NR_PALINFO_ENTRIES (int) ARRAY_SIZE(palinfo_entries)
|
||||||
|
|
||||||
/*
|
|
||||||
* this array is used to keep track of the proc entries we create. This is
|
|
||||||
* required in the module mode when we need to remove all entries. The procfs code
|
|
||||||
* does not do recursion of deletion
|
|
||||||
*
|
|
||||||
* Notes:
|
|
||||||
* - +1 accounts for the cpuN directory entry in /proc/pal
|
|
||||||
*/
|
|
||||||
#define NR_PALINFO_PROC_ENTRIES (NR_CPUS*(NR_PALINFO_ENTRIES+1))
|
|
||||||
|
|
||||||
static struct proc_dir_entry *palinfo_proc_entries[NR_PALINFO_PROC_ENTRIES];
|
|
||||||
static struct proc_dir_entry *palinfo_dir;
|
static struct proc_dir_entry *palinfo_dir;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -971,60 +960,32 @@ palinfo_read_entry(char *page, char **start, off_t off, int count, int *eof, voi
|
||||||
static void __cpuinit
|
static void __cpuinit
|
||||||
create_palinfo_proc_entries(unsigned int cpu)
|
create_palinfo_proc_entries(unsigned int cpu)
|
||||||
{
|
{
|
||||||
# define CPUSTR "cpu%d"
|
|
||||||
|
|
||||||
pal_func_cpu_u_t f;
|
pal_func_cpu_u_t f;
|
||||||
struct proc_dir_entry **pdir;
|
|
||||||
struct proc_dir_entry *cpu_dir;
|
struct proc_dir_entry *cpu_dir;
|
||||||
int j;
|
int j;
|
||||||
char cpustr[sizeof(CPUSTR)];
|
char cpustr[3+4+1]; /* cpu numbers are up to 4095 on itanic */
|
||||||
|
sprintf(cpustr, "cpu%d", cpu);
|
||||||
|
|
||||||
/*
|
|
||||||
* we keep track of created entries in a depth-first order for
|
|
||||||
* cleanup purposes. Each entry is stored into palinfo_proc_entries
|
|
||||||
*/
|
|
||||||
sprintf(cpustr,CPUSTR, cpu);
|
|
||||||
|
|
||||||
cpu_dir = proc_mkdir(cpustr, palinfo_dir);
|
cpu_dir = proc_mkdir(cpustr, palinfo_dir);
|
||||||
|
if (!cpu_dir)
|
||||||
|
return;
|
||||||
|
|
||||||
f.req_cpu = cpu;
|
f.req_cpu = cpu;
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the location to store per cpu entries
|
|
||||||
* We dont store the top level entry in this list, but
|
|
||||||
* remove it finally after removing all cpu entries.
|
|
||||||
*/
|
|
||||||
pdir = &palinfo_proc_entries[cpu*(NR_PALINFO_ENTRIES+1)];
|
|
||||||
*pdir++ = cpu_dir;
|
|
||||||
for (j=0; j < NR_PALINFO_ENTRIES; j++) {
|
for (j=0; j < NR_PALINFO_ENTRIES; j++) {
|
||||||
f.func_id = j;
|
f.func_id = j;
|
||||||
*pdir = create_proc_read_entry(
|
create_proc_read_entry(
|
||||||
palinfo_entries[j].name, 0, cpu_dir,
|
palinfo_entries[j].name, 0, cpu_dir,
|
||||||
palinfo_read_entry, (void *)f.value);
|
palinfo_read_entry, (void *)f.value);
|
||||||
pdir++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_palinfo_proc_entries(unsigned int hcpu)
|
remove_palinfo_proc_entries(unsigned int hcpu)
|
||||||
{
|
{
|
||||||
int j;
|
char cpustr[3+4+1]; /* cpu numbers are up to 4095 on itanic */
|
||||||
struct proc_dir_entry *cpu_dir, **pdir;
|
sprintf(cpustr, "cpu%d", hcpu);
|
||||||
|
remove_proc_subtree(cpustr, palinfo_dir);
|
||||||
pdir = &palinfo_proc_entries[hcpu*(NR_PALINFO_ENTRIES+1)];
|
|
||||||
cpu_dir = *pdir;
|
|
||||||
*pdir++=NULL;
|
|
||||||
for (j=0; j < (NR_PALINFO_ENTRIES); j++) {
|
|
||||||
if ((*pdir)) {
|
|
||||||
remove_proc_entry ((*pdir)->name, cpu_dir);
|
|
||||||
*pdir ++= NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu_dir) {
|
|
||||||
remove_proc_entry(cpu_dir->name, palinfo_dir);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
|
static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
|
||||||
|
@ -1058,6 +1019,8 @@ palinfo_init(void)
|
||||||
|
|
||||||
printk(KERN_INFO "PAL Information Facility v%s\n", PALINFO_VERSION);
|
printk(KERN_INFO "PAL Information Facility v%s\n", PALINFO_VERSION);
|
||||||
palinfo_dir = proc_mkdir("pal", NULL);
|
palinfo_dir = proc_mkdir("pal", NULL);
|
||||||
|
if (!palinfo_dir)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
/* Create palinfo dirs in /proc for all online cpus */
|
/* Create palinfo dirs in /proc for all online cpus */
|
||||||
for_each_online_cpu(i) {
|
for_each_online_cpu(i) {
|
||||||
|
@ -1073,22 +1036,8 @@ palinfo_init(void)
|
||||||
static void __exit
|
static void __exit
|
||||||
palinfo_exit(void)
|
palinfo_exit(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
/* remove all nodes: depth first pass. Could optimize this */
|
|
||||||
for_each_online_cpu(i) {
|
|
||||||
remove_palinfo_proc_entries(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove the top level entry finally
|
|
||||||
*/
|
|
||||||
remove_proc_entry(palinfo_dir->name, NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unregister from cpu notifier callbacks
|
|
||||||
*/
|
|
||||||
unregister_hotcpu_notifier(&palinfo_cpu_notifier);
|
unregister_hotcpu_notifier(&palinfo_cpu_notifier);
|
||||||
|
remove_proc_subtree("pal", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(palinfo_init);
|
module_init(palinfo_init);
|
||||||
|
|
|
@ -86,4 +86,24 @@ static inline int gpio_cansleep(unsigned gpio)
|
||||||
return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);
|
return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = gpio_request(gpio, label);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
if (flags & GPIOF_DIR_IN)
|
||||||
|
err = gpio_direction_input(gpio);
|
||||||
|
else
|
||||||
|
err = gpio_direction_output(gpio,
|
||||||
|
(flags & GPIOF_INIT_HIGH) ? 1 : 0);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
gpio_free(gpio);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,7 +18,7 @@ config MIPS
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select HAVE_DEBUG_KMEMLEAK
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
select ARCH_BINFMT_ELF_RANDOMIZE_PIE
|
select ARCH_BINFMT_ELF_RANDOMIZE_PIE
|
||||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT
|
||||||
select RTC_LIB if !MACH_LOONGSON
|
select RTC_LIB if !MACH_LOONGSON
|
||||||
select GENERIC_ATOMIC64 if !64BIT
|
select GENERIC_ATOMIC64 if !64BIT
|
||||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||||
|
@ -657,7 +657,7 @@ config SNI_RM
|
||||||
bool "SNI RM200/300/400"
|
bool "SNI RM200/300/400"
|
||||||
select FW_ARC if CPU_LITTLE_ENDIAN
|
select FW_ARC if CPU_LITTLE_ENDIAN
|
||||||
select FW_ARC32 if CPU_LITTLE_ENDIAN
|
select FW_ARC32 if CPU_LITTLE_ENDIAN
|
||||||
select SNIPROM if CPU_BIG_ENDIAN
|
select FW_SNIPROM if CPU_BIG_ENDIAN
|
||||||
select ARCH_MAY_HAVE_PC_FDC
|
select ARCH_MAY_HAVE_PC_FDC
|
||||||
select BOOT_ELF32
|
select BOOT_ELF32
|
||||||
select CEVT_R4K
|
select CEVT_R4K
|
||||||
|
@ -1144,7 +1144,7 @@ config DEFAULT_SGI_PARTITION
|
||||||
config FW_ARC32
|
config FW_ARC32
|
||||||
bool
|
bool
|
||||||
|
|
||||||
config SNIPROM
|
config FW_SNIPROM
|
||||||
bool
|
bool
|
||||||
|
|
||||||
config BOOT_ELF32
|
config BOOT_ELF32
|
||||||
|
@ -1493,7 +1493,6 @@ config CPU_XLP
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
select CPU_SUPPORTS_64BIT_KERNEL
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
select CPU_SUPPORTS_HIGHMEM
|
select CPU_SUPPORTS_HIGHMEM
|
||||||
select CPU_HAS_LLSC
|
|
||||||
select WEAK_ORDERING
|
select WEAK_ORDERING
|
||||||
select WEAK_REORDERING_BEYOND_LLSC
|
select WEAK_REORDERING_BEYOND_LLSC
|
||||||
select CPU_HAS_PREFETCH
|
select CPU_HAS_PREFETCH
|
||||||
|
|
|
@ -745,10 +745,7 @@ void __init board_prom_init(void)
|
||||||
strcpy(cfe_version, "unknown");
|
strcpy(cfe_version, "unknown");
|
||||||
printk(KERN_INFO PFX "CFE version: %s\n", cfe_version);
|
printk(KERN_INFO PFX "CFE version: %s\n", cfe_version);
|
||||||
|
|
||||||
if (bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET)) {
|
bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET);
|
||||||
printk(KERN_ERR PFX "invalid nvram checksum\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
board_name = bcm63xx_nvram_get_name();
|
board_name = bcm63xx_nvram_get_name();
|
||||||
/* find board by name */
|
/* find board by name */
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct bcm963xx_nvram {
|
||||||
static struct bcm963xx_nvram nvram;
|
static struct bcm963xx_nvram nvram;
|
||||||
static int mac_addr_used;
|
static int mac_addr_used;
|
||||||
|
|
||||||
int __init bcm63xx_nvram_init(void *addr)
|
void __init bcm63xx_nvram_init(void *addr)
|
||||||
{
|
{
|
||||||
unsigned int check_len;
|
unsigned int check_len;
|
||||||
u32 crc, expected_crc;
|
u32 crc, expected_crc;
|
||||||
|
@ -60,9 +60,8 @@ int __init bcm63xx_nvram_init(void *addr)
|
||||||
crc = crc32_le(~0, (u8 *)&nvram, check_len);
|
crc = crc32_le(~0, (u8 *)&nvram, check_len);
|
||||||
|
|
||||||
if (crc != expected_crc)
|
if (crc != expected_crc)
|
||||||
return -EINVAL;
|
pr_warn("nvram checksum failed, contents may be invalid (expected %08x, got %08x)\n",
|
||||||
|
expected_crc, crc);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 *bcm63xx_nvram_get_name(void)
|
u8 *bcm63xx_nvram_get_name(void)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue