This is the 4.4.16 stable release

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iQIcBAABCAAGBQJXmOXmAAoJEDjbvchgkmk+QYIP/1S8oBZsvjfDzvH8t63HyLeH
 i43MFlYoFAqUIZc002XpluSvZ8uHoG+r7R8Hq3wmv48wxe3M6OBnMdBVTht6mPw+
 t5OLTZr40lWaJm2EIi4aekueMIrCgmL+Et+IFYv7ZVBuYLteVcfny+zdq4EqGmgj
 /a19+L/sTTr4SHtJIhHxWhiVJ9fVMgQk/N3VgQmIiNF2+lVbiFI7QQiDPLbFl0KK
 CM4ETO22HxHCYilGpzhpSMsHCxv12VqNaXNLAsPAepGGW7PqvUmrEWAqgwsbOfRc
 GxTLNk0dUgJqMrfEpQ8ZOMlgzvCAYG2jZuNSuT+nuzrWSUP+WOGRi9TTTxp1CYuZ
 PHlhNTH7ZnqosxJUUZS2d9N5ygpqD48Rhlfl824YzOWCy94VeUnedkVLb20uJwPF
 Y5aQ5WjktBC9why5e4OgGQERvx/U9KTk8E1zRfZZPc2oft9My0YxuemjjKAKZiYN
 ne4WhXbgOJTQkAoZwh2xqny3bWyEaoSrWpQ3R7bBJ9SIRLEOdCKzKpduDbAnbMP7
 QWgQOQC/6qA1mKqjrqF4KPA1Quo9PcUK2Ajh523ewMGCowgY90vyejAgh4Q8g0GC
 fKlx+jJDoKVDbQ8v4hc9PPHMsNNIKT9a1ptwVS3lE+bq1D5Ffm57A4/uOTMYHVab
 gKqu8h1CA0MCVBsH3nNA
 =nY8S
 -----END PGP SIGNATURE-----

Merge tag 'v4.4.16' into android-4.4.y

This is the 4.4.16 stable release

Change-Id: Ibaf7b7e03695e1acebc654a2ca1a4bfcc48fcea4
This commit is contained in:
Dmitry Shmidt 2016-08-01 15:51:01 -07:00
commit b558f17a13
1638 changed files with 19754 additions and 9241 deletions

View file

@ -1,4 +1,4 @@
What /sys/bus/iio/devices/iio:deviceX/in_proximity_raw What /sys/bus/iio/devices/iio:deviceX/in_proximity_input
Date: March 2014 Date: March 2014
KernelVersion: 3.15 KernelVersion: 3.15
Contact: Matt Ranostay <mranostay@gmail.com> Contact: Matt Ranostay <mranostay@gmail.com>

View file

@ -134,19 +134,21 @@ Description:
enabled for the device. Developer can write y/Y/1 or n/N/0 to enabled for the device. Developer can write y/Y/1 or n/N/0 to
the file to enable/disable the feature. the file to enable/disable the feature.
What: /sys/bus/usb/devices/.../power/usb3_hardware_lpm What: /sys/bus/usb/devices/.../power/usb3_hardware_lpm_u1
Date: June 2015 /sys/bus/usb/devices/.../power/usb3_hardware_lpm_u2
Date: November 2015
Contact: Kevin Strasser <kevin.strasser@linux.intel.com> Contact: Kevin Strasser <kevin.strasser@linux.intel.com>
Lu Baolu <baolu.lu@linux.intel.com>
Description: Description:
If CONFIG_PM is set and a USB 3.0 lpm-capable device is plugged If CONFIG_PM is set and a USB 3.0 lpm-capable device is plugged
in to a xHCI host which supports link PM, it will check if U1 in to a xHCI host which supports link PM, it will check if U1
and U2 exit latencies have been set in the BOS descriptor; if and U2 exit latencies have been set in the BOS descriptor; if
the check is is passed and the host supports USB3 hardware LPM, the check is passed and the host supports USB3 hardware LPM,
USB3 hardware LPM will be enabled for the device and the USB USB3 hardware LPM will be enabled for the device and the USB
device directory will contain a file named device directory will contain two files named
power/usb3_hardware_lpm. The file holds a string value (enable power/usb3_hardware_lpm_u1 and power/usb3_hardware_lpm_u2. These
or disable) indicating whether or not USB3 hardware LPM is files hold a string value (enable or disable) indicating whether
enabled for the device. or not USB3 hardware LPM U1 or U2 is enabled for the device.
What: /sys/bus/usb/devices/.../removable What: /sys/bus/usb/devices/.../removable
Date: February 2012 Date: February 2012

View file

@ -23,6 +23,7 @@ Optional properties:
during suspend. during suspend.
- ti,no-reset-on-init: When present, the module should not be reset at init - ti,no-reset-on-init: When present, the module should not be reset at init
- ti,no-idle-on-init: When present, the module should not be idled at init - ti,no-idle-on-init: When present, the module should not be idled at init
- ti,no-idle: When present, the module is never allowed to idle.
Example: Example:

View file

@ -30,6 +30,10 @@ Optional properties:
- target-supply : regulator for SATA target power - target-supply : regulator for SATA target power
- phys : reference to the SATA PHY node - phys : reference to the SATA PHY node
- phy-names : must be "sata-phy" - phy-names : must be "sata-phy"
- ports-implemented : Mask that indicates which ports that the HBA supports
are available for software to use. Useful if PORTS_IMPL
is not programmed by the BIOS, which is true with
some embedded SOC's.
Required properties when using sub-nodes: Required properties when using sub-nodes:
- #address-cells : number of cells to encode an address - #address-cells : number of cells to encode an address

View file

@ -94,6 +94,7 @@ clocks and IDs.
csi_sel 79 csi_sel 79
iim_gate 80 iim_gate 80
gpu2d_gate 81 gpu2d_gate 81
ckli_gate 82
Examples: Examples:

View file

@ -134,12 +134,12 @@ mfio80 ddr_debug, mips_trace_data, mips_debug
mfio81 dreq0, mips_trace_data, eth_debug mfio81 dreq0, mips_trace_data, eth_debug
mfio82 dreq1, mips_trace_data, eth_debug mfio82 dreq1, mips_trace_data, eth_debug
mfio83 mips_pll_lock, mips_trace_data, usb_debug mfio83 mips_pll_lock, mips_trace_data, usb_debug
mfio84 sys_pll_lock, mips_trace_data, usb_debug mfio84 audio_pll_lock, mips_trace_data, usb_debug
mfio85 wifi_pll_lock, mips_trace_data, sdhost_debug mfio85 rpu_v_pll_lock, mips_trace_data, sdhost_debug
mfio86 bt_pll_lock, mips_trace_data, sdhost_debug mfio86 rpu_l_pll_lock, mips_trace_data, sdhost_debug
mfio87 rpu_v_pll_lock, dreq2, socif_debug mfio87 sys_pll_lock, dreq2, socif_debug
mfio88 rpu_l_pll_lock, dreq3, socif_debug mfio88 wifi_pll_lock, dreq3, socif_debug
mfio89 audio_pll_lock, dreq4, dreq5 mfio89 bt_pll_lock, dreq4, dreq5
tck tck
trstn trstn
tdi tdi

View file

@ -14,3 +14,10 @@ filesystem.
efivarfs is typically mounted like this, efivarfs is typically mounted like this,
mount -t efivarfs none /sys/firmware/efi/efivars mount -t efivarfs none /sys/firmware/efi/efivars
Due to the presence of numerous firmware bugs where removing non-standard
UEFI variables causes the system firmware to fail to POST, efivarfs
files that are not well-known standardized variables are created
as immutable files. This doesn't prevent removal - "chattr -i" will work -
but it does prevent this kind of failure from being accomplished
accidentally.

View file

@ -3928,6 +3928,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
sector if the number is odd); sector if the number is odd);
i = IGNORE_DEVICE (don't bind to this i = IGNORE_DEVICE (don't bind to this
device); device);
j = NO_REPORT_LUNS (don't use report luns
command, uas only);
l = NOT_LOCKABLE (don't try to lock and l = NOT_LOCKABLE (don't try to lock and
unlock ejectable media); unlock ejectable media);
m = MAX_SECTORS_64 (don't transfer more m = MAX_SECTORS_64 (don't transfer more

View file

@ -263,19 +263,23 @@ scmd->allowed.
3. scmd recovered 3. scmd recovered
ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd
- shost->host_failed--
- clear scmd->eh_eflags - clear scmd->eh_eflags
- scsi_setup_cmd_retry() - scsi_setup_cmd_retry()
- move from local eh_work_q to local eh_done_q - move from local eh_work_q to local eh_done_q
LOCKING: none LOCKING: none
CONCURRENCY: at most one thread per separate eh_work_q to
keep queue manipulation lockless
4. EH completes 4. EH completes
ACTION: scsi_eh_flush_done_q() retries scmds or notifies upper ACTION: scsi_eh_flush_done_q() retries scmds or notifies upper
layer of failure. layer of failure. May be called concurrently but must have
a no more than one thread per separate eh_work_q to
manipulate the queue locklessly
- scmd is removed from eh_done_q and scmd->eh_entry is cleared - scmd is removed from eh_done_q and scmd->eh_entry is cleared
- if retry is necessary, scmd is requeued using - if retry is necessary, scmd is requeued using
scsi_queue_insert() scsi_queue_insert()
- otherwise, scsi_finish_command() is invoked for scmd - otherwise, scsi_finish_command() is invoked for scmd
- zero shost->host_failed
LOCKING: queue or finish function performs appropriate locking LOCKING: queue or finish function performs appropriate locking

View file

@ -213,9 +213,6 @@ TTY_IO_ERROR If set, causes all subsequent userspace read/write
TTY_OTHER_CLOSED Device is a pty and the other side has closed. TTY_OTHER_CLOSED Device is a pty and the other side has closed.
TTY_OTHER_DONE Device is a pty and the other side has closed and
all pending input processing has been completed.
TTY_NO_WRITE_SPLIT Prevent driver from splitting up writes into TTY_NO_WRITE_SPLIT Prevent driver from splitting up writes into
smaller chunks. smaller chunks.

View file

@ -32,6 +32,8 @@ Currently, these files are in /proc/sys/fs:
- nr_open - nr_open
- overflowuid - overflowuid
- overflowgid - overflowgid
- pipe-user-pages-hard
- pipe-user-pages-soft
- protected_hardlinks - protected_hardlinks
- protected_symlinks - protected_symlinks
- suid_dumpable - suid_dumpable
@ -159,6 +161,27 @@ The default is 65534.
============================================================== ==============================================================
pipe-user-pages-hard:
Maximum total number of pages a non-privileged user may allocate for pipes.
Once this limit is reached, no new pipes may be allocated until usage goes
below the limit again. When set to 0, no limit is applied, which is the default
setting.
==============================================================
pipe-user-pages-soft:
Maximum total number of pages a non-privileged user may allocate for pipes
before the pipe size gets limited to a single page. Once this limit is reached,
new pipes will be limited to a single page in size for this user in order to
limit total memory usage, and trying to increase them using fcntl() will be
denied until usage goes below the limit again. The default value allows to
allocate up to 1024 pipes at their default size. When set to 0, no limit is
applied.
==============================================================
protected_hardlinks: protected_hardlinks:
A long-standing class of security issues is the hardlink-based A long-standing class of security issues is the hardlink-based

View file

@ -537,17 +537,18 @@ relevant attribute files are usb2_hardware_lpm and usb3_hardware_lpm.
can write y/Y/1 or n/N/0 to the file to enable/disable can write y/Y/1 or n/N/0 to the file to enable/disable
USB2 hardware LPM manually. This is for test purpose mainly. USB2 hardware LPM manually. This is for test purpose mainly.
power/usb3_hardware_lpm power/usb3_hardware_lpm_u1
power/usb3_hardware_lpm_u2
When a USB 3.0 lpm-capable device is plugged in to a When a USB 3.0 lpm-capable device is plugged in to a
xHCI host which supports link PM, it will check if U1 xHCI host which supports link PM, it will check if U1
and U2 exit latencies have been set in the BOS and U2 exit latencies have been set in the BOS
descriptor; if the check is is passed and the host descriptor; if the check is is passed and the host
supports USB3 hardware LPM, USB3 hardware LPM will be supports USB3 hardware LPM, USB3 hardware LPM will be
enabled for the device and this file will be created. enabled for the device and these files will be created.
The file holds a string value (enable or disable) The files hold a string value (enable or disable)
indicating whether or not USB3 hardware LPM is indicating whether or not USB3 hardware LPM U1 or U2
enabled for the device. is enabled for the device.
USB Port Power Control USB Port Power Control
---------------------- ----------------------

View file

@ -358,7 +358,8 @@ In the first case there are two additional complications:
- if CR4.SMEP is enabled: since we've turned the page into a kernel page, - if CR4.SMEP is enabled: since we've turned the page into a kernel page,
the kernel may now execute it. We handle this by also setting spte.nx. the kernel may now execute it. We handle this by also setting spte.nx.
If we get a user fetch or read fault, we'll change spte.u=1 and If we get a user fetch or read fault, we'll change spte.u=1 and
spte.nx=gpte.nx back. spte.nx=gpte.nx back. For this to work, KVM forces EFER.NX to 1 when
shadow paging is in use.
- if CR4.SMAP is disabled: since the page has been changed to a kernel - if CR4.SMAP is disabled: since the page has been changed to a kernel
page, it can not be reused when CR4.SMAP is enabled. We set page, it can not be reused when CR4.SMAP is enabled. We set
CR4.SMAP && !CR0.WP into shadow page's role to avoid this case. Note, CR4.SMAP && !CR0.WP into shadow page's role to avoid this case. Note,

View file

@ -230,13 +230,13 @@ F: kernel/sys_ni.c
ABIT UGURU 1,2 HARDWARE MONITOR DRIVER ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
M: Hans de Goede <hdegoede@redhat.com> M: Hans de Goede <hdegoede@redhat.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/abituguru.c F: drivers/hwmon/abituguru.c
ABIT UGURU 3 HARDWARE MONITOR DRIVER ABIT UGURU 3 HARDWARE MONITOR DRIVER
M: Alistair John Strachan <alistair@devzero.co.uk> M: Alistair John Strachan <alistair@devzero.co.uk>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/abituguru3.c F: drivers/hwmon/abituguru3.c
@ -373,14 +373,14 @@ S: Maintained
ADM1025 HARDWARE MONITOR DRIVER ADM1025 HARDWARE MONITOR DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/adm1025 F: Documentation/hwmon/adm1025
F: drivers/hwmon/adm1025.c F: drivers/hwmon/adm1025.c
ADM1029 HARDWARE MONITOR DRIVER ADM1029 HARDWARE MONITOR DRIVER
M: Corentin Labbe <clabbe.montjoie@gmail.com> M: Corentin Labbe <clabbe.montjoie@gmail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/adm1029.c F: drivers/hwmon/adm1029.c
@ -425,7 +425,7 @@ F: drivers/video/backlight/adp8860_bl.c
ADS1015 HARDWARE MONITOR DRIVER ADS1015 HARDWARE MONITOR DRIVER
M: Dirk Eibach <eibach@gdsys.de> M: Dirk Eibach <eibach@gdsys.de>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/ads1015 F: Documentation/hwmon/ads1015
F: drivers/hwmon/ads1015.c F: drivers/hwmon/ads1015.c
@ -438,7 +438,7 @@ F: drivers/macintosh/therm_adt746x.c
ADT7475 HARDWARE MONITOR DRIVER ADT7475 HARDWARE MONITOR DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/adt7475 F: Documentation/hwmon/adt7475
F: drivers/hwmon/adt7475.c F: drivers/hwmon/adt7475.c
@ -615,7 +615,7 @@ F: include/linux/ccp.h
AMD FAM15H PROCESSOR POWER MONITORING DRIVER AMD FAM15H PROCESSOR POWER MONITORING DRIVER
M: Andreas Herrmann <herrmann.der.user@googlemail.com> M: Andreas Herrmann <herrmann.der.user@googlemail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/fam15h_power F: Documentation/hwmon/fam15h_power
F: drivers/hwmon/fam15h_power.c F: drivers/hwmon/fam15h_power.c
@ -779,7 +779,7 @@ F: drivers/input/mouse/bcm5974.c
APPLE SMC DRIVER APPLE SMC DRIVER
M: Henrik Rydberg <rydberg@bitmath.org> M: Henrik Rydberg <rydberg@bitmath.org>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Odd fixes S: Odd fixes
F: drivers/hwmon/applesmc.c F: drivers/hwmon/applesmc.c
@ -1777,7 +1777,7 @@ F: include/media/as3645a.h
ASC7621 HARDWARE MONITOR DRIVER ASC7621 HARDWARE MONITOR DRIVER
M: George Joseph <george.joseph@fairview5.com> M: George Joseph <george.joseph@fairview5.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/asc7621 F: Documentation/hwmon/asc7621
F: drivers/hwmon/asc7621.c F: drivers/hwmon/asc7621.c
@ -1864,7 +1864,7 @@ F: drivers/net/wireless/ath/carl9170/
ATK0110 HWMON DRIVER ATK0110 HWMON DRIVER
M: Luca Tettamanti <kronos.it@gmail.com> M: Luca Tettamanti <kronos.it@gmail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/asus_atk0110.c F: drivers/hwmon/asus_atk0110.c
@ -2984,7 +2984,7 @@ F: mm/swap_cgroup.c
CORETEMP HARDWARE MONITORING DRIVER CORETEMP HARDWARE MONITORING DRIVER
M: Fenghua Yu <fenghua.yu@intel.com> M: Fenghua Yu <fenghua.yu@intel.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/coretemp F: Documentation/hwmon/coretemp
F: drivers/hwmon/coretemp.c F: drivers/hwmon/coretemp.c
@ -3549,7 +3549,7 @@ T: git git://git.infradead.org/users/vkoul/slave-dma.git
DME1737 HARDWARE MONITOR DRIVER DME1737 HARDWARE MONITOR DRIVER
M: Juerg Haefliger <juergh@gmail.com> M: Juerg Haefliger <juergh@gmail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/dme1737 F: Documentation/hwmon/dme1737
F: drivers/hwmon/dme1737.c F: drivers/hwmon/dme1737.c
@ -4097,8 +4097,8 @@ F: Documentation/efi-stub.txt
F: arch/ia64/kernel/efi.c F: arch/ia64/kernel/efi.c
F: arch/x86/boot/compressed/eboot.[ch] F: arch/x86/boot/compressed/eboot.[ch]
F: arch/x86/include/asm/efi.h F: arch/x86/include/asm/efi.h
F: arch/x86/platform/efi/* F: arch/x86/platform/efi/
F: drivers/firmware/efi/* F: drivers/firmware/efi/
F: include/linux/efi*.h F: include/linux/efi*.h
EFI VARIABLE FILESYSTEM EFI VARIABLE FILESYSTEM
@ -4262,7 +4262,7 @@ F: include/video/exynos_mipi*
F71805F HARDWARE MONITORING DRIVER F71805F HARDWARE MONITORING DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/f71805f F: Documentation/hwmon/f71805f
F: drivers/hwmon/f71805f.c F: drivers/hwmon/f71805f.c
@ -4341,7 +4341,7 @@ F: fs/*
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
M: Riku Voipio <riku.voipio@iki.fi> M: Riku Voipio <riku.voipio@iki.fi>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/f75375s.c F: drivers/hwmon/f75375s.c
F: include/linux/f75375s.h F: include/linux/f75375s.h
@ -4883,8 +4883,8 @@ F: drivers/media/usb/hackrf/
HARDWARE MONITORING HARDWARE MONITORING
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
W: http://www.lm-sensors.org/ W: http://hwmon.wiki.kernel.org/
T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-hwmon/ T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-hwmon/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
S: Maintained S: Maintained
@ -5393,7 +5393,7 @@ F: drivers/usb/atm/ueagle-atm.c
INA209 HARDWARE MONITOR DRIVER INA209 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/ina209 F: Documentation/hwmon/ina209
F: Documentation/devicetree/bindings/i2c/ina209.txt F: Documentation/devicetree/bindings/i2c/ina209.txt
@ -5401,7 +5401,7 @@ F: drivers/hwmon/ina209.c
INA2XX HARDWARE MONITOR DRIVER INA2XX HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/ina2xx F: Documentation/hwmon/ina2xx
F: drivers/hwmon/ina2xx.c F: drivers/hwmon/ina2xx.c
@ -5884,7 +5884,7 @@ F: drivers/isdn/hardware/eicon/
IT87 HARDWARE MONITORING DRIVER IT87 HARDWARE MONITORING DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/it87 F: Documentation/hwmon/it87
F: drivers/hwmon/it87.c F: drivers/hwmon/it87.c
@ -5920,7 +5920,7 @@ F: drivers/media/dvb-frontends/ix2505v*
JC42.4 TEMPERATURE SENSOR DRIVER JC42.4 TEMPERATURE SENSOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/jc42.c F: drivers/hwmon/jc42.c
F: Documentation/hwmon/jc42 F: Documentation/hwmon/jc42
@ -5970,14 +5970,14 @@ F: drivers/tty/serial/jsm/
K10TEMP HARDWARE MONITORING DRIVER K10TEMP HARDWARE MONITORING DRIVER
M: Clemens Ladisch <clemens@ladisch.de> M: Clemens Ladisch <clemens@ladisch.de>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/k10temp F: Documentation/hwmon/k10temp
F: drivers/hwmon/k10temp.c F: drivers/hwmon/k10temp.c
K8TEMP HARDWARE MONITORING DRIVER K8TEMP HARDWARE MONITORING DRIVER
M: Rudolf Marek <r.marek@assembler.cz> M: Rudolf Marek <r.marek@assembler.cz>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/k8temp F: Documentation/hwmon/k8temp
F: drivers/hwmon/k8temp.c F: drivers/hwmon/k8temp.c
@ -6485,27 +6485,27 @@ F: net/llc/
LM73 HARDWARE MONITOR DRIVER LM73 HARDWARE MONITOR DRIVER
M: Guillaume Ligneul <guillaume.ligneul@gmail.com> M: Guillaume Ligneul <guillaume.ligneul@gmail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/lm73.c F: drivers/hwmon/lm73.c
LM78 HARDWARE MONITOR DRIVER LM78 HARDWARE MONITOR DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/lm78 F: Documentation/hwmon/lm78
F: drivers/hwmon/lm78.c F: drivers/hwmon/lm78.c
LM83 HARDWARE MONITOR DRIVER LM83 HARDWARE MONITOR DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/lm83 F: Documentation/hwmon/lm83
F: drivers/hwmon/lm83.c F: drivers/hwmon/lm83.c
LM90 HARDWARE MONITOR DRIVER LM90 HARDWARE MONITOR DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/lm90 F: Documentation/hwmon/lm90
F: Documentation/devicetree/bindings/hwmon/lm90.txt F: Documentation/devicetree/bindings/hwmon/lm90.txt
@ -6513,7 +6513,7 @@ F: drivers/hwmon/lm90.c
LM95234 HARDWARE MONITOR DRIVER LM95234 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/lm95234 F: Documentation/hwmon/lm95234
F: drivers/hwmon/lm95234.c F: drivers/hwmon/lm95234.c
@ -6580,7 +6580,7 @@ F: drivers/scsi/sym53c8xx_2/
LTC4261 HARDWARE MONITOR DRIVER LTC4261 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/ltc4261 F: Documentation/hwmon/ltc4261
F: drivers/hwmon/ltc4261.c F: drivers/hwmon/ltc4261.c
@ -6749,28 +6749,28 @@ F: include/uapi/linux/matroxfb.h
MAX16065 HARDWARE MONITOR DRIVER MAX16065 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/max16065 F: Documentation/hwmon/max16065
F: drivers/hwmon/max16065.c F: drivers/hwmon/max16065.c
MAX20751 HARDWARE MONITOR DRIVER MAX20751 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/max20751 F: Documentation/hwmon/max20751
F: drivers/hwmon/max20751.c F: drivers/hwmon/max20751.c
MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
M: "Hans J. Koch" <hjk@hansjkoch.de> M: "Hans J. Koch" <hjk@hansjkoch.de>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/max6650 F: Documentation/hwmon/max6650
F: drivers/hwmon/max6650.c F: drivers/hwmon/max6650.c
MAX6697 HARDWARE MONITOR DRIVER MAX6697 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/max6697 F: Documentation/hwmon/max6697
F: Documentation/devicetree/bindings/i2c/max6697.txt F: Documentation/devicetree/bindings/i2c/max6697.txt
@ -7303,7 +7303,7 @@ F: drivers/scsi/NCR_D700.*
NCT6775 HARDWARE MONITOR DRIVER NCT6775 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/nct6775 F: Documentation/hwmon/nct6775
F: drivers/hwmon/nct6775.c F: drivers/hwmon/nct6775.c
@ -8064,7 +8064,7 @@ F: drivers/video/logo/logo_parisc*
PC87360 HARDWARE MONITORING DRIVER PC87360 HARDWARE MONITORING DRIVER
M: Jim Cromie <jim.cromie@gmail.com> M: Jim Cromie <jim.cromie@gmail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/pc87360 F: Documentation/hwmon/pc87360
F: drivers/hwmon/pc87360.c F: drivers/hwmon/pc87360.c
@ -8076,7 +8076,7 @@ F: drivers/char/pc8736x_gpio.c
PC87427 HARDWARE MONITORING DRIVER PC87427 HARDWARE MONITORING DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/pc87427 F: Documentation/hwmon/pc87427
F: drivers/hwmon/pc87427.c F: drivers/hwmon/pc87427.c
@ -8415,8 +8415,8 @@ F: drivers/rtc/rtc-puv3.c
PMBUS HARDWARE MONITORING DRIVERS PMBUS HARDWARE MONITORING DRIVERS
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
W: http://www.lm-sensors.org/ W: http://hwmon.wiki.kernel.org/
W: http://www.roeck-us.net/linux/drivers/ W: http://www.roeck-us.net/linux/drivers/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
S: Maintained S: Maintained
@ -8610,7 +8610,7 @@ F: drivers/media/usb/pwc/*
PWM FAN DRIVER PWM FAN DRIVER
M: Kamil Debski <k.debski@samsung.com> M: Kamil Debski <k.debski@samsung.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Supported S: Supported
F: Documentation/devicetree/bindings/hwmon/pwm-fan.txt F: Documentation/devicetree/bindings/hwmon/pwm-fan.txt
F: Documentation/hwmon/pwm-fan F: Documentation/hwmon/pwm-fan
@ -9882,28 +9882,28 @@ F: Documentation/devicetree/bindings/media/i2c/nokia,smia.txt
SMM665 HARDWARE MONITOR DRIVER SMM665 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/smm665 F: Documentation/hwmon/smm665
F: drivers/hwmon/smm665.c F: drivers/hwmon/smm665.c
SMSC EMC2103 HARDWARE MONITOR DRIVER SMSC EMC2103 HARDWARE MONITOR DRIVER
M: Steve Glendinning <steve.glendinning@shawell.net> M: Steve Glendinning <steve.glendinning@shawell.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/emc2103 F: Documentation/hwmon/emc2103
F: drivers/hwmon/emc2103.c F: drivers/hwmon/emc2103.c
SMSC SCH5627 HARDWARE MONITOR DRIVER SMSC SCH5627 HARDWARE MONITOR DRIVER
M: Hans de Goede <hdegoede@redhat.com> M: Hans de Goede <hdegoede@redhat.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Supported S: Supported
F: Documentation/hwmon/sch5627 F: Documentation/hwmon/sch5627
F: drivers/hwmon/sch5627.c F: drivers/hwmon/sch5627.c
SMSC47B397 HARDWARE MONITOR DRIVER SMSC47B397 HARDWARE MONITOR DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/smsc47b397 F: Documentation/hwmon/smsc47b397
F: drivers/hwmon/smsc47b397.c F: drivers/hwmon/smsc47b397.c
@ -10289,9 +10289,11 @@ S: Maintained
F: drivers/net/ethernet/dlink/sundance.c F: drivers/net/ethernet/dlink/sundance.c
SUPERH SUPERH
M: Yoshinori Sato <ysato@users.sourceforge.jp>
M: Rich Felker <dalias@libc.org>
L: linux-sh@vger.kernel.org L: linux-sh@vger.kernel.org
Q: http://patchwork.kernel.org/project/linux-sh/list/ Q: http://patchwork.kernel.org/project/linux-sh/list/
S: Orphan S: Maintained
F: Documentation/sh/ F: Documentation/sh/
F: arch/sh/ F: arch/sh/
F: drivers/sh/ F: drivers/sh/
@ -10828,7 +10830,7 @@ F: include/linux/mmc/sh_mobile_sdhi.h
TMP401 HARDWARE MONITOR DRIVER TMP401 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net> M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/tmp401 F: Documentation/hwmon/tmp401
F: drivers/hwmon/tmp401.c F: drivers/hwmon/tmp401.c
@ -11562,14 +11564,14 @@ F: Documentation/networking/vrf.txt
VT1211 HARDWARE MONITOR DRIVER VT1211 HARDWARE MONITOR DRIVER
M: Juerg Haefliger <juergh@gmail.com> M: Juerg Haefliger <juergh@gmail.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/vt1211 F: Documentation/hwmon/vt1211
F: drivers/hwmon/vt1211.c F: drivers/hwmon/vt1211.c
VT8231 HARDWARE MONITOR DRIVER VT8231 HARDWARE MONITOR DRIVER
M: Roger Lucas <vt8231@hiddenengine.co.uk> M: Roger Lucas <vt8231@hiddenengine.co.uk>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/vt8231.c F: drivers/hwmon/vt8231.c
@ -11588,21 +11590,21 @@ F: drivers/w1/
W83791D HARDWARE MONITORING DRIVER W83791D HARDWARE MONITORING DRIVER
M: Marc Hulsman <m.hulsman@tudelft.nl> M: Marc Hulsman <m.hulsman@tudelft.nl>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/w83791d F: Documentation/hwmon/w83791d
F: drivers/hwmon/w83791d.c F: drivers/hwmon/w83791d.c
W83793 HARDWARE MONITORING DRIVER W83793 HARDWARE MONITORING DRIVER
M: Rudolf Marek <r.marek@assembler.cz> M: Rudolf Marek <r.marek@assembler.cz>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/hwmon/w83793 F: Documentation/hwmon/w83793
F: drivers/hwmon/w83793.c F: drivers/hwmon/w83793.c
W83795 HARDWARE MONITORING DRIVER W83795 HARDWARE MONITORING DRIVER
M: Jean Delvare <jdelvare@suse.com> M: Jean Delvare <jdelvare@suse.com>
L: lm-sensors@lm-sensors.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
F: drivers/hwmon/w83795.c F: drivers/hwmon/w83795.c

View file

@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 0 SUBLEVEL = 16
EXTRAVERSION = EXTRAVERSION =
NAME = Blurry Fish Butt NAME = Blurry Fish Butt
@ -364,7 +364,7 @@ AFLAGS_MODULE =
LDFLAGS_MODULE = LDFLAGS_MODULE =
CFLAGS_KERNEL = CFLAGS_KERNEL =
AFLAGS_KERNEL = AFLAGS_KERNEL =
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im
# Use USERINCLUDE when you must reference the UAPI directories only. # Use USERINCLUDE when you must reference the UAPI directories only.
@ -682,9 +682,10 @@ KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior) KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
else else
# This warning generated too much noise in a regular build. # These warnings generated too much noise in a regular build.
# Use make W=1 to enable this warning (see scripts/Makefile.build) # Use make W=1 to enable them (see scripts/Makefile.build)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable) KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
endif endif
ifdef CONFIG_FRAME_POINTER ifdef CONFIG_FRAME_POINTER

View file

@ -387,7 +387,7 @@ config ARC_HAS_LLSC
config ARC_STAR_9000923308 config ARC_STAR_9000923308
bool "Workaround for llock/scond livelock" bool "Workaround for llock/scond livelock"
default y default n
depends on ISA_ARCV2 && SMP && ARC_HAS_LLSC depends on ISA_ARCV2 && SMP && ARC_HAS_LLSC
config ARC_HAS_SWAPE config ARC_HAS_SWAPE

View file

@ -35,21 +35,6 @@ static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\
\ \
m += nr >> 5; \ m += nr >> 5; \
\ \
/* \
* ARC ISA micro-optimization: \
* \
* Instructions dealing with bitpos only consider lower 5 bits \
* e.g (x << 33) is handled like (x << 1) by ASL instruction \
* (mem pointer still needs adjustment to point to next word) \
* \
* Hence the masking to clamp @nr arg can be elided in general. \
* \
* However if @nr is a constant (above assumed in a register), \
* and greater than 31, gcc can optimize away (x << 33) to 0, \
* as overflow, given the 32-bit ISA. Thus masking needs to be \
* done for const @nr, but no code is generated due to gcc \
* const prop. \
*/ \
nr &= 0x1f; \ nr &= 0x1f; \
\ \
__asm__ __volatile__( \ __asm__ __volatile__( \

View file

@ -13,6 +13,15 @@
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/page.h> #include <asm/page.h>
#ifdef CONFIG_ISA_ARCV2
#include <asm/barrier.h>
#define __iormb() rmb()
#define __iowmb() wmb()
#else
#define __iormb() do { } while (0)
#define __iowmb() do { } while (0)
#endif
extern void __iomem *ioremap(unsigned long physaddr, unsigned long size); extern void __iomem *ioremap(unsigned long physaddr, unsigned long size);
extern void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size, extern void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size,
unsigned long flags); unsigned long flags);
@ -22,6 +31,15 @@ extern void iounmap(const void __iomem *addr);
#define ioremap_wc(phy, sz) ioremap(phy, sz) #define ioremap_wc(phy, sz) ioremap(phy, sz)
#define ioremap_wt(phy, sz) ioremap(phy, sz) #define ioremap_wt(phy, sz) ioremap(phy, sz)
/*
* io{read,write}{16,32}be() macros
*/
#define ioread16be(p) ({ u16 __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; })
#define ioread32be(p) ({ u32 __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; })
#define iowrite16be(v,p) ({ __iowmb(); __raw_writew((__force u16)cpu_to_be16(v), p); })
#define iowrite32be(v,p) ({ __iowmb(); __raw_writel((__force u32)cpu_to_be32(v), p); })
/* Change struct page to physical address */ /* Change struct page to physical address */
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
@ -99,15 +117,6 @@ static inline void __raw_writel(u32 w, volatile void __iomem *addr)
} }
#ifdef CONFIG_ISA_ARCV2
#include <asm/barrier.h>
#define __iormb() rmb()
#define __iowmb() wmb()
#else
#define __iormb() do { } while (0)
#define __iowmb() do { } while (0)
#endif
/* /*
* MMIO can also get buffered/optimized in micro-arch, so barriers needed * MMIO can also get buffered/optimized in micro-arch, so barriers needed
* Based on ARM model for the typical use case * Based on ARM model for the typical use case
@ -129,15 +138,23 @@ static inline void __raw_writel(u32 w, volatile void __iomem *addr)
#define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); }) #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); })
/* /*
* Relaxed API for drivers which can handle any ordering themselves * Relaxed API for drivers which can handle barrier ordering themselves
*
* Also these are defined to perform little endian accesses.
* To provide the typical device register semantics of fixed endian,
* swap the byte order for Big Endian
*
* http://lkml.kernel.org/r/201603100845.30602.arnd@arndb.de
*/ */
#define readb_relaxed(c) __raw_readb(c) #define readb_relaxed(c) __raw_readb(c)
#define readw_relaxed(c) __raw_readw(c) #define readw_relaxed(c) ({ u16 __r = le16_to_cpu((__force __le16) \
#define readl_relaxed(c) __raw_readl(c) __raw_readw(c)); __r; })
#define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32) \
__raw_readl(c)); __r; })
#define writeb_relaxed(v,c) __raw_writeb(v,c) #define writeb_relaxed(v,c) __raw_writeb(v,c)
#define writew_relaxed(v,c) __raw_writew(v,c) #define writew_relaxed(v,c) __raw_writew((__force u16) cpu_to_le16(v),c)
#define writel_relaxed(v,c) __raw_writel(v,c) #define writel_relaxed(v,c) __raw_writel((__force u32) cpu_to_le32(v),c)
#include <asm-generic/io.h> #include <asm-generic/io.h>

View file

@ -22,6 +22,7 @@
#define AUX_IRQ_CTRL 0x00E #define AUX_IRQ_CTRL 0x00E
#define AUX_IRQ_ACT 0x043 /* Active Intr across all levels */ #define AUX_IRQ_ACT 0x043 /* Active Intr across all levels */
#define AUX_IRQ_LVL_PEND 0x200 /* Pending Intr across all levels */ #define AUX_IRQ_LVL_PEND 0x200 /* Pending Intr across all levels */
#define AUX_IRQ_HINT 0x201 /* For generating Soft Interrupts */
#define AUX_IRQ_PRIORITY 0x206 #define AUX_IRQ_PRIORITY 0x206
#define ICAUSE 0x40a #define ICAUSE 0x40a
#define AUX_IRQ_SELECT 0x40b #define AUX_IRQ_SELECT 0x40b
@ -112,6 +113,16 @@ static inline int arch_irqs_disabled(void)
return arch_irqs_disabled_flags(arch_local_save_flags()); return arch_irqs_disabled_flags(arch_local_save_flags());
} }
static inline void arc_softirq_trigger(int irq)
{
write_aux_reg(AUX_IRQ_HINT, irq);
}
static inline void arc_softirq_clear(int irq)
{
write_aux_reg(AUX_IRQ_HINT, 0);
}
#else #else
.macro IRQ_DISABLE scratch .macro IRQ_DISABLE scratch

View file

@ -45,11 +45,12 @@ VECTOR reserved ; Reserved slots
VECTOR handle_interrupt ; (16) Timer0 VECTOR handle_interrupt ; (16) Timer0
VECTOR handle_interrupt ; unused (Timer1) VECTOR handle_interrupt ; unused (Timer1)
VECTOR handle_interrupt ; unused (WDT) VECTOR handle_interrupt ; unused (WDT)
VECTOR handle_interrupt ; (19) ICI (inter core interrupt) VECTOR handle_interrupt ; (19) Inter core Interrupt (IPI)
VECTOR handle_interrupt VECTOR handle_interrupt ; (20) perf Interrupt
VECTOR handle_interrupt VECTOR handle_interrupt ; (21) Software Triggered Intr (Self IPI)
VECTOR handle_interrupt VECTOR handle_interrupt ; unused
VECTOR handle_interrupt ; (23) End of fixed IRQs VECTOR handle_interrupt ; (23) unused
# End of fixed IRQs
.rept CONFIG_ARC_NUMBER_OF_INTERRUPTS - 8 .rept CONFIG_ARC_NUMBER_OF_INTERRUPTS - 8
VECTOR handle_interrupt VECTOR handle_interrupt
@ -211,7 +212,11 @@ debug_marker_syscall:
; (since IRQ NOT allowed in DS in ARCv2, this can only happen if orig ; (since IRQ NOT allowed in DS in ARCv2, this can only happen if orig
; entry was via Exception in DS which got preempted in kernel). ; entry was via Exception in DS which got preempted in kernel).
; ;
; IRQ RTIE won't reliably restore DE bit and/or BTA, needs handling ; IRQ RTIE won't reliably restore DE bit and/or BTA, needs workaround
;
; Solution is return from Intr w/o any delay slot quirks into a kernel trampoline
; and from pure kernel mode return to delay slot which handles DS bit/BTA correctly
.Lintr_ret_to_delay_slot: .Lintr_ret_to_delay_slot:
debug_marker_ds: debug_marker_ds:
@ -222,18 +227,23 @@ debug_marker_ds:
ld r2, [sp, PT_ret] ld r2, [sp, PT_ret]
ld r3, [sp, PT_status32] ld r3, [sp, PT_status32]
; STAT32 for Int return created from scratch
; (No delay dlot, disable Further intr in trampoline)
bic r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK bic r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK
st r0, [sp, PT_status32] st r0, [sp, PT_status32]
mov r1, .Lintr_ret_to_delay_slot_2 mov r1, .Lintr_ret_to_delay_slot_2
st r1, [sp, PT_ret] st r1, [sp, PT_ret]
; Orig exception PC/STAT32 safekept @orig_r0 and @event stack slots
st r2, [sp, 0] st r2, [sp, 0]
st r3, [sp, 4] st r3, [sp, 4]
b .Lisr_ret_fast_path b .Lisr_ret_fast_path
.Lintr_ret_to_delay_slot_2: .Lintr_ret_to_delay_slot_2:
; Trampoline to restore orig exception PC/STAT32/BTA/AUX_USER_SP
sub sp, sp, SZ_PT_REGS sub sp, sp, SZ_PT_REGS
st r9, [sp, -4] st r9, [sp, -4]
@ -243,11 +253,19 @@ debug_marker_ds:
ld r9, [sp, 4] ld r9, [sp, 4]
sr r9, [erstatus] sr r9, [erstatus]
; restore AUX_USER_SP if returning to U mode
bbit0 r9, STATUS_U_BIT, 1f
ld r9, [sp, PT_sp]
sr r9, [AUX_USER_SP]
1:
ld r9, [sp, 8] ld r9, [sp, 8]
sr r9, [erbta] sr r9, [erbta]
ld r9, [sp, -4] ld r9, [sp, -4]
add sp, sp, SZ_PT_REGS add sp, sp, SZ_PT_REGS
; return from pure kernel mode to delay slot
rtie rtie
END(ret_from_exception) END(ret_from_exception)

View file

@ -11,9 +11,12 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/irqflags-arcv2.h>
#include <asm/mcip.h> #include <asm/mcip.h>
#include <asm/setup.h> #include <asm/setup.h>
#define SOFTIRQ_IRQ 21
static char smp_cpuinfo_buf[128]; static char smp_cpuinfo_buf[128];
static int idu_detected; static int idu_detected;
@ -22,6 +25,7 @@ static DEFINE_RAW_SPINLOCK(mcip_lock);
static void mcip_setup_per_cpu(int cpu) static void mcip_setup_per_cpu(int cpu)
{ {
smp_ipi_irq_setup(cpu, IPI_IRQ); smp_ipi_irq_setup(cpu, IPI_IRQ);
smp_ipi_irq_setup(cpu, SOFTIRQ_IRQ);
} }
static void mcip_ipi_send(int cpu) static void mcip_ipi_send(int cpu)
@ -29,6 +33,12 @@ static void mcip_ipi_send(int cpu)
unsigned long flags; unsigned long flags;
int ipi_was_pending; int ipi_was_pending;
/* ARConnect can only send IPI to others */
if (unlikely(cpu == raw_smp_processor_id())) {
arc_softirq_trigger(SOFTIRQ_IRQ);
return;
}
/* /*
* NOTE: We must spin here if the other cpu hasn't yet * NOTE: We must spin here if the other cpu hasn't yet
* serviced a previous message. This can burn lots * serviced a previous message. This can burn lots
@ -63,6 +73,11 @@ static void mcip_ipi_clear(int irq)
unsigned long flags; unsigned long flags;
unsigned int __maybe_unused copy; unsigned int __maybe_unused copy;
if (unlikely(irq == SOFTIRQ_IRQ)) {
arc_softirq_clear(irq);
return;
}
raw_spin_lock_irqsave(&mcip_lock, flags); raw_spin_lock_irqsave(&mcip_lock, flags);
/* Who sent the IPI */ /* Who sent the IPI */

View file

