Merge branches 'common/clkfwk', 'common/pfc' and 'common/serial-rework' into sh-latest
This commit is contained in:
commit
0d376945d0
|
@ -206,16 +206,3 @@ Description:
|
||||||
when a discarded area is read the discard_zeroes_data
|
when a discarded area is read the discard_zeroes_data
|
||||||
parameter will be set to one. Otherwise it will be 0 and
|
parameter will be set to one. Otherwise it will be 0 and
|
||||||
the result of reading a discarded area is undefined.
|
the result of reading a discarded area is undefined.
|
||||||
What: /sys/block/<disk>/alias
|
|
||||||
Date: Aug 2011
|
|
||||||
Contact: Nao Nishijima <nao.nishijima.xt@hitachi.com>
|
|
||||||
Description:
|
|
||||||
A raw device name of a disk does not always point a same disk
|
|
||||||
each boot-up time. Therefore, users have to use persistent
|
|
||||||
device names, which udev creates when the kernel finds a disk,
|
|
||||||
instead of raw device name. However, kernel doesn't show those
|
|
||||||
persistent names on its messages (e.g. dmesg).
|
|
||||||
This file can store an alias of the disk and it would be
|
|
||||||
appeared in kernel messages if it is set. A disk can have an
|
|
||||||
alias which length is up to 255bytes. Users can use alphabets,
|
|
||||||
numbers, "-" and "_" in alias name. This file is writeonce.
|
|
||||||
|
|
|
@ -520,6 +520,11 @@ Here's a description of the fields of <varname>struct uio_mem</varname>:
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
<listitem><para>
|
||||||
|
<varname>const char *name</varname>: Optional. Set this to help identify
|
||||||
|
the memory region, it will show up in the corresponding sysfs node.
|
||||||
|
</para></listitem>
|
||||||
|
|
||||||
<listitem><para>
|
<listitem><para>
|
||||||
<varname>int memtype</varname>: Required if the mapping is used. Set this to
|
<varname>int memtype</varname>: Required if the mapping is used. Set this to
|
||||||
<varname>UIO_MEM_PHYS</varname> if you you have physical memory on your
|
<varname>UIO_MEM_PHYS</varname> if you you have physical memory on your
|
||||||
|
@ -553,7 +558,7 @@ instead to remember such an address.
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Please do not touch the <varname>kobj</varname> element of
|
Please do not touch the <varname>map</varname> element of
|
||||||
<varname>struct uio_mem</varname>! It is used by the UIO framework
|
<varname>struct uio_mem</varname>! It is used by the UIO framework
|
||||||
to set up sysfs files for this mapping. Simply leave it alone.
|
to set up sysfs files for this mapping. Simply leave it alone.
|
||||||
</para>
|
</para>
|
||||||
|
|
|
@ -98,14 +98,12 @@ You must enable "SCSI tape drive support for Smart Array 5xxx" and
|
||||||
"SCSI support" in your kernel configuration to be able to use SCSI
|
"SCSI support" in your kernel configuration to be able to use SCSI
|
||||||
tape drives with your Smart Array 5xxx controller.
|
tape drives with your Smart Array 5xxx controller.
|
||||||
|
|
||||||
Additionally, note that the driver will not engage the SCSI core at init
|
Additionally, note that the driver will engage the SCSI core at init
|
||||||
time. The driver must be directed to dynamically engage the SCSI core via
|
time if any tape drives or medium changers are detected. The driver may
|
||||||
the /proc filesystem entry which the "block" side of the driver creates as
|
also be directed to dynamically engage the SCSI core via the /proc filesystem
|
||||||
/proc/driver/cciss/cciss* at runtime. This is because at driver init time,
|
entry which the "block" side of the driver creates as
|
||||||
the SCSI core may not yet be initialized (because the driver is a block
|
/proc/driver/cciss/cciss* at runtime. This is best done via a script.
|
||||||
driver) and attempting to register it with the SCSI core in such a case
|
|
||||||
would cause a hang. This is best done via an initialization script
|
|
||||||
(typically in /etc/init.d, but could vary depending on distribution).
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
for x in /proc/driver/cciss/cciss[0-9]*
|
for x in /proc/driver/cciss/cciss[0-9]*
|
||||||
|
|
|
@ -1,22 +1,24 @@
|
||||||
The I2C protocol knows about two kinds of device addresses: normal 7 bit
|
The I2C protocol knows about two kinds of device addresses: normal 7 bit
|
||||||
addresses, and an extended set of 10 bit addresses. The sets of addresses
|
addresses, and an extended set of 10 bit addresses. The sets of addresses
|
||||||
do not intersect: the 7 bit address 0x10 is not the same as the 10 bit
|
do not intersect: the 7 bit address 0x10 is not the same as the 10 bit
|
||||||
address 0x10 (though a single device could respond to both of them). You
|
address 0x10 (though a single device could respond to both of them).
|
||||||
select a 10 bit address by adding an extra byte after the address
|
|
||||||
byte:
|
|
||||||
S Addr7 Rd/Wr ....
|
|
||||||
becomes
|
|
||||||
S 11110 Addr10 Rd/Wr
|
|
||||||
S is the start bit, Rd/Wr the read/write bit, and if you count the number
|
|
||||||
of bits, you will see the there are 8 after the S bit for 7 bit addresses,
|
|
||||||
and 16 after the S bit for 10 bit addresses.
|
|
||||||
|
|
||||||
WARNING! The current 10 bit address support is EXPERIMENTAL. There are
|
I2C messages to and from 10-bit address devices have a different format.
|
||||||
several places in the code that will cause SEVERE PROBLEMS with 10 bit
|
See the I2C specification for the details.
|
||||||
addresses, even though there is some basic handling and hooks. Also,
|
|
||||||
almost no supported adapter handles the 10 bit addresses correctly.
|
|
||||||
|
|
||||||
As soon as a real 10 bit address device is spotted 'in the wild', we
|
The current 10 bit address support is minimal. It should work, however
|
||||||
can and will add proper support. Right now, 10 bit address devices
|
you can expect some problems along the way:
|
||||||
are defined by the I2C protocol, but we have never seen a single device
|
* Not all bus drivers support 10-bit addresses. Some don't because the
|
||||||
which supports them.
|
hardware doesn't support them (SMBus doesn't require 10-bit address
|
||||||
|
support for example), some don't because nobody bothered adding the
|
||||||
|
code (or it's there but not working properly.) Software implementation
|
||||||
|
(i2c-algo-bit) is known to work.
|
||||||
|
* Some optional features do not support 10-bit addresses. This is the
|
||||||
|
case of automatic detection and instantiation of devices by their,
|
||||||
|
drivers, for example.
|
||||||
|
* Many user-space packages (for example i2c-tools) lack support for
|
||||||
|
10-bit addresses.
|
||||||
|
|
||||||
|
Note that 10-bit address devices are still pretty rare, so the limitations
|
||||||
|
listed above could stay for a long time, maybe even forever if nobody
|
||||||
|
needs them to be fixed.
|
||||||
|
|
|
@ -20,7 +20,7 @@ ip_no_pmtu_disc - BOOLEAN
|
||||||
default FALSE
|
default FALSE
|
||||||
|
|
||||||
min_pmtu - INTEGER
|
min_pmtu - INTEGER
|
||||||
default 562 - minimum discovered Path MTU
|
default 552 - minimum discovered Path MTU
|
||||||
|
|
||||||
route/max_size - INTEGER
|
route/max_size - INTEGER
|
||||||
Maximum number of routes allowed in the kernel. Increase
|
Maximum number of routes allowed in the kernel. Increase
|
||||||
|
|
|
@ -97,15 +97,23 @@
|
||||||
|
|
||||||
struct serial_rs485 rs485conf;
|
struct serial_rs485 rs485conf;
|
||||||
|
|
||||||
/* Set RS485 mode: */
|
/* Enable RS485 mode: */
|
||||||
rs485conf.flags |= SER_RS485_ENABLED;
|
rs485conf.flags |= SER_RS485_ENABLED;
|
||||||
|
|
||||||
|
/* Set logical level for RTS pin equal to 1 when sending: */
|
||||||
|
rs485conf.flags |= SER_RS485_RTS_ON_SEND;
|
||||||
|
/* or, set logical level for RTS pin equal to 0 when sending: */
|
||||||
|
rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
|
||||||
|
|
||||||
|
/* Set logical level for RTS pin equal to 1 after sending: */
|
||||||
|
rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
|
||||||
|
/* or, set logical level for RTS pin equal to 0 after sending: */
|
||||||
|
rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
|
||||||
|
|
||||||
/* Set rts delay before send, if needed: */
|
/* Set rts delay before send, if needed: */
|
||||||
rs485conf.flags |= SER_RS485_RTS_BEFORE_SEND;
|
|
||||||
rs485conf.delay_rts_before_send = ...;
|
rs485conf.delay_rts_before_send = ...;
|
||||||
|
|
||||||
/* Set rts delay after send, if needed: */
|
/* Set rts delay after send, if needed: */
|
||||||
rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
|
|
||||||
rs485conf.delay_rts_after_send = ...;
|
rs485conf.delay_rts_after_send = ...;
|
||||||
|
|
||||||
/* Set this flag if you want to receive data even whilst sending data */
|
/* Set this flag if you want to receive data even whilst sending data */
|
||||||
|
|
27
MAINTAINERS
27
MAINTAINERS
|
@ -1789,6 +1789,14 @@ F: include/net/cfg80211.h
|
||||||
F: net/wireless/*
|
F: net/wireless/*
|
||||||
X: net/wireless/wext*
|
X: net/wireless/wext*
|
||||||
|
|
||||||
|
CHAR and MISC DRIVERS
|
||||||
|
M: Arnd Bergmann <arnd@arndb.de>
|
||||||
|
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/char/*
|
||||||
|
F: drivers/misc/*
|
||||||
|
|
||||||
CHECKPATCH
|
CHECKPATCH
|
||||||
M: Andy Whitcroft <apw@canonical.com>
|
M: Andy Whitcroft <apw@canonical.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -1927,10 +1935,11 @@ S: Maintained
|
||||||
F: drivers/connector/
|
F: drivers/connector/
|
||||||
|
|
||||||
CONTROL GROUPS (CGROUPS)
|
CONTROL GROUPS (CGROUPS)
|
||||||
M: Paul Menage <paul@paulmenage.org>
|
M: Tejun Heo <tj@kernel.org>
|
||||||
M: Li Zefan <lizf@cn.fujitsu.com>
|
M: Li Zefan <lizf@cn.fujitsu.com>
|
||||||
L: containers@lists.linux-foundation.org
|
L: containers@lists.linux-foundation.org
|
||||||
L: cgroups@vger.kernel.org
|
L: cgroups@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/cgroup*
|
F: include/linux/cgroup*
|
||||||
F: kernel/cgroup*
|
F: kernel/cgroup*
|
||||||
|
@ -2585,7 +2594,7 @@ S: Maintained
|
||||||
F: drivers/net/ethernet/i825xx/eexpress.*
|
F: drivers/net/ethernet/i825xx/eexpress.*
|
||||||
|
|
||||||
ETHERNET BRIDGE
|
ETHERNET BRIDGE
|
||||||
M: Stephen Hemminger <shemminger@linux-foundation.org>
|
M: Stephen Hemminger <shemminger@vyatta.com>
|
||||||
L: bridge@lists.linux-foundation.org
|
L: bridge@lists.linux-foundation.org
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.linuxfoundation.org/en/Net:Bridge
|
W: http://www.linuxfoundation.org/en/Net:Bridge
|
||||||
|
@ -3719,7 +3728,7 @@ F: fs/jbd2/
|
||||||
F: include/linux/jbd2.h
|
F: include/linux/jbd2.h
|
||||||
|
|
||||||
JSM Neo PCI based serial card
|
JSM Neo PCI based serial card
|
||||||
M: Breno Leitao <leitao@linux.vnet.ibm.com>
|
M: Lucas Tavares <lucaskt@linux.vnet.ibm.com>
|
||||||
L: linux-serial@vger.kernel.org
|
L: linux-serial@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/tty/serial/jsm/
|
F: drivers/tty/serial/jsm/
|
||||||
|
@ -4472,7 +4481,7 @@ S: Supported
|
||||||
F: drivers/infiniband/hw/nes/
|
F: drivers/infiniband/hw/nes/
|
||||||
|
|
||||||
NETEM NETWORK EMULATOR
|
NETEM NETWORK EMULATOR
|
||||||
M: Stephen Hemminger <shemminger@linux-foundation.org>
|
M: Stephen Hemminger <shemminger@vyatta.com>
|
||||||
L: netem@lists.linux-foundation.org
|
L: netem@lists.linux-foundation.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: net/sched/sch_netem.c
|
F: net/sched/sch_netem.c
|
||||||
|
@ -4949,7 +4958,7 @@ F: drivers/char/ppdev.c
|
||||||
F: include/linux/ppdev.h
|
F: include/linux/ppdev.h
|
||||||
|
|
||||||
PARAVIRT_OPS INTERFACE
|
PARAVIRT_OPS INTERFACE
|
||||||
M: Jeremy Fitzhardinge <jeremy@xensource.com>
|
M: Jeremy Fitzhardinge <jeremy@goop.org>
|
||||||
M: Chris Wright <chrisw@sous-sol.org>
|
M: Chris Wright <chrisw@sous-sol.org>
|
||||||
M: Alok Kataria <akataria@vmware.com>
|
M: Alok Kataria <akataria@vmware.com>
|
||||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||||
|
@ -5658,7 +5667,6 @@ F: drivers/media/video/*7146*
|
||||||
F: include/media/*7146*
|
F: include/media/*7146*
|
||||||
|
|
||||||
SAMSUNG AUDIO (ASoC) DRIVERS
|
SAMSUNG AUDIO (ASoC) DRIVERS
|
||||||
M: Jassi Brar <jassisinghbrar@gmail.com>
|
|
||||||
M: Sangbeom Kim <sbkim73@samsung.com>
|
M: Sangbeom Kim <sbkim73@samsung.com>
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -5987,7 +5995,7 @@ S: Maintained
|
||||||
F: drivers/usb/misc/sisusbvga/
|
F: drivers/usb/misc/sisusbvga/
|
||||||
|
|
||||||
SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
|
SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
|
||||||
M: Stephen Hemminger <shemminger@linux-foundation.org>
|
M: Stephen Hemminger <shemminger@vyatta.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/marvell/sk*
|
F: drivers/net/ethernet/marvell/sk*
|
||||||
|
@ -7401,8 +7409,8 @@ S: Maintained
|
||||||
F: arch/x86/kernel/cpu/mcheck/*
|
F: arch/x86/kernel/cpu/mcheck/*
|
||||||
|
|
||||||
XEN HYPERVISOR INTERFACE
|
XEN HYPERVISOR INTERFACE
|
||||||
M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
|
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||||
|
M: Jeremy Fitzhardinge <jeremy@goop.org>
|
||||||
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||||
L: virtualization@lists.linux-foundation.org
|
L: virtualization@lists.linux-foundation.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -7435,7 +7443,8 @@ F: drivers/xen/*swiotlb*
|
||||||
|
|
||||||
XFS FILESYSTEM
|
XFS FILESYSTEM
|
||||||
P: Silicon Graphics Inc
|
P: Silicon Graphics Inc
|
||||||
M: Alex Elder <aelder@sgi.com>
|
M: Ben Myers <bpm@sgi.com>
|
||||||
|
M: Alex Elder <elder@kernel.org>
|
||||||
M: xfs-masters@oss.sgi.com
|
M: xfs-masters@oss.sgi.com
|
||||||
L: xfs@oss.sgi.com
|
L: xfs@oss.sgi.com
|
||||||
W: http://oss.sgi.com/projects/xfs
|
W: http://oss.sgi.com/projects/xfs
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 2
|
PATCHLEVEL = 2
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc3
|
||||||
NAME = Saber-toothed Squirrel
|
NAME = Saber-toothed Squirrel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -65,6 +65,8 @@ $(obj)/%.dtb: $(src)/dts/%.dts
|
||||||
|
|
||||||
$(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y))
|
$(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y))
|
||||||
|
|
||||||
|
clean-files := *.dtb
|
||||||
|
|
||||||
quiet_cmd_uimage = UIMAGE $@
|
quiet_cmd_uimage = UIMAGE $@
|
||||||
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
|
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
|
||||||
-C none -a $(LOADADDR) -e $(STARTADDR) \
|
-C none -a $(LOADADDR) -e $(STARTADDR) \
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#ifndef __ASM_ARM_HARDWARE_L2X0_H
|
#ifndef __ASM_ARM_HARDWARE_L2X0_H
|
||||||
#define __ASM_ARM_HARDWARE_L2X0_H
|
#define __ASM_ARM_HARDWARE_L2X0_H
|
||||||
|
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
#define L2X0_CACHE_ID 0x000
|
#define L2X0_CACHE_ID 0x000
|
||||||
#define L2X0_CACHE_TYPE 0x004
|
#define L2X0_CACHE_TYPE 0x004
|
||||||
#define L2X0_CTRL 0x100
|
#define L2X0_CTRL 0x100
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
struct tag;
|
struct tag;
|
||||||
struct meminfo;
|
struct meminfo;
|
||||||
struct sys_timer;
|
struct sys_timer;
|
||||||
|
struct pt_regs;
|
||||||
|
|
||||||
struct machine_desc {
|
struct machine_desc {
|
||||||
unsigned int nr; /* architecture number */
|
unsigned int nr; /* architecture number */
|
||||||
|
|
|
@ -402,6 +402,8 @@
|
||||||
#define __NR_syncfs (__NR_SYSCALL_BASE+373)
|
#define __NR_syncfs (__NR_SYSCALL_BASE+373)
|
||||||
#define __NR_sendmmsg (__NR_SYSCALL_BASE+374)
|
#define __NR_sendmmsg (__NR_SYSCALL_BASE+374)
|
||||||
#define __NR_setns (__NR_SYSCALL_BASE+375)
|
#define __NR_setns (__NR_SYSCALL_BASE+375)
|
||||||
|
#define __NR_process_vm_readv (__NR_SYSCALL_BASE+376)
|
||||||
|
#define __NR_process_vm_writev (__NR_SYSCALL_BASE+377)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following SWIs are ARM private.
|
* The following SWIs are ARM private.
|
||||||
|
|
|
@ -385,6 +385,8 @@
|
||||||
CALL(sys_syncfs)
|
CALL(sys_syncfs)
|
||||||
CALL(sys_sendmmsg)
|
CALL(sys_sendmmsg)
|
||||||
/* 375 */ CALL(sys_setns)
|
/* 375 */ CALL(sys_setns)
|
||||||
|
CALL(sys_process_vm_readv)
|
||||||
|
CALL(sys_process_vm_writev)
|
||||||
#ifndef syscalls_counted
|
#ifndef syscalls_counted
|
||||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||||
#define syscalls_counted
|
#define syscalls_counted
|
||||||
|
|
|
@ -360,7 +360,7 @@ __secondary_data:
|
||||||
* r13 = *virtual* address to jump to upon completion
|
* r13 = *virtual* address to jump to upon completion
|
||||||
*/
|
*/
|
||||||
__enable_mmu:
|
__enable_mmu:
|
||||||
#ifdef CONFIG_ALIGNMENT_TRAP
|
#if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6
|
||||||
orr r0, r0, #CR_A
|
orr r0, r0, #CR_A
|
||||||
#else
|
#else
|
||||||
bic r0, r0, #CR_A
|
bic r0, r0, #CR_A
|
||||||
|
|
|
@ -32,24 +32,6 @@ static atomic_t waiting_for_crash_ipi;
|
||||||
|
|
||||||
int machine_kexec_prepare(struct kimage *image)
|
int machine_kexec_prepare(struct kimage *image)
|
||||||
{
|
{
|
||||||
unsigned long page_list;
|
|
||||||
void *reboot_code_buffer;
|
|
||||||
page_list = image->head & PAGE_MASK;
|
|
||||||
|
|
||||||
reboot_code_buffer = page_address(image->control_code_page);
|
|
||||||
|
|
||||||
/* Prepare parameters for reboot_code_buffer*/
|
|
||||||
kexec_start_address = image->start;
|
|
||||||
kexec_indirection_page = page_list;
|
|
||||||
kexec_mach_type = machine_arch_type;
|
|
||||||
kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET;
|
|
||||||
|
|
||||||
/* copy our kernel relocation code to the control code page */
|
|
||||||
memcpy(reboot_code_buffer,
|
|
||||||
relocate_new_kernel, relocate_new_kernel_size);
|
|
||||||
|
|
||||||
flush_icache_range((unsigned long) reboot_code_buffer,
|
|
||||||
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,14 +82,31 @@ void (*kexec_reinit)(void);
|
||||||
|
|
||||||
void machine_kexec(struct kimage *image)
|
void machine_kexec(struct kimage *image)
|
||||||
{
|
{
|
||||||
|
unsigned long page_list;
|
||||||
unsigned long reboot_code_buffer_phys;
|
unsigned long reboot_code_buffer_phys;
|
||||||
void *reboot_code_buffer;
|
void *reboot_code_buffer;
|
||||||
|
|
||||||
|
|
||||||
|
page_list = image->head & PAGE_MASK;
|
||||||
|
|
||||||
/* we need both effective and real address here */
|
/* we need both effective and real address here */
|
||||||
reboot_code_buffer_phys =
|
reboot_code_buffer_phys =
|
||||||
page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
||||||
reboot_code_buffer = page_address(image->control_code_page);
|
reboot_code_buffer = page_address(image->control_code_page);
|
||||||
|
|
||||||
|
/* Prepare parameters for reboot_code_buffer*/
|
||||||
|
kexec_start_address = image->start;
|
||||||
|
kexec_indirection_page = page_list;
|
||||||
|
kexec_mach_type = machine_arch_type;
|
||||||
|
kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET;
|
||||||
|
|
||||||
|
/* copy our kernel relocation code to the control code page */
|
||||||
|
memcpy(reboot_code_buffer,
|
||||||
|
relocate_new_kernel, relocate_new_kernel_size);
|
||||||
|
|
||||||
|
|
||||||
|
flush_icache_range((unsigned long) reboot_code_buffer,
|
||||||
|
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
|
||||||
printk(KERN_INFO "Bye!\n");
|
printk(KERN_INFO "Bye!\n");
|
||||||
|
|
||||||
if (kexec_reinit)
|
if (kexec_reinit)
|
||||||
|
|
|
@ -461,8 +461,10 @@ static void __init setup_processor(void)
|
||||||
cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
|
cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
|
||||||
proc_arch[cpu_architecture()], cr_alignment);
|
proc_arch[cpu_architecture()], cr_alignment);
|
||||||
|
|
||||||
sprintf(init_utsname()->machine, "%s%c", list->arch_name, ENDIANNESS);
|
snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c",
|
||||||
sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
|
list->arch_name, ENDIANNESS);
|
||||||
|
snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
|
||||||
|
list->elf_name, ENDIANNESS);
|
||||||
elf_hwcap = list->elf_hwcap;
|
elf_hwcap = list->elf_hwcap;
|
||||||
#ifndef CONFIG_ARM_THUMB
|
#ifndef CONFIG_ARM_THUMB
|
||||||
elf_hwcap &= ~HWCAP_THUMB;
|
elf_hwcap &= ~HWCAP_THUMB;
|
||||||
|
|
|
@ -235,7 +235,7 @@ void __init bcmring_init_timer(void)
|
||||||
*/
|
*/
|
||||||
bcmring_clocksource_init();
|
bcmring_clocksource_init();
|
||||||
|
|
||||||
sp804_clockevents_register(TIMER0_VA_BASE, IRQ_TIMER0, "timer0");
|
sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMER0, "timer0");
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sys_timer bcmring_timer = {
|
struct sys_timer bcmring_timer = {
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/pfn.h>
|
#include <linux/pfn.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
#include <mach/dma.h>
|
#include <mach/dma.h>
|
||||||
|
|
||||||
/* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */
|
/* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */
|
||||||
|
|
|
@ -411,11 +411,11 @@ static struct clk *fsibckcr_parent[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
||||||
[DIV6_HDMI] = SH_CLK_DIV6_EXT(&pllc1_div2_clk, HDMICKCR, 0,
|
[DIV6_HDMI] = SH_CLK_DIV6_EXT(HDMICKCR, 0,
|
||||||
hdmi_parent, ARRAY_SIZE(hdmi_parent), 6, 2),
|
hdmi_parent, ARRAY_SIZE(hdmi_parent), 6, 2),
|
||||||
[DIV6_FSIA] = SH_CLK_DIV6_EXT(&pllc1_div2_clk, FSIACKCR, 0,
|
[DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0,
|
||||||
fsiackcr_parent, ARRAY_SIZE(fsiackcr_parent), 6, 2),
|
fsiackcr_parent, ARRAY_SIZE(fsiackcr_parent), 6, 2),
|
||||||
[DIV6_FSIB] = SH_CLK_DIV6_EXT(&pllc1_div2_clk, FSIBCKCR, 0,
|
[DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0,
|
||||||
fsibckcr_parent, ARRAY_SIZE(fsibckcr_parent), 6, 2),
|
fsibckcr_parent, ARRAY_SIZE(fsibckcr_parent), 6, 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,24 @@ static struct clk_ops div2_clk_ops = {
|
||||||
.recalc = div2_recalc,
|
.recalc = div2_recalc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static unsigned long div7_recalc(struct clk *clk)
|
||||||
|
{
|
||||||
|
return clk->parent->rate / 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct clk_ops div7_clk_ops = {
|
||||||
|
.recalc = div7_recalc,
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned long div13_recalc(struct clk *clk)
|
||||||
|
{
|
||||||
|
return clk->parent->rate / 13;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct clk_ops div13_clk_ops = {
|
||||||
|
.recalc = div13_recalc,
|
||||||
|
};
|
||||||
|
|
||||||
/* Divide extal1 by two */
|
/* Divide extal1 by two */
|
||||||
static struct clk extal1_div2_clk = {
|
static struct clk extal1_div2_clk = {
|
||||||
.ops = &div2_clk_ops,
|
.ops = &div2_clk_ops,
|
||||||
|
@ -113,6 +131,11 @@ static struct clk main_clk = {
|
||||||
.ops = &main_clk_ops,
|
.ops = &main_clk_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk main_div2_clk = {
|
||||||
|
.ops = &div2_clk_ops,
|
||||||
|
.parent = &main_clk,
|
||||||
|
};
|
||||||
|
|
||||||
/* PLL0, PLL1, PLL2, PLL3 */
|
/* PLL0, PLL1, PLL2, PLL3 */
|
||||||
static unsigned long pll_recalc(struct clk *clk)
|
static unsigned long pll_recalc(struct clk *clk)
|
||||||
{
|
{
|
||||||
|
@ -168,12 +191,29 @@ static struct clk pll3_clk = {
|
||||||
.enable_bit = 3,
|
.enable_bit = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Divide PLL1 by two */
|
/* Divide PLL */
|
||||||
static struct clk pll1_div2_clk = {
|
static struct clk pll1_div2_clk = {
|
||||||
.ops = &div2_clk_ops,
|
.ops = &div2_clk_ops,
|
||||||
.parent = &pll1_clk,
|
.parent = &pll1_clk,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk pll1_div7_clk = {
|
||||||
|
.ops = &div7_clk_ops,
|
||||||
|
.parent = &pll1_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk pll1_div13_clk = {
|
||||||
|
.ops = &div13_clk_ops,
|
||||||
|
.parent = &pll1_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* External input clock */
|
||||||
|
struct clk sh73a0_extcki_clk = {
|
||||||
|
};
|
||||||
|
|
||||||
|
struct clk sh73a0_extalr_clk = {
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk *main_clks[] = {
|
static struct clk *main_clks[] = {
|
||||||
&r_clk,
|
&r_clk,
|
||||||
&sh73a0_extal1_clk,
|
&sh73a0_extal1_clk,
|
||||||
|
@ -181,11 +221,16 @@ static struct clk *main_clks[] = {
|
||||||
&extal1_div2_clk,
|
&extal1_div2_clk,
|
||||||
&extal2_div2_clk,
|
&extal2_div2_clk,
|
||||||
&main_clk,
|
&main_clk,
|
||||||
|
&main_div2_clk,
|
||||||
&pll0_clk,
|
&pll0_clk,
|
||||||
&pll1_clk,
|
&pll1_clk,
|
||||||
&pll2_clk,
|
&pll2_clk,
|
||||||
&pll3_clk,
|
&pll3_clk,
|
||||||
&pll1_div2_clk,
|
&pll1_div2_clk,
|
||||||
|
&pll1_div7_clk,
|
||||||
|
&pll1_div13_clk,
|
||||||
|
&sh73a0_extcki_clk,
|
||||||
|
&sh73a0_extalr_clk,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void div4_kick(struct clk *clk)
|
static void div4_kick(struct clk *clk)
|
||||||
|
@ -239,27 +284,84 @@ enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1,
|
||||||
DIV6_DSIT, DIV6_DSI0P, DIV6_DSI1P,
|
DIV6_DSIT, DIV6_DSI0P, DIV6_DSI1P,
|
||||||
DIV6_NR };
|
DIV6_NR };
|
||||||
|
|
||||||
|
static struct clk *vck_parent[8] = {
|
||||||
|
[0] = &pll1_div2_clk,
|
||||||
|
[1] = &pll2_clk,
|
||||||
|
[2] = &sh73a0_extcki_clk,
|
||||||
|
[3] = &sh73a0_extal2_clk,
|
||||||
|
[4] = &main_div2_clk,
|
||||||
|
[5] = &sh73a0_extalr_clk,
|
||||||
|
[6] = &main_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *pll_parent[4] = {
|
||||||
|
[0] = &pll1_div2_clk,
|
||||||
|
[1] = &pll2_clk,
|
||||||
|
[2] = &pll1_div13_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *hsi_parent[4] = {
|
||||||
|
[0] = &pll1_div2_clk,
|
||||||
|
[1] = &pll2_clk,
|
||||||
|
[2] = &pll1_div7_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *pll_extal2_parent[] = {
|
||||||
|
[0] = &pll1_div2_clk,
|
||||||
|
[1] = &pll2_clk,
|
||||||
|
[2] = &sh73a0_extal2_clk,
|
||||||
|
[3] = &sh73a0_extal2_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *dsi_parent[8] = {
|
||||||
|
[0] = &pll1_div2_clk,
|
||||||
|
[1] = &pll2_clk,
|
||||||
|
[2] = &main_clk,
|
||||||
|
[3] = &sh73a0_extal2_clk,
|
||||||
|
[4] = &sh73a0_extcki_clk,
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk div6_clks[DIV6_NR] = {
|
static struct clk div6_clks[DIV6_NR] = {
|
||||||
[DIV6_VCK1] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR1, 0),
|
[DIV6_VCK1] = SH_CLK_DIV6_EXT(VCLKCR1, 0,
|
||||||
[DIV6_VCK2] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR2, 0),
|
vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
|
||||||
[DIV6_VCK3] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR3, 0),
|
[DIV6_VCK2] = SH_CLK_DIV6_EXT(VCLKCR2, 0,
|
||||||
[DIV6_ZB1] = SH_CLK_DIV6(&pll1_div2_clk, ZBCKCR, 0),
|
vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
|
||||||
[DIV6_FLCTL] = SH_CLK_DIV6(&pll1_div2_clk, FLCKCR, 0),
|
[DIV6_VCK3] = SH_CLK_DIV6_EXT(VCLKCR3, 0,
|
||||||
[DIV6_SDHI0] = SH_CLK_DIV6(&pll1_div2_clk, SD0CKCR, 0),
|
vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
|
||||||
[DIV6_SDHI1] = SH_CLK_DIV6(&pll1_div2_clk, SD1CKCR, 0),
|
[DIV6_ZB1] = SH_CLK_DIV6_EXT(ZBCKCR, 0,
|
||||||
[DIV6_SDHI2] = SH_CLK_DIV6(&pll1_div2_clk, SD2CKCR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
|
||||||
[DIV6_FSIA] = SH_CLK_DIV6(&pll1_div2_clk, FSIACKCR, 0),
|
[DIV6_FLCTL] = SH_CLK_DIV6_EXT(FLCKCR, 0,
|
||||||
[DIV6_FSIB] = SH_CLK_DIV6(&pll1_div2_clk, FSIBCKCR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
|
||||||
[DIV6_SUB] = SH_CLK_DIV6(&sh73a0_extal2_clk, SUBCKCR, 0),
|
[DIV6_SDHI0] = SH_CLK_DIV6_EXT(SD0CKCR, 0,
|
||||||
[DIV6_SPUA] = SH_CLK_DIV6(&pll1_div2_clk, SPUACKCR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
|
||||||
[DIV6_SPUV] = SH_CLK_DIV6(&pll1_div2_clk, SPUVCKCR, 0),
|
[DIV6_SDHI1] = SH_CLK_DIV6_EXT(SD1CKCR, 0,
|
||||||
[DIV6_MSU] = SH_CLK_DIV6(&pll1_div2_clk, MSUCKCR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
|
||||||
[DIV6_HSI] = SH_CLK_DIV6(&pll1_div2_clk, HSICKCR, 0),
|
[DIV6_SDHI2] = SH_CLK_DIV6_EXT(SD2CKCR, 0,
|
||||||
[DIV6_MFG1] = SH_CLK_DIV6(&pll1_div2_clk, MFCK1CR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
|
||||||
[DIV6_MFG2] = SH_CLK_DIV6(&pll1_div2_clk, MFCK2CR, 0),
|
[DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0,
|
||||||
[DIV6_DSIT] = SH_CLK_DIV6(&pll1_div2_clk, DSITCKCR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 6, 1),
|
||||||
[DIV6_DSI0P] = SH_CLK_DIV6(&pll1_div2_clk, DSI0PCKCR, 0),
|
[DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0,
|
||||||
[DIV6_DSI1P] = SH_CLK_DIV6(&pll1_div2_clk, DSI1PCKCR, 0),
|
pll_parent, ARRAY_SIZE(pll_parent), 6, 1),
|
||||||
|
[DIV6_SUB] = SH_CLK_DIV6_EXT(SUBCKCR, 0,
|
||||||
|
pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
|
||||||
|
[DIV6_SPUA] = SH_CLK_DIV6_EXT(SPUACKCR, 0,
|
||||||
|
pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
|
||||||
|
[DIV6_SPUV] = SH_CLK_DIV6_EXT(SPUVCKCR, 0,
|
||||||
|
pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
|
||||||
|
[DIV6_MSU] = SH_CLK_DIV6_EXT(MSUCKCR, 0,
|
||||||
|
pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
|
||||||
|
[DIV6_HSI] = SH_CLK_DIV6_EXT(HSICKCR, 0,
|
||||||
|
hsi_parent, ARRAY_SIZE(hsi_parent), 6, 2),
|
||||||
|
[DIV6_MFG1] = SH_CLK_DIV6_EXT(MFCK1CR, 0,
|
||||||
|
pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
|
||||||
|
[DIV6_MFG2] = SH_CLK_DIV6_EXT(MFCK2CR, 0,
|
||||||
|
pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
|
||||||
|
[DIV6_DSIT] = SH_CLK_DIV6_EXT(DSITCKCR, 0,
|
||||||
|
pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
|
||||||
|
[DIV6_DSI0P] = SH_CLK_DIV6_EXT(DSI0PCKCR, 0,
|
||||||
|
dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),
|
||||||
|
[DIV6_DSI1P] = SH_CLK_DIV6_EXT(DSI1PCKCR, 0,
|
||||||
|
dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { MSTP001,
|
enum { MSTP001,
|
||||||
|
@ -387,7 +489,7 @@ void __init sh73a0_clock_init(void)
|
||||||
ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
|
ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = sh_clk_div6_register(div6_clks, DIV6_NR);
|
ret = sh_clk_div6_reparent_register(div6_clks, DIV6_NR);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
|
ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
|
||||||
|
|
|
@ -47,6 +47,8 @@ extern void sh73a0_clock_init(void);
|
||||||
extern void sh73a0_pinmux_init(void);
|
extern void sh73a0_pinmux_init(void);
|
||||||
extern struct clk sh73a0_extal1_clk;
|
extern struct clk sh73a0_extal1_clk;
|
||||||
extern struct clk sh73a0_extal2_clk;
|
extern struct clk sh73a0_extal2_clk;
|
||||||
|
extern struct clk sh73a0_extcki_clk;
|
||||||
|
extern struct clk sh73a0_extalr_clk;
|
||||||
|
|
||||||
extern unsigned int sh73a0_get_core_count(void);
|
extern unsigned int sh73a0_get_core_count(void);
|
||||||
extern void sh73a0_secondary_init(unsigned int cpu);
|
extern void sh73a0_secondary_init(unsigned int cpu);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/bitrev.h>
|
#include <linux/bitrev.h>
|
||||||
|
#include <linux/console.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
@ -106,9 +107,8 @@ static int pd_power_down(struct generic_pm_domain *genpd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pd_power_up(struct generic_pm_domain *genpd)
|
static int __pd_power_up(struct sh7372_pm_domain *sh7372_pd, bool do_resume)
|
||||||
{
|
{
|
||||||
struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd);
|
|
||||||
unsigned int mask = 1 << sh7372_pd->bit_shift;
|
unsigned int mask = 1 << sh7372_pd->bit_shift;
|
||||||
unsigned int retry_count;
|
unsigned int retry_count;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -123,13 +123,13 @@ static int pd_power_up(struct generic_pm_domain *genpd)
|
||||||
|
|
||||||
for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) {
|
for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) {
|
||||||
if (!(__raw_readl(SWUCR) & mask))
|
if (!(__raw_readl(SWUCR) & mask))
|
||||||
goto out;
|
break;
|
||||||
if (retry_count > PSTR_RETRIES)
|
if (retry_count > PSTR_RETRIES)
|
||||||
udelay(PSTR_DELAY_US);
|
udelay(PSTR_DELAY_US);
|
||||||
else
|
else
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
}
|
||||||
if (__raw_readl(SWUCR) & mask)
|
if (!retry_count)
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
if (!sh7372_pd->no_debug)
|
if (!sh7372_pd->no_debug)
|
||||||
|
@ -137,12 +137,17 @@ static int pd_power_up(struct generic_pm_domain *genpd)
|
||||||
mask, __raw_readl(PSTR));
|
mask, __raw_readl(PSTR));
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (ret == 0 && sh7372_pd->resume)
|
if (ret == 0 && sh7372_pd->resume && do_resume)
|
||||||
sh7372_pd->resume();
|
sh7372_pd->resume();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pd_power_up(struct generic_pm_domain *genpd)
|
||||||
|
{
|
||||||
|
return __pd_power_up(to_sh7372_pd(genpd), true);
|
||||||
|
}
|
||||||
|
|
||||||
static void sh7372_a4r_suspend(void)
|
static void sh7372_a4r_suspend(void)
|
||||||
{
|
{
|
||||||
sh7372_intcs_suspend();
|
sh7372_intcs_suspend();
|
||||||
|
@ -174,7 +179,7 @@ void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd)
|
||||||
genpd->active_wakeup = pd_active_wakeup;
|
genpd->active_wakeup = pd_active_wakeup;
|
||||||
genpd->power_off = pd_power_down;
|
genpd->power_off = pd_power_down;
|
||||||
genpd->power_on = pd_power_up;
|
genpd->power_on = pd_power_up;
|
||||||
genpd->power_on(&sh7372_pd->genpd);
|
__pd_power_up(sh7372_pd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd,
|
void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd,
|
||||||
|
@ -227,11 +232,23 @@ struct sh7372_pm_domain sh7372_a3sp = {
|
||||||
.no_debug = true,
|
.no_debug = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void sh7372_a3sp_init(void)
|
||||||
|
{
|
||||||
|
/* serial consoles make use of SCIF hardware located in A3SP,
|
||||||
|
* keep such power domain on if "no_console_suspend" is set.
|
||||||
|
*/
|
||||||
|
sh7372_a3sp.stay_on = !console_suspend_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
struct sh7372_pm_domain sh7372_a3sg = {
|
struct sh7372_pm_domain sh7372_a3sg = {
|
||||||
.bit_shift = 13,
|
.bit_shift = 13,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* CONFIG_PM */
|
#else /* !CONFIG_PM */
|
||||||
|
|
||||||
|
static inline void sh7372_a3sp_init(void) {}
|
||||||
|
|
||||||
|
#endif /* !CONFIG_PM */
|
||||||
|
|
||||||
#if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE)
|
#if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE)
|
||||||
static int sh7372_do_idle_core_standby(unsigned long unused)
|
static int sh7372_do_idle_core_standby(unsigned long unused)
|
||||||
|
@ -465,6 +482,8 @@ void __init sh7372_pm_init(void)
|
||||||
/* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */
|
/* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */
|
||||||
__raw_writel(0, PDNSEL);
|
__raw_writel(0, PDNSEL);
|
||||||
|
|
||||||
|
sh7372_a3sp_init();
|
||||||
|
|
||||||
sh7372_suspend_init();
|
sh7372_suspend_init();
|
||||||
sh7372_cpuidle_init();
|
sh7372_cpuidle_init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -422,7 +422,7 @@ struct platform_device nuc900_device_kpi = {
|
||||||
|
|
||||||
/* LCD controller*/
|
/* LCD controller*/
|
||||||
|
|
||||||
static struct nuc900fb_display __initdata nuc900_lcd_info[] = {
|
static struct nuc900fb_display nuc900_lcd_info[] = {
|
||||||
/* Giantplus Technology GPM1040A0 320x240 Color TFT LCD */
|
/* Giantplus Technology GPM1040A0 320x240 Color TFT LCD */
|
||||||
[0] = {
|
[0] = {
|
||||||
.type = LCM_DCCS_VA_SRC_RGB565,
|
.type = LCM_DCCS_VA_SRC_RGB565,
|
||||||
|
@ -445,7 +445,7 @@ static struct nuc900fb_display __initdata nuc900_lcd_info[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nuc900fb_mach_info nuc900_fb_info __initdata = {
|
static struct nuc900fb_mach_info nuc900_fb_info = {
|
||||||
#if defined(CONFIG_GPM1040A0_320X240)
|
#if defined(CONFIG_GPM1040A0_320X240)
|
||||||
.displays = &nuc900_lcd_info[0],
|
.displays = &nuc900_lcd_info[0],
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
extern void mfp_set_groupf(struct device *dev);
|
extern void mfp_set_groupf(struct device *dev);
|
||||||
extern void mfp_set_groupc(struct device *dev);
|
extern void mfp_set_groupc(struct device *dev);
|
||||||
extern void mfp_set_groupi(struct device *dev);
|
extern void mfp_set_groupi(struct device *dev);
|
||||||
extern void mfp_set_groupg(struct device *dev);
|
extern void mfp_set_groupg(struct device *dev, const char *subname);
|
||||||
|
extern void mfp_set_groupd(struct device *dev, const char *subname);
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_MFP_H */
|
#endif /* __ASM_ARCH_MFP_H */
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#ifndef __ASM_ARCH_SPI_H
|
#ifndef __ASM_ARCH_SPI_H
|
||||||
#define __ASM_ARCH_SPI_H
|
#define __ASM_ARCH_SPI_H
|
||||||
|
|
||||||
extern void mfp_set_groupg(struct device *dev);
|
extern void mfp_set_groupg(struct device *dev, const char *subname);
|
||||||
|
|
||||||
struct nuc900_spi_info {
|
struct nuc900_spi_info {
|
||||||
unsigned int num_cs;
|
unsigned int num_cs;
|
||||||
|
|
|
@ -26,10 +26,8 @@
|
||||||
#define REG_MFSEL (W90X900_VA_GCR + 0xC)
|
#define REG_MFSEL (W90X900_VA_GCR + 0xC)
|
||||||
|
|
||||||
#define GPSELF (0x01 << 1)
|
#define GPSELF (0x01 << 1)
|
||||||
|
|
||||||
#define GPSELC (0x03 << 2)
|
#define GPSELC (0x03 << 2)
|
||||||
#define ENKPI (0x02 << 2)
|
#define GPSELD (0x0f << 4)
|
||||||
#define ENNAND (0x01 << 2)
|
|
||||||
|
|
||||||
#define GPSELEI0 (0x01 << 26)
|
#define GPSELEI0 (0x01 << 26)
|
||||||
#define GPSELEI1 (0x01 << 27)
|
#define GPSELEI1 (0x01 << 27)
|
||||||
|
@ -37,11 +35,16 @@
|
||||||
#define GPIOG0TO1 (0x03 << 14)
|
#define GPIOG0TO1 (0x03 << 14)
|
||||||
#define GPIOG2TO3 (0x03 << 16)
|
#define GPIOG2TO3 (0x03 << 16)
|
||||||
#define GPIOG22TO23 (0x03 << 22)
|
#define GPIOG22TO23 (0x03 << 22)
|
||||||
|
#define GPIOG18TO20 (0x07 << 18)
|
||||||
|
|
||||||
#define ENSPI (0x0a << 14)
|
#define ENSPI (0x0a << 14)
|
||||||
#define ENI2C0 (0x01 << 14)
|
#define ENI2C0 (0x01 << 14)
|
||||||
#define ENI2C1 (0x01 << 16)
|
#define ENI2C1 (0x01 << 16)
|
||||||
#define ENAC97 (0x02 << 22)
|
#define ENAC97 (0x02 << 22)
|
||||||
|
#define ENSD1 (0x02 << 18)
|
||||||
|
#define ENSD0 (0x0a << 4)
|
||||||
|
#define ENKPI (0x02 << 2)
|
||||||
|
#define ENNAND (0x01 << 2)
|
||||||
|
|
||||||
static DEFINE_MUTEX(mfp_mutex);
|
static DEFINE_MUTEX(mfp_mutex);
|
||||||
|
|
||||||
|
@ -127,15 +130,18 @@ void mfp_set_groupi(struct device *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mfp_set_groupi);
|
EXPORT_SYMBOL(mfp_set_groupi);
|
||||||
|
|
||||||
void mfp_set_groupg(struct device *dev)
|
void mfp_set_groupg(struct device *dev, const char *subname)
|
||||||
{
|
{
|
||||||
unsigned long mfpen;
|
unsigned long mfpen;
|
||||||
const char *dev_id;
|
const char *dev_id;
|
||||||
|
|
||||||
BUG_ON(!dev);
|
BUG_ON((!dev) && (!subname));
|
||||||
|
|
||||||
mutex_lock(&mfp_mutex);
|
mutex_lock(&mfp_mutex);
|
||||||
|
|
||||||
|
if (subname != NULL)
|
||||||
|
dev_id = subname;
|
||||||
|
else
|
||||||
dev_id = dev_name(dev);
|
dev_id = dev_name(dev);
|
||||||
|
|
||||||
mfpen = __raw_readl(REG_MFSEL);
|
mfpen = __raw_readl(REG_MFSEL);
|
||||||
|
@ -152,6 +158,9 @@ void mfp_set_groupg(struct device *dev)
|
||||||
} else if (strcmp(dev_id, "nuc900-audio") == 0) {
|
} else if (strcmp(dev_id, "nuc900-audio") == 0) {
|
||||||
mfpen &= ~(GPIOG22TO23);
|
mfpen &= ~(GPIOG22TO23);
|
||||||
mfpen |= ENAC97;/*enable AC97*/
|
mfpen |= ENAC97;/*enable AC97*/
|
||||||
|
} else if (strcmp(dev_id, "nuc900-mmc-port1") == 0) {
|
||||||
|
mfpen &= ~(GPIOG18TO20);
|
||||||
|
mfpen |= (ENSD1 | 0x01);/*enable sd1*/
|
||||||
} else {
|
} else {
|
||||||
mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
|
mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
|
||||||
}
|
}
|
||||||
|
@ -162,3 +171,30 @@ void mfp_set_groupg(struct device *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mfp_set_groupg);
|
EXPORT_SYMBOL(mfp_set_groupg);
|
||||||
|
|
||||||
|
void mfp_set_groupd(struct device *dev, const char *subname)
|
||||||
|
{
|
||||||
|
unsigned long mfpen;
|
||||||
|
const char *dev_id;
|
||||||
|
|
||||||
|
BUG_ON((!dev) && (!subname));
|
||||||
|
|
||||||
|
mutex_lock(&mfp_mutex);
|
||||||
|
|
||||||
|
if (subname != NULL)
|
||||||
|
dev_id = subname;
|
||||||
|
else
|
||||||
|
dev_id = dev_name(dev);
|
||||||
|
|
||||||
|
mfpen = __raw_readl(REG_MFSEL);
|
||||||
|
|
||||||
|
if (strcmp(dev_id, "nuc900-mmc-port0") == 0) {
|
||||||
|
mfpen &= ~GPSELD;/*enable sd0*/
|
||||||
|
mfpen |= ENSD0;
|
||||||
|
} else
|
||||||
|
mfpen &= (~GPSELD);
|
||||||
|
|
||||||
|
__raw_writel(mfpen, REG_MFSEL);
|
||||||
|
|
||||||
|
mutex_unlock(&mfp_mutex);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mfp_set_groupd);
|
||||||
|
|
|
@ -3,7 +3,7 @@ if ETRAX_ARCH_V10
|
||||||
config ETRAX_ETHERNET
|
config ETRAX_ETHERNET
|
||||||
bool "Ethernet support"
|
bool "Ethernet support"
|
||||||
depends on ETRAX_ARCH_V10
|
depends on ETRAX_ARCH_V10
|
||||||
select NET_ETHERNET
|
select ETHERNET
|
||||||
select NET_CORE
|
select NET_CORE
|
||||||
select MII
|
select MII
|
||||||
help
|
help
|
||||||
|
|
|
@ -3,7 +3,7 @@ if ETRAX_ARCH_V32
|
||||||
config ETRAX_ETHERNET
|
config ETRAX_ETHERNET
|
||||||
bool "Ethernet support"
|
bool "Ethernet support"
|
||||||
depends on ETRAX_ARCH_V32
|
depends on ETRAX_ARCH_V32
|
||||||
select NET_ETHERNET
|
select ETHERNET
|
||||||
select NET_CORE
|
select NET_CORE
|
||||||
select MII
|
select MII
|
||||||
help
|
help
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ASM_MICROBLAZE_NAMEI_H
|
|
||||||
#define _ASM_MICROBLAZE_NAMEI_H
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
|
|
||||||
/* This dummy routine maybe changed to something useful
|
|
||||||
* for /usr/gnemul/ emulation stuff.
|
|
||||||
* Look at asm-sparc/namei.h for details.
|
|
||||||
*/
|
|
||||||
#define __emul_prefix() NULL
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_NAMEI_H */
|
|
|
@ -345,7 +345,7 @@ config ARCH_ENABLE_MEMORY_HOTREMOVE
|
||||||
|
|
||||||
config KEXEC
|
config KEXEC
|
||||||
bool "kexec system call (EXPERIMENTAL)"
|
bool "kexec system call (EXPERIMENTAL)"
|
||||||
depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP && !47x)) && EXPERIMENTAL
|
depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP && !PPC_47x)) && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
kexec is a system call that implements the ability to shutdown your
|
kexec is a system call that implements the ability to shutdown your
|
||||||
current kernel, and to start another kernel. It is like a reboot
|
current kernel, and to start another kernel. It is like a reboot
|
||||||
|
|
|
@ -255,12 +255,6 @@ checkbin:
|
||||||
echo 'disable kernel modules' ; \
|
echo 'disable kernel modules' ; \
|
||||||
false ; \
|
false ; \
|
||||||
fi
|
fi
|
||||||
@if ! /bin/echo dssall | $(AS) -many -o $(TOUT) >/dev/null 2>&1 ; then \
|
|
||||||
echo -n '*** ${VERSION}.${PATCHLEVEL} kernels no longer build ' ; \
|
|
||||||
echo 'correctly with old versions of binutils.' ; \
|
|
||||||
echo '*** Please upgrade your binutils to 2.12.1 or newer' ; \
|
|
||||||
false ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
CLEAN_FILES += $(TOUT)
|
CLEAN_FILES += $(TOUT)
|
||||||
|
|
||||||
|
|
|
@ -449,6 +449,7 @@
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <16 2>;
|
interrupts = <16 2>;
|
||||||
interrupt-map-mask = <0xf800 0 0 7>;
|
interrupt-map-mask = <0xf800 0 0 7>;
|
||||||
|
/* IRQ[0:3] are pulled up on board, set to active-low */
|
||||||
interrupt-map = <
|
interrupt-map = <
|
||||||
/* IDSEL 0x0 */
|
/* IDSEL 0x0 */
|
||||||
0000 0 0 1 &mpic 0 1
|
0000 0 0 1 &mpic 0 1
|
||||||
|
@ -488,11 +489,15 @@
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <16 2>;
|
interrupts = <16 2>;
|
||||||
interrupt-map-mask = <0xf800 0 0 7>;
|
interrupt-map-mask = <0xf800 0 0 7>;
|
||||||
|
/*
|
||||||
|
* IRQ[4:6] only for PCIe, set to active-high,
|
||||||
|
* IRQ[7] is pulled up on board, set to active-low
|
||||||
|
*/
|
||||||
interrupt-map = <
|
interrupt-map = <
|
||||||
/* IDSEL 0x0 */
|
/* IDSEL 0x0 */
|
||||||
0000 0 0 1 &mpic 4 1
|
0000 0 0 1 &mpic 4 2
|
||||||
0000 0 0 2 &mpic 5 1
|
0000 0 0 2 &mpic 5 2
|
||||||
0000 0 0 3 &mpic 6 1
|
0000 0 0 3 &mpic 6 2
|
||||||
0000 0 0 4 &mpic 7 1
|
0000 0 0 4 &mpic 7 1
|
||||||
>;
|
>;
|
||||||
ranges = <0x2000000 0x0 0xa0000000
|
ranges = <0x2000000 0x0 0xa0000000
|
||||||
|
@ -527,12 +532,16 @@
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
interrupts = <16 2>;
|
interrupts = <16 2>;
|
||||||
interrupt-map-mask = <0xf800 0 0 7>;
|
interrupt-map-mask = <0xf800 0 0 7>;
|
||||||
|
/*
|
||||||
|
* IRQ[8:10] are pulled up on board, set to active-low
|
||||||
|
* IRQ[11] only for PCIe, set to active-high,
|
||||||
|
*/
|
||||||
interrupt-map = <
|
interrupt-map = <
|
||||||
/* IDSEL 0x0 */
|
/* IDSEL 0x0 */
|
||||||
0000 0 0 1 &mpic 8 1
|
0000 0 0 1 &mpic 8 1
|
||||||
0000 0 0 2 &mpic 9 1
|
0000 0 0 2 &mpic 9 1
|
||||||
0000 0 0 3 &mpic 10 1
|
0000 0 0 3 &mpic 10 1
|
||||||
0000 0 0 4 &mpic 11 1
|
0000 0 0 4 &mpic 11 2
|
||||||
>;
|
>;
|
||||||
ranges = <0x2000000 0x0 0x80000000
|
ranges = <0x2000000 0x0 0x80000000
|
||||||
0x2000000 0x0 0x80000000
|
0x2000000 0x0 0x80000000
|
||||||
|
|
|
@ -52,6 +52,8 @@ CONFIG_MTD_CFI=y
|
||||||
CONFIG_MTD_JEDECPROBE=y
|
CONFIG_MTD_JEDECPROBE=y
|
||||||
CONFIG_MTD_CFI_AMDSTD=y
|
CONFIG_MTD_CFI_AMDSTD=y
|
||||||
CONFIG_MTD_PHYSMAP_OF=y
|
CONFIG_MTD_PHYSMAP_OF=y
|
||||||
|
CONFIG_MTD_NAND=m
|
||||||
|
CONFIG_MTD_NAND_NDFC=m
|
||||||
CONFIG_MTD_UBI=m
|
CONFIG_MTD_UBI=m
|
||||||
CONFIG_MTD_UBI_GLUEBI=m
|
CONFIG_MTD_UBI_GLUEBI=m
|
||||||
CONFIG_PROC_DEVICETREE=y
|
CONFIG_PROC_DEVICETREE=y
|
||||||
|
|
|
@ -49,13 +49,13 @@ static __inline__ int atomic_add_return(int a, atomic_t *v)
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %0,0,%2 # atomic_add_return\n\
|
"1: lwarx %0,0,%2 # atomic_add_return\n\
|
||||||
add %0,%1,%0\n"
|
add %0,%1,%0\n"
|
||||||
PPC405_ERR77(0,%2)
|
PPC405_ERR77(0,%2)
|
||||||
" stwcx. %0,0,%2 \n\
|
" stwcx. %0,0,%2 \n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (a), "r" (&v->counter)
|
: "r" (a), "r" (&v->counter)
|
||||||
: "cc", "memory");
|
: "cc", "memory");
|
||||||
|
@ -85,13 +85,13 @@ static __inline__ int atomic_sub_return(int a, atomic_t *v)
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %0,0,%2 # atomic_sub_return\n\
|
"1: lwarx %0,0,%2 # atomic_sub_return\n\
|
||||||
subf %0,%1,%0\n"
|
subf %0,%1,%0\n"
|
||||||
PPC405_ERR77(0,%2)
|
PPC405_ERR77(0,%2)
|
||||||
" stwcx. %0,0,%2 \n\
|
" stwcx. %0,0,%2 \n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (a), "r" (&v->counter)
|
: "r" (a), "r" (&v->counter)
|
||||||
: "cc", "memory");
|
: "cc", "memory");
|
||||||
|
@ -119,13 +119,13 @@ static __inline__ int atomic_inc_return(atomic_t *v)
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %0,0,%1 # atomic_inc_return\n\
|
"1: lwarx %0,0,%1 # atomic_inc_return\n\
|
||||||
addic %0,%0,1\n"
|
addic %0,%0,1\n"
|
||||||
PPC405_ERR77(0,%1)
|
PPC405_ERR77(0,%1)
|
||||||
" stwcx. %0,0,%1 \n\
|
" stwcx. %0,0,%1 \n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (&v->counter)
|
: "r" (&v->counter)
|
||||||
: "cc", "xer", "memory");
|
: "cc", "xer", "memory");
|
||||||
|
@ -163,13 +163,13 @@ static __inline__ int atomic_dec_return(atomic_t *v)
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %0,0,%1 # atomic_dec_return\n\
|
"1: lwarx %0,0,%1 # atomic_dec_return\n\
|
||||||
addic %0,%0,-1\n"
|
addic %0,%0,-1\n"
|
||||||
PPC405_ERR77(0,%1)
|
PPC405_ERR77(0,%1)
|
||||||
" stwcx. %0,0,%1\n\
|
" stwcx. %0,0,%1\n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (&v->counter)
|
: "r" (&v->counter)
|
||||||
: "cc", "xer", "memory");
|
: "cc", "xer", "memory");
|
||||||
|
@ -194,7 +194,7 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %0,0,%1 # __atomic_add_unless\n\
|
"1: lwarx %0,0,%1 # __atomic_add_unless\n\
|
||||||
cmpw 0,%0,%3 \n\
|
cmpw 0,%0,%3 \n\
|
||||||
beq- 2f \n\
|
beq- 2f \n\
|
||||||
|
@ -202,7 +202,7 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
|
||||||
PPC405_ERR77(0,%2)
|
PPC405_ERR77(0,%2)
|
||||||
" stwcx. %0,0,%1 \n\
|
" stwcx. %0,0,%1 \n\
|
||||||
bne- 1b \n"
|
bne- 1b \n"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
" subf %0,%2,%0 \n\
|
" subf %0,%2,%0 \n\
|
||||||
2:"
|
2:"
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
|
@ -226,7 +226,7 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v)
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %0,0,%1 # atomic_dec_if_positive\n\
|
"1: lwarx %0,0,%1 # atomic_dec_if_positive\n\
|
||||||
cmpwi %0,1\n\
|
cmpwi %0,1\n\
|
||||||
addi %0,%0,-1\n\
|
addi %0,%0,-1\n\
|
||||||
|
@ -234,7 +234,7 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v)
|
||||||
PPC405_ERR77(0,%1)
|
PPC405_ERR77(0,%1)
|
||||||
" stwcx. %0,0,%1\n\
|
" stwcx. %0,0,%1\n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
"\n\
|
"\n\
|
||||||
2:" : "=&b" (t)
|
2:" : "=&b" (t)
|
||||||
: "r" (&v->counter)
|
: "r" (&v->counter)
|
||||||
|
@ -285,12 +285,12 @@ static __inline__ long atomic64_add_return(long a, atomic64_t *v)
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: ldarx %0,0,%2 # atomic64_add_return\n\
|
"1: ldarx %0,0,%2 # atomic64_add_return\n\
|
||||||
add %0,%1,%0\n\
|
add %0,%1,%0\n\
|
||||||
stdcx. %0,0,%2 \n\
|
stdcx. %0,0,%2 \n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (a), "r" (&v->counter)
|
: "r" (a), "r" (&v->counter)
|
||||||
: "cc", "memory");
|
: "cc", "memory");
|
||||||
|
@ -319,12 +319,12 @@ static __inline__ long atomic64_sub_return(long a, atomic64_t *v)
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: ldarx %0,0,%2 # atomic64_sub_return\n\
|
"1: ldarx %0,0,%2 # atomic64_sub_return\n\
|
||||||
subf %0,%1,%0\n\
|
subf %0,%1,%0\n\
|
||||||
stdcx. %0,0,%2 \n\
|
stdcx. %0,0,%2 \n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (a), "r" (&v->counter)
|
: "r" (a), "r" (&v->counter)
|
||||||
: "cc", "memory");
|
: "cc", "memory");
|
||||||
|
@ -351,12 +351,12 @@ static __inline__ long atomic64_inc_return(atomic64_t *v)
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: ldarx %0,0,%1 # atomic64_inc_return\n\
|
"1: ldarx %0,0,%1 # atomic64_inc_return\n\
|
||||||
addic %0,%0,1\n\
|
addic %0,%0,1\n\
|
||||||
stdcx. %0,0,%1 \n\
|
stdcx. %0,0,%1 \n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (&v->counter)
|
: "r" (&v->counter)
|
||||||
: "cc", "xer", "memory");
|
: "cc", "xer", "memory");
|
||||||
|
@ -393,12 +393,12 @@ static __inline__ long atomic64_dec_return(atomic64_t *v)
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: ldarx %0,0,%1 # atomic64_dec_return\n\
|
"1: ldarx %0,0,%1 # atomic64_dec_return\n\
|
||||||
addic %0,%0,-1\n\
|
addic %0,%0,-1\n\
|
||||||
stdcx. %0,0,%1\n\
|
stdcx. %0,0,%1\n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
: "r" (&v->counter)
|
: "r" (&v->counter)
|
||||||
: "cc", "xer", "memory");
|
: "cc", "xer", "memory");
|
||||||
|
@ -418,13 +418,13 @@ static __inline__ long atomic64_dec_if_positive(atomic64_t *v)
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: ldarx %0,0,%1 # atomic64_dec_if_positive\n\
|
"1: ldarx %0,0,%1 # atomic64_dec_if_positive\n\
|
||||||
addic. %0,%0,-1\n\
|
addic. %0,%0,-1\n\
|
||||||
blt- 2f\n\
|
blt- 2f\n\
|
||||||
stdcx. %0,0,%1\n\
|
stdcx. %0,0,%1\n\
|
||||||
bne- 1b"
|
bne- 1b"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
"\n\
|
"\n\
|
||||||
2:" : "=&r" (t)
|
2:" : "=&r" (t)
|
||||||
: "r" (&v->counter)
|
: "r" (&v->counter)
|
||||||
|
@ -450,14 +450,14 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||||
long t;
|
long t;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: ldarx %0,0,%1 # __atomic_add_unless\n\
|
"1: ldarx %0,0,%1 # __atomic_add_unless\n\
|
||||||
cmpd 0,%0,%3 \n\
|
cmpd 0,%0,%3 \n\
|
||||||
beq- 2f \n\
|
beq- 2f \n\
|
||||||
add %0,%2,%0 \n"
|
add %0,%2,%0 \n"
|
||||||
" stdcx. %0,0,%1 \n\
|
" stdcx. %0,0,%1 \n\
|
||||||
bne- 1b \n"
|
bne- 1b \n"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
" subf %0,%2,%0 \n\
|
" subf %0,%2,%0 \n\
|
||||||
2:"
|
2:"
|
||||||
: "=&r" (t)
|
: "=&r" (t)
|
||||||
|
|
|
@ -124,14 +124,14 @@ static __inline__ unsigned long fn( \
|
||||||
return (old & mask); \
|
return (old & mask); \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_TESTOP(test_and_set_bits, or, PPC_RELEASE_BARRIER,
|
DEFINE_TESTOP(test_and_set_bits, or, PPC_ATOMIC_ENTRY_BARRIER,
|
||||||
PPC_ACQUIRE_BARRIER, 0)
|
PPC_ATOMIC_EXIT_BARRIER, 0)
|
||||||
DEFINE_TESTOP(test_and_set_bits_lock, or, "",
|
DEFINE_TESTOP(test_and_set_bits_lock, or, "",
|
||||||
PPC_ACQUIRE_BARRIER, 1)
|
PPC_ACQUIRE_BARRIER, 1)
|
||||||
DEFINE_TESTOP(test_and_clear_bits, andc, PPC_RELEASE_BARRIER,
|
DEFINE_TESTOP(test_and_clear_bits, andc, PPC_ATOMIC_ENTRY_BARRIER,
|
||||||
PPC_ACQUIRE_BARRIER, 0)
|
PPC_ATOMIC_EXIT_BARRIER, 0)
|
||||||
DEFINE_TESTOP(test_and_change_bits, xor, PPC_RELEASE_BARRIER,
|
DEFINE_TESTOP(test_and_change_bits, xor, PPC_ATOMIC_ENTRY_BARRIER,
|
||||||
PPC_ACQUIRE_BARRIER, 0)
|
PPC_ATOMIC_EXIT_BARRIER, 0)
|
||||||
|
|
||||||
static __inline__ int test_and_set_bit(unsigned long nr,
|
static __inline__ int test_and_set_bit(unsigned long nr,
|
||||||
volatile unsigned long *addr)
|
volatile unsigned long *addr)
|
||||||
|
|
|
@ -11,12 +11,13 @@
|
||||||
|
|
||||||
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
|
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
|
||||||
__asm__ __volatile ( \
|
__asm__ __volatile ( \
|
||||||
PPC_RELEASE_BARRIER \
|
PPC_ATOMIC_ENTRY_BARRIER \
|
||||||
"1: lwarx %0,0,%2\n" \
|
"1: lwarx %0,0,%2\n" \
|
||||||
insn \
|
insn \
|
||||||
PPC405_ERR77(0, %2) \
|
PPC405_ERR77(0, %2) \
|
||||||
"2: stwcx. %1,0,%2\n" \
|
"2: stwcx. %1,0,%2\n" \
|
||||||
"bne- 1b\n" \
|
"bne- 1b\n" \
|
||||||
|
PPC_ATOMIC_EXIT_BARRIER \
|
||||||
"li %1,0\n" \
|
"li %1,0\n" \
|
||||||
"3: .section .fixup,\"ax\"\n" \
|
"3: .section .fixup,\"ax\"\n" \
|
||||||
"4: li %1,%3\n" \
|
"4: li %1,%3\n" \
|
||||||
|
@ -92,14 +93,14 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
PPC_RELEASE_BARRIER
|
PPC_ATOMIC_ENTRY_BARRIER
|
||||||
"1: lwarx %1,0,%3 # futex_atomic_cmpxchg_inatomic\n\
|
"1: lwarx %1,0,%3 # futex_atomic_cmpxchg_inatomic\n\
|
||||||
cmpw 0,%1,%4\n\
|
cmpw 0,%1,%4\n\
|
||||||
bne- 3f\n"
|
bne- 3f\n"
|
||||||
PPC405_ERR77(0,%3)
|
PPC405_ERR77(0,%3)
|
||||||
"2: stwcx. %5,0,%3\n\
|
"2: stwcx. %5,0,%3\n\
|
||||||
bne- 1b\n"
|
bne- 1b\n"
|
||||||
PPC_ACQUIRE_BARRIER
|
PPC_ATOMIC_EXIT_BARRIER
|
||||||
"3: .section .fixup,\"ax\"\n\
|
"3: .section .fixup,\"ax\"\n\
|
||||||
4: li %0,%6\n\
|
4: li %0,%6\n\
|
||||||
b 3b\n\
|
b 3b\n\
|
||||||
|
|
|
@ -148,12 +148,6 @@ struct kvm_regs {
|
||||||
#define KVM_SREGS_E_UPDATE_DEC (1 << 2)
|
#define KVM_SREGS_E_UPDATE_DEC (1 << 2)
|
||||||
#define KVM_SREGS_E_UPDATE_DBSR (1 << 3)
|
#define KVM_SREGS_E_UPDATE_DBSR (1 << 3)
|
||||||
|
|
||||||
/*
|
|
||||||
* Book3S special bits to indicate contents in the struct by maintaining
|
|
||||||
* backwards compatibility with older structs. If adding a new field,
|
|
||||||
* please make sure to add a flag for that new field */
|
|
||||||
#define KVM_SREGS_S_HIOR (1 << 0)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In KVM_SET_SREGS, reserved/pad fields must be left untouched from a
|
* In KVM_SET_SREGS, reserved/pad fields must be left untouched from a
|
||||||
* previous KVM_GET_REGS.
|
* previous KVM_GET_REGS.
|
||||||
|
@ -179,8 +173,6 @@ struct kvm_sregs {
|
||||||
__u64 ibat[8];
|
__u64 ibat[8];
|
||||||
__u64 dbat[8];
|
__u64 dbat[8];
|
||||||
} ppc32;
|
} ppc32;
|
||||||
__u64 flags; /* KVM_SREGS_S_ */
|
|
||||||
__u64 hior;
|
|
||||||
} s;
|
} s;
|
||||||
struct {
|
struct {
|
||||||
union {
|
union {
|
||||||
|
|
|
@ -90,8 +90,6 @@ struct kvmppc_vcpu_book3s {
|
||||||
#endif
|
#endif
|
||||||
int context_id[SID_CONTEXTS];
|
int context_id[SID_CONTEXTS];
|
||||||
|
|
||||||
bool hior_sregs; /* HIOR is set by SREGS, not PVR */
|
|
||||||
|
|
||||||
struct hlist_head hpte_hash_pte[HPTEG_HASH_NUM_PTE];
|
struct hlist_head hpte_hash_pte[HPTEG_HASH_NUM_PTE];
|
||||||
struct hlist_head hpte_hash_pte_long[HPTEG_HASH_NUM_PTE_LONG];
|
struct hlist_head hpte_hash_pte_long[HPTEG_HASH_NUM_PTE_LONG];
|
||||||
struct hlist_head hpte_hash_vpte[HPTEG_HASH_NUM_VPTE];
|
struct hlist_head hpte_hash_vpte[HPTEG_HASH_NUM_VPTE];
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
#define MSR_ MSR_ME | MSR_CE
|
#define MSR_ MSR_ME | MSR_CE
|
||||||
#define MSR_KERNEL MSR_ | MSR_64BIT
|
#define MSR_KERNEL MSR_ | MSR_64BIT
|
||||||
#define MSR_USER32 MSR_ | MSR_PR | MSR_EE | MSR_DE
|
#define MSR_USER32 MSR_ | MSR_PR | MSR_EE
|
||||||
#define MSR_USER64 MSR_USER32 | MSR_64BIT
|
#define MSR_USER64 MSR_USER32 | MSR_64BIT
|
||||||
#elif defined (CONFIG_40x)
|
#elif defined (CONFIG_40x)
|
||||||
#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE)
|
#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE)
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#ifdef __powerpc64__
|
#ifdef __powerpc64__
|
||||||
|
|
||||||
extern char _end[];
|
extern char __end_interrupts[];
|
||||||
|
|
||||||
static inline int in_kernel_text(unsigned long addr)
|
static inline int in_kernel_text(unsigned long addr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup;
|
extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup;
|
||||||
extern void do_lwsync_fixups(unsigned long value, void *fixup_start,
|
extern void do_lwsync_fixups(unsigned long value, void *fixup_start,
|
||||||
void *fixup_end);
|
void *fixup_end);
|
||||||
|
extern void do_final_fixups(void);
|
||||||
|
|
||||||
static inline void eieio(void)
|
static inline void eieio(void)
|
||||||
{
|
{
|
||||||
|
@ -43,9 +44,13 @@ static inline void isync(void)
|
||||||
MAKE_LWSYNC_SECTION_ENTRY(97, __lwsync_fixup);
|
MAKE_LWSYNC_SECTION_ENTRY(97, __lwsync_fixup);
|
||||||
#define PPC_ACQUIRE_BARRIER "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER)
|
#define PPC_ACQUIRE_BARRIER "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER)
|
||||||
#define PPC_RELEASE_BARRIER stringify_in_c(LWSYNC) "\n"
|
#define PPC_RELEASE_BARRIER stringify_in_c(LWSYNC) "\n"
|
||||||
|
#define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(LWSYNC) "\n"
|
||||||
|
#define PPC_ATOMIC_EXIT_BARRIER "\n" stringify_in_c(sync) "\n"
|
||||||
#else
|
#else
|
||||||
#define PPC_ACQUIRE_BARRIER
|
#define PPC_ACQUIRE_BARRIER
|
||||||
#define PPC_RELEASE_BARRIER
|
#define PPC_RELEASE_BARRIER
|
||||||
|
#define PPC_ATOMIC_ENTRY_BARRIER
|
||||||
|
#define PPC_ATOMIC_EXIT_BARRIER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
|
@ -215,7 +215,22 @@ reenable_mmu: /* re-enable mmu so we can */
|
||||||
stw r9,8(r1)
|
stw r9,8(r1)
|
||||||
stw r11,12(r1)
|
stw r11,12(r1)
|
||||||
stw r3,ORIG_GPR3(r1)
|
stw r3,ORIG_GPR3(r1)
|
||||||
|
/*
|
||||||
|
* The trace_hardirqs_off will use CALLER_ADDR0 and CALLER_ADDR1.
|
||||||
|
* If from user mode there is only one stack frame on the stack, and
|
||||||
|
* accessing CALLER_ADDR1 will cause oops. So we need create a dummy
|
||||||
|
* stack frame to make trace_hardirqs_off happy.
|
||||||
|
*/
|
||||||
|
andi. r12,r12,MSR_PR
|
||||||
|
beq 11f
|
||||||
|
stwu r1,-16(r1)
|
||||||
bl trace_hardirqs_off
|
bl trace_hardirqs_off
|
||||||
|
addi r1,r1,16
|
||||||
|
b 12f
|
||||||
|
|
||||||
|
11:
|
||||||
|
bl trace_hardirqs_off
|
||||||
|
12:
|
||||||
lwz r0,GPR0(r1)
|
lwz r0,GPR0(r1)
|
||||||
lwz r3,ORIG_GPR3(r1)
|
lwz r3,ORIG_GPR3(r1)
|
||||||
lwz r4,GPR4(r1)
|
lwz r4,GPR4(r1)
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/jump_label.h>
|
#include <linux/jump_label.h>
|
||||||
#include <asm/code-patching.h>
|
#include <asm/code-patching.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_JUMP_LABEL
|
||||||
void arch_jump_label_transform(struct jump_entry *entry,
|
void arch_jump_label_transform(struct jump_entry *entry,
|
||||||
enum jump_label_type type)
|
enum jump_label_type type)
|
||||||
{
|
{
|
||||||
|
@ -21,3 +22,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
|
||||||
else
|
else
|
||||||
patch_instruction(addr, PPC_INST_NOP);
|
patch_instruction(addr, PPC_INST_NOP);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -132,7 +132,6 @@ static void kvm_patch_ins_b(u32 *inst, int addr)
|
||||||
/* On relocatable kernels interrupts handlers and our code
|
/* On relocatable kernels interrupts handlers and our code
|
||||||
can be in different regions, so we don't patch them */
|
can be in different regions, so we don't patch them */
|
||||||
|
|
||||||
extern u32 __end_interrupts;
|
|
||||||
if ((ulong)inst < (ulong)&__end_interrupts)
|
if ((ulong)inst < (ulong)&__end_interrupts)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -738,7 +738,7 @@ relocate_new_kernel:
|
||||||
mr r5, r31
|
mr r5, r31
|
||||||
|
|
||||||
li r0, 0
|
li r0, 0
|
||||||
#elif defined(CONFIG_44x) && !defined(CONFIG_47x)
|
#elif defined(CONFIG_44x) && !defined(CONFIG_PPC_47x)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Code for setting up 1:1 mapping for PPC440x for KEXEC
|
* Code for setting up 1:1 mapping for PPC440x for KEXEC
|
||||||
|
|
|
@ -486,28 +486,6 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||||
new_thread = &new->thread;
|
new_thread = &new->thread;
|
||||||
old_thread = ¤t->thread;
|
old_thread = ¤t->thread;
|
||||||
|
|
||||||
#if defined(CONFIG_PPC_BOOK3E_64)
|
|
||||||
/* XXX Current Book3E code doesn't deal with kernel side DBCR0,
|
|
||||||
* we always hold the user values, so we set it now.
|
|
||||||
*
|
|
||||||
* However, we ensure the kernel MSR:DE is appropriately cleared too
|
|
||||||
* to avoid spurrious single step exceptions in the kernel.
|
|
||||||
*
|
|
||||||
* This will have to change to merge with the ppc32 code at some point,
|
|
||||||
* but I don't like much what ppc32 is doing today so there's some
|
|
||||||
* thinking needed there
|
|
||||||
*/
|
|
||||||
if ((new_thread->dbcr0 | old_thread->dbcr0) & DBCR0_IDM) {
|
|
||||||
u32 dbcr0;
|
|
||||||
|
|
||||||
mtmsr(mfmsr() & ~MSR_DE);
|
|
||||||
isync();
|
|
||||||
dbcr0 = mfspr(SPRN_DBCR0);
|
|
||||||
dbcr0 = (dbcr0 & DBCR0_EDM) | new_thread->dbcr0;
|
|
||||||
mtspr(SPRN_DBCR0, dbcr0);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_PPC64_BOOK3E */
|
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
/*
|
/*
|
||||||
* Collect processor utilization data per process
|
* Collect processor utilization data per process
|
||||||
|
@ -657,7 +635,7 @@ void show_regs(struct pt_regs * regs)
|
||||||
if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
|
if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
|
||||||
printk("CFAR: "REG"\n", regs->orig_gpr3);
|
printk("CFAR: "REG"\n", regs->orig_gpr3);
|
||||||
if (trap == 0x300 || trap == 0x600)
|
if (trap == 0x300 || trap == 0x600)
|
||||||
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
|
||||||
printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
|
printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
|
||||||
#else
|
#else
|
||||||
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
|
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
|
||||||
|
|
|
@ -1579,10 +1579,8 @@ static void __init prom_instantiate_rtas(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
base = alloc_down(size, PAGE_SIZE, 0);
|
base = alloc_down(size, PAGE_SIZE, 0);
|
||||||
if (base == 0) {
|
if (base == 0)
|
||||||
prom_printf("RTAS allocation failed !\n");
|
prom_panic("Could not allocate memory for RTAS\n");
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
|
rtas_inst = call_prom("open", 1, 1, ADDR("/rtas"));
|
||||||
if (!IHANDLE_VALID(rtas_inst)) {
|
if (!IHANDLE_VALID(rtas_inst)) {
|
||||||
|
|
|
@ -107,6 +107,8 @@ notrace unsigned long __init early_init(unsigned long dt_ptr)
|
||||||
PTRRELOC(&__start___lwsync_fixup),
|
PTRRELOC(&__start___lwsync_fixup),
|
||||||
PTRRELOC(&__stop___lwsync_fixup));
|
PTRRELOC(&__stop___lwsync_fixup));
|
||||||
|
|
||||||
|
do_final_fixups();
|
||||||
|
|
||||||
return KERNELBASE + offset;
|
return KERNELBASE + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -359,6 +359,7 @@ void __init setup_system(void)
|
||||||
&__start___fw_ftr_fixup, &__stop___fw_ftr_fixup);
|
&__start___fw_ftr_fixup, &__stop___fw_ftr_fixup);
|
||||||
do_lwsync_fixups(cur_cpu_spec->cpu_features,
|
do_lwsync_fixups(cur_cpu_spec->cpu_features,
|
||||||
&__start___lwsync_fixup, &__stop___lwsync_fixup);
|
&__start___lwsync_fixup, &__stop___lwsync_fixup);
|
||||||
|
do_final_fixups();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unflatten the device-tree passed by prom_init or kexec
|
* Unflatten the device-tree passed by prom_init or kexec
|
||||||
|
|
|
@ -97,7 +97,7 @@ static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set)
|
||||||
compat_sigset_t cset;
|
compat_sigset_t cset;
|
||||||
|
|
||||||
switch (_NSIG_WORDS) {
|
switch (_NSIG_WORDS) {
|
||||||
case 4: cset.sig[5] = set->sig[3] & 0xffffffffull;
|
case 4: cset.sig[6] = set->sig[3] & 0xffffffffull;
|
||||||
cset.sig[7] = set->sig[3] >> 32;
|
cset.sig[7] = set->sig[3] >> 32;
|
||||||
case 3: cset.sig[4] = set->sig[2] & 0xffffffffull;
|
case 3: cset.sig[4] = set->sig[2] & 0xffffffffull;
|
||||||
cset.sig[5] = set->sig[2] >> 32;
|
cset.sig[5] = set->sig[2] >> 32;
|
||||||
|
|
|
@ -1298,14 +1298,12 @@ void __kprobes DebugException(struct pt_regs *regs, unsigned long debug_status)
|
||||||
|
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
current->thread.dbcr0 &= ~DBCR0_IC;
|
current->thread.dbcr0 &= ~DBCR0_IC;
|
||||||
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
|
||||||
if (DBCR_ACTIVE_EVENTS(current->thread.dbcr0,
|
if (DBCR_ACTIVE_EVENTS(current->thread.dbcr0,
|
||||||
current->thread.dbcr1))
|
current->thread.dbcr1))
|
||||||
regs->msr |= MSR_DE;
|
regs->msr |= MSR_DE;
|
||||||
else
|
else
|
||||||
/* Make sure the IDM bit is off */
|
/* Make sure the IDM bit is off */
|
||||||
current->thread.dbcr0 &= ~DBCR0_IDM;
|
current->thread.dbcr0 &= ~DBCR0_IDM;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
|
_exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/cputhreads.h>
|
#include <asm/cputhreads.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/hvcall.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
|
|
@ -151,7 +151,6 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
#ifdef CONFIG_PPC_BOOK3S_64
|
||||||
if ((pvr >= 0x330000) && (pvr < 0x70330000)) {
|
if ((pvr >= 0x330000) && (pvr < 0x70330000)) {
|
||||||
kvmppc_mmu_book3s_64_init(vcpu);
|
kvmppc_mmu_book3s_64_init(vcpu);
|
||||||
if (!to_book3s(vcpu)->hior_sregs)
|
|
||||||
to_book3s(vcpu)->hior = 0xfff00000;
|
to_book3s(vcpu)->hior = 0xfff00000;
|
||||||
to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL;
|
to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL;
|
||||||
vcpu->arch.cpu_type = KVM_CPU_3S_64;
|
vcpu->arch.cpu_type = KVM_CPU_3S_64;
|
||||||
|
@ -159,7 +158,6 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
kvmppc_mmu_book3s_32_init(vcpu);
|
kvmppc_mmu_book3s_32_init(vcpu);
|
||||||
if (!to_book3s(vcpu)->hior_sregs)
|
|
||||||
to_book3s(vcpu)->hior = 0;
|
to_book3s(vcpu)->hior = 0;
|
||||||
to_book3s(vcpu)->msr_mask = 0xffffffffULL;
|
to_book3s(vcpu)->msr_mask = 0xffffffffULL;
|
||||||
vcpu->arch.cpu_type = KVM_CPU_3S_32;
|
vcpu->arch.cpu_type = KVM_CPU_3S_32;
|
||||||
|
@ -797,9 +795,6 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sregs->u.s.flags & KVM_SREGS_S_HIOR)
|
|
||||||
sregs->u.s.hior = to_book3s(vcpu)->hior;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -836,11 +831,6 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
||||||
/* Flush the MMU after messing with the segments */
|
/* Flush the MMU after messing with the segments */
|
||||||
kvmppc_mmu_pte_flush(vcpu, 0, 0);
|
kvmppc_mmu_pte_flush(vcpu, 0, 0);
|
||||||
|
|
||||||
if (sregs->u.s.flags & KVM_SREGS_S_HIOR) {
|
|
||||||
to_book3s(vcpu)->hior_sregs = true;
|
|
||||||
to_book3s(vcpu)->hior = sregs->u.s.hior;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -208,7 +208,6 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||||
case KVM_CAP_PPC_BOOKE_SREGS:
|
case KVM_CAP_PPC_BOOKE_SREGS:
|
||||||
#else
|
#else
|
||||||
case KVM_CAP_PPC_SEGSTATE:
|
case KVM_CAP_PPC_SEGSTATE:
|
||||||
case KVM_CAP_PPC_HIOR:
|
|
||||||
case KVM_CAP_PPC_PAPR:
|
case KVM_CAP_PPC_PAPR:
|
||||||
#endif
|
#endif
|
||||||
case KVM_CAP_PPC_UNSET_IRQ:
|
case KVM_CAP_PPC_UNSET_IRQ:
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/cputable.h>
|
#include <asm/cputable.h>
|
||||||
#include <asm/code-patching.h>
|
#include <asm/code-patching.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <asm/sections.h>
|
||||||
|
|
||||||
|
|
||||||
struct fixup_entry {
|
struct fixup_entry {
|
||||||
|
@ -128,6 +130,27 @@ void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void do_final_fixups(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_PPC64) && defined(CONFIG_RELOCATABLE)
|
||||||
|
int *src, *dest;
|
||||||
|
unsigned long length;
|
||||||
|
|
||||||
|
if (PHYSICAL_START == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
src = (int *)(KERNELBASE + PHYSICAL_START);
|
||||||
|
dest = (int *)KERNELBASE;
|
||||||
|
length = (__end_interrupts - _stext) / sizeof(int);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
patch_instruction(dest, *src);
|
||||||
|
src++;
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FTR_FIXUP_SELFTEST
|
#ifdef CONFIG_FTR_FIXUP_SELFTEST
|
||||||
|
|
||||||
#define check(x) \
|
#define check(x) \
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
|
#include <linux/moduleparam.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/tlb.h>
|
#include <asm/tlb.h>
|
||||||
|
|
|
@ -203,7 +203,7 @@ config P3060_QDS
|
||||||
select PPC_E500MC
|
select PPC_E500MC
|
||||||
select PHYS_64BIT
|
select PHYS_64BIT
|
||||||
select SWIOTLB
|
select SWIOTLB
|
||||||
select MPC8xxx_GPIO
|
select GPIO_MPC8XXX
|
||||||
select HAS_RAPIDIO
|
select HAS_RAPIDIO
|
||||||
select PPC_EPAPR_HV_PIC
|
select PPC_EPAPR_HV_PIC
|
||||||
help
|
help
|
||||||
|
|
|
@ -70,7 +70,7 @@ define_machine(p3060_qds) {
|
||||||
.power_save = e500_idle,
|
.power_save = e500_idle,
|
||||||
};
|
};
|
||||||
|
|
||||||
machine_device_initcall(p3060_qds, declare_of_platform_devices);
|
machine_device_initcall(p3060_qds, corenet_ds_publish_devices);
|
||||||
|
|
||||||
#ifdef CONFIG_SWIOTLB
|
#ifdef CONFIG_SWIOTLB
|
||||||
machine_arch_initcall(p3060_qds, swiotlb_setup_bus_notifier);
|
machine_arch_initcall(p3060_qds, swiotlb_setup_bus_notifier);
|
||||||
|
|
|
@ -347,7 +347,7 @@ config SIMPLE_GPIO
|
||||||
|
|
||||||
config MCU_MPC8349EMITX
|
config MCU_MPC8349EMITX
|
||||||
bool "MPC8349E-mITX MCU driver"
|
bool "MPC8349E-mITX MCU driver"
|
||||||
depends on I2C && PPC_83xx
|
depends on I2C=y && PPC_83xx
|
||||||
select GENERIC_GPIO
|
select GENERIC_GPIO
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
help
|
help
|
||||||
|
|
|
@ -88,6 +88,7 @@ struct ps3_private {
|
||||||
struct ps3_bmp bmp __attribute__ ((aligned (PS3_BMP_MINALIGN)));
|
struct ps3_bmp bmp __attribute__ ((aligned (PS3_BMP_MINALIGN)));
|
||||||
u64 ppe_id;
|
u64 ppe_id;
|
||||||
u64 thread_id;
|
u64 thread_id;
|
||||||
|
unsigned long ipi_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct ps3_private, ps3_private);
|
static DEFINE_PER_CPU(struct ps3_private, ps3_private);
|
||||||
|
@ -144,6 +145,10 @@ static void ps3_chip_unmask(struct irq_data *d)
|
||||||
static void ps3_chip_eoi(struct irq_data *d)
|
static void ps3_chip_eoi(struct irq_data *d)
|
||||||
{
|
{
|
||||||
const struct ps3_private *pd = irq_data_get_irq_chip_data(d);
|
const struct ps3_private *pd = irq_data_get_irq_chip_data(d);
|
||||||
|
|
||||||
|
/* non-IPIs are EOIed here. */
|
||||||
|
|
||||||
|
if (!test_bit(63 - d->irq, &pd->ipi_mask))
|
||||||
lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq);
|
lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -691,6 +696,16 @@ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq)
|
||||||
cpu, virq, pd->bmp.ipi_debug_brk_mask);
|
cpu, virq, pd->bmp.ipi_debug_brk_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq)
|
||||||
|
{
|
||||||
|
struct ps3_private *pd = &per_cpu(ps3_private, cpu);
|
||||||
|
|
||||||
|
set_bit(63 - virq, &pd->ipi_mask);
|
||||||
|
|
||||||
|
DBG("%s:%d: cpu %u, virq %u, ipi_mask %lxh\n", __func__, __LINE__,
|
||||||
|
cpu, virq, pd->ipi_mask);
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned int ps3_get_irq(void)
|
static unsigned int ps3_get_irq(void)
|
||||||
{
|
{
|
||||||
struct ps3_private *pd = &__get_cpu_var(ps3_private);
|
struct ps3_private *pd = &__get_cpu_var(ps3_private);
|
||||||
|
@ -720,6 +735,12 @@ static unsigned int ps3_get_irq(void)
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* IPIs are EOIed here. */
|
||||||
|
|
||||||
|
if (test_bit(63 - plug, &pd->ipi_mask))
|
||||||
|
lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, plug);
|
||||||
|
|
||||||
return plug;
|
return plug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ void ps3_mm_shutdown(void);
|
||||||
void ps3_init_IRQ(void);
|
void ps3_init_IRQ(void);
|
||||||
void ps3_shutdown_IRQ(int cpu);
|
void ps3_shutdown_IRQ(int cpu);
|
||||||
void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq);
|
void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq);
|
||||||
|
void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq);
|
||||||
|
|
||||||
/* smp */
|
/* smp */
|
||||||
|
|
||||||
|
|
|
@ -59,11 +59,9 @@ static void ps3_smp_message_pass(int cpu, int msg)
|
||||||
|
|
||||||
static int ps3_smp_probe(void)
|
static int ps3_smp_probe(void)
|
||||||
{
|
{
|
||||||
return 2;
|
int cpu;
|
||||||
}
|
|
||||||
|
|
||||||
static void __init ps3_smp_setup_cpu(int cpu)
|
for (cpu = 0; cpu < 2; cpu++) {
|
||||||
{
|
|
||||||
int result;
|
int result;
|
||||||
unsigned int *virqs = per_cpu(ps3_ipi_virqs, cpu);
|
unsigned int *virqs = per_cpu(ps3_ipi_virqs, cpu);
|
||||||
int i;
|
int i;
|
||||||
|
@ -94,11 +92,16 @@ static void __init ps3_smp_setup_cpu(int cpu)
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
virqs[i] = NO_IRQ;
|
virqs[i] = NO_IRQ;
|
||||||
|
else
|
||||||
|
ps3_register_ipi_irq(cpu, virqs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]);
|
ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]);
|
||||||
|
|
||||||
DBG(" <- %s:%d: (%d)\n", __func__, __LINE__, cpu);
|
DBG(" <- %s:%d: (%d)\n", __func__, __LINE__, cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ps3_smp_cleanup_cpu(int cpu)
|
void ps3_smp_cleanup_cpu(int cpu)
|
||||||
|
@ -121,7 +124,6 @@ static struct smp_ops_t ps3_smp_ops = {
|
||||||
.probe = ps3_smp_probe,
|
.probe = ps3_smp_probe,
|
||||||
.message_pass = ps3_smp_message_pass,
|
.message_pass = ps3_smp_message_pass,
|
||||||
.kick_cpu = smp_generic_kick_cpu,
|
.kick_cpu = smp_generic_kick_cpu,
|
||||||
.setup_cpu = ps3_smp_setup_cpu,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void smp_init_ps3(void)
|
void smp_init_ps3(void)
|
||||||
|
|
|
@ -280,6 +280,7 @@ void __init ehv_pic_init(void)
|
||||||
|
|
||||||
if (!ehv_pic->irqhost) {
|
if (!ehv_pic->irqhost) {
|
||||||
of_node_put(np);
|
of_node_put(np);
|
||||||
|
kfree(ehv_pic);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -328,6 +328,7 @@ static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev)
|
||||||
err:
|
err:
|
||||||
iounmap(fsl_lbc_ctrl_dev->regs);
|
iounmap(fsl_lbc_ctrl_dev->regs);
|
||||||
kfree(fsl_lbc_ctrl_dev);
|
kfree(fsl_lbc_ctrl_dev);
|
||||||
|
fsl_lbc_ctrl_dev = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
|
||||||
/* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
|
/* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
|
||||||
that the BRG divisor must be even if you're not using divide-by-16
|
that the BRG divisor must be even if you're not using divide-by-16
|
||||||
mode. */
|
mode. */
|
||||||
if (!div16 && (divisor & 1))
|
if (!div16 && (divisor & 1) && (divisor > 3))
|
||||||
divisor++;
|
divisor++;
|
||||||
|
|
||||||
tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
|
tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
|
||||||
|
|
|
@ -47,7 +47,7 @@ struct sca_block {
|
||||||
#define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1))
|
#define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1))
|
||||||
#define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGE_SIZE)
|
#define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGE_SIZE)
|
||||||
|
|
||||||
#define CPUSTAT_HOST 0x80000000
|
#define CPUSTAT_STOPPED 0x80000000
|
||||||
#define CPUSTAT_WAIT 0x10000000
|
#define CPUSTAT_WAIT 0x10000000
|
||||||
#define CPUSTAT_ECALL_PEND 0x08000000
|
#define CPUSTAT_ECALL_PEND 0x08000000
|
||||||
#define CPUSTAT_STOP_INT 0x04000000
|
#define CPUSTAT_STOP_INT 0x04000000
|
||||||
|
@ -139,6 +139,7 @@ struct kvm_vcpu_stat {
|
||||||
u32 instruction_stfl;
|
u32 instruction_stfl;
|
||||||
u32 instruction_tprot;
|
u32 instruction_tprot;
|
||||||
u32 instruction_sigp_sense;
|
u32 instruction_sigp_sense;
|
||||||
|
u32 instruction_sigp_sense_running;
|
||||||
u32 instruction_sigp_external_call;
|
u32 instruction_sigp_external_call;
|
||||||
u32 instruction_sigp_emergency;
|
u32 instruction_sigp_emergency;
|
||||||
u32 instruction_sigp_stop;
|
u32 instruction_sigp_stop;
|
||||||
|
|
|
@ -70,7 +70,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
|
atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
|
||||||
vcpu->run->s390_reset_flags |= KVM_S390_RESET_SUBSYSTEM;
|
vcpu->run->s390_reset_flags |= KVM_S390_RESET_SUBSYSTEM;
|
||||||
vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL;
|
vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL;
|
||||||
vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT;
|
vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT;
|
||||||
|
|
|
@ -132,7 +132,6 @@ static int handle_stop(struct kvm_vcpu *vcpu)
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
vcpu->stat.exit_stop_request++;
|
vcpu->stat.exit_stop_request++;
|
||||||
atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
|
|
||||||
spin_lock_bh(&vcpu->arch.local_int.lock);
|
spin_lock_bh(&vcpu->arch.local_int.lock);
|
||||||
if (vcpu->arch.local_int.action_bits & ACTION_STORE_ON_STOP) {
|
if (vcpu->arch.local_int.action_bits & ACTION_STORE_ON_STOP) {
|
||||||
vcpu->arch.local_int.action_bits &= ~ACTION_STORE_ON_STOP;
|
vcpu->arch.local_int.action_bits &= ~ACTION_STORE_ON_STOP;
|
||||||
|
@ -149,6 +148,8 @@ static int handle_stop(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vcpu->arch.local_int.action_bits & ACTION_STOP_ON_STOP) {
|
if (vcpu->arch.local_int.action_bits & ACTION_STOP_ON_STOP) {
|
||||||
|
atomic_set_mask(CPUSTAT_STOPPED,
|
||||||
|
&vcpu->arch.sie_block->cpuflags);
|
||||||
vcpu->arch.local_int.action_bits &= ~ACTION_STOP_ON_STOP;
|
vcpu->arch.local_int.action_bits &= ~ACTION_STOP_ON_STOP;
|
||||||
VCPU_EVENT(vcpu, 3, "%s", "cpu stopped");
|
VCPU_EVENT(vcpu, 3, "%s", "cpu stopped");
|
||||||
rc = -EOPNOTSUPP;
|
rc = -EOPNOTSUPP;
|
||||||
|
|
|
@ -252,6 +252,7 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu,
|
||||||
offsetof(struct _lowcore, restart_psw), sizeof(psw_t));
|
offsetof(struct _lowcore, restart_psw), sizeof(psw_t));
|
||||||
if (rc == -EFAULT)
|
if (rc == -EFAULT)
|
||||||
exception = 1;
|
exception = 1;
|
||||||
|
atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KVM_S390_PROGRAM_INT:
|
case KVM_S390_PROGRAM_INT:
|
||||||
|
|
|
@ -65,6 +65,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
|
||||||
{ "instruction_stfl", VCPU_STAT(instruction_stfl) },
|
{ "instruction_stfl", VCPU_STAT(instruction_stfl) },
|
||||||
{ "instruction_tprot", VCPU_STAT(instruction_tprot) },
|
{ "instruction_tprot", VCPU_STAT(instruction_tprot) },
|
||||||
{ "instruction_sigp_sense", VCPU_STAT(instruction_sigp_sense) },
|
{ "instruction_sigp_sense", VCPU_STAT(instruction_sigp_sense) },
|
||||||
|
{ "instruction_sigp_sense_running", VCPU_STAT(instruction_sigp_sense_running) },
|
||||||
{ "instruction_sigp_external_call", VCPU_STAT(instruction_sigp_external_call) },
|
{ "instruction_sigp_external_call", VCPU_STAT(instruction_sigp_external_call) },
|
||||||
{ "instruction_sigp_emergency", VCPU_STAT(instruction_sigp_emergency) },
|
{ "instruction_sigp_emergency", VCPU_STAT(instruction_sigp_emergency) },
|
||||||
{ "instruction_sigp_stop", VCPU_STAT(instruction_sigp_stop) },
|
{ "instruction_sigp_stop", VCPU_STAT(instruction_sigp_stop) },
|
||||||
|
@ -127,6 +128,7 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||||
switch (ext) {
|
switch (ext) {
|
||||||
case KVM_CAP_S390_PSW:
|
case KVM_CAP_S390_PSW:
|
||||||
case KVM_CAP_S390_GMAP:
|
case KVM_CAP_S390_GMAP:
|
||||||
|
case KVM_CAP_SYNC_MMU:
|
||||||
r = 1;
|
r = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -270,10 +272,12 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||||
restore_fp_regs(&vcpu->arch.guest_fpregs);
|
restore_fp_regs(&vcpu->arch.guest_fpregs);
|
||||||
restore_access_regs(vcpu->arch.guest_acrs);
|
restore_access_regs(vcpu->arch.guest_acrs);
|
||||||
gmap_enable(vcpu->arch.gmap);
|
gmap_enable(vcpu->arch.gmap);
|
||||||
|
atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
|
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
|
||||||
gmap_disable(vcpu->arch.gmap);
|
gmap_disable(vcpu->arch.gmap);
|
||||||
save_fp_regs(&vcpu->arch.guest_fpregs);
|
save_fp_regs(&vcpu->arch.guest_fpregs);
|
||||||
save_access_regs(vcpu->arch.guest_acrs);
|
save_access_regs(vcpu->arch.guest_acrs);
|
||||||
|
@ -301,7 +305,9 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
|
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH | CPUSTAT_SM);
|
atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH |
|
||||||
|
CPUSTAT_SM |
|
||||||
|
CPUSTAT_STOPPED);
|
||||||
vcpu->arch.sie_block->ecb = 6;
|
vcpu->arch.sie_block->ecb = 6;
|
||||||
vcpu->arch.sie_block->eca = 0xC1002001U;
|
vcpu->arch.sie_block->eca = 0xC1002001U;
|
||||||
vcpu->arch.sie_block->fac = (int) (long) facilities;
|
vcpu->arch.sie_block->fac = (int) (long) facilities;
|
||||||
|
@ -428,7 +434,7 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
|
if (!(atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOPPED))
|
||||||
rc = -EBUSY;
|
rc = -EBUSY;
|
||||||
else {
|
else {
|
||||||
vcpu->run->psw_mask = psw.mask;
|
vcpu->run->psw_mask = psw.mask;
|
||||||
|
@ -501,7 +507,7 @@ rerun_vcpu:
|
||||||
if (vcpu->sigset_active)
|
if (vcpu->sigset_active)
|
||||||
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
|
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
|
||||||
|
|
||||||
atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
|
atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
|
||||||
|
|
||||||
BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL);
|
BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL);
|
||||||
|
|
||||||
|
|
|
@ -336,6 +336,7 @@ static int handle_tprot(struct kvm_vcpu *vcpu)
|
||||||
u64 address1 = disp1 + base1 ? vcpu->arch.guest_gprs[base1] : 0;
|
u64 address1 = disp1 + base1 ? vcpu->arch.guest_gprs[base1] : 0;
|
||||||
u64 address2 = disp2 + base2 ? vcpu->arch.guest_gprs[base2] : 0;
|
u64 address2 = disp2 + base2 ? vcpu->arch.guest_gprs[base2] : 0;
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
|
unsigned long user_address;
|
||||||
|
|
||||||
vcpu->stat.instruction_tprot++;
|
vcpu->stat.instruction_tprot++;
|
||||||
|
|
||||||
|
@ -349,9 +350,14 @@ static int handle_tprot(struct kvm_vcpu *vcpu)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
|
||||||
|
/* we must resolve the address without holding the mmap semaphore.
|
||||||
|
* This is ok since the userspace hypervisor is not supposed to change
|
||||||
|
* the mapping while the guest queries the memory. Otherwise the guest
|
||||||
|
* might crash or get wrong info anyway. */
|
||||||
|
user_address = (unsigned long) __guestaddr_to_user(vcpu, address1);
|
||||||
|
|
||||||
down_read(¤t->mm->mmap_sem);
|
down_read(¤t->mm->mmap_sem);
|
||||||
vma = find_vma(current->mm,
|
vma = find_vma(current->mm, user_address);
|
||||||
(unsigned long) __guestaddr_to_user(vcpu, address1));
|
|
||||||
if (!vma) {
|
if (!vma) {
|
||||||
up_read(¤t->mm->mmap_sem);
|
up_read(¤t->mm->mmap_sem);
|
||||||
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
|
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
|
||||||
|
|
|
@ -31,9 +31,11 @@
|
||||||
#define SIGP_SET_PREFIX 0x0d
|
#define SIGP_SET_PREFIX 0x0d
|
||||||
#define SIGP_STORE_STATUS_ADDR 0x0e
|
#define SIGP_STORE_STATUS_ADDR 0x0e
|
||||||
#define SIGP_SET_ARCH 0x12
|
#define SIGP_SET_ARCH 0x12
|
||||||
|
#define SIGP_SENSE_RUNNING 0x15
|
||||||
|
|
||||||
/* cpu status bits */
|
/* cpu status bits */
|
||||||
#define SIGP_STAT_EQUIPMENT_CHECK 0x80000000UL
|
#define SIGP_STAT_EQUIPMENT_CHECK 0x80000000UL
|
||||||
|
#define SIGP_STAT_NOT_RUNNING 0x00000400UL
|
||||||
#define SIGP_STAT_INCORRECT_STATE 0x00000200UL
|
#define SIGP_STAT_INCORRECT_STATE 0x00000200UL
|
||||||
#define SIGP_STAT_INVALID_PARAMETER 0x00000100UL
|
#define SIGP_STAT_INVALID_PARAMETER 0x00000100UL
|
||||||
#define SIGP_STAT_EXT_CALL_PENDING 0x00000080UL
|
#define SIGP_STAT_EXT_CALL_PENDING 0x00000080UL
|
||||||
|
@ -57,8 +59,8 @@ static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr,
|
||||||
spin_lock(&fi->lock);
|
spin_lock(&fi->lock);
|
||||||
if (fi->local_int[cpu_addr] == NULL)
|
if (fi->local_int[cpu_addr] == NULL)
|
||||||
rc = 3; /* not operational */
|
rc = 3; /* not operational */
|
||||||
else if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
|
else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags)
|
||||||
& CPUSTAT_RUNNING) {
|
& CPUSTAT_STOPPED)) {
|
||||||
*reg &= 0xffffffff00000000UL;
|
*reg &= 0xffffffff00000000UL;
|
||||||
rc = 1; /* status stored */
|
rc = 1; /* status stored */
|
||||||
} else {
|
} else {
|
||||||
|
@ -251,7 +253,7 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
|
||||||
|
|
||||||
spin_lock_bh(&li->lock);
|
spin_lock_bh(&li->lock);
|
||||||
/* cpu must be in stopped state */
|
/* cpu must be in stopped state */
|
||||||
if (atomic_read(li->cpuflags) & CPUSTAT_RUNNING) {
|
if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
|
||||||
rc = 1; /* incorrect state */
|
rc = 1; /* incorrect state */
|
||||||
*reg &= SIGP_STAT_INCORRECT_STATE;
|
*reg &= SIGP_STAT_INCORRECT_STATE;
|
||||||
kfree(inti);
|
kfree(inti);
|
||||||
|
@ -275,6 +277,38 @@ out_fi:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __sigp_sense_running(struct kvm_vcpu *vcpu, u16 cpu_addr,
|
||||||
|
unsigned long *reg)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
|
||||||
|
|
||||||
|
if (cpu_addr >= KVM_MAX_VCPUS)
|
||||||
|
return 3; /* not operational */
|
||||||
|
|
||||||
|
spin_lock(&fi->lock);
|
||||||
|
if (fi->local_int[cpu_addr] == NULL)
|
||||||
|
rc = 3; /* not operational */
|
||||||
|
else {
|
||||||
|
if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
|
||||||
|
& CPUSTAT_RUNNING) {
|
||||||
|
/* running */
|
||||||
|
rc = 1;
|
||||||
|
} else {
|
||||||
|
/* not running */
|
||||||
|
*reg &= 0xffffffff00000000UL;
|
||||||
|
*reg |= SIGP_STAT_NOT_RUNNING;
|
||||||
|
rc = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spin_unlock(&fi->lock);
|
||||||
|
|
||||||
|
VCPU_EVENT(vcpu, 4, "sensed running status of cpu %x rc %x", cpu_addr,
|
||||||
|
rc);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu)
|
int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
int r1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
|
int r1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4;
|
||||||
|
@ -331,6 +365,11 @@ int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu)
|
||||||
rc = __sigp_set_prefix(vcpu, cpu_addr, parameter,
|
rc = __sigp_set_prefix(vcpu, cpu_addr, parameter,
|
||||||
&vcpu->arch.guest_gprs[r1]);
|
&vcpu->arch.guest_gprs[r1]);
|
||||||
break;
|
break;
|
||||||
|
case SIGP_SENSE_RUNNING:
|
||||||
|
vcpu->stat.instruction_sigp_sense_running++;
|
||||||
|
rc = __sigp_sense_running(vcpu, cpu_addr,
|
||||||
|
&vcpu->arch.guest_gprs[r1]);
|
||||||
|
break;
|
||||||
case SIGP_RESTART:
|
case SIGP_RESTART:
|
||||||
vcpu->stat.instruction_sigp_restart++;
|
vcpu->stat.instruction_sigp_restart++;
|
||||||
/* user space must know about restart */
|
/* user space must know about restart */
|
||||||
|
|
|
@ -314,5 +314,6 @@ enum {
|
||||||
|
|
||||||
extern struct clk sh7724_fsimcka_clk;
|
extern struct clk sh7724_fsimcka_clk;
|
||||||
extern struct clk sh7724_fsimckb_clk;
|
extern struct clk sh7724_fsimckb_clk;
|
||||||
|
extern struct clk sh7724_dv_clki;
|
||||||
|
|
||||||
#endif /* __ASM_SH7724_H__ */
|
#endif /* __ASM_SH7724_H__ */
|
||||||
|
|
|
@ -233,73 +233,10 @@ static struct clk_lookup lookups[] = {
|
||||||
CLKDEV_CON_ID("sh0", &mstp_clks[HWBLK_SHYWAY]),
|
CLKDEV_CON_ID("sh0", &mstp_clks[HWBLK_SHYWAY]),
|
||||||
CLKDEV_CON_ID("hudi0", &mstp_clks[HWBLK_HUDI]),
|
CLKDEV_CON_ID("hudi0", &mstp_clks[HWBLK_HUDI]),
|
||||||
CLKDEV_CON_ID("ubc0", &mstp_clks[HWBLK_UBC]),
|
CLKDEV_CON_ID("ubc0", &mstp_clks[HWBLK_UBC]),
|
||||||
{
|
|
||||||
/* TMU0 */
|
|
||||||
.dev_id = "sh_tmu.0",
|
|
||||||
.con_id = "tmu_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_TMU0],
|
|
||||||
}, {
|
|
||||||
/* TMU1 */
|
|
||||||
.dev_id = "sh_tmu.1",
|
|
||||||
.con_id = "tmu_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_TMU0],
|
|
||||||
}, {
|
|
||||||
/* TMU2 */
|
|
||||||
.dev_id = "sh_tmu.2",
|
|
||||||
.con_id = "tmu_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_TMU0],
|
|
||||||
},
|
|
||||||
CLKDEV_CON_ID("cmt_fck", &mstp_clks[HWBLK_CMT]),
|
CLKDEV_CON_ID("cmt_fck", &mstp_clks[HWBLK_CMT]),
|
||||||
CLKDEV_CON_ID("rwdt0", &mstp_clks[HWBLK_RWDT]),
|
CLKDEV_CON_ID("rwdt0", &mstp_clks[HWBLK_RWDT]),
|
||||||
CLKDEV_CON_ID("dmac1", &mstp_clks[HWBLK_DMAC1]),
|
CLKDEV_CON_ID("dmac1", &mstp_clks[HWBLK_DMAC1]),
|
||||||
{
|
|
||||||
/* TMU3 */
|
|
||||||
.dev_id = "sh_tmu.3",
|
|
||||||
.con_id = "tmu_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_TMU1],
|
|
||||||
}, {
|
|
||||||
/* TMU4 */
|
|
||||||
.dev_id = "sh_tmu.4",
|
|
||||||
.con_id = "tmu_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_TMU1],
|
|
||||||
}, {
|
|
||||||
/* TMU5 */
|
|
||||||
.dev_id = "sh_tmu.5",
|
|
||||||
.con_id = "tmu_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_TMU1],
|
|
||||||
},
|
|
||||||
CLKDEV_CON_ID("flctl0", &mstp_clks[HWBLK_FLCTL]),
|
CLKDEV_CON_ID("flctl0", &mstp_clks[HWBLK_FLCTL]),
|
||||||
{
|
|
||||||
/* SCIF0 */
|
|
||||||
.dev_id = "sh-sci.0",
|
|
||||||
.con_id = "sci_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_SCIF0],
|
|
||||||
}, {
|
|
||||||
/* SCIF1 */
|
|
||||||
.dev_id = "sh-sci.1",
|
|
||||||
.con_id = "sci_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_SCIF1],
|
|
||||||
}, {
|
|
||||||
/* SCIF2 */
|
|
||||||
.dev_id = "sh-sci.2",
|
|
||||||
.con_id = "sci_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_SCIF2],
|
|
||||||
}, {
|
|
||||||
/* SCIF3 */
|
|
||||||
.dev_id = "sh-sci.3",
|
|
||||||
.con_id = "sci_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_SCIF3],
|
|
||||||
}, {
|
|
||||||
/* SCIF4 */
|
|
||||||
.dev_id = "sh-sci.4",
|
|
||||||
.con_id = "sci_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_SCIF4],
|
|
||||||
}, {
|
|
||||||
/* SCIF5 */
|
|
||||||
.dev_id = "sh-sci.5",
|
|
||||||
.con_id = "sci_fck",
|
|
||||||
.clk = &mstp_clks[HWBLK_SCIF5],
|
|
||||||
},
|
|
||||||
CLKDEV_CON_ID("msiof0", &mstp_clks[HWBLK_MSIOF0]),
|
CLKDEV_CON_ID("msiof0", &mstp_clks[HWBLK_MSIOF0]),
|
||||||
CLKDEV_CON_ID("msiof1", &mstp_clks[HWBLK_MSIOF1]),
|
CLKDEV_CON_ID("msiof1", &mstp_clks[HWBLK_MSIOF1]),
|
||||||
CLKDEV_CON_ID("meram0", &mstp_clks[HWBLK_MERAM]),
|
CLKDEV_CON_ID("meram0", &mstp_clks[HWBLK_MERAM]),
|
||||||
|
@ -324,6 +261,19 @@ static struct clk_lookup lookups[] = {
|
||||||
CLKDEV_CON_ID("veu0", &mstp_clks[HWBLK_VEU2H0]),
|
CLKDEV_CON_ID("veu0", &mstp_clks[HWBLK_VEU2H0]),
|
||||||
CLKDEV_CON_ID("vpu0", &mstp_clks[HWBLK_VPU]),
|
CLKDEV_CON_ID("vpu0", &mstp_clks[HWBLK_VPU]),
|
||||||
CLKDEV_CON_ID("lcdc0", &mstp_clks[HWBLK_LCDC]),
|
CLKDEV_CON_ID("lcdc0", &mstp_clks[HWBLK_LCDC]),
|
||||||
|
|
||||||
|
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.0", &mstp_clks[HWBLK_TMU0]),
|
||||||
|
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.1", &mstp_clks[HWBLK_TMU0]),
|
||||||
|
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.2", &mstp_clks[HWBLK_TMU0]),
|
||||||
|
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.3", &mstp_clks[HWBLK_TMU1]),
|
||||||
|
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.4", &mstp_clks[HWBLK_TMU1]),
|
||||||
|
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.5", &mstp_clks[HWBLK_TMU1]),
|
||||||
|
CLKDEV_ICK_ID("sci_fck", "sh-sci.0", &mstp_clks[HWBLK_SCIF0]),
|
||||||
|
CLKDEV_ICK_ID("sci_fck", "sh-sci.1", &mstp_clks[HWBLK_SCIF1]),
|
||||||
|
CLKDEV_ICK_ID("sci_fck", "sh-sci.2", &mstp_clks[HWBLK_SCIF2]),
|
||||||
|
CLKDEV_ICK_ID("sci_fck", "sh-sci.3", &mstp_clks[HWBLK_SCIF3]),
|
||||||
|
CLKDEV_ICK_ID("sci_fck", "sh-sci.4", &mstp_clks[HWBLK_SCIF4]),
|
||||||
|
CLKDEV_ICK_ID("sci_fck", "sh-sci.5", &mstp_clks[HWBLK_SCIF5]),
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init arch_clk_init(void)
|
int __init arch_clk_init(void)
|
||||||
|
|
|
@ -111,13 +111,16 @@ static struct clk div3_clk = {
|
||||||
.parent = &pll_clk,
|
.parent = &pll_clk,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* External input clock (pin name: FSIMCKA/FSIMCKB ) */
|
/* External input clock (pin name: FSIMCKA/FSIMCKB/DV_CLKI ) */
|
||||||
struct clk sh7724_fsimcka_clk = {
|
struct clk sh7724_fsimcka_clk = {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct clk sh7724_fsimckb_clk = {
|
struct clk sh7724_fsimckb_clk = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct clk sh7724_dv_clki = {
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk *main_clks[] = {
|
static struct clk *main_clks[] = {
|
||||||
&r_clk,
|
&r_clk,
|
||||||
&extal_clk,
|
&extal_clk,
|
||||||
|
@ -126,6 +129,7 @@ static struct clk *main_clks[] = {
|
||||||
&div3_clk,
|
&div3_clk,
|
||||||
&sh7724_fsimcka_clk,
|
&sh7724_fsimcka_clk,
|
||||||
&sh7724_fsimckb_clk,
|
&sh7724_fsimckb_clk,
|
||||||
|
&sh7724_dv_clki,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void div4_kick(struct clk *clk)
|
static void div4_kick(struct clk *clk)
|
||||||
|
@ -163,17 +167,20 @@ struct clk div4_clks[DIV4_NR] = {
|
||||||
[DIV4_M1] = DIV4(FRQCRB, 4, 0x2f7c, CLK_ENABLE_ON_INIT),
|
[DIV4_M1] = DIV4(FRQCRB, 4, 0x2f7c, CLK_ENABLE_ON_INIT),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { DIV6_V, DIV6_I, DIV6_S, DIV6_NR };
|
enum { DIV6_V, DIV6_I, DIV6_S, DIV6_FA, DIV6_FB, DIV6_NR };
|
||||||
|
|
||||||
static struct clk div6_clks[DIV6_NR] = {
|
|
||||||
[DIV6_V] = SH_CLK_DIV6(&div3_clk, VCLKCR, 0),
|
|
||||||
[DIV6_I] = SH_CLK_DIV6(&div3_clk, IRDACLKCR, 0),
|
|
||||||
[DIV6_S] = SH_CLK_DIV6(&div3_clk, SPUCLKCR, CLK_ENABLE_ON_INIT),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum { DIV6_FA, DIV6_FB, DIV6_REPARENT_NR };
|
|
||||||
|
|
||||||
/* Indices are important - they are the actual src selecting values */
|
/* Indices are important - they are the actual src selecting values */
|
||||||
|
static struct clk *common_parent[] = {
|
||||||
|
[0] = &div3_clk,
|
||||||
|
[1] = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *vclkcr_parent[8] = {
|
||||||
|
[0] = &div3_clk,
|
||||||
|
[2] = &sh7724_dv_clki,
|
||||||
|
[4] = &extal_clk,
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk *fclkacr_parent[] = {
|
static struct clk *fclkacr_parent[] = {
|
||||||
[0] = &div3_clk,
|
[0] = &div3_clk,
|
||||||
[1] = NULL,
|
[1] = NULL,
|
||||||
|
@ -188,10 +195,16 @@ static struct clk *fclkbcr_parent[] = {
|
||||||
[3] = NULL,
|
[3] = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
static struct clk div6_clks[DIV6_NR] = {
|
||||||
[DIV6_FA] = SH_CLK_DIV6_EXT(&div3_clk, FCLKACR, 0,
|
[DIV6_V] = SH_CLK_DIV6_EXT(VCLKCR, 0,
|
||||||
|
vclkcr_parent, ARRAY_SIZE(vclkcr_parent), 12, 3),
|
||||||
|
[DIV6_I] = SH_CLK_DIV6_EXT(IRDACLKCR, 0,
|
||||||
|
common_parent, ARRAY_SIZE(common_parent), 6, 1),
|
||||||
|
[DIV6_S] = SH_CLK_DIV6_EXT(SPUCLKCR, CLK_ENABLE_ON_INIT,
|
||||||
|
common_parent, ARRAY_SIZE(common_parent), 6, 1),
|
||||||
|
[DIV6_FA] = SH_CLK_DIV6_EXT(FCLKACR, 0,
|
||||||
fclkacr_parent, ARRAY_SIZE(fclkacr_parent), 6, 2),
|
fclkacr_parent, ARRAY_SIZE(fclkacr_parent), 6, 2),
|
||||||
[DIV6_FB] = SH_CLK_DIV6_EXT(&div3_clk, FCLKBCR, 0,
|
[DIV6_FB] = SH_CLK_DIV6_EXT(FCLKBCR, 0,
|
||||||
fclkbcr_parent, ARRAY_SIZE(fclkbcr_parent), 6, 2),
|
fclkbcr_parent, ARRAY_SIZE(fclkbcr_parent), 6, 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -269,8 +282,8 @@ static struct clk_lookup lookups[] = {
|
||||||
|
|
||||||
/* DIV6 clocks */
|
/* DIV6 clocks */
|
||||||
CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]),
|
CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]),
|
||||||
CLKDEV_CON_ID("fsia_clk", &div6_reparent_clks[DIV6_FA]),
|
CLKDEV_CON_ID("fsia_clk", &div6_clks[DIV6_FA]),
|
||||||
CLKDEV_CON_ID("fsib_clk", &div6_reparent_clks[DIV6_FB]),
|
CLKDEV_CON_ID("fsib_clk", &div6_clks[DIV6_FB]),
|
||||||
CLKDEV_CON_ID("irda_clk", &div6_clks[DIV6_I]),
|
CLKDEV_CON_ID("irda_clk", &div6_clks[DIV6_I]),
|
||||||
CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_S]),
|
CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_S]),
|
||||||
|
|
||||||
|
@ -356,10 +369,7 @@ int __init arch_clk_init(void)
|
||||||
ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
|
ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = sh_clk_div6_register(div6_clks, DIV6_NR);
|
ret = sh_clk_div6_reparent_register(div6_clks, DIV6_NR);
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
ret = sh_clk_div6_reparent_register(div6_reparent_clks, DIV6_REPARENT_NR);
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = sh_hwblk_clk_register(mstp_clks, HWBLK_NR);
|
ret = sh_hwblk_clk_register(mstp_clks, HWBLK_NR);
|
||||||
|
|
|
@ -431,10 +431,6 @@ extern unsigned long *sparc_valid_addr_bitmap;
|
||||||
#define kern_addr_valid(addr) \
|
#define kern_addr_valid(addr) \
|
||||||
(test_bit(__pa((unsigned long)(addr))>>20, sparc_valid_addr_bitmap))
|
(test_bit(__pa((unsigned long)(addr))>>20, sparc_valid_addr_bitmap))
|
||||||
|
|
||||||
extern int io_remap_pfn_range(struct vm_area_struct *vma,
|
|
||||||
unsigned long from, unsigned long pfn,
|
|
||||||
unsigned long size, pgprot_t prot);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For sparc32&64, the pfn in io_remap_pfn_range() carries <iospace> in
|
* For sparc32&64, the pfn in io_remap_pfn_range() carries <iospace> in
|
||||||
* its high 4 bits. These macros/functions put it there or get it from there.
|
* its high 4 bits. These macros/functions put it there or get it from there.
|
||||||
|
@ -443,6 +439,22 @@ extern int io_remap_pfn_range(struct vm_area_struct *vma,
|
||||||
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
||||||
#define GET_PFN(pfn) (pfn & 0x0fffffffUL)
|
#define GET_PFN(pfn) (pfn & 0x0fffffffUL)
|
||||||
|
|
||||||
|
extern int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long,
|
||||||
|
unsigned long, pgprot_t);
|
||||||
|
|
||||||
|
static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
||||||
|
unsigned long from, unsigned long pfn,
|
||||||
|
unsigned long size, pgprot_t prot)
|
||||||
|
{
|
||||||
|
unsigned long long offset, space, phys_base;
|
||||||
|
|
||||||
|
offset = ((unsigned long long) GET_PFN(pfn)) << PAGE_SHIFT;
|
||||||
|
space = GET_IOSPACE(pfn);
|
||||||
|
phys_base = offset | (space << 32ULL);
|
||||||
|
|
||||||
|
return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot);
|
||||||
|
}
|
||||||
|
|
||||||
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
||||||
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
|
#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
|
||||||
({ \
|
({ \
|
||||||
|
|
|
@ -757,10 +757,6 @@ static inline bool kern_addr_valid(unsigned long addr)
|
||||||
|
|
||||||
extern int page_in_phys_avail(unsigned long paddr);
|
extern int page_in_phys_avail(unsigned long paddr);
|
||||||
|
|
||||||
extern int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
|
||||||
unsigned long pfn,
|
|
||||||
unsigned long size, pgprot_t prot);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For sparc32&64, the pfn in io_remap_pfn_range() carries <iospace> in
|
* For sparc32&64, the pfn in io_remap_pfn_range() carries <iospace> in
|
||||||
* its high 4 bits. These macros/functions put it there or get it from there.
|
* its high 4 bits. These macros/functions put it there or get it from there.
|
||||||
|
@ -769,6 +765,22 @@ extern int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
||||||
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
#define GET_IOSPACE(pfn) (pfn >> (BITS_PER_LONG - 4))
|
||||||
#define GET_PFN(pfn) (pfn & 0x0fffffffffffffffUL)
|
#define GET_PFN(pfn) (pfn & 0x0fffffffffffffffUL)
|
||||||
|
|
||||||
|
extern int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long,
|
||||||
|
unsigned long, pgprot_t);
|
||||||
|
|
||||||
|
static inline int io_remap_pfn_range(struct vm_area_struct *vma,
|
||||||
|
unsigned long from, unsigned long pfn,
|
||||||
|
unsigned long size, pgprot_t prot)
|
||||||
|
{
|
||||||
|
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
||||||
|
int space = GET_IOSPACE(pfn);
|
||||||
|
unsigned long phys_base;
|
||||||
|
|
||||||
|
phys_base = offset | (((unsigned long) space) << 32UL);
|
||||||
|
|
||||||
|
return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot);
|
||||||
|
}
|
||||||
|
|
||||||
#include <asm-generic/pgtable.h>
|
#include <asm-generic/pgtable.h>
|
||||||
|
|
||||||
/* We provide our own get_unmapped_area to cope with VA holes and
|
/* We provide our own get_unmapped_area to cope with VA holes and
|
||||||
|
|
|
@ -42,6 +42,9 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
|
||||||
extern void fpload(unsigned long *fpregs, unsigned long *fsr);
|
extern void fpload(unsigned long *fpregs, unsigned long *fsr);
|
||||||
|
|
||||||
#else /* CONFIG_SPARC32 */
|
#else /* CONFIG_SPARC32 */
|
||||||
|
|
||||||
|
#include <asm/trap_block.h>
|
||||||
|
|
||||||
struct popc_3insn_patch_entry {
|
struct popc_3insn_patch_entry {
|
||||||
unsigned int addr;
|
unsigned int addr;
|
||||||
unsigned int insns[3];
|
unsigned int insns[3];
|
||||||
|
@ -57,6 +60,10 @@ extern struct popc_6insn_patch_entry __popc_6insn_patch,
|
||||||
__popc_6insn_patch_end;
|
__popc_6insn_patch_end;
|
||||||
|
|
||||||
extern void __init per_cpu_patch(void);
|
extern void __init per_cpu_patch(void);
|
||||||
|
extern void sun4v_patch_1insn_range(struct sun4v_1insn_patch_entry *,
|
||||||
|
struct sun4v_1insn_patch_entry *);
|
||||||
|
extern void sun4v_patch_2insn_range(struct sun4v_2insn_patch_entry *,
|
||||||
|
struct sun4v_2insn_patch_entry *);
|
||||||
extern void __init sun4v_patch(void);
|
extern void __init sun4v_patch(void);
|
||||||
extern void __init boot_cpu_id_too_large(int cpu);
|
extern void __init boot_cpu_id_too_large(int cpu);
|
||||||
extern unsigned int dcache_parity_tl1_occurred;
|
extern unsigned int dcache_parity_tl1_occurred;
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/spitfire.h>
|
#include <asm/spitfire.h>
|
||||||
|
|
||||||
|
#include "entry.h"
|
||||||
|
|
||||||
#ifdef CONFIG_SPARC64
|
#ifdef CONFIG_SPARC64
|
||||||
|
|
||||||
#include <linux/jump_label.h>
|
#include <linux/jump_label.h>
|
||||||
|
@ -203,6 +205,29 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SPARC64
|
#ifdef CONFIG_SPARC64
|
||||||
|
static void do_patch_sections(const Elf_Ehdr *hdr,
|
||||||
|
const Elf_Shdr *sechdrs)
|
||||||
|
{
|
||||||
|
const Elf_Shdr *s, *sun4v_1insn = NULL, *sun4v_2insn = NULL;
|
||||||
|
char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||||
|
|
||||||
|
for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
|
||||||
|
if (!strcmp(".sun4v_1insn_patch", secstrings + s->sh_name))
|
||||||
|
sun4v_1insn = s;
|
||||||
|
if (!strcmp(".sun4v_2insn_patch", secstrings + s->sh_name))
|
||||||
|
sun4v_2insn = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sun4v_1insn && tlb_type == hypervisor) {
|
||||||
|
void *p = (void *) sun4v_1insn->sh_addr;
|
||||||
|
sun4v_patch_1insn_range(p, p + sun4v_1insn->sh_size);
|
||||||
|
}
|
||||||
|
if (sun4v_2insn && tlb_type == hypervisor) {
|
||||||
|
void *p = (void *) sun4v_2insn->sh_addr;
|
||||||
|
sun4v_patch_2insn_range(p, p + sun4v_2insn->sh_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int module_finalize(const Elf_Ehdr *hdr,
|
int module_finalize(const Elf_Ehdr *hdr,
|
||||||
const Elf_Shdr *sechdrs,
|
const Elf_Shdr *sechdrs,
|
||||||
struct module *me)
|
struct module *me)
|
||||||
|
@ -210,6 +235,8 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
/* make jump label nops */
|
/* make jump label nops */
|
||||||
jump_label_apply_nops(me);
|
jump_label_apply_nops(me);
|
||||||
|
|
||||||
|
do_patch_sections(hdr, sechdrs);
|
||||||
|
|
||||||
/* Cheetah's I-cache is fully coherent. */
|
/* Cheetah's I-cache is fully coherent. */
|
||||||
if (tlb_type == spitfire) {
|
if (tlb_type == spitfire) {
|
||||||
unsigned long va;
|
unsigned long va;
|
||||||
|
|
|
@ -234,40 +234,50 @@ void __init per_cpu_patch(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sun4v_patch_1insn_range(struct sun4v_1insn_patch_entry *start,
|
||||||
|
struct sun4v_1insn_patch_entry *end)
|
||||||
|
{
|
||||||
|
while (start < end) {
|
||||||
|
unsigned long addr = start->addr;
|
||||||
|
|
||||||
|
*(unsigned int *) (addr + 0) = start->insn;
|
||||||
|
wmb();
|
||||||
|
__asm__ __volatile__("flush %0" : : "r" (addr + 0));
|
||||||
|
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sun4v_patch_2insn_range(struct sun4v_2insn_patch_entry *start,
|
||||||
|
struct sun4v_2insn_patch_entry *end)
|
||||||
|
{
|
||||||
|
while (start < end) {
|
||||||
|
unsigned long addr = start->addr;
|
||||||
|
|
||||||
|
*(unsigned int *) (addr + 0) = start->insns[0];
|
||||||
|
wmb();
|
||||||
|
__asm__ __volatile__("flush %0" : : "r" (addr + 0));
|
||||||
|
|
||||||
|
*(unsigned int *) (addr + 4) = start->insns[1];
|
||||||
|
wmb();
|
||||||
|
__asm__ __volatile__("flush %0" : : "r" (addr + 4));
|
||||||
|
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void __init sun4v_patch(void)
|
void __init sun4v_patch(void)
|
||||||
{
|
{
|
||||||
extern void sun4v_hvapi_init(void);
|
extern void sun4v_hvapi_init(void);
|
||||||
struct sun4v_1insn_patch_entry *p1;
|
|
||||||
struct sun4v_2insn_patch_entry *p2;
|
|
||||||
|
|
||||||
if (tlb_type != hypervisor)
|
if (tlb_type != hypervisor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p1 = &__sun4v_1insn_patch;
|
sun4v_patch_1insn_range(&__sun4v_1insn_patch,
|
||||||
while (p1 < &__sun4v_1insn_patch_end) {
|
&__sun4v_1insn_patch_end);
|
||||||
unsigned long addr = p1->addr;
|
|
||||||
|
|
||||||
*(unsigned int *) (addr + 0) = p1->insn;
|
sun4v_patch_2insn_range(&__sun4v_2insn_patch,
|
||||||
wmb();
|
&__sun4v_2insn_patch_end);
|
||||||
__asm__ __volatile__("flush %0" : : "r" (addr + 0));
|
|
||||||
|
|
||||||
p1++;
|
|
||||||
}
|
|
||||||
|
|
||||||
p2 = &__sun4v_2insn_patch;
|
|
||||||
while (p2 < &__sun4v_2insn_patch_end) {
|
|
||||||
unsigned long addr = p2->addr;
|
|
||||||
|
|
||||||
*(unsigned int *) (addr + 0) = p2->insns[0];
|
|
||||||
wmb();
|
|
||||||
__asm__ __volatile__("flush %0" : : "r" (addr + 0));
|
|
||||||
|
|
||||||
*(unsigned int *) (addr + 4) = p2->insns[1];
|
|
||||||
wmb();
|
|
||||||
__asm__ __volatile__("flush %0" : : "r" (addr + 4));
|
|
||||||
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
|
|
||||||
sun4v_hvapi_init();
|
sun4v_hvapi_init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -822,21 +822,23 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
|
||||||
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
||||||
* mistake.
|
* mistake.
|
||||||
*/
|
*/
|
||||||
void do_signal32(sigset_t *oldset, struct pt_regs * regs,
|
void do_signal32(sigset_t *oldset, struct pt_regs * regs)
|
||||||
int restart_syscall, unsigned long orig_i0)
|
|
||||||
{
|
{
|
||||||
struct k_sigaction ka;
|
struct k_sigaction ka;
|
||||||
|
unsigned long orig_i0;
|
||||||
|
int restart_syscall;
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signr;
|
int signr;
|
||||||
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||||
|
|
||||||
/* If the debugger messes with the program counter, it clears
|
|
||||||
* the "in syscall" bit, directing us to not perform a syscall
|
|
||||||
* restart.
|
|
||||||
*/
|
|
||||||
if (restart_syscall && !pt_regs_is_syscall(regs))
|
|
||||||
restart_syscall = 0;
|
restart_syscall = 0;
|
||||||
|
orig_i0 = 0;
|
||||||
|
if (pt_regs_is_syscall(regs) &&
|
||||||
|
(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
|
||||||
|
restart_syscall = 1;
|
||||||
|
orig_i0 = regs->u_regs[UREG_G6];
|
||||||
|
}
|
||||||
|
|
||||||
if (signr > 0) {
|
if (signr > 0) {
|
||||||
if (restart_syscall)
|
if (restart_syscall)
|
||||||
|
|
|
@ -519,10 +519,26 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signr;
|
int signr;
|
||||||
|
|
||||||
|
/* It's a lot of work and synchronization to add a new ptrace
|
||||||
|
* register for GDB to save and restore in order to get
|
||||||
|
* orig_i0 correct for syscall restarts when debugging.
|
||||||
|
*
|
||||||
|
* Although it should be the case that most of the global
|
||||||
|
* registers are volatile across a system call, glibc already
|
||||||
|
* depends upon that fact that we preserve them. So we can't
|
||||||
|
* just use any global register to save away the orig_i0 value.
|
||||||
|
*
|
||||||
|
* In particular %g2, %g3, %g4, and %g5 are all assumed to be
|
||||||
|
* preserved across a system call trap by various pieces of
|
||||||
|
* code in glibc.
|
||||||
|
*
|
||||||
|
* %g7 is used as the "thread register". %g6 is not used in
|
||||||
|
* any fixed manner. %g6 is used as a scratch register and
|
||||||
|
* a compiler temporary, but it's value is never used across
|
||||||
|
* a system call. Therefore %g6 is usable for orig_i0 storage.
|
||||||
|
*/
|
||||||
if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
|
if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
|
||||||
restart_syscall = 1;
|
regs->u_regs[UREG_G6] = orig_i0;
|
||||||
else
|
|
||||||
restart_syscall = 0;
|
|
||||||
|
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
oldset = ¤t->saved_sigmask;
|
oldset = ¤t->saved_sigmask;
|
||||||
|
@ -535,8 +551,12 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
|
||||||
* the software "in syscall" bit, directing us to not perform
|
* the software "in syscall" bit, directing us to not perform
|
||||||
* a syscall restart.
|
* a syscall restart.
|
||||||
*/
|
*/
|
||||||
if (restart_syscall && !pt_regs_is_syscall(regs))
|
|
||||||
restart_syscall = 0;
|
restart_syscall = 0;
|
||||||
|
if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) {
|
||||||
|
restart_syscall = 1;
|
||||||
|
orig_i0 = regs->u_regs[UREG_G6];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (signr > 0) {
|
if (signr > 0) {
|
||||||
if (restart_syscall)
|
if (restart_syscall)
|
||||||
|
|
|
@ -529,11 +529,27 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signr;
|
int signr;
|
||||||
|
|
||||||
|
/* It's a lot of work and synchronization to add a new ptrace
|
||||||
|
* register for GDB to save and restore in order to get
|
||||||
|
* orig_i0 correct for syscall restarts when debugging.
|
||||||
|
*
|
||||||
|
* Although it should be the case that most of the global
|
||||||
|
* registers are volatile across a system call, glibc already
|
||||||
|
* depends upon that fact that we preserve them. So we can't
|
||||||
|
* just use any global register to save away the orig_i0 value.
|
||||||
|
*
|
||||||
|
* In particular %g2, %g3, %g4, and %g5 are all assumed to be
|
||||||
|
* preserved across a system call trap by various pieces of
|
||||||
|
* code in glibc.
|
||||||
|
*
|
||||||
|
* %g7 is used as the "thread register". %g6 is not used in
|
||||||
|
* any fixed manner. %g6 is used as a scratch register and
|
||||||
|
* a compiler temporary, but it's value is never used across
|
||||||
|
* a system call. Therefore %g6 is usable for orig_i0 storage.
|
||||||
|
*/
|
||||||
if (pt_regs_is_syscall(regs) &&
|
if (pt_regs_is_syscall(regs) &&
|
||||||
(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
|
(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY)))
|
||||||
restart_syscall = 1;
|
regs->u_regs[UREG_G6] = orig_i0;
|
||||||
} else
|
|
||||||
restart_syscall = 0;
|
|
||||||
|
|
||||||
if (current_thread_info()->status & TS_RESTORE_SIGMASK)
|
if (current_thread_info()->status & TS_RESTORE_SIGMASK)
|
||||||
oldset = ¤t->saved_sigmask;
|
oldset = ¤t->saved_sigmask;
|
||||||
|
@ -542,22 +558,20 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
if (test_thread_flag(TIF_32BIT)) {
|
if (test_thread_flag(TIF_32BIT)) {
|
||||||
extern void do_signal32(sigset_t *, struct pt_regs *,
|
extern void do_signal32(sigset_t *, struct pt_regs *);
|
||||||
int restart_syscall,
|
do_signal32(oldset, regs);
|
||||||
unsigned long orig_i0);
|
|
||||||
do_signal32(oldset, regs, restart_syscall, orig_i0);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||||
|
|
||||||
/* If the debugger messes with the program counter, it clears
|
|
||||||
* the software "in syscall" bit, directing us to not perform
|
|
||||||
* a syscall restart.
|
|
||||||
*/
|
|
||||||
if (restart_syscall && !pt_regs_is_syscall(regs))
|
|
||||||
restart_syscall = 0;
|
restart_syscall = 0;
|
||||||
|
if (pt_regs_is_syscall(regs) &&
|
||||||
|
(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
|
||||||
|
restart_syscall = 1;
|
||||||
|
orig_i0 = regs->u_regs[UREG_G6];
|
||||||
|
}
|
||||||
|
|
||||||
if (signr > 0) {
|
if (signr > 0) {
|
||||||
if (restart_syscall)
|
if (restart_syscall)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
#include <asm/sigcontext.h>
|
#include <asm/sigcontext.h>
|
||||||
#include <asm/fpumacro.h>
|
#include <asm/fpumacro.h>
|
||||||
|
|
|
@ -8,7 +8,6 @@ obj-$(CONFIG_SPARC64) += ultra.o tlb.o tsb.o gup.o
|
||||||
obj-y += fault_$(BITS).o
|
obj-y += fault_$(BITS).o
|
||||||
obj-y += init_$(BITS).o
|
obj-y += init_$(BITS).o
|
||||||
obj-$(CONFIG_SPARC32) += loadmmu.o
|
obj-$(CONFIG_SPARC32) += loadmmu.o
|
||||||
obj-y += generic_$(BITS).o
|
|
||||||
obj-$(CONFIG_SPARC32) += extable.o btfixup.o srmmu.o iommu.o io-unit.o
|
obj-$(CONFIG_SPARC32) += extable.o btfixup.o srmmu.o iommu.o io-unit.o
|
||||||
obj-$(CONFIG_SPARC32) += hypersparc.o viking.o tsunami.o swift.o
|
obj-$(CONFIG_SPARC32) += hypersparc.o viking.o tsunami.o swift.o
|
||||||
obj-$(CONFIG_SPARC_LEON)+= leon_mm.o
|
obj-$(CONFIG_SPARC_LEON)+= leon_mm.o
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
* generic.c: Generic Sparc mm routines that are not dependent upon
|
|
||||||
* MMU type but are Sparc specific.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/pagemap.h>
|
|
||||||
#include <linux/export.h>
|
|
||||||
|
|
||||||
#include <asm/pgalloc.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/page.h>
|
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
#include <asm/tlbflush.h>
|
|
||||||
|
|
||||||
/* Remap IO memory, the same way as remap_pfn_range(), but use
|
|
||||||
* the obio memory space.
|
|
||||||
*
|
|
||||||
* They use a pgprot that sets PAGE_IO and does not check the
|
|
||||||
* mem_map table as this is independent of normal memory.
|
|
||||||
*/
|
|
||||||
static inline void io_remap_pte_range(struct mm_struct *mm, pte_t * pte, unsigned long address, unsigned long size,
|
|
||||||
unsigned long offset, pgprot_t prot, int space)
|
|
||||||
{
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
address &= ~PMD_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PMD_SIZE)
|
|
||||||
end = PMD_SIZE;
|
|
||||||
do {
|
|
||||||
set_pte_at(mm, address, pte, mk_pte_io(offset, prot, space));
|
|
||||||
address += PAGE_SIZE;
|
|
||||||
offset += PAGE_SIZE;
|
|
||||||
pte++;
|
|
||||||
} while (address < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int io_remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
|
|
||||||
unsigned long offset, pgprot_t prot, int space)
|
|
||||||
{
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
address &= ~PGDIR_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PGDIR_SIZE)
|
|
||||||
end = PGDIR_SIZE;
|
|
||||||
offset -= address;
|
|
||||||
do {
|
|
||||||
pte_t *pte = pte_alloc_map(mm, NULL, pmd, address);
|
|
||||||
if (!pte)
|
|
||||||
return -ENOMEM;
|
|
||||||
io_remap_pte_range(mm, pte, address, end - address, address + offset, prot, space);
|
|
||||||
address = (address + PMD_SIZE) & PMD_MASK;
|
|
||||||
pmd++;
|
|
||||||
} while (address < end);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
|
||||||
unsigned long pfn, unsigned long size, pgprot_t prot)
|
|
||||||
{
|
|
||||||
int error = 0;
|
|
||||||
pgd_t * dir;
|
|
||||||
unsigned long beg = from;
|
|
||||||
unsigned long end = from + size;
|
|
||||||
struct mm_struct *mm = vma->vm_mm;
|
|
||||||
int space = GET_IOSPACE(pfn);
|
|
||||||
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
|
||||||
|
|
||||||
/* See comment in mm/memory.c remap_pfn_range */
|
|
||||||
vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
|
|
||||||
vma->vm_pgoff = (offset >> PAGE_SHIFT) |
|
|
||||||
((unsigned long)space << 28UL);
|
|
||||||
|
|
||||||
offset -= from;
|
|
||||||
dir = pgd_offset(mm, from);
|
|
||||||
flush_cache_range(vma, beg, end);
|
|
||||||
|
|
||||||
while (from < end) {
|
|
||||||
pmd_t *pmd = pmd_alloc(mm, dir, from);
|
|
||||||
error = -ENOMEM;
|
|
||||||
if (!pmd)
|
|
||||||
break;
|
|
||||||
error = io_remap_pmd_range(mm, pmd, from, end - from, offset + from, prot, space);
|
|
||||||
if (error)
|
|
||||||
break;
|
|
||||||
from = (from + PGDIR_SIZE) & PGDIR_MASK;
|
|
||||||
dir++;
|
|
||||||
}
|
|
||||||
|
|
||||||
flush_tlb_range(vma, beg, end);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(io_remap_pfn_range);
|
|
|
@ -1,165 +0,0 @@
|
||||||
/*
|
|
||||||
* generic.c: Generic Sparc mm routines that are not dependent upon
|
|
||||||
* MMU type but are Sparc specific.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/export.h>
|
|
||||||
#include <linux/pagemap.h>
|
|
||||||
|
|
||||||
#include <asm/pgalloc.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/page.h>
|
|
||||||
#include <asm/tlbflush.h>
|
|
||||||
|
|
||||||
/* Remap IO memory, the same way as remap_pfn_range(), but use
|
|
||||||
* the obio memory space.
|
|
||||||
*
|
|
||||||
* They use a pgprot that sets PAGE_IO and does not check the
|
|
||||||
* mem_map table as this is independent of normal memory.
|
|
||||||
*/
|
|
||||||
static inline void io_remap_pte_range(struct mm_struct *mm, pte_t * pte,
|
|
||||||
unsigned long address,
|
|
||||||
unsigned long size,
|
|
||||||
unsigned long offset, pgprot_t prot,
|
|
||||||
int space)
|
|
||||||
{
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
/* clear hack bit that was used as a write_combine side-effect flag */
|
|
||||||
offset &= ~0x1UL;
|
|
||||||
address &= ~PMD_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PMD_SIZE)
|
|
||||||
end = PMD_SIZE;
|
|
||||||
do {
|
|
||||||
pte_t entry;
|
|
||||||
unsigned long curend = address + PAGE_SIZE;
|
|
||||||
|
|
||||||
entry = mk_pte_io(offset, prot, space, PAGE_SIZE);
|
|
||||||
if (!(address & 0xffff)) {
|
|
||||||
if (PAGE_SIZE < (4 * 1024 * 1024) &&
|
|
||||||
!(address & 0x3fffff) &&
|
|
||||||
!(offset & 0x3ffffe) &&
|
|
||||||
end >= address + 0x400000) {
|
|
||||||
entry = mk_pte_io(offset, prot, space,
|
|
||||||
4 * 1024 * 1024);
|
|
||||||
curend = address + 0x400000;
|
|
||||||
offset += 0x400000;
|
|
||||||
} else if (PAGE_SIZE < (512 * 1024) &&
|
|
||||||
!(address & 0x7ffff) &&
|
|
||||||
!(offset & 0x7fffe) &&
|
|
||||||
end >= address + 0x80000) {
|
|
||||||
entry = mk_pte_io(offset, prot, space,
|
|
||||||
512 * 1024 * 1024);
|
|
||||||
curend = address + 0x80000;
|
|
||||||
offset += 0x80000;
|
|
||||||
} else if (PAGE_SIZE < (64 * 1024) &&
|
|
||||||
!(offset & 0xfffe) &&
|
|
||||||
end >= address + 0x10000) {
|
|
||||||
entry = mk_pte_io(offset, prot, space,
|
|
||||||
64 * 1024);
|
|
||||||
curend = address + 0x10000;
|
|
||||||
offset += 0x10000;
|
|
||||||
} else
|
|
||||||
offset += PAGE_SIZE;
|
|
||||||
} else
|
|
||||||
offset += PAGE_SIZE;
|
|
||||||
|
|
||||||
if (pte_write(entry))
|
|
||||||
entry = pte_mkdirty(entry);
|
|
||||||
do {
|
|
||||||
BUG_ON(!pte_none(*pte));
|
|
||||||
set_pte_at(mm, address, pte, entry);
|
|
||||||
address += PAGE_SIZE;
|
|
||||||
pte_val(entry) += PAGE_SIZE;
|
|
||||||
pte++;
|
|
||||||
} while (address < curend);
|
|
||||||
} while (address < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int io_remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
|
|
||||||
unsigned long offset, pgprot_t prot, int space)
|
|
||||||
{
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
address &= ~PGDIR_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PGDIR_SIZE)
|
|
||||||
end = PGDIR_SIZE;
|
|
||||||
offset -= address;
|
|
||||||
do {
|
|
||||||
pte_t *pte = pte_alloc_map(mm, NULL, pmd, address);
|
|
||||||
if (!pte)
|
|
||||||
return -ENOMEM;
|
|
||||||
io_remap_pte_range(mm, pte, address, end - address, address + offset, prot, space);
|
|
||||||
pte_unmap(pte);
|
|
||||||
address = (address + PMD_SIZE) & PMD_MASK;
|
|
||||||
pmd++;
|
|
||||||
} while (address < end);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int io_remap_pud_range(struct mm_struct *mm, pud_t * pud, unsigned long address, unsigned long size,
|
|
||||||
unsigned long offset, pgprot_t prot, int space)
|
|
||||||
{
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
address &= ~PUD_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PUD_SIZE)
|
|
||||||
end = PUD_SIZE;
|
|
||||||
offset -= address;
|
|
||||||
do {
|
|
||||||
pmd_t *pmd = pmd_alloc(mm, pud, address);
|
|
||||||
if (!pud)
|
|
||||||
return -ENOMEM;
|
|
||||||
io_remap_pmd_range(mm, pmd, address, end - address, address + offset, prot, space);
|
|
||||||
address = (address + PUD_SIZE) & PUD_MASK;
|
|
||||||
pud++;
|
|
||||||
} while (address < end);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
|
||||||
unsigned long pfn, unsigned long size, pgprot_t prot)
|
|
||||||
{
|
|
||||||
int error = 0;
|
|
||||||
pgd_t * dir;
|
|
||||||
unsigned long beg = from;
|
|
||||||
unsigned long end = from + size;
|
|
||||||
struct mm_struct *mm = vma->vm_mm;
|
|
||||||
int space = GET_IOSPACE(pfn);
|
|
||||||
unsigned long offset = GET_PFN(pfn) << PAGE_SHIFT;
|
|
||||||
unsigned long phys_base;
|
|
||||||
|
|
||||||
phys_base = offset | (((unsigned long) space) << 32UL);
|
|
||||||
|
|
||||||
/* See comment in mm/memory.c remap_pfn_range */
|
|
||||||
vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
|
|
||||||
vma->vm_pgoff = phys_base >> PAGE_SHIFT;
|
|
||||||
|
|
||||||
offset -= from;
|
|
||||||
dir = pgd_offset(mm, from);
|
|
||||||
flush_cache_range(vma, beg, end);
|
|
||||||
|
|
||||||
while (from < end) {
|
|
||||||
pud_t *pud = pud_alloc(mm, dir, from);
|
|
||||||
error = -ENOMEM;
|
|
||||||
if (!pud)
|
|
||||||
break;
|
|
||||||
error = io_remap_pud_range(mm, pud, from, end - from, offset + from, prot, space);
|
|
||||||
if (error)
|
|
||||||
break;
|
|
||||||
from = (from + PGDIR_SIZE) & PGDIR_MASK;
|
|
||||||
dir++;
|
|
||||||
}
|
|
||||||
|
|
||||||
flush_tlb_range(vma, beg, end);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(io_remap_pfn_range);
|
|
|
@ -237,13 +237,13 @@ menu "PKUnity NetBook-0916 Features"
|
||||||
|
|
||||||
config I2C_BATTERY_BQ27200
|
config I2C_BATTERY_BQ27200
|
||||||
tristate "I2C Battery BQ27200 Support"
|
tristate "I2C Battery BQ27200 Support"
|
||||||
select PUV3_I2C
|
select I2C_PUV3
|
||||||
select POWER_SUPPLY
|
select POWER_SUPPLY
|
||||||
select BATTERY_BQ27x00
|
select BATTERY_BQ27x00
|
||||||
|
|
||||||
config I2C_EEPROM_AT24
|
config I2C_EEPROM_AT24
|
||||||
tristate "I2C EEPROMs AT24 support"
|
tristate "I2C EEPROMs AT24 support"
|
||||||
select PUV3_I2C
|
select I2C_PUV3
|
||||||
select MISC_DEVICES
|
select MISC_DEVICES
|
||||||
select EEPROM_AT24
|
select EEPROM_AT24
|
||||||
|
|
||||||
|
|
|
@ -44,18 +44,4 @@ config DEBUG_OCD
|
||||||
Say Y here if you want the debug print routines to direct their
|
Say Y here if you want the debug print routines to direct their
|
||||||
output to the UniCore On-Chip-Debugger channel using CP #1.
|
output to the UniCore On-Chip-Debugger channel using CP #1.
|
||||||
|
|
||||||
config DEBUG_OCD_BREAKPOINT
|
|
||||||
bool "Breakpoint support via On-Chip-Debugger"
|
|
||||||
depends on DEBUG_OCD
|
|
||||||
|
|
||||||
config DEBUG_UART
|
|
||||||
int "Kernel low-level debugging messages via serial port"
|
|
||||||
depends on DEBUG_LL
|
|
||||||
range 0 1
|
|
||||||
default "0"
|
|
||||||
help
|
|
||||||
Choice for UART for kernel low-level using PKUnity UARTS,
|
|
||||||
should be between zero and one. The port must have been
|
|
||||||
initialised by the boot-loader before use.
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
# Copyright (C) 2001~2010 GUAN Xue-tao
|
# Copyright (C) 2001~2010 GUAN Xue-tao
|
||||||
#
|
#
|
||||||
|
|
||||||
EXTRA_CFLAGS := -fpic -fno-builtin
|
ccflags-y := -fpic -fno-builtin
|
||||||
EXTRA_AFLAGS := -Wa,-march=all
|
asflags-y := -Wa,-march=all
|
||||||
|
|
||||||
OBJS := misc.o
|
OBJS := misc.o
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,6 @@
|
||||||
#ifndef __UNICORE_BITOPS_H__
|
#ifndef __UNICORE_BITOPS_H__
|
||||||
#define __UNICORE_BITOPS_H__
|
#define __UNICORE_BITOPS_H__
|
||||||
|
|
||||||
#define find_next_bit __uc32_find_next_bit
|
|
||||||
#define find_next_zero_bit __uc32_find_next_zero_bit
|
|
||||||
|
|
||||||
#define find_first_bit __uc32_find_first_bit
|
|
||||||
#define find_first_zero_bit __uc32_find_first_zero_bit
|
|
||||||
|
|
||||||
#define _ASM_GENERIC_BITOPS_FLS_H_
|
#define _ASM_GENERIC_BITOPS_FLS_H_
|
||||||
#define _ASM_GENERIC_BITOPS___FLS_H_
|
#define _ASM_GENERIC_BITOPS___FLS_H_
|
||||||
#define _ASM_GENERIC_BITOPS_FFS_H_
|
#define _ASM_GENERIC_BITOPS_FFS_H_
|
||||||
|
@ -44,4 +38,10 @@ static inline int fls(int x)
|
||||||
|
|
||||||
#include <asm-generic/bitops.h>
|
#include <asm-generic/bitops.h>
|
||||||
|
|
||||||
|
/* following definitions: to avoid using codes in lib/find_*.c */
|
||||||
|
#define find_next_bit find_next_bit
|
||||||
|
#define find_next_zero_bit find_next_zero_bit
|
||||||
|
#define find_first_bit find_first_bit
|
||||||
|
#define find_first_zero_bit find_first_zero_bit
|
||||||
|
|
||||||
#endif /* __UNICORE_BITOPS_H__ */
|
#endif /* __UNICORE_BITOPS_H__ */
|
||||||
|
|
|
@ -53,7 +53,6 @@ struct thread_struct {
|
||||||
#define start_thread(regs, pc, sp) \
|
#define start_thread(regs, pc, sp) \
|
||||||
({ \
|
({ \
|
||||||
unsigned long *stack = (unsigned long *)sp; \
|
unsigned long *stack = (unsigned long *)sp; \
|
||||||
set_fs(USER_DS); \
|
|
||||||
memset(regs->uregs, 0, sizeof(regs->uregs)); \
|
memset(regs->uregs, 0, sizeof(regs->uregs)); \
|
||||||
regs->UCreg_asr = USER_MODE; \
|
regs->UCreg_asr = USER_MODE; \
|
||||||
regs->UCreg_pc = pc & ~1; /* pc */ \
|
regs->UCreg_pc = pc & ~1; /* pc */ \
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
|
|
||||||
#include "ksyms.h"
|
#include "ksyms.h"
|
||||||
|
|
||||||
EXPORT_SYMBOL(__uc32_find_next_zero_bit);
|
EXPORT_SYMBOL(find_next_zero_bit);
|
||||||
EXPORT_SYMBOL(__uc32_find_next_bit);
|
EXPORT_SYMBOL(find_next_bit);
|
||||||
|
|
||||||
EXPORT_SYMBOL(__backtrace);
|
EXPORT_SYMBOL(__backtrace);
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
* Purpose : Find a 'zero' bit
|
* Purpose : Find a 'zero' bit
|
||||||
* Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
|
* Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
|
||||||
*/
|
*/
|
||||||
__uc32_find_first_zero_bit:
|
ENTRY(find_first_zero_bit)
|
||||||
cxor.a r1, #0
|
cxor.a r1, #0
|
||||||
beq 3f
|
beq 3f
|
||||||
mov r2, #0
|
mov r2, #0
|
||||||
|
@ -29,13 +29,14 @@ __uc32_find_first_zero_bit:
|
||||||
bub 1b
|
bub 1b
|
||||||
3: mov r0, r1 @ no free bits
|
3: mov r0, r1 @ no free bits
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(find_first_zero_bit)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Purpose : Find next 'zero' bit
|
* Purpose : Find next 'zero' bit
|
||||||
* Prototype: int find_next_zero_bit
|
* Prototype: int find_next_zero_bit
|
||||||
* (void *addr, unsigned int maxbit, int offset)
|
* (void *addr, unsigned int maxbit, int offset)
|
||||||
*/
|
*/
|
||||||
ENTRY(__uc32_find_next_zero_bit)
|
ENTRY(find_next_zero_bit)
|
||||||
cxor.a r1, #0
|
cxor.a r1, #0
|
||||||
beq 3b
|
beq 3b
|
||||||
and.a ip, r2, #7
|
and.a ip, r2, #7
|
||||||
|
@ -47,14 +48,14 @@ ENTRY(__uc32_find_next_zero_bit)
|
||||||
or r2, r2, #7 @ if zero, then no bits here
|
or r2, r2, #7 @ if zero, then no bits here
|
||||||
add r2, r2, #1 @ align bit pointer
|
add r2, r2, #1 @ align bit pointer
|
||||||
b 2b @ loop for next bit
|
b 2b @ loop for next bit
|
||||||
ENDPROC(__uc32_find_next_zero_bit)
|
ENDPROC(find_next_zero_bit)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Purpose : Find a 'one' bit
|
* Purpose : Find a 'one' bit
|
||||||
* Prototype: int find_first_bit
|
* Prototype: int find_first_bit
|
||||||
* (const unsigned long *addr, unsigned int maxbit);
|
* (const unsigned long *addr, unsigned int maxbit);
|
||||||
*/
|
*/
|
||||||
__uc32_find_first_bit:
|
ENTRY(find_first_bit)
|
||||||
cxor.a r1, #0
|
cxor.a r1, #0
|
||||||
beq 3f
|
beq 3f
|
||||||
mov r2, #0
|
mov r2, #0
|
||||||
|
@ -66,13 +67,14 @@ __uc32_find_first_bit:
|
||||||
bub 1b
|
bub 1b
|
||||||
3: mov r0, r1 @ no free bits
|
3: mov r0, r1 @ no free bits
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(find_first_bit)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Purpose : Find next 'one' bit
|
* Purpose : Find next 'one' bit
|
||||||
* Prototype: int find_next_zero_bit
|
* Prototype: int find_next_zero_bit
|
||||||
* (void *addr, unsigned int maxbit, int offset)
|
* (void *addr, unsigned int maxbit, int offset)
|
||||||
*/
|
*/
|
||||||
ENTRY(__uc32_find_next_bit)
|
ENTRY(find_next_bit)
|
||||||
cxor.a r1, #0
|
cxor.a r1, #0
|
||||||
beq 3b
|
beq 3b
|
||||||
and.a ip, r2, #7
|
and.a ip, r2, #7
|
||||||
|
@ -83,7 +85,7 @@ ENTRY(__uc32_find_next_bit)
|
||||||
or r2, r2, #7 @ if zero, then no bits here
|
or r2, r2, #7 @ if zero, then no bits here
|
||||||
add r2, r2, #1 @ align bit pointer
|
add r2, r2, #1 @ align bit pointer
|
||||||
b 2b @ loop for next bit
|
b 2b @ loop for next bit
|
||||||
ENDPROC(__uc32_find_next_bit)
|
ENDPROC(find_next_bit)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* One or more bits in the LSB of r3 are assumed to be set.
|
* One or more bits in the LSB of r3 are assumed to be set.
|
||||||
|
|
|
@ -49,6 +49,7 @@ extern unsigned int apic_verbosity;
|
||||||
extern int local_apic_timer_c2_ok;
|
extern int local_apic_timer_c2_ok;
|
||||||
|
|
||||||
extern int disable_apic;
|
extern int disable_apic;
|
||||||
|
extern unsigned int lapic_timer_frequency;
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
extern void __inquire_remote_apic(int apicid);
|
extern void __inquire_remote_apic(int apicid);
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#define NMI_REASON_CLEAR_IOCHK 0x08
|
#define NMI_REASON_CLEAR_IOCHK 0x08
|
||||||
#define NMI_REASON_CLEAR_MASK 0x0f
|
#define NMI_REASON_CLEAR_MASK 0x0f
|
||||||
|
|
||||||
static inline unsigned char get_nmi_reason(void)
|
static inline unsigned char default_get_nmi_reason(void)
|
||||||
{
|
{
|
||||||
return inb(NMI_REASON_PORT);
|
return inb(NMI_REASON_PORT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,10 @@ int mce_notify_irq(void);
|
||||||
void mce_notify_process(void);
|
void mce_notify_process(void);
|
||||||
|
|
||||||
DECLARE_PER_CPU(struct mce, injectm);
|
DECLARE_PER_CPU(struct mce, injectm);
|
||||||
extern struct file_operations mce_chrdev_ops;
|
|
||||||
|
extern void register_mce_write_callback(ssize_t (*)(struct file *filp,
|
||||||
|
const char __user *ubuf,
|
||||||
|
size_t usize, loff_t *off));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exception handler
|
* Exception handler
|
||||||
|
|
|
@ -44,6 +44,13 @@ enum mrst_timer_options {
|
||||||
|
|
||||||
extern enum mrst_timer_options mrst_timer_options;
|
extern enum mrst_timer_options mrst_timer_options;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Penwell uses spread spectrum clock, so the freq number is not exactly
|
||||||
|
* the same as reported by MSR based on SDM.
|
||||||
|
*/
|
||||||
|
#define PENWELL_FSB_FREQ_83SKU 83200
|
||||||
|
#define PENWELL_FSB_FREQ_100SKU 99840
|
||||||
|
|
||||||
#define SFI_MTMR_MAX_NUM 8
|
#define SFI_MTMR_MAX_NUM 8
|
||||||
#define SFI_MRTC_MAX 8
|
#define SFI_MRTC_MAX 8
|
||||||
|
|
||||||
|
|
|
@ -152,6 +152,7 @@ struct x86_cpuinit_ops {
|
||||||
/**
|
/**
|
||||||
* struct x86_platform_ops - platform specific runtime functions
|
* struct x86_platform_ops - platform specific runtime functions
|
||||||
* @calibrate_tsc: calibrate TSC
|
* @calibrate_tsc: calibrate TSC
|
||||||
|
* @wallclock_init: init the wallclock device
|
||||||
* @get_wallclock: get time from HW clock like RTC etc.
|
* @get_wallclock: get time from HW clock like RTC etc.
|
||||||
* @set_wallclock: set time back to HW clock
|
* @set_wallclock: set time back to HW clock
|
||||||
* @is_untracked_pat_range exclude from PAT logic
|
* @is_untracked_pat_range exclude from PAT logic
|
||||||
|
@ -160,11 +161,13 @@ struct x86_cpuinit_ops {
|
||||||
*/
|
*/
|
||||||
struct x86_platform_ops {
|
struct x86_platform_ops {
|
||||||
unsigned long (*calibrate_tsc)(void);
|
unsigned long (*calibrate_tsc)(void);
|
||||||
|
void (*wallclock_init)(void);
|
||||||
unsigned long (*get_wallclock)(void);
|
unsigned long (*get_wallclock)(void);
|
||||||
int (*set_wallclock)(unsigned long nowtime);
|
int (*set_wallclock)(unsigned long nowtime);
|
||||||
void (*iommu_shutdown)(void);
|
void (*iommu_shutdown)(void);
|
||||||
bool (*is_untracked_pat_range)(u64 start, u64 end);
|
bool (*is_untracked_pat_range)(u64 start, u64 end);
|
||||||
void (*nmi_init)(void);
|
void (*nmi_init)(void);
|
||||||
|
unsigned char (*get_nmi_reason)(void);
|
||||||
int (*i8042_detect)(void);
|
int (*i8042_detect)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -738,5 +738,5 @@ void __kprobes text_poke_smp_batch(struct text_poke_param *params, int n)
|
||||||
|
|
||||||
atomic_set(&stop_machine_first, 1);
|
atomic_set(&stop_machine_first, 1);
|
||||||
wrote_text = 0;
|
wrote_text = 0;
|
||||||
__stop_machine(stop_machine_text_poke, (void *)&tpp, NULL);
|
__stop_machine(stop_machine_text_poke, (void *)&tpp, cpu_online_mask);
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue