mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: net/dsa/slave.c net/dsa/slave.c simply had overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f6d3125fa3
@ -43,7 +43,7 @@ o udev 081 # udevd --version
|
||||
o grub 0.93 # grub --version || grub-install --version
|
||||
o mcelog 0.6 # mcelog --version
|
||||
o iptables 1.4.2 # iptables -V
|
||||
o openssl & libcrypto 1.0.1k # openssl version
|
||||
o openssl & libcrypto 1.0.0 # openssl version
|
||||
|
||||
|
||||
Kernel compilation
|
||||
|
@ -4,8 +4,8 @@ The MISC interrupt controller is a secondary controller for lower priority
|
||||
interrupt.
|
||||
|
||||
Required Properties:
|
||||
- compatible: has to be "qca,<soctype>-cpu-intc", "qca,ar7100-misc-intc"
|
||||
as fallback
|
||||
- compatible: has to be "qca,<soctype>-cpu-intc", "qca,ar7100-misc-intc" or
|
||||
"qca,<soctype>-cpu-intc", "qca,ar7240-misc-intc"
|
||||
- reg: Base address and size of the controllers memory area
|
||||
- interrupt-parent: phandle of the parent interrupt controller.
|
||||
- interrupts: Interrupt specifier for the controllers interrupt.
|
||||
@ -13,6 +13,9 @@ Required Properties:
|
||||
- #interrupt-cells : Specifies the number of cells needed to encode interrupt
|
||||
source, should be 1
|
||||
|
||||
Compatible fallback depends on the SoC. Use ar7100 for ar71xx and ar913x,
|
||||
use ar7240 for all other SoCs.
|
||||
|
||||
Please refer to interrupts.txt in this directory for details of the common
|
||||
Interrupt Controllers bindings used by client devices.
|
||||
|
||||
@ -28,3 +31,16 @@ Example:
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
|
||||
Another example:
|
||||
|
||||
interrupt-controller@18060010 {
|
||||
compatible = "qca,ar9331-misc-intc", qca,ar7240-misc-intc";
|
||||
reg = <0x18060010 0x4>;
|
||||
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <6>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
};
|
||||
|
@ -6,6 +6,7 @@ Required properties:
|
||||
"lsi,zevio-usb"
|
||||
"qcom,ci-hdrc"
|
||||
"chipidea,usb2"
|
||||
"xlnx,zynq-usb-2.20a"
|
||||
- reg: base address and length of the registers
|
||||
- interrupts: interrupt for the USB controller
|
||||
|
||||
|
@ -979,20 +979,45 @@ every time right after the runtime_resume() callback has returned
|
||||
(alternatively, the runtime_suspend() callback will have to check if the
|
||||
device should really be suspended and return -EAGAIN if that is not the case).
|
||||
|
||||
The runtime PM of PCI devices is disabled by default. It is also blocked by
|
||||
pci_pm_init() that runs the pm_runtime_forbid() helper function. If a PCI
|
||||
driver implements the runtime PM callbacks and intends to use the runtime PM
|
||||
framework provided by the PM core and the PCI subsystem, it should enable this
|
||||
feature by executing the pm_runtime_enable() helper function. However, the
|
||||
driver should not call the pm_runtime_allow() helper function unblocking
|
||||
the runtime PM of the device. Instead, it should allow user space or some
|
||||
platform-specific code to do that (user space can do it via sysfs), although
|
||||
once it has called pm_runtime_enable(), it must be prepared to handle the
|
||||
The runtime PM of PCI devices is enabled by default by the PCI core. PCI
|
||||
device drivers do not need to enable it and should not attempt to do so.
|
||||
However, it is blocked by pci_pm_init() that runs the pm_runtime_forbid()
|
||||
helper function. In addition to that, the runtime PM usage counter of
|
||||
each PCI device is incremented by local_pci_probe() before executing the
|
||||
probe callback provided by the device's driver.
|
||||
|
||||
If a PCI driver implements the runtime PM callbacks and intends to use the
|
||||
runtime PM framework provided by the PM core and the PCI subsystem, it needs
|
||||
to decrement the device's runtime PM usage counter in its probe callback
|
||||
function. If it doesn't do that, the counter will always be different from
|
||||
zero for the device and it will never be runtime-suspended. The simplest
|
||||
way to do that is by calling pm_runtime_put_noidle(), but if the driver
|
||||
wants to schedule an autosuspend right away, for example, it may call
|
||||
pm_runtime_put_autosuspend() instead for this purpose. Generally, it
|
||||
just needs to call a function that decrements the devices usage counter
|
||||
from its probe routine to make runtime PM work for the device.
|
||||
|
||||
It is important to remember that the driver's runtime_suspend() callback
|
||||
may be executed right after the usage counter has been decremented, because
|
||||
user space may already have cuased the pm_runtime_allow() helper function
|
||||
unblocking the runtime PM of the device to run via sysfs, so the driver must
|
||||
be prepared to cope with that.
|
||||
|
||||
The driver itself should not call pm_runtime_allow(), though. Instead, it
|
||||
should let user space or some platform-specific code do that (user space can
|
||||
do it via sysfs as stated above), but it must be prepared to handle the
|
||||
runtime PM of the device correctly as soon as pm_runtime_allow() is called
|
||||
(which may happen at any time). [It also is possible that user space causes
|
||||
pm_runtime_allow() to be called via sysfs before the driver is loaded, so in
|
||||
fact the driver has to be prepared to handle the runtime PM of the device as
|
||||
soon as it calls pm_runtime_enable().]
|
||||
(which may happen at any time, even before the driver is loaded).
|
||||
|
||||
When the driver's remove callback runs, it has to balance the decrementation
|
||||
of the device's runtime PM usage counter at the probe time. For this reason,
|
||||
if it has decremented the counter in its probe callback, it must run
|
||||
pm_runtime_get_noresume() in its remove callback. [Since the core carries
|
||||
out a runtime resume of the device and bumps up the device's usage counter
|
||||
before running the driver's remove callback, the runtime PM of the device
|
||||
is effectively disabled for the duration of the remove execution and all
|
||||
runtime PM helper functions incrementing the device's usage counter are
|
||||
then effectively equivalent to pm_runtime_get_noresume().]
|
||||
|
||||
The runtime PM framework works by processing requests to suspend or resume
|
||||
devices, or to check if they are idle (in which cases it is reasonable to
|
||||
|
@ -18,6 +18,7 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#define __SANE_USERSPACE_TYPES__ /* For PPC64, to get LL64 types */
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
|
14
MAINTAINERS
14
MAINTAINERS
@ -615,9 +615,8 @@ F: Documentation/hwmon/fam15h_power
|
||||
F: drivers/hwmon/fam15h_power.c
|
||||
|
||||
AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER
|
||||
M: Thomas Dahlmann <dahlmann.thomas@arcor.de>
|
||||
L: linux-geode@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: drivers/usb/gadget/udc/amd5536udc.*
|
||||
|
||||
AMD GEODE PROCESSOR/CHIPSET SUPPORT
|
||||
@ -3401,7 +3400,6 @@ F: drivers/staging/dgnc/
|
||||
|
||||
DIGI EPCA PCI PRODUCTS
|
||||
M: Lidza Louina <lidza.louina@gmail.com>
|
||||
M: Mark Hounschell <markh@compro.net>
|
||||
M: Daeseok Youn <daeseok.youn@gmail.com>
|
||||
L: driverdev-devel@linuxdriverproject.org
|
||||
S: Maintained
|
||||
@ -5959,7 +5957,7 @@ F: virt/kvm/
|
||||
KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
L: kvm@vger.kernel.org
|
||||
W: http://kvm.qumranet.com
|
||||
W: http://www.linux-kvm.org/
|
||||
S: Maintained
|
||||
F: arch/x86/include/asm/svm.h
|
||||
F: arch/x86/kvm/svm.c
|
||||
@ -5967,7 +5965,7 @@ F: arch/x86/kvm/svm.c
|
||||
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
||||
M: Alexander Graf <agraf@suse.com>
|
||||
L: kvm-ppc@vger.kernel.org
|
||||
W: http://kvm.qumranet.com
|
||||
W: http://www.linux-kvm.org/
|
||||
T: git git://github.com/agraf/linux-2.6.git
|
||||
S: Supported
|
||||
F: arch/powerpc/include/asm/kvm*
|
||||
@ -9916,8 +9914,8 @@ F: drivers/staging/media/lirc/
|
||||
STAGING - LUSTRE PARALLEL FILESYSTEM
|
||||
M: Oleg Drokin <oleg.drokin@intel.com>
|
||||
M: Andreas Dilger <andreas.dilger@intel.com>
|
||||
L: HPDD-discuss@lists.01.org (moderated for non-subscribers)
|
||||
W: http://lustre.opensfs.org/
|
||||
L: lustre-devel@lists.lustre.org (moderated for non-subscribers)
|
||||
W: http://wiki.lustre.org/
|
||||
S: Maintained
|
||||
F: drivers/staging/lustre
|
||||
|
||||
@ -11209,7 +11207,7 @@ F: drivers/vlynq/vlynq.c
|
||||
F: include/linux/vlynq.h
|
||||
|
||||
VME SUBSYSTEM
|
||||
M: Martyn Welch <martyn.welch@ge.com>
|
||||
M: Martyn Welch <martyn@welchs.me.uk>
|
||||
M: Manohar Vanga <manohar.vanga@gmail.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: devel@driverdev.osuosl.org
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME = Hurr durr I'ma sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -252,10 +252,10 @@
|
||||
};
|
||||
|
||||
vdd1_reg: regulator@2 {
|
||||
/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
|
||||
/* VDD_MPU voltage limits 0.95V - 1.325V with +/-4% tolerance */
|
||||
regulator-name = "vdd_mpu";
|
||||
regulator-min-microvolt = <912500>;
|
||||
regulator-max-microvolt = <1312500>;
|
||||
regulator-max-microvolt = <1378000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
@ -98,13 +98,6 @@
|
||||
pinctrl-0 = <&extcon_usb1_pins>;
|
||||
};
|
||||
|
||||
extcon_usb2: extcon_usb2 {
|
||||
compatible = "linux,extcon-usb-gpio";
|
||||
id-gpio = <&gpio7 24 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&extcon_usb2_pins>;
|
||||
};
|
||||
|
||||
hdmi0: connector {
|
||||
compatible = "hdmi-connector";
|
||||
label = "hdmi";
|
||||
@ -326,12 +319,6 @@
|
||||
>;
|
||||
};
|
||||
|
||||
extcon_usb2_pins: extcon_usb2_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x3e8 (PIN_INPUT_PULLUP | MUX_MODE14) /* uart1_ctsn.gpio7_24 */
|
||||
>;
|
||||
};
|
||||
|
||||
tpd12s015_pins: pinmux_tpd12s015_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x3b0 (PIN_OUTPUT | MUX_MODE14) /* gpio7_10 CT_CP_HPD */
|
||||
@ -432,7 +419,7 @@
|
||||
};
|
||||
|
||||
ldo3_reg: ldo3 {
|
||||
/* VDDA_1V8_PHY */
|
||||
/* VDDA_1V8_PHYA */
|
||||
regulator-name = "ldo3";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
@ -440,6 +427,15 @@
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
ldo4_reg: ldo4 {
|
||||
/* VDDA_1V8_PHYB */
|
||||
regulator-name = "ldo4";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
ldo9_reg: ldo9 {
|
||||
/* VDD_RTC */
|
||||
regulator-name = "ldo9";
|
||||
@ -495,6 +491,14 @@
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
};
|
||||
|
||||
extcon_usb2: tps659038_usb {
|
||||
compatible = "ti,palmas-usb-vid";
|
||||
ti,enable-vbus-detection;
|
||||
ti,enable-id-detection;
|
||||
id-gpios = <&gpio7 24 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
tmp102: tmp102@48 {
|
||||
@ -517,7 +521,8 @@
|
||||
mcp_rtc: rtc@6f {
|
||||
compatible = "microchip,mcp7941x";
|
||||
reg = <0x6f>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_EDGE_RISING>; /* IRQ_SYS_1N */
|
||||
interrupts-extended = <&crossbar_mpu GIC_SPI 2 IRQ_TYPE_EDGE_RISING>,
|
||||
<&dra7_pmx_core 0x424>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mcp79410_pins_default>;
|
||||
@ -579,7 +584,6 @@
|
||||
pinctrl-0 = <&mmc1_pins_default>;
|
||||
|
||||
vmmc-supply = <&ldo1_reg>;
|
||||
vmmc_aux-supply = <&vdd_3v3>;
|
||||
bus-width = <4>;
|
||||
cd-gpios = <&gpio6 27 0>; /* gpio 219 */
|
||||
};
|
||||
@ -623,6 +627,14 @@
|
||||
};
|
||||
|
||||
&usb2 {
|
||||
/*
|
||||
* Stand alone usage is peripheral only.
|
||||
* However, with some resistor modifications
|
||||
* this port can be used via expansion connectors
|
||||
* as "host" or "dual-role". If so, provide
|
||||
* the necessary dr_mode override in the expansion
|
||||
* board's DT.
|
||||
*/
|
||||
dr_mode = "peripheral";
|
||||
};
|
||||
|
||||
@ -681,7 +693,7 @@
|
||||
|
||||
&hdmi {
|
||||
status = "ok";
|
||||
vdda-supply = <&ldo3_reg>;
|
||||
vdda-supply = <&ldo4_reg>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&hdmi_pins>;
|
||||
|
@ -19,10 +19,10 @@
|
||||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "mii";
|
||||
phy-mode = "rgmii";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "mii";
|
||||
phy-mode = "rgmii";
|
||||
};
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include "dm814x.dtsi"
|
||||
|
||||
/ {
|
||||
model = "DM8148 EVM";
|
||||
model = "HP t410 Smart Zero Client";
|
||||
compatible = "hp,t410", "ti,dm8148";
|
||||
|
||||
memory {
|
||||
@ -19,10 +19,10 @@
|
||||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "mii";
|
||||
phy-mode = "rgmii";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "mii";
|
||||
phy-mode = "rgmii";
|
||||
};
|
||||
|
@ -181,9 +181,9 @@
|
||||
ti,hwmods = "timer3";
|
||||
};
|
||||
|
||||
control: control@160000 {
|
||||
control: control@140000 {
|
||||
compatible = "ti,dm814-scm", "simple-bus";
|
||||
reg = <0x160000 0x16d000>;
|
||||
reg = <0x140000 0x16d000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x160000 0x16d000>;
|
||||
@ -321,9 +321,9 @@
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
|
||||
phy_sel: cpsw-phy-sel@0x48160650 {
|
||||
phy_sel: cpsw-phy-sel@48140650 {
|
||||
compatible = "ti,am3352-cpsw-phy-sel";
|
||||
reg= <0x48160650 0x4>;
|
||||
reg= <0x48140650 0x4>;
|
||||
reg-names = "gmii-sel";
|
||||
};
|
||||
};
|
||||
|
@ -120,9 +120,10 @@
|
||||
reg = <0x0 0x1400>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x0 0x1400>;
|
||||
|
||||
pbias_regulator: pbias_regulator {
|
||||
compatible = "ti,pbias-omap";
|
||||
compatible = "ti,pbias-dra7", "ti,pbias-omap";
|
||||
reg = <0xe00 0x4>;
|
||||
syscon = <&scm_conf>;
|
||||
pbias_mmc_reg: pbias_mmc_omap5 {
|
||||
@ -1417,7 +1418,7 @@
|
||||
ti,irqs-safe-map = <0>;
|
||||
};
|
||||
|
||||
mac: ethernet@4a100000 {
|
||||
mac: ethernet@48484000 {
|
||||
compatible = "ti,dra7-cpsw","ti,cpsw";
|
||||
ti,hwmods = "gmac";
|
||||
clocks = <&dpll_gmac_ck>, <&gmac_gmii_ref_clk_div>;
|
||||
|
@ -56,6 +56,7 @@
|
||||
reg = <0x270 0x240>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x270 0x240>;
|
||||
|
||||
scm_clocks: clocks {
|
||||
#address-cells = <1>;
|
||||
@ -63,7 +64,7 @@
|
||||
};
|
||||
|
||||
pbias_regulator: pbias_regulator {
|
||||
compatible = "ti,pbias-omap";
|
||||
compatible = "ti,pbias-omap2", "ti,pbias-omap";
|
||||
reg = <0x230 0x4>;
|
||||
syscon = <&scm_conf>;
|
||||
pbias_mmc_reg: pbias_mmc_omap2430 {
|
||||
|
@ -202,7 +202,7 @@
|
||||
|
||||
tfp410_pins: pinmux_tfp410_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x194 (PIN_OUTPUT | MUX_MODE4) /* hdq_sio.gpio_170 */
|
||||
0x196 (PIN_OUTPUT | MUX_MODE4) /* hdq_sio.gpio_170 */
|
||||
>;
|
||||
};
|
||||
|
||||
|
@ -78,12 +78,6 @@
|
||||
>;
|
||||
};
|
||||
|
||||
smsc9221_pins: pinmux_smsc9221_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x1a2 (PIN_INPUT | MUX_MODE4) /* mcspi1_cs2.gpio_176 */
|
||||
>;
|
||||
};
|
||||
|
||||
i2c1_pins: pinmux_i2c1_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x18a (PIN_INPUT | MUX_MODE0) /* i2c1_scl.i2c1_scl */
|
||||
|
@ -156,6 +156,12 @@
|
||||
OMAP3_CORE1_IOPAD(0x217a, PIN_INPUT | MUX_MODE0) /* uart2_rx.uart2_rx */
|
||||
>;
|
||||
};
|
||||
|
||||
smsc9221_pins: pinmux_smsc9221_pins {
|
||||
pinctrl-single,pins = <
|
||||
OMAP3_CORE1_IOPAD(0x21d2, PIN_INPUT | MUX_MODE4) /* mcspi1_cs2.gpio_176 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
&omap3_pmx_core2 {
|
||||
|
@ -113,10 +113,22 @@
|
||||
};
|
||||
|
||||
scm_conf: scm_conf@270 {
|
||||
compatible = "syscon";
|
||||
compatible = "syscon", "simple-bus";
|
||||
reg = <0x270 0x330>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x270 0x330>;
|
||||
|
||||
pbias_regulator: pbias_regulator {
|
||||
compatible = "ti,pbias-omap3", "ti,pbias-omap";
|
||||
reg = <0x2b0 0x4>;
|
||||
syscon = <&scm_conf>;
|
||||
pbias_mmc_reg: pbias_mmc_omap2430 {
|
||||
regulator-name = "pbias_mmc_omap2430";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
};
|
||||
};
|
||||
|
||||
scm_clocks: clocks {
|
||||
#address-cells = <1>;
|
||||
@ -202,17 +214,6 @@
|
||||
dma-requests = <96>;
|
||||
};
|
||||
|
||||
pbias_regulator: pbias_regulator {
|
||||
compatible = "ti,pbias-omap";
|
||||
reg = <0x2b0 0x4>;
|
||||
syscon = <&scm_conf>;
|
||||
pbias_mmc_reg: pbias_mmc_omap2430 {
|
||||
regulator-name = "pbias_mmc_omap2430";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio1: gpio@48310000 {
|
||||
compatible = "ti,omap3-gpio";
|
||||
reg = <0x48310000 0x200>;
|
||||
|
@ -196,9 +196,10 @@
|
||||
reg = <0x5a0 0x170>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x5a0 0x170>;
|
||||
|
||||
pbias_regulator: pbias_regulator {
|
||||
compatible = "ti,pbias-omap";
|
||||
compatible = "ti,pbias-omap4", "ti,pbias-omap";
|
||||
reg = <0x60 0x4>;
|
||||
syscon = <&omap4_padconf_global>;
|
||||
pbias_mmc_reg: pbias_mmc_omap4 {
|
||||
|
@ -174,8 +174,8 @@
|
||||
|
||||
i2c5_pins: pinmux_i2c5_pins {
|
||||
pinctrl-single,pins = <
|
||||
0x184 (PIN_INPUT | MUX_MODE0) /* i2c5_scl */
|
||||
0x186 (PIN_INPUT | MUX_MODE0) /* i2c5_sda */
|
||||
0x186 (PIN_INPUT | MUX_MODE0) /* i2c5_scl */
|
||||
0x188 (PIN_INPUT | MUX_MODE0) /* i2c5_sda */
|
||||
>;
|
||||
};
|
||||
|
||||
|
@ -185,9 +185,10 @@
|
||||
reg = <0x5a0 0xec>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x5a0 0xec>;
|
||||
|
||||
pbias_regulator: pbias_regulator {
|
||||
compatible = "ti,pbias-omap";
|
||||
compatible = "ti,pbias-omap5", "ti,pbias-omap";
|
||||
reg = <0x60 0x4>;
|
||||
syscon = <&omap5_padconf_global>;
|
||||
pbias_mmc_reg: pbias_mmc_omap5 {
|
||||
|
@ -158,6 +158,7 @@
|
||||
};
|
||||
|
||||
&hdmi {
|
||||
ddc-i2c-bus = <&i2c5>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -103,48 +103,46 @@
|
||||
<&clk_s_d0_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 0>;
|
||||
ranges;
|
||||
};
|
||||
|
||||
sti-hdmi@8d04000 {
|
||||
compatible = "st,stih407-hdmi";
|
||||
reg = <0x8d04000 0x1000>;
|
||||
reg-names = "hdmi-reg";
|
||||
interrupts = <GIC_SPI 106 IRQ_TYPE_NONE>;
|
||||
interrupt-names = "irq";
|
||||
clock-names = "pix",
|
||||
"tmds",
|
||||
"phy",
|
||||
"audio",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
sti-hdmi@8d04000 {
|
||||
compatible = "st,stih407-hdmi";
|
||||
reg = <0x8d04000 0x1000>;
|
||||
reg-names = "hdmi-reg";
|
||||
interrupts = <GIC_SPI 106 IRQ_TYPE_NONE>;
|
||||
interrupt-names = "irq";
|
||||
clock-names = "pix",
|
||||
"tmds",
|
||||
"phy",
|
||||
"audio",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_TMDS_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_REF_HDMIPHY>,
|
||||
<&clk_s_d0_flexgen CLK_PCM_0>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_TMDS_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_REF_HDMIPHY>,
|
||||
<&clk_s_d0_flexgen CLK_PCM_0>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
|
||||
hdmi,hpd-gpio = <&pio5 3>;
|
||||
reset-names = "hdmi";
|
||||
resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
|
||||
ddc = <&hdmiddc>;
|
||||
hdmi,hpd-gpio = <&pio5 3>;
|
||||
reset-names = "hdmi";
|
||||
resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
|
||||
ddc = <&hdmiddc>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
sti-hda@8d02000 {
|
||||
compatible = "st,stih407-hda";
|
||||
reg = <0x8d02000 0x400>, <0x92b0120 0x4>;
|
||||
reg-names = "hda-reg", "video-dacs-ctrl";
|
||||
clock-names = "pix",
|
||||
"hddac",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDDAC>,
|
||||
<&clk_s_d2_flexgen CLK_HDDAC>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
};
|
||||
sti-hda@8d02000 {
|
||||
compatible = "st,stih407-hda";
|
||||
reg = <0x8d02000 0x400>, <0x92b0120 0x4>;
|
||||
reg-names = "hda-reg", "video-dacs-ctrl";
|
||||
clock-names = "pix",
|
||||
"hddac",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDDAC>,
|
||||
<&clk_s_d2_flexgen CLK_HDDAC>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -178,48 +178,46 @@
|
||||
<&clk_s_d0_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 0>;
|
||||
ranges;
|
||||
};
|
||||
|
||||
sti-hdmi@8d04000 {
|
||||
compatible = "st,stih407-hdmi";
|
||||
reg = <0x8d04000 0x1000>;
|
||||
reg-names = "hdmi-reg";
|
||||
interrupts = <GIC_SPI 106 IRQ_TYPE_NONE>;
|
||||
interrupt-names = "irq";
|
||||
clock-names = "pix",
|
||||
"tmds",
|
||||
"phy",
|
||||
"audio",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
sti-hdmi@8d04000 {
|
||||
compatible = "st,stih407-hdmi";
|
||||
reg = <0x8d04000 0x1000>;
|
||||
reg-names = "hdmi-reg";
|
||||
interrupts = <GIC_SPI 106 IRQ_TYPE_NONE>;
|
||||
interrupt-names = "irq";
|
||||
clock-names = "pix",
|
||||
"tmds",
|
||||
"phy",
|
||||
"audio",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_TMDS_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_REF_HDMIPHY>,
|
||||
<&clk_s_d0_flexgen CLK_PCM_0>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_TMDS_HDMI>,
|
||||
<&clk_s_d2_flexgen CLK_REF_HDMIPHY>,
|
||||
<&clk_s_d0_flexgen CLK_PCM_0>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
|
||||
hdmi,hpd-gpio = <&pio5 3>;
|
||||
reset-names = "hdmi";
|
||||
resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
|
||||
ddc = <&hdmiddc>;
|
||||
hdmi,hpd-gpio = <&pio5 3>;
|
||||
reset-names = "hdmi";
|
||||
resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
|
||||
ddc = <&hdmiddc>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
sti-hda@8d02000 {
|
||||
compatible = "st,stih407-hda";
|
||||
reg = <0x8d02000 0x400>, <0x92b0120 0x4>;
|
||||
reg-names = "hda-reg", "video-dacs-ctrl";
|
||||
clock-names = "pix",
|
||||
"hddac",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDDAC>,
|
||||
<&clk_s_d2_flexgen CLK_HDDAC>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
};
|
||||
sti-hda@8d02000 {
|
||||
compatible = "st,stih407-hda";
|
||||
reg = <0x8d02000 0x400>, <0x92b0120 0x4>;
|
||||
reg-names = "hda-reg", "video-dacs-ctrl";
|
||||
clock-names = "pix",
|
||||
"hddac",
|
||||
"main_parent",
|
||||
"aux_parent";
|
||||
clocks = <&clk_s_d2_flexgen CLK_PIX_HDDAC>,
|
||||
<&clk_s_d2_flexgen CLK_HDDAC>,
|
||||
<&clk_s_d2_quadfs 0>,
|
||||
<&clk_s_d2_quadfs 1>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -240,7 +240,8 @@ CONFIG_SSI_PROTOCOL=m
|
||||
CONFIG_PINCTRL_SINGLE=y
|
||||
CONFIG_DEBUG_GPIO=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_GPIO_PCF857X=m
|
||||
CONFIG_GPIO_PCA953X=m
|
||||
CONFIG_GPIO_PCF857X=y
|
||||
CONFIG_GPIO_TWL4030=y
|
||||
CONFIG_GPIO_PALMAS=y
|
||||
CONFIG_W1=m
|
||||
@ -350,6 +351,8 @@ CONFIG_USB_MUSB_HDRC=m
|
||||
CONFIG_USB_MUSB_OMAP2PLUS=m
|
||||
CONFIG_USB_MUSB_AM35X=m
|
||||
CONFIG_USB_MUSB_DSPS=m
|
||||
CONFIG_USB_INVENTRA_DMA=y
|
||||
CONFIG_USB_TI_CPPI41_DMA=y
|
||||
CONFIG_USB_DWC3=m
|
||||
CONFIG_USB_TEST=m
|
||||
CONFIG_AM335X_PHY_USB=y
|
||||
|
@ -19,7 +19,7 @@
|
||||
* This may need to be greater than __NR_last_syscall+1 in order to
|
||||
* account for the padding in the syscall table
|
||||
*/
|
||||
#define __NR_syscalls (388)
|
||||
#define __NR_syscalls (392)
|
||||
|
||||
/*
|
||||
* *NOTE*: This is a ghost syscall private to the kernel. Only the
|
||||
|
@ -414,6 +414,8 @@
|
||||
#define __NR_memfd_create (__NR_SYSCALL_BASE+385)
|
||||
#define __NR_bpf (__NR_SYSCALL_BASE+386)
|
||||
#define __NR_execveat (__NR_SYSCALL_BASE+387)
|
||||
#define __NR_userfaultfd (__NR_SYSCALL_BASE+388)
|
||||
#define __NR_membarrier (__NR_SYSCALL_BASE+389)
|
||||
|
||||
/*
|
||||
* The following SWIs are ARM private.
|
||||
|
@ -397,6 +397,8 @@
|
||||
/* 385 */ CALL(sys_memfd_create)
|
||||
CALL(sys_bpf)
|
||||
CALL(sys_execveat)
|
||||
CALL(sys_userfaultfd)
|
||||
CALL(sys_membarrier)
|
||||
#ifndef syscalls_counted
|
||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||
#define syscalls_counted
|
||||
|
@ -44,10 +44,11 @@ config SOC_OMAP5
|
||||
select ARM_CPU_SUSPEND if PM
|
||||
select ARM_GIC
|
||||
select HAVE_ARM_SCU if SMP
|
||||
select HAVE_ARM_TWD if SMP
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select ARM_ERRATA_798181 if SMP
|
||||
select OMAP_INTERCONNECT
|
||||
select OMAP_INTERCONNECT_BARRIER
|
||||
select PM_OPP if PM
|
||||
|
||||
config SOC_AM33XX
|
||||
bool "TI AM33XX"
|
||||
@ -70,10 +71,13 @@ config SOC_DRA7XX
|
||||
select ARCH_OMAP2PLUS
|
||||
select ARM_CPU_SUSPEND if PM
|
||||
select ARM_GIC
|
||||
select HAVE_ARM_SCU if SMP
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select IRQ_CROSSBAR
|
||||
select ARM_ERRATA_798181 if SMP
|
||||
select OMAP_INTERCONNECT
|
||||
select OMAP_INTERCONNECT_BARRIER
|
||||
select PM_OPP if PM
|
||||
|
||||
config ARCH_OMAP2PLUS
|
||||
bool
|
||||
|
@ -20,13 +20,6 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#if !(defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3))
|
||||
#define intc_of_init NULL
|
||||
#endif
|
||||
#ifndef CONFIG_ARCH_OMAP4
|
||||
#define gic_of_init NULL
|
||||
#endif
|
||||
|
||||
static const struct of_device_id omap_dt_match_table[] __initconst = {
|
||||
{ .compatible = "simple-bus", },
|
||||
{ .compatible = "ti,omap-infra", },
|
||||
|
@ -653,8 +653,12 @@ void __init dra7xxx_check_revision(void)
|
||||
omap_revision = DRA752_REV_ES1_0;
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
omap_revision = DRA752_REV_ES1_1;
|
||||
break;
|
||||
case 2:
|
||||
default:
|
||||
omap_revision = DRA752_REV_ES2_0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -674,7 +678,7 @@ void __init dra7xxx_check_revision(void)
|
||||
/* Unknown default to latest silicon rev as default*/
|
||||
pr_warn("%s: unknown idcode=0x%08x (hawkeye=0x%08x,rev=0x%x)\n",
|
||||
__func__, idcode, hawkeye, rev);
|
||||
omap_revision = DRA752_REV_ES1_1;
|
||||
omap_revision = DRA752_REV_ES2_0;
|
||||
}
|
||||
|
||||
sprintf(soc_name, "DRA%03x", omap_rev() >> 16);
|
||||
|
@ -676,6 +676,7 @@ void __init am43xx_init_early(void)
|
||||
void __init am43xx_init_late(void)
|
||||
{
|
||||
omap_common_late_init();
|
||||
omap2_clk_enable_autoidle_all();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -901,7 +901,8 @@ static int __init omap_device_late_idle(struct device *dev, void *data)
|
||||
if (od->hwmods[i]->flags & HWMOD_INIT_NO_IDLE)
|
||||
return 0;
|
||||
|
||||
if (od->_driver_status != BUS_NOTIFY_BOUND_DRIVER) {
|
||||
if (od->_driver_status != BUS_NOTIFY_BOUND_DRIVER &&
|
||||
od->_driver_status != BUS_NOTIFY_BIND_DRIVER) {
|
||||
if (od->_state == OMAP_DEVICE_STATE_ENABLED) {
|
||||
dev_warn(dev, "%s: enabled but no driver. Idling\n",
|
||||
__func__);
|
||||
|
@ -103,7 +103,8 @@ static inline void enable_omap3630_toggle_l2_on_restore(void) { }
|
||||
#define PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD (1 << 0)
|
||||
#define PM_OMAP4_CPU_OSWR_DISABLE (1 << 1)
|
||||
|
||||
#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4)
|
||||
#if defined(CONFIG_PM) && (defined(CONFIG_ARCH_OMAP4) ||\
|
||||
defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX))
|
||||
extern u16 pm44xx_errata;
|
||||
#define IS_PM44XX_ERRATUM(id) (pm44xx_errata & (id))
|
||||
#else
|
||||
|
@ -469,6 +469,8 @@ IS_OMAP_TYPE(3430, 0x3430)
|
||||
#define DRA7XX_CLASS 0x07000000
|
||||
#define DRA752_REV_ES1_0 (DRA7XX_CLASS | (0x52 << 16) | (0x10 << 8))
|
||||
#define DRA752_REV_ES1_1 (DRA7XX_CLASS | (0x52 << 16) | (0x11 << 8))
|
||||
#define DRA752_REV_ES2_0 (DRA7XX_CLASS | (0x52 << 16) | (0x20 << 8))
|
||||
#define DRA722_REV_ES1_0 (DRA7XX_CLASS | (0x22 << 16) | (0x10 << 8))
|
||||
#define DRA722_REV_ES1_0 (DRA7XX_CLASS | (0x22 << 16) | (0x10 << 8))
|
||||
|
||||
void omap2xxx_check_revision(void);
|
||||
|
@ -297,12 +297,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
|
||||
if (IS_ERR(src))
|
||||
return PTR_ERR(src);
|
||||
|
||||
r = clk_set_parent(timer->fclk, src);
|
||||
if (r < 0) {
|
||||
pr_warn("%s: %s cannot set source\n", __func__, oh->name);
|
||||
clk_put(src);
|
||||
return r;
|
||||
}
|
||||
WARN(clk_set_parent(timer->fclk, src) < 0,
|
||||
"Cannot set timer parent clock, no PLL clock driver?");
|
||||
|
||||
clk_put(src);
|
||||
|
||||
|
@ -300,7 +300,7 @@ static void __init omap3_vc_init_pmic_signaling(struct voltagedomain *voltdm)
|
||||
|
||||
val = voltdm->read(OMAP3_PRM_POLCTRL_OFFSET);
|
||||
if (!(val & OMAP3430_PRM_POLCTRL_CLKREQ_POL) ||
|
||||
(val & OMAP3430_PRM_POLCTRL_CLKREQ_POL)) {
|
||||
(val & OMAP3430_PRM_POLCTRL_OFFMODE_POL)) {
|
||||
val |= OMAP3430_PRM_POLCTRL_CLKREQ_POL;
|
||||
val &= ~OMAP3430_PRM_POLCTRL_OFFMODE_POL;
|
||||
pr_debug("PM: fixing sys_clkreq and sys_off_mode polarity to 0x%x\n",
|
||||
|
@ -502,7 +502,7 @@ static void balloon3_irq_handler(struct irq_desc *desc)
|
||||
balloon3_irq_enabled;
|
||||
do {
|
||||
struct irq_data *d = irq_desc_get_irq_data(desc);
|
||||
struct irq_chip *chip = irq_data_get_chip(d);
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
unsigned int irq;
|
||||
|
||||
/* clear useless edge notification */
|
||||
|
@ -43,6 +43,13 @@
|
||||
* 0xf6200000..0xf6201000
|
||||
*/
|
||||
|
||||
/*
|
||||
* DFI Bus for NAND, PXA3xx only
|
||||
*/
|
||||
#define NAND_PHYS 0x43100000
|
||||
#define NAND_VIRT IOMEM(0xf6300000)
|
||||
#define NAND_SIZE 0x00100000
|
||||
|
||||
/*
|
||||
* Internal Memory Controller (PXA27x and later)
|
||||
*/
|
||||
|
@ -47,6 +47,13 @@ extern void __init pxa_dt_irq_init(int (*fn)(struct irq_data *, unsigned int));
|
||||
#define ISRAM_START 0x5c000000
|
||||
#define ISRAM_SIZE SZ_256K
|
||||
|
||||
/*
|
||||
* NAND NFC: DFI bus arbitration subset
|
||||
*/
|
||||
#define NDCR (*(volatile u32 __iomem*)(NAND_VIRT + 0))
|
||||
#define NDCR_ND_ARB_EN (1 << 12)
|
||||
#define NDCR_ND_ARB_CNTL (1 << 19)
|
||||
|
||||
static void __iomem *sram;
|
||||
static unsigned long wakeup_src;
|
||||
|
||||
@ -362,7 +369,12 @@ static struct map_desc pxa3xx_io_desc[] __initdata = {
|
||||
.pfn = __phys_to_pfn(PXA3XX_SMEMC_BASE),
|
||||
.length = SMEMC_SIZE,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
}, {
|
||||
.virtual = (unsigned long)NAND_VIRT,
|
||||
.pfn = __phys_to_pfn(NAND_PHYS),
|
||||
.length = NAND_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
};
|
||||
|
||||
void __init pxa3xx_map_io(void)
|
||||
@ -419,6 +431,13 @@ static int __init pxa3xx_init(void)
|
||||
*/
|
||||
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
|
||||
|
||||
/*
|
||||
* Disable DFI bus arbitration, to prevent a system bus lock if
|
||||
* somebody disables the NAND clock (unused clock) while this
|
||||
* bit remains set.
|
||||
*/
|
||||
NDCR = (NDCR & ~NDCR_ND_ARB_EN) | NDCR_ND_ARB_CNTL;
|
||||
|
||||
if ((ret = pxa_init_dma(IRQ_DMA, 32)))
|
||||
return ret;
|
||||
|
||||
|
@ -365,15 +365,21 @@ do_alignment_ldrhstrh(unsigned long addr, unsigned long instr, struct pt_regs *r
|
||||
user:
|
||||
if (LDST_L_BIT(instr)) {
|
||||
unsigned long val;
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
|
||||
get16t_unaligned_check(val, addr);
|
||||
uaccess_restore(__ua_flags);
|
||||
|
||||
/* signed half-word? */
|
||||
if (instr & 0x40)
|
||||
val = (signed long)((signed short) val);
|
||||
|
||||
regs->uregs[rd] = val;
|
||||
} else
|
||||
} else {
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
put16t_unaligned_check(regs->uregs[rd], addr);
|
||||
uaccess_restore(__ua_flags);
|
||||
}
|
||||
|
||||
return TYPE_LDST;
|
||||
|
||||
@ -420,14 +426,21 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
|
||||
|
||||
user:
|
||||
if (load) {
|
||||
unsigned long val;
|
||||
unsigned long val, val2;
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
|
||||
get32t_unaligned_check(val, addr);
|
||||
get32t_unaligned_check(val2, addr + 4);
|
||||
|
||||
uaccess_restore(__ua_flags);
|
||||
|
||||
regs->uregs[rd] = val;
|
||||
get32t_unaligned_check(val, addr + 4);
|
||||
regs->uregs[rd2] = val;
|
||||
regs->uregs[rd2] = val2;
|
||||
} else {
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
put32t_unaligned_check(regs->uregs[rd], addr);
|
||||
put32t_unaligned_check(regs->uregs[rd2], addr + 4);
|
||||
uaccess_restore(__ua_flags);
|
||||
}
|
||||
|
||||
return TYPE_LDST;
|
||||
@ -458,10 +471,15 @@ do_alignment_ldrstr(unsigned long addr, unsigned long instr, struct pt_regs *reg
|
||||
trans:
|
||||
if (LDST_L_BIT(instr)) {
|
||||
unsigned int val;
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
get32t_unaligned_check(val, addr);
|
||||
uaccess_restore(__ua_flags);
|
||||
regs->uregs[rd] = val;
|
||||
} else
|
||||
} else {
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
put32t_unaligned_check(regs->uregs[rd], addr);
|
||||
uaccess_restore(__ua_flags);
|
||||
}
|
||||
return TYPE_LDST;
|
||||
|
||||
fault:
|
||||
@ -531,6 +549,7 @@ do_alignment_ldmstm(unsigned long addr, unsigned long instr, struct pt_regs *reg
|
||||
#endif
|
||||
|
||||
if (user_mode(regs)) {
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
for (regbits = REGMASK_BITS(instr), rd = 0; regbits;
|
||||
regbits >>= 1, rd += 1)
|
||||
if (regbits & 1) {
|
||||
@ -542,6 +561,7 @@ do_alignment_ldmstm(unsigned long addr, unsigned long instr, struct pt_regs *reg
|
||||
put32t_unaligned_check(regs->uregs[rd], eaddr);
|
||||
eaddr += 4;
|
||||
}
|
||||
uaccess_restore(__ua_flags);
|
||||
} else {
|
||||
for (regbits = REGMASK_BITS(instr), rd = 0; regbits;
|
||||
regbits >>= 1, rd += 1)
|
||||
|
@ -107,7 +107,6 @@ static const struct of_device_id pxa_ssp_of_ids[] = {
|
||||
{ .compatible = "mvrl,pxa168-ssp", .data = (void *) PXA168_SSP },
|
||||
{ .compatible = "mrvl,pxa910-ssp", .data = (void *) PXA910_SSP },
|
||||
{ .compatible = "mrvl,ce4100-ssp", .data = (void *) CE4100_SSP },
|
||||
{ .compatible = "mrvl,lpss-ssp", .data = (void *) LPSS_SSP },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pxa_ssp_of_ids);
|
||||
|
@ -293,8 +293,26 @@ static int __init ath79_misc_intc_of_init(
|
||||
|
||||
return 0;
|
||||
}
|
||||
IRQCHIP_DECLARE(ath79_misc_intc, "qca,ar7100-misc-intc",
|
||||
ath79_misc_intc_of_init);
|
||||
|
||||
static int __init ar7100_misc_intc_of_init(
|
||||
struct device_node *node, struct device_node *parent)
|
||||
{
|
||||
ath79_misc_irq_chip.irq_mask_ack = ar71xx_misc_irq_mask;
|
||||
return ath79_misc_intc_of_init(node, parent);
|
||||
}
|
||||
|
||||
IRQCHIP_DECLARE(ar7100_misc_intc, "qca,ar7100-misc-intc",
|
||||
ar7100_misc_intc_of_init);
|
||||
|
||||
static int __init ar7240_misc_intc_of_init(
|
||||
struct device_node *node, struct device_node *parent)
|
||||
{
|
||||
ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack;
|
||||
return ath79_misc_intc_of_init(node, parent);
|
||||
}
|
||||
|
||||
IRQCHIP_DECLARE(ar7240_misc_intc, "qca,ar7240-misc-intc",
|
||||
ar7240_misc_intc_of_init);
|
||||
|
||||
static int __init ar79_cpu_intc_of_init(
|
||||
struct device_node *node, struct device_node *parent)
|
||||
|
@ -20,6 +20,9 @@
|
||||
#ifndef cpu_has_tlb
|
||||
#define cpu_has_tlb (cpu_data[0].options & MIPS_CPU_TLB)
|
||||
#endif
|
||||
#ifndef cpu_has_ftlb
|
||||
#define cpu_has_ftlb (cpu_data[0].options & MIPS_CPU_FTLB)
|
||||
#endif
|
||||
#ifndef cpu_has_tlbinv
|
||||
#define cpu_has_tlbinv (cpu_data[0].options & MIPS_CPU_TLBINV)
|
||||
#endif
|
||||
|
@ -385,6 +385,7 @@ enum cpu_type_enum {
|
||||
#define MIPS_CPU_CDMM 0x4000000000ull /* CPU has Common Device Memory Map */
|
||||
#define MIPS_CPU_BP_GHIST 0x8000000000ull /* R12K+ Branch Prediction Global History */
|
||||
#define MIPS_CPU_SP 0x10000000000ull /* Small (1KB) page support */
|
||||
#define MIPS_CPU_FTLB 0x20000000000ull /* CPU has Fixed-page-size TLB */
|
||||
|
||||
/*
|
||||
* CPU ASE encodings
|
||||
|
@ -65,6 +65,15 @@ static inline void write_maar_pair(unsigned idx, phys_addr_t lower,
|
||||
back_to_back_c0_hazard();
|
||||
}
|
||||
|
||||
/**
|
||||
* maar_init() - initialise MAARs
|
||||
*
|
||||
* Performs initialisation of MAARs for the current CPU, making use of the
|
||||
* platforms implementation of platform_maar_init where necessary and
|
||||
* duplicating the setup it provides on secondary CPUs.
|
||||
*/
|
||||
extern void maar_init(void);
|
||||
|
||||
/**
|
||||
* struct maar_config - MAAR configuration data
|
||||
* @lower: The lowest address that the MAAR pair will affect. Must be
|
||||
|
@ -194,6 +194,7 @@ BUILD_CM_RW(reg3_mask, MIPS_CM_GCB_OFS + 0xc8)
|
||||
BUILD_CM_R_(gic_status, MIPS_CM_GCB_OFS + 0xd0)
|
||||
BUILD_CM_R_(cpc_status, MIPS_CM_GCB_OFS + 0xf0)
|
||||
BUILD_CM_RW(l2_config, MIPS_CM_GCB_OFS + 0x130)
|
||||
BUILD_CM_RW(sys_config2, MIPS_CM_GCB_OFS + 0x150)
|
||||
|
||||
/* Core Local & Core Other register accessor functions */
|
||||
BUILD_CM_Cx_RW(reset_release, 0x00)
|
||||
@ -316,6 +317,10 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
|
||||
#define CM_GCR_L2_CONFIG_ASSOC_SHF 0
|
||||
#define CM_GCR_L2_CONFIG_ASSOC_MSK (_ULCAST_(0xff) << 0)
|
||||
|
||||
/* GCR_SYS_CONFIG2 register fields */
|
||||
#define CM_GCR_SYS_CONFIG2_MAXVPW_SHF 0
|
||||
#define CM_GCR_SYS_CONFIG2_MAXVPW_MSK (_ULCAST_(0xf) << 0)
|
||||
|
||||
/* GCR_Cx_COHERENCE register fields */
|
||||
#define CM_GCR_Cx_COHERENCE_COHDOMAINEN_SHF 0
|
||||
#define CM_GCR_Cx_COHERENCE_COHDOMAINEN_MSK (_ULCAST_(0xff) << 0)
|
||||
@ -405,4 +410,38 @@ static inline int mips_cm_revision(void)
|
||||
return read_gcr_rev();
|
||||
}
|
||||
|
||||
/**
|
||||
* mips_cm_max_vp_width() - return the width in bits of VP indices
|
||||
*
|
||||
* Return: the width, in bits, of VP indices in fields that combine core & VP
|
||||
* indices.
|
||||
*/
|
||||
static inline unsigned int mips_cm_max_vp_width(void)
|
||||
{
|
||||
extern int smp_num_siblings;
|
||||
|
||||
if (mips_cm_revision() >= CM_REV_CM3)
|
||||
return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW_MSK;
|
||||
|
||||
return smp_num_siblings;
|
||||
}
|
||||
|
||||
/**
|
||||
* mips_cm_vp_id() - calculate the hardware VP ID for a CPU
|
||||
* @cpu: the CPU whose VP ID to calculate
|
||||
*
|
||||
* Hardware such as the GIC uses identifiers for VPs which may not match the
|
||||
* CPU numbers used by Linux. This function calculates the hardware VP
|
||||
* identifier corresponding to a given CPU.
|
||||
*
|
||||
* Return: the VP ID for the CPU.
|
||||
*/
|
||||
static inline unsigned int mips_cm_vp_id(unsigned int cpu)
|
||||
{
|
||||
unsigned int core = cpu_data[cpu].core;
|
||||
unsigned int vp = cpu_vpe_id(&cpu_data[cpu]);
|
||||
|
||||
return (core * mips_cm_max_vp_width()) + vp;
|
||||
}
|
||||
|
||||
#endif /* __MIPS_ASM_MIPS_CM_H__ */
|
||||
|
@ -487,6 +487,8 @@
|
||||
|
||||
/* Bits specific to the MIPS32/64 PRA. */
|
||||
#define MIPS_CONF_MT (_ULCAST_(7) << 7)
|
||||
#define MIPS_CONF_MT_TLB (_ULCAST_(1) << 7)
|
||||
#define MIPS_CONF_MT_FTLB (_ULCAST_(4) << 7)
|
||||
#define MIPS_CONF_AR (_ULCAST_(7) << 10)
|
||||
#define MIPS_CONF_AT (_ULCAST_(3) << 13)
|
||||
#define MIPS_CONF_M (_ULCAST_(1) << 31)
|
||||
|
@ -410,16 +410,18 @@ static int set_ftlb_enable(struct cpuinfo_mips *c, int enable)
|
||||
static inline unsigned int decode_config0(struct cpuinfo_mips *c)
|
||||
{
|
||||
unsigned int config0;
|
||||
int isa;
|
||||
int isa, mt;
|
||||
|
||||
config0 = read_c0_config();
|
||||
|
||||
/*
|
||||
* Look for Standard TLB or Dual VTLB and FTLB
|
||||
*/
|
||||
if ((((config0 & MIPS_CONF_MT) >> 7) == 1) ||
|
||||
(((config0 & MIPS_CONF_MT) >> 7) == 4))
|
||||
mt = config0 & MIPS_CONF_MT;
|
||||
if (mt == MIPS_CONF_MT_TLB)
|
||||
c->options |= MIPS_CPU_TLB;
|
||||
else if (mt == MIPS_CONF_MT_FTLB)
|
||||
c->options |= MIPS_CPU_TLB | MIPS_CPU_FTLB;
|
||||
|
||||
isa = (config0 & MIPS_CONF_AT) >> 13;
|
||||
switch (isa) {
|
||||
@ -559,15 +561,18 @@ static inline unsigned int decode_config4(struct cpuinfo_mips *c)
|
||||
if (cpu_has_tlb) {
|
||||
if (((config4 & MIPS_CONF4_IE) >> 29) == 2)
|
||||
c->options |= MIPS_CPU_TLBINV;
|
||||
|
||||
/*
|
||||
* This is a bit ugly. R6 has dropped that field from
|
||||
* config4 and the only valid configuration is VTLB+FTLB so
|
||||
* set a good value for mmuextdef for that case.
|
||||
* R6 has dropped the MMUExtDef field from config4.
|
||||
* On R6 the fields always describe the FTLB, and only if it is
|
||||
* present according to Config.MT.
|
||||
*/
|
||||
if (cpu_has_mips_r6)
|
||||
if (!cpu_has_mips_r6)
|
||||
mmuextdef = config4 & MIPS_CONF4_MMUEXTDEF;
|
||||
else if (cpu_has_ftlb)
|
||||
mmuextdef = MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT;
|
||||
else
|
||||
mmuextdef = config4 & MIPS_CONF4_MMUEXTDEF;
|
||||
mmuextdef = 0;
|
||||
|
||||
switch (mmuextdef) {
|
||||
case MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT:
|
||||
|
@ -338,7 +338,7 @@ static void __init bootmem_init(void)
|
||||
if (end <= reserved_end)
|
||||
continue;
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
/* mapstart should be after initrd_end */
|
||||
/* Skip zones before initrd and initrd itself */
|
||||
if (initrd_end && end <= (unsigned long)PFN_UP(__pa(initrd_end)))
|
||||
continue;
|
||||
#endif
|
||||
@ -371,6 +371,14 @@ static void __init bootmem_init(void)
|
||||
max_low_pfn = PFN_DOWN(HIGHMEM_START);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
/*
|
||||
* mapstart should be after initrd_end
|
||||
*/
|
||||
if (initrd_end)
|
||||
mapstart = max(mapstart, (unsigned long)PFN_UP(__pa(initrd_end)));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize the boot-time allocator with low memory only.
|
||||
*/
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/maar.h>
|
||||
|
||||
cpumask_t cpu_callin_map; /* Bitmask of started secondaries */
|
||||
|
||||
@ -157,6 +158,7 @@ asmlinkage void start_secondary(void)
|
||||
mips_clockevent_init();
|
||||
mp_ops->init_secondary();
|
||||
cpu_report();
|
||||
maar_init();
|
||||
|
||||
/*
|
||||
* XXX parity protection should be folded in here when it's converted
|
||||
|
@ -64,6 +64,9 @@ void __init prom_init_env(void)
|
||||
}
|
||||
if (memsize == 0)
|
||||
memsize = 256;
|
||||
|
||||
loongson_sysconf.nr_uarts = 1;
|
||||
|
||||
pr_info("memsize=%u, highmemsize=%u\n", memsize, highmemsize);
|
||||
#else
|
||||
struct boot_params *boot_p;
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/maar.h>
|
||||
|
||||
/*
|
||||
* We have up to 8 empty zeroed pages so we can map one of the right colour
|
||||
@ -252,6 +253,119 @@ void __init fixrange_init(unsigned long start, unsigned long end,
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned __weak platform_maar_init(unsigned num_pairs)
|
||||
{
|
||||
struct maar_config cfg[BOOT_MEM_MAP_MAX];
|
||||
unsigned i, num_configured, num_cfg = 0;
|
||||
phys_addr_t skip;
|
||||
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
switch (boot_mem_map.map[i].type) {
|
||||
case BOOT_MEM_RAM:
|
||||
case BOOT_MEM_INIT_RAM:
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
skip = 0x10000 - (boot_mem_map.map[i].addr & 0xffff);
|
||||
|
||||
cfg[num_cfg].lower = boot_mem_map.map[i].addr;
|
||||
cfg[num_cfg].lower += skip;
|
||||
|
||||
cfg[num_cfg].upper = cfg[num_cfg].lower;
|
||||
cfg[num_cfg].upper += boot_mem_map.map[i].size - 1;
|
||||
cfg[num_cfg].upper -= skip;
|
||||
|
||||
cfg[num_cfg].attrs = MIPS_MAAR_S;
|
||||
num_cfg++;
|
||||
}
|
||||
|
||||
num_configured = maar_config(cfg, num_cfg, num_pairs);
|
||||
if (num_configured < num_cfg)
|
||||
pr_warn("Not enough MAAR pairs (%u) for all bootmem regions (%u)\n",
|
||||
num_pairs, num_cfg);
|
||||
|
||||
return num_configured;
|
||||
}
|
||||
|
||||
void maar_init(void)
|
||||
{
|
||||
unsigned num_maars, used, i;
|
||||
phys_addr_t lower, upper, attr;
|
||||
static struct {
|
||||
struct maar_config cfgs[3];
|
||||
unsigned used;
|
||||
} recorded = { { { 0 } }, 0 };
|
||||
|
||||
if (!cpu_has_maar)
|
||||
return;
|
||||
|
||||
/* Detect the number of MAARs */
|
||||
write_c0_maari(~0);
|
||||
back_to_back_c0_hazard();
|
||||
num_maars = read_c0_maari() + 1;
|
||||
|
||||
/* MAARs should be in pairs */
|
||||
WARN_ON(num_maars % 2);
|
||||
|
||||
/* Set MAARs using values we recorded already */
|
||||
if (recorded.used) {
|
||||
used = maar_config(recorded.cfgs, recorded.used, num_maars / 2);
|
||||
BUG_ON(used != recorded.used);
|
||||
} else {
|
||||
/* Configure the required MAARs */
|
||||
used = platform_maar_init(num_maars / 2);
|
||||
}
|
||||
|
||||
/* Disable any further MAARs */
|
||||
for (i = (used * 2); i < num_maars; i++) {
|
||||
write_c0_maari(i);
|
||||
back_to_back_c0_hazard();
|
||||
write_c0_maar(0);
|
||||
back_to_back_c0_hazard();
|
||||
}
|
||||
|
||||
if (recorded.used)
|
||||
return;
|
||||
|
||||
pr_info("MAAR configuration:\n");
|
||||
for (i = 0; i < num_maars; i += 2) {
|
||||
write_c0_maari(i);
|
||||
back_to_back_c0_hazard();
|
||||
upper = read_c0_maar();
|
||||
|
||||
write_c0_maari(i + 1);
|
||||
back_to_back_c0_hazard();
|
||||
lower = read_c0_maar();
|
||||
|
||||
attr = lower & upper;
|
||||
lower = (lower & MIPS_MAAR_ADDR) << 4;
|
||||
upper = ((upper & MIPS_MAAR_ADDR) << 4) | 0xffff;
|
||||
|
||||
pr_info(" [%d]: ", i / 2);
|
||||
if (!(attr & MIPS_MAAR_V)) {
|
||||
pr_cont("disabled\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
pr_cont("%pa-%pa", &lower, &upper);
|
||||
|
||||
if (attr & MIPS_MAAR_S)
|
||||
pr_cont(" speculate");
|
||||
|
||||
pr_cont("\n");
|
||||
|
||||
/* Record the setup for use on secondary CPUs */
|
||||
if (used <= ARRAY_SIZE(recorded.cfgs)) {
|
||||
recorded.cfgs[recorded.used].lower = lower;
|
||||
recorded.cfgs[recorded.used].upper = upper;
|
||||
recorded.cfgs[recorded.used].attrs = attr;
|
||||
recorded.used++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
int page_is_ram(unsigned long pagenr)
|
||||
{
|
||||
@ -334,69 +448,6 @@ static inline void mem_init_free_highmem(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned __weak platform_maar_init(unsigned num_pairs)
|
||||
{
|
||||
struct maar_config cfg[BOOT_MEM_MAP_MAX];
|
||||
unsigned i, num_configured, num_cfg = 0;
|
||||
phys_addr_t skip;
|
||||
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
switch (boot_mem_map.map[i].type) {
|
||||
case BOOT_MEM_RAM:
|
||||
case BOOT_MEM_INIT_RAM:
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
skip = 0x10000 - (boot_mem_map.map[i].addr & 0xffff);
|
||||
|
||||
cfg[num_cfg].lower = boot_mem_map.map[i].addr;
|
||||
cfg[num_cfg].lower += skip;
|
||||
|
||||
cfg[num_cfg].upper = cfg[num_cfg].lower;
|
||||
cfg[num_cfg].upper += boot_mem_map.map[i].size - 1;
|
||||
cfg[num_cfg].upper -= skip;
|
||||
|
||||
cfg[num_cfg].attrs = MIPS_MAAR_S;
|
||||
num_cfg++;
|
||||
}
|
||||
|
||||
num_configured = maar_config(cfg, num_cfg, num_pairs);
|
||||
if (num_configured < num_cfg)
|
||||
pr_warn("Not enough MAAR pairs (%u) for all bootmem regions (%u)\n",
|
||||
num_pairs, num_cfg);
|
||||
|
||||
return num_configured;
|
||||
}
|
||||
|
||||
static void maar_init(void)
|
||||
{
|
||||
unsigned num_maars, used, i;
|
||||
|
||||
if (!cpu_has_maar)
|
||||
return;
|
||||
|
||||
/* Detect the number of MAARs */
|
||||
write_c0_maari(~0);
|
||||
back_to_back_c0_hazard();
|
||||
num_maars = read_c0_maari() + 1;
|
||||
|
||||
/* MAARs should be in pairs */
|
||||
WARN_ON(num_maars % 2);
|
||||
|
||||
/* Configure the required MAARs */
|
||||
used = platform_maar_init(num_maars / 2);
|
||||
|
||||
/* Disable any further MAARs */
|
||||
for (i = (used * 2); i < num_maars; i++) {
|
||||
write_c0_maari(i);
|
||||
back_to_back_c0_hazard();
|
||||
write_c0_maar(0);
|
||||
back_to_back_c0_hazard();
|
||||
}
|
||||
}
|
||||
|
||||
void __init mem_init(void)
|
||||
{
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
|
@ -64,8 +64,20 @@ sk_load_word_positive:
|
||||
PTR_ADDU t1, $r_skb_data, offset
|
||||
lw $r_A, 0(t1)
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
|
||||
wsbh t0, $r_A
|
||||
rotr $r_A, t0, 16
|
||||
# else
|
||||
sll t0, $r_A, 24
|
||||
srl t1, $r_A, 24
|
||||
srl t2, $r_A, 8
|
||||
or t0, t0, t1
|
||||
andi t2, t2, 0xff00
|
||||
andi t1, $r_A, 0xff00
|
||||
or t0, t0, t2
|
||||
sll t1, t1, 8
|
||||
or $r_A, t0, t1
|
||||
# endif
|
||||
#endif
|
||||
jr $r_ra
|
||||
move $r_ret, zero
|
||||
@ -80,8 +92,16 @@ sk_load_half_positive:
|
||||
PTR_ADDU t1, $r_skb_data, offset
|
||||
lh $r_A, 0(t1)
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
|
||||
wsbh t0, $r_A
|
||||
seh $r_A, t0
|
||||
# else
|
||||
sll t0, $r_A, 24
|
||||
andi t1, $r_A, 0xff00
|
||||
sra t0, t0, 16
|
||||
srl t1, t1, 8
|
||||
or $r_A, t0, t1
|
||||
# endif
|
||||
#endif
|
||||
jr $r_ra
|
||||
move $r_ret, zero
|
||||
@ -148,23 +168,47 @@ sk_load_byte_positive:
|
||||
NESTED(bpf_slow_path_word, (6 * SZREG), $r_sp)
|
||||
bpf_slow_path_common(4)
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
|
||||
wsbh t0, $r_s0
|
||||
jr $r_ra
|
||||
rotr $r_A, t0, 16
|
||||
#endif
|
||||
# else
|
||||
sll t0, $r_s0, 24
|
||||
srl t1, $r_s0, 24
|
||||
srl t2, $r_s0, 8
|
||||
or t0, t0, t1
|
||||
andi t2, t2, 0xff00
|
||||
andi t1, $r_s0, 0xff00
|
||||
or t0, t0, t2
|
||||
sll t1, t1, 8
|
||||
jr $r_ra
|
||||
move $r_A, $r_s0
|
||||
or $r_A, t0, t1
|
||||
# endif
|
||||
#else
|
||||
jr $r_ra
|
||||
move $r_A, $r_s0
|
||||
#endif
|
||||
|
||||
END(bpf_slow_path_word)
|
||||
|
||||
NESTED(bpf_slow_path_half, (6 * SZREG), $r_sp)
|
||||
bpf_slow_path_common(2)
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
|
||||
jr $r_ra
|
||||
wsbh $r_A, $r_s0
|
||||
#endif
|
||||
# else
|
||||
sll t0, $r_s0, 8
|
||||
andi t1, $r_s0, 0xff00
|
||||
andi t0, t0, 0xff00
|
||||
srl t1, t1, 8
|
||||
jr $r_ra
|
||||
or $r_A, t0, t1
|
||||
# endif
|
||||
#else
|
||||
jr $r_ra
|
||||
move $r_A, $r_s0
|
||||
#endif
|
||||
|
||||
END(bpf_slow_path_half)
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/usb/tilegx.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
static u64 ehci_dmamask = DMA_BIT_MASK(32);
|
||||
|
@ -1128,7 +1128,18 @@ END(error_exit)
|
||||
|
||||
/* Runs on exception stack */
|
||||
ENTRY(nmi)
|
||||
/*
|
||||
* Fix up the exception frame if we're on Xen.
|
||||
* PARAVIRT_ADJUST_EXCEPTION_FRAME is guaranteed to push at most
|
||||
* one value to the stack on native, so it may clobber the rdx
|
||||
* scratch slot, but it won't clobber any of the important
|
||||
* slots past it.
|
||||
*
|
||||
* Xen is a different story, because the Xen frame itself overlaps
|
||||
* the "NMI executing" variable.
|
||||
*/
|
||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||
|
||||
/*
|
||||
* We allow breakpoints in NMIs. If a breakpoint occurs, then
|
||||
* the iretq it performs will take us out of NMI context.
|
||||
@ -1179,9 +1190,12 @@ ENTRY(nmi)
|
||||
* we don't want to enable interrupts, because then we'll end
|
||||
* up in an awkward situation in which IRQs are on but NMIs
|
||||
* are off.
|
||||
*
|
||||
* We also must not push anything to the stack before switching
|
||||
* stacks lest we corrupt the "NMI executing" variable.
|
||||
*/
|
||||
|
||||
SWAPGS
|
||||
SWAPGS_UNSAFE_STACK
|
||||
cld
|
||||
movq %rsp, %rdx
|
||||
movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
|
||||
|
@ -86,6 +86,7 @@ extern u64 asmlinkage efi_call(void *fp, ...);
|
||||
extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
|
||||
u32 type, u64 attribute);
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
/*
|
||||
* CONFIG_KASAN may redefine memset to __memset. __memset function is present
|
||||
* only in kernel binary. Since the EFI stub linked into a separate binary it
|
||||
@ -95,6 +96,7 @@ extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
|
||||
#undef memcpy
|
||||
#undef memset
|
||||
#undef memmove
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_X86_32 */
|
||||
|
||||
|
@ -141,6 +141,8 @@
|
||||
#define DEBUGCTLMSR_BTS_OFF_USR (1UL << 10)
|
||||
#define DEBUGCTLMSR_FREEZE_LBRS_ON_PMI (1UL << 11)
|
||||
|
||||
#define MSR_PEBS_FRONTEND 0x000003f7
|
||||
|
||||
#define MSR_IA32_POWER_CTL 0x000001fc
|
||||
|
||||
#define MSR_IA32_MC0_CTL 0x00000400
|
||||
|
@ -41,6 +41,7 @@ struct pvclock_wall_clock {
|
||||
|
||||
#define PVCLOCK_TSC_STABLE_BIT (1 << 0)
|
||||
#define PVCLOCK_GUEST_STOPPED (1 << 1)
|
||||
/* PVCLOCK_COUNTS_FROM_ZERO broke ABI and can't be used anymore. */
|
||||
#define PVCLOCK_COUNTS_FROM_ZERO (1 << 2)
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _ASM_X86_PVCLOCK_ABI_H */
|
||||
|
@ -47,6 +47,7 @@ enum extra_reg_type {
|
||||
EXTRA_REG_RSP_1 = 1, /* offcore_response_1 */
|
||||
EXTRA_REG_LBR = 2, /* lbr_select */
|
||||
EXTRA_REG_LDLAT = 3, /* ld_lat_threshold */
|
||||
EXTRA_REG_FE = 4, /* fe_* */
|
||||
|
||||
EXTRA_REG_MAX /* number of entries needed */
|
||||
};
|
||||
|
@ -205,6 +205,11 @@ static struct extra_reg intel_skl_extra_regs[] __read_mostly = {
|
||||
INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0),
|
||||
INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1),
|
||||
INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd),
|
||||
/*
|
||||
* Note the low 8 bits eventsel code is not a continuous field, containing
|
||||
* some #GPing bits. These are masked out.
|
||||
*/
|
||||
INTEL_UEVENT_EXTRA_REG(0x01c6, MSR_PEBS_FRONTEND, 0x7fff17, FE),
|
||||
EVENT_EXTRA_END
|
||||
};
|
||||
|
||||
@ -250,7 +255,7 @@ struct event_constraint intel_bdw_event_constraints[] = {
|
||||
FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
|
||||
FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
|
||||
INTEL_UEVENT_CONSTRAINT(0x148, 0x4), /* L1D_PEND_MISS.PENDING */
|
||||
INTEL_EVENT_CONSTRAINT(0xa3, 0x4), /* CYCLE_ACTIVITY.* */
|
||||
INTEL_UEVENT_CONSTRAINT(0x8a3, 0x4), /* CYCLE_ACTIVITY.CYCLES_L1D_MISS */
|
||||
EVENT_CONSTRAINT_END
|
||||
};
|
||||
|
||||
@ -2891,6 +2896,8 @@ PMU_FORMAT_ATTR(offcore_rsp, "config1:0-63");
|
||||
|
||||
PMU_FORMAT_ATTR(ldlat, "config1:0-15");
|
||||
|
||||
PMU_FORMAT_ATTR(frontend, "config1:0-23");
|
||||
|
||||
static struct attribute *intel_arch3_formats_attr[] = {
|
||||
&format_attr_event.attr,
|
||||
&format_attr_umask.attr,
|
||||
@ -2907,6 +2914,11 @@ static struct attribute *intel_arch3_formats_attr[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute *skl_format_attr[] = {
|
||||
&format_attr_frontend.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static __initconst const struct x86_pmu core_pmu = {
|
||||
.name = "core",
|
||||
.handle_irq = x86_pmu_handle_irq,
|
||||
@ -3516,7 +3528,8 @@ __init int intel_pmu_init(void)
|
||||
|
||||
x86_pmu.hw_config = hsw_hw_config;
|
||||
x86_pmu.get_event_constraints = hsw_get_event_constraints;
|
||||
x86_pmu.cpu_events = hsw_events_attrs;
|
||||
x86_pmu.format_attrs = merge_attr(intel_arch3_formats_attr,
|
||||
skl_format_attr);
|
||||
WARN_ON(!x86_pmu.format_attrs);
|
||||
x86_pmu.cpu_events = hsw_events_attrs;
|
||||
pr_cont("Skylake events, ");
|
||||
|
@ -10,12 +10,12 @@ enum perf_msr_id {
|
||||
PERF_MSR_EVENT_MAX,
|
||||
};
|
||||
|
||||
bool test_aperfmperf(int idx)
|
||||
static bool test_aperfmperf(int idx)
|
||||
{
|
||||
return boot_cpu_has(X86_FEATURE_APERFMPERF);
|
||||
}
|
||||
|
||||
bool test_intel(int idx)
|
||||
static bool test_intel(int idx)
|
||||
{
|
||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
|
||||
boot_cpu_data.x86 != 6)
|
||||
|
@ -41,10 +41,18 @@
|
||||
#include <asm/timer.h>
|
||||
#include <asm/special_insns.h>
|
||||
|
||||
/* nop stub */
|
||||
void _paravirt_nop(void)
|
||||
{
|
||||
}
|
||||
/*
|
||||
* nop stub, which must not clobber anything *including the stack* to
|
||||
* avoid confusing the entry prologues.
|
||||
*/
|
||||
extern void _paravirt_nop(void);
|
||||
asm (".pushsection .entry.text, \"ax\"\n"
|
||||
".global _paravirt_nop\n"
|
||||
"_paravirt_nop:\n\t"
|
||||
"ret\n\t"
|
||||
".size _paravirt_nop, . - _paravirt_nop\n\t"
|
||||
".type _paravirt_nop, @function\n\t"
|
||||
".popsection");
|
||||
|
||||
/* identity function, which can be inlined */
|
||||
u32 _paravirt_ident_32(u32 x)
|
||||
|
@ -514,7 +514,7 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu)
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
if (svm->vmcb->control.next_rip != 0) {
|
||||
WARN_ON(!static_cpu_has(X86_FEATURE_NRIPS));
|
||||
WARN_ON_ONCE(!static_cpu_has(X86_FEATURE_NRIPS));
|
||||
svm->next_rip = svm->vmcb->control.next_rip;
|
||||
}
|
||||
|
||||
@ -866,64 +866,6 @@ static void svm_disable_lbrv(struct vcpu_svm *svm)
|
||||
set_msr_interception(msrpm, MSR_IA32_LASTINTTOIP, 0, 0);
|
||||
}
|
||||
|
||||
#define MTRR_TYPE_UC_MINUS 7
|
||||
#define MTRR2PROTVAL_INVALID 0xff
|
||||
|
||||
static u8 mtrr2protval[8];
|
||||
|
||||
static u8 fallback_mtrr_type(int mtrr)
|
||||
{
|
||||
/*
|
||||
* WT and WP aren't always available in the host PAT. Treat
|
||||
* them as UC and UC- respectively. Everything else should be
|
||||
* there.
|
||||
*/
|
||||
switch (mtrr)
|
||||
{
|
||||
case MTRR_TYPE_WRTHROUGH:
|
||||
return MTRR_TYPE_UNCACHABLE;
|
||||
case MTRR_TYPE_WRPROT:
|
||||
return MTRR_TYPE_UC_MINUS;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
static void build_mtrr2protval(void)
|
||||
{
|
||||
int i;
|
||||
u64 pat;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
mtrr2protval[i] = MTRR2PROTVAL_INVALID;
|
||||
|
||||
/* Ignore the invalid MTRR types. */
|
||||
mtrr2protval[2] = 0;
|
||||
mtrr2protval[3] = 0;
|
||||
|
||||
/*
|
||||
* Use host PAT value to figure out the mapping from guest MTRR
|
||||
* values to nested page table PAT/PCD/PWT values. We do not
|
||||
* want to change the host PAT value every time we enter the
|
||||
* guest.
|
||||
*/
|
||||
rdmsrl(MSR_IA32_CR_PAT, pat);
|
||||
for (i = 0; i < 8; i++) {
|
||||
u8 mtrr = pat >> (8 * i);
|
||||
|
||||
if (mtrr2protval[mtrr] == MTRR2PROTVAL_INVALID)
|
||||
mtrr2protval[mtrr] = __cm_idx2pte(i);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (mtrr2protval[i] == MTRR2PROTVAL_INVALID) {
|
||||
u8 fallback = fallback_mtrr_type(i);
|
||||
mtrr2protval[i] = mtrr2protval[fallback];
|
||||
BUG_ON(mtrr2protval[i] == MTRR2PROTVAL_INVALID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static __init int svm_hardware_setup(void)
|
||||
{
|
||||
int cpu;
|
||||
@ -990,7 +932,6 @@ static __init int svm_hardware_setup(void)
|
||||
} else
|
||||
kvm_disable_tdp();
|
||||
|
||||
build_mtrr2protval();
|
||||
return 0;
|
||||
|
||||
err:
|
||||
@ -1145,43 +1086,6 @@ static u64 svm_compute_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc)
|
||||
return target_tsc - tsc;
|
||||
}
|
||||
|
||||
static void svm_set_guest_pat(struct vcpu_svm *svm, u64 *g_pat)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = &svm->vcpu;
|
||||
|
||||
/* Unlike Intel, AMD takes the guest's CR0.CD into account.
|
||||
*
|
||||
* AMD does not have IPAT. To emulate it for the case of guests
|
||||
* with no assigned devices, just set everything to WB. If guests
|
||||
* have assigned devices, however, we cannot force WB for RAM
|
||||
* pages only, so use the guest PAT directly.
|
||||
*/
|
||||
if (!kvm_arch_has_assigned_device(vcpu->kvm))
|
||||
*g_pat = 0x0606060606060606;
|
||||
else
|
||||
*g_pat = vcpu->arch.pat;
|
||||
}
|
||||
|
||||
static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
|
||||
{
|
||||
u8 mtrr;
|
||||
|
||||
/*
|
||||
* 1. MMIO: trust guest MTRR, so same as item 3.
|
||||
* 2. No passthrough: always map as WB, and force guest PAT to WB as well
|
||||
* 3. Passthrough: can't guarantee the result, try to trust guest.
|
||||
*/
|
||||
if (!is_mmio && !kvm_arch_has_assigned_device(vcpu->kvm))
|
||||
return 0;
|
||||
|
||||
if (!kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_CD_NW_CLEARED) &&
|
||||
kvm_read_cr0(vcpu) & X86_CR0_CD)
|
||||
return _PAGE_NOCACHE;
|
||||
|
||||
mtrr = kvm_mtrr_get_guest_memory_type(vcpu, gfn);
|
||||
return mtrr2protval[mtrr];
|
||||
}
|
||||
|
||||
static void init_vmcb(struct vcpu_svm *svm, bool init_event)
|
||||
{
|
||||
struct vmcb_control_area *control = &svm->vmcb->control;
|
||||
@ -1278,7 +1182,6 @@ static void init_vmcb(struct vcpu_svm *svm, bool init_event)
|
||||
clr_cr_intercept(svm, INTERCEPT_CR3_READ);
|
||||
clr_cr_intercept(svm, INTERCEPT_CR3_WRITE);
|
||||
save->g_pat = svm->vcpu.arch.pat;
|
||||
svm_set_guest_pat(svm, &save->g_pat);
|
||||
save->cr3 = 0;
|
||||
save->cr4 = 0;
|
||||
}
|
||||
@ -1673,10 +1576,13 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
|
||||
|
||||
if (!vcpu->fpu_active)
|
||||
cr0 |= X86_CR0_TS;
|
||||
|
||||
/* These are emulated via page tables. */
|
||||
cr0 &= ~(X86_CR0_CD | X86_CR0_NW);
|
||||
|
||||
/*
|
||||
* re-enable caching here because the QEMU bios
|
||||
* does not do it - this results in some delay at
|
||||
* reboot
|
||||
*/
|
||||
if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_CD_NW_CLEARED))
|
||||
cr0 &= ~(X86_CR0_CD | X86_CR0_NW);
|
||||
svm->vmcb->save.cr0 = cr0;
|
||||
mark_dirty(svm->vmcb, VMCB_CR);
|
||||
update_cr0_intercept(svm);
|
||||
@ -3351,16 +3257,6 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
||||
case MSR_VM_IGNNE:
|
||||
vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data);
|
||||
break;
|
||||
case MSR_IA32_CR_PAT:
|
||||
if (npt_enabled) {
|
||||
if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
|
||||
return 1;
|
||||
vcpu->arch.pat = data;
|
||||
svm_set_guest_pat(svm, &svm->vmcb->save.g_pat);
|
||||
mark_dirty(svm->vmcb, VMCB_NPT);
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
return kvm_set_msr_common(vcpu, msr);
|
||||
}
|
||||
@ -4195,6 +4091,11 @@ static bool svm_has_high_real_mode_segbase(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void svm_cpuid_update(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
}
|
||||
|
@ -8617,17 +8617,22 @@ static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
|
||||
u64 ipat = 0;
|
||||
|
||||
/* For VT-d and EPT combination
|
||||
* 1. MMIO: guest may want to apply WC, trust it.
|
||||
* 1. MMIO: always map as UC
|
||||
* 2. EPT with VT-d:
|
||||
* a. VT-d without snooping control feature: can't guarantee the
|
||||
* result, try to trust guest. So the same as item 1.
|
||||
* result, try to trust guest.
|
||||
* b. VT-d with snooping control feature: snooping control feature of
|
||||
* VT-d engine can guarantee the cache correctness. Just set it
|
||||
* to WB to keep consistent with host. So the same as item 3.
|
||||
* 3. EPT without VT-d: always map as WB and set IPAT=1 to keep
|
||||
* consistent with host MTRR
|
||||
*/
|
||||
if (!is_mmio && !kvm_arch_has_noncoherent_dma(vcpu->kvm)) {
|
||||
if (is_mmio) {
|
||||
cache = MTRR_TYPE_UNCACHABLE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!kvm_arch_has_noncoherent_dma(vcpu->kvm)) {
|
||||
ipat = VMX_EPT_IPAT_BIT;
|
||||
cache = MTRR_TYPE_WRBACK;
|
||||
goto exit;
|
||||
|
@ -1708,8 +1708,6 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
||||
vcpu->pvclock_set_guest_stopped_request = false;
|
||||
}
|
||||
|
||||
pvclock_flags |= PVCLOCK_COUNTS_FROM_ZERO;
|
||||
|
||||
/* If the host uses TSC clocksource, then it is stable */
|
||||
if (use_master_clock)
|
||||
pvclock_flags |= PVCLOCK_TSC_STABLE_BIT;
|
||||
@ -2007,8 +2005,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
&vcpu->requests);
|
||||
|
||||
ka->boot_vcpu_runs_old_kvmclock = tmp;
|
||||
|
||||
ka->kvmclock_offset = -get_kernel_ns();
|
||||
}
|
||||
|
||||
vcpu->arch.time = data;
|
||||
|
@ -332,10 +332,6 @@ static int x509_key_preparse(struct key_preparsed_payload *prep)
|
||||
srlen = cert->raw_serial_size;
|
||||
q = cert->raw_serial;
|
||||
}
|
||||
if (srlen > 1 && *q == 0) {
|
||||
srlen--;
|
||||
q++;
|
||||
}
|
||||
|
||||
ret = -ENOMEM;
|
||||
desc = kmalloc(sulen + 2 + srlen * 2 + 1, GFP_KERNEL);
|
||||
|
@ -1044,8 +1044,10 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 *data)
|
||||
goto err_exit;
|
||||
|
||||
mutex_lock(&ec->mutex);
|
||||
result = -ENODATA;
|
||||
list_for_each_entry(handler, &ec->list, node) {
|
||||
if (value == handler->query_bit) {
|
||||
result = 0;
|
||||
q->handler = acpi_ec_get_query_handler(handler);
|
||||
ec_dbg_evt("Query(0x%02x) scheduled",
|
||||
q->handler->query_bit);
|
||||
|
@ -372,6 +372,7 @@ static int acpi_isa_register_gsi(struct pci_dev *dev)
|
||||
|
||||
/* Interrupt Line values above 0xF are forbidden */
|
||||
if (dev->irq > 0 && (dev->irq <= 0xF) &&
|
||||
acpi_isa_irq_available(dev->irq) &&
|
||||
(acpi_isa_irq_to_gsi(dev->irq, &dev_gsi) == 0)) {
|
||||
dev_warn(&dev->dev, "PCI INT %c: no GSI - using ISA IRQ %d\n",
|
||||
pin_name(dev->pin), dev->irq);
|
||||
|
@ -498,8 +498,7 @@ int __init acpi_irq_penalty_init(void)
|
||||
PIRQ_PENALTY_PCI_POSSIBLE;
|
||||
}
|
||||
}
|
||||
/* Add a penalty for the SCI */
|
||||
acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -553,6 +552,13 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
irq = link->irq.possible[i];
|
||||
}
|
||||
}
|
||||
if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
|
||||
printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. "
|
||||
"Try pci=noacpi or acpi=off\n",
|
||||
acpi_device_name(link->device),
|
||||
acpi_device_bid(link->device));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Attempt to enable the link device at this IRQ. */
|
||||
if (acpi_pci_link_set(link, irq)) {
|
||||
@ -821,6 +827,12 @@ void acpi_penalize_isa_irq(int irq, int active)
|
||||
}
|
||||
}
|
||||
|
||||
bool acpi_isa_irq_available(int irq)
|
||||
{
|
||||
return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
|
||||
acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict with
|
||||
* PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be use for
|
||||
|
@ -148,7 +148,11 @@ static void cache_shared_cpu_map_remove(unsigned int cpu)
|
||||
|
||||
if (sibling == cpu) /* skip itself */
|
||||
continue;
|
||||
|
||||
sib_cpu_ci = get_cpu_cacheinfo(sibling);
|
||||
if (!sib_cpu_ci->info_list)
|
||||
continue;
|
||||
|
||||
sib_leaf = sib_cpu_ci->info_list + index;
|
||||
cpumask_clear_cpu(cpu, &sib_leaf->shared_cpu_map);
|
||||
cpumask_clear_cpu(sibling, &this_leaf->shared_cpu_map);
|
||||
@ -159,6 +163,9 @@ static void cache_shared_cpu_map_remove(unsigned int cpu)
|
||||
|
||||
static void free_cache_attributes(unsigned int cpu)
|
||||
{
|
||||
if (!per_cpu_cacheinfo(cpu))
|
||||
return;
|
||||
|
||||
cache_shared_cpu_map_remove(cpu);
|
||||
|
||||
kfree(per_cpu_cacheinfo(cpu));
|
||||
@ -514,8 +521,7 @@ static int cacheinfo_cpu_callback(struct notifier_block *nfb,
|
||||
break;
|
||||
case CPU_DEAD:
|
||||
cache_remove_dev(cpu);
|
||||
if (per_cpu_cacheinfo(cpu))
|
||||
free_cache_attributes(cpu);
|
||||
free_cache_attributes(cpu);
|
||||
break;
|
||||
}
|
||||
return notifier_from_errno(rc);
|
||||
|
@ -892,10 +892,17 @@ static int opp_get_microvolt(struct dev_pm_opp *opp, struct device *dev)
|
||||
u32 microvolt[3] = {0};
|
||||
int count, ret;
|
||||
|
||||
count = of_property_count_u32_elems(opp->np, "opp-microvolt");
|
||||
if (!count)
|
||||
/* Missing property isn't a problem, but an invalid entry is */
|
||||
if (!of_find_property(opp->np, "opp-microvolt", NULL))
|
||||
return 0;
|
||||
|
||||
count = of_property_count_u32_elems(opp->np, "opp-microvolt");
|
||||
if (count < 0) {
|
||||
dev_err(dev, "%s: Invalid opp-microvolt property (%d)\n",
|
||||
__func__, count);
|
||||
return count;
|
||||
}
|
||||
|
||||
/* There can be one or three elements here */
|
||||
if (count != 1 && count != 3) {
|
||||
dev_err(dev, "%s: Invalid number of elements in opp-microvolt property (%d)\n",
|
||||
@ -1063,7 +1070,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_add);
|
||||
* share a common logic which is isolated here.
|
||||
*
|
||||
* Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
|
||||
* copy operation, returns 0 if no modifcation was done OR modification was
|
||||
* copy operation, returns 0 if no modification was done OR modification was
|
||||
* successful.
|
||||
*
|
||||
* Locking: The internal device_opp and opp structures are RCU protected.
|
||||
@ -1151,7 +1158,7 @@ unlock:
|
||||
* mutex locking or synchronize_rcu() blocking calls cannot be used.
|
||||
*
|
||||
* Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
|
||||
* copy operation, returns 0 if no modifcation was done OR modification was
|
||||
* copy operation, returns 0 if no modification was done OR modification was
|
||||
* successful.
|
||||
*/
|
||||
int dev_pm_opp_enable(struct device *dev, unsigned long freq)
|
||||
@ -1177,7 +1184,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_enable);
|
||||
* mutex locking or synchronize_rcu() blocking calls cannot be used.
|
||||
*
|
||||
* Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
|
||||
* copy operation, returns 0 if no modifcation was done OR modification was
|
||||
* copy operation, returns 0 if no modification was done OR modification was
|
||||
* successful.
|
||||
*/
|
||||
int dev_pm_opp_disable(struct device *dev, unsigned long freq)
|
||||
|
@ -344,11 +344,12 @@ static int xgene_rng_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(ctx->csr_base))
|
||||
return PTR_ERR(ctx->csr_base);
|
||||
|
||||
ctx->irq = platform_get_irq(pdev, 0);
|
||||
if (ctx->irq < 0) {
|
||||
rc = platform_get_irq(pdev, 0);
|
||||
if (rc < 0) {
|
||||
dev_err(&pdev->dev, "No IRQ resource\n");
|
||||
return ctx->irq;
|
||||
return rc;
|
||||
}
|
||||
ctx->irq = rc;
|
||||
|
||||
dev_dbg(&pdev->dev, "APM X-Gene RNG BASE %p ALARM IRQ %d",
|
||||
ctx->csr_base, ctx->irq);
|
||||
|
@ -687,6 +687,33 @@ static inline u32 mv_cesa_get_int_mask(struct mv_cesa_engine *engine)
|
||||
|
||||
int mv_cesa_queue_req(struct crypto_async_request *req);
|
||||
|
||||
/*
|
||||
* Helper function that indicates whether a crypto request needs to be
|
||||
* cleaned up or not after being enqueued using mv_cesa_queue_req().
|
||||
*/
|
||||
static inline int mv_cesa_req_needs_cleanup(struct crypto_async_request *req,
|
||||
int ret)
|
||||
{
|
||||
/*
|
||||
* The queue still had some space, the request was queued
|
||||
* normally, so there's no need to clean it up.
|
||||
*/
|
||||
if (ret == -EINPROGRESS)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* The queue had not space left, but since the request is
|
||||
* flagged with CRYPTO_TFM_REQ_MAY_BACKLOG, it was added to
|
||||
* the backlog and will be processed later. There's no need to
|
||||
* clean it up.
|
||||
*/
|
||||
if (ret == -EBUSY && req->flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
|
||||
return false;
|
||||
|
||||
/* Request wasn't queued, we need to clean it up */
|
||||
return true;
|
||||
}
|
||||
|
||||
/* TDMA functions */
|
||||
|
||||
static inline void mv_cesa_req_dma_iter_init(struct mv_cesa_dma_iter *iter,
|
||||
|
@ -189,7 +189,6 @@ static inline void mv_cesa_ablkcipher_prepare(struct crypto_async_request *req,
|
||||
{
|
||||
struct ablkcipher_request *ablkreq = ablkcipher_request_cast(req);
|
||||
struct mv_cesa_ablkcipher_req *creq = ablkcipher_request_ctx(ablkreq);
|
||||
|
||||
creq->req.base.engine = engine;
|
||||
|
||||
if (creq->req.base.type == CESA_DMA_REQ)
|
||||
@ -431,7 +430,7 @@ static int mv_cesa_des_op(struct ablkcipher_request *req,
|
||||
return ret;
|
||||
|
||||
ret = mv_cesa_queue_req(&req->base);
|
||||
if (ret && ret != -EINPROGRESS)
|
||||
if (mv_cesa_req_needs_cleanup(&req->base, ret))
|
||||
mv_cesa_ablkcipher_cleanup(req);
|
||||
|
||||
return ret;
|
||||
@ -551,7 +550,7 @@ static int mv_cesa_des3_op(struct ablkcipher_request *req,
|
||||
return ret;
|
||||
|
||||
ret = mv_cesa_queue_req(&req->base);
|
||||
if (ret && ret != -EINPROGRESS)
|
||||
if (mv_cesa_req_needs_cleanup(&req->base, ret))
|
||||
mv_cesa_ablkcipher_cleanup(req);
|
||||
|
||||
return ret;
|
||||
@ -693,7 +692,7 @@ static int mv_cesa_aes_op(struct ablkcipher_request *req,
|
||||
return ret;
|
||||
|
||||
ret = mv_cesa_queue_req(&req->base);
|
||||
if (ret && ret != -EINPROGRESS)
|
||||
if (mv_cesa_req_needs_cleanup(&req->base, ret))
|
||||
mv_cesa_ablkcipher_cleanup(req);
|
||||
|
||||
return ret;
|
||||
|
@ -739,10 +739,8 @@ static int mv_cesa_ahash_update(struct ahash_request *req)
|
||||
return 0;
|
||||
|
||||
ret = mv_cesa_queue_req(&req->base);
|
||||
if (ret && ret != -EINPROGRESS) {
|
||||
if (mv_cesa_req_needs_cleanup(&req->base, ret))
|
||||
mv_cesa_ahash_cleanup(req);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -766,7 +764,7 @@ static int mv_cesa_ahash_final(struct ahash_request *req)
|
||||
return 0;
|
||||
|
||||
ret = mv_cesa_queue_req(&req->base);
|
||||
if (ret && ret != -EINPROGRESS)
|
||||
if (mv_cesa_req_needs_cleanup(&req->base, ret))
|
||||
mv_cesa_ahash_cleanup(req);
|
||||
|
||||
return ret;
|
||||
@ -791,7 +789,7 @@ static int mv_cesa_ahash_finup(struct ahash_request *req)
|
||||
return 0;
|
||||
|
||||
ret = mv_cesa_queue_req(&req->base);
|
||||
if (ret && ret != -EINPROGRESS)
|
||||
if (mv_cesa_req_needs_cleanup(&req->base, ret))
|
||||
mv_cesa_ahash_cleanup(req);
|
||||
|
||||
return ret;
|
||||
|
@ -88,6 +88,9 @@ static void adf_dev_restore(struct adf_accel_dev *accel_dev)
|
||||
struct pci_dev *parent = pdev->bus->self;
|
||||
uint16_t bridge_ctl = 0;
|
||||
|
||||
if (accel_dev->is_vf)
|
||||
return;
|
||||
|
||||
dev_info(&GET_DEV(accel_dev), "Resetting device qat_dev%d\n",
|
||||
accel_dev->accel_id);
|
||||
|
||||
|
@ -159,7 +159,7 @@ static int find_cable_index_by_name(struct extcon_dev *edev, const char *name)
|
||||
static bool is_extcon_changed(u32 prev, u32 new, int idx, bool *attached)
|
||||
{
|
||||
if (((prev >> idx) & 0x1) != ((new >> idx) & 0x1)) {
|
||||
*attached = new ? true : false;
|
||||
*attached = ((new >> idx) & 0x1) ? true : false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -139,6 +139,14 @@ config QCOM_SCM
|
||||
bool
|
||||
depends on ARM || ARM64
|
||||
|
||||
config QCOM_SCM_32
|
||||
def_bool y
|
||||
depends on QCOM_SCM && ARM
|
||||
|
||||
config QCOM_SCM_64
|
||||
def_bool y
|
||||
depends on QCOM_SCM && ARM64
|
||||
|
||||
source "drivers/firmware/broadcom/Kconfig"
|
||||
source "drivers/firmware/google/Kconfig"
|
||||
source "drivers/firmware/efi/Kconfig"
|
||||
|
@ -13,7 +13,8 @@ obj-$(CONFIG_ISCSI_IBFT_FIND) += iscsi_ibft_find.o
|
||||
obj-$(CONFIG_ISCSI_IBFT) += iscsi_ibft.o
|
||||
obj-$(CONFIG_FIRMWARE_MEMMAP) += memmap.o
|
||||
obj-$(CONFIG_QCOM_SCM) += qcom_scm.o
|
||||
obj-$(CONFIG_QCOM_SCM) += qcom_scm-32.o
|
||||
obj-$(CONFIG_QCOM_SCM_64) += qcom_scm-64.o
|
||||
obj-$(CONFIG_QCOM_SCM_32) += qcom_scm-32.o
|
||||
CFLAGS_qcom_scm-32.o :=$(call as-instr,.arch_extension sec,-DREQUIRES_SEC=1)
|
||||
|
||||
obj-y += broadcom/
|
||||
|
63
drivers/firmware/qcom_scm-64.c
Normal file
63
drivers/firmware/qcom_scm-64.c
Normal file
@ -0,0 +1,63 @@
|
||||
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
* only version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/qcom_scm.h>
|
||||
|
||||
/**
|
||||
* qcom_scm_set_cold_boot_addr() - Set the cold boot address for cpus
|
||||
* @entry: Entry point function for the cpus
|
||||
* @cpus: The cpumask of cpus that will use the entry point
|
||||
*
|
||||
* Set the cold boot address of the cpus. Any cpu outside the supported
|
||||
* range would be removed from the cpu present mask.
|
||||
*/
|
||||
int __qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
/**
|
||||
* qcom_scm_set_warm_boot_addr() - Set the warm boot address for cpus
|
||||
* @entry: Entry point function for the cpus
|
||||
* @cpus: The cpumask of cpus that will use the entry point
|
||||
*
|
||||
* Set the Linux entry point for the SCM to transfer control to when coming
|
||||
* out of a power down. CPU power down may be executed on cpuidle or hotplug.
|
||||
*/
|
||||
int __qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
/**
|
||||
* qcom_scm_cpu_power_down() - Power down the cpu
|
||||
* @flags - Flags to flush cache
|
||||
*
|
||||
* This is an end point to power down cpu. If there was a pending interrupt,
|
||||
* the control would return from this function, otherwise, the cpu jumps to the
|
||||
* warm boot entry point set for this cpu upon reset.
|
||||
*/
|
||||
void __qcom_scm_cpu_power_down(u32 flags)
|
||||
{
|
||||
}
|
||||
|
||||
int __qcom_scm_is_call_available(u32 svc_id, u32 cmd_id)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
@ -204,6 +204,8 @@ void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
|
||||
spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
|
||||
list_del(&channel->listentry);
|
||||
spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
|
||||
|
||||
primary_channel = channel;
|
||||
} else {
|
||||
primary_channel = channel->primary_channel;
|
||||
spin_lock_irqsave(&primary_channel->lock, flags);
|
||||
@ -211,6 +213,14 @@ void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)
|
||||
primary_channel->num_sc--;
|
||||
spin_unlock_irqrestore(&primary_channel->lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to free the bit for init_vp_index() to work in the case
|
||||
* of sub-channel, when we reload drivers like hv_netvsc.
|
||||
*/
|
||||
cpumask_clear_cpu(channel->target_cpu,
|
||||
&primary_channel->alloced_cpus_in_node);
|
||||
|
||||
free_channel(channel);
|
||||
}
|
||||
|
||||
@ -458,6 +468,13 @@ static void init_vp_index(struct vmbus_channel *channel, const uuid_le *type_gui
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: in the case of sub-channel, we clear the sub-channel
|
||||
* related bit(s) in primary->alloced_cpus_in_node in
|
||||
* hv_process_channel_removal(), so when we reload drivers
|
||||
* like hv_netvsc in SMP guest, here we're able to re-allocate
|
||||
* bit from primary->alloced_cpus_in_node.
|
||||
*/
|
||||
if (!cpumask_test_cpu(cur_cpu,
|
||||
&primary->alloced_cpus_in_node)) {
|
||||
cpumask_set_cpu(cur_cpu,
|
||||
|
@ -470,6 +470,7 @@ static const struct of_device_id abx500_temp_match[] = {
|
||||
{ .compatible = "stericsson,abx500-temp" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, abx500_temp_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver abx500_temp_driver = {
|
||||
|
@ -539,6 +539,7 @@ static const struct of_device_id of_gpio_fan_match[] = {
|
||||
{ .compatible = "gpio-fan", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_gpio_fan_match);
|
||||
#endif /* CONFIG_OF_GPIO */
|
||||
|
||||
static int gpio_fan_probe(struct platform_device *pdev)
|
||||
|
@ -323,6 +323,7 @@ static const struct of_device_id of_pwm_fan_match[] = {
|
||||
{ .compatible = "pwm-fan", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_pwm_fan_match);
|
||||
|
||||
static struct platform_driver pwm_fan_driver = {
|
||||
.probe = pwm_fan_probe,
|
||||
|
@ -620,7 +620,7 @@ static struct cpuidle_state skl_cstates[] = {
|
||||
.name = "C6-SKL",
|
||||
.desc = "MWAIT 0x20",
|
||||
.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||
.exit_latency = 75,
|
||||
.exit_latency = 85,
|
||||
.target_residency = 200,
|
||||
.enter = &intel_idle,
|
||||
.enter_freeze = intel_idle_freeze, },
|
||||
@ -636,10 +636,18 @@ static struct cpuidle_state skl_cstates[] = {
|
||||
.name = "C8-SKL",
|
||||
.desc = "MWAIT 0x40",
|
||||
.flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||
.exit_latency = 174,
|
||||
.exit_latency = 200,
|
||||
.target_residency = 800,
|
||||
.enter = &intel_idle,
|
||||
.enter_freeze = intel_idle_freeze, },
|
||||
{
|
||||
.name = "C9-SKL",
|
||||
.desc = "MWAIT 0x50",
|
||||
.flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||
.exit_latency = 480,
|
||||
.target_residency = 5000,
|
||||
.enter = &intel_idle,
|
||||
.enter_freeze = intel_idle_freeze, },
|
||||
{
|
||||
.name = "C10-SKL",
|
||||
.desc = "MWAIT 0x60",
|
||||
|
@ -245,7 +245,6 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
|
||||
props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR;
|
||||
if (MLX5_CAP_GEN(mdev, apm))
|
||||
props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG;
|
||||
props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY;
|
||||
if (MLX5_CAP_GEN(mdev, xrc))
|
||||
props->device_cap_flags |= IB_DEVICE_XRC;
|
||||
props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS;
|
||||
@ -795,53 +794,6 @@ static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alloc_pa_mkey(struct mlx5_ib_dev *dev, u32 *key, u32 pdn)
|
||||
{
|
||||
struct mlx5_create_mkey_mbox_in *in;
|
||||
struct mlx5_mkey_seg *seg;
|
||||
struct mlx5_core_mr mr;
|
||||
int err;
|
||||
|
||||
in = kzalloc(sizeof(*in), GFP_KERNEL);
|
||||
if (!in)
|
||||
return -ENOMEM;
|
||||
|
||||
seg = &in->seg;
|
||||
seg->flags = MLX5_PERM_LOCAL_READ | MLX5_ACCESS_MODE_PA;
|
||||
seg->flags_pd = cpu_to_be32(pdn | MLX5_MKEY_LEN64);
|
||||
seg->qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
|
||||
seg->start_addr = 0;
|
||||
|
||||
err = mlx5_core_create_mkey(dev->mdev, &mr, in, sizeof(*in),
|
||||
NULL, NULL, NULL);
|
||||
if (err) {
|
||||
mlx5_ib_warn(dev, "failed to create mkey, %d\n", err);
|
||||
goto err_in;
|
||||
}
|
||||
|
||||
kfree(in);
|
||||
*key = mr.key;
|
||||
|
||||
return 0;
|
||||
|
||||
err_in:
|
||||
kfree(in);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void free_pa_mkey(struct mlx5_ib_dev *dev, u32 key)
|
||||
{
|
||||
struct mlx5_core_mr mr;
|
||||
int err;
|
||||
|
||||
memset(&mr, 0, sizeof(mr));
|
||||
mr.key = key;
|
||||
err = mlx5_core_destroy_mkey(dev->mdev, &mr);
|
||||
if (err)
|
||||
mlx5_ib_warn(dev, "failed to destroy mkey 0x%x\n", key);
|
||||
}
|
||||
|
||||
static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata)
|
||||
@ -867,13 +819,6 @@ static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev,
|
||||
kfree(pd);
|
||||
return ERR_PTR(-EFAULT);
|
||||
}
|
||||
} else {
|
||||
err = alloc_pa_mkey(to_mdev(ibdev), &pd->pa_lkey, pd->pdn);
|
||||
if (err) {
|
||||
mlx5_core_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn);
|
||||
kfree(pd);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
}
|
||||
|
||||
return &pd->ibpd;
|
||||
@ -884,9 +829,6 @@ static int mlx5_ib_dealloc_pd(struct ib_pd *pd)
|
||||
struct mlx5_ib_dev *mdev = to_mdev(pd->device);
|
||||
struct mlx5_ib_pd *mpd = to_mpd(pd);
|
||||
|
||||
if (!pd->uobject)
|
||||
free_pa_mkey(mdev, mpd->pa_lkey);
|
||||
|
||||
mlx5_core_dealloc_pd(mdev->mdev, mpd->pdn);
|
||||
kfree(mpd);
|
||||
|
||||
@ -1245,18 +1187,10 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
|
||||
struct ib_srq_init_attr attr;
|
||||
struct mlx5_ib_dev *dev;
|
||||
struct ib_cq_init_attr cq_attr = {.cqe = 1};
|
||||
u32 rsvd_lkey;
|
||||
int ret = 0;
|
||||
|
||||
dev = container_of(devr, struct mlx5_ib_dev, devr);
|
||||
|
||||
ret = mlx5_core_query_special_context(dev->mdev, &rsvd_lkey);
|
||||
if (ret) {
|
||||
pr_err("Failed to query special context %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
dev->ib_dev.local_dma_lkey = rsvd_lkey;
|
||||
|
||||
devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL);
|
||||
if (IS_ERR(devr->p0)) {
|
||||
ret = PTR_ERR(devr->p0);
|
||||
@ -1418,6 +1352,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
||||
strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX);
|
||||
dev->ib_dev.owner = THIS_MODULE;
|
||||
dev->ib_dev.node_type = RDMA_NODE_IB_CA;
|
||||
dev->ib_dev.local_dma_lkey = 0 /* not supported for now */;
|
||||
dev->num_ports = MLX5_CAP_GEN(mdev, num_ports);
|
||||
dev->ib_dev.phys_port_cnt = dev->num_ports;
|
||||
dev->ib_dev.num_comp_vectors =
|
||||
|
@ -103,7 +103,6 @@ static inline struct mlx5_ib_ucontext *to_mucontext(struct ib_ucontext *ibuconte
|
||||
struct mlx5_ib_pd {
|
||||
struct ib_pd ibpd;
|
||||
u32 pdn;
|
||||
u32 pa_lkey;
|
||||
};
|
||||
|
||||
/* Use macros here so that don't have to duplicate
|
||||
@ -213,7 +212,6 @@ struct mlx5_ib_qp {
|
||||
int uuarn;
|
||||
|
||||
int create_type;
|
||||
u32 pa_lkey;
|
||||
|
||||
/* Store signature errors */
|
||||
bool signature_en;
|
||||
|
@ -925,8 +925,6 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
err = create_kernel_qp(dev, init_attr, qp, &in, &inlen);
|
||||
if (err)
|
||||
mlx5_ib_dbg(dev, "err %d\n", err);
|
||||
else
|
||||
qp->pa_lkey = to_mpd(pd)->pa_lkey;
|
||||
}
|
||||
|
||||
if (err)
|
||||
@ -2045,7 +2043,7 @@ static void set_frwr_pages(struct mlx5_wqe_data_seg *dseg,
|
||||
mfrpl->mapped_page_list[i] = cpu_to_be64(page_list[i] | perm);
|
||||
dseg->addr = cpu_to_be64(mfrpl->map);
|
||||
dseg->byte_count = cpu_to_be32(ALIGN(sizeof(u64) * wr->wr.fast_reg.page_list_len, 64));
|
||||
dseg->lkey = cpu_to_be32(pd->pa_lkey);
|
||||
dseg->lkey = cpu_to_be32(pd->ibpd.local_dma_lkey);
|
||||
}
|
||||
|
||||
static __be32 send_ieth(struct ib_send_wr *wr)
|
||||
|
@ -80,7 +80,7 @@ enum {
|
||||
IPOIB_NUM_WC = 4,
|
||||
|
||||
IPOIB_MAX_PATH_REC_QUEUE = 3,
|
||||
IPOIB_MAX_MCAST_QUEUE = 3,
|
||||
IPOIB_MAX_MCAST_QUEUE = 64,
|
||||
|
||||
IPOIB_FLAG_OPER_UP = 0,
|
||||
IPOIB_FLAG_INITIALIZED = 1,
|
||||
@ -548,6 +548,8 @@ void ipoib_path_iter_read(struct ipoib_path_iter *iter,
|
||||
|
||||
int ipoib_mcast_attach(struct net_device *dev, u16 mlid,
|
||||
union ib_gid *mgid, int set_qkey);
|
||||
int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast);
|
||||
struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid);
|
||||
|
||||
int ipoib_init_qp(struct net_device *dev);
|
||||
int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca);
|
||||
|
@ -1149,6 +1149,9 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv)
|
||||
unsigned long dt;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
LIST_HEAD(remove_list);
|
||||
struct ipoib_mcast *mcast, *tmcast;
|
||||
struct net_device *dev = priv->dev;
|
||||
|
||||
if (test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags))
|
||||
return;
|
||||
@ -1176,6 +1179,19 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv)
|
||||
lockdep_is_held(&priv->lock))) != NULL) {
|
||||
/* was the neigh idle for two GC periods */
|
||||
if (time_after(neigh_obsolete, neigh->alive)) {
|
||||
u8 *mgid = neigh->daddr + 4;
|
||||
|
||||
/* Is this multicast ? */
|
||||
if (*mgid == 0xff) {
|
||||
mcast = __ipoib_mcast_find(dev, mgid);
|
||||
|
||||
if (mcast && test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
|
||||
list_del(&mcast->list);
|
||||
rb_erase(&mcast->rb_node, &priv->multicast_tree);
|
||||
list_add_tail(&mcast->list, &remove_list);
|
||||
}
|
||||
}
|
||||
|
||||
rcu_assign_pointer(*np,
|
||||
rcu_dereference_protected(neigh->hnext,
|
||||
lockdep_is_held(&priv->lock)));
|
||||
@ -1191,6 +1207,8 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv)
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
list_for_each_entry_safe(mcast, tmcast, &remove_list, list)
|
||||
ipoib_mcast_leave(dev, mcast);
|
||||
}
|
||||
|
||||
static void ipoib_reap_neigh(struct work_struct *work)
|
||||
|
@ -153,7 +153,7 @@ static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev,
|
||||
return mcast;
|
||||
}
|
||||
|
||||
static struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid)
|
||||
struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
struct rb_node *n = priv->multicast_tree.rb_node;
|
||||
@ -508,17 +508,19 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)
|
||||
rec.hop_limit = priv->broadcast->mcmember.hop_limit;
|
||||
|
||||
/*
|
||||
* Historically Linux IPoIB has never properly supported SEND
|
||||
* ONLY join. It emulated it by not providing all the required
|
||||
* attributes, which is enough to prevent group creation and
|
||||
* detect if there are full members or not. A major problem
|
||||
* with supporting SEND ONLY is detecting when the group is
|
||||
* auto-destroyed as IPoIB will cache the MLID..
|
||||
* Send-only IB Multicast joins do not work at the core
|
||||
* IB layer yet, so we can't use them here. However,
|
||||
* we are emulating an Ethernet multicast send, which
|
||||
* does not require a multicast subscription and will
|
||||
* still send properly. The most appropriate thing to
|
||||
* do is to create the group if it doesn't exist as that
|
||||
* most closely emulates the behavior, from a user space
|
||||
* application perspecitive, of Ethernet multicast
|
||||
* operation. For now, we do a full join, maybe later
|
||||
* when the core IB layers support send only joins we
|
||||
* will use them.
|
||||
*/
|
||||
#if 1
|
||||
if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
|
||||
comp_mask &= ~IB_SA_MCMEMBER_REC_TRAFFIC_CLASS;
|
||||
#else
|
||||
#if 0
|
||||
if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
|
||||
rec.join_state = 4;
|
||||
#endif
|
||||
@ -675,7 +677,7 @@ int ipoib_mcast_stop_thread(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
|
||||
int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
int ret = 0;
|
||||
|
@ -97,6 +97,11 @@ unsigned int iser_max_sectors = ISER_DEF_MAX_SECTORS;
|
||||
module_param_named(max_sectors, iser_max_sectors, uint, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(max_sectors, "Max number of sectors in a single scsi command (default:1024");
|
||||
|
||||
bool iser_always_reg = true;
|
||||
module_param_named(always_register, iser_always_reg, bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(always_register,
|
||||
"Always register memory, even for continuous memory regions (default:true)");
|
||||
|
||||
bool iser_pi_enable = false;
|
||||
module_param_named(pi_enable, iser_pi_enable, bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)");
|
||||
|
@ -611,6 +611,7 @@ extern int iser_debug_level;
|
||||
extern bool iser_pi_enable;
|
||||
extern int iser_pi_guard;
|
||||
extern unsigned int iser_max_sectors;
|
||||
extern bool iser_always_reg;
|
||||
|
||||
int iser_assign_reg_ops(struct iser_device *device);
|
||||
|
||||
|
@ -803,11 +803,12 @@ static int
|
||||
iser_reg_prot_sg(struct iscsi_iser_task *task,
|
||||
struct iser_data_buf *mem,
|
||||
struct iser_fr_desc *desc,
|
||||
bool use_dma_key,
|
||||
struct iser_mem_reg *reg)
|
||||
{
|
||||
struct iser_device *device = task->iser_conn->ib_conn.device;
|
||||
|
||||
if (mem->dma_nents == 1)
|
||||
if (use_dma_key)
|
||||
return iser_reg_dma(device, mem, reg);
|
||||
|
||||
return device->reg_ops->reg_mem(task, mem, &desc->pi_ctx->rsc, reg);
|
||||
@ -817,11 +818,12 @@ static int
|
||||
iser_reg_data_sg(struct iscsi_iser_task *task,
|
||||
struct iser_data_buf *mem,
|
||||
struct iser_fr_desc *desc,
|
||||
bool use_dma_key,
|
||||
struct iser_mem_reg *reg)
|
||||
{
|
||||
struct iser_device *device = task->iser_conn->ib_conn.device;
|
||||
|
||||
if (mem->dma_nents == 1)
|
||||
if (use_dma_key)
|
||||
return iser_reg_dma(device, mem, reg);
|
||||
|
||||
return device->reg_ops->reg_mem(task, mem, &desc->rsc, reg);
|
||||
@ -836,14 +838,17 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task,
|
||||
struct iser_mem_reg *reg = &task->rdma_reg[dir];
|
||||
struct iser_mem_reg *data_reg;
|
||||
struct iser_fr_desc *desc = NULL;
|
||||
bool use_dma_key;
|
||||
int err;
|
||||
|
||||
err = iser_handle_unaligned_buf(task, mem, dir);
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
if (mem->dma_nents != 1 ||
|
||||
scsi_get_prot_op(task->sc) != SCSI_PROT_NORMAL) {
|
||||
use_dma_key = (mem->dma_nents == 1 && !iser_always_reg &&
|
||||
scsi_get_prot_op(task->sc) == SCSI_PROT_NORMAL);
|
||||
|
||||
if (!use_dma_key) {
|
||||
desc = device->reg_ops->reg_desc_get(ib_conn);
|
||||
reg->mem_h = desc;
|
||||
}
|
||||
@ -853,7 +858,7 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task,
|
||||
else
|
||||
data_reg = &task->desc.data_reg;
|
||||
|
||||
err = iser_reg_data_sg(task, mem, desc, data_reg);
|
||||
err = iser_reg_data_sg(task, mem, desc, use_dma_key, data_reg);
|
||||
if (unlikely(err))
|
||||
goto err_reg;
|
||||
|
||||
@ -866,7 +871,8 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task,
|
||||
if (unlikely(err))
|
||||
goto err_reg;
|
||||
|
||||
err = iser_reg_prot_sg(task, mem, desc, prot_reg);
|
||||
err = iser_reg_prot_sg(task, mem, desc,
|
||||
use_dma_key, prot_reg);
|
||||
if (unlikely(err))
|
||||
goto err_reg;
|
||||
}
|
||||
|
@ -133,11 +133,15 @@ static int iser_create_device_ib_res(struct iser_device *device)
|
||||
(unsigned long)comp);
|
||||
}
|
||||
|
||||
device->mr = ib_get_dma_mr(device->pd, IB_ACCESS_LOCAL_WRITE |
|
||||
IB_ACCESS_REMOTE_WRITE |
|
||||
IB_ACCESS_REMOTE_READ);
|
||||
if (IS_ERR(device->mr))
|
||||
goto dma_mr_err;
|
||||
if (!iser_always_reg) {
|
||||
int access = IB_ACCESS_LOCAL_WRITE |
|
||||
IB_ACCESS_REMOTE_WRITE |
|
||||
IB_ACCESS_REMOTE_READ;
|
||||
|
||||
device->mr = ib_get_dma_mr(device->pd, access);
|
||||
if (IS_ERR(device->mr))
|
||||
goto dma_mr_err;
|
||||
}
|
||||
|
||||
INIT_IB_EVENT_HANDLER(&device->event_handler, device->ib_device,
|
||||
iser_event_handler);
|
||||
@ -147,7 +151,8 @@ static int iser_create_device_ib_res(struct iser_device *device)
|
||||
return 0;
|
||||
|
||||
handler_err:
|
||||
ib_dereg_mr(device->mr);
|
||||
if (device->mr)
|
||||
ib_dereg_mr(device->mr);
|
||||
dma_mr_err:
|
||||
for (i = 0; i < device->comps_used; i++)
|
||||
tasklet_kill(&device->comps[i].tasklet);
|
||||
@ -173,7 +178,6 @@ comps_err:
|
||||
static void iser_free_device_ib_res(struct iser_device *device)
|
||||
{
|
||||
int i;
|
||||
BUG_ON(device->mr == NULL);
|
||||
|
||||
for (i = 0; i < device->comps_used; i++) {
|
||||
struct iser_comp *comp = &device->comps[i];
|
||||
@ -184,7 +188,8 @@ static void iser_free_device_ib_res(struct iser_device *device)
|
||||
}
|
||||
|
||||
(void)ib_unregister_event_handler(&device->event_handler);
|
||||
(void)ib_dereg_mr(device->mr);
|
||||
if (device->mr)
|
||||
(void)ib_dereg_mr(device->mr);
|
||||
ib_dealloc_pd(device->pd);
|
||||
|
||||
kfree(device->comps);
|
||||
|
@ -238,8 +238,6 @@ isert_alloc_rx_descriptors(struct isert_conn *isert_conn)
|
||||
rx_sg->lkey = device->pd->local_dma_lkey;
|
||||
}
|
||||
|
||||
isert_conn->rx_desc_head = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
dma_map_fail:
|
||||
@ -634,7 +632,7 @@ static void
|
||||
isert_init_conn(struct isert_conn *isert_conn)
|
||||
{
|
||||
isert_conn->state = ISER_CONN_INIT;
|
||||
INIT_LIST_HEAD(&isert_conn->accept_node);
|
||||
INIT_LIST_HEAD(&isert_conn->node);
|
||||
init_completion(&isert_conn->login_comp);
|
||||
init_completion(&isert_conn->login_req_comp);
|
||||
init_completion(&isert_conn->wait);
|
||||
@ -762,28 +760,15 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||
ret = isert_rdma_post_recvl(isert_conn);
|
||||
if (ret)
|
||||
goto out_conn_dev;
|
||||
/*
|
||||
* Obtain the second reference now before isert_rdma_accept() to
|
||||
* ensure that any initiator generated REJECT CM event that occurs
|
||||
* asynchronously won't drop the last reference until the error path
|
||||
* in iscsi_target_login_sess_out() does it's ->iscsit_free_conn() ->
|
||||
* isert_free_conn() -> isert_put_conn() -> kref_put().
|
||||
*/
|
||||
if (!kref_get_unless_zero(&isert_conn->kref)) {
|
||||
isert_warn("conn %p connect_release is running\n", isert_conn);
|
||||
goto out_conn_dev;
|
||||
}
|
||||
|
||||
ret = isert_rdma_accept(isert_conn);
|
||||
if (ret)
|
||||
goto out_conn_dev;
|
||||
|
||||
mutex_lock(&isert_np->np_accept_mutex);
|
||||
list_add_tail(&isert_conn->accept_node, &isert_np->np_accept_list);
|
||||
mutex_unlock(&isert_np->np_accept_mutex);
|
||||
mutex_lock(&isert_np->mutex);
|
||||
list_add_tail(&isert_conn->node, &isert_np->accepted);
|
||||
mutex_unlock(&isert_np->mutex);
|
||||
|
||||
isert_info("np %p: Allow accept_np to continue\n", np);
|
||||
up(&isert_np->np_sem);
|
||||
return 0;
|
||||
|
||||
out_conn_dev:
|
||||
@ -831,13 +816,21 @@ static void
|
||||
isert_connected_handler(struct rdma_cm_id *cma_id)
|
||||
{
|
||||
struct isert_conn *isert_conn = cma_id->qp->qp_context;
|
||||
struct isert_np *isert_np = cma_id->context;
|
||||
|
||||
isert_info("conn %p\n", isert_conn);
|
||||
|
||||
mutex_lock(&isert_conn->mutex);
|
||||
if (isert_conn->state != ISER_CONN_FULL_FEATURE)
|
||||
isert_conn->state = ISER_CONN_UP;
|
||||
isert_conn->state = ISER_CONN_UP;
|
||||
kref_get(&isert_conn->kref);
|
||||
mutex_unlock(&isert_conn->mutex);
|
||||
|
||||
mutex_lock(&isert_np->mutex);
|
||||
list_move_tail(&isert_conn->node, &isert_np->pending);
|
||||
mutex_unlock(&isert_np->mutex);
|
||||
|
||||
isert_info("np %p: Allow accept_np to continue\n", isert_np);
|
||||
up(&isert_np->sem);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -903,14 +896,14 @@ isert_np_cma_handler(struct isert_np *isert_np,
|
||||
|
||||
switch (event) {
|
||||
case RDMA_CM_EVENT_DEVICE_REMOVAL:
|
||||
isert_np->np_cm_id = NULL;
|
||||
isert_np->cm_id = NULL;
|
||||
break;
|
||||
case RDMA_CM_EVENT_ADDR_CHANGE:
|
||||
isert_np->np_cm_id = isert_setup_id(isert_np);
|
||||
if (IS_ERR(isert_np->np_cm_id)) {
|
||||
isert_np->cm_id = isert_setup_id(isert_np);
|
||||
if (IS_ERR(isert_np->cm_id)) {
|
||||
isert_err("isert np %p setup id failed: %ld\n",
|
||||
isert_np, PTR_ERR(isert_np->np_cm_id));
|
||||
isert_np->np_cm_id = NULL;
|
||||
isert_np, PTR_ERR(isert_np->cm_id));
|
||||
isert_np->cm_id = NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -929,7 +922,7 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id,
|
||||
struct isert_conn *isert_conn;
|
||||
bool terminating = false;
|
||||
|
||||
if (isert_np->np_cm_id == cma_id)
|
||||
if (isert_np->cm_id == cma_id)
|
||||
return isert_np_cma_handler(cma_id->context, event);
|
||||
|
||||
isert_conn = cma_id->qp->qp_context;
|
||||
@ -945,13 +938,13 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id,
|
||||
if (terminating)
|
||||
goto out;
|
||||
|
||||
mutex_lock(&isert_np->np_accept_mutex);
|
||||
if (!list_empty(&isert_conn->accept_node)) {
|
||||
list_del_init(&isert_conn->accept_node);
|
||||
mutex_lock(&isert_np->mutex);
|
||||
if (!list_empty(&isert_conn->node)) {
|
||||
list_del_init(&isert_conn->node);
|
||||
isert_put_conn(isert_conn);
|
||||
queue_work(isert_release_wq, &isert_conn->release_work);
|
||||
}
|
||||
mutex_unlock(&isert_np->np_accept_mutex);
|
||||
mutex_unlock(&isert_np->mutex);
|
||||
|
||||
out:
|
||||
return 0;
|
||||
@ -962,6 +955,7 @@ isert_connect_error(struct rdma_cm_id *cma_id)
|
||||
{
|
||||
struct isert_conn *isert_conn = cma_id->qp->qp_context;
|
||||
|
||||
list_del_init(&isert_conn->node);
|
||||
isert_conn->cm_id = NULL;
|
||||
isert_put_conn(isert_conn);
|
||||
|
||||
@ -1006,35 +1000,51 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||
}
|
||||
|
||||
static int
|
||||
isert_post_recv(struct isert_conn *isert_conn, u32 count)
|
||||
isert_post_recvm(struct isert_conn *isert_conn, u32 count)
|
||||
{
|
||||
struct ib_recv_wr *rx_wr, *rx_wr_failed;
|
||||
int i, ret;
|
||||
unsigned int rx_head = isert_conn->rx_desc_head;
|
||||
struct iser_rx_desc *rx_desc;
|
||||
|
||||
for (rx_wr = isert_conn->rx_wr, i = 0; i < count; i++, rx_wr++) {
|
||||
rx_desc = &isert_conn->rx_descs[rx_head];
|
||||
rx_wr->wr_id = (uintptr_t)rx_desc;
|
||||
rx_wr->sg_list = &rx_desc->rx_sg;
|
||||
rx_wr->num_sge = 1;
|
||||
rx_wr->next = rx_wr + 1;
|
||||
rx_head = (rx_head + 1) & (ISERT_QP_MAX_RECV_DTOS - 1);
|
||||
rx_desc = &isert_conn->rx_descs[i];
|
||||
rx_wr->wr_id = (uintptr_t)rx_desc;
|
||||
rx_wr->sg_list = &rx_desc->rx_sg;
|
||||
rx_wr->num_sge = 1;
|
||||
rx_wr->next = rx_wr + 1;
|
||||
}
|
||||
|
||||
rx_wr--;
|
||||
rx_wr->next = NULL; /* mark end of work requests list */
|
||||
|
||||
isert_conn->post_recv_buf_count += count;
|
||||
ret = ib_post_recv(isert_conn->qp, isert_conn->rx_wr,
|
||||
&rx_wr_failed);
|
||||
&rx_wr_failed);
|
||||
if (ret) {
|
||||
isert_err("ib_post_recv() failed with ret: %d\n", ret);
|
||||
isert_conn->post_recv_buf_count -= count;
|
||||
} else {
|
||||
isert_dbg("Posted %d RX buffers\n", count);
|
||||
isert_conn->rx_desc_head = rx_head;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
isert_post_recv(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc)
|
||||
{
|
||||
struct ib_recv_wr *rx_wr_failed, rx_wr;
|
||||
int ret;
|
||||
|
||||
rx_wr.wr_id = (uintptr_t)rx_desc;
|
||||
rx_wr.sg_list = &rx_desc->rx_sg;
|
||||
rx_wr.num_sge = 1;
|
||||
rx_wr.next = NULL;
|
||||
|
||||
isert_conn->post_recv_buf_count++;
|
||||
ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_failed);
|
||||
if (ret) {
|
||||
isert_err("ib_post_recv() failed with ret: %d\n", ret);
|
||||
isert_conn->post_recv_buf_count--;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1205,7 +1215,8 @@ isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = isert_post_recv(isert_conn, ISERT_MIN_POSTED_RX);
|
||||
ret = isert_post_recvm(isert_conn,
|
||||
ISERT_QP_MAX_RECV_DTOS);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -1278,7 +1289,7 @@ isert_rx_login_req(struct isert_conn *isert_conn)
|
||||
}
|
||||
|
||||
static struct iscsi_cmd
|
||||
*isert_allocate_cmd(struct iscsi_conn *conn)
|
||||
*isert_allocate_cmd(struct iscsi_conn *conn, struct iser_rx_desc *rx_desc)
|
||||
{
|
||||
struct isert_conn *isert_conn = conn->context;
|
||||
struct isert_cmd *isert_cmd;
|
||||
@ -1292,6 +1303,7 @@ static struct iscsi_cmd
|
||||
isert_cmd = iscsit_priv_cmd(cmd);
|
||||
isert_cmd->conn = isert_conn;
|
||||
isert_cmd->iscsi_cmd = cmd;
|
||||
isert_cmd->rx_desc = rx_desc;
|
||||
|
||||
return cmd;
|
||||
}
|
||||
@ -1303,9 +1315,9 @@ isert_handle_scsi_cmd(struct isert_conn *isert_conn,
|
||||
{
|
||||
struct iscsi_conn *conn = isert_conn->conn;
|
||||
struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)buf;
|
||||
struct scatterlist *sg;
|
||||
int imm_data, imm_data_len, unsol_data, sg_nents, rc;
|
||||
bool dump_payload = false;
|
||||
unsigned int data_len;
|
||||
|
||||
rc = iscsit_setup_scsi_cmd(conn, cmd, buf);
|
||||
if (rc < 0)
|
||||
@ -1314,7 +1326,10 @@ isert_handle_scsi_cmd(struct isert_conn *isert_conn,
|
||||
imm_data = cmd->immediate_data;
|
||||
imm_data_len = cmd->first_burst_len;
|
||||
unsol_data = cmd->unsolicited_data;
|
||||
data_len = cmd->se_cmd.data_length;
|
||||
|
||||
if (imm_data && imm_data_len == data_len)
|
||||
cmd->se_cmd.se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC;
|
||||
rc = iscsit_process_scsi_cmd(conn, cmd, hdr);
|
||||
if (rc < 0) {
|
||||
return 0;
|
||||
@ -1326,13 +1341,20 @@ isert_handle_scsi_cmd(struct isert_conn *isert_conn,
|
||||
if (!imm_data)
|
||||
return 0;
|
||||
|
||||
sg = &cmd->se_cmd.t_data_sg[0];
|
||||
sg_nents = max(1UL, DIV_ROUND_UP(imm_data_len, PAGE_SIZE));
|
||||
|
||||
isert_dbg("Copying Immediate SG: %p sg_nents: %u from %p imm_data_len: %d\n",
|
||||
sg, sg_nents, &rx_desc->data[0], imm_data_len);
|
||||
|
||||
sg_copy_from_buffer(sg, sg_nents, &rx_desc->data[0], imm_data_len);
|
||||
if (imm_data_len != data_len) {
|
||||
sg_nents = max(1UL, DIV_ROUND_UP(imm_data_len, PAGE_SIZE));
|
||||
sg_copy_from_buffer(cmd->se_cmd.t_data_sg, sg_nents,
|
||||
&rx_desc->data[0], imm_data_len);
|
||||
isert_dbg("Copy Immediate sg_nents: %u imm_data_len: %d\n",
|
||||
sg_nents, imm_data_len);
|
||||
} else {
|
||||
sg_init_table(&isert_cmd->sg, 1);
|
||||
cmd->se_cmd.t_data_sg = &isert_cmd->sg;
|
||||
cmd->se_cmd.t_data_nents = 1;
|
||||
sg_set_buf(&isert_cmd->sg, &rx_desc->data[0], imm_data_len);
|
||||
isert_dbg("Transfer Immediate imm_data_len: %d\n",
|
||||
imm_data_len);
|
||||
}
|
||||
|
||||
cmd->write_data_done += imm_data_len;
|
||||
|
||||
@ -1407,6 +1429,15 @@ isert_handle_iscsi_dataout(struct isert_conn *isert_conn,
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/*
|
||||
* multiple data-outs on the same command can arrive -
|
||||
* so post the buffer before hand
|
||||
*/
|
||||
rc = isert_post_recv(isert_conn, rx_desc);
|
||||
if (rc) {
|
||||
isert_err("ib_post_recv failed with %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1479,7 +1510,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
|
||||
|
||||
switch (opcode) {
|
||||
case ISCSI_OP_SCSI_CMD:
|
||||
cmd = isert_allocate_cmd(conn);
|
||||
cmd = isert_allocate_cmd(conn, rx_desc);
|
||||
if (!cmd)
|
||||
break;
|
||||
|
||||
@ -1493,7 +1524,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
|
||||
rx_desc, (unsigned char *)hdr);
|
||||
break;
|
||||
case ISCSI_OP_NOOP_OUT:
|
||||
cmd = isert_allocate_cmd(conn);
|
||||
cmd = isert_allocate_cmd(conn, rx_desc);
|
||||
if (!cmd)
|
||||
break;
|
||||
|
||||
@ -1506,7 +1537,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
|
||||
(unsigned char *)hdr);
|
||||
break;
|
||||
case ISCSI_OP_SCSI_TMFUNC:
|
||||
cmd = isert_allocate_cmd(conn);
|
||||
cmd = isert_allocate_cmd(conn, rx_desc);
|
||||
if (!cmd)
|
||||
break;
|
||||
|
||||
@ -1514,22 +1545,20 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
|
||||
(unsigned char *)hdr);
|
||||
break;
|
||||
case ISCSI_OP_LOGOUT:
|
||||
cmd = isert_allocate_cmd(conn);
|
||||
cmd = isert_allocate_cmd(conn, rx_desc);
|
||||
if (!cmd)
|
||||
break;
|
||||
|
||||
ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr);
|
||||
break;
|
||||
case ISCSI_OP_TEXT:
|
||||
if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF) {
|
||||
if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF)
|
||||
cmd = iscsit_find_cmd_from_itt(conn, hdr->itt);
|
||||
if (!cmd)
|
||||
break;
|
||||
} else {
|
||||
cmd = isert_allocate_cmd(conn);
|
||||
if (!cmd)
|
||||
break;
|
||||
}
|
||||
else
|
||||
cmd = isert_allocate_cmd(conn, rx_desc);
|
||||
|
||||
if (!cmd)
|
||||
break;
|
||||
|
||||
isert_cmd = iscsit_priv_cmd(cmd);
|
||||
ret = isert_handle_text_cmd(isert_conn, isert_cmd, cmd,
|
||||
@ -1589,7 +1618,7 @@ isert_rcv_completion(struct iser_rx_desc *desc,
|
||||
struct ib_device *ib_dev = isert_conn->cm_id->device;
|
||||
struct iscsi_hdr *hdr;
|
||||
u64 rx_dma;
|
||||
int rx_buflen, outstanding;
|
||||
int rx_buflen;
|
||||
|
||||
if ((char *)desc == isert_conn->login_req_buf) {
|
||||
rx_dma = isert_conn->login_req_dma;
|
||||
@ -1629,22 +1658,6 @@ isert_rcv_completion(struct iser_rx_desc *desc,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
isert_conn->post_recv_buf_count--;
|
||||
isert_dbg("Decremented post_recv_buf_count: %d\n",
|
||||
isert_conn->post_recv_buf_count);
|
||||
|
||||
if ((char *)desc == isert_conn->login_req_buf)
|
||||
return;
|
||||
|
||||
outstanding = isert_conn->post_recv_buf_count;
|
||||
if (outstanding + ISERT_MIN_POSTED_RX <= ISERT_QP_MAX_RECV_DTOS) {
|
||||
int err, count = min(ISERT_QP_MAX_RECV_DTOS - outstanding,
|
||||
ISERT_MIN_POSTED_RX);
|
||||
err = isert_post_recv(isert_conn, count);
|
||||
if (err) {
|
||||
isert_err("isert_post_recv() count: %d failed, %d\n",
|
||||
count, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2156,6 +2169,12 @@ isert_post_response(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd)
|
||||
struct ib_send_wr *wr_failed;
|
||||
int ret;
|
||||
|
||||
ret = isert_post_recv(isert_conn, isert_cmd->rx_desc);
|
||||
if (ret) {
|
||||
isert_err("ib_post_recv failed with %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ib_post_send(isert_conn->qp, &isert_cmd->tx_desc.send_wr,
|
||||
&wr_failed);
|
||||
if (ret) {
|
||||
@ -2950,6 +2969,12 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
||||
&isert_cmd->tx_desc.send_wr);
|
||||
isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr;
|
||||
wr->send_wr_num += 1;
|
||||
|
||||
rc = isert_post_recv(isert_conn, isert_cmd->rx_desc);
|
||||
if (rc) {
|
||||
isert_err("ib_post_recv failed with %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed);
|
||||
@ -2999,9 +3024,16 @@ isert_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, bool recovery)
|
||||
static int
|
||||
isert_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state)
|
||||
{
|
||||
int ret;
|
||||
struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
|
||||
int ret = 0;
|
||||
|
||||
switch (state) {
|
||||
case ISTATE_REMOVE:
|
||||
spin_lock_bh(&conn->cmd_lock);
|
||||
list_del_init(&cmd->i_conn_node);
|
||||
spin_unlock_bh(&conn->cmd_lock);
|
||||
isert_put_cmd(isert_cmd, true);
|
||||
break;
|
||||
case ISTATE_SEND_NOPIN_WANT_RESPONSE:
|
||||
ret = isert_put_nopin(cmd, conn, false);
|
||||
break;
|
||||
@ -3106,10 +3138,10 @@ isert_setup_np(struct iscsi_np *np,
|
||||
isert_err("Unable to allocate struct isert_np\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
sema_init(&isert_np->np_sem, 0);
|
||||
mutex_init(&isert_np->np_accept_mutex);
|
||||
INIT_LIST_HEAD(&isert_np->np_accept_list);
|
||||
init_completion(&isert_np->np_login_comp);
|
||||
sema_init(&isert_np->sem, 0);
|
||||
mutex_init(&isert_np->mutex);
|
||||
INIT_LIST_HEAD(&isert_np->accepted);
|
||||
INIT_LIST_HEAD(&isert_np->pending);
|
||||
isert_np->np = np;
|
||||
|
||||
/*
|
||||
@ -3125,7 +3157,7 @@ isert_setup_np(struct iscsi_np *np,
|
||||
goto out;
|
||||
}
|
||||
|
||||
isert_np->np_cm_id = isert_lid;
|
||||
isert_np->cm_id = isert_lid;
|
||||
np->np_context = isert_np;
|
||||
|
||||
return 0;
|
||||
@ -3214,7 +3246,7 @@ isert_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
|
||||
int ret;
|
||||
|
||||
accept_wait:
|
||||
ret = down_interruptible(&isert_np->np_sem);
|
||||
ret = down_interruptible(&isert_np->sem);
|
||||
if (ret)
|
||||
return -ENODEV;
|
||||
|
||||
@ -3231,15 +3263,15 @@ accept_wait:
|
||||
}
|
||||
spin_unlock_bh(&np->np_thread_lock);
|
||||
|
||||
mutex_lock(&isert_np->np_accept_mutex);
|
||||
if (list_empty(&isert_np->np_accept_list)) {
|
||||
mutex_unlock(&isert_np->np_accept_mutex);
|
||||
mutex_lock(&isert_np->mutex);
|
||||
if (list_empty(&isert_np->pending)) {
|
||||
mutex_unlock(&isert_np->mutex);
|
||||
goto accept_wait;
|
||||
}
|
||||
isert_conn = list_first_entry(&isert_np->np_accept_list,
|
||||
struct isert_conn, accept_node);
|
||||
list_del_init(&isert_conn->accept_node);
|
||||
mutex_unlock(&isert_np->np_accept_mutex);
|
||||
isert_conn = list_first_entry(&isert_np->pending,
|
||||
struct isert_conn, node);
|
||||
list_del_init(&isert_conn->node);
|
||||
mutex_unlock(&isert_np->mutex);
|
||||
|
||||
conn->context = isert_conn;
|
||||
isert_conn->conn = conn;
|
||||
@ -3257,28 +3289,39 @@ isert_free_np(struct iscsi_np *np)
|
||||
struct isert_np *isert_np = np->np_context;
|
||||
struct isert_conn *isert_conn, *n;
|
||||
|
||||
if (isert_np->np_cm_id)
|
||||
rdma_destroy_id(isert_np->np_cm_id);
|
||||
if (isert_np->cm_id)
|
||||
rdma_destroy_id(isert_np->cm_id);
|
||||
|
||||
/*
|
||||
* FIXME: At this point we don't have a good way to insure
|
||||
* that at this point we don't have hanging connections that
|
||||
* completed RDMA establishment but didn't start iscsi login
|
||||
* process. So work-around this by cleaning up what ever piled
|
||||
* up in np_accept_list.
|
||||
* up in accepted and pending lists.
|
||||
*/
|
||||
mutex_lock(&isert_np->np_accept_mutex);
|
||||
if (!list_empty(&isert_np->np_accept_list)) {
|
||||
isert_info("Still have isert connections, cleaning up...\n");
|
||||
mutex_lock(&isert_np->mutex);
|
||||
if (!list_empty(&isert_np->pending)) {
|
||||
isert_info("Still have isert pending connections\n");
|
||||
list_for_each_entry_safe(isert_conn, n,
|
||||
&isert_np->np_accept_list,
|
||||
accept_node) {
|
||||
&isert_np->pending,
|
||||
node) {
|
||||
isert_info("cleaning isert_conn %p state (%d)\n",
|
||||
isert_conn, isert_conn->state);
|
||||
isert_connect_release(isert_conn);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&isert_np->np_accept_mutex);
|
||||
|
||||
if (!list_empty(&isert_np->accepted)) {
|
||||
isert_info("Still have isert accepted connections\n");
|
||||
list_for_each_entry_safe(isert_conn, n,
|
||||
&isert_np->accepted,
|
||||
node) {
|
||||
isert_info("cleaning isert_conn %p state (%d)\n",
|
||||
isert_conn, isert_conn->state);
|
||||
isert_connect_release(isert_conn);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&isert_np->mutex);
|
||||
|
||||
np->np_context = NULL;
|
||||
kfree(isert_np);
|
||||
@ -3345,6 +3388,41 @@ isert_wait4flush(struct isert_conn *isert_conn)
|
||||
wait_for_completion(&isert_conn->wait_comp_err);
|
||||
}
|
||||
|
||||
/**
|
||||
* isert_put_unsol_pending_cmds() - Drop commands waiting for
|
||||
* unsolicitate dataout
|
||||
* @conn: iscsi connection
|
||||
*
|
||||
* We might still have commands that are waiting for unsolicited
|
||||
* dataouts messages. We must put the extra reference on those
|
||||
* before blocking on the target_wait_for_session_cmds
|
||||
*/
|
||||
static void
|
||||
isert_put_unsol_pending_cmds(struct iscsi_conn *conn)
|
||||
{
|
||||
struct iscsi_cmd *cmd, *tmp;
|
||||
static LIST_HEAD(drop_cmd_list);
|
||||
|
||||
spin_lock_bh(&conn->cmd_lock);
|
||||
list_for_each_entry_safe(cmd, tmp, &conn->conn_cmd_list, i_conn_node) {
|
||||
if ((cmd->cmd_flags & ICF_NON_IMMEDIATE_UNSOLICITED_DATA) &&
|
||||
(cmd->write_data_done < conn->sess->sess_ops->FirstBurstLength) &&
|
||||
(cmd->write_data_done < cmd->se_cmd.data_length))
|
||||
list_move_tail(&cmd->i_conn_node, &drop_cmd_list);
|
||||
}
|
||||
spin_unlock_bh(&conn->cmd_lock);
|
||||
|
||||
list_for_each_entry_safe(cmd, tmp, &drop_cmd_list, i_conn_node) {
|
||||
list_del_init(&cmd->i_conn_node);
|
||||
if (cmd->i_state != ISTATE_REMOVE) {
|
||||
struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
|
||||
|
||||
isert_info("conn %p dropping cmd %p\n", conn, cmd);
|
||||
isert_put_cmd(isert_cmd, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void isert_wait_conn(struct iscsi_conn *conn)
|
||||
{
|
||||
struct isert_conn *isert_conn = conn->context;
|
||||
@ -3363,8 +3441,9 @@ static void isert_wait_conn(struct iscsi_conn *conn)
|
||||
isert_conn_terminate(isert_conn);
|
||||
mutex_unlock(&isert_conn->mutex);
|
||||
|
||||
isert_wait4cmds(conn);
|
||||
isert_wait4flush(isert_conn);
|
||||
isert_put_unsol_pending_cmds(conn);
|
||||
isert_wait4cmds(conn);
|
||||
isert_wait4logout(isert_conn);
|
||||
|
||||
queue_work(isert_release_wq, &isert_conn->release_work);
|
||||
|
@ -113,7 +113,6 @@ enum {
|
||||
};
|
||||
|
||||
struct isert_rdma_wr {
|
||||
struct list_head wr_list;
|
||||
struct isert_cmd *isert_cmd;
|
||||
enum iser_ib_op_code iser_ib_op;
|
||||
struct ib_sge *ib_sge;
|
||||
@ -134,14 +133,13 @@ struct isert_cmd {
|
||||
uint64_t write_va;
|
||||
u64 pdu_buf_dma;
|
||||
u32 pdu_buf_len;
|
||||
u32 read_va_off;
|
||||
u32 write_va_off;
|
||||
u32 rdma_wr_num;
|
||||
struct isert_conn *conn;
|
||||
struct iscsi_cmd *iscsi_cmd;
|
||||
struct iser_tx_desc tx_desc;
|
||||
struct iser_rx_desc *rx_desc;
|
||||
struct isert_rdma_wr rdma_wr;
|
||||
struct work_struct comp_work;
|
||||
struct scatterlist sg;
|
||||
};
|
||||
|
||||
struct isert_device;
|
||||
@ -159,11 +157,10 @@ struct isert_conn {
|
||||
u64 login_req_dma;
|
||||
int login_req_len;
|
||||
u64 login_rsp_dma;
|
||||
unsigned int rx_desc_head;
|
||||
struct iser_rx_desc *rx_descs;
|
||||
struct ib_recv_wr rx_wr[ISERT_MIN_POSTED_RX];
|
||||
struct ib_recv_wr rx_wr[ISERT_QP_MAX_RECV_DTOS];
|
||||
struct iscsi_conn *conn;
|
||||
struct list_head accept_node;
|
||||
struct list_head node;
|
||||
struct completion login_comp;
|
||||
struct completion login_req_comp;
|
||||
struct iser_tx_desc login_tx_desc;
|
||||
@ -222,9 +219,9 @@ struct isert_device {
|
||||
|
||||
struct isert_np {
|
||||
struct iscsi_np *np;
|
||||
struct semaphore np_sem;
|
||||
struct rdma_cm_id *np_cm_id;
|
||||
struct mutex np_accept_mutex;
|
||||
struct list_head np_accept_list;
|
||||
struct completion np_login_comp;
|
||||
struct semaphore sem;
|
||||
struct rdma_cm_id *cm_id;
|
||||
struct mutex mutex;
|
||||
struct list_head accepted;
|
||||
struct list_head pending;
|
||||
};
|
||||
|
@ -196,6 +196,7 @@ config JOYSTICK_TWIDJOY
|
||||
config JOYSTICK_ZHENHUA
|
||||
tristate "5-byte Zhenhua RC transmitter"
|
||||
select SERIO
|
||||
select BITREVERSE
|
||||
help
|
||||
Say Y here if you have a Zhen Hua PPM-4CH transmitter which is
|
||||
supplied with a ready to fly micro electric indoor helicopters
|
||||
|
@ -43,7 +43,7 @@ config IOMMU_IO_PGTABLE_LPAE_SELFTEST
|
||||
endmenu
|
||||
|
||||
config IOMMU_IOVA
|
||||
bool
|
||||
tristate
|
||||
|
||||
config OF_IOMMU
|
||||
def_bool y
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user