@ -332,10 +332,6 @@ static void arc_chk_core_config(void)
pr_warn("CONFIG_ARC_FPU_SAVE_RESTORE needed for working apps\n"); pr_warn("CONFIG_ARC_FPU_SAVE_RESTORE needed for working apps\n");
else if (!cpu->extn.fpu_dp && fpu_enabled) else if (!cpu->extn.fpu_dp && fpu_enabled)
panic("FPU non-existent, disable CONFIG_ARC_FPU_SAVE_RESTORE\n"); panic("FPU non-existent, disable CONFIG_ARC_FPU_SAVE_RESTORE\n");
if (is_isa_arcv2() && IS_ENABLED(CONFIG_SMP) && cpu->isa.atomic &&
!IS_ENABLED(CONFIG_ARC_STAR_9000923308))
panic("llock/scond livelock workaround missing\n");
} }
/* /*

View file

@ -162,10 +162,9 @@ choice
mobile SoCs in the Kona family of chips (e.g. bcm28155, mobile SoCs in the Kona family of chips (e.g. bcm28155,
bcm11351, etc...) bcm11351, etc...)
config DEBUG_BCM63XX config DEBUG_BCM63XX_UART
bool "Kernel low-level debugging on BCM63XX UART" bool "Kernel low-level debugging on BCM63XX UART"
depends on ARCH_BCM_63XX depends on ARCH_BCM_63XX
select DEBUG_UART_BCM63XX
config DEBUG_BERLIN_UART config DEBUG_BERLIN_UART
bool "Marvell Berlin SoC Debug UART" bool "Marvell Berlin SoC Debug UART"
@ -1348,7 +1347,7 @@ config DEBUG_LL_INCLUDE
default "debug/vf.S" if DEBUG_VF_UART default "debug/vf.S" if DEBUG_VF_UART
default "debug/vt8500.S" if DEBUG_VT8500_UART0 default "debug/vt8500.S" if DEBUG_VT8500_UART0
default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1 default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1
default "debug/bcm63xx.S" if DEBUG_UART_BCM63XX default "debug/bcm63xx.S" if DEBUG_BCM63XX_UART
default "debug/digicolor.S" if DEBUG_DIGICOLOR_UA0 default "debug/digicolor.S" if DEBUG_DIGICOLOR_UA0
default "mach/debug-macro.S" default "mach/debug-macro.S"
@ -1364,10 +1363,6 @@ config DEBUG_UART_8250
ARCH_IOP33X || ARCH_IXP4XX || \ ARCH_IOP33X || ARCH_IXP4XX || \
ARCH_LPC32XX || ARCH_MV78XX0 || ARCH_ORION5X || ARCH_RPC ARCH_LPC32XX || ARCH_MV78XX0 || ARCH_ORION5X || ARCH_RPC
# Compatibility options for BCM63xx
config DEBUG_UART_BCM63XX
def_bool ARCH_BCM_63XX
config DEBUG_UART_PHYS config DEBUG_UART_PHYS
hex "Physical base address of debug UART" hex "Physical base address of debug UART"
default 0x00100a00 if DEBUG_NETX_UART default 0x00100a00 if DEBUG_NETX_UART
@ -1462,7 +1457,7 @@ config DEBUG_UART_PHYS
default 0xfffb0000 if DEBUG_OMAP1UART1 || DEBUG_OMAP7XXUART1 default 0xfffb0000 if DEBUG_OMAP1UART1 || DEBUG_OMAP7XXUART1
default 0xfffb0800 if DEBUG_OMAP1UART2 || DEBUG_OMAP7XXUART2 default 0xfffb0800 if DEBUG_OMAP1UART2 || DEBUG_OMAP7XXUART2
default 0xfffb9800 if DEBUG_OMAP1UART3 || DEBUG_OMAP7XXUART3 default 0xfffb9800 if DEBUG_OMAP1UART3 || DEBUG_OMAP7XXUART3
default 0xfffe8600 if DEBUG_UART_BCM63XX default 0xfffe8600 if DEBUG_BCM63XX_UART
default 0xfffff700 if ARCH_IOP33X default 0xfffff700 if ARCH_IOP33X
depends on ARCH_EP93XX || \ depends on ARCH_EP93XX || \
DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \ DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
@ -1474,7 +1469,7 @@ config DEBUG_UART_PHYS
DEBUG_RCAR_GEN2_SCIF0 || DEBUG_RCAR_GEN2_SCIF2 || \ DEBUG_RCAR_GEN2_SCIF0 || DEBUG_RCAR_GEN2_SCIF2 || \
DEBUG_RMOBILE_SCIFA0 || DEBUG_RMOBILE_SCIFA1 || \ DEBUG_RMOBILE_SCIFA0 || DEBUG_RMOBILE_SCIFA1 || \
DEBUG_RMOBILE_SCIFA4 || DEBUG_S3C24XX_UART || \ DEBUG_RMOBILE_SCIFA4 || DEBUG_S3C24XX_UART || \
DEBUG_UART_BCM63XX || DEBUG_ASM9260_UART || \ DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
DEBUG_SIRFSOC_UART || DEBUG_DIGICOLOR_UA0 || \ DEBUG_SIRFSOC_UART || DEBUG_DIGICOLOR_UA0 || \
DEBUG_AT91_UART DEBUG_AT91_UART
@ -1515,7 +1510,7 @@ config DEBUG_UART_VIRT
default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
default 0xfc40ab00 if DEBUG_BRCMSTB_UART default 0xfc40ab00 if DEBUG_BRCMSTB_UART
default 0xfc705000 if DEBUG_ZTE_ZX default 0xfc705000 if DEBUG_ZTE_ZX
default 0xfcfe8600 if DEBUG_UART_BCM63XX default 0xfcfe8600 if DEBUG_BCM63XX_UART
default 0xfd000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX default 0xfd000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX
default 0xfd000000 if ARCH_SPEAR13XX default 0xfd000000 if ARCH_SPEAR13XX
default 0xfd012000 if ARCH_MV78XX0 default 0xfd012000 if ARCH_MV78XX0
@ -1566,7 +1561,7 @@ config DEBUG_UART_VIRT
DEBUG_UART_8250 || DEBUG_UART_PL01X || DEBUG_MESON_UARTAO || \ DEBUG_UART_8250 || DEBUG_UART_PL01X || DEBUG_MESON_UARTAO || \
DEBUG_NETX_UART || \ DEBUG_NETX_UART || \
DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART || \ DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART || \
DEBUG_UART_BCM63XX || DEBUG_ASM9260_UART || \ DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
DEBUG_SIRFSOC_UART || DEBUG_DIGICOLOR_UA0 DEBUG_SIRFSOC_UART || DEBUG_DIGICOLOR_UA0
config DEBUG_UART_8250_SHIFT config DEBUG_UART_8250_SHIFT

View file

@ -792,3 +792,8 @@
tx-num-evt = <32>; tx-num-evt = <32>;
rx-num-evt = <32>; rx-num-evt = <32>;
}; };
&synctimer_32kclk {
assigned-clocks = <&mux_synctimer32k_ck>;
assigned-clock-parents = <&clkdiv32k_ick>;
};

View file

@ -529,7 +529,7 @@
}; };
sata@a0000 { sata@a0000 {
compatible = "marvell,orion-sata"; compatible = "marvell,armada-370-sata";
reg = <0xa0000 0x5000>; reg = <0xa0000 0x5000>;
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&gateclk 14>, <&gateclk 20>; clocks = <&gateclk 14>, <&gateclk 20>;

View file

@ -58,8 +58,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0xf1100000 0x10000 MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0xf1110000 0x10000>; MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000>;
internal-regs { internal-regs {
@ -117,7 +117,7 @@
}; };
/* USB part of the eSATA/USB 2.0 port */ /* USB part of the eSATA/USB 2.0 port */
usb@50000 { usb@58000 {
status = "okay"; status = "okay";
}; };
@ -245,7 +245,7 @@
button@2 { button@2 {
label = "Factory Reset Button"; label = "Factory Reset Button";
linux,code = <KEY_RESTART>; linux,code = <KEY_RESTART>;
gpios = <&gpio1 15 GPIO_ACTIVE_LOW>; gpios = <&gpio0 29 GPIO_ACTIVE_LOW>;
}; };
}; };
@ -260,7 +260,7 @@
}; };
sata { sata {
gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>; gpios = <&gpio1 22 GPIO_ACTIVE_LOW>;
default-state = "off"; default-state = "off";
}; };
}; };
@ -313,7 +313,7 @@
&pinctrl { &pinctrl {
keys_pin: keys-pin { keys_pin: keys-pin {
marvell,pins = "mpp24", "mpp47"; marvell,pins = "mpp24", "mpp29";
marvell,function = "gpio"; marvell,function = "gpio";
}; };

View file

@ -303,16 +303,6 @@
gpio = <&expander0 4 GPIO_ACTIVE_HIGH>; gpio = <&expander0 4 GPIO_ACTIVE_HIGH>;
}; };
reg_usb2_1_vbus: v5-vbus1 {
compatible = "regulator-fixed";
regulator-name = "v5.0-vbus1";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
regulator-always-on;
gpio = <&expander0 4 GPIO_ACTIVE_HIGH>;
};
reg_sata0: pwr-sata0 { reg_sata0: pwr-sata0 {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
regulator-name = "pwr_en_sata0"; regulator-name = "pwr_en_sata0";

View file

@ -70,8 +70,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
pcie-controller { pcie-controller {
status = "okay"; status = "okay";

View file

@ -76,8 +76,8 @@
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
devbus-bootcs { devbus-bootcs {
status = "okay"; status = "okay";

View file

@ -95,8 +95,8 @@
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
devbus-bootcs { devbus-bootcs {
status = "okay"; status = "okay";

View file

@ -65,8 +65,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
pcie-controller { pcie-controller {
status = "okay"; status = "okay";

View file

@ -70,8 +70,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
pcie-controller { pcie-controller {
status = "okay"; status = "okay";
@ -304,13 +304,13 @@
button@1 { button@1 {
label = "WPS"; label = "WPS";
linux,code = <KEY_WPS_BUTTON>; linux,code = <KEY_WPS_BUTTON>;
gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>; gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;
}; };
button@2 { button@2 {
label = "Factory Reset Button"; label = "Factory Reset Button";
linux,code = <KEY_RESTART>; linux,code = <KEY_RESTART>;
gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>; gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
}; };
}; };

View file

@ -68,8 +68,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
internal-regs { internal-regs {
serial@12000 { serial@12000 {

View file

@ -64,8 +64,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
pcie-controller { pcie-controller {
status = "okay"; status = "okay";

View file

@ -65,9 +65,9 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000 MBUS_ID(0x01, 0x2f) 0 0 0xe8000000 0x8000000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
devbus-bootcs { devbus-bootcs {
status = "okay"; status = "okay";

View file

@ -78,8 +78,8 @@
soc { soc {
ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000
MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>;
pcie-controller { pcie-controller {
status = "okay"; status = "okay";

View file

@ -303,6 +303,7 @@
regulator-name = "mmc0-card-supply"; regulator-name = "mmc0-card-supply";
regulator-min-microvolt = <3300000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <3300000>;
regulator-always-on;
}; };
gpio_keys { gpio_keys {

View file

@ -86,10 +86,12 @@
macb0: ethernet@f8020000 { macb0: ethernet@f8020000 {
phy-mode = "rmii"; phy-mode = "rmii";
status = "okay"; status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
phy0: ethernet-phy@1 { phy0: ethernet-phy@1 {
interrupt-parent = <&pioE>; interrupt-parent = <&pioE>;
interrupts = <1 IRQ_TYPE_EDGE_FALLING>; interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
reg = <1>; reg = <1>;
}; };
}; };
@ -152,6 +154,10 @@
atmel,pins = atmel,pins =
<AT91_PIOE 8 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; <AT91_PIOE 8 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
}; };
pinctrl_macb0_phy_irq: macb0_phy_irq_0 {
atmel,pins =
<AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
};
}; };
}; };
}; };
@ -262,5 +268,6 @@
regulator-min-microvolt = <3300000>; regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <3300000>;
vin-supply = <&vcc_3v3_reg>; vin-supply = <&vcc_3v3_reg>;
regulator-always-on;
}; };
}; };

View file

@ -160,8 +160,15 @@
}; };
macb0: ethernet@f8020000 { macb0: ethernet@f8020000 {
pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
phy-mode = "rmii"; phy-mode = "rmii";
status = "okay"; status = "okay";
ethernet-phy@1 {
reg = <0x1>;
interrupt-parent = <&pioE>;
interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
};
}; };
mmc1: mmc@fc000000 { mmc1: mmc@fc000000 {
@ -193,6 +200,10 @@
pinctrl@fc06a000 { pinctrl@fc06a000 {
board { board {
pinctrl_macb0_phy_irq: macb0_phy_irq {
atmel,pins =
<AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
};
pinctrl_mmc0_cd: mmc0_cd { pinctrl_mmc0_cd: mmc0_cd {
atmel,pins = atmel,pins =
<AT91_PIOE 5 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; <AT91_PIOE 5 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;

View file

@ -106,7 +106,7 @@
pmc: pmc@fffffc00 { pmc: pmc@fffffc00 {
compatible = "atmel,at91sam9x5-pmc", "syscon"; compatible = "atmel,at91sam9x5-pmc", "syscon";
reg = <0xfffffc00 0x100>; reg = <0xfffffc00 0x200>;
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
interrupt-controller; interrupt-controller;
#address-cells = <1>; #address-cells = <1>;

View file

@ -1497,6 +1497,16 @@
0x48485200 0x2E00>; 0x48485200 0x2E00>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
/*
* Do not allow gating of cpsw clock as workaround
* for errata i877. Keeping internal clock disabled
* causes the device switching characteristics
* to degrade over time and eventually fail to meet
* the data manual delay time/skew specs.
*/
ti,no-idle;
/* /*
* rx_thresh_pend * rx_thresh_pend
* rx_pend * rx_pend

View file

@ -298,6 +298,8 @@
compatible = "maxim,max8997-pmic"; compatible = "maxim,max8997-pmic";
reg = <0x66>; reg = <0x66>;
interrupt-parent = <&gpx0>;
interrupts = <7 0>;
max8997,pmic-buck1-uses-gpio-dvs; max8997,pmic-buck1-uses-gpio-dvs;
max8997,pmic-buck2-uses-gpio-dvs; max8997,pmic-buck2-uses-gpio-dvs;

View file

@ -122,6 +122,7 @@
interrupt-parent = <&gpio5>; interrupt-parent = <&gpio5>;
interrupts = <24 IRQ_TYPE_LEVEL_HIGH>; /* gpio 152 */ interrupts = <24 IRQ_TYPE_LEVEL_HIGH>; /* gpio 152 */
ref-clock-frequency = <26000000>; ref-clock-frequency = <26000000>;
tcxo-clock-frequency = <26000000>;
}; };
}; };

View file

@ -130,6 +130,16 @@
}; };
}; };
&gpio8 {
/* TI trees use GPIO instead of msecure, see also muxing */
p234 {
gpio-hog;
gpios = <10 GPIO_ACTIVE_HIGH>;
output-high;
line-name = "gpio8_234/msecure";
};
};
&omap5_pmx_core { &omap5_pmx_core {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = < pinctrl-0 = <
@ -213,6 +223,13 @@
>; >;
}; };
/* TI trees use GPIO mode; msecure mode does not work reliably? */
palmas_msecure_pins: palmas_msecure_pins {
pinctrl-single,pins = <
OMAP5_IOPAD(0x180, PIN_OUTPUT | MUX_MODE6) /* gpio8_234 */
>;
};
usbhost_pins: pinmux_usbhost_pins { usbhost_pins: pinmux_usbhost_pins {
pinctrl-single,pins = < pinctrl-single,pins = <
0x84 (PIN_INPUT | MUX_MODE0) /* usbb2_hsic_strobe */ 0x84 (PIN_INPUT | MUX_MODE0) /* usbb2_hsic_strobe */
@ -278,6 +295,12 @@
&usbhost_wkup_pins &usbhost_wkup_pins
>; >;
palmas_sys_nirq_pins: pinmux_palmas_sys_nirq_pins {
pinctrl-single,pins = <
OMAP5_IOPAD(0x068, PIN_INPUT_PULLUP | MUX_MODE0) /* sys_nirq1 */
>;
};
usbhost_wkup_pins: pinmux_usbhost_wkup_pins { usbhost_wkup_pins: pinmux_usbhost_wkup_pins {
pinctrl-single,pins = < pinctrl-single,pins = <
0x1A (PIN_OUTPUT | MUX_MODE0) /* fref_clk1_out, USB hub clk */ 0x1A (PIN_OUTPUT | MUX_MODE0) /* fref_clk1_out, USB hub clk */
@ -345,6 +368,8 @@
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
ti,system-power-controller; ti,system-power-controller;
pinctrl-names = "default";
pinctrl-0 = <&palmas_sys_nirq_pins &palmas_msecure_pins>;
extcon_usb3: palmas_usb { extcon_usb3: palmas_usb {
compatible = "ti,palmas-usb-vid"; compatible = "ti,palmas-usb-vid";
@ -358,6 +383,14 @@
#clock-cells = <0>; #clock-cells = <0>;
}; };
rtc {
compatible = "ti,palmas-rtc";
interrupt-parent = <&palmas>;
interrupts = <8 IRQ_TYPE_NONE>;
ti,backup-battery-chargeable;
ti,backup-battery-charge-high-current;
};
palmas_pmic { palmas_pmic {
compatible = "ti,palmas-pmic"; compatible = "ti,palmas-pmic";
interrupt-parent = <&palmas>; interrupt-parent = <&palmas>;

View file

@ -30,7 +30,7 @@
reg = <0x43100000 90>; reg = <0x43100000 90>;
interrupts = <45>; interrupts = <45>;
clocks = <&clks CLK_NAND>; clocks = <&clks CLK_NAND>;
dmas = <&pdma 97>; dmas = <&pdma 97 3>;
dma-names = "data"; dma-names = "data";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;

View file

@ -90,7 +90,7 @@
#define PIN_PA14__I2SC1_MCK PINMUX_PIN(PIN_PA14, 4, 2) #define PIN_PA14__I2SC1_MCK PINMUX_PIN(PIN_PA14, 4, 2)
#define PIN_PA14__FLEXCOM3_IO2 PINMUX_PIN(PIN_PA14, 5, 1) #define PIN_PA14__FLEXCOM3_IO2 PINMUX_PIN(PIN_PA14, 5, 1)
#define PIN_PA14__D9 PINMUX_PIN(PIN_PA14, 6, 2) #define PIN_PA14__D9 PINMUX_PIN(PIN_PA14, 6, 2)
#define PIN_PA15 14 #define PIN_PA15 15
#define PIN_PA15__GPIO PINMUX_PIN(PIN_PA15, 0, 0) #define PIN_PA15__GPIO PINMUX_PIN(PIN_PA15, 0, 0)
#define PIN_PA15__SPI0_MOSI PINMUX_PIN(PIN_PA15, 1, 1) #define PIN_PA15__SPI0_MOSI PINMUX_PIN(PIN_PA15, 1, 1)
#define PIN_PA15__TF1 PINMUX_PIN(PIN_PA15, 2, 1) #define PIN_PA15__TF1 PINMUX_PIN(PIN_PA15, 2, 1)
@ -837,8 +837,8 @@
#define PIN_PD23__ISC_FIELD PINMUX_PIN(PIN_PD23, 6, 4) #define PIN_PD23__ISC_FIELD PINMUX_PIN(PIN_PD23, 6, 4)
#define PIN_PD24 120 #define PIN_PD24 120
#define PIN_PD24__GPIO PINMUX_PIN(PIN_PD24, 0, 0) #define PIN_PD24__GPIO PINMUX_PIN(PIN_PD24, 0, 0)
#define PIN_PD24__UTXD2 PINMUX_PIN(PIN_PD23, 1, 2) #define PIN_PD24__UTXD2 PINMUX_PIN(PIN_PD24, 1, 2)
#define PIN_PD24__FLEXCOM4_IO3 PINMUX_PIN(PIN_PD23, 3, 3) #define PIN_PD24__FLEXCOM4_IO3 PINMUX_PIN(PIN_PD24, 3, 3)
#define PIN_PD25 121 #define PIN_PD25 121
#define PIN_PD25__GPIO PINMUX_PIN(PIN_PD25, 0, 0) #define PIN_PD25__GPIO PINMUX_PIN(PIN_PD25, 0, 0)
#define PIN_PD25__SPI1_SPCK PINMUX_PIN(PIN_PD25, 1, 3) #define PIN_PD25__SPI1_SPCK PINMUX_PIN(PIN_PD25, 1, 3)

View file

@ -1342,7 +1342,7 @@
dbgu: serial@fc069000 { dbgu: serial@fc069000 {
compatible = "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart"; compatible = "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart";
reg = <0xfc069000 0x200>; reg = <0xfc069000 0x200>;
interrupts = <2 IRQ_TYPE_LEVEL_HIGH 7>; interrupts = <45 IRQ_TYPE_LEVEL_HIGH 7>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_dbgu>; pinctrl-0 = <&pinctrl_dbgu>;
clocks = <&dbgu_clk>; clocks = <&dbgu_clk>;

View file

@ -127,22 +127,14 @@
}; };
mmcsd_default_mode: mmcsd_default { mmcsd_default_mode: mmcsd_default {
mmcsd_default_cfg1 { mmcsd_default_cfg1 {
/* MCCLK */ /*
pins = "GPIO8_B10"; * MCCLK, MCCMDDIR, MCDAT0DIR, MCDAT31DIR, MCDATDIR2
ste,output = <0>; * MCCMD, MCDAT3-0, MCMSFBCLK
}; */
mmcsd_default_cfg2 { pins = "GPIO8_B10", "GPIO9_A10", "GPIO10_C11", "GPIO11_B11",
/* MCCMDDIR, MCDAT0DIR, MCDAT31DIR, MCDATDIR2 */ "GPIO12_A11", "GPIO13_C12", "GPIO14_B12", "GPIO15_A12",
pins = "GPIO10_C11", "GPIO15_A12", "GPIO16_C13", "GPIO23_D15", "GPIO24_C15";
"GPIO16_C13", "GPIO23_D15"; ste,output = <2>;
ste,output = <1>;
};
mmcsd_default_cfg3 {
/* MCCMD, MCDAT3-0, MCMSFBCLK */
pins = "GPIO9_A10", "GPIO11_B11",
"GPIO12_A11", "GPIO13_C12",
"GPIO14_B12", "GPIO24_C15";
ste,input = <1>;
}; };
}; };
}; };
@ -802,10 +794,21 @@
clock-names = "mclk", "apb_pclk"; clock-names = "mclk", "apb_pclk";
interrupt-parent = <&vica>; interrupt-parent = <&vica>;
interrupts = <22>; interrupts = <22>;
max-frequency = <48000000>; max-frequency = <400000>;
bus-width = <4>; bus-width = <4>;
cap-mmc-highspeed; cap-mmc-highspeed;
cap-sd-highspeed; cap-sd-highspeed;
full-pwr-cycle;
/*
* The STw4811 circuit used with the Nomadik strictly
* requires that all of these signal direction pins be
* routed and used for its 4-bit levelshifter.
*/
st,sig-dir-dat0;
st,sig-dir-dat2;
st,sig-dir-dat31;
st,sig-dir-cmd;
st,sig-pin-fbclk;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&mmcsd_default_mux>, <&mmcsd_default_mode>; pinctrl-0 = <&mmcsd_default_mux>, <&mmcsd_default_mode>;
vmmc-supply = <&vmmc_regulator>; vmmc-supply = <&vmmc_regulator>;

View file

@ -52,7 +52,7 @@
/ { / {
model = "NextThing C.H.I.P."; model = "NextThing C.H.I.P.";
compatible = "nextthing,chip", "allwinner,sun5i-r8"; compatible = "nextthing,chip", "allwinner,sun5i-r8", "allwinner,sun5i-a13";
aliases { aliases {
i2c0 = &i2c0; i2c0 = &i2c0;

View file

@ -16,7 +16,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/div64.h>
#include <asm/hardware/icst.h> #include <asm/hardware/icst.h>
/* /*
@ -29,7 +29,11 @@ EXPORT_SYMBOL(icst525_s2div);
unsigned long icst_hz(const struct icst_params *p, struct icst_vco vco) unsigned long icst_hz(const struct icst_params *p, struct icst_vco vco)
{ {
return p->ref * 2 * (vco.v + 8) / ((vco.r + 2) * p->s2div[vco.s]); u64 dividend = p->ref * 2 * (u64)(vco.v + 8);
u32 divisor = (vco.r + 2) * p->s2div[vco.s];
do_div(dividend, divisor);
return (unsigned long)dividend;
} }
EXPORT_SYMBOL(icst_hz); EXPORT_SYMBOL(icst_hz);
@ -58,6 +62,7 @@ icst_hz_to_vco(const struct icst_params *p, unsigned long freq)
if (f > p->vco_min && f <= p->vco_max) if (f > p->vco_min && f <= p->vco_max)
break; break;
i++;
} while (i < 8); } while (i < 8);
if (i >= 8) if (i >= 8)

View file

@ -193,6 +193,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
#define pmd_large(pmd) (pmd_val(pmd) & 2) #define pmd_large(pmd) (pmd_val(pmd) & 2)
#define pmd_bad(pmd) (pmd_val(pmd) & 2) #define pmd_bad(pmd) (pmd_val(pmd) & 2)
#define pmd_present(pmd) (pmd_val(pmd))
#define copy_pmd(pmdpd,pmdps) \ #define copy_pmd(pmdpd,pmdps) \
do { \ do { \

View file

@ -212,6 +212,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
: !!(pmd_val(pmd) & (val))) : !!(pmd_val(pmd) & (val)))
#define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val))) #define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val)))
#define pmd_present(pmd) (pmd_isset((pmd), L_PMD_SECT_VALID))
#define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF)) #define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF))
#define pte_special(pte) (pte_isset((pte), L_PTE_SPECIAL)) #define pte_special(pte) (pte_isset((pte), L_PTE_SPECIAL))
static inline pte_t pte_mkspecial(pte_t pte) static inline pte_t pte_mkspecial(pte_t pte)
@ -257,10 +258,10 @@ PMD_BIT_FUNC(mkyoung, |= PMD_SECT_AF);
#define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))
#define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot)
/* represent a notpresent pmd by zero, this is used by pmdp_invalidate */ /* represent a notpresent pmd by faulting entry, this is used by pmdp_invalidate */
static inline pmd_t pmd_mknotpresent(pmd_t pmd) static inline pmd_t pmd_mknotpresent(pmd_t pmd)
{ {
return __pmd(0); return __pmd(pmd_val(pmd) & ~L_PMD_SECT_VALID);
} }
static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)

View file

@ -182,7 +182,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
#define pgd_offset_k(addr) pgd_offset(&init_mm, addr) #define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
#define pmd_none(pmd) (!pmd_val(pmd)) #define pmd_none(pmd) (!pmd_val(pmd))
#define pmd_present(pmd) (pmd_val(pmd))
static inline pte_t *pmd_page_vaddr(pmd_t pmd) static inline pte_t *pmd_page_vaddr(pmd_t pmd)
{ {

View file

@ -35,14 +35,21 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
dma_addr_t dev_addr, unsigned long offset, size_t size, dma_addr_t dev_addr, unsigned long offset, size_t size,
enum dma_data_direction dir, struct dma_attrs *attrs) enum dma_data_direction dir, struct dma_attrs *attrs)
{ {
bool local = XEN_PFN_DOWN(dev_addr) == page_to_xen_pfn(page); unsigned long page_pfn = page_to_xen_pfn(page);
unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr);
unsigned long compound_pages =
(1<<compound_order(page)) * XEN_PFN_PER_PAGE;
bool local = (page_pfn <= dev_pfn) &&
(dev_pfn - page_pfn < compound_pages);
/* /*
* Dom0 is mapped 1:1, while the Linux page can be spanned accross * Dom0 is mapped 1:1, while the Linux page can span across
* multiple Xen page, it's not possible to have a mix of local and * multiple Xen pages, it's not possible for it to contain a
* foreign Xen page. So if the first xen_pfn == mfn the page is local * mix of local and foreign Xen pages. So if the first xen_pfn
* otherwise it's a foreign page grant-mapped in dom0. If the page is * == mfn the page is local otherwise it's a foreign page
* local we can safely call the native dma_ops function, otherwise we * grant-mapped in dom0. If the page is local we can safely
* call the xen specific function. * call the native dma_ops function, otherwise we call the xen
* specific function.
*/ */
if (local) if (local)
__generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs); __generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);

View file

@ -733,8 +733,8 @@ static int vfp_set(struct task_struct *target,
if (ret) if (ret)
return ret; return ret;
vfp_flush_hwstate(thread);
thread->vfpstate.hard = new_vfp; thread->vfpstate.hard = new_vfp;
vfp_flush_hwstate(thread);
return 0; return 0;
} }

View file

@ -155,7 +155,7 @@ static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
u64 val; u64 val;
val = kvm_arm_timer_get_reg(vcpu, reg->id); val = kvm_arm_timer_get_reg(vcpu, reg->id);
return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)); return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)) ? -EFAULT : 0;
} }
static unsigned long num_core_regs(void) static unsigned long num_core_regs(void)

View file

@ -886,11 +886,14 @@ static int stage2_set_pmd_huge(struct kvm *kvm, struct kvm_mmu_memory_cache
VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd)); VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd));
old_pmd = *pmd; old_pmd = *pmd;
kvm_set_pmd(pmd, *new_pmd); if (pmd_present(old_pmd)) {
if (pmd_present(old_pmd)) pmd_clear(pmd);
kvm_tlb_flush_vmid_ipa(kvm, addr); kvm_tlb_flush_vmid_ipa(kvm, addr);
else } else {
get_page(virt_to_page(pmd)); get_page(virt_to_page(pmd));
}
kvm_set_pmd(pmd, *new_pmd);
return 0; return 0;
} }
@ -939,12 +942,14 @@ static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
/* Create 2nd stage page table mapping - Level 3 */ /* Create 2nd stage page table mapping - Level 3 */
old_pte = *pte; old_pte = *pte;
kvm_set_pte(pte, *new_pte); if (pte_present(old_pte)) {
if (pte_present(old_pte)) kvm_set_pte(pte, __pte(0));
kvm_tlb_flush_vmid_ipa(kvm, addr); kvm_tlb_flush_vmid_ipa(kvm, addr);
else } else {
get_page(virt_to_page(pte)); get_page(virt_to_page(pte));
}
kvm_set_pte(pte, *new_pte);
return 0; return 0;
} }

View file

@ -220,13 +220,13 @@ static void cns3xxx_write_config(struct cns3xxx_pcie *cnspci,
u32 mask = (0x1ull << (size * 8)) - 1; u32 mask = (0x1ull << (size * 8)) - 1;
int shift = (where % 4) * 8; int shift = (where % 4) * 8;
v = readl_relaxed(base + (where & 0xffc)); v = readl_relaxed(base);
v &= ~(mask << shift); v &= ~(mask << shift);
v |= (val & mask) << shift; v |= (val & mask) << shift;
writel_relaxed(v, base + (where & 0xffc)); writel_relaxed(v, base);
readl_relaxed(base + (where & 0xffc)); readl_relaxed(base);
} }
static void __init cns3xxx_pcie_hw_init(struct cns3xxx_pcie *cnspci) static void __init cns3xxx_pcie_hw_init(struct cns3xxx_pcie *cnspci)

View file

@ -26,6 +26,7 @@ menuconfig ARCH_EXYNOS
select S5P_DEV_MFC select S5P_DEV_MFC
select SRAM select SRAM
select THERMAL select THERMAL
select THERMAL_OF
select MFD_SYSCON select MFD_SYSCON
help help
Support for SAMSUNG EXYNOS SoCs (EXYNOS4/5) Support for SAMSUNG EXYNOS SoCs (EXYNOS4/5)

View file

@ -92,7 +92,7 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
if (IS_ERR(pd->clk[i])) if (IS_ERR(pd->clk[i]))
break; break;
if (IS_ERR(pd->clk[i])) if (IS_ERR(pd->pclk[i]))
continue; /* Skip on first power up */ continue; /* Skip on first power up */
if (clk_set_parent(pd->clk[i], pd->pclk[i])) if (clk_set_parent(pd->clk[i], pd->pclk[i]))
pr_err("%s: error setting parent to clock%d\n", pr_err("%s: error setting parent to clock%d\n",

View file

@ -46,7 +46,7 @@ static int ksz8081_phy_fixup(struct phy_device *dev)
static void __init imx6ul_enet_phy_init(void) static void __init imx6ul_enet_phy_init(void)
{ {
if (IS_BUILTIN(CONFIG_PHYLIB)) if (IS_BUILTIN(CONFIG_PHYLIB))
phy_register_fixup_for_uid(PHY_ID_KSZ8081, 0xffffffff, phy_register_fixup_for_uid(PHY_ID_KSZ8081, MICREL_PHY_ID_MASK,
ksz8081_phy_fixup); ksz8081_phy_fixup);
} }

View file

@ -162,22 +162,16 @@ exit:
} }
/* /*
* This ioremap hook is used on Armada 375/38x to ensure that PCIe * This ioremap hook is used on Armada 375/38x to ensure that all MMIO
* memory areas are mapped as MT_UNCACHED instead of MT_DEVICE. This * areas are mapped as MT_UNCACHED instead of MT_DEVICE. This is
* is needed as a workaround for a deadlock issue between the PCIe * needed for the HW I/O coherency mechanism to work properly without
* interface and the cache controller. * deadlock.
*/ */
static void __iomem * static void __iomem *
armada_pcie_wa_ioremap_caller(phys_addr_t phys_addr, size_t size, armada_wa_ioremap_caller(phys_addr_t phys_addr, size_t size,
unsigned int mtype, void *caller) unsigned int mtype, void *caller)
{ {
struct resource pcie_mem; mtype = MT_UNCACHED;
mvebu_mbus_get_pcie_mem_aperture(&pcie_mem);
if (pcie_mem.start <= phys_addr && (phys_addr + size) <= pcie_mem.end)
mtype = MT_UNCACHED;
return __arm_ioremap_caller(phys_addr, size, mtype, caller); return __arm_ioremap_caller(phys_addr, size, mtype, caller);
} }
@ -186,7 +180,7 @@ static void __init armada_375_380_coherency_init(struct device_node *np)
struct device_node *cache_dn; struct device_node *cache_dn;
coherency_cpu_base = of_iomap(np, 0); coherency_cpu_base = of_iomap(np, 0);
arch_ioremap_caller = armada_pcie_wa_ioremap_caller; arch_ioremap_caller = armada_wa_ioremap_caller;
/* /*
* We should switch the PL310 to I/O coherency mode only if * We should switch the PL310 to I/O coherency mode only if

View file

@ -34,6 +34,7 @@
#include "pm.h" #include "pm.h"
#include "control.h" #include "control.h"
#include "common.h" #include "common.h"
#include "soc.h"
/* Mach specific information to be recorded in the C-state driver_data */ /* Mach specific information to be recorded in the C-state driver_data */
struct omap3_idle_statedata { struct omap3_idle_statedata {
@ -315,6 +316,69 @@ static struct cpuidle_driver omap3_idle_driver = {
.safe_state_index = 0, .safe_state_index = 0,
}; };
/*
* Numbers based on measurements made in October 2009 for PM optimized kernel
* with CPU freq enabled on device Nokia N900. Assumes OPP2 (main idle OPP,
* and worst case latencies).
*/
static struct cpuidle_driver omap3430_idle_driver = {
.name = "omap3430_idle",
.owner = THIS_MODULE,
.states = {
{
.enter = omap3_enter_idle_bm,
.exit_latency = 110 + 162,
.target_residency = 5,
.name = "C1",
.desc = "MPU ON + CORE ON",
},
{
.enter = omap3_enter_idle_bm,
.exit_latency = 106 + 180,
.target_residency = 309,
.name = "C2",
.desc = "MPU ON + CORE ON",
},
{
.enter = omap3_enter_idle_bm,
.exit_latency = 107 + 410,
.target_residency = 46057,
.name = "C3",
.desc = "MPU RET + CORE ON",
},
{
.enter = omap3_enter_idle_bm,
.exit_latency = 121 + 3374,
.target_residency = 46057,
.name = "C4",
.desc = "MPU OFF + CORE ON",
},
{
.enter = omap3_enter_idle_bm,
.exit_latency = 855 + 1146,
.target_residency = 46057,
.name = "C5",
.desc = "MPU RET + CORE RET",
},
{
.enter = omap3_enter_idle_bm,
.exit_latency = 7580 + 4134,
.target_residency = 484329,
.name = "C6",
.desc = "MPU OFF + CORE RET",
},
{
.enter = omap3_enter_idle_bm,
.exit_latency = 7505 + 15274,
.target_residency = 484329,
.name = "C7",
.desc = "MPU OFF + CORE OFF",
},
},
.state_count = ARRAY_SIZE(omap3_idle_data),
.safe_state_index = 0,
};
/* Public functions */ /* Public functions */
/** /**
@ -333,5 +397,8 @@ int __init omap3_idle_init(void)
if (!mpu_pd || !core_pd || !per_pd || !cam_pd) if (!mpu_pd || !core_pd || !per_pd || !cam_pd)
return -ENODEV; return -ENODEV;
return cpuidle_register(&omap3_idle_driver, NULL); if (cpu_is_omap3430())
return cpuidle_register(&omap3430_idle_driver, NULL);
else
return cpuidle_register(&omap3_idle_driver, NULL);
} }

View file

@ -101,10 +101,8 @@ static void omap2_onenand_set_async_mode(void __iomem *onenand_base)
static void set_onenand_cfg(void __iomem *onenand_base) static void set_onenand_cfg(void __iomem *onenand_base)
{ {
u32 reg; u32 reg = ONENAND_SYS_CFG1_RDY | ONENAND_SYS_CFG1_INT;
reg = readw(onenand_base + ONENAND_REG_SYS_CFG1);
reg &= ~((0x7 << ONENAND_SYS_CFG1_BRL_SHIFT) | (0x7 << 9));
reg |= (latency << ONENAND_SYS_CFG1_BRL_SHIFT) | reg |= (latency << ONENAND_SYS_CFG1_BRL_SHIFT) |
ONENAND_SYS_CFG1_BL_16; ONENAND_SYS_CFG1_BL_16;
if (onenand_flags & ONENAND_FLAG_SYNCREAD) if (onenand_flags & ONENAND_FLAG_SYNCREAD)
@ -123,6 +121,7 @@ static void set_onenand_cfg(void __iomem *onenand_base)
reg |= ONENAND_SYS_CFG1_VHF; reg |= ONENAND_SYS_CFG1_VHF;
else else
reg &= ~ONENAND_SYS_CFG1_VHF; reg &= ~ONENAND_SYS_CFG1_VHF;
writew(reg, onenand_base + ONENAND_REG_SYS_CFG1); writew(reg, onenand_base + ONENAND_REG_SYS_CFG1);
} }
@ -289,6 +288,7 @@ static int omap2_onenand_setup_async(void __iomem *onenand_base)
} }
} }
onenand_async.sync_write = true;
omap2_onenand_calc_async_timings(&t); omap2_onenand_calc_async_timings(&t);
ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async);

View file

@ -368,6 +368,7 @@ void __init omap5_map_io(void)
void __init dra7xx_map_io(void) void __init dra7xx_map_io(void)
{ {
iotable_init(dra7xx_io_desc, ARRAY_SIZE(dra7xx_io_desc)); iotable_init(dra7xx_io_desc, ARRAY_SIZE(dra7xx_io_desc));
omap_barriers_init();
} }
#endif #endif
/* /*

View file

@ -1416,9 +1416,7 @@ static void _enable_sysc(struct omap_hwmod *oh)
(sf & SYSC_HAS_CLOCKACTIVITY)) (sf & SYSC_HAS_CLOCKACTIVITY))
_set_clockactivity(oh, oh->class->sysc->clockact, &v); _set_clockactivity(oh, oh->class->sysc->clockact, &v);
/* If the cached value is the same as the new value, skip the write */ _write_sysconfig(v, oh);
if (oh->_sysc_cache != v)
_write_sysconfig(v, oh);
/* /*
* Set the autoidle bit only after setting the smartidle bit * Set the autoidle bit only after setting the smartidle bit
@ -1481,7 +1479,9 @@ static void _idle_sysc(struct omap_hwmod *oh)
_set_master_standbymode(oh, idlemode, &v); _set_master_standbymode(oh, idlemode, &v);
} }
_write_sysconfig(v, oh); /* If the cached value is the same as the new value, skip the write */
if (oh->_sysc_cache != v)
_write_sysconfig(v, oh);
} }
/** /**
@ -2200,6 +2200,11 @@ static int _enable(struct omap_hwmod *oh)
*/ */
static int _idle(struct omap_hwmod *oh) static int _idle(struct omap_hwmod *oh)
{ {
if (oh->flags & HWMOD_NO_IDLE) {
oh->_int_flags |= _HWMOD_SKIP_ENABLE;
return 0;
}
pr_debug("omap_hwmod: %s: idling\n", oh->name); pr_debug("omap_hwmod: %s: idling\n", oh->name);
if (oh->_state != _HWMOD_STATE_ENABLED) { if (oh->_state != _HWMOD_STATE_ENABLED) {
@ -2504,6 +2509,8 @@ static int __init _init(struct omap_hwmod *oh, void *data)
oh->flags |= HWMOD_INIT_NO_RESET; oh->flags |= HWMOD_INIT_NO_RESET;
if (of_find_property(np, "ti,no-idle-on-init", NULL)) if (of_find_property(np, "ti,no-idle-on-init", NULL))
oh->flags |= HWMOD_INIT_NO_IDLE; oh->flags |= HWMOD_INIT_NO_IDLE;
if (of_find_property(np, "ti,no-idle", NULL))
oh->flags |= HWMOD_NO_IDLE;
} }
oh->_state = _HWMOD_STATE_INITIALIZED; oh->_state = _HWMOD_STATE_INITIALIZED;
@ -2630,7 +2637,7 @@ static void __init _setup_postsetup(struct omap_hwmod *oh)
* XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data - * XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data -
* it should be set by the core code as a runtime flag during startup * it should be set by the core code as a runtime flag during startup
*/ */
if ((oh->flags & HWMOD_INIT_NO_IDLE) && if ((oh->flags & (HWMOD_INIT_NO_IDLE | HWMOD_NO_IDLE)) &&
(postsetup_state == _HWMOD_STATE_IDLE)) { (postsetup_state == _HWMOD_STATE_IDLE)) {
oh->_int_flags |= _HWMOD_SKIP_ENABLE; oh->_int_flags |= _HWMOD_SKIP_ENABLE;
postsetup_state = _HWMOD_STATE_ENABLED; postsetup_state = _HWMOD_STATE_ENABLED;

View file

@ -525,6 +525,8 @@ struct omap_hwmod_omap4_prcm {
* or idled. * or idled.
* HWMOD_OPT_CLKS_NEEDED: The optional clocks are needed for the module to * HWMOD_OPT_CLKS_NEEDED: The optional clocks are needed for the module to
* operate and they need to be handled at the same time as the main_clk. * operate and they need to be handled at the same time as the main_clk.
* HWMOD_NO_IDLE: Do not idle the hwmod at all. Useful to handle certain
* IPs like CPSW on DRA7, where clocks to this module cannot be disabled.
*/ */
#define HWMOD_SWSUP_SIDLE (1 << 0) #define HWMOD_SWSUP_SIDLE (1 << 0)
#define HWMOD_SWSUP_MSTANDBY (1 << 1) #define HWMOD_SWSUP_MSTANDBY (1 << 1)
@ -541,6 +543,7 @@ struct omap_hwmod_omap4_prcm {
#define HWMOD_SWSUP_SIDLE_ACT (1 << 12) #define HWMOD_SWSUP_SIDLE_ACT (1 << 12)
#define HWMOD_RECONFIG_IO_CHAIN (1 << 13) #define HWMOD_RECONFIG_IO_CHAIN (1 << 13)
#define HWMOD_OPT_CLKS_NEEDED (1 << 14) #define HWMOD_OPT_CLKS_NEEDED (1 << 14)
#define HWMOD_NO_IDLE (1 << 15)
/* /*
* omap_hwmod._int_flags definitions * omap_hwmod._int_flags definitions

View file

@ -86,13 +86,18 @@ ENTRY(enable_omap3630_toggle_l2_on_restore)
stmfd sp!, {lr} @ save registers on stack stmfd sp!, {lr} @ save registers on stack
/* Setup so that we will disable and enable l2 */ /* Setup so that we will disable and enable l2 */
mov r1, #0x1 mov r1, #0x1
adrl r2, l2dis_3630 @ may be too distant for plain adr adrl r3, l2dis_3630_offset @ may be too distant for plain adr
str r1, [r2] ldr r2, [r3] @ value for offset
str r1, [r2, r3] @ write to l2dis_3630
ldmfd sp!, {pc} @ restore regs and return ldmfd sp!, {pc} @ restore regs and return
ENDPROC(enable_omap3630_toggle_l2_on_restore) ENDPROC(enable_omap3630_toggle_l2_on_restore)
.text /*
/* Function to call rom code to save secure ram context */ * Function to call rom code to save secure ram context. This gets
* relocated to SRAM, so it can be all in .data section. Otherwise
* we need to initialize api_params separately.
*/
.data
.align 3 .align 3
ENTRY(save_secure_ram_context) ENTRY(save_secure_ram_context)
stmfd sp!, {r4 - r11, lr} @ save registers on stack stmfd sp!, {r4 - r11, lr} @ save registers on stack
@ -126,6 +131,8 @@ ENDPROC(save_secure_ram_context)
ENTRY(save_secure_ram_context_sz) ENTRY(save_secure_ram_context_sz)
.word . - save_secure_ram_context .word . - save_secure_ram_context
.text
/* /*
* ====================== * ======================
* == Idle entry point == * == Idle entry point ==
@ -289,12 +296,6 @@ wait_sdrc_ready:
bic r5, r5, #0x40 bic r5, r5, #0x40
str r5, [r4] str r5, [r4]
/*
* PC-relative stores lead to undefined behaviour in Thumb-2: use a r7 as a
* base instead.
* Be careful not to clobber r7 when maintaing this code.
*/
is_dll_in_lock_mode: is_dll_in_lock_mode:
/* Is dll in lock mode? */ /* Is dll in lock mode? */
ldr r4, sdrc_dlla_ctrl ldr r4, sdrc_dlla_ctrl
@ -302,11 +303,7 @@ is_dll_in_lock_mode:
tst r5, #0x4 tst r5, #0x4
bne exit_nonoff_modes @ Return if locked bne exit_nonoff_modes @ Return if locked
/* wait till dll locks */ /* wait till dll locks */
adr r7, kick_counter
wait_dll_lock_timed: wait_dll_lock_timed:
ldr r4, wait_dll_lock_counter
add r4, r4, #1
str r4, [r7, #wait_dll_lock_counter - kick_counter]
ldr r4, sdrc_dlla_status ldr r4, sdrc_dlla_status
/* Wait 20uS for lock */ /* Wait 20uS for lock */
mov r6, #8 mov r6, #8
@ -330,9 +327,6 @@ kick_dll:
orr r6, r6, #(1<<3) @ enable dll orr r6, r6, #(1<<3) @ enable dll
str r6, [r4] str r6, [r4]
dsb dsb
ldr r4, kick_counter
add r4, r4, #1
str r4, [r7] @ kick_counter
b wait_dll_lock_timed b wait_dll_lock_timed
exit_nonoff_modes: exit_nonoff_modes:
@ -360,15 +354,6 @@ sdrc_dlla_status:
.word SDRC_DLLA_STATUS_V .word SDRC_DLLA_STATUS_V
sdrc_dlla_ctrl: sdrc_dlla_ctrl:
.word SDRC_DLLA_CTRL_V .word SDRC_DLLA_CTRL_V
/*
* When exporting to userspace while the counters are in SRAM,
* these 2 words need to be at the end to facilitate retrival!
*/
kick_counter:
.word 0
wait_dll_lock_counter:
.word 0
ENTRY(omap3_do_wfi_sz) ENTRY(omap3_do_wfi_sz)
.word . - omap3_do_wfi .word . - omap3_do_wfi
@ -437,7 +422,9 @@ ENTRY(omap3_restore)
cmp r2, #0x0 @ Check if target power state was OFF or RET cmp r2, #0x0 @ Check if target power state was OFF or RET
bne logic_l1_restore bne logic_l1_restore
ldr r0, l2dis_3630 adr r1, l2dis_3630_offset @ address for offset
ldr r0, [r1] @ value for offset
ldr r0, [r1, r0] @ value at l2dis_3630
cmp r0, #0x1 @ should we disable L2 on 3630? cmp r0, #0x1 @ should we disable L2 on 3630?
bne skipl2dis bne skipl2dis
mrc p15, 0, r0, c1, c0, 1 mrc p15, 0, r0, c1, c0, 1
@ -449,12 +436,14 @@ skipl2dis:
and r1, #0x700 and r1, #0x700
cmp r1, #0x300 cmp r1, #0x300
beq l2_inv_gp beq l2_inv_gp
adr r0, l2_inv_api_params_offset
ldr r3, [r0]
add r3, r3, r0 @ r3 points to dummy parameters
mov r0, #40 @ set service ID for PPA mov r0, #40 @ set service ID for PPA
mov r12, r0 @ copy secure Service ID in r12 mov r12, r0 @ copy secure Service ID in r12
mov r1, #0 @ set task id for ROM code in r1 mov r1, #0 @ set task id for ROM code in r1
mov r2, #4 @ set some flags in r2, r6 mov r2, #4 @ set some flags in r2, r6
mov r6, #0xff mov r6, #0xff
adr r3, l2_inv_api_params @ r3 points to dummy parameters
dsb @ data write barrier dsb @ data write barrier
dmb @ data memory barrier dmb @ data memory barrier
smc #1 @ call SMI monitor (smi #1) smc #1 @ call SMI monitor (smi #1)
@ -488,8 +477,8 @@ skipl2dis:
b logic_l1_restore b logic_l1_restore
.align .align
l2_inv_api_params: l2_inv_api_params_offset:
.word 0x1, 0x00 .long l2_inv_api_params - .
l2_inv_gp: l2_inv_gp:
/* Execute smi to invalidate L2 cache */ /* Execute smi to invalidate L2 cache */
mov r12, #0x1 @ set up to invalidate L2 mov r12, #0x1 @ set up to invalidate L2
@ -506,7 +495,9 @@ l2_inv_gp:
mov r12, #0x2 mov r12, #0x2
smc #0 @ Call SMI monitor (smieq) smc #0 @ Call SMI monitor (smieq)
logic_l1_restore: logic_l1_restore:
ldr r1, l2dis_3630 adr r0, l2dis_3630_offset @ adress for offset
ldr r1, [r0] @ value for offset
ldr r1, [r0, r1] @ value at l2dis_3630
cmp r1, #0x1 @ Test if L2 re-enable needed on 3630 cmp r1, #0x1 @ Test if L2 re-enable needed on 3630
bne skipl2reen bne skipl2reen
mrc p15, 0, r1, c1, c0, 1 mrc p15, 0, r1, c1, c0, 1
@ -535,9 +526,17 @@ control_stat:
.word CONTROL_STAT .word CONTROL_STAT
control_mem_rta: control_mem_rta:
.word CONTROL_MEM_RTA_CTRL .word CONTROL_MEM_RTA_CTRL
l2dis_3630_offset:
.long l2dis_3630 - .
.data
l2dis_3630: l2dis_3630:
.word 0 .word 0
.data
l2_inv_api_params:
.word 0x1, 0x00
/* /*
* Internal functions * Internal functions
*/ */

View file

@ -29,12 +29,6 @@
dsb dsb
.endm .endm
ppa_zero_params:
.word 0x0
ppa_por_params:
.word 1, 0
#ifdef CONFIG_ARCH_OMAP4 #ifdef CONFIG_ARCH_OMAP4
/* /*
@ -266,7 +260,9 @@ ENTRY(omap4_cpu_resume)
beq skip_ns_smp_enable beq skip_ns_smp_enable
ppa_actrl_retry: ppa_actrl_retry:
mov r0, #OMAP4_PPA_CPU_ACTRL_SMP_INDEX mov r0, #OMAP4_PPA_CPU_ACTRL_SMP_INDEX
adr r3, ppa_zero_params @ Pointer to parameters adr r1, ppa_zero_params_offset
ldr r3, [r1]
add r3, r3, r1 @ Pointer to ppa_zero_params
mov r1, #0x0 @ Process ID mov r1, #0x0 @ Process ID
mov r2, #0x4 @ Flag mov r2, #0x4 @ Flag
mov r6, #0xff mov r6, #0xff
@ -303,7 +299,9 @@ skip_ns_smp_enable:
ldr r0, =OMAP4_PPA_L2_POR_INDEX ldr r0, =OMAP4_PPA_L2_POR_INDEX
ldr r1, =OMAP44XX_SAR_RAM_BASE ldr r1, =OMAP44XX_SAR_RAM_BASE
ldr r4, [r1, #L2X0_PREFETCH_CTRL_OFFSET] ldr r4, [r1, #L2X0_PREFETCH_CTRL_OFFSET]
adr r3, ppa_por_params adr r1, ppa_por_params_offset
ldr r3, [r1]
add r3, r3, r1 @ Pointer to ppa_por_params
str r4, [r3, #0x04] str r4, [r3, #0x04]
mov r1, #0x0 @ Process ID mov r1, #0x0 @ Process ID
mov r2, #0x4 @ Flag mov r2, #0x4 @ Flag
@ -328,6 +326,8 @@ skip_l2en:
#endif #endif
b cpu_resume @ Jump to generic resume b cpu_resume @ Jump to generic resume
ppa_por_params_offset:
.long ppa_por_params - .
ENDPROC(omap4_cpu_resume) ENDPROC(omap4_cpu_resume)
#endif /* CONFIG_ARCH_OMAP4 */ #endif /* CONFIG_ARCH_OMAP4 */
@ -380,4 +380,13 @@ ENTRY(omap_do_wfi)
nop nop
ldmfd sp!, {pc} ldmfd sp!, {pc}
ppa_zero_params_offset:
.long ppa_zero_params - .
ENDPROC(omap_do_wfi) ENDPROC(omap_do_wfi)
.data
ppa_zero_params:
.word 0
ppa_por_params:
.word 1, 0

View file

@ -1,6 +1,7 @@
menuconfig ARCH_SIRF menuconfig ARCH_SIRF
bool "CSR SiRF" if ARCH_MULTI_V7 bool "CSR SiRF" if ARCH_MULTI_V7
select ARCH_HAS_RESET_CONTROLLER select ARCH_HAS_RESET_CONTROLLER
select RESET_CONTROLLER
select ARCH_REQUIRE_GPIOLIB select ARCH_REQUIRE_GPIOLIB
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select NO_IOPORT_MAP select NO_IOPORT_MAP

View file

@ -54,12 +54,12 @@ static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev)
static struct resource s3c64xx_iis0_resource[] = { static struct resource s3c64xx_iis0_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256), [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256),
[1] = DEFINE_RES_DMA(DMACH_I2S0_OUT),
[2] = DEFINE_RES_DMA(DMACH_I2S0_IN),
}; };
static struct s3c_audio_pdata i2sv3_pdata = { static struct s3c_audio_pdata i2s0_pdata = {
.cfg_gpio = s3c64xx_i2s_cfg_gpio, .cfg_gpio = s3c64xx_i2s_cfg_gpio,
.dma_playback = DMACH_I2S0_OUT,
.dma_capture = DMACH_I2S0_IN,
}; };
struct platform_device s3c64xx_device_iis0 = { struct platform_device s3c64xx_device_iis0 = {
@ -68,15 +68,19 @@ struct platform_device s3c64xx_device_iis0 = {
.num_resources = ARRAY_SIZE(s3c64xx_iis0_resource), .num_resources = ARRAY_SIZE(s3c64xx_iis0_resource),
.resource = s3c64xx_iis0_resource, .resource = s3c64xx_iis0_resource,
.dev = { .dev = {
.platform_data = &i2sv3_pdata, .platform_data = &i2s0_pdata,
}, },
}; };
EXPORT_SYMBOL(s3c64xx_device_iis0); EXPORT_SYMBOL(s3c64xx_device_iis0);
static struct resource s3c64xx_iis1_resource[] = { static struct resource s3c64xx_iis1_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256), [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256),
[1] = DEFINE_RES_DMA(DMACH_I2S1_OUT), };
[2] = DEFINE_RES_DMA(DMACH_I2S1_IN),
static struct s3c_audio_pdata i2s1_pdata = {
.cfg_gpio = s3c64xx_i2s_cfg_gpio,
.dma_playback = DMACH_I2S1_OUT,
.dma_capture = DMACH_I2S1_IN,
}; };
struct platform_device s3c64xx_device_iis1 = { struct platform_device s3c64xx_device_iis1 = {
@ -85,19 +89,19 @@ struct platform_device s3c64xx_device_iis1 = {
.num_resources = ARRAY_SIZE(s3c64xx_iis1_resource), .num_resources = ARRAY_SIZE(s3c64xx_iis1_resource),
.resource = s3c64xx_iis1_resource, .resource = s3c64xx_iis1_resource,
.dev = { .dev = {
.platform_data = &i2sv3_pdata, .platform_data = &i2s1_pdata,
}, },
}; };
EXPORT_SYMBOL(s3c64xx_device_iis1); EXPORT_SYMBOL(s3c64xx_device_iis1);
static struct resource s3c64xx_iisv4_resource[] = { static struct resource s3c64xx_iisv4_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256), [0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256),
[1] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_TX),
[2] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_RX),
}; };
static struct s3c_audio_pdata i2sv4_pdata = { static struct s3c_audio_pdata i2sv4_pdata = {
.cfg_gpio = s3c64xx_i2s_cfg_gpio, .cfg_gpio = s3c64xx_i2s_cfg_gpio,
.dma_playback = DMACH_HSI_I2SV40_TX,
.dma_capture = DMACH_HSI_I2SV40_RX,
.type = { .type = {
.i2s = { .i2s = {
.quirks = QUIRK_PRI_6CHAN, .quirks = QUIRK_PRI_6CHAN,
@ -142,12 +146,12 @@ static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev)
static struct resource s3c64xx_pcm0_resource[] = { static struct resource s3c64xx_pcm0_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256), [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256),
[1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
[2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
}; };
static struct s3c_audio_pdata s3c_pcm0_pdata = { static struct s3c_audio_pdata s3c_pcm0_pdata = {
.cfg_gpio = s3c64xx_pcm_cfg_gpio, .cfg_gpio = s3c64xx_pcm_cfg_gpio,
.dma_capture = DMACH_PCM0_RX,
.dma_playback = DMACH_PCM0_TX,
}; };
struct platform_device s3c64xx_device_pcm0 = { struct platform_device s3c64xx_device_pcm0 = {
@ -163,12 +167,12 @@ EXPORT_SYMBOL(s3c64xx_device_pcm0);
static struct resource s3c64xx_pcm1_resource[] = { static struct resource s3c64xx_pcm1_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256), [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256),
[1] = DEFINE_RES_DMA(DMACH_PCM1_TX),
[2] = DEFINE_RES_DMA(DMACH_PCM1_RX),
}; };
static struct s3c_audio_pdata s3c_pcm1_pdata = { static struct s3c_audio_pdata s3c_pcm1_pdata = {
.cfg_gpio = s3c64xx_pcm_cfg_gpio, .cfg_gpio = s3c64xx_pcm_cfg_gpio,
.dma_playback = DMACH_PCM1_TX,
.dma_capture = DMACH_PCM1_RX,
}; };
struct platform_device s3c64xx_device_pcm1 = { struct platform_device s3c64xx_device_pcm1 = {
@ -196,13 +200,14 @@ static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev)
static struct resource s3c64xx_ac97_resource[] = { static struct resource s3c64xx_ac97_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256), [0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256),
[1] = DEFINE_RES_DMA(DMACH_AC97_PCMOUT), [1] = DEFINE_RES_IRQ(IRQ_AC97),
[2] = DEFINE_RES_DMA(DMACH_AC97_PCMIN),
[3] = DEFINE_RES_DMA(DMACH_AC97_MICIN),
[4] = DEFINE_RES_IRQ(IRQ_AC97),
}; };
static struct s3c_audio_pdata s3c_ac97_pdata; static struct s3c_audio_pdata s3c_ac97_pdata = {
.dma_playback = DMACH_AC97_PCMOUT,
.dma_capture = DMACH_AC97_PCMIN,
.dma_capture_mic = DMACH_AC97_MICIN,
};
static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32); static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32);

View file

@ -14,38 +14,38 @@
#define S3C64XX_DMA_CHAN(name) ((unsigned long)(name)) #define S3C64XX_DMA_CHAN(name) ((unsigned long)(name))
/* DMA0/SDMA0 */ /* DMA0/SDMA0 */
#define DMACH_UART0 S3C64XX_DMA_CHAN("uart0_tx") #define DMACH_UART0 "uart0_tx"
#define DMACH_UART0_SRC2 S3C64XX_DMA_CHAN("uart0_rx") #define DMACH_UART0_SRC2 "uart0_rx"
#define DMACH_UART1 S3C64XX_DMA_CHAN("uart1_tx") #define DMACH_UART1 "uart1_tx"
#define DMACH_UART1_SRC2 S3C64XX_DMA_CHAN("uart1_rx") #define DMACH_UART1_SRC2 "uart1_rx"
#define DMACH_UART2 S3C64XX_DMA_CHAN("uart2_tx") #define DMACH_UART2 "uart2_tx"
#define DMACH_UART2_SRC2 S3C64XX_DMA_CHAN("uart2_rx") #define DMACH_UART2_SRC2 "uart2_rx"
#define DMACH_UART3 S3C64XX_DMA_CHAN("uart3_tx") #define DMACH_UART3 "uart3_tx"
#define DMACH_UART3_SRC2 S3C64XX_DMA_CHAN("uart3_rx") #define DMACH_UART3_SRC2 "uart3_rx"
#define DMACH_PCM0_TX S3C64XX_DMA_CHAN("pcm0_tx") #define DMACH_PCM0_TX "pcm0_tx"
#define DMACH_PCM0_RX S3C64XX_DMA_CHAN("pcm0_rx") #define DMACH_PCM0_RX "pcm0_rx"
#define DMACH_I2S0_OUT S3C64XX_DMA_CHAN("i2s0_tx") #define DMACH_I2S0_OUT "i2s0_tx"
#define DMACH_I2S0_IN S3C64XX_DMA_CHAN("i2s0_rx") #define DMACH_I2S0_IN "i2s0_rx"
#define DMACH_SPI0_TX S3C64XX_DMA_CHAN("spi0_tx") #define DMACH_SPI0_TX S3C64XX_DMA_CHAN("spi0_tx")
#define DMACH_SPI0_RX S3C64XX_DMA_CHAN("spi0_rx") #define DMACH_SPI0_RX S3C64XX_DMA_CHAN("spi0_rx")
#define DMACH_HSI_I2SV40_TX S3C64XX_DMA_CHAN("i2s2_tx") #define DMACH_HSI_I2SV40_TX "i2s2_tx"
#define DMACH_HSI_I2SV40_RX S3C64XX_DMA_CHAN("i2s2_rx") #define DMACH_HSI_I2SV40_RX "i2s2_rx"
/* DMA1/SDMA1 */ /* DMA1/SDMA1 */
#define DMACH_PCM1_TX S3C64XX_DMA_CHAN("pcm1_tx") #define DMACH_PCM1_TX "pcm1_tx"
#define DMACH_PCM1_RX S3C64XX_DMA_CHAN("pcm1_rx") #define DMACH_PCM1_RX "pcm1_rx"
#define DMACH_I2S1_OUT S3C64XX_DMA_CHAN("i2s1_tx") #define DMACH_I2S1_OUT "i2s1_tx"
#define DMACH_I2S1_IN S3C64XX_DMA_CHAN("i2s1_rx") #define DMACH_I2S1_IN "i2s1_rx"
#define DMACH_SPI1_TX S3C64XX_DMA_CHAN("spi1_tx") #define DMACH_SPI1_TX S3C64XX_DMA_CHAN("spi1_tx")
#define DMACH_SPI1_RX S3C64XX_DMA_CHAN("spi1_rx") #define DMACH_SPI1_RX S3C64XX_DMA_CHAN("spi1_rx")
#define DMACH_AC97_PCMOUT S3C64XX_DMA_CHAN("ac97_out") #define DMACH_AC97_PCMOUT "ac97_out"
#define DMACH_AC97_PCMIN S3C64XX_DMA_CHAN("ac97_in") #define DMACH_AC97_PCMIN "ac97_in"
#define DMACH_AC97_MICIN S3C64XX_DMA_CHAN("ac97_mic") #define DMACH_AC97_MICIN "ac97_mic"
#define DMACH_PWM S3C64XX_DMA_CHAN("pwm") #define DMACH_PWM "pwm"
#define DMACH_IRDA S3C64XX_DMA_CHAN("irda") #define DMACH_IRDA "irda"
#define DMACH_EXTERNAL S3C64XX_DMA_CHAN("external") #define DMACH_EXTERNAL "external"
#define DMACH_SECURITY_RX S3C64XX_DMA_CHAN("sec_rx") #define DMACH_SECURITY_RX "sec_rx"
#define DMACH_SECURITY_TX S3C64XX_DMA_CHAN("sec_tx") #define DMACH_SECURITY_TX "sec_tx"
enum dma_ch { enum dma_ch {
DMACH_MAX = 32 DMACH_MAX = 32

View file

@ -13,6 +13,7 @@
#include <asm/assembler.h> #include <asm/assembler.h>
.arch armv7-a .arch armv7-a
.arm
ENTRY(secondary_trampoline) ENTRY(secondary_trampoline)
/* CPU1 will always fetch from 0x0 when it is brought out of reset. /* CPU1 will always fetch from 0x0 when it is brought out of reset.

View file

@ -65,6 +65,7 @@
#include <linux/platform_data/usb-ohci-s3c2410.h> #include <linux/platform_data/usb-ohci-s3c2410.h>
#include <plat/usb-phy.h> #include <plat/usb-phy.h>
#include <plat/regs-spi.h> #include <plat/regs-spi.h>
#include <linux/platform_data/asoc-s3c.h>
#include <linux/platform_data/spi-s3c64xx.h> #include <linux/platform_data/spi-s3c64xx.h>
static u64 samsung_device_dma_mask = DMA_BIT_MASK(32); static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
@ -74,9 +75,12 @@ static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
static struct resource s3c_ac97_resource[] = { static struct resource s3c_ac97_resource[] = {
[0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97), [0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97),
[1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97), [1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97),
[2] = DEFINE_RES_DMA_NAMED(DMACH_PCM_OUT, "PCM out"), };
[3] = DEFINE_RES_DMA_NAMED(DMACH_PCM_IN, "PCM in"),
[4] = DEFINE_RES_DMA_NAMED(DMACH_MIC_IN, "Mic in"), static struct s3c_audio_pdata s3c_ac97_pdata = {
.dma_playback = (void *)DMACH_PCM_OUT,
.dma_capture = (void *)DMACH_PCM_IN,
.dma_capture_mic = (void *)DMACH_MIC_IN,
}; };
struct platform_device s3c_device_ac97 = { struct platform_device s3c_device_ac97 = {
@ -87,6 +91,7 @@ struct platform_device s3c_device_ac97 = {
.dev = { .dev = {
.dma_mask = &samsung_device_dma_mask, .dma_mask = &samsung_device_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &s3c_ac97_pdata,
} }
}; };
#endif /* CONFIG_CPU_S3C2440 */ #endif /* CONFIG_CPU_S3C2440 */

View file

@ -28,6 +28,7 @@ endif
KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr) KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr)
KBUILD_CFLAGS += -fno-pic KBUILD_CFLAGS += -fno-pic
KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads)
KBUILD_AFLAGS += $(lseinstr) KBUILD_AFLAGS += $(lseinstr)
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)

View file

@ -156,14 +156,14 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,
#define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) #define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12))
#endif #endif
#ifdef CONFIG_COMPAT
#ifdef __AARCH64EB__ #ifdef __AARCH64EB__
#define COMPAT_ELF_PLATFORM ("v8b") #define COMPAT_ELF_PLATFORM ("v8b")
#else #else
#define COMPAT_ELF_PLATFORM ("v8l") #define COMPAT_ELF_PLATFORM ("v8l")
#endif #endif
#ifdef CONFIG_COMPAT
#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3)
/* AArch32 registers. */ /* AArch32 registers. */

View file

@ -1 +1,5 @@
#ifdef CONFIG_CPU_BIG_ENDIAN
#define CONFIG_CPU_ENDIAN_BE8 CONFIG_CPU_BIG_ENDIAN
#endif
#include <../../arm/include/asm/opcodes.h> #include <../../arm/include/asm/opcodes.h>

View file

@ -117,7 +117,6 @@
* Section * Section
*/ */
#define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0) #define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0)
#define PMD_SECT_PROT_NONE (_AT(pmdval_t, 1) << 58)
#define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */ #define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */
#define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */ #define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */
#define PMD_SECT_S (_AT(pmdval_t, 3) << 8) #define PMD_SECT_S (_AT(pmdval_t, 3) << 8)

View file

@ -34,7 +34,7 @@
/* /*
* VMALLOC and SPARSEMEM_VMEMMAP ranges. * VMALLOC and SPARSEMEM_VMEMMAP ranges.
* *
* VMEMAP_SIZE: allows the whole VA space to be covered by a struct page array * VMEMAP_SIZE: allows the whole linear region to be covered by a struct page array
* (rounded up to PUD_SIZE). * (rounded up to PUD_SIZE).
* VMALLOC_START: beginning of the kernel VA space * VMALLOC_START: beginning of the kernel VA space
* VMALLOC_END: extends to the available space below vmmemmap, PCI I/O space, * VMALLOC_END: extends to the available space below vmmemmap, PCI I/O space,
@ -51,7 +51,9 @@
#define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K) #define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K)
#define vmemmap ((struct page *)(VMALLOC_END + SZ_64K)) #define VMEMMAP_START (VMALLOC_END + SZ_64K)
#define vmemmap ((struct page *)VMEMMAP_START - \
SECTION_ALIGN_DOWN(memstart_addr >> PAGE_SHIFT))
#define FIRST_USER_ADDRESS 0UL #define FIRST_USER_ADDRESS 0UL
@ -67,11 +69,11 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
#define PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED) #define PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED)
#define PROT_SECT_DEFAULT (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S) #define PROT_SECT_DEFAULT (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S)
#define PROT_DEVICE_nGnRnE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRnE)) #define PROT_DEVICE_nGnRnE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRnE))
#define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE)) #define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRE))
#define PROT_NORMAL_NC (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_NORMAL_NC)) #define PROT_NORMAL_NC (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_NC))
#define PROT_NORMAL_WT (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_NORMAL_WT)) #define PROT_NORMAL_WT (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_WT))
#define PROT_NORMAL (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_NORMAL)) #define PROT_NORMAL (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL))
#define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE)) #define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE))
#define PROT_SECT_NORMAL (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL)) #define PROT_SECT_NORMAL (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
@ -81,7 +83,7 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
#define PAGE_KERNEL __pgprot(_PAGE_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE) #define PAGE_KERNEL __pgprot(_PAGE_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE)
#define PAGE_KERNEL_RO __pgprot(_PAGE_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_RDONLY) #define PAGE_KERNEL_RO __pgprot(_PAGE_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_RDONLY)
#define PAGE_KERNEL_ROX __pgprot(_PAGE_DEFAULT | PTE_UXN | PTE_DIRTY | PTE_RDONLY) #define PAGE_KERNEL_ROX __pgprot(_PAGE_DEFAULT | PTE_UXN | PTE_DIRTY | PTE_RDONLY)
#define PAGE_KERNEL_EXEC __pgprot(_PAGE_DEFAULT | PTE_UXN | PTE_DIRTY | PTE_WRITE) #define PAGE_KERNEL_EXEC __pgprot(_PAGE_DEFAULT | PTE_UXN | PTE_DIRTY | PTE_WRITE)
#define PAGE_KERNEL_EXEC_CONT __pgprot(_PAGE_DEFAULT | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_CONT) #define PAGE_KERNEL_EXEC_CONT __pgprot(_PAGE_DEFAULT | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_CONT)
@ -153,6 +155,7 @@ extern struct page *empty_zero_page;
#define pte_write(pte) (!!(pte_val(pte) & PTE_WRITE)) #define pte_write(pte) (!!(pte_val(pte) & PTE_WRITE))
#define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN))
#define pte_cont(pte) (!!(pte_val(pte) & PTE_CONT)) #define pte_cont(pte) (!!(pte_val(pte) & PTE_CONT))
#define pte_user(pte) (!!(pte_val(pte) & PTE_USER))
#ifdef CONFIG_ARM64_HW_AFDBM #ifdef CONFIG_ARM64_HW_AFDBM
#define pte_hw_dirty(pte) (pte_write(pte) && !(pte_val(pte) & PTE_RDONLY)) #define pte_hw_dirty(pte) (pte_write(pte) && !(pte_val(pte) & PTE_RDONLY))
@ -163,8 +166,6 @@ extern struct page *empty_zero_page;
#define pte_dirty(pte) (pte_sw_dirty(pte) || pte_hw_dirty(pte)) #define pte_dirty(pte) (pte_sw_dirty(pte) || pte_hw_dirty(pte))
#define pte_valid(pte) (!!(pte_val(pte) & PTE_VALID)) #define pte_valid(pte) (!!(pte_val(pte) & PTE_VALID))
#define pte_valid_user(pte) \
((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
#define pte_valid_not_user(pte) \ #define pte_valid_not_user(pte) \
((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
@ -262,13 +263,13 @@ extern void __sync_icache_dcache(pte_t pteval, unsigned long addr);
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pte) pte_t *ptep, pte_t pte)
{ {
if (pte_valid_user(pte)) { if (pte_present(pte)) {
if (!pte_special(pte) && pte_exec(pte))
__sync_icache_dcache(pte, addr);
if (pte_sw_dirty(pte) && pte_write(pte)) if (pte_sw_dirty(pte) && pte_write(pte))
pte_val(pte) &= ~PTE_RDONLY; pte_val(pte) &= ~PTE_RDONLY;
else else
pte_val(pte) |= PTE_RDONLY; pte_val(pte) |= PTE_RDONLY;
if (pte_user(pte) && pte_exec(pte) && !pte_special(pte))
__sync_icache_dcache(pte, addr);
} }
/* /*
@ -346,6 +347,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,
#endif /* CONFIG_HAVE_RCU_TABLE_FREE */ #endif /* CONFIG_HAVE_RCU_TABLE_FREE */
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
#define pmd_present(pmd) pte_present(pmd_pte(pmd))
#define pmd_dirty(pmd) pte_dirty(pmd_pte(pmd)) #define pmd_dirty(pmd) pte_dirty(pmd_pte(pmd))
#define pmd_young(pmd) pte_young(pmd_pte(pmd)) #define pmd_young(pmd) pte_young(pmd_pte(pmd))
#define pmd_wrprotect(pmd) pte_pmd(pte_wrprotect(pmd_pte(pmd))) #define pmd_wrprotect(pmd) pte_pmd(pte_wrprotect(pmd_pte(pmd)))
@ -354,7 +356,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,
#define pmd_mkwrite(pmd) pte_pmd(pte_mkwrite(pmd_pte(pmd))) #define pmd_mkwrite(pmd) pte_pmd(pte_mkwrite(pmd_pte(pmd)))
#define pmd_mkdirty(pmd) pte_pmd(pte_mkdirty(pmd_pte(pmd))) #define pmd_mkdirty(pmd) pte_pmd(pte_mkdirty(pmd_pte(pmd)))
#define pmd_mkyoung(pmd) pte_pmd(pte_mkyoung(pmd_pte(pmd))) #define pmd_mkyoung(pmd) pte_pmd(pte_mkyoung(pmd_pte(pmd)))
#define pmd_mknotpresent(pmd) (__pmd(pmd_val(pmd) & ~PMD_TYPE_MASK)) #define pmd_mknotpresent(pmd) (__pmd(pmd_val(pmd) & ~PMD_SECT_VALID))
#define __HAVE_ARCH_PMD_WRITE #define __HAVE_ARCH_PMD_WRITE
#define pmd_write(pmd) pte_write(pmd_pte(pmd)) #define pmd_write(pmd) pte_write(pmd_pte(pmd))
@ -393,7 +395,6 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
unsigned long size, pgprot_t vma_prot); unsigned long size, pgprot_t vma_prot);
#define pmd_none(pmd) (!pmd_val(pmd)) #define pmd_none(pmd) (!pmd_val(pmd))
#define pmd_present(pmd) (pmd_val(pmd))
#define pmd_bad(pmd) (!(pmd_val(pmd) & 2)) #define pmd_bad(pmd) (!(pmd_val(pmd) & 2))
@ -537,6 +538,21 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
} }
#ifdef CONFIG_ARM64_HW_AFDBM #ifdef CONFIG_ARM64_HW_AFDBM
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
extern int ptep_set_access_flags(struct vm_area_struct *vma,
unsigned long address, pte_t *ptep,
pte_t entry, int dirty);
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
#define __HAVE_ARCH_PMDP_SET_ACCESS_FLAGS
static inline int pmdp_set_access_flags(struct vm_area_struct *vma,
unsigned long address, pmd_t *pmdp,
pmd_t entry, int dirty)
{
return ptep_set_access_flags(vma, address, (pte_t *)pmdp, pmd_pte(entry), dirty);
}
#endif
/* /*
* Atomic pte/pmd modifications. * Atomic pte/pmd modifications.
*/ */
@ -589,9 +605,9 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
} }
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
#define __HAVE_ARCH_PMDP_GET_AND_CLEAR #define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR
static inline pmd_t pmdp_get_and_clear(struct mm_struct *mm, static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm,
unsigned long address, pmd_t *pmdp) unsigned long address, pmd_t *pmdp)
{ {
return pte_pmd(ptep_get_and_clear(mm, address, (pte_t *)pmdp)); return pte_pmd(ptep_get_and_clear(mm, address, (pte_t *)pmdp));
} }
@ -639,6 +655,7 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD];
* bits 0-1: present (must be zero) * bits 0-1: present (must be zero)
* bits 2-7: swap type * bits 2-7: swap type
* bits 8-57: swap offset * bits 8-57: swap offset
* bit 58: PTE_PROT_NONE (must be zero)
*/ */
#define __SWP_TYPE_SHIFT 2 #define __SWP_TYPE_SHIFT 2
#define __SWP_TYPE_BITS 6 #define __SWP_TYPE_BITS 6

View file

@ -58,6 +58,7 @@
#define COMPAT_PSR_Z_BIT 0x40000000 #define COMPAT_PSR_Z_BIT 0x40000000
#define COMPAT_PSR_N_BIT 0x80000000 #define COMPAT_PSR_N_BIT 0x80000000
#define COMPAT_PSR_IT_MASK 0x0600fc00 /* If-Then execution state mask */ #define COMPAT_PSR_IT_MASK 0x0600fc00 /* If-Then execution state mask */
#define COMPAT_PSR_GE_MASK 0x000f0000
#ifdef CONFIG_CPU_BIG_ENDIAN #ifdef CONFIG_CPU_BIG_ENDIAN
#define COMPAT_PSR_ENDSTATE COMPAT_PSR_E_BIT #define COMPAT_PSR_ENDSTATE COMPAT_PSR_E_BIT
@ -151,35 +152,9 @@ static inline unsigned long regs_return_value(struct pt_regs *regs)
return regs->regs[0]; return regs->regs[0];
} }
/* /* We must avoid circular header include via sched.h */
* Are the current registers suitable for user mode? (used to maintain struct task_struct;
* security in signal handlers) int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task);
*/
static inline int valid_user_regs(struct user_pt_regs *regs)
{
if (user_mode(regs) && (regs->pstate & PSR_I_BIT) == 0) {
regs->pstate &= ~(PSR_F_BIT | PSR_A_BIT);
/* The T bit is reserved for AArch64 */
if (!(regs->pstate & PSR_MODE32_BIT))
regs->pstate &= ~COMPAT_PSR_T_BIT;
return 1;
}
/*
* Force PSR to something logical...
*/
regs->pstate &= PSR_f | PSR_s | (PSR_x & ~PSR_A_BIT) | \
COMPAT_PSR_T_BIT | PSR_MODE32_BIT;
if (!(regs->pstate & PSR_MODE32_BIT)) {
regs->pstate &= ~COMPAT_PSR_T_BIT;
regs->pstate |= PSR_MODE_EL0t;
}
return 0;
}
#define instruction_pointer(regs) ((unsigned long)(regs)->pc) #define instruction_pointer(regs) ((unsigned long)(regs)->pc)

