Merge 3.19-rc7 into usb-next
We want the USB fixes in here to make merges easier. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -1,60 +0,0 @@
|
|||||||
What: /sys/class/leds/dell::kbd_backlight/als_setting
|
|
||||||
Date: December 2014
|
|
||||||
KernelVersion: 3.19
|
|
||||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
|
||||||
Pali Rohár <pali.rohar@gmail.com>
|
|
||||||
Description:
|
|
||||||
This file allows to control the automatic keyboard
|
|
||||||
illumination mode on some systems that have an ambient
|
|
||||||
light sensor. Write 1 to this file to enable the auto
|
|
||||||
mode, 0 to disable it.
|
|
||||||
|
|
||||||
What: /sys/class/leds/dell::kbd_backlight/start_triggers
|
|
||||||
Date: December 2014
|
|
||||||
KernelVersion: 3.19
|
|
||||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
|
||||||
Pali Rohár <pali.rohar@gmail.com>
|
|
||||||
Description:
|
|
||||||
This file allows to control the input triggers that
|
|
||||||
turn on the keyboard backlight illumination that is
|
|
||||||
disabled because of inactivity.
|
|
||||||
Read the file to see the triggers available. The ones
|
|
||||||
enabled are preceded by '+', those disabled by '-'.
|
|
||||||
|
|
||||||
To enable a trigger, write its name preceded by '+' to
|
|
||||||
this file. To disable a trigger, write its name preceded
|
|
||||||
by '-' instead.
|
|
||||||
|
|
||||||
For example, to enable the keyboard as trigger run:
|
|
||||||
echo +keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers
|
|
||||||
To disable it:
|
|
||||||
echo -keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers
|
|
||||||
|
|
||||||
Note that not all the available triggers can be configured.
|
|
||||||
|
|
||||||
What: /sys/class/leds/dell::kbd_backlight/stop_timeout
|
|
||||||
Date: December 2014
|
|
||||||
KernelVersion: 3.19
|
|
||||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
|
||||||
Pali Rohár <pali.rohar@gmail.com>
|
|
||||||
Description:
|
|
||||||
This file allows to specify the interval after which the
|
|
||||||
keyboard illumination is disabled because of inactivity.
|
|
||||||
The timeouts are expressed in seconds, minutes, hours and
|
|
||||||
days, for which the symbols are 's', 'm', 'h' and 'd'
|
|
||||||
respectively.
|
|
||||||
|
|
||||||
To configure the timeout, write to this file a value along
|
|
||||||
with any the above units. If no unit is specified, the value
|
|
||||||
is assumed to be expressed in seconds.
|
|
||||||
|
|
||||||
For example, to set the timeout to 10 minutes run:
|
|
||||||
echo 10m > /sys/class/leds/dell::kbd_backlight/stop_timeout
|
|
||||||
|
|
||||||
Note that when this file is read, the returned value might be
|
|
||||||
expressed in a different unit than the one used when the timeout
|
|
||||||
was set.
|
|
||||||
|
|
||||||
Also note that only some timeouts are supported and that
|
|
||||||
some systems might fall back to a specific timeout in case
|
|
||||||
an invalid timeout is written to this file.
|
|
@@ -23,7 +23,7 @@ Required nodes:
|
|||||||
range of 0x200 bytes.
|
range of 0x200 bytes.
|
||||||
|
|
||||||
- syscon: the root node of the Integrator platforms must have a
|
- syscon: the root node of the Integrator platforms must have a
|
||||||
system controller node pointong to the control registers,
|
system controller node pointing to the control registers,
|
||||||
with the compatible string
|
with the compatible string
|
||||||
"arm,integrator-ap-syscon"
|
"arm,integrator-ap-syscon"
|
||||||
"arm,integrator-cp-syscon"
|
"arm,integrator-cp-syscon"
|
||||||
|
72
Documentation/devicetree/bindings/arm/fw-cfg.txt
Normal file
72
Documentation/devicetree/bindings/arm/fw-cfg.txt
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
* QEMU Firmware Configuration bindings for ARM
|
||||||
|
|
||||||
|
QEMU's arm-softmmu and aarch64-softmmu emulation / virtualization targets
|
||||||
|
provide the following Firmware Configuration interface on the "virt" machine
|
||||||
|
type:
|
||||||
|
|
||||||
|
- A write-only, 16-bit wide selector (or control) register,
|
||||||
|
- a read-write, 64-bit wide data register.
|
||||||
|
|
||||||
|
QEMU exposes the control and data register to ARM guests as memory mapped
|
||||||
|
registers; their location is communicated to the guest's UEFI firmware in the
|
||||||
|
DTB that QEMU places at the bottom of the guest's DRAM.
|
||||||
|
|
||||||
|
The guest writes a selector value (a key) to the selector register, and then
|
||||||
|
can read the corresponding data (produced by QEMU) via the data register. If
|
||||||
|
the selected entry is writable, the guest can rewrite it through the data
|
||||||
|
register.
|
||||||
|
|
||||||
|
The selector register takes keys in big endian byte order.
|
||||||
|
|
||||||
|
The data register allows accesses with 8, 16, 32 and 64-bit width (only at
|
||||||
|
offset 0 of the register). Accesses larger than a byte are interpreted as
|
||||||
|
arrays, bundled together only for better performance. The bytes constituting
|
||||||
|
such a word, in increasing address order, correspond to the bytes that would
|
||||||
|
have been transferred by byte-wide accesses in chronological order.
|
||||||
|
|
||||||
|
The interface allows guest firmware to download various parameters and blobs
|
||||||
|
that affect how the firmware works and what tables it installs for the guest
|
||||||
|
OS. For example, boot order of devices, ACPI tables, SMBIOS tables, kernel and
|
||||||
|
initrd images for direct kernel booting, virtual machine UUID, SMP information,
|
||||||
|
virtual NUMA topology, and so on.
|
||||||
|
|
||||||
|
The authoritative registry of the valid selector values and their meanings is
|
||||||
|
the QEMU source code; the structure of the data blobs corresponding to the
|
||||||
|
individual key values is also defined in the QEMU source code.
|
||||||
|
|
||||||
|
The presence of the registers can be verified by selecting the "signature" blob
|
||||||
|
with key 0x0000, and reading four bytes from the data register. The returned
|
||||||
|
signature is "QEMU".
|
||||||
|
|
||||||
|
The outermost protocol (involving the write / read sequences of the control and
|
||||||
|
data registers) is expected to be versioned, and/or described by feature bits.
|
||||||
|
The interface revision / feature bitmap can be retrieved with key 0x0001. The
|
||||||
|
blob to be read from the data register has size 4, and it is to be interpreted
|
||||||
|
as a uint32_t value in little endian byte order. The current value
|
||||||
|
(corresponding to the above outer protocol) is zero.
|
||||||
|
|
||||||
|
The guest kernel is not expected to use these registers (although it is
|
||||||
|
certainly allowed to); the device tree bindings are documented here because
|
||||||
|
this is where device tree bindings reside in general.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible: "qemu,fw-cfg-mmio".
|
||||||
|
|
||||||
|
- reg: the MMIO region used by the device.
|
||||||
|
* Bytes 0x0 to 0x7 cover the data register.
|
||||||
|
* Bytes 0x8 to 0x9 cover the selector register.
|
||||||
|
* Further registers may be appended to the region in case of future interface
|
||||||
|
revisions / feature bits.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#size-cells = <0x2>;
|
||||||
|
#address-cells = <0x2>;
|
||||||
|
|
||||||
|
fw-cfg@9020000 {
|
||||||
|
compatible = "qemu,fw-cfg-mmio";
|
||||||
|
reg = <0x0 0x9020000 0x0 0xa>;
|
||||||
|
};
|
||||||
|
};
|
@@ -19,7 +19,7 @@ type of the connections, they just map their existence. Specific properties
|
|||||||
may be described by specialized bindings depending on the type of connection.
|
may be described by specialized bindings depending on the type of connection.
|
||||||
|
|
||||||
To see how this binding applies to video pipelines, for example, see
|
To see how this binding applies to video pipelines, for example, see
|
||||||
Documentation/device-tree/bindings/media/video-interfaces.txt.
|
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||||
Here the ports describe data interfaces, and the links between them are
|
Here the ports describe data interfaces, and the links between them are
|
||||||
the connecting data buses. A single port with multiple connections can
|
the connecting data buses. A single port with multiple connections can
|
||||||
correspond to multiple devices being connected to the same physical bus.
|
correspond to multiple devices being connected to the same physical bus.
|
||||||
|
@@ -31,7 +31,7 @@ i2c0: i2c@fed40000 {
|
|||||||
compatible = "st,comms-ssc4-i2c";
|
compatible = "st,comms-ssc4-i2c";
|
||||||
reg = <0xfed40000 0x110>;
|
reg = <0xfed40000 0x110>;
|
||||||
interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&CLK_S_ICN_REG_0>;
|
clocks = <&clk_s_a0_ls CLK_ICN_REG>;
|
||||||
clock-names = "ssc";
|
clock-names = "ssc";
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -47,6 +47,7 @@ dallas,ds3232 Extremely Accurate I²C RTC with Integrated Crystal and SRAM
|
|||||||
dallas,ds4510 CPU Supervisor with Nonvolatile Memory and Programmable I/O
|
dallas,ds4510 CPU Supervisor with Nonvolatile Memory and Programmable I/O
|
||||||
dallas,ds75 Digital Thermometer and Thermostat
|
dallas,ds75 Digital Thermometer and Thermostat
|
||||||
dlg,da9053 DA9053: flexible system level PMIC with multicore support
|
dlg,da9053 DA9053: flexible system level PMIC with multicore support
|
||||||
|
dlg,da9063 DA9063: system PMIC for quad-core application processors
|
||||||
epson,rx8025 High-Stability. I2C-Bus INTERFACE REAL TIME CLOCK MODULE
|
epson,rx8025 High-Stability. I2C-Bus INTERFACE REAL TIME CLOCK MODULE
|
||||||
epson,rx8581 I2C-BUS INTERFACE REAL TIME CLOCK MODULE
|
epson,rx8581 I2C-BUS INTERFACE REAL TIME CLOCK MODULE
|
||||||
fsl,mag3110 MAG3110: Xtrinsic High Accuracy, 3D Magnetometer
|
fsl,mag3110 MAG3110: Xtrinsic High Accuracy, 3D Magnetometer
|
||||||
|
@@ -4,7 +4,8 @@ This file provides information, what the device node
|
|||||||
for the davinci_emac interface contains.
|
for the davinci_emac interface contains.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: "ti,davinci-dm6467-emac" or "ti,am3517-emac"
|
- compatible: "ti,davinci-dm6467-emac", "ti,am3517-emac" or
|
||||||
|
"ti,dm816-emac"
|
||||||
- reg: Offset and length of the register set for the device
|
- reg: Offset and length of the register set for the device
|
||||||
- ti,davinci-ctrl-reg-offset: offset to control register
|
- ti,davinci-ctrl-reg-offset: offset to control register
|
||||||
- ti,davinci-ctrl-mod-reg-offset: offset to control module register
|
- ti,davinci-ctrl-mod-reg-offset: offset to control module register
|
||||||
|
@@ -9,7 +9,6 @@ ad Avionic Design GmbH
|
|||||||
adapteva Adapteva, Inc.
|
adapteva Adapteva, Inc.
|
||||||
adi Analog Devices, Inc.
|
adi Analog Devices, Inc.
|
||||||
aeroflexgaisler Aeroflex Gaisler AB
|
aeroflexgaisler Aeroflex Gaisler AB
|
||||||
ak Asahi Kasei Corp.
|
|
||||||
allwinner Allwinner Technology Co., Ltd.
|
allwinner Allwinner Technology Co., Ltd.
|
||||||
altr Altera Corp.
|
altr Altera Corp.
|
||||||
amcc Applied Micro Circuits Corporation (APM, formally AMCC)
|
amcc Applied Micro Circuits Corporation (APM, formally AMCC)
|
||||||
@@ -20,6 +19,7 @@ amstaos AMS-Taos Inc.
|
|||||||
apm Applied Micro Circuits Corporation (APM)
|
apm Applied Micro Circuits Corporation (APM)
|
||||||
arm ARM Ltd.
|
arm ARM Ltd.
|
||||||
armadeus ARMadeus Systems SARL
|
armadeus ARMadeus Systems SARL
|
||||||
|
asahi-kasei Asahi Kasei Corp.
|
||||||
atmel Atmel Corporation
|
atmel Atmel Corporation
|
||||||
auo AU Optronics Corporation
|
auo AU Optronics Corporation
|
||||||
avago Avago Technologies
|
avago Avago Technologies
|
||||||
@@ -127,6 +127,7 @@ pixcir PIXCIR MICROELECTRONICS Co., Ltd
|
|||||||
powervr PowerVR (deprecated, use img)
|
powervr PowerVR (deprecated, use img)
|
||||||
qca Qualcomm Atheros, Inc.
|
qca Qualcomm Atheros, Inc.
|
||||||
qcom Qualcomm Technologies, Inc
|
qcom Qualcomm Technologies, Inc
|
||||||
|
qemu QEMU, a generic and open source machine emulator and virtualizer
|
||||||
qnap QNAP Systems, Inc.
|
qnap QNAP Systems, Inc.
|
||||||
radxa Radxa
|
radxa Radxa
|
||||||
raidsonic RaidSonic Technology GmbH
|
raidsonic RaidSonic Technology GmbH
|
||||||
@@ -168,6 +169,7 @@ usi Universal Scientific Industrial Co., Ltd.
|
|||||||
v3 V3 Semiconductor
|
v3 V3 Semiconductor
|
||||||
variscite Variscite Ltd.
|
variscite Variscite Ltd.
|
||||||
via VIA Technologies, Inc.
|
via VIA Technologies, Inc.
|
||||||
|
virtio Virtual I/O Device Specification, developed by the OASIS consortium
|
||||||
voipac Voipac Technologies s.r.o.
|
voipac Voipac Technologies s.r.o.
|
||||||
winbond Winbond Electronics corp.
|
winbond Winbond Electronics corp.
|
||||||
wlf Wolfson Microelectronics
|
wlf Wolfson Microelectronics
|
||||||
|
@@ -1277,6 +1277,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
i8042.notimeout [HW] Ignore timeout condition signalled by controller
|
i8042.notimeout [HW] Ignore timeout condition signalled by controller
|
||||||
i8042.reset [HW] Reset the controller during init and cleanup
|
i8042.reset [HW] Reset the controller during init and cleanup
|
||||||
i8042.unlock [HW] Unlock (ignore) the keylock
|
i8042.unlock [HW] Unlock (ignore) the keylock
|
||||||
|
i8042.kbdreset [HW] Reset device connected to KBD port
|
||||||
|
|
||||||
i810= [HW,DRM]
|
i810= [HW,DRM]
|
||||||
|
|
||||||
|
109
MAINTAINERS
109
MAINTAINERS
@@ -696,7 +696,7 @@ L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
|||||||
W: http://blackfin.uclinux.org/
|
W: http://blackfin.uclinux.org/
|
||||||
S: Supported
|
S: Supported
|
||||||
F: sound/soc/blackfin/*
|
F: sound/soc/blackfin/*
|
||||||
|
|
||||||
ANALOG DEVICES INC IIO DRIVERS
|
ANALOG DEVICES INC IIO DRIVERS
|
||||||
M: Lars-Peter Clausen <lars@metafoo.de>
|
M: Lars-Peter Clausen <lars@metafoo.de>
|
||||||
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
@@ -708,6 +708,16 @@ X: drivers/iio/*/adjd*
|
|||||||
F: drivers/staging/iio/*/ad*
|
F: drivers/staging/iio/*/ad*
|
||||||
F: staging/iio/trigger/iio-trig-bfin-timer.c
|
F: staging/iio/trigger/iio-trig-bfin-timer.c
|
||||||
|
|
||||||
|
ANDROID DRIVERS
|
||||||
|
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
M: Arve Hj<48>nnev<65>g <arve@android.com>
|
||||||
|
M: Riley Andrews <riandrews@android.com>
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/gregkh/staging.git
|
||||||
|
L: devel@driverdev.osuosl.org
|
||||||
|
S: Supported
|
||||||
|
F: drivers/android/
|
||||||
|
F: drivers/staging/android/
|
||||||
|
|
||||||
AOA (Apple Onboard Audio) ALSA DRIVER
|
AOA (Apple Onboard Audio) ALSA DRIVER
|
||||||
M: Johannes Berg <johannes@sipsolutions.net>
|
M: Johannes Berg <johannes@sipsolutions.net>
|
||||||
L: linuxppc-dev@lists.ozlabs.org
|
L: linuxppc-dev@lists.ozlabs.org
|
||||||
@@ -754,13 +764,6 @@ L: linux-media@vger.kernel.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/media/i2c/aptina-pll.*
|
F: drivers/media/i2c/aptina-pll.*
|
||||||
|
|
||||||
ARASAN COMPACT FLASH PATA CONTROLLER
|
|
||||||
M: Viresh Kumar <viresh.linux@gmail.com>
|
|
||||||
L: linux-ide@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
F: include/linux/pata_arasan_cf_data.h
|
|
||||||
F: drivers/ata/pata_arasan_cf.c
|
|
||||||
|
|
||||||
ARC FRAMEBUFFER DRIVER
|
ARC FRAMEBUFFER DRIVER
|
||||||
M: Jaya Kumar <jayalk@intworks.biz>
|
M: Jaya Kumar <jayalk@intworks.biz>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -2346,7 +2349,8 @@ CAN NETWORK LAYER
|
|||||||
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||||
L: linux-can@vger.kernel.org
|
L: linux-can@vger.kernel.org
|
||||||
W: http://gitorious.org/linux-can
|
W: http://gitorious.org/linux-can
|
||||||
T: git git://gitorious.org/linux-can/linux-can-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/networking/can.txt
|
F: Documentation/networking/can.txt
|
||||||
F: net/can/
|
F: net/can/
|
||||||
@@ -2361,7 +2365,8 @@ M: Wolfgang Grandegger <wg@grandegger.com>
|
|||||||
M: Marc Kleine-Budde <mkl@pengutronix.de>
|
M: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||||
L: linux-can@vger.kernel.org
|
L: linux-can@vger.kernel.org
|
||||||
W: http://gitorious.org/linux-can
|
W: http://gitorious.org/linux-can
|
||||||
T: git git://gitorious.org/linux-can/linux-can-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/can/
|
F: drivers/net/can/
|
||||||
F: include/linux/can/dev.h
|
F: include/linux/can/dev.h
|
||||||
@@ -4755,14 +4760,14 @@ S: Supported
|
|||||||
F: drivers/net/ethernet/ibm/ibmveth.*
|
F: drivers/net/ethernet/ibm/ibmveth.*
|
||||||
|
|
||||||
IBM Power Virtual SCSI Device Drivers
|
IBM Power Virtual SCSI Device Drivers
|
||||||
M: Nathan Fontenot <nfont@linux.vnet.ibm.com>
|
M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/scsi/ibmvscsi/ibmvscsi*
|
F: drivers/scsi/ibmvscsi/ibmvscsi*
|
||||||
F: drivers/scsi/ibmvscsi/viosrp.h
|
F: drivers/scsi/ibmvscsi/viosrp.h
|
||||||
|
|
||||||
IBM Power Virtual FC Device Drivers
|
IBM Power Virtual FC Device Drivers
|
||||||
M: Brian King <brking@linux.vnet.ibm.com>
|
M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/scsi/ibmvscsi/ibmvfc*
|
F: drivers/scsi/ibmvscsi/ibmvfc*
|
||||||
@@ -4930,7 +4935,6 @@ F: include/uapi/linux/inotify.h
|
|||||||
|
|
||||||
INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS
|
INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS
|
||||||
M: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
M: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||||
M: Dmitry Torokhov <dtor@mail.ru>
|
|
||||||
L: linux-input@vger.kernel.org
|
L: linux-input@vger.kernel.org
|
||||||
Q: http://patchwork.kernel.org/project/linux-input/list/
|
Q: http://patchwork.kernel.org/project/linux-input/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
|
||||||
@@ -4952,7 +4956,6 @@ K: \b(ABS|SYN)_MT_
|
|||||||
INTEL C600 SERIES SAS CONTROLLER DRIVER
|
INTEL C600 SERIES SAS CONTROLLER DRIVER
|
||||||
M: Intel SCU Linux support <intel-linux-scu@intel.com>
|
M: Intel SCU Linux support <intel-linux-scu@intel.com>
|
||||||
M: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
|
M: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
|
||||||
M: Dave Jiang <dave.jiang@intel.com>
|
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
T: git git://git.code.sf.net/p/intel-sas/isci
|
T: git git://git.code.sf.net/p/intel-sas/isci
|
||||||
S: Supported
|
S: Supported
|
||||||
@@ -5703,6 +5706,49 @@ F: drivers/lguest/
|
|||||||
F: include/linux/lguest*.h
|
F: include/linux/lguest*.h
|
||||||
F: tools/lguest/
|
F: tools/lguest/
|
||||||
|
|
||||||
|
LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)
|
||||||
|
M: Tejun Heo <tj@kernel.org>
|
||||||
|
L: linux-ide@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/ata/
|
||||||
|
F: include/linux/ata.h
|
||||||
|
F: include/linux/libata.h
|
||||||
|
|
||||||
|
LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
|
||||||
|
M: Viresh Kumar <viresh.linux@gmail.com>
|
||||||
|
L: linux-ide@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||||
|
S: Maintained
|
||||||
|
F: include/linux/pata_arasan_cf_data.h
|
||||||
|
F: drivers/ata/pata_arasan_cf.c
|
||||||
|
|
||||||
|
LIBATA PATA DRIVERS
|
||||||
|
M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
|
||||||
|
M: Tejun Heo <tj@kernel.org>
|
||||||
|
L: linux-ide@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/ata/pata_*.c
|
||||||
|
F: drivers/ata/ata_generic.c
|
||||||
|
|
||||||
|
LIBATA SATA AHCI PLATFORM devices support
|
||||||
|
M: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
M: Tejun Heo <tj@kernel.org>
|
||||||
|
L: linux-ide@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/ata/ahci_platform.c
|
||||||
|
F: drivers/ata/libahci_platform.c
|
||||||
|
F: include/linux/ahci_platform.h
|
||||||
|
|
||||||
|
LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
|
||||||
|
M: Mikael Pettersson <mikpelinux@gmail.com>
|
||||||
|
L: linux-ide@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/ata/sata_promise.*
|
||||||
|
|
||||||
LIBLOCKDEP
|
LIBLOCKDEP
|
||||||
M: Sasha Levin <sasha.levin@oracle.com>
|
M: Sasha Levin <sasha.levin@oracle.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -6987,14 +7033,12 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE
|
|||||||
M: Grant Likely <grant.likely@linaro.org>
|
M: Grant Likely <grant.likely@linaro.org>
|
||||||
M: Rob Herring <robh+dt@kernel.org>
|
M: Rob Herring <robh+dt@kernel.org>
|
||||||
L: devicetree@vger.kernel.org
|
L: devicetree@vger.kernel.org
|
||||||
W: http://fdt.secretlab.ca
|
W: http://www.devicetree.org/
|
||||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/of/
|
F: drivers/of/
|
||||||
F: include/linux/of*.h
|
F: include/linux/of*.h
|
||||||
F: scripts/dtc/
|
F: scripts/dtc/
|
||||||
K: of_get_property
|
|
||||||
K: of_match_table
|
|
||||||
|
|
||||||
OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS
|
OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS
|
||||||
M: Rob Herring <robh+dt@kernel.org>
|
M: Rob Herring <robh+dt@kernel.org>
|
||||||
@@ -7239,7 +7283,7 @@ S: Maintained
|
|||||||
F: drivers/pci/host/*layerscape*
|
F: drivers/pci/host/*layerscape*
|
||||||
|
|
||||||
PCI DRIVER FOR IMX6
|
PCI DRIVER FOR IMX6
|
||||||
M: Richard Zhu <r65037@freescale.com>
|
M: Richard Zhu <Richard.Zhu@freescale.com>
|
||||||
M: Lucas Stach <l.stach@pengutronix.de>
|
M: Lucas Stach <l.stach@pengutronix.de>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
@@ -7409,6 +7453,7 @@ F: drivers/crypto/picoxcell*
|
|||||||
PIN CONTROL SUBSYSTEM
|
PIN CONTROL SUBSYSTEM
|
||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/pinctrl/
|
F: drivers/pinctrl/
|
||||||
F: include/linux/pinctrl/
|
F: include/linux/pinctrl/
|
||||||
@@ -7576,12 +7621,6 @@ W: http://wireless.kernel.org/en/users/Drivers/p54
|
|||||||
S: Obsolete
|
S: Obsolete
|
||||||
F: drivers/net/wireless/prism54/
|
F: drivers/net/wireless/prism54/
|
||||||
|
|
||||||
PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER
|
|
||||||
M: Mikael Pettersson <mikpelinux@gmail.com>
|
|
||||||
L: linux-ide@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/ata/sata_promise.*
|
|
||||||
|
|
||||||
PS3 NETWORK SUPPORT
|
PS3 NETWORK SUPPORT
|
||||||
M: Geoff Levand <geoff@infradead.org>
|
M: Geoff Levand <geoff@infradead.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
@@ -8555,25 +8594,6 @@ S: Maintained
|
|||||||
F: drivers/misc/phantom.c
|
F: drivers/misc/phantom.c
|
||||||
F: include/uapi/linux/phantom.h
|
F: include/uapi/linux/phantom.h
|
||||||
|
|
||||||
SERIAL ATA (SATA) SUBSYSTEM
|
|
||||||
M: Tejun Heo <tj@kernel.org>
|
|
||||||
L: linux-ide@vger.kernel.org
|
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
|
||||||
S: Supported
|
|
||||||
F: drivers/ata/
|
|
||||||
F: include/linux/ata.h
|
|
||||||
F: include/linux/libata.h
|
|
||||||
|
|
||||||
SERIAL ATA AHCI PLATFORM devices support
|
|
||||||
M: Hans de Goede <hdegoede@redhat.com>
|
|
||||||
M: Tejun Heo <tj@kernel.org>
|
|
||||||
L: linux-ide@vger.kernel.org
|
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
|
||||||
S: Supported
|
|
||||||
F: drivers/ata/ahci_platform.c
|
|
||||||
F: drivers/ata/libahci_platform.c
|
|
||||||
F: include/linux/ahci_platform.h
|
|
||||||
|
|
||||||
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
|
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
|
||||||
M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
|
M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
@@ -10156,6 +10176,7 @@ USERSPACE I/O (UIO)
|
|||||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||||
F: Documentation/DocBook/uio-howto.tmpl
|
F: Documentation/DocBook/uio-howto.tmpl
|
||||||
F: drivers/uio/
|
F: drivers/uio/
|
||||||
F: include/linux/uio*.h
|
F: include/linux/uio*.h
|
||||||
|
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc7
|
||||||
NAME = Diseased Newt
|
NAME = Diseased Newt
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@@ -285,8 +285,12 @@ pcibios_claim_one_bus(struct pci_bus *b)
|
|||||||
if (r->parent || !r->start || !r->flags)
|
if (r->parent || !r->start || !r->flags)
|
||||||
continue;
|
continue;
|
||||||
if (pci_has_flag(PCI_PROBE_ONLY) ||
|
if (pci_has_flag(PCI_PROBE_ONLY) ||
|
||||||
(r->flags & IORESOURCE_PCI_FIXED))
|
(r->flags & IORESOURCE_PCI_FIXED)) {
|
||||||
pci_claim_resource(dev, i);
|
if (pci_claim_resource(dev, i) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_claim_bridge_resource(dev, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -156,6 +156,8 @@ retry:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -161,6 +161,8 @@ good_area:
|
|||||||
|
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
|
|
||||||
|
@@ -1257,6 +1257,8 @@
|
|||||||
tx-fifo-resize;
|
tx-fifo-resize;
|
||||||
maximum-speed = "super-speed";
|
maximum-speed = "super-speed";
|
||||||
dr_mode = "otg";
|
dr_mode = "otg";
|
||||||
|
snps,dis_u3_susphy_quirk;
|
||||||
|
snps,dis_u2_susphy_quirk;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1278,6 +1280,8 @@
|
|||||||
tx-fifo-resize;
|
tx-fifo-resize;
|
||||||
maximum-speed = "high-speed";
|
maximum-speed = "high-speed";
|
||||||
dr_mode = "otg";
|
dr_mode = "otg";
|
||||||
|
snps,dis_u3_susphy_quirk;
|
||||||
|
snps,dis_u2_susphy_quirk;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1299,6 +1303,8 @@
|
|||||||
tx-fifo-resize;
|
tx-fifo-resize;
|
||||||
maximum-speed = "high-speed";
|
maximum-speed = "high-speed";
|
||||||
dr_mode = "otg";
|
dr_mode = "otg";
|
||||||
|
snps,dis_u3_susphy_quirk;
|
||||||
|
snps,dis_u2_susphy_quirk;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -369,7 +369,7 @@
|
|||||||
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
reg = <0x53fa0000 0x4000>;
|
reg = <0x53fa0000 0x4000>;
|
||||||
clocks = <&clks 106>, <&clks 36>;
|
clocks = <&clks 106>, <&clks 52>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
interrupts = <36>;
|
interrupts = <36>;
|
||||||
};
|
};
|
||||||
@@ -388,7 +388,7 @@
|
|||||||
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
reg = <0x53fa8000 0x4000>;
|
reg = <0x53fa8000 0x4000>;
|
||||||
clocks = <&clks 107>, <&clks 36>;
|
clocks = <&clks 107>, <&clks 52>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
interrupts = <41>;
|
interrupts = <41>;
|
||||||
};
|
};
|
||||||
@@ -429,7 +429,7 @@
|
|||||||
pwm4: pwm@53fc8000 {
|
pwm4: pwm@53fc8000 {
|
||||||
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
||||||
reg = <0x53fc8000 0x4000>;
|
reg = <0x53fc8000 0x4000>;
|
||||||
clocks = <&clks 108>, <&clks 36>;
|
clocks = <&clks 108>, <&clks 52>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
interrupts = <42>;
|
interrupts = <42>;
|
||||||
};
|
};
|
||||||
@@ -476,7 +476,7 @@
|
|||||||
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
reg = <0x53fe0000 0x4000>;
|
reg = <0x53fe0000 0x4000>;
|
||||||
clocks = <&clks 105>, <&clks 36>;
|
clocks = <&clks 105>, <&clks 52>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
interrupts = <26>;
|
interrupts = <26>;
|
||||||
};
|
};
|
||||||
|
@@ -166,12 +166,12 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
ethphy1: ethernet-phy@0 {
|
ethphy1: ethernet-phy@1 {
|
||||||
reg = <0>;
|
reg = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ethphy2: ethernet-phy@1 {
|
ethphy2: ethernet-phy@2 {
|
||||||
reg = <1>;
|
reg = <2>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@@ -17,14 +17,6 @@
|
|||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
ethernet0 = &emac;
|
ethernet0 = &emac;
|
||||||
serial0 = &uart0;
|
|
||||||
serial1 = &uart1;
|
|
||||||
serial2 = &uart2;
|
|
||||||
serial3 = &uart3;
|
|
||||||
serial4 = &uart4;
|
|
||||||
serial5 = &uart5;
|
|
||||||
serial6 = &uart6;
|
|
||||||
serial7 = &uart7;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
@@ -39,6 +31,14 @@
|
|||||||
<&ahb_gates 44>;
|
<&ahb_gates 44>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
framebuffer@1 {
|
||||||
|
compatible = "allwinner,simple-framebuffer", "simple-framebuffer";
|
||||||
|
allwinner,pipeline = "de_fe0-de_be0-lcd0-hdmi";
|
||||||
|
clocks = <&pll5 1>, <&ahb_gates 36>, <&ahb_gates 43>,
|
||||||
|
<&ahb_gates 44>, <&ahb_gates 46>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
@@ -438,8 +438,8 @@
|
|||||||
reg-names = "phy_ctrl", "pmu1", "pmu2";
|
reg-names = "phy_ctrl", "pmu1", "pmu2";
|
||||||
clocks = <&usb_clk 8>;
|
clocks = <&usb_clk 8>;
|
||||||
clock-names = "usb_phy";
|
clock-names = "usb_phy";
|
||||||
resets = <&usb_clk 1>, <&usb_clk 2>;
|
resets = <&usb_clk 0>, <&usb_clk 1>, <&usb_clk 2>;
|
||||||
reset-names = "usb1_reset", "usb2_reset";
|
reset-names = "usb0_reset", "usb1_reset", "usb2_reset";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -55,6 +55,12 @@
|
|||||||
model = "Olimex A10s-Olinuxino Micro";
|
model = "Olimex A10s-Olinuxino Micro";
|
||||||
compatible = "olimex,a10s-olinuxino-micro", "allwinner,sun5i-a10s";
|
compatible = "olimex,a10s-olinuxino-micro", "allwinner,sun5i-a10s";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
serial1 = &uart2;
|
||||||
|
serial2 = &uart3;
|
||||||
|
};
|
||||||
|
|
||||||
soc@01c00000 {
|
soc@01c00000 {
|
||||||
emac: ethernet@01c0b000 {
|
emac: ethernet@01c0b000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -18,10 +18,6 @@
|
|||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
ethernet0 = &emac;
|
ethernet0 = &emac;
|
||||||
serial0 = &uart0;
|
|
||||||
serial1 = &uart1;
|
|
||||||
serial2 = &uart2;
|
|
||||||
serial3 = &uart3;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
@@ -390,8 +386,8 @@
|
|||||||
reg-names = "phy_ctrl", "pmu1";
|
reg-names = "phy_ctrl", "pmu1";
|
||||||
clocks = <&usb_clk 8>;
|
clocks = <&usb_clk 8>;
|
||||||
clock-names = "usb_phy";
|
clock-names = "usb_phy";
|
||||||
resets = <&usb_clk 1>;
|
resets = <&usb_clk 0>, <&usb_clk 1>;
|
||||||
reset-names = "usb1_reset";
|
reset-names = "usb0_reset", "usb1_reset";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -53,6 +53,10 @@
|
|||||||
model = "HSG H702";
|
model = "HSG H702";
|
||||||
compatible = "hsg,h702", "allwinner,sun5i-a13";
|
compatible = "hsg,h702", "allwinner,sun5i-a13";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart1;
|
||||||
|
};
|
||||||
|
|
||||||
soc@01c00000 {
|
soc@01c00000 {
|
||||||
mmc0: mmc@01c0f000 {
|
mmc0: mmc@01c0f000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -54,6 +54,10 @@
|
|||||||
model = "Olimex A13-Olinuxino Micro";
|
model = "Olimex A13-Olinuxino Micro";
|
||||||
compatible = "olimex,a13-olinuxino-micro", "allwinner,sun5i-a13";
|
compatible = "olimex,a13-olinuxino-micro", "allwinner,sun5i-a13";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart1;
|
||||||
|
};
|
||||||
|
|
||||||
soc@01c00000 {
|
soc@01c00000 {
|
||||||
mmc0: mmc@01c0f000 {
|
mmc0: mmc@01c0f000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -55,6 +55,10 @@
|
|||||||
model = "Olimex A13-Olinuxino";
|
model = "Olimex A13-Olinuxino";
|
||||||
compatible = "olimex,a13-olinuxino", "allwinner,sun5i-a13";
|
compatible = "olimex,a13-olinuxino", "allwinner,sun5i-a13";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart1;
|
||||||
|
};
|
||||||
|
|
||||||
soc@01c00000 {
|
soc@01c00000 {
|
||||||
mmc0: mmc@01c0f000 {
|
mmc0: mmc@01c0f000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -16,11 +16,6 @@
|
|||||||
/ {
|
/ {
|
||||||
interrupt-parent = <&intc>;
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
aliases {
|
|
||||||
serial0 = &uart1;
|
|
||||||
serial1 = &uart3;
|
|
||||||
};
|
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
@@ -349,8 +344,8 @@
|
|||||||
reg-names = "phy_ctrl", "pmu1";
|
reg-names = "phy_ctrl", "pmu1";
|
||||||
clocks = <&usb_clk 8>;
|
clocks = <&usb_clk 8>;
|
||||||
clock-names = "usb_phy";
|
clock-names = "usb_phy";
|
||||||
resets = <&usb_clk 1>;
|
resets = <&usb_clk 0>, <&usb_clk 1>;
|
||||||
reset-names = "usb1_reset";
|
reset-names = "usb0_reset", "usb1_reset";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -53,12 +53,6 @@
|
|||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial0 = &uart0;
|
|
||||||
serial1 = &uart1;
|
|
||||||
serial2 = &uart2;
|
|
||||||
serial3 = &uart3;
|
|
||||||
serial4 = &uart4;
|
|
||||||
serial5 = &uart5;
|
|
||||||
ethernet0 = &gmac;
|
ethernet0 = &gmac;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -55,6 +55,12 @@
|
|||||||
model = "LeMaker Banana Pi";
|
model = "LeMaker Banana Pi";
|
||||||
compatible = "lemaker,bananapi", "allwinner,sun7i-a20";
|
compatible = "lemaker,bananapi", "allwinner,sun7i-a20";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
serial1 = &uart3;
|
||||||
|
serial2 = &uart7;
|
||||||
|
};
|
||||||
|
|
||||||
soc@01c00000 {
|
soc@01c00000 {
|
||||||
spi0: spi@01c05000 {
|
spi0: spi@01c05000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -19,6 +19,14 @@
|
|||||||
model = "Merrii A20 Hummingbird";
|
model = "Merrii A20 Hummingbird";
|
||||||
compatible = "merrii,a20-hummingbird", "allwinner,sun7i-a20";
|
compatible = "merrii,a20-hummingbird", "allwinner,sun7i-a20";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
serial1 = &uart2;
|
||||||
|
serial2 = &uart3;
|
||||||
|
serial3 = &uart4;
|
||||||
|
serial4 = &uart5;
|
||||||
|
};
|
||||||
|
|
||||||
soc@01c00000 {
|
soc@01c00000 {
|
||||||
mmc0: mmc@01c0f000 {
|
mmc0: mmc@01c0f000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@@ -20,6 +20,9 @@
|
|||||||
compatible = "olimex,a20-olinuxino-micro", "allwinner,sun7i-a20";
|
compatible = "olimex,a20-olinuxino-micro", "allwinner,sun7i-a20";
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
serial1 = &uart6;
|
||||||
|
serial2 = &uart7;
|
||||||
spi0 = &spi1;
|
spi0 = &spi1;
|
||||||
spi1 = &spi2;
|
spi1 = &spi2;
|
||||||
};
|
};
|
||||||
|
@@ -54,14 +54,6 @@
|
|||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
ethernet0 = &gmac;
|
ethernet0 = &gmac;
|
||||||
serial0 = &uart0;
|
|
||||||
serial1 = &uart1;
|
|
||||||
serial2 = &uart2;
|
|
||||||
serial3 = &uart3;
|
|
||||||
serial4 = &uart4;
|
|
||||||
serial5 = &uart5;
|
|
||||||
serial6 = &uart6;
|
|
||||||
serial7 = &uart7;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
|
@@ -55,6 +55,10 @@
|
|||||||
model = "Ippo Q8H Dual Core Tablet (v5)";
|
model = "Ippo Q8H Dual Core Tablet (v5)";
|
||||||
compatible = "ippo,q8h-v5", "allwinner,sun8i-a23";
|
compatible = "ippo,q8h-v5", "allwinner,sun8i-a23";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &r_uart;
|
||||||
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
bootargs = "earlyprintk console=ttyS0,115200";
|
bootargs = "earlyprintk console=ttyS0,115200";
|
||||||
};
|
};
|
||||||
|
@@ -52,15 +52,6 @@
|
|||||||
/ {
|
/ {
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
|
|
||||||
aliases {
|
|
||||||
serial0 = &uart0;
|
|
||||||
serial1 = &uart1;
|
|
||||||
serial2 = &uart2;
|
|
||||||
serial3 = &uart3;
|
|
||||||
serial4 = &uart4;
|
|
||||||
serial5 = &r_uart;
|
|
||||||
};
|
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
@@ -54,6 +54,11 @@
|
|||||||
model = "Merrii A80 Optimus Board";
|
model = "Merrii A80 Optimus Board";
|
||||||
compatible = "merrii,a80-optimus", "allwinner,sun9i-a80";
|
compatible = "merrii,a80-optimus", "allwinner,sun9i-a80";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
serial0 = &uart0;
|
||||||
|
serial1 = &uart4;
|
||||||
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
bootargs = "earlyprintk console=ttyS0,115200";
|
bootargs = "earlyprintk console=ttyS0,115200";
|
||||||
};
|
};
|
||||||
|
@@ -52,16 +52,6 @@
|
|||||||
/ {
|
/ {
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
|
|
||||||
aliases {
|
|
||||||
serial0 = &uart0;
|
|
||||||
serial1 = &uart1;
|
|
||||||
serial2 = &uart2;
|
|
||||||
serial3 = &uart3;
|
|
||||||
serial4 = &uart4;
|
|
||||||
serial5 = &uart5;
|
|
||||||
serial6 = &r_uart;
|
|
||||||
};
|
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
@@ -406,7 +406,7 @@
|
|||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
|
|
||||||
magnetometer@c {
|
magnetometer@c {
|
||||||
compatible = "ak,ak8975";
|
compatible = "asahi-kasei,ak8975";
|
||||||
reg = <0xc>;
|
reg = <0xc>;
|
||||||
interrupt-parent = <&gpio>;
|
interrupt-parent = <&gpio>;
|
||||||
interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
@@ -38,6 +38,16 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
|
|||||||
vcpu->arch.hcr = HCR_GUEST_MASK;
|
vcpu->arch.hcr = HCR_GUEST_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long vcpu_get_hcr(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return vcpu->arch.hcr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void vcpu_set_hcr(struct kvm_vcpu *vcpu, unsigned long hcr)
|
||||||
|
{
|
||||||
|
vcpu->arch.hcr = hcr;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu)
|
static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -125,9 +125,6 @@ struct kvm_vcpu_arch {
|
|||||||
* Anything that is not used directly from assembly code goes
|
* Anything that is not used directly from assembly code goes
|
||||||
* here.
|
* here.
|
||||||
*/
|
*/
|
||||||
/* dcache set/way operation pending */
|
|
||||||
int last_pcpu;
|
|
||||||
cpumask_t require_dcache_flush;
|
|
||||||
|
|
||||||
/* Don't run the guest on this vcpu */
|
/* Don't run the guest on this vcpu */
|
||||||
bool pause;
|
bool pause;
|
||||||
|
@@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <linux/highmem.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
|
|
||||||
@@ -161,13 +162,10 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu)
|
|||||||
return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101;
|
return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva,
|
static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn,
|
||||||
unsigned long size,
|
unsigned long size,
|
||||||
bool ipa_uncached)
|
bool ipa_uncached)
|
||||||
{
|
{
|
||||||
if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached)
|
|
||||||
kvm_flush_dcache_to_poc((void *)hva, size);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are going to insert an instruction page and the icache is
|
* If we are going to insert an instruction page and the icache is
|
||||||
* either VIPT or PIPT, there is a potential problem where the host
|
* either VIPT or PIPT, there is a potential problem where the host
|
||||||
@@ -179,18 +177,77 @@ static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva,
|
|||||||
*
|
*
|
||||||
* VIVT caches are tagged using both the ASID and the VMID and doesn't
|
* VIVT caches are tagged using both the ASID and the VMID and doesn't
|
||||||
* need any kind of flushing (DDI 0406C.b - Page B3-1392).
|
* need any kind of flushing (DDI 0406C.b - Page B3-1392).
|
||||||
|
*
|
||||||
|
* We need to do this through a kernel mapping (using the
|
||||||
|
* user-space mapping has proved to be the wrong
|
||||||
|
* solution). For that, we need to kmap one page at a time,
|
||||||
|
* and iterate over the range.
|
||||||
*/
|
*/
|
||||||
if (icache_is_pipt()) {
|
|
||||||
__cpuc_coherent_user_range(hva, hva + size);
|
bool need_flush = !vcpu_has_cache_enabled(vcpu) || ipa_uncached;
|
||||||
} else if (!icache_is_vivt_asid_tagged()) {
|
|
||||||
|
VM_BUG_ON(size & PAGE_MASK);
|
||||||
|
|
||||||
|
if (!need_flush && !icache_is_pipt())
|
||||||
|
goto vipt_cache;
|
||||||
|
|
||||||
|
while (size) {
|
||||||
|
void *va = kmap_atomic_pfn(pfn);
|
||||||
|
|
||||||
|
if (need_flush)
|
||||||
|
kvm_flush_dcache_to_poc(va, PAGE_SIZE);
|
||||||
|
|
||||||
|
if (icache_is_pipt())
|
||||||
|
__cpuc_coherent_user_range((unsigned long)va,
|
||||||
|
(unsigned long)va + PAGE_SIZE);
|
||||||
|
|
||||||
|
size -= PAGE_SIZE;
|
||||||
|
pfn++;
|
||||||
|
|
||||||
|
kunmap_atomic(va);
|
||||||
|
}
|
||||||
|
|
||||||
|
vipt_cache:
|
||||||
|
if (!icache_is_pipt() && !icache_is_vivt_asid_tagged()) {
|
||||||
/* any kind of VIPT cache */
|
/* any kind of VIPT cache */
|
||||||
__flush_icache_all();
|
__flush_icache_all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_flush_dcache_pte(pte_t pte)
|
||||||
|
{
|
||||||
|
void *va = kmap_atomic(pte_page(pte));
|
||||||
|
|
||||||
|
kvm_flush_dcache_to_poc(va, PAGE_SIZE);
|
||||||
|
|
||||||
|
kunmap_atomic(va);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_flush_dcache_pmd(pmd_t pmd)
|
||||||
|
{
|
||||||
|
unsigned long size = PMD_SIZE;
|
||||||
|
pfn_t pfn = pmd_pfn(pmd);
|
||||||
|
|
||||||
|
while (size) {
|
||||||
|
void *va = kmap_atomic_pfn(pfn);
|
||||||
|
|
||||||
|
kvm_flush_dcache_to_poc(va, PAGE_SIZE);
|
||||||
|
|
||||||
|
pfn++;
|
||||||
|
size -= PAGE_SIZE;
|
||||||
|
|
||||||
|
kunmap_atomic(va);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_flush_dcache_pud(pud_t pud)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#define kvm_virt_to_phys(x) virt_to_idmap((unsigned long)(x))
|
#define kvm_virt_to_phys(x) virt_to_idmap((unsigned long)(x))
|
||||||
|
|
||||||
void stage2_flush_vm(struct kvm *kvm);
|
void kvm_set_way_flush(struct kvm_vcpu *vcpu);
|
||||||
|
void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled);
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
|
@@ -253,21 +253,22 @@
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro restore_user_regs, fast = 0, offset = 0
|
.macro restore_user_regs, fast = 0, offset = 0
|
||||||
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
|
mov r2, sp
|
||||||
ldr lr, [sp, #\offset + S_PC]! @ get pc
|
ldr r1, [r2, #\offset + S_PSR] @ get calling cpsr
|
||||||
|
ldr lr, [r2, #\offset + S_PC]! @ get pc
|
||||||
msr spsr_cxsf, r1 @ save in spsr_svc
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
||||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
|
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
|
||||||
@ We must avoid clrex due to Cortex-A15 erratum #830321
|
@ We must avoid clrex due to Cortex-A15 erratum #830321
|
||||||
strex r1, r2, [sp] @ clear the exclusive monitor
|
strex r1, r2, [r2] @ clear the exclusive monitor
|
||||||
#endif
|
#endif
|
||||||
.if \fast
|
.if \fast
|
||||||
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
|
ldmdb r2, {r1 - lr}^ @ get calling r1 - lr
|
||||||
.else
|
.else
|
||||||
ldmdb sp, {r0 - lr}^ @ get calling r0 - lr
|
ldmdb r2, {r0 - lr}^ @ get calling r0 - lr
|
||||||
.endif
|
.endif
|
||||||
mov r0, r0 @ ARMv5T and earlier require a nop
|
mov r0, r0 @ ARMv5T and earlier require a nop
|
||||||
@ after ldm {}^
|
@ after ldm {}^
|
||||||
add sp, sp, #S_FRAME_SIZE - S_PC
|
add sp, sp, #\offset + S_FRAME_SIZE
|
||||||
movs pc, lr @ return & move spsr_svc into cpsr
|
movs pc, lr @ return & move spsr_svc into cpsr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@@ -116,8 +116,14 @@ int armpmu_event_set_period(struct perf_event *event)
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (left > (s64)armpmu->max_period)
|
/*
|
||||||
left = armpmu->max_period;
|
* Limit the maximum period to prevent the counter value
|
||||||
|
* from overtaking the one we are about to program. In
|
||||||
|
* effect we are reducing max_period to account for
|
||||||
|
* interrupt latency (and we are being very conservative).
|
||||||
|
*/
|
||||||
|
if (left > (armpmu->max_period >> 1))
|
||||||
|
left = armpmu->max_period >> 1;
|
||||||
|
|
||||||
local64_set(&hwc->prev_count, (u64)-left);
|
local64_set(&hwc->prev_count, (u64)-left);
|
||||||
|
|
||||||
|
@@ -657,10 +657,13 @@ int __init arm_add_memory(u64 start, u64 size)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Ensure that start/size are aligned to a page boundary.
|
* Ensure that start/size are aligned to a page boundary.
|
||||||
* Size is appropriately rounded down, start is rounded up.
|
* Size is rounded down, start is rounded up.
|
||||||
*/
|
*/
|
||||||
size -= start & ~PAGE_MASK;
|
|
||||||
aligned_start = PAGE_ALIGN(start);
|
aligned_start = PAGE_ALIGN(start);
|
||||||
|
if (aligned_start > start + size)
|
||||||
|
size = 0;
|
||||||
|
else
|
||||||
|
size -= aligned_start - start;
|
||||||
|
|
||||||
#ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT
|
#ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT
|
||||||
if (aligned_start > ULONG_MAX) {
|
if (aligned_start > ULONG_MAX) {
|
||||||
|
@@ -281,15 +281,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|||||||
vcpu->cpu = cpu;
|
vcpu->cpu = cpu;
|
||||||
vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state);
|
vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state);
|
||||||
|
|
||||||
/*
|
|
||||||
* Check whether this vcpu requires the cache to be flushed on
|
|
||||||
* this physical CPU. This is a consequence of doing dcache
|
|
||||||
* operations by set/way on this vcpu. We do it here to be in
|
|
||||||
* a non-preemptible section.
|
|
||||||
*/
|
|
||||||
if (cpumask_test_and_clear_cpu(cpu, &vcpu->arch.require_dcache_flush))
|
|
||||||
flush_cache_all(); /* We'd really want v7_flush_dcache_all() */
|
|
||||||
|
|
||||||
kvm_arm_set_running_vcpu(vcpu);
|
kvm_arm_set_running_vcpu(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,7 +532,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||||||
ret = kvm_call_hyp(__kvm_vcpu_run, vcpu);
|
ret = kvm_call_hyp(__kvm_vcpu_run, vcpu);
|
||||||
|
|
||||||
vcpu->mode = OUTSIDE_GUEST_MODE;
|
vcpu->mode = OUTSIDE_GUEST_MODE;
|
||||||
vcpu->arch.last_pcpu = smp_processor_id();
|
|
||||||
kvm_guest_exit();
|
kvm_guest_exit();
|
||||||
trace_kvm_exit(*vcpu_pc(vcpu));
|
trace_kvm_exit(*vcpu_pc(vcpu));
|
||||||
/*
|
/*
|
||||||
|
@@ -189,82 +189,40 @@ static bool access_l2ectlr(struct kvm_vcpu *vcpu,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See note at ARM ARM B1.14.4 */
|
/*
|
||||||
|
* See note at ARMv7 ARM B1.14.4 (TL;DR: S/W ops are not easily virtualized).
|
||||||
|
*/
|
||||||
static bool access_dcsw(struct kvm_vcpu *vcpu,
|
static bool access_dcsw(struct kvm_vcpu *vcpu,
|
||||||
const struct coproc_params *p,
|
const struct coproc_params *p,
|
||||||
const struct coproc_reg *r)
|
const struct coproc_reg *r)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
if (!p->is_write)
|
if (!p->is_write)
|
||||||
return read_from_write_only(vcpu, p);
|
return read_from_write_only(vcpu, p);
|
||||||
|
|
||||||
cpu = get_cpu();
|
kvm_set_way_flush(vcpu);
|
||||||
|
|
||||||
cpumask_setall(&vcpu->arch.require_dcache_flush);
|
|
||||||
cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush);
|
|
||||||
|
|
||||||
/* If we were already preempted, take the long way around */
|
|
||||||
if (cpu != vcpu->arch.last_pcpu) {
|
|
||||||
flush_cache_all();
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
val = *vcpu_reg(vcpu, p->Rt1);
|
|
||||||
|
|
||||||
switch (p->CRm) {
|
|
||||||
case 6: /* Upgrade DCISW to DCCISW, as per HCR.SWIO */
|
|
||||||
case 14: /* DCCISW */
|
|
||||||
asm volatile("mcr p15, 0, %0, c7, c14, 2" : : "r" (val));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10: /* DCCSW */
|
|
||||||
asm volatile("mcr p15, 0, %0, c7, c10, 2" : : "r" (val));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
put_cpu();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic accessor for VM registers. Only called as long as HCR_TVM
|
* Generic accessor for VM registers. Only called as long as HCR_TVM
|
||||||
* is set.
|
* is set. If the guest enables the MMU, we stop trapping the VM
|
||||||
|
* sys_regs and leave it in complete control of the caches.
|
||||||
|
*
|
||||||
|
* Used by the cpu-specific code.
|
||||||
*/
|
*/
|
||||||
static bool access_vm_reg(struct kvm_vcpu *vcpu,
|
bool access_vm_reg(struct kvm_vcpu *vcpu,
|
||||||
const struct coproc_params *p,
|
const struct coproc_params *p,
|
||||||
const struct coproc_reg *r)
|
const struct coproc_reg *r)
|
||||||
{
|
{
|
||||||
|
bool was_enabled = vcpu_has_cache_enabled(vcpu);
|
||||||
|
|
||||||
BUG_ON(!p->is_write);
|
BUG_ON(!p->is_write);
|
||||||
|
|
||||||
vcpu->arch.cp15[r->reg] = *vcpu_reg(vcpu, p->Rt1);
|
vcpu->arch.cp15[r->reg] = *vcpu_reg(vcpu, p->Rt1);
|
||||||
if (p->is_64bit)
|
if (p->is_64bit)
|
||||||
vcpu->arch.cp15[r->reg + 1] = *vcpu_reg(vcpu, p->Rt2);
|
vcpu->arch.cp15[r->reg + 1] = *vcpu_reg(vcpu, p->Rt2);
|
||||||
|
|
||||||
return true;
|
kvm_toggle_cache(vcpu, was_enabled);
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SCTLR accessor. Only called as long as HCR_TVM is set. If the
|
|
||||||
* guest enables the MMU, we stop trapping the VM sys_regs and leave
|
|
||||||
* it in complete control of the caches.
|
|
||||||
*
|
|
||||||
* Used by the cpu-specific code.
|
|
||||||
*/
|
|
||||||
bool access_sctlr(struct kvm_vcpu *vcpu,
|
|
||||||
const struct coproc_params *p,
|
|
||||||
const struct coproc_reg *r)
|
|
||||||
{
|
|
||||||
access_vm_reg(vcpu, p, r);
|
|
||||||
|
|
||||||
if (vcpu_has_cache_enabled(vcpu)) { /* MMU+Caches enabled? */
|
|
||||||
vcpu->arch.hcr &= ~HCR_TVM;
|
|
||||||
stage2_flush_vm(vcpu->kvm);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -153,8 +153,8 @@ static inline int cmp_reg(const struct coproc_reg *i1,
|
|||||||
#define is64 .is_64 = true
|
#define is64 .is_64 = true
|
||||||
#define is32 .is_64 = false
|
#define is32 .is_64 = false
|
||||||
|
|
||||||
bool access_sctlr(struct kvm_vcpu *vcpu,
|
bool access_vm_reg(struct kvm_vcpu *vcpu,
|
||||||
const struct coproc_params *p,
|
const struct coproc_params *p,
|
||||||
const struct coproc_reg *r);
|
const struct coproc_reg *r);
|
||||||
|
|
||||||
#endif /* __ARM_KVM_COPROC_LOCAL_H__ */
|
#endif /* __ARM_KVM_COPROC_LOCAL_H__ */
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
static const struct coproc_reg a15_regs[] = {
|
static const struct coproc_reg a15_regs[] = {
|
||||||
/* SCTLR: swapped by interrupt.S. */
|
/* SCTLR: swapped by interrupt.S. */
|
||||||
{ CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32,
|
{ CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32,
|
||||||
access_sctlr, reset_val, c1_SCTLR, 0x00C50078 },
|
access_vm_reg, reset_val, c1_SCTLR, 0x00C50078 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct kvm_coproc_target_table a15_target_table = {
|
static struct kvm_coproc_target_table a15_target_table = {
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
static const struct coproc_reg a7_regs[] = {
|
static const struct coproc_reg a7_regs[] = {
|
||||||
/* SCTLR: swapped by interrupt.S. */
|
/* SCTLR: swapped by interrupt.S. */
|
||||||
{ CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32,
|
{ CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32,
|
||||||
access_sctlr, reset_val, c1_SCTLR, 0x00C50878 },
|
access_vm_reg, reset_val, c1_SCTLR, 0x00C50878 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct kvm_coproc_target_table a7_target_table = {
|
static struct kvm_coproc_target_table a7_target_table = {
|
||||||
|
@@ -58,6 +58,26 @@ static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
|||||||
kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
|
kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* D-Cache management functions. They take the page table entries by
|
||||||
|
* value, as they are flushing the cache using the kernel mapping (or
|
||||||
|
* kmap on 32bit).
|
||||||
|
*/
|
||||||
|
static void kvm_flush_dcache_pte(pte_t pte)
|
||||||
|
{
|
||||||
|
__kvm_flush_dcache_pte(pte);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kvm_flush_dcache_pmd(pmd_t pmd)
|
||||||
|
{
|
||||||
|
__kvm_flush_dcache_pmd(pmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kvm_flush_dcache_pud(pud_t pud)
|
||||||
|
{
|
||||||
|
__kvm_flush_dcache_pud(pud);
|
||||||
|
}
|
||||||
|
|
||||||
static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
|
static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
|
||||||
int min, int max)
|
int min, int max)
|
||||||
{
|
{
|
||||||
@@ -119,6 +139,26 @@ static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr)
|
|||||||
put_page(virt_to_page(pmd));
|
put_page(virt_to_page(pmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unmapping vs dcache management:
|
||||||
|
*
|
||||||
|
* If a guest maps certain memory pages as uncached, all writes will
|
||||||
|
* bypass the data cache and go directly to RAM. However, the CPUs
|
||||||
|
* can still speculate reads (not writes) and fill cache lines with
|
||||||
|
* data.
|
||||||
|
*
|
||||||
|
* Those cache lines will be *clean* cache lines though, so a
|
||||||
|
* clean+invalidate operation is equivalent to an invalidate
|
||||||
|
* operation, because no cache lines are marked dirty.
|
||||||
|
*
|
||||||
|
* Those clean cache lines could be filled prior to an uncached write
|
||||||
|
* by the guest, and the cache coherent IO subsystem would therefore
|
||||||
|
* end up writing old data to disk.
|
||||||
|
*
|
||||||
|
* This is why right after unmapping a page/section and invalidating
|
||||||
|
* the corresponding TLBs, we call kvm_flush_dcache_p*() to make sure
|
||||||
|
* the IO subsystem will never hit in the cache.
|
||||||
|
*/
|
||||||
static void unmap_ptes(struct kvm *kvm, pmd_t *pmd,
|
static void unmap_ptes(struct kvm *kvm, pmd_t *pmd,
|
||||||
phys_addr_t addr, phys_addr_t end)
|
phys_addr_t addr, phys_addr_t end)
|
||||||
{
|
{
|
||||||
@@ -128,9 +168,16 @@ static void unmap_ptes(struct kvm *kvm, pmd_t *pmd,
|
|||||||
start_pte = pte = pte_offset_kernel(pmd, addr);
|
start_pte = pte = pte_offset_kernel(pmd, addr);
|
||||||
do {
|
do {
|
||||||
if (!pte_none(*pte)) {
|
if (!pte_none(*pte)) {
|
||||||
|
pte_t old_pte = *pte;
|
||||||
|
|
||||||
kvm_set_pte(pte, __pte(0));
|
kvm_set_pte(pte, __pte(0));
|
||||||
put_page(virt_to_page(pte));
|
|
||||||
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||||
|
|
||||||
|
/* No need to invalidate the cache for device mappings */
|
||||||
|
if ((pte_val(old_pte) & PAGE_S2_DEVICE) != PAGE_S2_DEVICE)
|
||||||
|
kvm_flush_dcache_pte(old_pte);
|
||||||
|
|
||||||
|
put_page(virt_to_page(pte));
|
||||||
}
|
}
|
||||||
} while (pte++, addr += PAGE_SIZE, addr != end);
|
} while (pte++, addr += PAGE_SIZE, addr != end);
|
||||||
|
|
||||||
@@ -149,8 +196,13 @@ static void unmap_pmds(struct kvm *kvm, pud_t *pud,
|
|||||||
next = kvm_pmd_addr_end(addr, end);
|
next = kvm_pmd_addr_end(addr, end);
|
||||||
if (!pmd_none(*pmd)) {
|
if (!pmd_none(*pmd)) {
|
||||||
if (kvm_pmd_huge(*pmd)) {
|
if (kvm_pmd_huge(*pmd)) {
|
||||||
|
pmd_t old_pmd = *pmd;
|
||||||
|
|
||||||
pmd_clear(pmd);
|
pmd_clear(pmd);
|
||||||
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||||
|
|
||||||
|
kvm_flush_dcache_pmd(old_pmd);
|
||||||
|
|
||||||
put_page(virt_to_page(pmd));
|
put_page(virt_to_page(pmd));
|
||||||
} else {
|
} else {
|
||||||
unmap_ptes(kvm, pmd, addr, next);
|
unmap_ptes(kvm, pmd, addr, next);
|
||||||
@@ -173,8 +225,13 @@ static void unmap_puds(struct kvm *kvm, pgd_t *pgd,
|
|||||||
next = kvm_pud_addr_end(addr, end);
|
next = kvm_pud_addr_end(addr, end);
|
||||||
if (!pud_none(*pud)) {
|
if (!pud_none(*pud)) {
|
||||||
if (pud_huge(*pud)) {
|
if (pud_huge(*pud)) {
|
||||||
|
pud_t old_pud = *pud;
|
||||||
|
|
||||||
pud_clear(pud);
|
pud_clear(pud);
|
||||||
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||||
|
|
||||||
|
kvm_flush_dcache_pud(old_pud);
|
||||||
|
|
||||||
put_page(virt_to_page(pud));
|
put_page(virt_to_page(pud));
|
||||||
} else {
|
} else {
|
||||||
unmap_pmds(kvm, pud, addr, next);
|
unmap_pmds(kvm, pud, addr, next);
|
||||||
@@ -209,10 +266,9 @@ static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd,
|
|||||||
|
|
||||||
pte = pte_offset_kernel(pmd, addr);
|
pte = pte_offset_kernel(pmd, addr);
|
||||||
do {
|
do {
|
||||||
if (!pte_none(*pte)) {
|
if (!pte_none(*pte) &&
|
||||||
hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT);
|
(pte_val(*pte) & PAGE_S2_DEVICE) != PAGE_S2_DEVICE)
|
||||||
kvm_flush_dcache_to_poc((void*)hva, PAGE_SIZE);
|
kvm_flush_dcache_pte(*pte);
|
||||||
}
|
|
||||||
} while (pte++, addr += PAGE_SIZE, addr != end);
|
} while (pte++, addr += PAGE_SIZE, addr != end);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,12 +282,10 @@ static void stage2_flush_pmds(struct kvm *kvm, pud_t *pud,
|
|||||||
do {
|
do {
|
||||||
next = kvm_pmd_addr_end(addr, end);
|
next = kvm_pmd_addr_end(addr, end);
|
||||||
if (!pmd_none(*pmd)) {
|
if (!pmd_none(*pmd)) {
|
||||||
if (kvm_pmd_huge(*pmd)) {
|
if (kvm_pmd_huge(*pmd))
|
||||||
hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT);
|
kvm_flush_dcache_pmd(*pmd);
|
||||||
kvm_flush_dcache_to_poc((void*)hva, PMD_SIZE);
|
else
|
||||||
} else {
|
|
||||||
stage2_flush_ptes(kvm, pmd, addr, next);
|
stage2_flush_ptes(kvm, pmd, addr, next);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} while (pmd++, addr = next, addr != end);
|
} while (pmd++, addr = next, addr != end);
|
||||||
}
|
}
|
||||||
@@ -246,12 +300,10 @@ static void stage2_flush_puds(struct kvm *kvm, pgd_t *pgd,
|
|||||||
do {
|
do {
|
||||||
next = kvm_pud_addr_end(addr, end);
|
next = kvm_pud_addr_end(addr, end);
|
||||||
if (!pud_none(*pud)) {
|
if (!pud_none(*pud)) {
|
||||||
if (pud_huge(*pud)) {
|
if (pud_huge(*pud))
|
||||||
hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT);
|
kvm_flush_dcache_pud(*pud);
|
||||||
kvm_flush_dcache_to_poc((void*)hva, PUD_SIZE);
|
else
|
||||||
} else {
|
|
||||||
stage2_flush_pmds(kvm, pud, addr, next);
|
stage2_flush_pmds(kvm, pud, addr, next);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} while (pud++, addr = next, addr != end);
|
} while (pud++, addr = next, addr != end);
|
||||||
}
|
}
|
||||||
@@ -278,7 +330,7 @@ static void stage2_flush_memslot(struct kvm *kvm,
|
|||||||
* Go through the stage 2 page tables and invalidate any cache lines
|
* Go through the stage 2 page tables and invalidate any cache lines
|
||||||
* backing memory already mapped to the VM.
|
* backing memory already mapped to the VM.
|
||||||
*/
|
*/
|
||||||
void stage2_flush_vm(struct kvm *kvm)
|
static void stage2_flush_vm(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
struct kvm_memslots *slots;
|
struct kvm_memslots *slots;
|
||||||
struct kvm_memory_slot *memslot;
|
struct kvm_memory_slot *memslot;
|
||||||
@@ -905,6 +957,12 @@ static bool kvm_is_device_pfn(unsigned long pfn)
|
|||||||
return !pfn_valid(pfn);
|
return !pfn_valid(pfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn,
|
||||||
|
unsigned long size, bool uncached)
|
||||||
|
{
|
||||||
|
__coherent_cache_guest_page(vcpu, pfn, size, uncached);
|
||||||
|
}
|
||||||
|
|
||||||
static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||||
struct kvm_memory_slot *memslot, unsigned long hva,
|
struct kvm_memory_slot *memslot, unsigned long hva,
|
||||||
unsigned long fault_status)
|
unsigned long fault_status)
|
||||||
@@ -994,8 +1052,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
|||||||
kvm_set_s2pmd_writable(&new_pmd);
|
kvm_set_s2pmd_writable(&new_pmd);
|
||||||
kvm_set_pfn_dirty(pfn);
|
kvm_set_pfn_dirty(pfn);
|
||||||
}
|
}
|
||||||
coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE,
|
coherent_cache_guest_page(vcpu, pfn, PMD_SIZE, fault_ipa_uncached);
|
||||||
fault_ipa_uncached);
|
|
||||||
ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd);
|
ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd);
|
||||||
} else {
|
} else {
|
||||||
pte_t new_pte = pfn_pte(pfn, mem_type);
|
pte_t new_pte = pfn_pte(pfn, mem_type);
|
||||||
@@ -1003,8 +1060,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
|||||||
kvm_set_s2pte_writable(&new_pte);
|
kvm_set_s2pte_writable(&new_pte);
|
||||||
kvm_set_pfn_dirty(pfn);
|
kvm_set_pfn_dirty(pfn);
|
||||||
}
|
}
|
||||||
coherent_cache_guest_page(vcpu, hva, PAGE_SIZE,
|
coherent_cache_guest_page(vcpu, pfn, PAGE_SIZE, fault_ipa_uncached);
|
||||||
fault_ipa_uncached);
|
|
||||||
ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte,
|
ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte,
|
||||||
pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE));
|
pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE));
|
||||||
}
|
}
|
||||||
@@ -1411,3 +1467,71 @@ void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
|
|||||||
unmap_stage2_range(kvm, gpa, size);
|
unmap_stage2_range(kvm, gpa, size);
|
||||||
spin_unlock(&kvm->mmu_lock);
|
spin_unlock(&kvm->mmu_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See note at ARMv7 ARM B1.14.4 (TL;DR: S/W ops are not easily virtualized).
|
||||||
|
*
|
||||||
|
* Main problems:
|
||||||
|
* - S/W ops are local to a CPU (not broadcast)
|
||||||
|
* - We have line migration behind our back (speculation)
|
||||||
|
* - System caches don't support S/W at all (damn!)
|
||||||
|
*
|
||||||
|
* In the face of the above, the best we can do is to try and convert
|
||||||
|
* S/W ops to VA ops. Because the guest is not allowed to infer the
|
||||||
|
* S/W to PA mapping, it can only use S/W to nuke the whole cache,
|
||||||
|
* which is a rather good thing for us.
|
||||||
|
*
|
||||||
|
* Also, it is only used when turning caches on/off ("The expected
|
||||||
|
* usage of the cache maintenance instructions that operate by set/way
|
||||||
|
* is associated with the cache maintenance instructions associated
|
||||||
|
* with the powerdown and powerup of caches, if this is required by
|
||||||
|
* the implementation.").
|
||||||
|
*
|
||||||
|
* We use the following policy:
|
||||||
|
*
|
||||||
|
* - If we trap a S/W operation, we enable VM trapping to detect
|
||||||
|
* caches being turned on/off, and do a full clean.
|
||||||
|
*
|
||||||
|
* - We flush the caches on both caches being turned on and off.
|
||||||
|
*
|
||||||
|
* - Once the caches are enabled, we stop trapping VM ops.
|
||||||
|
*/
|
||||||
|
void kvm_set_way_flush(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
unsigned long hcr = vcpu_get_hcr(vcpu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this is the first time we do a S/W operation
|
||||||
|
* (i.e. HCR_TVM not set) flush the whole memory, and set the
|
||||||
|
* VM trapping.
|
||||||
|
*
|
||||||
|
* Otherwise, rely on the VM trapping to wait for the MMU +
|
||||||
|
* Caches to be turned off. At that point, we'll be able to
|
||||||
|
* clean the caches again.
|
||||||
|
*/
|
||||||
|
if (!(hcr & HCR_TVM)) {
|
||||||
|
trace_kvm_set_way_flush(*vcpu_pc(vcpu),
|
||||||
|
vcpu_has_cache_enabled(vcpu));
|
||||||
|
stage2_flush_vm(vcpu->kvm);
|
||||||
|
vcpu_set_hcr(vcpu, hcr | HCR_TVM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled)
|
||||||
|
{
|
||||||
|
bool now_enabled = vcpu_has_cache_enabled(vcpu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If switching the MMU+caches on, need to invalidate the caches.
|
||||||
|
* If switching it off, need to clean the caches.
|
||||||
|
* Clean + invalidate does the trick always.
|
||||||
|
*/
|
||||||
|
if (now_enabled != was_enabled)
|
||||||
|
stage2_flush_vm(vcpu->kvm);
|
||||||
|
|
||||||
|
/* Caches are now on, stop trapping VM ops (until a S/W op) */
|
||||||
|
if (now_enabled)
|
||||||
|
vcpu_set_hcr(vcpu, vcpu_get_hcr(vcpu) & ~HCR_TVM);
|
||||||
|
|
||||||
|
trace_kvm_toggle_cache(*vcpu_pc(vcpu), was_enabled, now_enabled);
|
||||||
|
}
|
||||||
|
@@ -223,6 +223,45 @@ TRACE_EVENT(kvm_hvc,
|
|||||||
__entry->vcpu_pc, __entry->r0, __entry->imm)
|
__entry->vcpu_pc, __entry->r0, __entry->imm)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_set_way_flush,
|
||||||
|
TP_PROTO(unsigned long vcpu_pc, bool cache),
|
||||||
|
TP_ARGS(vcpu_pc, cache),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field( unsigned long, vcpu_pc )
|
||||||
|
__field( bool, cache )
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu_pc = vcpu_pc;
|
||||||
|
__entry->cache = cache;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("S/W flush at 0x%016lx (cache %s)",
|
||||||
|
__entry->vcpu_pc, __entry->cache ? "on" : "off")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_toggle_cache,
|
||||||
|
TP_PROTO(unsigned long vcpu_pc, bool was, bool now),
|
||||||
|
TP_ARGS(vcpu_pc, was, now),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field( unsigned long, vcpu_pc )
|
||||||
|
__field( bool, was )
|
||||||
|
__field( bool, now )
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu_pc = vcpu_pc;
|
||||||
|
__entry->was = was;
|
||||||
|
__entry->now = now;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("VM op at 0x%016lx (cache was %s, now %s)",
|
||||||
|
__entry->vcpu_pc, __entry->was ? "on" : "off",
|
||||||
|
__entry->now ? "on" : "off")
|
||||||
|
);
|
||||||
|
|
||||||
#endif /* _TRACE_KVM_H */
|
#endif /* _TRACE_KVM_H */
|
||||||
|
|
||||||
#undef TRACE_INCLUDE_PATH
|
#undef TRACE_INCLUDE_PATH
|
||||||
|
@@ -189,6 +189,13 @@ static void __init armada_375_380_coherency_init(struct device_node *np)
|
|||||||
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_pcie_wa_ioremap_caller;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We should switch the PL310 to I/O coherency mode only if
|
||||||
|
* I/O coherency is actually enabled.
|
||||||
|
*/
|
||||||
|
if (!coherency_available())
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the PL310 property "arm,io-coherent". This makes sure the
|
* Add the PL310 property "arm,io-coherent". This makes sure the
|
||||||
* outer sync operation is not used, which allows to
|
* outer sync operation is not used, which allows to
|
||||||
@@ -246,9 +253,14 @@ static int coherency_type(void)
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As a precaution, we currently completely disable hardware I/O
|
||||||
|
* coherency, until enough testing is done with automatic I/O
|
||||||
|
* synchronization barriers to validate that it is a proper solution.
|
||||||
|
*/
|
||||||
int coherency_available(void)
|
int coherency_available(void)
|
||||||
{
|
{
|
||||||
return coherency_type() != COHERENCY_FABRIC_TYPE_NONE;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init coherency_init(void)
|
int __init coherency_init(void)
|
||||||
|
@@ -211,6 +211,7 @@ extern struct device *omap2_get_iva_device(void);
|
|||||||
extern struct device *omap2_get_l3_device(void);
|
extern struct device *omap2_get_l3_device(void);
|
||||||
extern struct device *omap4_get_dsp_device(void);
|
extern struct device *omap4_get_dsp_device(void);
|
||||||
|
|
||||||
|
unsigned int omap4_xlate_irq(unsigned int hwirq);
|
||||||
void omap_gic_of_init(void);
|
void omap_gic_of_init(void);
|
||||||
|
|
||||||
#ifdef CONFIG_CACHE_L2X0
|
#ifdef CONFIG_CACHE_L2X0
|
||||||
|
@@ -256,6 +256,38 @@ static int __init omap4_sar_ram_init(void)
|
|||||||
}
|
}
|
||||||
omap_early_initcall(omap4_sar_ram_init);
|
omap_early_initcall(omap4_sar_ram_init);
|
||||||
|
|
||||||
|
static struct of_device_id gic_match[] = {
|
||||||
|
{ .compatible = "arm,cortex-a9-gic", },
|
||||||
|
{ .compatible = "arm,cortex-a15-gic", },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct device_node *gic_node;
|
||||||
|
|
||||||
|
unsigned int omap4_xlate_irq(unsigned int hwirq)
|
||||||
|
{
|
||||||
|
struct of_phandle_args irq_data;
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
|
if (!gic_node)
|
||||||
|
gic_node = of_find_matching_node(NULL, gic_match);
|
||||||
|
|
||||||
|
if (WARN_ON(!gic_node))
|
||||||
|
return hwirq;
|
||||||
|
|
||||||
|
irq_data.np = gic_node;
|
||||||
|
irq_data.args_count = 3;
|
||||||
|
irq_data.args[0] = 0;
|
||||||
|
irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START;
|
||||||
|
irq_data.args[2] = IRQ_TYPE_LEVEL_HIGH;
|
||||||
|
|
||||||
|
irq = irq_create_of_mapping(&irq_data);
|
||||||
|
if (WARN_ON(!irq))
|
||||||
|
irq = hwirq;
|
||||||
|
|
||||||
|
return irq;
|
||||||
|
}
|
||||||
|
|
||||||
void __init omap_gic_of_init(void)
|
void __init omap_gic_of_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
|
@@ -3534,9 +3534,15 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
|
|||||||
|
|
||||||
mpu_irqs_cnt = _count_mpu_irqs(oh);
|
mpu_irqs_cnt = _count_mpu_irqs(oh);
|
||||||
for (i = 0; i < mpu_irqs_cnt; i++) {
|
for (i = 0; i < mpu_irqs_cnt; i++) {
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
|
if (oh->xlate_irq)
|
||||||
|
irq = oh->xlate_irq((oh->mpu_irqs + i)->irq);
|
||||||
|
else
|
||||||
|
irq = (oh->mpu_irqs + i)->irq;
|
||||||
(res + r)->name = (oh->mpu_irqs + i)->name;
|
(res + r)->name = (oh->mpu_irqs + i)->name;
|
||||||
(res + r)->start = (oh->mpu_irqs + i)->irq;
|
(res + r)->start = irq;
|
||||||
(res + r)->end = (oh->mpu_irqs + i)->irq;
|
(res + r)->end = irq;
|
||||||
(res + r)->flags = IORESOURCE_IRQ;
|
(res + r)->flags = IORESOURCE_IRQ;
|
||||||
r++;
|
r++;
|
||||||
}
|
}
|
||||||
|
@@ -676,6 +676,7 @@ struct omap_hwmod {
|
|||||||
spinlock_t _lock;
|
spinlock_t _lock;
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
struct omap_hwmod_ocp_if *_mpu_port;
|
struct omap_hwmod_ocp_if *_mpu_port;
|
||||||
|
unsigned int (*xlate_irq)(unsigned int);
|
||||||
u16 flags;
|
u16 flags;
|
||||||
u8 mpu_rt_idx;
|
u8 mpu_rt_idx;
|
||||||
u8 response_lat;
|
u8 response_lat;
|
||||||
|
@@ -479,6 +479,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = {
|
|||||||
.class = &omap44xx_dma_hwmod_class,
|
.class = &omap44xx_dma_hwmod_class,
|
||||||
.clkdm_name = "l3_dma_clkdm",
|
.clkdm_name = "l3_dma_clkdm",
|
||||||
.mpu_irqs = omap44xx_dma_system_irqs,
|
.mpu_irqs = omap44xx_dma_system_irqs,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.main_clk = "l3_div_ck",
|
.main_clk = "l3_div_ck",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap4 = {
|
.omap4 = {
|
||||||
@@ -640,6 +641,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = {
|
|||||||
.class = &omap44xx_dispc_hwmod_class,
|
.class = &omap44xx_dispc_hwmod_class,
|
||||||
.clkdm_name = "l3_dss_clkdm",
|
.clkdm_name = "l3_dss_clkdm",
|
||||||
.mpu_irqs = omap44xx_dss_dispc_irqs,
|
.mpu_irqs = omap44xx_dss_dispc_irqs,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.sdma_reqs = omap44xx_dss_dispc_sdma_reqs,
|
.sdma_reqs = omap44xx_dss_dispc_sdma_reqs,
|
||||||
.main_clk = "dss_dss_clk",
|
.main_clk = "dss_dss_clk",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
@@ -693,6 +695,7 @@ static struct omap_hwmod omap44xx_dss_dsi1_hwmod = {
|
|||||||
.class = &omap44xx_dsi_hwmod_class,
|
.class = &omap44xx_dsi_hwmod_class,
|
||||||
.clkdm_name = "l3_dss_clkdm",
|
.clkdm_name = "l3_dss_clkdm",
|
||||||
.mpu_irqs = omap44xx_dss_dsi1_irqs,
|
.mpu_irqs = omap44xx_dss_dsi1_irqs,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.sdma_reqs = omap44xx_dss_dsi1_sdma_reqs,
|
.sdma_reqs = omap44xx_dss_dsi1_sdma_reqs,
|
||||||
.main_clk = "dss_dss_clk",
|
.main_clk = "dss_dss_clk",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
@@ -726,6 +729,7 @@ static struct omap_hwmod omap44xx_dss_dsi2_hwmod = {
|
|||||||
.class = &omap44xx_dsi_hwmod_class,
|
.class = &omap44xx_dsi_hwmod_class,
|
||||||
.clkdm_name = "l3_dss_clkdm",
|
.clkdm_name = "l3_dss_clkdm",
|
||||||
.mpu_irqs = omap44xx_dss_dsi2_irqs,
|
.mpu_irqs = omap44xx_dss_dsi2_irqs,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.sdma_reqs = omap44xx_dss_dsi2_sdma_reqs,
|
.sdma_reqs = omap44xx_dss_dsi2_sdma_reqs,
|
||||||
.main_clk = "dss_dss_clk",
|
.main_clk = "dss_dss_clk",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
@@ -784,6 +788,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = {
|
|||||||
*/
|
*/
|
||||||
.flags = HWMOD_SWSUP_SIDLE,
|
.flags = HWMOD_SWSUP_SIDLE,
|
||||||
.mpu_irqs = omap44xx_dss_hdmi_irqs,
|
.mpu_irqs = omap44xx_dss_hdmi_irqs,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.sdma_reqs = omap44xx_dss_hdmi_sdma_reqs,
|
.sdma_reqs = omap44xx_dss_hdmi_sdma_reqs,
|
||||||
.main_clk = "dss_48mhz_clk",
|
.main_clk = "dss_48mhz_clk",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
|
@@ -288,6 +288,7 @@ static struct omap_hwmod omap54xx_dma_system_hwmod = {
|
|||||||
.class = &omap54xx_dma_hwmod_class,
|
.class = &omap54xx_dma_hwmod_class,
|
||||||
.clkdm_name = "dma_clkdm",
|
.clkdm_name = "dma_clkdm",
|
||||||
.mpu_irqs = omap54xx_dma_system_irqs,
|
.mpu_irqs = omap54xx_dma_system_irqs,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.main_clk = "l3_iclk_div",
|
.main_clk = "l3_iclk_div",
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap4 = {
|
.omap4 = {
|
||||||
|
@@ -498,6 +498,7 @@ struct omap_prcm_irq_setup {
|
|||||||
u8 nr_irqs;
|
u8 nr_irqs;
|
||||||
const struct omap_prcm_irq *irqs;
|
const struct omap_prcm_irq *irqs;
|
||||||
int irq;
|
int irq;
|
||||||
|
unsigned int (*xlate_irq)(unsigned int);
|
||||||
void (*read_pending_irqs)(unsigned long *events);
|
void (*read_pending_irqs)(unsigned long *events);
|
||||||
void (*ocp_barrier)(void);
|
void (*ocp_barrier)(void);
|
||||||
void (*save_and_clear_irqen)(u32 *saved_mask);
|
void (*save_and_clear_irqen)(u32 *saved_mask);
|
||||||
|
@@ -49,6 +49,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = {
|
|||||||
.irqs = omap4_prcm_irqs,
|
.irqs = omap4_prcm_irqs,
|
||||||
.nr_irqs = ARRAY_SIZE(omap4_prcm_irqs),
|
.nr_irqs = ARRAY_SIZE(omap4_prcm_irqs),
|
||||||
.irq = 11 + OMAP44XX_IRQ_GIC_START,
|
.irq = 11 + OMAP44XX_IRQ_GIC_START,
|
||||||
|
.xlate_irq = omap4_xlate_irq,
|
||||||
.read_pending_irqs = &omap44xx_prm_read_pending_irqs,
|
.read_pending_irqs = &omap44xx_prm_read_pending_irqs,
|
||||||
.ocp_barrier = &omap44xx_prm_ocp_barrier,
|
.ocp_barrier = &omap44xx_prm_ocp_barrier,
|
||||||
.save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen,
|
.save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen,
|
||||||
@@ -751,8 +752,10 @@ static int omap44xx_prm_late_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Once OMAP4 DT is filled as well */
|
/* Once OMAP4 DT is filled as well */
|
||||||
if (irq_num >= 0)
|
if (irq_num >= 0) {
|
||||||
omap4_prcm_irq_setup.irq = irq_num;
|
omap4_prcm_irq_setup.irq = irq_num;
|
||||||
|
omap4_prcm_irq_setup.xlate_irq = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
omap44xx_prm_enable_io_wakeup();
|
omap44xx_prm_enable_io_wakeup();
|
||||||
|
@@ -187,6 +187,7 @@ int omap_prcm_event_to_irq(const char *name)
|
|||||||
*/
|
*/
|
||||||
void omap_prcm_irq_cleanup(void)
|
void omap_prcm_irq_cleanup(void)
|
||||||
{
|
{
|
||||||
|
unsigned int irq;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!prcm_irq_setup) {
|
if (!prcm_irq_setup) {
|
||||||
@@ -211,7 +212,11 @@ void omap_prcm_irq_cleanup(void)
|
|||||||
kfree(prcm_irq_setup->priority_mask);
|
kfree(prcm_irq_setup->priority_mask);
|
||||||
prcm_irq_setup->priority_mask = NULL;
|
prcm_irq_setup->priority_mask = NULL;
|
||||||
|
|
||||||
irq_set_chained_handler(prcm_irq_setup->irq, NULL);
|
if (prcm_irq_setup->xlate_irq)
|
||||||
|
irq = prcm_irq_setup->xlate_irq(prcm_irq_setup->irq);
|
||||||
|
else
|
||||||
|
irq = prcm_irq_setup->irq;
|
||||||
|
irq_set_chained_handler(irq, NULL);
|
||||||
|
|
||||||
if (prcm_irq_setup->base_irq > 0)
|
if (prcm_irq_setup->base_irq > 0)
|
||||||
irq_free_descs(prcm_irq_setup->base_irq,
|
irq_free_descs(prcm_irq_setup->base_irq,
|
||||||
@@ -259,6 +264,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
|
|||||||
int offset, i;
|
int offset, i;
|
||||||
struct irq_chip_generic *gc;
|
struct irq_chip_generic *gc;
|
||||||
struct irq_chip_type *ct;
|
struct irq_chip_type *ct;
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
if (!irq_setup)
|
if (!irq_setup)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -298,7 +304,11 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
|
|||||||
1 << (offset & 0x1f);
|
1 << (offset & 0x1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
irq_set_chained_handler(irq_setup->irq, omap_prcm_irq_handler);
|
if (irq_setup->xlate_irq)
|
||||||
|
irq = irq_setup->xlate_irq(irq_setup->irq);
|
||||||
|
else
|
||||||
|
irq = irq_setup->irq;
|
||||||
|
irq_set_chained_handler(irq, omap_prcm_irq_handler);
|
||||||
|
|
||||||
irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32,
|
irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32,
|
||||||
0);
|
0);
|
||||||
|
@@ -66,19 +66,24 @@ void __init omap_pmic_init(int bus, u32 clkrate,
|
|||||||
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
|
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_OMAP4
|
||||||
void __init omap4_pmic_init(const char *pmic_type,
|
void __init omap4_pmic_init(const char *pmic_type,
|
||||||
struct twl4030_platform_data *pmic_data,
|
struct twl4030_platform_data *pmic_data,
|
||||||
struct i2c_board_info *devices, int nr_devices)
|
struct i2c_board_info *devices, int nr_devices)
|
||||||
{
|
{
|
||||||
/* PMIC part*/
|
/* PMIC part*/
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
|
omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
|
||||||
omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT);
|
omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT);
|
||||||
omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data);
|
irq = omap4_xlate_irq(7 + OMAP44XX_IRQ_GIC_START);
|
||||||
|
omap_pmic_init(1, 400, pmic_type, irq, pmic_data);
|
||||||
|
|
||||||
/* Register additional devices on i2c1 bus if needed */
|
/* Register additional devices on i2c1 bus if needed */
|
||||||
if (devices)
|
if (devices)
|
||||||
i2c_register_board_info(1, devices, nr_devices);
|
i2c_register_board_info(1, devices, nr_devices);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __init omap_pmic_late_init(void)
|
void __init omap_pmic_late_init(void)
|
||||||
{
|
{
|
||||||
|
@@ -18,6 +18,8 @@
|
|||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/irqchip.h>
|
||||||
|
#include <linux/irqchip/arm-gic.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mfd/tmio.h>
|
#include <linux/mfd/tmio.h>
|
||||||
#include <linux/mmc/host.h>
|
#include <linux/mmc/host.h>
|
||||||
@@ -273,6 +275,22 @@ static void __init ape6evm_add_standard_devices(void)
|
|||||||
sizeof(ape6evm_leds_pdata));
|
sizeof(ape6evm_leds_pdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init ape6evm_legacy_init_time(void)
|
||||||
|
{
|
||||||
|
/* Do not invoke DT-based timers via clocksource_of_init() */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ape6evm_legacy_init_irq(void)
|
||||||
|
{
|
||||||
|
void __iomem *gic_dist_base = ioremap_nocache(0xf1001000, 0x1000);
|
||||||
|
void __iomem *gic_cpu_base = ioremap_nocache(0xf1002000, 0x1000);
|
||||||
|
|
||||||
|
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||||
|
|
||||||
|
/* Do not invoke DT-based interrupt code via irqchip_init() */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static const char *ape6evm_boards_compat_dt[] __initdata = {
|
static const char *ape6evm_boards_compat_dt[] __initdata = {
|
||||||
"renesas,ape6evm",
|
"renesas,ape6evm",
|
||||||
NULL,
|
NULL,
|
||||||
@@ -280,7 +298,9 @@ static const char *ape6evm_boards_compat_dt[] __initdata = {
|
|||||||
|
|
||||||
DT_MACHINE_START(APE6EVM_DT, "ape6evm")
|
DT_MACHINE_START(APE6EVM_DT, "ape6evm")
|
||||||
.init_early = shmobile_init_delay,
|
.init_early = shmobile_init_delay,
|
||||||
|
.init_irq = ape6evm_legacy_init_irq,
|
||||||
.init_machine = ape6evm_add_standard_devices,
|
.init_machine = ape6evm_add_standard_devices,
|
||||||
.init_late = shmobile_init_late,
|
.init_late = shmobile_init_late,
|
||||||
.dt_compat = ape6evm_boards_compat_dt,
|
.dt_compat = ape6evm_boards_compat_dt,
|
||||||
|
.init_time = ape6evm_legacy_init_time,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
@@ -21,6 +21,8 @@
|
|||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
#include <linux/irqchip.h>
|
||||||
|
#include <linux/irqchip/arm-gic.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/leds.h>
|
#include <linux/leds.h>
|
||||||
#include <linux/mfd/tmio.h>
|
#include <linux/mfd/tmio.h>
|
||||||
@@ -811,6 +813,16 @@ static void __init lager_init(void)
|
|||||||
lager_ksz8041_fixup);
|
lager_ksz8041_fixup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init lager_legacy_init_irq(void)
|
||||||
|
{
|
||||||
|
void __iomem *gic_dist_base = ioremap_nocache(0xf1001000, 0x1000);
|
||||||
|
void __iomem *gic_cpu_base = ioremap_nocache(0xf1002000, 0x1000);
|
||||||
|
|
||||||
|
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||||
|
|
||||||
|
/* Do not invoke DT-based interrupt code via irqchip_init() */
|
||||||
|
}
|
||||||
|
|
||||||
static const char * const lager_boards_compat_dt[] __initconst = {
|
static const char * const lager_boards_compat_dt[] __initconst = {
|
||||||
"renesas,lager",
|
"renesas,lager",
|
||||||
NULL,
|
NULL,
|
||||||
@@ -819,6 +831,7 @@ static const char * const lager_boards_compat_dt[] __initconst = {
|
|||||||
DT_MACHINE_START(LAGER_DT, "lager")
|
DT_MACHINE_START(LAGER_DT, "lager")
|
||||||
.smp = smp_ops(r8a7790_smp_ops),
|
.smp = smp_ops(r8a7790_smp_ops),
|
||||||
.init_early = shmobile_init_delay,
|
.init_early = shmobile_init_delay,
|
||||||
|
.init_irq = lager_legacy_init_irq,
|
||||||
.init_time = rcar_gen2_timer_init,
|
.init_time = rcar_gen2_timer_init,
|
||||||
.init_machine = lager_init,
|
.init_machine = lager_init,
|
||||||
.init_late = shmobile_init_late,
|
.init_late = shmobile_init_late,
|
||||||
|
@@ -576,11 +576,18 @@ void __init r8a7778_init_irq_extpin(int irlm)
|
|||||||
void __init r8a7778_init_irq_dt(void)
|
void __init r8a7778_init_irq_dt(void)
|
||||||
{
|
{
|
||||||
void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
|
void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
|
||||||
|
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||||
|
void __iomem *gic_dist_base = ioremap_nocache(0xfe438000, 0x1000);
|
||||||
|
void __iomem *gic_cpu_base = ioremap_nocache(0xfe430000, 0x1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
BUG_ON(!base);
|
BUG_ON(!base);
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||||
|
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||||
|
#else
|
||||||
irqchip_init();
|
irqchip_init();
|
||||||
|
#endif
|
||||||
/* route all interrupts to ARM */
|
/* route all interrupts to ARM */
|
||||||
__raw_writel(0x73ffffff, base + INT2NTSR0);
|
__raw_writel(0x73ffffff, base + INT2NTSR0);
|
||||||
__raw_writel(0xffffffff, base + INT2NTSR1);
|
__raw_writel(0xffffffff, base + INT2NTSR1);
|
||||||
|
@@ -720,10 +720,17 @@ static int r8a7779_set_wake(struct irq_data *data, unsigned int on)
|
|||||||
|
|
||||||
void __init r8a7779_init_irq_dt(void)
|
void __init r8a7779_init_irq_dt(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||||
|
void __iomem *gic_dist_base = ioremap_nocache(0xf0001000, 0x1000);
|
||||||
|
void __iomem *gic_cpu_base = ioremap_nocache(0xf0000100, 0x1000);
|
||||||
|
#endif
|
||||||
gic_arch_extn.irq_set_wake = r8a7779_set_wake;
|
gic_arch_extn.irq_set_wake = r8a7779_set_wake;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||||
|
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||||
|
#else
|
||||||
irqchip_init();
|
irqchip_init();
|
||||||
|
#endif
|
||||||
/* route all interrupts to ARM */
|
/* route all interrupts to ARM */
|
||||||
__raw_writel(0xffffffff, INT2NTSR0);
|
__raw_writel(0xffffffff, INT2NTSR0);
|
||||||
__raw_writel(0x3fffffff, INT2NTSR1);
|
__raw_writel(0x3fffffff, INT2NTSR1);
|
||||||
|
@@ -133,7 +133,9 @@ void __init rcar_gen2_timer_init(void)
|
|||||||
#ifdef CONFIG_COMMON_CLK
|
#ifdef CONFIG_COMMON_CLK
|
||||||
rcar_gen2_clocks_init(mode);
|
rcar_gen2_clocks_init(mode);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ARCH_SHMOBILE_MULTI
|
||||||
clocksource_of_init();
|
clocksource_of_init();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct memory_reserve_config {
|
struct memory_reserve_config {
|
||||||
|
@@ -70,6 +70,18 @@ void __init shmobile_init_delay(void)
|
|||||||
if (!max_freq)
|
if (!max_freq)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||||
|
/* Non-multiplatform r8a73a4 SoC cannot use arch timer due
|
||||||
|
* to GIC being initialized from C and arch timer via DT */
|
||||||
|
if (of_machine_is_compatible("renesas,r8a73a4"))
|
||||||
|
has_arch_timer = false;
|
||||||
|
|
||||||
|
/* Non-multiplatform r8a7790 SoC cannot use arch timer due
|
||||||
|
* to GIC being initialized from C and arch timer via DT */
|
||||||
|
if (of_machine_is_compatible("renesas,r8a7790"))
|
||||||
|
has_arch_timer = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!has_arch_timer || !IS_ENABLED(CONFIG_ARM_ARCH_TIMER)) {
|
if (!has_arch_timer || !IS_ENABLED(CONFIG_ARM_ARCH_TIMER)) {
|
||||||
if (is_a7_a8_a9)
|
if (is_a7_a8_a9)
|
||||||
shmobile_setup_delay_hz(max_freq, 1, 3);
|
shmobile_setup_delay_hz(max_freq, 1, 3);
|
||||||
|
@@ -1940,18 +1940,8 @@ void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(arm_iommu_release_mapping);
|
EXPORT_SYMBOL_GPL(arm_iommu_release_mapping);
|
||||||
|
|
||||||
/**
|
static int __arm_iommu_attach_device(struct device *dev,
|
||||||
* arm_iommu_attach_device
|
struct dma_iommu_mapping *mapping)
|
||||||
* @dev: valid struct device pointer
|
|
||||||
* @mapping: io address space mapping structure (returned from
|
|
||||||
* arm_iommu_create_mapping)
|
|
||||||
*
|
|
||||||
* Attaches specified io address space mapping to the provided device,
|
|
||||||
* More than one client might be attached to the same io address space
|
|
||||||
* mapping.
|
|
||||||
*/
|
|
||||||
int arm_iommu_attach_device(struct device *dev,
|
|
||||||
struct dma_iommu_mapping *mapping)
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -1965,15 +1955,35 @@ int arm_iommu_attach_device(struct device *dev,
|
|||||||
pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev));
|
pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* arm_iommu_detach_device
|
* arm_iommu_attach_device
|
||||||
* @dev: valid struct device pointer
|
* @dev: valid struct device pointer
|
||||||
|
* @mapping: io address space mapping structure (returned from
|
||||||
|
* arm_iommu_create_mapping)
|
||||||
*
|
*
|
||||||
* Detaches the provided device from a previously attached map.
|
* Attaches specified io address space mapping to the provided device.
|
||||||
|
* This replaces the dma operations (dma_map_ops pointer) with the
|
||||||
|
* IOMMU aware version.
|
||||||
|
*
|
||||||
|
* More than one client might be attached to the same io address space
|
||||||
|
* mapping.
|
||||||
*/
|
*/
|
||||||
void arm_iommu_detach_device(struct device *dev)
|
int arm_iommu_attach_device(struct device *dev,
|
||||||
|
struct dma_iommu_mapping *mapping)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = __arm_iommu_attach_device(dev, mapping);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
set_dma_ops(dev, &iommu_ops);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
|
||||||
|
|
||||||
|
static void __arm_iommu_detach_device(struct device *dev)
|
||||||
{
|
{
|
||||||
struct dma_iommu_mapping *mapping;
|
struct dma_iommu_mapping *mapping;
|
||||||
|
|
||||||
@@ -1989,6 +1999,19 @@ void arm_iommu_detach_device(struct device *dev)
|
|||||||
|
|
||||||
pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));
|
pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* arm_iommu_detach_device
|
||||||
|
* @dev: valid struct device pointer
|
||||||
|
*
|
||||||
|
* Detaches the provided device from a previously attached map.
|
||||||
|
* This voids the dma operations (dma_map_ops pointer)
|
||||||
|
*/
|
||||||
|
void arm_iommu_detach_device(struct device *dev)
|
||||||
|
{
|
||||||
|
__arm_iommu_detach_device(dev);
|
||||||
|
set_dma_ops(dev, NULL);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(arm_iommu_detach_device);
|
EXPORT_SYMBOL_GPL(arm_iommu_detach_device);
|
||||||
|
|
||||||
static struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent)
|
static struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent)
|
||||||
@@ -2011,7 +2034,7 @@ static bool arm_setup_iommu_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arm_iommu_attach_device(dev, mapping)) {
|
if (__arm_iommu_attach_device(dev, mapping)) {
|
||||||
pr_warn("Failed to attached device %s to IOMMU_mapping\n",
|
pr_warn("Failed to attached device %s to IOMMU_mapping\n",
|
||||||
dev_name(dev));
|
dev_name(dev));
|
||||||
arm_iommu_release_mapping(mapping);
|
arm_iommu_release_mapping(mapping);
|
||||||
@@ -2025,7 +2048,7 @@ static void arm_teardown_iommu_dma_ops(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct dma_iommu_mapping *mapping = dev->archdata.mapping;
|
struct dma_iommu_mapping *mapping = dev->archdata.mapping;
|
||||||
|
|
||||||
arm_iommu_detach_device(dev);
|
__arm_iommu_detach_device(dev);
|
||||||
arm_iommu_release_mapping(mapping);
|
arm_iommu_release_mapping(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -85,6 +85,7 @@ vdso_install:
|
|||||||
# We use MRPROPER_FILES and CLEAN_FILES now
|
# We use MRPROPER_FILES and CLEAN_FILES now
|
||||||
archclean:
|
archclean:
|
||||||
$(Q)$(MAKE) $(clean)=$(boot)
|
$(Q)$(MAKE) $(clean)=$(boot)
|
||||||
|
$(Q)$(MAKE) $(clean)=$(boot)/dts
|
||||||
|
|
||||||
define archhelp
|
define archhelp
|
||||||
echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
|
echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
|
||||||
|
@@ -3,6 +3,4 @@ dts-dirs += apm
|
|||||||
dts-dirs += arm
|
dts-dirs += arm
|
||||||
dts-dirs += cavium
|
dts-dirs += cavium
|
||||||
|
|
||||||
always := $(dtb-y)
|
|
||||||
subdir-y := $(dts-dirs)
|
subdir-y := $(dts-dirs)
|
||||||
clean-files := *.dtb
|
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
stdout-path = &soc_uart0;
|
stdout-path = "serial0:115200n8";
|
||||||
};
|
};
|
||||||
|
|
||||||
psci {
|
psci {
|
||||||
|
@@ -45,6 +45,16 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
|
|||||||
vcpu->arch.hcr_el2 &= ~HCR_RW;
|
vcpu->arch.hcr_el2 &= ~HCR_RW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long vcpu_get_hcr(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return vcpu->arch.hcr_el2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void vcpu_set_hcr(struct kvm_vcpu *vcpu, unsigned long hcr)
|
||||||
|
{
|
||||||
|
vcpu->arch.hcr_el2 = hcr;
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu)
|
static inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pc;
|
return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pc;
|
||||||
|
@@ -116,9 +116,6 @@ struct kvm_vcpu_arch {
|
|||||||
* Anything that is not used directly from assembly code goes
|
* Anything that is not used directly from assembly code goes
|
||||||
* here.
|
* here.
|
||||||
*/
|
*/
|
||||||
/* dcache set/way operation pending */
|
|
||||||
int last_pcpu;
|
|
||||||
cpumask_t require_dcache_flush;
|
|
||||||
|
|
||||||
/* Don't run the guest */
|
/* Don't run the guest */
|
||||||
bool pause;
|
bool pause;
|
||||||
|
@@ -243,24 +243,46 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu)
|
|||||||
return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101;
|
return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva,
|
static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn,
|
||||||
unsigned long size,
|
unsigned long size,
|
||||||
bool ipa_uncached)
|
bool ipa_uncached)
|
||||||
{
|
{
|
||||||
|
void *va = page_address(pfn_to_page(pfn));
|
||||||
|
|
||||||
if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached)
|
if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached)
|
||||||
kvm_flush_dcache_to_poc((void *)hva, size);
|
kvm_flush_dcache_to_poc(va, size);
|
||||||
|
|
||||||
if (!icache_is_aliasing()) { /* PIPT */
|
if (!icache_is_aliasing()) { /* PIPT */
|
||||||
flush_icache_range(hva, hva + size);
|
flush_icache_range((unsigned long)va,
|
||||||
|
(unsigned long)va + size);
|
||||||
} else if (!icache_is_aivivt()) { /* non ASID-tagged VIVT */
|
} else if (!icache_is_aivivt()) { /* non ASID-tagged VIVT */
|
||||||
/* any kind of VIPT cache */
|
/* any kind of VIPT cache */
|
||||||
__flush_icache_all();
|
__flush_icache_all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_flush_dcache_pte(pte_t pte)
|
||||||
|
{
|
||||||
|
struct page *page = pte_page(pte);
|
||||||
|
kvm_flush_dcache_to_poc(page_address(page), PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_flush_dcache_pmd(pmd_t pmd)
|
||||||
|
{
|
||||||
|
struct page *page = pmd_page(pmd);
|
||||||
|
kvm_flush_dcache_to_poc(page_address(page), PMD_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_flush_dcache_pud(pud_t pud)
|
||||||
|
{
|
||||||
|
struct page *page = pud_page(pud);
|
||||||
|
kvm_flush_dcache_to_poc(page_address(page), PUD_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
#define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x))
|
#define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x))
|
||||||
|
|
||||||
void stage2_flush_vm(struct kvm *kvm);
|
void kvm_set_way_flush(struct kvm_vcpu *vcpu);
|
||||||
|
void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled);
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
#endif /* __ARM64_KVM_MMU_H__ */
|
#endif /* __ARM64_KVM_MMU_H__ */
|
||||||
|
@@ -69,68 +69,31 @@ static u32 get_ccsidr(u32 csselr)
|
|||||||
return ccsidr;
|
return ccsidr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_dc_cisw(u32 val)
|
/*
|
||||||
{
|
* See note at ARMv7 ARM B1.14.4 (TL;DR: S/W ops are not easily virtualized).
|
||||||
asm volatile("dc cisw, %x0" : : "r" (val));
|
*/
|
||||||
dsb(ish);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_dc_csw(u32 val)
|
|
||||||
{
|
|
||||||
asm volatile("dc csw, %x0" : : "r" (val));
|
|
||||||
dsb(ish);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See note at ARM ARM B1.14.4 */
|
|
||||||
static bool access_dcsw(struct kvm_vcpu *vcpu,
|
static bool access_dcsw(struct kvm_vcpu *vcpu,
|
||||||
const struct sys_reg_params *p,
|
const struct sys_reg_params *p,
|
||||||
const struct sys_reg_desc *r)
|
const struct sys_reg_desc *r)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
if (!p->is_write)
|
if (!p->is_write)
|
||||||
return read_from_write_only(vcpu, p);
|
return read_from_write_only(vcpu, p);
|
||||||
|
|
||||||
cpu = get_cpu();
|
kvm_set_way_flush(vcpu);
|
||||||
|
|
||||||
cpumask_setall(&vcpu->arch.require_dcache_flush);
|
|
||||||
cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush);
|
|
||||||
|
|
||||||
/* If we were already preempted, take the long way around */
|
|
||||||
if (cpu != vcpu->arch.last_pcpu) {
|
|
||||||
flush_cache_all();
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
val = *vcpu_reg(vcpu, p->Rt);
|
|
||||||
|
|
||||||
switch (p->CRm) {
|
|
||||||
case 6: /* Upgrade DCISW to DCCISW, as per HCR.SWIO */
|
|
||||||
case 14: /* DCCISW */
|
|
||||||
do_dc_cisw(val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10: /* DCCSW */
|
|
||||||
do_dc_csw(val);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
put_cpu();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic accessor for VM registers. Only called as long as HCR_TVM
|
* Generic accessor for VM registers. Only called as long as HCR_TVM
|
||||||
* is set.
|
* is set. If the guest enables the MMU, we stop trapping the VM
|
||||||
|
* sys_regs and leave it in complete control of the caches.
|
||||||
*/
|
*/
|
||||||
static bool access_vm_reg(struct kvm_vcpu *vcpu,
|
static bool access_vm_reg(struct kvm_vcpu *vcpu,
|
||||||
const struct sys_reg_params *p,
|
const struct sys_reg_params *p,
|
||||||
const struct sys_reg_desc *r)
|
const struct sys_reg_desc *r)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
bool was_enabled = vcpu_has_cache_enabled(vcpu);
|
||||||
|
|
||||||
BUG_ON(!p->is_write);
|
BUG_ON(!p->is_write);
|
||||||
|
|
||||||
@@ -143,25 +106,7 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu,
|
|||||||
vcpu_cp15_64_low(vcpu, r->reg) = val & 0xffffffffUL;
|
vcpu_cp15_64_low(vcpu, r->reg) = val & 0xffffffffUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
kvm_toggle_cache(vcpu, was_enabled);
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SCTLR_EL1 accessor. Only called as long as HCR_TVM is set. If the
|
|
||||||
* guest enables the MMU, we stop trapping the VM sys_regs and leave
|
|
||||||
* it in complete control of the caches.
|
|
||||||
*/
|
|
||||||
static bool access_sctlr(struct kvm_vcpu *vcpu,
|
|
||||||
const struct sys_reg_params *p,
|
|
||||||
const struct sys_reg_desc *r)
|
|
||||||
{
|
|
||||||
access_vm_reg(vcpu, p, r);
|
|
||||||
|
|
||||||
if (vcpu_has_cache_enabled(vcpu)) { /* MMU+Caches enabled? */
|
|
||||||
vcpu->arch.hcr_el2 &= ~HCR_TVM;
|
|
||||||
stage2_flush_vm(vcpu->kvm);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,7 +322,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
|||||||
NULL, reset_mpidr, MPIDR_EL1 },
|
NULL, reset_mpidr, MPIDR_EL1 },
|
||||||
/* SCTLR_EL1 */
|
/* SCTLR_EL1 */
|
||||||
{ Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000),
|
{ Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000),
|
||||||
access_sctlr, reset_val, SCTLR_EL1, 0x00C50078 },
|
access_vm_reg, reset_val, SCTLR_EL1, 0x00C50078 },
|
||||||
/* CPACR_EL1 */
|
/* CPACR_EL1 */
|
||||||
{ Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b010),
|
{ Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b010),
|
||||||
NULL, reset_val, CPACR_EL1, 0 },
|
NULL, reset_val, CPACR_EL1, 0 },
|
||||||
@@ -657,7 +602,7 @@ static const struct sys_reg_desc cp14_64_regs[] = {
|
|||||||
* register).
|
* register).
|
||||||
*/
|
*/
|
||||||
static const struct sys_reg_desc cp15_regs[] = {
|
static const struct sys_reg_desc cp15_regs[] = {
|
||||||
{ Op1( 0), CRn( 1), CRm( 0), Op2( 0), access_sctlr, NULL, c1_SCTLR },
|
{ Op1( 0), CRn( 1), CRm( 0), Op2( 0), access_vm_reg, NULL, c1_SCTLR },
|
||||||
{ Op1( 0), CRn( 2), CRm( 0), Op2( 0), access_vm_reg, NULL, c2_TTBR0 },
|
{ Op1( 0), CRn( 2), CRm( 0), Op2( 0), access_vm_reg, NULL, c2_TTBR0 },
|
||||||
{ Op1( 0), CRn( 2), CRm( 0), Op2( 1), access_vm_reg, NULL, c2_TTBR1 },
|
{ Op1( 0), CRn( 2), CRm( 0), Op2( 1), access_vm_reg, NULL, c2_TTBR1 },
|
||||||
{ Op1( 0), CRn( 2), CRm( 0), Op2( 2), access_vm_reg, NULL, c2_TTBCR },
|
{ Op1( 0), CRn( 2), CRm( 0), Op2( 2), access_vm_reg, NULL, c2_TTBCR },
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <linux/io.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
@@ -19,12 +19,10 @@
|
|||||||
#include <linux/moduleloader.h>
|
#include <linux/moduleloader.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
void module_free(struct module *mod, void *module_region)
|
void module_arch_freeing_init(struct module *mod)
|
||||||
{
|
{
|
||||||
vfree(mod->arch.syminfo);
|
vfree(mod->arch.syminfo);
|
||||||
mod->arch.syminfo = NULL;
|
mod->arch.syminfo = NULL;
|
||||||
|
|
||||||
vfree(module_region);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int check_rela(Elf32_Rela *rela, struct module *module,
|
static inline int check_rela(Elf32_Rela *rela, struct module *module,
|
||||||
@@ -291,12 +289,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
|
|
||||||
struct module *module)
|
|
||||||
{
|
|
||||||
vfree(module->arch.syminfo);
|
|
||||||
module->arch.syminfo = NULL;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
@@ -142,6 +142,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -604,7 +604,7 @@ static ssize_t __sync_serial_read(struct file *file,
|
|||||||
struct timespec *ts)
|
struct timespec *ts)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int dev = MINOR(file->f_dentry->d_inode->i_rdev);
|
int dev = MINOR(file_inode(file)->i_rdev);
|
||||||
int avail;
|
int avail;
|
||||||
struct sync_port *port;
|
struct sync_port *port;
|
||||||
unsigned char *start;
|
unsigned char *start;
|
||||||
|
@@ -36,7 +36,7 @@ void *module_alloc(unsigned long size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free memory returned from module_alloc */
|
/* Free memory returned from module_alloc */
|
||||||
void module_free(struct module *mod, void *module_region)
|
void module_memfree(void *module_region)
|
||||||
{
|
{
|
||||||
kfree(module_region);
|
kfree(module_region);
|
||||||
}
|
}
|
||||||
|
@@ -176,6 +176,8 @@ retry:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -94,7 +94,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
|
|||||||
r = &dev->resource[idx];
|
r = &dev->resource[idx];
|
||||||
if (!r->start)
|
if (!r->start)
|
||||||
continue;
|
continue;
|
||||||
pci_claim_resource(dev, idx);
|
pci_claim_bridge_resource(dev, idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pcibios_allocate_bus_resources(&bus->children);
|
pcibios_allocate_bus_resources(&bus->children);
|
||||||
|
@@ -168,6 +168,8 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -305,14 +305,12 @@ plt_target (struct plt_entry *plt)
|
|||||||
#endif /* !USE_BRL */
|
#endif /* !USE_BRL */
|
||||||
|
|
||||||
void
|
void
|
||||||
module_free (struct module *mod, void *module_region)
|
module_arch_freeing_init (struct module *mod)
|
||||||
{
|
{
|
||||||
if (mod && mod->arch.init_unw_table &&
|
if (mod->arch.init_unw_table) {
|
||||||
module_region == mod->module_init) {
|
|
||||||
unw_remove_unwind_table(mod->arch.init_unw_table);
|
unw_remove_unwind_table(mod->arch.init_unw_table);
|
||||||
mod->arch.init_unw_table = NULL;
|
mod->arch.init_unw_table = NULL;
|
||||||
}
|
}
|
||||||
vfree(module_region);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Have we already seen one of these relocations? */
|
/* Have we already seen one of these relocations? */
|
||||||
|
@@ -172,6 +172,8 @@ retry:
|
|||||||
*/
|
*/
|
||||||
if (fault & VM_FAULT_OOM) {
|
if (fault & VM_FAULT_OOM) {
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
} else if (fault & VM_FAULT_SIGSEGV) {
|
||||||
|
goto bad_area;
|
||||||
} else if (fault & VM_FAULT_SIGBUS) {
|
} else if (fault & VM_FAULT_SIGBUS) {
|
||||||
signal = SIGBUS;
|
signal = SIGBUS;
|
||||||
goto bad_area;
|
goto bad_area;
|
||||||
|
@@ -487,45 +487,39 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_valid_resource(struct pci_dev *dev, int idx)
|
|
||||||
{
|
|
||||||
unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
|
||||||
struct resource *devr = &dev->resource[idx], *busr;
|
|
||||||
|
|
||||||
if (!dev->bus)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pci_bus_for_each_resource(dev->bus, busr, i) {
|
|
||||||
if (!busr || ((busr->flags ^ devr->flags) & type_mask))
|
|
||||||
continue;
|
|
||||||
if ((devr->start) && (devr->start >= busr->start) &&
|
|
||||||
(devr->end <= busr->end))
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = start; i < limit; i++) {
|
|
||||||
if (!dev->resource[i].flags)
|
|
||||||
continue;
|
|
||||||
if ((is_valid_resource(dev, i)))
|
|
||||||
pci_claim_resource(dev, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pcibios_fixup_device_resources(struct pci_dev *dev)
|
void pcibios_fixup_device_resources(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES);
|
int idx;
|
||||||
|
|
||||||
|
if (!dev->bus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) {
|
||||||
|
struct resource *r = &dev->resource[idx];
|
||||||
|
|
||||||
|
if (!r->flags || r->parent || !r->start)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_claim_resource(dev, idx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources);
|
EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources);
|
||||||
|
|
||||||
static void pcibios_fixup_bridge_resources(struct pci_dev *dev)
|
static void pcibios_fixup_bridge_resources(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES);
|
int idx;
|
||||||
|
|
||||||
|
if (!dev->bus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
|
||||||
|
struct resource *r = &dev->resource[idx];
|
||||||
|
|
||||||
|
if (!r->flags || r->parent || !r->start)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_claim_bridge_resource(dev, idx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -200,6 +200,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -145,6 +145,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto map_err;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto bus_err;
|
goto bus_err;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -141,6 +141,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -224,6 +224,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -1026,6 +1026,8 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus)
|
|||||||
pr, (pr && pr->name) ? pr->name : "nil");
|
pr, (pr && pr->name) ? pr->name : "nil");
|
||||||
|
|
||||||
if (pr && !(pr->flags & IORESOURCE_UNSET)) {
|
if (pr && !(pr->flags & IORESOURCE_UNSET)) {
|
||||||
|
struct pci_dev *dev = bus->self;
|
||||||
|
|
||||||
if (request_resource(pr, res) == 0)
|
if (request_resource(pr, res) == 0)
|
||||||
continue;
|
continue;
|
||||||
/*
|
/*
|
||||||
@@ -1035,6 +1037,12 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus)
|
|||||||
*/
|
*/
|
||||||
if (reparent_resources(pr, res) == 0)
|
if (reparent_resources(pr, res) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (dev && i < PCI_BRIDGE_RESOURCE_NUM &&
|
||||||
|
pci_claim_bridge_resource(dev,
|
||||||
|
i + PCI_BRIDGE_RESOURCES) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
pr_warn("PCI: Cannot allocate resource region ");
|
pr_warn("PCI: Cannot allocate resource region ");
|
||||||
pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number);
|
pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number);
|
||||||
@@ -1227,7 +1235,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus)
|
|||||||
(unsigned long long)r->end,
|
(unsigned long long)r->end,
|
||||||
(unsigned int)r->flags);
|
(unsigned int)r->flags);
|
||||||
|
|
||||||
pci_claim_resource(dev, i);
|
if (pci_claim_resource(dev, i) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_claim_bridge_resource(dev, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -158,6 +158,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -1388,7 +1388,7 @@ out:
|
|||||||
void bpf_jit_free(struct bpf_prog *fp)
|
void bpf_jit_free(struct bpf_prog *fp)
|
||||||
{
|
{
|
||||||
if (fp->jited)
|
if (fp->jited)
|
||||||
module_free(NULL, fp->bpf_func);
|
module_memfree(fp->bpf_func);
|
||||||
|
|
||||||
bpf_prog_unlock_free(fp);
|
bpf_prog_unlock_free(fp);
|
||||||
}
|
}
|
||||||
|
@@ -262,6 +262,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -106,7 +106,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
|
|||||||
if (!r->flags)
|
if (!r->flags)
|
||||||
continue;
|
continue;
|
||||||
if (!r->start ||
|
if (!r->start ||
|
||||||
pci_claim_resource(dev, idx) < 0) {
|
pci_claim_bridge_resource(dev, idx) < 0) {
|
||||||
printk(KERN_ERR "PCI:"
|
printk(KERN_ERR "PCI:"
|
||||||
" Cannot allocate resource"
|
" Cannot allocate resource"
|
||||||
" region %d of bridge %s\n",
|
" region %d of bridge %s\n",
|
||||||
|
@@ -281,42 +281,37 @@ static int __init pci_check_direct(void)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_valid_resource(struct pci_dev *dev, int idx)
|
|
||||||
{
|
|
||||||
unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
|
||||||
struct resource *devr = &dev->resource[idx], *busr;
|
|
||||||
|
|
||||||
if (dev->bus) {
|
|
||||||
pci_bus_for_each_resource(dev->bus, busr, i) {
|
|
||||||
if (!busr || (busr->flags ^ devr->flags) & type_mask)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (devr->start &&
|
|
||||||
devr->start >= busr->start &&
|
|
||||||
devr->end <= busr->end)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pcibios_fixup_device_resources(struct pci_dev *dev)
|
static void pcibios_fixup_device_resources(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
int limit, i;
|
int idx;
|
||||||
|
|
||||||
if (dev->bus->number != 0)
|
if (!dev->bus)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
limit = (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) ?
|
for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) {
|
||||||
PCI_BRIDGE_RESOURCES : PCI_NUM_RESOURCES;
|
struct resource *r = &dev->resource[idx];
|
||||||
|
|
||||||
for (i = 0; i < limit; i++) {
|
if (!r->flags || r->parent || !r->start)
|
||||||
if (!dev->resource[i].flags)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (is_valid_resource(dev, i))
|
pci_claim_resource(dev, idx);
|
||||||
pci_claim_resource(dev, i);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pcibios_fixup_bridge_resources(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
if (!dev->bus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
|
||||||
|
struct resource *r = &dev->resource[idx];
|
||||||
|
|
||||||
|
if (!r->flags || r->parent || !r->start)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_claim_bridge_resource(dev, idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,7 +325,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
|
|||||||
|
|
||||||
if (bus->self) {
|
if (bus->self) {
|
||||||
pci_read_bridge_bases(bus);
|
pci_read_bridge_bases(bus);
|
||||||
pcibios_fixup_device_resources(bus->self);
|
pcibios_fixup_bridge_resources(bus->self);
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(dev, &bus->devices, bus_list)
|
list_for_each_entry(dev, &bus->devices, bus_list)
|
||||||
|
@@ -36,7 +36,7 @@ void *module_alloc(unsigned long size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free memory returned from module_alloc */
|
/* Free memory returned from module_alloc */
|
||||||
void module_free(struct module *mod, void *module_region)
|
void module_memfree(void *module_region)
|
||||||
{
|
{
|
||||||
kfree(module_region);
|
kfree(module_region);
|
||||||
}
|
}
|
||||||
|
@@ -200,7 +200,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
|
|
||||||
/* Set up to return from userspace; jump to fixed address sigreturn
|
/* Set up to return from userspace; jump to fixed address sigreturn
|
||||||
trampoline on kuser page. */
|
trampoline on kuser page. */
|
||||||
regs->ra = (unsigned long) (0x1040);
|
regs->ra = (unsigned long) (0x1044);
|
||||||
|
|
||||||
/* Set up registers for signal handler */
|
/* Set up registers for signal handler */
|
||||||
regs->sp = (unsigned long) frame;
|
regs->sp = (unsigned long) frame;
|
||||||
|
@@ -135,6 +135,8 @@ survive:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -171,6 +171,8 @@ good_area:
|
|||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -298,14 +298,10 @@ static inline unsigned long count_stubs(const Elf_Rela *rela, unsigned long n)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void module_arch_freeing_init(struct module *mod)
|
||||||
/* Free memory returned from module_alloc */
|
|
||||||
void module_free(struct module *mod, void *module_region)
|
|
||||||
{
|
{
|
||||||
kfree(mod->arch.section);
|
kfree(mod->arch.section);
|
||||||
mod->arch.section = NULL;
|
mod->arch.section = NULL;
|
||||||
|
|
||||||
vfree(module_region);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Additional bytes needed in front of individual sections */
|
/* Additional bytes needed in front of individual sections */
|
||||||
|
@@ -256,6 +256,8 @@ good_area:
|
|||||||
*/
|
*/
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & VM_FAULT_SIGBUS)
|
||||||
goto bad_area;
|
goto bad_area;
|
||||||
BUG();
|
BUG();
|
||||||
|
@@ -154,4 +154,5 @@ module_exit(sha1_powerpc_mod_fini);
|
|||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm");
|
MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm");
|
||||||
|
|
||||||
|
MODULE_ALIAS_CRYPTO("sha1");
|
||||||
MODULE_ALIAS_CRYPTO("sha1-powerpc");
|
MODULE_ALIAS_CRYPTO("sha1-powerpc");
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user