View file

@ -22,6 +22,8 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/bug.h> #include <linux/bug.h>
#include <linux/compat.h>
#include <linux/elf.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/personality.h> #include <linux/personality.h>
@ -85,7 +87,8 @@ static const char *const compat_hwcap_str[] = {
"idivt", "idivt",
"vfpd32", "vfpd32",
"lpae", "lpae",
"evtstrm" "evtstrm",
NULL
}; };
static const char *const compat_hwcap2_str[] = { static const char *const compat_hwcap2_str[] = {
@ -101,6 +104,7 @@ static const char *const compat_hwcap2_str[] = {
static int c_show(struct seq_file *m, void *v) static int c_show(struct seq_file *m, void *v)
{ {
int i, j; int i, j;
bool compat = personality(current->personality) == PER_LINUX32;
for_each_online_cpu(i) { for_each_online_cpu(i) {
struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i); struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
@ -112,6 +116,9 @@ static int c_show(struct seq_file *m, void *v)
* "processor". Give glibc what it expects. * "processor". Give glibc what it expects.
*/ */
seq_printf(m, "processor\t: %d\n", i); seq_printf(m, "processor\t: %d\n", i);
if (compat)
seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
loops_per_jiffy / (500000UL/HZ), loops_per_jiffy / (500000UL/HZ),
@ -124,7 +131,7 @@ static int c_show(struct seq_file *m, void *v)
* software which does already (at least for 32-bit). * software which does already (at least for 32-bit).
*/ */
seq_puts(m, "Features\t:"); seq_puts(m, "Features\t:");
if (personality(current->personality) == PER_LINUX32) { if (compat) {
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
for (j = 0; compat_hwcap_str[j]; j++) for (j = 0; compat_hwcap_str[j]; j++)
if (compat_elf_hwcap & (1 << j)) if (compat_elf_hwcap & (1 << j))

View file

@ -186,20 +186,21 @@ static void clear_regs_spsr_ss(struct pt_regs *regs)
/* EL1 Single Step Handler hooks */ /* EL1 Single Step Handler hooks */
static LIST_HEAD(step_hook); static LIST_HEAD(step_hook);
static DEFINE_RWLOCK(step_hook_lock); static DEFINE_SPINLOCK(step_hook_lock);
void register_step_hook(struct step_hook *hook) void register_step_hook(struct step_hook *hook)
{ {
write_lock(&step_hook_lock); spin_lock(&step_hook_lock);
list_add(&hook->node, &step_hook); list_add_rcu(&hook->node, &step_hook);
write_unlock(&step_hook_lock); spin_unlock(&step_hook_lock);
} }
void unregister_step_hook(struct step_hook *hook) void unregister_step_hook(struct step_hook *hook)
{ {
write_lock(&step_hook_lock); spin_lock(&step_hook_lock);
list_del(&hook->node); list_del_rcu(&hook->node);
write_unlock(&step_hook_lock); spin_unlock(&step_hook_lock);
synchronize_rcu();
} }
/* /*
@ -213,15 +214,15 @@ static int call_step_hook(struct pt_regs *regs, unsigned int esr)
struct step_hook *hook; struct step_hook *hook;
int retval = DBG_HOOK_ERROR; int retval = DBG_HOOK_ERROR;
read_lock(&step_hook_lock); rcu_read_lock();
list_for_each_entry(hook, &step_hook, node) { list_for_each_entry_rcu(hook, &step_hook, node) {
retval = hook->fn(regs, esr); retval = hook->fn(regs, esr);
if (retval == DBG_HOOK_HANDLED) if (retval == DBG_HOOK_HANDLED)
break; break;
} }
read_unlock(&step_hook_lock); rcu_read_unlock();
return retval; return retval;
} }

View file

@ -512,9 +512,14 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems
#endif #endif
/* EL2 debug */ /* EL2 debug */
mrs x0, id_aa64dfr0_el1 // Check ID_AA64DFR0_EL1 PMUVer
sbfx x0, x0, #8, #4
cmp x0, #1
b.lt 4f // Skip if no PMU present
mrs x0, pmcr_el0 // Disable debug access traps mrs x0, pmcr_el0 // Disable debug access traps
ubfx x0, x0, #11, #5 // to EL2 and allow access to ubfx x0, x0, #11, #5 // to EL2 and allow access to
msr mdcr_el2, x0 // all PMU counters from EL1 msr mdcr_el2, x0 // all PMU counters from EL1
4:
/* Stage-2 translation */ /* Stage-2 translation */
msr vttbr_el2, xzr msr vttbr_el2, xzr

View file

@ -574,9 +574,6 @@ static void armv8pmu_reset(void *info)
/* Initialize & Reset PMNC: C and P bits. */ /* Initialize & Reset PMNC: C and P bits. */
armv8pmu_pmcr_write(ARMV8_PMCR_P | ARMV8_PMCR_C); armv8pmu_pmcr_write(ARMV8_PMCR_P | ARMV8_PMCR_C);
/* Disable access from userspace. */
asm volatile("msr pmuserenr_el0, %0" :: "r" (0));
} }
static int armv8_pmuv3_map_event(struct perf_event *event) static int armv8_pmuv3_map_event(struct perf_event *event)

View file

@ -39,6 +39,7 @@
#include <linux/elf.h> #include <linux/elf.h>
#include <asm/compat.h> #include <asm/compat.h>
#include <asm/cpufeature.h>
#include <asm/debug-monitors.h> #include <asm/debug-monitors.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/syscall.h> #include <asm/syscall.h>
@ -58,6 +59,12 @@
*/ */
void ptrace_disable(struct task_struct *child) void ptrace_disable(struct task_struct *child)
{ {
/*
* This would be better off in core code, but PTRACE_DETACH has
* grown its fair share of arch-specific worts and changing it
* is likely to cause regressions on obscure architectures.
*/
user_disable_single_step(child);
} }
#ifdef CONFIG_HAVE_HW_BREAKPOINT #ifdef CONFIG_HAVE_HW_BREAKPOINT
@ -494,7 +501,7 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
if (ret) if (ret)
return ret; return ret;
if (!valid_user_regs(&newregs)) if (!valid_user_regs(&newregs, target))
return -EINVAL; return -EINVAL;
task_pt_regs(target)->user_regs = newregs; task_pt_regs(target)->user_regs = newregs;
@ -764,7 +771,7 @@ static int compat_gpr_set(struct task_struct *target,
} }
if (valid_user_regs(&newregs.user_regs)) if (valid_user_regs(&newregs.user_regs, target))
*task_pt_regs(target) = newregs; *task_pt_regs(target) = newregs;
else else
ret = -EINVAL; ret = -EINVAL;
@ -1266,3 +1273,79 @@ asmlinkage void syscall_trace_exit(struct pt_regs *regs)
if (test_thread_flag(TIF_SYSCALL_TRACE)) if (test_thread_flag(TIF_SYSCALL_TRACE))
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT); tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
} }
/*
* Bits which are always architecturally RES0 per ARM DDI 0487A.h
* Userspace cannot use these until they have an architectural meaning.
* We also reserve IL for the kernel; SS is handled dynamically.
*/
#define SPSR_EL1_AARCH64_RES0_BITS \
(GENMASK_ULL(63,32) | GENMASK_ULL(27, 22) | GENMASK_ULL(20, 10) | \
GENMASK_ULL(5, 5))
#define SPSR_EL1_AARCH32_RES0_BITS \
(GENMASK_ULL(63,32) | GENMASK_ULL(24, 22) | GENMASK_ULL(20,20))
static int valid_compat_regs(struct user_pt_regs *regs)
{
regs->pstate &= ~SPSR_EL1_AARCH32_RES0_BITS;
if (!system_supports_mixed_endian_el0()) {
if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
regs->pstate |= COMPAT_PSR_E_BIT;
else
regs->pstate &= ~COMPAT_PSR_E_BIT;
}
if (user_mode(regs) && (regs->pstate & PSR_MODE32_BIT) &&
(regs->pstate & COMPAT_PSR_A_BIT) == 0 &&
(regs->pstate & COMPAT_PSR_I_BIT) == 0 &&
(regs->pstate & COMPAT_PSR_F_BIT) == 0) {
return 1;
}
/*
* Force PSR to a valid 32-bit EL0t, preserving the same bits as
* arch/arm.
*/
regs->pstate &= COMPAT_PSR_N_BIT | COMPAT_PSR_Z_BIT |
COMPAT_PSR_C_BIT | COMPAT_PSR_V_BIT |
COMPAT_PSR_Q_BIT | COMPAT_PSR_IT_MASK |
COMPAT_PSR_GE_MASK | COMPAT_PSR_E_BIT |
COMPAT_PSR_T_BIT;
regs->pstate |= PSR_MODE32_BIT;
return 0;
}
static int valid_native_regs(struct user_pt_regs *regs)
{
regs->pstate &= ~SPSR_EL1_AARCH64_RES0_BITS;
if (user_mode(regs) && !(regs->pstate & PSR_MODE32_BIT) &&
(regs->pstate & PSR_D_BIT) == 0 &&
(regs->pstate & PSR_A_BIT) == 0 &&
(regs->pstate & PSR_I_BIT) == 0 &&
(regs->pstate & PSR_F_BIT) == 0) {
return 1;
}
/* Force PSR to a valid 64-bit EL0t */
regs->pstate &= PSR_N_BIT | PSR_Z_BIT | PSR_C_BIT | PSR_V_BIT;
return 0;
}
/*
* Are the current registers suitable for user mode? (used to maintain
* security in signal handlers)
*/
int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task)
{
if (!test_tsk_thread_flag(task, TIF_SINGLESTEP))
regs->pstate &= ~DBG_SPSR_SS;
if (is_compat_thread(task_thread_info(task)))
return valid_compat_regs(regs);
else
return valid_native_regs(regs);
}

View file

@ -115,7 +115,7 @@ static int restore_sigframe(struct pt_regs *regs,
*/ */
regs->syscallno = ~0UL; regs->syscallno = ~0UL;
err |= !valid_user_regs(&regs->user_regs); err |= !valid_user_regs(&regs->user_regs, current);
if (err == 0) { if (err == 0) {
struct fpsimd_context *fpsimd_ctx = struct fpsimd_context *fpsimd_ctx =
@ -307,7 +307,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
/* /*
* Check that the resulting registers are actually sane. * Check that the resulting registers are actually sane.
*/ */
ret |= !valid_user_regs(&regs->user_regs); ret |= !valid_user_regs(&regs->user_regs, current);
/* /*
* Fast forward the stepping logic so we step into the signal * Fast forward the stepping logic so we step into the signal

View file

@ -356,7 +356,7 @@ static int compat_restore_sigframe(struct pt_regs *regs,
*/ */
regs->syscallno = ~0UL; regs->syscallno = ~0UL;
err |= !valid_user_regs(&regs->user_regs); err |= !valid_user_regs(&regs->user_regs, current);
aux = (struct compat_aux_sigframe __user *) sf->uc.uc_regspace; aux = (struct compat_aux_sigframe __user *) sf->uc.uc_regspace;
if (err == 0) if (err == 0)

View file

@ -186,7 +186,7 @@ static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
u64 val; u64 val;
val = kvm_arm_timer_get_reg(vcpu, reg->id); val = kvm_arm_timer_get_reg(vcpu, reg->id);
return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)); return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)) ? -EFAULT : 0;
} }
/** /**

View file

@ -130,7 +130,7 @@ static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr
esr |= (ESR_ELx_EC_IABT_CUR << ESR_ELx_EC_SHIFT); esr |= (ESR_ELx_EC_IABT_CUR << ESR_ELx_EC_SHIFT);
if (!is_iabt) if (!is_iabt)
esr |= ESR_ELx_EC_DABT_LOW; esr |= ESR_ELx_EC_DABT_LOW << ESR_ELx_EC_SHIFT;
vcpu_sys_reg(vcpu, ESR_EL1) = esr | ESR_ELx_FSC_EXTABT; vcpu_sys_reg(vcpu, ESR_EL1) = esr | ESR_ELx_FSC_EXTABT;
} }

View file

@ -933,6 +933,10 @@ static int __init __iommu_dma_init(void)
ret = register_iommu_dma_ops_notifier(&platform_bus_type); ret = register_iommu_dma_ops_notifier(&platform_bus_type);
if (!ret) if (!ret)
ret = register_iommu_dma_ops_notifier(&amba_bustype); ret = register_iommu_dma_ops_notifier(&amba_bustype);
/* handle devices queued before this arch_initcall */
if (!ret)
__iommu_attach_notifier(NULL, BUS_NOTIFY_ADD_DEVICE, NULL);
return ret; return ret;
} }
arch_initcall(__iommu_dma_init); arch_initcall(__iommu_dma_init);

View file

@ -81,6 +81,56 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
printk("\n"); printk("\n");
} }
#ifdef CONFIG_ARM64_HW_AFDBM
/*
* This function sets the access flags (dirty, accessed), as well as write
* permission, and only to a more permissive setting.
*
* It needs to cope with hardware update of the accessed/dirty state by other
* agents in the system and can safely skip the __sync_icache_dcache() call as,
* like set_pte_at(), the PTE is never changed from no-exec to exec here.
*
* Returns whether or not the PTE actually changed.
*/
int ptep_set_access_flags(struct vm_area_struct *vma,
unsigned long address, pte_t *ptep,
pte_t entry, int dirty)
{
pteval_t old_pteval;
unsigned int tmp;
if (pte_same(*ptep, entry))
return 0;
/* only preserve the access flags and write permission */
pte_val(entry) &= PTE_AF | PTE_WRITE | PTE_DIRTY;
/*
* PTE_RDONLY is cleared by default in the asm below, so set it in
* back if necessary (read-only or clean PTE).
*/
if (!pte_write(entry) || !pte_sw_dirty(entry))
pte_val(entry) |= PTE_RDONLY;
/*
* Setting the flags must be done atomically to avoid racing with the
* hardware update of the access/dirty state.
*/
asm volatile("// ptep_set_access_flags\n"
" prfm pstl1strm, %2\n"
"1: ldxr %0, %2\n"
" and %0, %0, %3 // clear PTE_RDONLY\n"
" orr %0, %0, %4 // set flags\n"
" stxr %w1, %0, %2\n"
" cbnz %w1, 1b\n"
: "=&r" (old_pteval), "=&r" (tmp), "+Q" (pte_val(*ptep))
: "L" (~PTE_RDONLY), "r" (pte_val(entry)));
flush_tlb_fix_spurious_fault(vma, address);
return 1;
}
#endif
/* /*
* The kernel tried to access some page that wasn't present. * The kernel tried to access some page that wasn't present.
*/ */

View file

@ -321,8 +321,8 @@ void __init mem_init(void)
#endif #endif
MLG(VMALLOC_START, VMALLOC_END), MLG(VMALLOC_START, VMALLOC_END),
#ifdef CONFIG_SPARSEMEM_VMEMMAP #ifdef CONFIG_SPARSEMEM_VMEMMAP
MLG((unsigned long)vmemmap, MLG(VMEMMAP_START,
(unsigned long)vmemmap + VMEMMAP_SIZE), VMEMMAP_START + VMEMMAP_SIZE),
MLM((unsigned long)virt_to_page(PAGE_OFFSET), MLM((unsigned long)virt_to_page(PAGE_OFFSET),
(unsigned long)virt_to_page(high_memory)), (unsigned long)virt_to_page(high_memory)),
#endif #endif

View file

@ -456,6 +456,9 @@ void __init paging_init(void)
empty_zero_page = virt_to_page(zero_page); empty_zero_page = virt_to_page(zero_page);
/* Ensure the zero page is visible to the page table walker */
dsb(ishst);
/* /*
* TTBR0 is only used for the identity mapping at this stage. Make it * TTBR0 is only used for the identity mapping at this stage. Make it
* point to zero page to avoid speculatively fetching new entries. * point to zero page to avoid speculatively fetching new entries.

View file

@ -57,6 +57,9 @@ static int change_memory_common(unsigned long addr, int numpages,
if (end < MODULES_VADDR || end >= MODULES_END) if (end < MODULES_VADDR || end >= MODULES_END)
return -EINVAL; return -EINVAL;
if (!numpages)
return 0;
data.set_mask = set_mask; data.set_mask = set_mask;
data.clear_mask = clear_mask; data.clear_mask = clear_mask;

View file

@ -62,3 +62,15 @@
bfi \valreg, \tmpreg, #TCR_T0SZ_OFFSET, #TCR_TxSZ_WIDTH bfi \valreg, \tmpreg, #TCR_T0SZ_OFFSET, #TCR_TxSZ_WIDTH
#endif #endif
.endm .endm
/*
* reset_pmuserenr_el0 - reset PMUSERENR_EL0 if PMUv3 present
*/
.macro reset_pmuserenr_el0, tmpreg
mrs \tmpreg, id_aa64dfr0_el1 // Check ID_AA64DFR0_EL1 PMUVer
sbfx \tmpreg, \tmpreg, #8, #4
cmp \tmpreg, #1 // Skip if no PMU present
b.lt 9000f
msr pmuserenr_el0, xzr // Disable PMU access from EL0
9000:
.endm

View file

@ -117,6 +117,7 @@ ENTRY(cpu_do_resume)
*/ */
ubfx x11, x11, #1, #1 ubfx x11, x11, #1, #1
msr oslar_el1, x11 msr oslar_el1, x11
reset_pmuserenr_el0 x0 // Disable PMU access from EL0
mov x0, x12 mov x0, x12
dsb nsh // Make sure local tlb invalidation completed dsb nsh // Make sure local tlb invalidation completed
isb isb
@ -155,6 +156,7 @@ ENTRY(__cpu_setup)
msr cpacr_el1, x0 // Enable FP/ASIMD msr cpacr_el1, x0 // Enable FP/ASIMD
mov x0, #1 << 12 // Reset mdscr_el1 and disable mov x0, #1 << 12 // Reset mdscr_el1 and disable
msr mdscr_el1, x0 // access to the DCC from EL0 msr mdscr_el1, x0 // access to the DCC from EL0
reset_pmuserenr_el0 x0 // Disable PMU access from EL0
/* /*
* Memory region attributes for LPAE: * Memory region attributes for LPAE:
* *

View file

@ -436,6 +436,7 @@ static inline void __iomem * ioremap_cache (unsigned long phys_addr, unsigned lo
return ioremap(phys_addr, size); return ioremap(phys_addr, size);
} }
#define ioremap_cache ioremap_cache #define ioremap_cache ioremap_cache
#define ioremap_uc ioremap_nocache
/* /*

View file

@ -81,7 +81,10 @@ static struct resource code_resource = {
}; };
unsigned long memory_start; unsigned long memory_start;
EXPORT_SYMBOL(memory_start);
unsigned long memory_end; unsigned long memory_end;
EXPORT_SYMBOL(memory_end);
void __init setup_arch(char **); void __init setup_arch(char **);
int get_cpuinfo(char *); int get_cpuinfo(char *);

View file

@ -2155,7 +2155,7 @@ config MIPS_MT_SMP
select CPU_MIPSR2_IRQ_VI select CPU_MIPSR2_IRQ_VI
select CPU_MIPSR2_IRQ_EI select CPU_MIPSR2_IRQ_EI
select SYNC_R4K select SYNC_R4K
select MIPS_GIC_IPI select MIPS_GIC_IPI if MIPS_GIC
select MIPS_MT select MIPS_MT
select SMP select SMP
select SMP_UP select SMP_UP
@ -2253,7 +2253,7 @@ config MIPS_VPE_APSP_API_MT
config MIPS_CMP config MIPS_CMP
bool "MIPS CMP framework support (DEPRECATED)" bool "MIPS CMP framework support (DEPRECATED)"
depends on SYS_SUPPORTS_MIPS_CMP && !CPU_MIPSR6 depends on SYS_SUPPORTS_MIPS_CMP && !CPU_MIPSR6
select MIPS_GIC_IPI select MIPS_GIC_IPI if MIPS_GIC
select SMP select SMP
select SYNC_R4K select SYNC_R4K
select SYS_SUPPORTS_SMP select SYS_SUPPORTS_SMP
@ -2273,7 +2273,7 @@ config MIPS_CPS
select MIPS_CM select MIPS_CM
select MIPS_CPC select MIPS_CPC
select MIPS_CPS_PM if HOTPLUG_CPU select MIPS_CPS_PM if HOTPLUG_CPU
select MIPS_GIC_IPI select MIPS_GIC_IPI if MIPS_GIC
select SMP select SMP
select SYNC_R4K if (CEVT_R4K || CSRC_R4K) select SYNC_R4K if (CEVT_R4K || CSRC_R4K)
select SYS_SUPPORTS_HOTPLUG_CPU select SYS_SUPPORTS_HOTPLUG_CPU
@ -2292,6 +2292,7 @@ config MIPS_CPS_PM
bool bool
config MIPS_GIC_IPI config MIPS_GIC_IPI
depends on MIPS_GIC
bool bool
config MIPS_CM config MIPS_CM

View file

@ -503,15 +503,15 @@ int __init db1000_dev_setup(void)
if (board == BCSR_WHOAMI_DB1500) { if (board == BCSR_WHOAMI_DB1500) {
c0 = AU1500_GPIO2_INT; c0 = AU1500_GPIO2_INT;
c1 = AU1500_GPIO5_INT; c1 = AU1500_GPIO5_INT;
d0 = AU1500_GPIO0_INT; d0 = 0; /* GPIO number, NOT irq! */
d1 = AU1500_GPIO3_INT; d1 = 3; /* GPIO number, NOT irq! */
s0 = AU1500_GPIO1_INT; s0 = AU1500_GPIO1_INT;
s1 = AU1500_GPIO4_INT; s1 = AU1500_GPIO4_INT;
} else if (board == BCSR_WHOAMI_DB1100) { } else if (board == BCSR_WHOAMI_DB1100) {
c0 = AU1100_GPIO2_INT; c0 = AU1100_GPIO2_INT;
c1 = AU1100_GPIO5_INT; c1 = AU1100_GPIO5_INT;
d0 = AU1100_GPIO0_INT; d0 = 0; /* GPIO number, NOT irq! */
d1 = AU1100_GPIO3_INT; d1 = 3; /* GPIO number, NOT irq! */
s0 = AU1100_GPIO1_INT; s0 = AU1100_GPIO1_INT;
s1 = AU1100_GPIO4_INT; s1 = AU1100_GPIO4_INT;
@ -545,15 +545,15 @@ int __init db1000_dev_setup(void)
} else if (board == BCSR_WHOAMI_DB1000) { } else if (board == BCSR_WHOAMI_DB1000) {
c0 = AU1000_GPIO2_INT; c0 = AU1000_GPIO2_INT;
c1 = AU1000_GPIO5_INT; c1 = AU1000_GPIO5_INT;
d0 = AU1000_GPIO0_INT; d0 = 0; /* GPIO number, NOT irq! */
d1 = AU1000_GPIO3_INT; d1 = 3; /* GPIO number, NOT irq! */
s0 = AU1000_GPIO1_INT; s0 = AU1000_GPIO1_INT;
s1 = AU1000_GPIO4_INT; s1 = AU1000_GPIO4_INT;
platform_add_devices(db1000_devs, ARRAY_SIZE(db1000_devs)); platform_add_devices(db1000_devs, ARRAY_SIZE(db1000_devs));
} else if ((board == BCSR_WHOAMI_PB1500) || } else if ((board == BCSR_WHOAMI_PB1500) ||
(board == BCSR_WHOAMI_PB1500R2)) { (board == BCSR_WHOAMI_PB1500R2)) {
c0 = AU1500_GPIO203_INT; c0 = AU1500_GPIO203_INT;
d0 = AU1500_GPIO201_INT; d0 = 1; /* GPIO number, NOT irq! */
s0 = AU1500_GPIO202_INT; s0 = AU1500_GPIO202_INT;
twosocks = 0; twosocks = 0;
flashsize = 64; flashsize = 64;
@ -566,7 +566,7 @@ int __init db1000_dev_setup(void)
*/ */
} else if (board == BCSR_WHOAMI_PB1100) { } else if (board == BCSR_WHOAMI_PB1100) {
c0 = AU1100_GPIO11_INT; c0 = AU1100_GPIO11_INT;
d0 = AU1100_GPIO9_INT; d0 = 9; /* GPIO number, NOT irq! */
s0 = AU1100_GPIO10_INT; s0 = AU1100_GPIO10_INT;
twosocks = 0; twosocks = 0;
flashsize = 64; flashsize = 64;
@ -583,7 +583,6 @@ int __init db1000_dev_setup(void)
} else } else
return 0; /* unknown board, no further dev setup to do */ return 0; /* unknown board, no further dev setup to do */
irq_set_irq_type(d0, IRQ_TYPE_EDGE_BOTH);
irq_set_irq_type(c0, IRQ_TYPE_LEVEL_LOW); irq_set_irq_type(c0, IRQ_TYPE_LEVEL_LOW);
irq_set_irq_type(s0, IRQ_TYPE_LEVEL_LOW); irq_set_irq_type(s0, IRQ_TYPE_LEVEL_LOW);
@ -597,7 +596,6 @@ int __init db1000_dev_setup(void)
c0, d0, /*s0*/0, 0, 0); c0, d0, /*s0*/0, 0, 0);
if (twosocks) { if (twosocks) {
irq_set_irq_type(d1, IRQ_TYPE_EDGE_BOTH);
irq_set_irq_type(c1, IRQ_TYPE_LEVEL_LOW); irq_set_irq_type(c1, IRQ_TYPE_LEVEL_LOW);
irq_set_irq_type(s1, IRQ_TYPE_LEVEL_LOW); irq_set_irq_type(s1, IRQ_TYPE_LEVEL_LOW);

Some files were not shown because too many files have changed in this diff Show more