Merge branch 'linus' into x86/timers

Pick up upstream changes to avoid conflicts
This commit is contained in:
Thomas Gleixner 2018-07-19 23:11:52 +02:00
commit 73ab603f44
638 changed files with 6161 additions and 3382 deletions

View File

@ -4846,3 +4846,8 @@
xirc2ps_cs= [NET,PCMCIA] xirc2ps_cs= [NET,PCMCIA]
Format: Format:
<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
xhci-hcd.quirks [USB,KNL]
A hex value specifying bitmask with supplemental xhci
host controller quirks. Meaning of each bit can be
consulted in header drivers/usb/host/xhci.h.

View File

@ -66,7 +66,7 @@ Required root node properties:
- "insignal,arndale-octa" - for Exynos5420-based Insignal Arndale - "insignal,arndale-octa" - for Exynos5420-based Insignal Arndale
Octa board. Octa board.
- "insignal,origen" - for Exynos4210-based Insignal Origen board. - "insignal,origen" - for Exynos4210-based Insignal Origen board.
- "insignal,origen4412 - for Exynos4412-based Insignal Origen board. - "insignal,origen4412" - for Exynos4412-based Insignal Origen board.
Optional nodes: Optional nodes:

View File

@ -36,7 +36,7 @@ Optional nodes:
- port/ports: to describe a connection to an external encoder. The - port/ports: to describe a connection to an external encoder. The
binding follows Documentation/devicetree/bindings/graph.txt and binding follows Documentation/devicetree/bindings/graph.txt and
suppors a single port with a single endpoint. supports a single port with a single endpoint.
- See also Documentation/devicetree/bindings/display/tilcdc/panel.txt and - See also Documentation/devicetree/bindings/display/tilcdc/panel.txt and
Documentation/devicetree/bindings/display/tilcdc/tfp410.txt for connecting Documentation/devicetree/bindings/display/tilcdc/tfp410.txt for connecting

View File

@ -1,7 +1,7 @@
Nintendo Wii (Hollywood) GPIO controller Nintendo Wii (Hollywood) GPIO controller
Required properties: Required properties:
- compatible: "nintendo,hollywood-gpio - compatible: "nintendo,hollywood-gpio"
- reg: Physical base address and length of the controller's registers. - reg: Physical base address and length of the controller's registers.
- gpio-controller: Marks the device node as a GPIO controller. - gpio-controller: Marks the device node as a GPIO controller.
- #gpio-cells: Should be <2>. The first cell is the pin number and the - #gpio-cells: Should be <2>. The first cell is the pin number and the

View File

@ -32,7 +32,7 @@ i2c@00000000 {
reg = <0x6c>; reg = <0x6c>;
interrupt-parent = <&gpx1>; interrupt-parent = <&gpx1>;
interrupts = <2 IRQ_TYPE_LEVEL_LOW>; interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
vdd-supply = <&ldo15_reg>"; vdd-supply = <&ldo15_reg>;
vid-supply = <&ldo18_reg>; vid-supply = <&ldo18_reg>;
reset-gpios = <&gpx1 5 0>; reset-gpios = <&gpx1 5 0>;
touchscreen-size-x = <1080>; touchscreen-size-x = <1080>;

View File

@ -15,7 +15,7 @@ Required properties:
include "nvidia,tegra30-ictlr". include "nvidia,tegra30-ictlr".
- reg : Specifies base physical address and size of the registers. - reg : Specifies base physical address and size of the registers.
Each controller must be described separately (Tegra20 has 4 of them, Each controller must be described separately (Tegra20 has 4 of them,
whereas Tegra30 and later have 5" whereas Tegra30 and later have 5).
- interrupt-controller : Identifies the node as an interrupt controller. - interrupt-controller : Identifies the node as an interrupt controller.
- #interrupt-cells : Specifies the number of cells needed to encode an - #interrupt-cells : Specifies the number of cells needed to encode an
interrupt source. The value must be 3. interrupt source. The value must be 3.

View File

@ -12,7 +12,7 @@ Required properties:
specifier, shall be 2 specifier, shall be 2
- interrupts: interrupts references to primary interrupt controller - interrupts: interrupts references to primary interrupt controller
(only needed for exti controller with multiple exti under (only needed for exti controller with multiple exti under
same parent interrupt: st,stm32-exti and st,stm32h7-exti") same parent interrupt: st,stm32-exti and st,stm32h7-exti)
Example: Example:

View File

@ -152,7 +152,7 @@ Required properties:
- compatible : should contain one of: - compatible : should contain one of:
"brcm,bcm7425-timers" "brcm,bcm7425-timers"
"brcm,bcm7429-timers" "brcm,bcm7429-timers"
"brcm,bcm7435-timers and "brcm,bcm7435-timers" and
"brcm,brcmstb-timers" "brcm,brcmstb-timers"
- reg : the timers register range - reg : the timers register range
- interrupts : the interrupt line for this timer block - interrupts : the interrupt line for this timer block

View File

@ -238,7 +238,7 @@ PROPERTIES
Must include one of the following: Must include one of the following:
- "fsl,fman-dtsec" for dTSEC MAC - "fsl,fman-dtsec" for dTSEC MAC
- "fsl,fman-xgec" for XGEC MAC - "fsl,fman-xgec" for XGEC MAC
- "fsl,fman-memac for mEMAC MAC - "fsl,fman-memac" for mEMAC MAC
- cell-index - cell-index
Usage: required Usage: required

View File

@ -133,7 +133,7 @@ located inside a PM domain with index 0 of a power controller represented by a
node with the label "power". node with the label "power".
In the second example the consumer device are partitioned across two PM domains, In the second example the consumer device are partitioned across two PM domains,
the first with index 0 and the second with index 1, of a power controller that the first with index 0 and the second with index 1, of a power controller that
is represented by a node with the label "power. is represented by a node with the label "power".
Optional properties: Optional properties:
- required-opps: This contains phandle to an OPP node in another device's OPP - required-opps: This contains phandle to an OPP node in another device's OPP

View File

@ -16,7 +16,7 @@ Required properties:
Optional properties: Optional properties:
- ti,enable-ext-control: This is applicable for DCDC1, DCDC2 and DCDC3. - ti,enable-ext-control: This is applicable for DCDC1, DCDC2 and DCDC3.
If DCDCs are externally controlled then this property should be there. If DCDCs are externally controlled then this property should be there.
- "dcdc-ext-control-gpios: This is applicable for DCDC1, DCDC2 and DCDC3. - dcdc-ext-control-gpios: This is applicable for DCDC1, DCDC2 and DCDC3.
If DCDCs are externally controlled and if it is from GPIO then GPIO If DCDCs are externally controlled and if it is from GPIO then GPIO
number should be provided. If it is externally controlled and no GPIO number should be provided. If it is externally controlled and no GPIO
entry then driver will just configure this rails as external control entry then driver will just configure this rails as external control

View File

@ -15,7 +15,7 @@ Please refer to reset.txt in this directory for common reset
controller binding usage. controller binding usage.
Required properties: Required properties:
- compatible: Should be st,stih407-softreset"; - compatible: Should be "st,stih407-softreset";
- #reset-cells: 1, see below - #reset-cells: 1, see below
example: example:

View File

@ -39,7 +39,7 @@ Required properties:
Optional property: Optional property:
- clock-frequency: Desired I2C bus clock frequency in Hz. - clock-frequency: Desired I2C bus clock frequency in Hz.
When missing default to 400000Hz. When missing default to 100000Hz.
Child nodes should conform to I2C bus binding as described in i2c.txt. Child nodes should conform to I2C bus binding as described in i2c.txt.

View File

@ -30,7 +30,7 @@ Required properties:
Board connectors: Board connectors:
* Headset Mic * Headset Mic
* Secondary Mic", * Secondary Mic
* DMIC * DMIC
* Ext Spk * Ext Spk

View File

@ -35,7 +35,7 @@ This binding describes the APQ8096 sound card, which uses qdsp for audio.
"Digital Mic3" "Digital Mic3"
Audio pins and MicBias on WCD9335 Codec: Audio pins and MicBias on WCD9335 Codec:
"MIC_BIAS1 "MIC_BIAS1"
"MIC_BIAS2" "MIC_BIAS2"
"MIC_BIAS3" "MIC_BIAS3"
"MIC_BIAS4" "MIC_BIAS4"

View File

@ -15,7 +15,7 @@ Optional properties:
Examples: Examples:
onewire@0 { onewire {
compatible = "w1-gpio"; compatible = "w1-gpio";
gpios = <&gpio 126 0>, <&gpio 105 0>; gpios = <&gpio 126 0>, <&gpio 105 0>;
}; };

View File

@ -50,6 +50,11 @@ LDFLAGS_MODULE
-------------------------------------------------- --------------------------------------------------
Additional options used for $(LD) when linking modules. Additional options used for $(LD) when linking modules.
KBUILD_KCONFIG
--------------------------------------------------
Set the top-level Kconfig file to the value of this environment
variable. The default name is "Kconfig".
KBUILD_VERBOSE KBUILD_VERBOSE
-------------------------------------------------- --------------------------------------------------
Set the kbuild verbosity. Can be assigned same values as "V=...". Set the kbuild verbosity. Can be assigned same values as "V=...".
@ -88,7 +93,8 @@ In most cases the name of the architecture is the same as the
directory name found in the arch/ directory. directory name found in the arch/ directory.
But some architectures such as x86 and sparc have aliases. But some architectures such as x86 and sparc have aliases.
x86: i386 for 32 bit, x86_64 for 64 bit x86: i386 for 32 bit, x86_64 for 64 bit
sparc: sparc for 32 bit, sparc64 for 64 bit sh: sh for 32 bit, sh64 for 64 bit
sparc: sparc32 for 32 bit, sparc64 for 64 bit
CROSS_COMPILE CROSS_COMPILE
-------------------------------------------------- --------------------------------------------------
@ -148,15 +154,6 @@ stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
the default option --strip-debug will be used. Otherwise, the default option --strip-debug will be used. Otherwise,
INSTALL_MOD_STRIP value will be used as the options to the strip command. INSTALL_MOD_STRIP value will be used as the options to the strip command.
INSTALL_FW_PATH
--------------------------------------------------
INSTALL_FW_PATH specifies where to install the firmware blobs.
The default value is:
$(INSTALL_MOD_PATH)/lib/firmware
The value can be overridden in which case the default value is ignored.
INSTALL_HDR_PATH INSTALL_HDR_PATH
-------------------------------------------------- --------------------------------------------------
INSTALL_HDR_PATH specifies where to install user space headers when INSTALL_HDR_PATH specifies where to install user space headers when

View File

@ -2,9 +2,9 @@ This file contains some assistance for using "make *config".
Use "make help" to list all of the possible configuration targets. Use "make help" to list all of the possible configuration targets.
The xconfig ('qconf') and menuconfig ('mconf') programs also The xconfig ('qconf'), menuconfig ('mconf'), and nconfig ('nconf')
have embedded help text. Be sure to check it for navigation, programs also have embedded help text. Be sure to check that for
search, and other general help text. navigation, search, and other general help text.
====================================================================== ======================================================================
General General
@ -17,13 +17,16 @@ this happens, using a previously working .config file and running
for you, so you may find that you need to see what NEW kernel for you, so you may find that you need to see what NEW kernel
symbols have been introduced. symbols have been introduced.
To see a list of new config symbols when using "make oldconfig", use To see a list of new config symbols, use
cp user/some/old.config .config cp user/some/old.config .config
make listnewconfig make listnewconfig
and the config program will list any new symbols, one per line. and the config program will list any new symbols, one per line.
Alternatively, you can use the brute force method:
make oldconfig
scripts/diffconfig .config.old .config | less scripts/diffconfig .config.old .config | less
______________________________________________________________________ ______________________________________________________________________
@ -160,7 +163,7 @@ Searching in menuconfig:
This lists all config symbols that contain "hotplug", This lists all config symbols that contain "hotplug",
e.g., HOTPLUG_CPU, MEMORY_HOTPLUG. e.g., HOTPLUG_CPU, MEMORY_HOTPLUG.
For search help, enter / followed TAB-TAB-TAB (to highlight For search help, enter / followed by TAB-TAB (to highlight
<Help>) and Enter. This will tell you that you can also use <Help>) and Enter. This will tell you that you can also use
regular expressions (regexes) in the search string, so if you regular expressions (regexes) in the search string, so if you
are not interested in MEMORY_HOTPLUG, you could try are not interested in MEMORY_HOTPLUG, you could try
@ -202,6 +205,39 @@ Example:
make MENUCONFIG_MODE=single_menu menuconfig make MENUCONFIG_MODE=single_menu menuconfig
======================================================================
nconfig
--------------------------------------------------
nconfig is an alternate text-based configurator. It lists function
keys across the bottom of the terminal (window) that execute commands.
You can also just use the corresponding numeric key to execute the
commands unless you are in a data entry window. E.g., instead of F6
for Save, you can just press 6.
Use F1 for Global help or F3 for the Short help menu.
Searching in nconfig:
You can search either in the menu entry "prompt" strings
or in the configuration symbols.
Use / to begin a search through the menu entries. This does
not support regular expressions. Use <Down> or <Up> for
Next hit and Previous hit, respectively. Use <Esc> to
terminate the search mode.
F8 (SymSearch) searches the configuration symbols for the
given string or regular expression (regex).
NCONFIG_MODE
--------------------------------------------------
This mode shows all sub-menus in one large tree.
Example:
make NCONFIG_MODE=single_menu nconfig
====================================================================== ======================================================================
xconfig xconfig
-------------------------------------------------- --------------------------------------------------
@ -230,8 +266,7 @@ gconfig
Searching in gconfig: Searching in gconfig:
None (gconfig isn't maintained as well as xconfig or menuconfig); There is no search command in gconfig. However, gconfig does
however, gconfig does have a few more viewing choices than have several different viewing choices, modes, and options.
xconfig does.
### ###

View File

@ -1490,7 +1490,7 @@ To remove an ARP target:
To configure the interval between learning packet transmits: To configure the interval between learning packet transmits:
# echo 12 > /sys/class/net/bond0/bonding/lp_interval # echo 12 > /sys/class/net/bond0/bonding/lp_interval
NOTE: the lp_inteval is the number of seconds between instances where NOTE: the lp_interval is the number of seconds between instances where
the bonding driver sends learning packets to each slaves peer switch. The the bonding driver sends learning packets to each slaves peer switch. The
default interval is 1 second. default interval is 1 second.

View File

@ -47,41 +47,45 @@ Driver Configuration Parameters
The default value for each parameter is generally the recommended setting, The default value for each parameter is generally the recommended setting,
unless otherwise noted. unless otherwise noted.
Rx Descriptors: Number of receive descriptors. A receive descriptor is a data Rx Descriptors:
Number of receive descriptors. A receive descriptor is a data
structure that describes a receive buffer and its attributes to the network structure that describes a receive buffer and its attributes to the network
controller. The data in the descriptor is used by the controller to write controller. The data in the descriptor is used by the controller to write
data from the controller to host memory. In the 3.x.x driver the valid range data from the controller to host memory. In the 3.x.x driver the valid range
for this parameter is 64-256. The default value is 256. This parameter can be for this parameter is 64-256. The default value is 256. This parameter can be
changed using the command:: changed using the command::
ethtool -G eth? rx n ethtool -G eth? rx n
Where n is the number of desired Rx descriptors. Where n is the number of desired Rx descriptors.
Tx Descriptors: Number of transmit descriptors. A transmit descriptor is a data Tx Descriptors:
Number of transmit descriptors. A transmit descriptor is a data
structure that describes a transmit buffer and its attributes to the network structure that describes a transmit buffer and its attributes to the network
controller. The data in the descriptor is used by the controller to read controller. The data in the descriptor is used by the controller to read
data from the host memory to the controller. In the 3.x.x driver the valid data from the host memory to the controller. In the 3.x.x driver the valid
range for this parameter is 64-256. The default value is 128. This parameter range for this parameter is 64-256. The default value is 128. This parameter
can be changed using the command:: can be changed using the command::
ethtool -G eth? tx n ethtool -G eth? tx n
Where n is the number of desired Tx descriptors. Where n is the number of desired Tx descriptors.
Speed/Duplex: The driver auto-negotiates the link speed and duplex settings by Speed/Duplex:
The driver auto-negotiates the link speed and duplex settings by
default. The ethtool utility can be used as follows to force speed/duplex.:: default. The ethtool utility can be used as follows to force speed/duplex.::
ethtool -s eth? autoneg off speed {10|100} duplex {full|half} ethtool -s eth? autoneg off speed {10|100} duplex {full|half}
NOTE: setting the speed/duplex to incorrect values will cause the link to NOTE: setting the speed/duplex to incorrect values will cause the link to
fail. fail.
Event Log Message Level: The driver uses the message level flag to log events Event Log Message Level:
The driver uses the message level flag to log events
to syslog. The message level can be set at driver load time. It can also be to syslog. The message level can be set at driver load time. It can also be
set using the command:: set using the command::
ethtool -s eth? msglvl n ethtool -s eth? msglvl n
Additional Configurations Additional Configurations
@ -92,7 +96,7 @@ Configuring the Driver on Different Distributions
Configuring a network driver to load properly when the system is started Configuring a network driver to load properly when the system is started
is distribution dependent. Typically, the configuration process involves is distribution dependent. Typically, the configuration process involves
adding an alias line to /etc/modprobe.d/*.conf as well as editing other adding an alias line to `/etc/modprobe.d/*.conf` as well as editing other
system startup scripts and/or configuration files. Many popular Linux system startup scripts and/or configuration files. Many popular Linux
distributions ship with tools to make these changes for you. To learn distributions ship with tools to make these changes for you. To learn
the proper way to configure a network device for your system, refer to the proper way to configure a network device for your system, refer to
@ -160,7 +164,10 @@ This results in unbalanced receive traffic.
If you have multiple interfaces in a server, either turn on ARP If you have multiple interfaces in a server, either turn on ARP
filtering by filtering by
(1) entering:: echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter (1) entering::
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
(this only works if your kernel's version is higher than 2.4.5), or (this only works if your kernel's version is higher than 2.4.5), or
(2) installing the interfaces in separate broadcast domains (either (2) installing the interfaces in separate broadcast domains (either

View File

@ -34,7 +34,8 @@ Command Line Parameters
The default value for each parameter is generally the recommended setting, The default value for each parameter is generally the recommended setting,
unless otherwise noted. unless otherwise noted.
NOTES: For more information about the AutoNeg, Duplex, and Speed NOTES:
For more information about the AutoNeg, Duplex, and Speed
parameters, see the "Speed and Duplex Configuration" section in parameters, see the "Speed and Duplex Configuration" section in
this document. this document.
@ -45,22 +46,27 @@ NOTES: For more information about the AutoNeg, Duplex, and Speed
AutoNeg AutoNeg
------- -------
(Supported only on adapters with copper connections) (Supported only on adapters with copper connections)
Valid Range: 0x01-0x0F, 0x20-0x2F
Default Value: 0x2F :Valid Range: 0x01-0x0F, 0x20-0x2F
:Default Value: 0x2F
This parameter is a bit-mask that specifies the speed and duplex settings This parameter is a bit-mask that specifies the speed and duplex settings
advertised by the adapter. When this parameter is used, the Speed and advertised by the adapter. When this parameter is used, the Speed and
Duplex parameters must not be specified. Duplex parameters must not be specified.
NOTE: Refer to the Speed and Duplex section of this readme for more NOTE:
Refer to the Speed and Duplex section of this readme for more
information on the AutoNeg parameter. information on the AutoNeg parameter.
Duplex Duplex
------ ------
(Supported only on adapters with copper connections) (Supported only on adapters with copper connections)
Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
Default Value: 0 :Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
:Default Value: 0
This defines the direction in which data is allowed to flow. Can be This defines the direction in which data is allowed to flow. Can be
either one or two-directional. If both Duplex and the link partner are either one or two-directional. If both Duplex and the link partner are
@ -70,18 +76,22 @@ duplex.
FlowControl FlowControl
----------- -----------
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
Default Value: Reads flow control settings from the EEPROM :Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
:Default Value: Reads flow control settings from the EEPROM
This parameter controls the automatic generation(Tx) and response(Rx) This parameter controls the automatic generation(Tx) and response(Rx)
to Ethernet PAUSE frames. to Ethernet PAUSE frames.
InterruptThrottleRate InterruptThrottleRate
--------------------- ---------------------
(not supported on Intel(R) 82542, 82543 or 82544-based adapters) (not supported on Intel(R) 82542, 82543 or 82544-based adapters)
Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
4=simplified balancing) :Valid Range:
Default Value: 3 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
4=simplified balancing)
:Default Value: 3
The driver can limit the amount of interrupts per second that the adapter The driver can limit the amount of interrupts per second that the adapter
will generate for incoming packets. It does this by writing a value to the will generate for incoming packets. It does this by writing a value to the
@ -135,13 +145,15 @@ Setting InterruptThrottleRate to 0 turns off any interrupt moderation
and may improve small packet latency, but is generally not suitable and may improve small packet latency, but is generally not suitable
for bulk throughput traffic. for bulk throughput traffic.
NOTE: InterruptThrottleRate takes precedence over the TxAbsIntDelay and NOTE:
InterruptThrottleRate takes precedence over the TxAbsIntDelay and
RxAbsIntDelay parameters. In other words, minimizing the receive RxAbsIntDelay parameters. In other words, minimizing the receive
and/or transmit absolute delays does not force the controller to and/or transmit absolute delays does not force the controller to
generate more interrupts than what the Interrupt Throttle Rate generate more interrupts than what the Interrupt Throttle Rate
allows. allows.
CAUTION: If you are using the Intel(R) PRO/1000 CT Network Connection CAUTION:
If you are using the Intel(R) PRO/1000 CT Network Connection
(controller 82547), setting InterruptThrottleRate to a value (controller 82547), setting InterruptThrottleRate to a value
greater than 75,000, may hang (stop transmitting) adapters greater than 75,000, may hang (stop transmitting) adapters
under certain network conditions. If this occurs a NETDEV under certain network conditions. If this occurs a NETDEV
@ -151,7 +163,8 @@ CAUTION: If you are using the Intel(R) PRO/1000 CT Network Connection
hang, ensure that InterruptThrottleRate is set no greater hang, ensure that InterruptThrottleRate is set no greater
than 75,000 and is not set to 0. than 75,000 and is not set to 0.
NOTE: When e1000 is loaded with default settings and multiple adapters NOTE:
When e1000 is loaded with default settings and multiple adapters
are in use simultaneously, the CPU utilization may increase non- are in use simultaneously, the CPU utilization may increase non-
linearly. In order to limit the CPU utilization without impacting linearly. In order to limit the CPU utilization without impacting
the overall throughput, we recommend that you load the driver as the overall throughput, we recommend that you load the driver as
@ -168,9 +181,11 @@ NOTE: When e1000 is loaded with default settings and multiple adapters
RxDescriptors RxDescriptors
------------- -------------
Valid Range: 48-256 for 82542 and 82543-based adapters
48-4096 for all other supported adapters :Valid Range:
Default Value: 256 - 48-256 for 82542 and 82543-based adapters
- 48-4096 for all other supported adapters
:Default Value: 256
This value specifies the number of receive buffer descriptors allocated This value specifies the number of receive buffer descriptors allocated
by the driver. Increasing this value allows the driver to buffer more by the driver. Increasing this value allows the driver to buffer more
@ -180,15 +195,17 @@ Each descriptor is 16 bytes. A receive buffer is also allocated for each
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
on the MTU setting. The maximum MTU size is 16110. on the MTU setting. The maximum MTU size is 16110.
NOTE: MTU designates the frame size. It only needs to be set for Jumbo NOTE:
MTU designates the frame size. It only needs to be set for Jumbo
Frames. Depending on the available system resources, the request Frames. Depending on the available system resources, the request
for a higher number of receive descriptors may be denied. In this for a higher number of receive descriptors may be denied. In this
case, use a lower number. case, use a lower number.
RxIntDelay RxIntDelay
---------- ----------
Valid Range: 0-65535 (0=off)
Default Value: 0 :Valid Range: 0-65535 (0=off)
:Default Value: 0
This value delays the generation of receive interrupts in units of 1.024 This value delays the generation of receive interrupts in units of 1.024
microseconds. Receive interrupt reduction can improve CPU efficiency if microseconds. Receive interrupt reduction can improve CPU efficiency if
@ -198,7 +215,8 @@ of TCP traffic. If the system is reporting dropped receives, this value
may be set too high, causing the driver to run out of available receive may be set too high, causing the driver to run out of available receive
descriptors. descriptors.
CAUTION: When setting RxIntDelay to a value other than 0, adapters may CAUTION:
When setting RxIntDelay to a value other than 0, adapters may
hang (stop transmitting) under certain network conditions. If hang (stop transmitting) under certain network conditions. If
this occurs a NETDEV WATCHDOG message is logged in the system this occurs a NETDEV WATCHDOG message is logged in the system
event log. In addition, the controller is automatically reset, event log. In addition, the controller is automatically reset,
@ -207,9 +225,11 @@ CAUTION: When setting RxIntDelay to a value other than 0, adapters may
RxAbsIntDelay RxAbsIntDelay
------------- -------------
(This parameter is supported only on 82540, 82545 and later adapters.) (This parameter is supported only on 82540, 82545 and later adapters.)
Valid Range: 0-65535 (0=off)
Default Value: 128 :Valid Range: 0-65535 (0=off)
:Default Value: 128
This value, in units of 1.024 microseconds, limits the delay in which a This value, in units of 1.024 microseconds, limits the delay in which a
receive interrupt is generated. Useful only if RxIntDelay is non-zero, receive interrupt is generated. Useful only if RxIntDelay is non-zero,
@ -220,9 +240,11 @@ conditions.
Speed Speed
----- -----
(This parameter is supported only on adapters with copper connections.) (This parameter is supported only on adapters with copper connections.)
Valid Settings: 0, 10, 100, 1000
Default Value: 0 (auto-negotiate at all supported speeds) :Valid Settings: 0, 10, 100, 1000
:Default Value: 0 (auto-negotiate at all supported speeds)
Speed forces the line speed to the specified value in megabits per second Speed forces the line speed to the specified value in megabits per second
(Mbps). If this parameter is not specified or is set to 0 and the link (Mbps). If this parameter is not specified or is set to 0 and the link
@ -231,22 +253,26 @@ speed. Duplex should also be set when Speed is set to either 10 or 100.
TxDescriptors TxDescriptors
------------- -------------
Valid Range: 48-256 for 82542 and 82543-based adapters
48-4096 for all other supported adapters :Valid Range:
Default Value: 256 - 48-256 for 82542 and 82543-based adapters
- 48-4096 for all other supported adapters
:Default Value: 256
This value is the number of transmit descriptors allocated by the driver. This value is the number of transmit descriptors allocated by the driver.
Increasing this value allows the driver to queue more transmits. Each Increasing this value allows the driver to queue more transmits. Each
descriptor is 16 bytes. descriptor is 16 bytes.
NOTE: Depending on the available system resources, the request for a NOTE:
Depending on the available system resources, the request for a
higher number of transmit descriptors may be denied. In this case, higher number of transmit descriptors may be denied. In this case,
use a lower number. use a lower number.
TxIntDelay TxIntDelay
---------- ----------
Valid Range: 0-65535 (0=off)
Default Value: 8 :Valid Range: 0-65535 (0=off)
:Default Value: 8
This value delays the generation of transmit interrupts in units of This value delays the generation of transmit interrupts in units of
1.024 microseconds. Transmit interrupt reduction can improve CPU 1.024 microseconds. Transmit interrupt reduction can improve CPU
@ -256,9 +282,11 @@ causing the driver to run out of available transmit descriptors.
TxAbsIntDelay TxAbsIntDelay
------------- -------------
(This parameter is supported only on 82540, 82545 and later adapters.) (This parameter is supported only on 82540, 82545 and later adapters.)
Valid Range: 0-65535 (0=off)
Default Value: 32 :Valid Range: 0-65535 (0=off)
:Default Value: 32
This value, in units of 1.024 microseconds, limits the delay in which a This value, in units of 1.024 microseconds, limits the delay in which a
transmit interrupt is generated. Useful only if TxIntDelay is non-zero, transmit interrupt is generated. Useful only if TxIntDelay is non-zero,
@ -269,18 +297,21 @@ network conditions.
XsumRX XsumRX
------ ------
(This parameter is NOT supported on the 82542-based adapter.) (This parameter is NOT supported on the 82542-based adapter.)
Valid Range: 0-1
Default Value: 1 :Valid Range: 0-1
:Default Value: 1
A value of '1' indicates that the driver should enable IP checksum A value of '1' indicates that the driver should enable IP checksum
offload for received packets (both UDP and TCP) to the adapter hardware. offload for received packets (both UDP and TCP) to the adapter hardware.
Copybreak Copybreak
--------- ---------
Valid Range: 0-xxxxxxx (0=off)
Default Value: 256 :Valid Range: 0-xxxxxxx (0=off)
Usage: modprobe e1000.ko copybreak=128 :Default Value: 256
:Usage: modprobe e1000.ko copybreak=128
Driver copies all packets below or equaling this size to a fresh RX Driver copies all packets below or equaling this size to a fresh RX
buffer before handing it up the stack. buffer before handing it up the stack.
@ -292,8 +323,9 @@ it is also available during runtime at
SmartPowerDownEnable SmartPowerDownEnable
-------------------- --------------------
Valid Range: 0-1
Default Value: 0 (disabled) :Valid Range: 0-1
:Default Value: 0 (disabled)
Allows PHY to turn off in lower power states. The user can turn off Allows PHY to turn off in lower power states. The user can turn off
this parameter in supported chipsets. this parameter in supported chipsets.
@ -309,14 +341,14 @@ fiber interface board only links at 1000 Mbps full-duplex.
For copper-based boards, the keywords interact as follows: For copper-based boards, the keywords interact as follows:
The default operation is auto-negotiate. The board advertises all - The default operation is auto-negotiate. The board advertises all
supported speed and duplex combinations, and it links at the highest supported speed and duplex combinations, and it links at the highest
common speed and duplex mode IF the link partner is set to auto-negotiate. common speed and duplex mode IF the link partner is set to auto-negotiate.
If Speed = 1000, limited auto-negotiation is enabled and only 1000 Mbps - If Speed = 1000, limited auto-negotiation is enabled and only 1000 Mbps
is advertised (The 1000BaseT spec requires auto-negotiation.) is advertised (The 1000BaseT spec requires auto-negotiation.)
If Speed = 10 or 100, then both Speed and Duplex should be set. Auto- - If Speed = 10 or 100, then both Speed and Duplex should be set. Auto-
negotiation is disabled, and the AutoNeg parameter is ignored. Partner negotiation is disabled, and the AutoNeg parameter is ignored. Partner
SHOULD also be forced. SHOULD also be forced.
@ -328,13 +360,15 @@ process.
The parameter may be specified as either a decimal or hexadecimal value as The parameter may be specified as either a decimal or hexadecimal value as
determined by the bitmap below. determined by the bitmap below.
============== ====== ====== ======= ======= ====== ====== ======= ======
Bit position 7 6 5 4 3 2 1 0 Bit position 7 6 5 4 3 2 1 0
Decimal Value 128 64 32 16 8 4 2 1 Decimal Value 128 64 32 16 8 4 2 1
Hex value 80 40 20 10 8 4 2 1 Hex value 80 40 20 10 8 4 2 1
Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10 Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10
Duplex Full Full Half Full Half Duplex Full Full Half Full Half
============== ====== ====== ======= ======= ====== ====== ======= ======
Some examples of using AutoNeg: Some examples of using AutoNeg::
modprobe e1000 AutoNeg=0x01 (Restricts autonegotiation to 10 Half) modprobe e1000 AutoNeg=0x01 (Restricts autonegotiation to 10 Half)
modprobe e1000 AutoNeg=1 (Same as above) modprobe e1000 AutoNeg=1 (Same as above)
@ -357,56 +391,59 @@ Additional Configurations
Jumbo Frames Jumbo Frames
------------ ------------
Jumbo Frames support is enabled by changing the MTU to a value larger
than the default of 1500. Use the ifconfig command to increase the MTU Jumbo Frames support is enabled by changing the MTU to a value larger than
size. For example:: the default of 1500. Use the ifconfig command to increase the MTU size.
For example::
ifconfig eth<x> mtu 9000 up ifconfig eth<x> mtu 9000 up
This setting is not saved across reboots. It can be made permanent if This setting is not saved across reboots. It can be made permanent if
you add:: you add::
MTU=9000 MTU=9000
to the file /etc/sysconfig/network-scripts/ifcfg-eth<x>. This example to the file /etc/sysconfig/network-scripts/ifcfg-eth<x>. This example
applies to the Red Hat distributions; other distributions may store this applies to the Red Hat distributions; other distributions may store this
setting in a different location. setting in a different location.
Notes: Degradation in throughput performance may be observed in some Notes:
Jumbo frames environments. If this is observed, increasing the Degradation in throughput performance may be observed in some Jumbo frames
application's socket buffer size and/or increasing the environments. If this is observed, increasing the application's socket buffer
/proc/sys/net/ipv4/tcp_*mem entry values may help. See the specific size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values may help.
application manual and /usr/src/linux*/Documentation/ See the specific application manual and /usr/src/linux*/Documentation/
networking/ip-sysctl.txt for more details. networking/ip-sysctl.txt for more details.
- The maximum MTU setting for Jumbo Frames is 16110. This value - The maximum MTU setting for Jumbo Frames is 16110. This value coincides
coincides with the maximum Jumbo Frames size of 16128. with the maximum Jumbo Frames size of 16128.
- Using Jumbo frames at 10 or 100 Mbps is not supported and may result - Using Jumbo frames at 10 or 100 Mbps is not supported and may result in
in poor performance or loss of link. poor performance or loss of link.
- Adapters based on the Intel(R) 82542 and 82573V/E controller do not - Adapters based on the Intel(R) 82542 and 82573V/E controller do not
support Jumbo Frames. These correspond to the following product names: support Jumbo Frames. These correspond to the following product names::
Intel(R) PRO/1000 Gigabit Server Adapter Intel(R) PRO/1000 PM Network
Connection Intel(R) PRO/1000 Gigabit Server Adapter
Intel(R) PRO/1000 PM Network Connection
ethtool ethtool
------- -------
The driver utilizes the ethtool interface for driver configuration and
diagnostics, as well as displaying statistical information. The ethtool
version 1.6 or later is required for this functionality.
The latest release of ethtool can be found from The driver utilizes the ethtool interface for driver configuration and
https://www.kernel.org/pub/software/network/ethtool/ diagnostics, as well as displaying statistical information. The ethtool
version 1.6 or later is required for this functionality.
The latest release of ethtool can be found from
https://www.kernel.org/pub/software/network/ethtool/
Enabling Wake on LAN* (WoL) Enabling Wake on LAN* (WoL)
--------------------------- ---------------------------
WoL is configured through the ethtool* utility.
WoL will be enabled on the system during the next shut down or reboot. WoL is configured through the ethtool* utility.
For this driver version, in order to enable WoL, the e1000 driver must be
loaded when shutting down or rebooting the system.
WoL will be enabled on the system during the next shut down or reboot.
For this driver version, in order to enable WoL, the e1000 driver must be
loaded when shutting down or rebooting the system.
Support Support
======= =======

View File

@ -581,7 +581,7 @@ W: https://www.infradead.org/~dhowells/kafs/
AGPGART DRIVER AGPGART DRIVER
M: David Airlie <airlied@linux.ie> M: David Airlie <airlied@linux.ie>
T: git git://people.freedesktop.org/~airlied/linux (part of drm maint) T: git git://anongit.freedesktop.org/drm/drm
S: Maintained S: Maintained
F: drivers/char/agp/ F: drivers/char/agp/
F: include/linux/agp* F: include/linux/agp*
@ -2523,7 +2523,7 @@ S: Supported
F: drivers/scsi/esas2r F: drivers/scsi/esas2r
ATUSB IEEE 802.15.4 RADIO DRIVER ATUSB IEEE 802.15.4 RADIO DRIVER
M: Stefan Schmidt <stefan@osg.samsung.com> M: Stefan Schmidt <stefan@datenfreihafen.org>
L: linux-wpan@vger.kernel.org L: linux-wpan@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/ieee802154/atusb.c F: drivers/net/ieee802154/atusb.c
@ -4460,6 +4460,7 @@ F: Documentation/blockdev/drbd/
DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
R: "Rafael J. Wysocki" <rafael@kernel.org>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
S: Supported S: Supported
F: Documentation/kobject.txt F: Documentation/kobject.txt
@ -4630,7 +4631,7 @@ F: include/uapi/drm/vmwgfx_drm.h
DRM DRIVERS DRM DRIVERS
M: David Airlie <airlied@linux.ie> M: David Airlie <airlied@linux.ie>
L: dri-devel@lists.freedesktop.org L: dri-devel@lists.freedesktop.org
T: git git://people.freedesktop.org/~airlied/linux T: git git://anongit.freedesktop.org/drm/drm
B: https://bugs.freedesktop.org/ B: https://bugs.freedesktop.org/
C: irc://chat.freenode.net/dri-devel C: irc://chat.freenode.net/dri-devel
S: Maintained S: Maintained
@ -5789,7 +5790,6 @@ F: include/linux/fsl/
FREESCALE SOC FS_ENET DRIVER FREESCALE SOC FS_ENET DRIVER
M: Pantelis Antoniou <pantelis.antoniou@gmail.com> M: Pantelis Antoniou <pantelis.antoniou@gmail.com>
M: Vitaly Bordug <vbordug@ru.mvista.com>
L: linuxppc-dev@lists.ozlabs.org L: linuxppc-dev@lists.ozlabs.org
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
@ -6908,7 +6908,7 @@ F: drivers/clk/clk-versaclock5.c
IEEE 802.15.4 SUBSYSTEM IEEE 802.15.4 SUBSYSTEM
M: Alexander Aring <alex.aring@gmail.com> M: Alexander Aring <alex.aring@gmail.com>
M: Stefan Schmidt <stefan@osg.samsung.com> M: Stefan Schmidt <stefan@datenfreihafen.org>
L: linux-wpan@vger.kernel.org L: linux-wpan@vger.kernel.org
W: http://wpan.cakelab.org/ W: http://wpan.cakelab.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan.git
@ -8628,7 +8628,7 @@ MARVELL MWIFIEX WIRELESS DRIVER
M: Amitkumar Karwar <amitkarwar@gmail.com> M: Amitkumar Karwar <amitkarwar@gmail.com>
M: Nishant Sarmukadam <nishants@marvell.com> M: Nishant Sarmukadam <nishants@marvell.com>
M: Ganapathi Bhat <gbhat@marvell.com> M: Ganapathi Bhat <gbhat@marvell.com>
M: Xinming Hu <huxm@marvell.com> M: Xinming Hu <huxinming820@gmail.com>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/wireless/marvell/mwifiex/ F: drivers/net/wireless/marvell/mwifiex/
@ -10213,11 +10213,13 @@ F: sound/soc/codecs/sgtl5000*
NXP TDA998X DRM DRIVER NXP TDA998X DRM DRIVER
M: Russell King <linux@armlinux.org.uk> M: Russell King <linux@armlinux.org.uk>
S: Supported S: Maintained
T: git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-tda998x-devel T: git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-tda998x-devel
T: git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-tda998x-fixes T: git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-tda998x-fixes
F: drivers/gpu/drm/i2c/tda998x_drv.c F: drivers/gpu/drm/i2c/tda998x_drv.c
F: include/drm/i2c/tda998x.h F: include/drm/i2c/tda998x.h
F: include/dt-bindings/display/tda998x.h
K: "nxp,tda998x"
NXP TFA9879 DRIVER NXP TFA9879 DRIVER
M: Peter Rosin <peda@axentia.se> M: Peter Rosin <peda@axentia.se>
@ -11835,7 +11837,7 @@ S: Supported
F: arch/hexagon/ F: arch/hexagon/
QUALCOMM HIDMA DRIVER QUALCOMM HIDMA DRIVER
M: Sinan Kaya <okaya@codeaurora.org> M: Sinan Kaya <okaya@kernel.org>
L: linux-arm-kernel@lists.infradead.org L: linux-arm-kernel@lists.infradead.org
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
L: dmaengine@vger.kernel.org L: dmaengine@vger.kernel.org

View File

@ -2,7 +2,7 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 18 PATCHLEVEL = 18
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc3 EXTRAVERSION = -rc5
NAME = Merciless Moray NAME = Merciless Moray
# *DOCUMENTATION* # *DOCUMENTATION*
@ -353,9 +353,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \ else if [ -x /bin/bash ]; then echo /bin/bash; \
else echo sh; fi ; fi) else echo sh; fi ; fi)
HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS) HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null)
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS) HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
HOST_LFS_LIBS := $(shell getconf LFS_LIBS) HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
HOSTCC = gcc HOSTCC = gcc
HOSTCXX = g++ HOSTCXX = g++
@ -507,11 +507,6 @@ ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLA
KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO
endif endif
ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/cc-can-link.sh $(CC)), y)
CC_CAN_LINK := y
export CC_CAN_LINK
endif
# The expansion should be delayed until arch/$(SRCARCH)/Makefile is included. # The expansion should be delayed until arch/$(SRCARCH)/Makefile is included.
# Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile. # Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile.
# CC_VERSION_TEXT is referenced from Kconfig (so it needs export), # CC_VERSION_TEXT is referenced from Kconfig (so it needs export),
@ -1717,6 +1712,6 @@ endif # skip-makefile
PHONY += FORCE PHONY += FORCE
FORCE: FORCE:
# Declare the contents of the .PHONY variable as phony. We keep that # Declare the contents of the PHONY variable as phony. We keep that
# information in a variable so we can use it in if_changed and friends. # information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY) .PHONY: $(PHONY)

View File

@ -168,7 +168,6 @@
AM33XX_IOPAD(0x8f0, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_dat3.mmc0_dat3 */ AM33XX_IOPAD(0x8f0, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_dat3.mmc0_dat3 */
AM33XX_IOPAD(0x904, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_cmd.mmc0_cmd */ AM33XX_IOPAD(0x904, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_cmd.mmc0_cmd */
AM33XX_IOPAD(0x900, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_clk.mmc0_clk */ AM33XX_IOPAD(0x900, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc0_clk.mmc0_clk */
AM33XX_IOPAD(0x9a0, PIN_INPUT | MUX_MODE4) /* mcasp0_aclkr.mmc0_sdwp */
>; >;
}; };

View File

@ -39,6 +39,8 @@
ti,davinci-ctrl-ram-size = <0x2000>; ti,davinci-ctrl-ram-size = <0x2000>;
ti,davinci-rmii-en = /bits/ 8 <1>; ti,davinci-rmii-en = /bits/ 8 <1>;
local-mac-address = [ 00 00 00 00 00 00 ]; local-mac-address = [ 00 00 00 00 00 00 ];
clocks = <&emac_ick>;
clock-names = "ick";
}; };
davinci_mdio: ethernet@5c030000 { davinci_mdio: ethernet@5c030000 {
@ -49,6 +51,8 @@
bus_freq = <1000000>; bus_freq = <1000000>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&emac_fck>;
clock-names = "fck";
}; };
uart4: serial@4809e000 { uart4: serial@4809e000 {
@ -87,6 +91,11 @@
}; };
}; };
/* Table Table 5-79 of the TRM shows 480ab000 is reserved */
&usb_otg_hs {
status = "disabled";
};
&iva { &iva {
status = "disabled"; status = "disabled";
}; };

View File

@ -610,6 +610,8 @@
touchscreen-size-x = <480>; touchscreen-size-x = <480>;
touchscreen-size-y = <272>; touchscreen-size-y = <272>;
wakeup-source;
}; };
tlv320aic3106: tlv320aic3106@1b { tlv320aic3106: tlv320aic3106@1b {

View File

@ -547,7 +547,7 @@
thermal: thermal@e8078 { thermal: thermal@e8078 {
compatible = "marvell,armada380-thermal"; compatible = "marvell,armada380-thermal";
reg = <0xe4078 0x4>, <0xe4074 0x4>; reg = <0xe4078 0x4>, <0xe4070 0x8>;
status = "okay"; status = "okay";
}; };

View File

@ -1580,7 +1580,6 @@
dr_mode = "otg"; dr_mode = "otg";
snps,dis_u3_susphy_quirk; snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk; snps,dis_u2_susphy_quirk;
snps,dis_metastability_quirk;
}; };
}; };
@ -1608,6 +1607,7 @@
dr_mode = "otg"; dr_mode = "otg";
snps,dis_u3_susphy_quirk; snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk; snps,dis_u2_susphy_quirk;
snps,dis_metastability_quirk;
}; };
}; };

View File

@ -770,7 +770,7 @@
pinctrl_ts: tsgrp { pinctrl_ts: tsgrp {
fsl,pins = < fsl,pins = <
MX51_PAD_CSI1_D8__GPIO3_12 0x85 MX51_PAD_CSI1_D8__GPIO3_12 0x04
MX51_PAD_CSI1_D9__GPIO3_13 0x85 MX51_PAD_CSI1_D9__GPIO3_13 0x85
>; >;
}; };

View File

@ -141,9 +141,11 @@ CONFIG_USB_STORAGE=y
CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_USB_CHIPIDEA_ULPI=y
CONFIG_NOP_USB_XCEIV=y CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_GADGET=y CONFIG_USB_GADGET=y
CONFIG_USB_ETH=m CONFIG_USB_ETH=m
CONFIG_USB_ULPI_BUS=y
CONFIG_MMC=y CONFIG_MMC=y
CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_PLTFM=y

View File

@ -302,6 +302,7 @@ CONFIG_USB_STORAGE=y
CONFIG_USB_CHIPIDEA=y CONFIG_USB_CHIPIDEA=y
CONFIG_USB_CHIPIDEA_UDC=y CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_USB_CHIPIDEA_ULPI=y
CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_FTDI_SIO=m
@ -338,6 +339,7 @@ CONFIG_USB_GADGETFS=m
CONFIG_USB_FUNCTIONFS=m CONFIG_USB_FUNCTIONFS=m
CONFIG_USB_MASS_STORAGE=m CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m CONFIG_USB_G_SERIAL=m
CONFIG_USB_ULPI_BUS=y
CONFIG_MMC=y CONFIG_MMC=y
CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_PLTFM=y

View File

@ -272,9 +272,11 @@
* Allocate stack space to store 128 bytes worth of tweaks. For * Allocate stack space to store 128 bytes worth of tweaks. For
* performance, this space is aligned to a 16-byte boundary so that we * performance, this space is aligned to a 16-byte boundary so that we
* can use the load/store instructions that declare 16-byte alignment. * can use the load/store instructions that declare 16-byte alignment.
* For Thumb2 compatibility, don't do the 'bic' directly on 'sp'.
*/ */
sub sp, #128 sub r12, sp, #128
bic sp, #0xf bic r12, #0xf
mov sp, r12
.if \n == 64 .if \n == 64
// Load first tweak // Load first tweak

View File

@ -1 +1,4 @@
obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o
# tf_generic_smc() fails to build with -fsanitize-coverage=trace-pc
KCOV_INSTRUMENT := n

View File

@ -177,7 +177,7 @@ M_CLASS(streq r3, [r12, #PMSAv8_MAIR1])
bic r0, r0, #CR_I bic r0, r0, #CR_I
#endif #endif
mcr p15, 0, r0, c1, c0, 0 @ write control reg mcr p15, 0, r0, c1, c0, 0 @ write control reg
isb instr_sync
#elif defined (CONFIG_CPU_V7M) #elif defined (CONFIG_CPU_V7M)
#ifdef CONFIG_ARM_MPU #ifdef CONFIG_ARM_MPU
ldreq r3, [r12, MPU_CTRL] ldreq r3, [r12, MPU_CTRL]

View File

@ -109,6 +109,45 @@ void omap5_erratum_workaround_801819(void)
static inline void omap5_erratum_workaround_801819(void) { } static inline void omap5_erratum_workaround_801819(void) { }
#endif #endif
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
/*
* Configure ACR and enable ACTLR[0] (Enable invalidates of BTB with
* ICIALLU) to activate the workaround for secondary Core.
* NOTE: it is assumed that the primary core's configuration is done
* by the boot loader (kernel will detect a misconfiguration and complain
* if this is not done).
*
* In General Purpose(GP) devices, ACR bit settings can only be done
* by ROM code in "secure world" using the smc call and there is no
* option to update the "firmware" on such devices. This also works for
* High security(HS) devices, as a backup option in case the
* "update" is not done in the "security firmware".
*/
static void omap5_secondary_harden_predictor(void)
{
u32 acr, acr_mask;
asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr));
/*
* ACTLR[0] (Enable invalidates of BTB with ICIALLU)
*/
acr_mask = BIT(0);
/* Do we already have it done.. if yes, skip expensive smc */
if ((acr & acr_mask) == acr_mask)
return;
acr |= acr_mask;
omap_smc1(OMAP5_DRA7_MON_SET_ACR_INDEX, acr);
pr_debug("%s: ARM ACR setup for CVE_2017_5715 applied on CPU%d\n",
__func__, smp_processor_id());
}
#else
static inline void omap5_secondary_harden_predictor(void) { }
#endif
static void omap4_secondary_init(unsigned int cpu) static void omap4_secondary_init(unsigned int cpu)
{ {
/* /*
@ -131,6 +170,8 @@ static void omap4_secondary_init(unsigned int cpu)
set_cntfreq(); set_cntfreq();
/* Configure ACR to disable streaming WA for 801819 */ /* Configure ACR to disable streaming WA for 801819 */
omap5_erratum_workaround_801819(); omap5_erratum_workaround_801819();
/* Enable ACR to allow for ICUALLU workaround */
omap5_secondary_harden_predictor();
} }
/* /*

View File

@ -185,7 +185,7 @@ static int pxa_irq_suspend(void)
{ {
int i; int i;
for (i = 0; i < pxa_internal_irq_nr / 32; i++) { for (i = 0; i < DIV_ROUND_UP(pxa_internal_irq_nr, 32); i++) {
void __iomem *base = irq_base(i); void __iomem *base = irq_base(i);
saved_icmr[i] = __raw_readl(base + ICMR); saved_icmr[i] = __raw_readl(base + ICMR);
@ -204,7 +204,7 @@ static void pxa_irq_resume(void)
{ {
int i; int i;
for (i = 0; i < pxa_internal_irq_nr / 32; i++) { for (i = 0; i < DIV_ROUND_UP(pxa_internal_irq_nr, 32); i++) {
void __iomem *base = irq_base(i); void __iomem *base = irq_base(i);
__raw_writel(saved_icmr[i], base + ICMR); __raw_writel(saved_icmr[i], base + ICMR);

View File

@ -736,20 +736,29 @@ static int __mark_rodata_ro(void *unused)
return 0; return 0;
} }
static int kernel_set_to_readonly __read_mostly;
void mark_rodata_ro(void) void mark_rodata_ro(void)
{ {
kernel_set_to_readonly = 1;
stop_machine(__mark_rodata_ro, NULL, NULL); stop_machine(__mark_rodata_ro, NULL, NULL);
debug_checkwx(); debug_checkwx();
} }
void set_kernel_text_rw(void) void set_kernel_text_rw(void)
{ {
if (!kernel_set_to_readonly)
return;
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), false, set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), false,
current->active_mm); current->active_mm);
} }
void set_kernel_text_ro(void) void set_kernel_text_ro(void)
{ {
if (!kernel_set_to_readonly)
return;
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), true, set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), true,
current->active_mm); current->active_mm);
} }

View File

@ -1844,7 +1844,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
/* there are 2 passes here */ /* there are 2 passes here */
bpf_jit_dump(prog->len, image_size, 2, ctx.target); bpf_jit_dump(prog->len, image_size, 2, ctx.target);
set_memory_ro((unsigned long)header, header->pages); bpf_jit_binary_lock_ro(header);
prog->bpf_func = (void *)ctx.target; prog->bpf_func = (void *)ctx.target;
prog->jited = 1; prog->jited = 1;
prog->jited_len = image_size; prog->jited_len = image_size;

View File

@ -10,7 +10,7 @@
# #
# Copyright (C) 1995-2001 by Russell King # Copyright (C) 1995-2001 by Russell King
LDFLAGS_vmlinux :=-p --no-undefined -X LDFLAGS_vmlinux :=--no-undefined -X
CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET) CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
GZFLAGS :=-9 GZFLAGS :=-9
@ -60,15 +60,15 @@ ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
KBUILD_CPPFLAGS += -mbig-endian KBUILD_CPPFLAGS += -mbig-endian
CHECKFLAGS += -D__AARCH64EB__ CHECKFLAGS += -D__AARCH64EB__
AS += -EB AS += -EB
LD += -EB # We must use the linux target here, since distributions don't tend to package
LDFLAGS += -maarch64linuxb # the ELF linker scripts with binutils, and this results in a build failure.
LDFLAGS += -EB -maarch64linuxb
UTS_MACHINE := aarch64_be UTS_MACHINE := aarch64_be
else else
KBUILD_CPPFLAGS += -mlittle-endian KBUILD_CPPFLAGS += -mlittle-endian
CHECKFLAGS += -D__AARCH64EL__ CHECKFLAGS += -D__AARCH64EL__
AS += -EL AS += -EL
LD += -EL LDFLAGS += -EL -maarch64linux # See comment above
LDFLAGS += -maarch64linux
UTS_MACHINE := aarch64 UTS_MACHINE := aarch64
endif endif

View File

@ -29,20 +29,15 @@ DECLARE_PER_CPU(bool, kernel_neon_busy);
static __must_check inline bool may_use_simd(void) static __must_check inline bool may_use_simd(void)
{ {
/* /*
* The raw_cpu_read() is racy if called with preemption enabled. * kernel_neon_busy is only set while preemption is disabled,
* This is not a bug: kernel_neon_busy is only set when * and is clear whenever preemption is enabled. Since
* preemption is disabled, so we cannot migrate to another CPU * this_cpu_read() is atomic w.r.t. preemption, kernel_neon_busy
* while it is set, nor can we migrate to a CPU where it is set. * cannot change under our feet -- if it's set we cannot be
* So, if we find it clear on some CPU then we're guaranteed to * migrated, and if it's clear we cannot be migrated to a CPU
* find it clear on any CPU we could migrate to. * where it is set.
*
* If we are in between kernel_neon_begin()...kernel_neon_end(),
* the flag will be set, but preemption is also disabled, so we
* can't migrate to another CPU and spuriously see it become
* false.
*/ */
return !in_irq() && !irqs_disabled() && !in_nmi() && return !in_irq() && !irqs_disabled() && !in_nmi() &&
!raw_cpu_read(kernel_neon_busy); !this_cpu_read(kernel_neon_busy);
} }
#else /* ! CONFIG_KERNEL_MODE_NEON */ #else /* ! CONFIG_KERNEL_MODE_NEON */

View File

@ -44,6 +44,7 @@ extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page, static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
unsigned long address) unsigned long address)
{ {
pgtable_page_dtor(page);
__free_page(page); __free_page(page);
} }
@ -74,8 +75,9 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm,
return page; return page;
} }
extern inline void pte_free(struct mm_struct *mm, struct page *page) static inline void pte_free(struct mm_struct *mm, struct page *page)
{ {
pgtable_page_dtor(page);
__free_page(page); __free_page(page);
} }

View File

@ -29,6 +29,7 @@
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/prctl.h> #include <linux/prctl.h>
#include <linux/nmi.h>
#include <asm/asm.h> #include <asm/asm.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
@ -655,28 +656,42 @@ unsigned long arch_align_stack(unsigned long sp)
return sp & ALMASK; return sp & ALMASK;
} }
static void arch_dump_stack(void *info) static DEFINE_PER_CPU(call_single_data_t, backtrace_csd);
static struct cpumask backtrace_csd_busy;
static void handle_backtrace(void *info)
{ {
struct pt_regs *regs; nmi_cpu_backtrace(get_irq_regs());
cpumask_clear_cpu(smp_processor_id(), &backtrace_csd_busy);
}
regs = get_irq_regs(); static void raise_backtrace(cpumask_t *mask)
{
call_single_data_t *csd;
int cpu;
if (regs) for_each_cpu(cpu, mask) {
show_regs(regs); /*
* If we previously sent an IPI to the target CPU & it hasn't
* cleared its bit in the busy cpumask then it didn't handle
* our previous IPI & it's not safe for us to reuse the
* call_single_data_t.
*/
if (cpumask_test_and_set_cpu(cpu, &backtrace_csd_busy)) {
pr_warn("Unable to send backtrace IPI to CPU%u - perhaps it hung?\n",
cpu);
continue;
}
dump_stack(); csd = &per_cpu(backtrace_csd, cpu);
csd->func = handle_backtrace;
smp_call_function_single_async(cpu, csd);
}
} }
void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)
{ {
long this_cpu = get_cpu(); nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_backtrace);
if (cpumask_test_cpu(this_cpu, mask) && !exclude_self)
dump_stack();
smp_call_function_many(mask, arch_dump_stack, NULL, 1);
put_cpu();
} }
int mips_get_process_fp_mode(struct task_struct *task) int mips_get_process_fp_mode(struct task_struct *task)

View File

@ -351,6 +351,7 @@ static void __show_regs(const struct pt_regs *regs)
void show_regs(struct pt_regs *regs) void show_regs(struct pt_regs *regs)
{ {
__show_regs((struct pt_regs *)regs); __show_regs((struct pt_regs *)regs);
dump_stack();
} }
void show_registers(struct pt_regs *regs) void show_registers(struct pt_regs *regs)

View File

@ -9,6 +9,7 @@
#include <linux/export.h> #include <linux/export.h>
#include <asm/addrspace.h> #include <asm/addrspace.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <linux/ioport.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
@ -98,6 +99,20 @@ static int remap_area_pages(unsigned long address, phys_addr_t phys_addr,
return error; return error;
} }
static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages,
void *arg)
{
unsigned long i;
for (i = 0; i < nr_pages; i++) {
if (pfn_valid(start_pfn + i) &&
!PageReserved(pfn_to_page(start_pfn + i)))
return 1;
}
return 0;
}
/* /*
* Generic mapping function (not visible outside): * Generic mapping function (not visible outside):
*/ */
@ -116,8 +131,8 @@ static int remap_area_pages(unsigned long address, phys_addr_t phys_addr,
void __iomem * __ioremap(phys_addr_t phys_addr, phys_addr_t size, unsigned long flags) void __iomem * __ioremap(phys_addr_t phys_addr, phys_addr_t size, unsigned long flags)
{ {
unsigned long offset, pfn, last_pfn;
struct vm_struct * area; struct vm_struct * area;
unsigned long offset;
phys_addr_t last_addr; phys_addr_t last_addr;
void * addr; void * addr;
@ -137,18 +152,16 @@ void __iomem * __ioremap(phys_addr_t phys_addr, phys_addr_t size, unsigned long
return (void __iomem *) CKSEG1ADDR(phys_addr); return (void __iomem *) CKSEG1ADDR(phys_addr);
/* /*
* Don't allow anybody to remap normal RAM that we're using.. * Don't allow anybody to remap RAM that may be allocated by the page
* allocator, since that could lead to races & data clobbering.
*/ */
if (phys_addr < virt_to_phys(high_memory)) { pfn = PFN_DOWN(phys_addr);
char *t_addr, *t_end; last_pfn = PFN_DOWN(last_addr);
struct page *page; if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL,
__ioremap_check_ram) == 1) {
t_addr = __va(phys_addr); WARN_ONCE(1, "ioremap on RAM at %pa - %pa\n",
t_end = t_addr + (size - 1); &phys_addr, &last_addr);
return NULL;
for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++)
if(!PageReserved(page))
return NULL;
} }
/* /*

View File

@ -98,8 +98,12 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
__free_page(pte); __free_page(pte);
} }
#define __pte_free_tlb(tlb, pte, addr) \
do { \
pgtable_page_dtor(pte); \
tlb_remove_page((tlb), (pte)); \
} while (0)
#define __pte_free_tlb(tlb, pte, addr) tlb_remove_page((tlb), (pte))
#define pmd_pgtable(pmd) pmd_page(pmd) #define pmd_pgtable(pmd) pmd_page(pmd)
#define check_pgt_cache() do { } while (0) #define check_pgt_cache() do { } while (0)

View File

@ -277,12 +277,6 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
l.addi r3,r1,0 // pt_regs l.addi r3,r1,0 // pt_regs
/* r4 set be EXCEPTION_HANDLE */ // effective address of fault /* r4 set be EXCEPTION_HANDLE */ // effective address of fault
/*
* __PHX__: TODO
*
* all this can be written much simpler. look at
* DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part
*/
#ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX #ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
l.lwz r6,PT_PC(r3) // address of an offending insn l.lwz r6,PT_PC(r3) // address of an offending insn
l.lwz r6,0(r6) // instruction that caused pf l.lwz r6,0(r6) // instruction that caused pf
@ -314,7 +308,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
#else #else
l.lwz r6,PT_SR(r3) // SR l.mfspr r6,r0,SPR_SR // SR
l.andi r6,r6,SPR_SR_DSX // check for delay slot exception l.andi r6,r6,SPR_SR_DSX // check for delay slot exception
l.sfne r6,r0 // exception happened in delay slot l.sfne r6,r0 // exception happened in delay slot
l.bnf 7f l.bnf 7f

View File

@ -210,8 +210,7 @@
* r4 - EEAR exception EA * r4 - EEAR exception EA
* r10 - current pointing to current_thread_info struct * r10 - current pointing to current_thread_info struct
* r12 - syscall 0, since we didn't come from syscall * r12 - syscall 0, since we didn't come from syscall
* r13 - temp it actually contains new SR, not needed anymore * r30 - handler address of the handler we'll jump to
* r31 - handler address of the handler we'll jump to
* *
* handler has to save remaining registers to the exception * handler has to save remaining registers to the exception
* ksp frame *before* tainting them! * ksp frame *before* tainting them!
@ -244,6 +243,7 @@
/* r1 is KSP, r30 is __pa(KSP) */ ;\ /* r1 is KSP, r30 is __pa(KSP) */ ;\
tophys (r30,r1) ;\ tophys (r30,r1) ;\
l.sw PT_GPR12(r30),r12 ;\ l.sw PT_GPR12(r30),r12 ;\
/* r4 use for tmp before EA */ ;\
l.mfspr r12,r0,SPR_EPCR_BASE ;\ l.mfspr r12,r0,SPR_EPCR_BASE ;\
l.sw PT_PC(r30),r12 ;\ l.sw PT_PC(r30),r12 ;\
l.mfspr r12,r0,SPR_ESR_BASE ;\ l.mfspr r12,r0,SPR_ESR_BASE ;\
@ -263,7 +263,10 @@
/* r12 == 1 if we come from syscall */ ;\ /* r12 == 1 if we come from syscall */ ;\
CLEAR_GPR(r12) ;\ CLEAR_GPR(r12) ;\
/* ----- turn on MMU ----- */ ;\ /* ----- turn on MMU ----- */ ;\
l.ori r30,r0,(EXCEPTION_SR) ;\ /* Carry DSX into exception SR */ ;\
l.mfspr r30,r0,SPR_SR ;\
l.andi r30,r30,SPR_SR_DSX ;\
l.ori r30,r30,(EXCEPTION_SR) ;\
l.mtspr r0,r30,SPR_ESR_BASE ;\ l.mtspr r0,r30,SPR_ESR_BASE ;\
/* r30: EA address of handler */ ;\ /* r30: EA address of handler */ ;\
LOAD_SYMBOL_2_GPR(r30,handler) ;\ LOAD_SYMBOL_2_GPR(r30,handler) ;\

View File

@ -300,7 +300,7 @@ static inline int in_delay_slot(struct pt_regs *regs)
return 0; return 0;
} }
#else #else
return regs->sr & SPR_SR_DSX; return mfspr(SPR_SR) & SPR_SR_DSX;
#endif #endif
} }

View File

@ -107,6 +107,7 @@ config ARCH_RV32I
select GENERIC_LIB_ASHLDI3 select GENERIC_LIB_ASHLDI3
select GENERIC_LIB_ASHRDI3 select GENERIC_LIB_ASHRDI3
select GENERIC_LIB_LSHRDI3 select GENERIC_LIB_LSHRDI3
select GENERIC_LIB_UCMPDI2
config ARCH_RV64I config ARCH_RV64I
bool "RV64I" bool "RV64I"

View File

@ -21,8 +21,13 @@ typedef struct user_regs_struct elf_gregset_t;
typedef union __riscv_fp_state elf_fpregset_t; typedef union __riscv_fp_state elf_fpregset_t;
#define ELF_RISCV_R_SYM(r_info) ((r_info) >> 32) #if __riscv_xlen == 64
#define ELF_RISCV_R_TYPE(r_info) ((r_info) & 0xffffffff) #define ELF_RISCV_R_SYM(r_info) ELF64_R_SYM(r_info)
#define ELF_RISCV_R_TYPE(r_info) ELF64_R_TYPE(r_info)
#else
#define ELF_RISCV_R_SYM(r_info) ELF32_R_SYM(r_info)
#define ELF_RISCV_R_TYPE(r_info) ELF32_R_TYPE(r_info)
#endif
/* /*
* RISC-V relocation types * RISC-V relocation types

View File

@ -16,10 +16,6 @@
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/irqdomain.h> #include <linux/irqdomain.h>
#ifdef CONFIG_RISCV_INTC
#include <linux/irqchip/irq-riscv-intc.h>
#endif
void __init init_IRQ(void) void __init init_IRQ(void)
{ {
irqchip_init(); irqchip_init();

View File

@ -37,7 +37,7 @@ static int apply_r_riscv_64_rela(struct module *me, u32 *location, Elf_Addr v)
static int apply_r_riscv_branch_rela(struct module *me, u32 *location, static int apply_r_riscv_branch_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
u32 imm12 = (offset & 0x1000) << (31 - 12); u32 imm12 = (offset & 0x1000) << (31 - 12);
u32 imm11 = (offset & 0x800) >> (11 - 7); u32 imm11 = (offset & 0x800) >> (11 - 7);
u32 imm10_5 = (offset & 0x7e0) << (30 - 10); u32 imm10_5 = (offset & 0x7e0) << (30 - 10);
@ -50,7 +50,7 @@ static int apply_r_riscv_branch_rela(struct module *me, u32 *location,
static int apply_r_riscv_jal_rela(struct module *me, u32 *location, static int apply_r_riscv_jal_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
u32 imm20 = (offset & 0x100000) << (31 - 20); u32 imm20 = (offset & 0x100000) << (31 - 20);
u32 imm19_12 = (offset & 0xff000); u32 imm19_12 = (offset & 0xff000);
u32 imm11 = (offset & 0x800) << (20 - 11); u32 imm11 = (offset & 0x800) << (20 - 11);
@ -63,7 +63,7 @@ static int apply_r_riscv_jal_rela(struct module *me, u32 *location,
static int apply_r_riscv_rcv_branch_rela(struct module *me, u32 *location, static int apply_r_riscv_rcv_branch_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
u16 imm8 = (offset & 0x100) << (12 - 8); u16 imm8 = (offset & 0x100) << (12 - 8);
u16 imm7_6 = (offset & 0xc0) >> (6 - 5); u16 imm7_6 = (offset & 0xc0) >> (6 - 5);
u16 imm5 = (offset & 0x20) >> (5 - 2); u16 imm5 = (offset & 0x20) >> (5 - 2);
@ -78,7 +78,7 @@ static int apply_r_riscv_rcv_branch_rela(struct module *me, u32 *location,
static int apply_r_riscv_rvc_jump_rela(struct module *me, u32 *location, static int apply_r_riscv_rvc_jump_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
u16 imm11 = (offset & 0x800) << (12 - 11); u16 imm11 = (offset & 0x800) << (12 - 11);
u16 imm10 = (offset & 0x400) >> (10 - 8); u16 imm10 = (offset & 0x400) >> (10 - 8);
u16 imm9_8 = (offset & 0x300) << (12 - 11); u16 imm9_8 = (offset & 0x300) << (12 - 11);
@ -96,7 +96,7 @@ static int apply_r_riscv_rvc_jump_rela(struct module *me, u32 *location,
static int apply_r_riscv_pcrel_hi20_rela(struct module *me, u32 *location, static int apply_r_riscv_pcrel_hi20_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
s32 hi20; s32 hi20;
if (offset != (s32)offset) { if (offset != (s32)offset) {
@ -178,7 +178,7 @@ static int apply_r_riscv_lo12_s_rela(struct module *me, u32 *location,
static int apply_r_riscv_got_hi20_rela(struct module *me, u32 *location, static int apply_r_riscv_got_hi20_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
s32 hi20; s32 hi20;
/* Always emit the got entry */ /* Always emit the got entry */
@ -200,7 +200,7 @@ static int apply_r_riscv_got_hi20_rela(struct module *me, u32 *location,
static int apply_r_riscv_call_plt_rela(struct module *me, u32 *location, static int apply_r_riscv_call_plt_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
s32 fill_v = offset; s32 fill_v = offset;
u32 hi20, lo12; u32 hi20, lo12;
@ -227,7 +227,7 @@ static int apply_r_riscv_call_plt_rela(struct module *me, u32 *location,
static int apply_r_riscv_call_rela(struct module *me, u32 *location, static int apply_r_riscv_call_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
s64 offset = (void *)v - (void *)location; ptrdiff_t offset = (void *)v - (void *)location;
s32 fill_v = offset; s32 fill_v = offset;
u32 hi20, lo12; u32 hi20, lo12;
@ -263,14 +263,14 @@ static int apply_r_riscv_align_rela(struct module *me, u32 *location,
static int apply_r_riscv_add32_rela(struct module *me, u32 *location, static int apply_r_riscv_add32_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
*(u32 *)location += (*(u32 *)v); *(u32 *)location += (u32)v;
return 0; return 0;
} }
static int apply_r_riscv_sub32_rela(struct module *me, u32 *location, static int apply_r_riscv_sub32_rela(struct module *me, u32 *location,
Elf_Addr v) Elf_Addr v)
{ {
*(u32 *)location -= (*(u32 *)v); *(u32 *)location -= (u32)v;
return 0; return 0;
} }
@ -347,7 +347,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
unsigned int j; unsigned int j;
for (j = 0; j < sechdrs[relsec].sh_size / sizeof(*rel); j++) { for (j = 0; j < sechdrs[relsec].sh_size / sizeof(*rel); j++) {
u64 hi20_loc = unsigned long hi20_loc =
sechdrs[sechdrs[relsec].sh_info].sh_addr sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[j].r_offset; + rel[j].r_offset;
u32 hi20_type = ELF_RISCV_R_TYPE(rel[j].r_info); u32 hi20_type = ELF_RISCV_R_TYPE(rel[j].r_info);
@ -360,12 +360,12 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
Elf_Sym *hi20_sym = Elf_Sym *hi20_sym =
(Elf_Sym *)sechdrs[symindex].sh_addr (Elf_Sym *)sechdrs[symindex].sh_addr
+ ELF_RISCV_R_SYM(rel[j].r_info); + ELF_RISCV_R_SYM(rel[j].r_info);
u64 hi20_sym_val = unsigned long hi20_sym_val =
hi20_sym->st_value hi20_sym->st_value
+ rel[j].r_addend; + rel[j].r_addend;
/* Calculate lo12 */ /* Calculate lo12 */
u64 offset = hi20_sym_val - hi20_loc; size_t offset = hi20_sym_val - hi20_loc;
if (IS_ENABLED(CONFIG_MODULE_SECTIONS) if (IS_ENABLED(CONFIG_MODULE_SECTIONS)
&& hi20_type == R_RISCV_GOT_HI20) { && hi20_type == R_RISCV_GOT_HI20) {
offset = module_emit_got_entry( offset = module_emit_got_entry(

View File

@ -50,7 +50,7 @@ static int riscv_gpr_set(struct task_struct *target,
struct pt_regs *regs; struct pt_regs *regs;
regs = task_pt_regs(target); regs = task_pt_regs(target);
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &regs, 0, -1); ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, 0, -1);
return ret; return ret;
} }

View File

@ -220,8 +220,3 @@ void __init setup_arch(char **cmdline_p)
riscv_fill_hwcap(); riscv_fill_hwcap();
} }
static int __init riscv_device_init(void)
{
return of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
}
subsys_initcall_sync(riscv_device_init);

View File

@ -28,7 +28,9 @@ static void __init zone_sizes_init(void)
{ {
unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, }; unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, };
#ifdef CONFIG_ZONE_DMA32
max_zone_pfns[ZONE_DMA32] = PFN_DOWN(min(4UL * SZ_1G, max_low_pfn)); max_zone_pfns[ZONE_DMA32] = PFN_DOWN(min(4UL * SZ_1G, max_low_pfn));
#endif
max_zone_pfns[ZONE_NORMAL] = max_low_pfn; max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
free_area_init_nodes(max_zone_pfns); free_area_init_nodes(max_zone_pfns);

View File

@ -160,6 +160,7 @@ config S390
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_RSEQ
select HAVE_SYSCALL_TRACEPOINTS select HAVE_SYSCALL_TRACEPOINTS
select HAVE_VIRT_CPU_ACCOUNTING select HAVE_VIRT_CPU_ACCOUNTING
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA

View File

@ -183,3 +183,4 @@ COMPAT_SYSCALL_WRAP2(s390_guarded_storage, int, command, struct gs_cb *, gs_cb);
COMPAT_SYSCALL_WRAP5(statx, int, dfd, const char __user *, path, unsigned, flags, unsigned, mask, struct statx __user *, buffer); COMPAT_SYSCALL_WRAP5(statx, int, dfd, const char __user *, path, unsigned, flags, unsigned, mask, struct statx __user *, buffer);
COMPAT_SYSCALL_WRAP4(s390_sthyi, unsigned long, code, void __user *, info, u64 __user *, rc, unsigned long, flags); COMPAT_SYSCALL_WRAP4(s390_sthyi, unsigned long, code, void __user *, info, u64 __user *, rc, unsigned long, flags);
COMPAT_SYSCALL_WRAP5(kexec_file_load, int, kernel_fd, int, initrd_fd, unsigned long, cmdline_len, const char __user *, cmdline_ptr, unsigned long, flags) COMPAT_SYSCALL_WRAP5(kexec_file_load, int, kernel_fd, int, initrd_fd, unsigned long, cmdline_len, const char __user *, cmdline_ptr, unsigned long, flags)
COMPAT_SYSCALL_WRAP4(rseq, struct rseq __user *, rseq, u32, rseq_len, int, flags, u32, sig)

View File

@ -357,6 +357,10 @@ ENTRY(system_call)
stg %r2,__PT_R2(%r11) # store return value stg %r2,__PT_R2(%r11) # store return value
.Lsysc_return: .Lsysc_return:
#ifdef CONFIG_DEBUG_RSEQ
lgr %r2,%r11
brasl %r14,rseq_syscall
#endif
LOCKDEP_SYS_EXIT LOCKDEP_SYS_EXIT
.Lsysc_tif: .Lsysc_tif:
TSTMSK __PT_FLAGS(%r11),_PIF_WORK TSTMSK __PT_FLAGS(%r11),_PIF_WORK
@ -1265,7 +1269,7 @@ cleanup_critical:
jl 0f jl 0f
clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end
jl .Lcleanup_load_fpu_regs jl .Lcleanup_load_fpu_regs
0: BR_EX %r14 0: BR_EX %r14,%r11
.align 8 .align 8
.Lcleanup_table: .Lcleanup_table:
@ -1301,7 +1305,7 @@ cleanup_critical:
ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
larl %r9,sie_exit # skip forward to sie_exit larl %r9,sie_exit # skip forward to sie_exit
BR_EX %r14 BR_EX %r14,%r11
#endif #endif
.Lcleanup_system_call: .Lcleanup_system_call:

View File

@ -498,7 +498,7 @@ void do_signal(struct pt_regs *regs)
} }
/* No longer in a system call */ /* No longer in a system call */
clear_pt_regs_flag(regs, PIF_SYSCALL); clear_pt_regs_flag(regs, PIF_SYSCALL);
rseq_signal_deliver(&ksig, regs);
if (is_compat_task()) if (is_compat_task())
handle_signal32(&ksig, oldset, regs); handle_signal32(&ksig, oldset, regs);
else else
@ -537,4 +537,5 @@ void do_notify_resume(struct pt_regs *regs)
{ {
clear_thread_flag(TIF_NOTIFY_RESUME); clear_thread_flag(TIF_NOTIFY_RESUME);
tracehook_notify_resume(regs); tracehook_notify_resume(regs);
rseq_handle_notify_resume(NULL, regs);
} }

View File

@ -389,3 +389,5 @@
379 common statx sys_statx compat_sys_statx 379 common statx sys_statx compat_sys_statx
380 common s390_sthyi sys_s390_sthyi compat_sys_s390_sthyi 380 common s390_sthyi sys_s390_sthyi compat_sys_s390_sthyi
381 common kexec_file_load sys_kexec_file_load compat_sys_kexec_file_load 381 common kexec_file_load sys_kexec_file_load compat_sys_kexec_file_load
382 common io_pgetevents sys_io_pgetevents compat_sys_io_pgetevents
383 common rseq sys_rseq compat_sys_rseq

View File

@ -252,6 +252,8 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
spin_unlock_bh(&mm->context.lock); spin_unlock_bh(&mm->context.lock);
if (mask != 0) if (mask != 0)
return; return;
} else {
atomic_xor_bits(&page->_refcount, 3U << 24);
} }
pgtable_page_dtor(page); pgtable_page_dtor(page);
@ -304,6 +306,8 @@ static void __tlb_remove_table(void *_table)
break; break;
/* fallthrough */ /* fallthrough */
case 3: /* 4K page table with pgstes */ case 3: /* 4K page table with pgstes */
if (mask & 3)
atomic_xor_bits(&page->_refcount, 3 << 24);
pgtable_page_dtor(page); pgtable_page_dtor(page);
__free_page(page); __free_page(page);
break; break;

View File

@ -1286,6 +1286,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)
goto free_addrs; goto free_addrs;
} }
if (bpf_jit_prog(&jit, fp)) { if (bpf_jit_prog(&jit, fp)) {
bpf_jit_binary_free(header);
fp = orig_fp; fp = orig_fp;
goto free_addrs; goto free_addrs;
} }

View File

@ -114,18 +114,12 @@ __setup_efi_pci(efi_pci_io_protocol_t *pci, struct pci_setup_rom **__rom)
struct pci_setup_rom *rom = NULL; struct pci_setup_rom *rom = NULL;
efi_status_t status; efi_status_t status;
unsigned long size; unsigned long size;
uint64_t attributes, romsize; uint64_t romsize;
void *romimage; void *romimage;
status = efi_call_proto(efi_pci_io_protocol, attributes, pci,
EfiPciIoAttributeOperationGet, 0ULL,
&attributes);
if (status != EFI_SUCCESS)
return status;
/* /*
* Some firmware images contain EFI function pointers at the place where the * Some firmware images contain EFI function pointers at the place where
* romimage and romsize fields are supposed to be. Typically the EFI * the romimage and romsize fields are supposed to be. Typically the EFI
* code is mapped at high addresses, translating to an unrealistically * code is mapped at high addresses, translating to an unrealistically
* large romsize. The UEFI spec limits the size of option ROMs to 16 * large romsize. The UEFI spec limits the size of option ROMs to 16
* MiB so we reject any ROMs over 16 MiB in size to catch this. * MiB so we reject any ROMs over 16 MiB in size to catch this.

View File

@ -535,6 +535,7 @@ ENTRY(crypto_aegis128_aesni_enc_tail)
movdqu STATE3, 0x40(STATEP) movdqu STATE3, 0x40(STATEP)
FRAME_END FRAME_END
ret
ENDPROC(crypto_aegis128_aesni_enc_tail) ENDPROC(crypto_aegis128_aesni_enc_tail)
.macro decrypt_block a s0 s1 s2 s3 s4 i .macro decrypt_block a s0 s1 s2 s3 s4 i

View File

@ -645,6 +645,7 @@ ENTRY(crypto_aegis128l_aesni_enc_tail)
state_store0 state_store0
FRAME_END FRAME_END
ret
ENDPROC(crypto_aegis128l_aesni_enc_tail) ENDPROC(crypto_aegis128l_aesni_enc_tail)
/* /*

View File

@ -543,6 +543,7 @@ ENTRY(crypto_aegis256_aesni_enc_tail)
state_store0 state_store0
FRAME_END FRAME_END
ret
ENDPROC(crypto_aegis256_aesni_enc_tail) ENDPROC(crypto_aegis256_aesni_enc_tail)
/* /*

View File

@ -453,6 +453,7 @@ ENTRY(crypto_morus1280_avx2_enc_tail)
vmovdqu STATE4, (4 * 32)(%rdi) vmovdqu STATE4, (4 * 32)(%rdi)
FRAME_END FRAME_END
ret
ENDPROC(crypto_morus1280_avx2_enc_tail) ENDPROC(crypto_morus1280_avx2_enc_tail)
/* /*

View File

@ -652,6 +652,7 @@ ENTRY(crypto_morus1280_sse2_enc_tail)
movdqu STATE4_HI, (9 * 16)(%rdi) movdqu STATE4_HI, (9 * 16)(%rdi)
FRAME_END FRAME_END
ret
ENDPROC(crypto_morus1280_sse2_enc_tail) ENDPROC(crypto_morus1280_sse2_enc_tail)
/* /*

View File

@ -437,6 +437,7 @@ ENTRY(crypto_morus640_sse2_enc_tail)
movdqu STATE4, (4 * 16)(%rdi) movdqu STATE4, (4 * 16)(%rdi)
FRAME_END FRAME_END
ret
ENDPROC(crypto_morus640_sse2_enc_tail) ENDPROC(crypto_morus640_sse2_enc_tail)
/* /*

View File

@ -114,6 +114,8 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector)
ipi_arg->vp_set.format = HV_GENERIC_SET_SPARSE_4K; ipi_arg->vp_set.format = HV_GENERIC_SET_SPARSE_4K;
nr_bank = cpumask_to_vpset(&(ipi_arg->vp_set), mask); nr_bank = cpumask_to_vpset(&(ipi_arg->vp_set), mask);
} }
if (nr_bank < 0)
goto ipi_mask_ex_done;
if (!nr_bank) if (!nr_bank)
ipi_arg->vp_set.format = HV_GENERIC_SET_ALL; ipi_arg->vp_set.format = HV_GENERIC_SET_ALL;
@ -158,6 +160,9 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector)
for_each_cpu(cur_cpu, mask) { for_each_cpu(cur_cpu, mask) {
vcpu = hv_cpu_number_to_vp_number(cur_cpu); vcpu = hv_cpu_number_to_vp_number(cur_cpu);
if (vcpu == VP_INVAL)
goto ipi_mask_done;
/* /*
* This particular version of the IPI hypercall can * This particular version of the IPI hypercall can
* only target upto 64 CPUs. * only target upto 64 CPUs.

View File

@ -265,7 +265,7 @@ void __init hyperv_init(void)
{ {
u64 guest_id, required_msrs; u64 guest_id, required_msrs;
union hv_x64_msr_hypercall_contents hypercall_msr; union hv_x64_msr_hypercall_contents hypercall_msr;
int cpuhp; int cpuhp, i;
if (x86_hyper_type != X86_HYPER_MS_HYPERV) if (x86_hyper_type != X86_HYPER_MS_HYPERV)
return; return;
@ -293,6 +293,9 @@ void __init hyperv_init(void)
if (!hv_vp_index) if (!hv_vp_index)
return; return;
for (i = 0; i < num_possible_cpus(); i++)
hv_vp_index[i] = VP_INVAL;
hv_vp_assist_page = kcalloc(num_possible_cpus(), hv_vp_assist_page = kcalloc(num_possible_cpus(),
sizeof(*hv_vp_assist_page), GFP_KERNEL); sizeof(*hv_vp_assist_page), GFP_KERNEL);
if (!hv_vp_assist_page) { if (!hv_vp_assist_page) {

View File

@ -46,6 +46,65 @@
#define _ASM_SI __ASM_REG(si) #define _ASM_SI __ASM_REG(si)
#define _ASM_DI __ASM_REG(di) #define _ASM_DI __ASM_REG(di)
#ifndef __x86_64__
/* 32 bit */
#define _ASM_ARG1 _ASM_AX
#define _ASM_ARG2 _ASM_DX
#define _ASM_ARG3 _ASM_CX
#define _ASM_ARG1L eax
#define _ASM_ARG2L edx
#define _ASM_ARG3L ecx
#define _ASM_ARG1W ax
#define _ASM_ARG2W dx
#define _ASM_ARG3W cx
#define _ASM_ARG1B al
#define _ASM_ARG2B dl
#define _ASM_ARG3B cl
#else
/* 64 bit */
#define _ASM_ARG1 _ASM_DI
#define _ASM_ARG2 _ASM_SI
#define _ASM_ARG3 _ASM_DX
#define _ASM_ARG4 _ASM_CX
#define _ASM_ARG5 r8
#define _ASM_ARG6 r9
#define _ASM_ARG1Q rdi
#define _ASM_ARG2Q rsi
#define _ASM_ARG3Q rdx
#define _ASM_ARG4Q rcx
#define _ASM_ARG5Q r8
#define _ASM_ARG6Q r9
#define _ASM_ARG1L edi
#define _ASM_ARG2L esi
#define _ASM_ARG3L edx
#define _ASM_ARG4L ecx
#define _ASM_ARG5L r8d
#define _ASM_ARG6L r9d
#define _ASM_ARG1W di
#define _ASM_ARG2W si
#define _ASM_ARG3W dx
#define _ASM_ARG4W cx
#define _ASM_ARG5W r8w
#define _ASM_ARG6W r9w
#define _ASM_ARG1B dil
#define _ASM_ARG2B sil
#define _ASM_ARG3B dl
#define _ASM_ARG4B cl
#define _ASM_ARG5B r8b
#define _ASM_ARG6B r9b
#endif
/* /*
* Macros to generate condition code outputs from inline assembly, * Macros to generate condition code outputs from inline assembly,
* The output operand must be type "bool". * The output operand must be type "bool".

View File

@ -13,7 +13,7 @@
* Interrupt control: * Interrupt control:
*/ */
static inline unsigned long native_save_fl(void) extern inline unsigned long native_save_fl(void)
{ {
unsigned long flags; unsigned long flags;

View File

@ -9,6 +9,8 @@
#include <asm/hyperv-tlfs.h> #include <asm/hyperv-tlfs.h>
#include <asm/nospec-branch.h> #include <asm/nospec-branch.h>
#define VP_INVAL U32_MAX
struct ms_hyperv_info { struct ms_hyperv_info {
u32 features; u32 features;
u32 misc_features; u32 misc_features;
@ -20,7 +22,6 @@ struct ms_hyperv_info {
extern struct ms_hyperv_info ms_hyperv; extern struct ms_hyperv_info ms_hyperv;
/* /*
* Generate the guest ID. * Generate the guest ID.
*/ */
@ -281,6 +282,8 @@ static inline int cpumask_to_vpset(struct hv_vpset *vpset,
*/ */
for_each_cpu(cpu, cpus) { for_each_cpu(cpu, cpus) {
vcpu = hv_cpu_number_to_vp_number(cpu); vcpu = hv_cpu_number_to_vp_number(cpu);
if (vcpu == VP_INVAL)
return -1;
vcpu_bank = vcpu / 64; vcpu_bank = vcpu / 64;
vcpu_offset = vcpu % 64; vcpu_offset = vcpu % 64;
__set_bit(vcpu_offset, (unsigned long *) __set_bit(vcpu_offset, (unsigned long *)

View File

@ -61,6 +61,7 @@ obj-y += alternative.o i8253.o hw_breakpoint.o
obj-y += tsc.o tsc_msr.o io_delay.o rtc.o obj-y += tsc.o tsc_msr.o io_delay.o rtc.o
obj-y += pci-iommu_table.o obj-y += pci-iommu_table.o
obj-y += resource.o obj-y += resource.o
obj-y += irqflags.o
obj-y += process.o obj-y += process.o
obj-y += fpu/ obj-y += fpu/

View File

@ -543,7 +543,9 @@ static void bsp_init_amd(struct cpuinfo_x86 *c)
nodes_per_socket = ((value >> 3) & 7) + 1; nodes_per_socket = ((value >> 3) & 7) + 1;
} }
if (c->x86 >= 0x15 && c->x86 <= 0x17) { if (!boot_cpu_has(X86_FEATURE_AMD_SSBD) &&
!boot_cpu_has(X86_FEATURE_VIRT_SSBD) &&
c->x86 >= 0x15 && c->x86 <= 0x17) {
unsigned int bit; unsigned int bit;
switch (c->x86) { switch (c->x86) {

View File

@ -155,7 +155,8 @@ x86_virt_spec_ctrl(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl, bool setguest)
guestval |= guest_spec_ctrl & x86_spec_ctrl_mask; guestval |= guest_spec_ctrl & x86_spec_ctrl_mask;
/* SSBD controlled in MSR_SPEC_CTRL */ /* SSBD controlled in MSR_SPEC_CTRL */
if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD)) if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
static_cpu_has(X86_FEATURE_AMD_SSBD))
hostval |= ssbd_tif_to_spec_ctrl(ti->flags); hostval |= ssbd_tif_to_spec_ctrl(ti->flags);
if (hostval != guestval) { if (hostval != guestval) {
@ -533,9 +534,10 @@ static enum ssb_mitigation __init __ssb_select_mitigation(void)
* Intel uses the SPEC CTRL MSR Bit(2) for this, while AMD may * Intel uses the SPEC CTRL MSR Bit(2) for this, while AMD may
* use a completely different MSR and bit dependent on family. * use a completely different MSR and bit dependent on family.
*/ */
if (!static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL)) if (!static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) &&
!static_cpu_has(X86_FEATURE_AMD_SSBD)) {
x86_amd_ssb_disable(); x86_amd_ssb_disable();
else { } else {
x86_spec_ctrl_base |= SPEC_CTRL_SSBD; x86_spec_ctrl_base |= SPEC_CTRL_SSBD;
x86_spec_ctrl_mask |= SPEC_CTRL_SSBD; x86_spec_ctrl_mask |= SPEC_CTRL_SSBD;
wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_base); wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_base);

View File

@ -106,7 +106,8 @@ mtrr_write(struct file *file, const char __user *buf, size_t len, loff_t * ppos)
memset(line, 0, LINE_SIZE); memset(line, 0, LINE_SIZE);
length = strncpy_from_user(line, buf, LINE_SIZE - 1); len = min_t(size_t, len, LINE_SIZE - 1);
length = strncpy_from_user(line, buf, len);
if (length < 0) if (length < 0)
return length; return length;

View File

@ -0,0 +1,26 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm/asm.h>
#include <asm/export.h>
#include <linux/linkage.h>
/*
* unsigned long native_save_fl(void)
*/
ENTRY(native_save_fl)
pushf
pop %_ASM_AX
ret
ENDPROC(native_save_fl)
EXPORT_SYMBOL(native_save_fl)
/*
* void native_restore_fl(unsigned long flags)
* %eax/%rdi: flags
*/
ENTRY(native_restore_fl)
push %_ASM_ARG1
popf
ret
ENDPROC(native_restore_fl)
EXPORT_SYMBOL(native_restore_fl)

View File

@ -138,6 +138,7 @@ static unsigned long kvm_get_tsc_khz(void)
src = &hv_clock[cpu].pvti; src = &hv_clock[cpu].pvti;
tsc_khz = pvclock_tsc_khz(src); tsc_khz = pvclock_tsc_khz(src);
put_cpu(); put_cpu();
setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ);
return tsc_khz; return tsc_khz;
} }
@ -319,6 +320,8 @@ void __init kvmclock_init(void)
printk(KERN_INFO "kvm-clock: Using msrs %x and %x", printk(KERN_INFO "kvm-clock: Using msrs %x and %x",
msr_kvm_system_time, msr_kvm_wall_clock); msr_kvm_system_time, msr_kvm_wall_clock);
pvclock_set_pvti_cpu0_va(hv_clock);
if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT))
pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT); pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT);
@ -366,14 +369,11 @@ int __init kvm_setup_vsyscall_timeinfo(void)
vcpu_time = &hv_clock[cpu].pvti; vcpu_time = &hv_clock[cpu].pvti;
flags = pvclock_read_flags(vcpu_time); flags = pvclock_read_flags(vcpu_time);
if (!(flags & PVCLOCK_TSC_STABLE_BIT)) {
put_cpu();
return 1;
}
pvclock_set_pvti_cpu0_va(hv_clock);
put_cpu(); put_cpu();
if (!(flags & PVCLOCK_TSC_STABLE_BIT))
return 1;
kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK; kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK;
#endif #endif
return 0; return 0;

View File

@ -221,6 +221,11 @@ static void notrace start_secondary(void *unused)
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/* switch away from the initial page table */ /* switch away from the initial page table */
load_cr3(swapper_pg_dir); load_cr3(swapper_pg_dir);
/*
* Initialize the CR4 shadow before doing anything that could
* try to read it.
*/
cr4_init_shadow();
__flush_tlb_all(); __flush_tlb_all();
#endif #endif
load_current_idt(); load_current_idt();

View File

@ -85,7 +85,7 @@ config KVM_AMD_SEV
def_bool y def_bool y
bool "AMD Secure Encrypted Virtualization (SEV) support" bool "AMD Secure Encrypted Virtualization (SEV) support"
depends on KVM_AMD && X86_64 depends on KVM_AMD && X86_64
depends on CRYPTO_DEV_CCP && CRYPTO_DEV_CCP_DD && CRYPTO_DEV_SP_PSP depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=y && CRYPTO_DEV_CCP_DD=m)
---help--- ---help---
Provides support for launching Encrypted VMs on AMD processors. Provides support for launching Encrypted VMs on AMD processors.

View File

@ -2571,6 +2571,7 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
struct vcpu_vmx *vmx = to_vmx(vcpu); struct vcpu_vmx *vmx = to_vmx(vcpu);
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
int cpu = raw_smp_processor_id(); int cpu = raw_smp_processor_id();
unsigned long fs_base, kernel_gs_base;
#endif #endif
int i; int i;
@ -2586,12 +2587,20 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel; vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
save_fsgs_for_kvm(); if (likely(is_64bit_mm(current->mm))) {
vmx->host_state.fs_sel = current->thread.fsindex; save_fsgs_for_kvm();
vmx->host_state.gs_sel = current->thread.gsindex; vmx->host_state.fs_sel = current->thread.fsindex;
#else vmx->host_state.gs_sel = current->thread.gsindex;
savesegment(fs, vmx->host_state.fs_sel); fs_base = current->thread.fsbase;
savesegment(gs, vmx->host_state.gs_sel); kernel_gs_base = current->thread.gsbase;
} else {
#endif
savesegment(fs, vmx->host_state.fs_sel);
savesegment(gs, vmx->host_state.gs_sel);
#ifdef CONFIG_X86_64
fs_base = read_msr(MSR_FS_BASE);
kernel_gs_base = read_msr(MSR_KERNEL_GS_BASE);
}
#endif #endif
if (!(vmx->host_state.fs_sel & 7)) { if (!(vmx->host_state.fs_sel & 7)) {
vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel); vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel);
@ -2611,10 +2620,10 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
savesegment(ds, vmx->host_state.ds_sel); savesegment(ds, vmx->host_state.ds_sel);
savesegment(es, vmx->host_state.es_sel); savesegment(es, vmx->host_state.es_sel);
vmcs_writel(HOST_FS_BASE, current->thread.fsbase); vmcs_writel(HOST_FS_BASE, fs_base);
vmcs_writel(HOST_GS_BASE, cpu_kernelmode_gs_base(cpu)); vmcs_writel(HOST_GS_BASE, cpu_kernelmode_gs_base(cpu));
vmx->msr_host_kernel_gs_base = current->thread.gsbase; vmx->msr_host_kernel_gs_base = kernel_gs_base;
if (is_long_mode(&vmx->vcpu)) if (is_long_mode(&vmx->vcpu))
wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base);
#else #else
@ -4322,11 +4331,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
vmcs_conf->order = get_order(vmcs_conf->size); vmcs_conf->order = get_order(vmcs_conf->size);
vmcs_conf->basic_cap = vmx_msr_high & ~0x1fff; vmcs_conf->basic_cap = vmx_msr_high & ~0x1fff;
/* KVM supports Enlightened VMCS v1 only */ vmcs_conf->revision_id = vmx_msr_low;
if (static_branch_unlikely(&enable_evmcs))
vmcs_conf->revision_id = KVM_EVMCS_VERSION;
else
vmcs_conf->revision_id = vmx_msr_low;
vmcs_conf->pin_based_exec_ctrl = _pin_based_exec_control; vmcs_conf->pin_based_exec_ctrl = _pin_based_exec_control;
vmcs_conf->cpu_based_exec_ctrl = _cpu_based_exec_control; vmcs_conf->cpu_based_exec_ctrl = _cpu_based_exec_control;
@ -4396,7 +4401,13 @@ static struct vmcs *alloc_vmcs_cpu(int cpu)
return NULL; return NULL;
vmcs = page_address(pages); vmcs = page_address(pages);
memset(vmcs, 0, vmcs_config.size); memset(vmcs, 0, vmcs_config.size);
vmcs->revision_id = vmcs_config.revision_id; /* vmcs revision id */
/* KVM supports Enlightened VMCS v1 only */
if (static_branch_unlikely(&enable_evmcs))
vmcs->revision_id = KVM_EVMCS_VERSION;
else
vmcs->revision_id = vmcs_config.revision_id;
return vmcs; return vmcs;
} }
@ -4564,6 +4575,19 @@ static __init int alloc_kvm_area(void)
return -ENOMEM; return -ENOMEM;
} }
/*
* When eVMCS is enabled, alloc_vmcs_cpu() sets
* vmcs->revision_id to KVM_EVMCS_VERSION instead of
* revision_id reported by MSR_IA32_VMX_BASIC.
*
* However, even though not explictly documented by
* TLFS, VMXArea passed as VMXON argument should
* still be marked with revision_id reported by
* physical CPU.
*/
if (static_branch_unlikely(&enable_evmcs))
vmcs->revision_id = vmcs_config.revision_id;
per_cpu(vmxarea, cpu) = vmcs; per_cpu(vmxarea, cpu) = vmcs;
} }
return 0; return 0;
@ -11753,7 +11777,6 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu)
{ {
struct vcpu_vmx *vmx = to_vmx(vcpu); struct vcpu_vmx *vmx = to_vmx(vcpu);
struct vmcs12 *vmcs12 = get_vmcs12(vcpu); struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
u32 msr_entry_idx;
u32 exit_qual; u32 exit_qual;
int r; int r;
@ -11775,10 +11798,10 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu)
nested_get_vmcs12_pages(vcpu, vmcs12); nested_get_vmcs12_pages(vcpu, vmcs12);
r = EXIT_REASON_MSR_LOAD_FAIL; r = EXIT_REASON_MSR_LOAD_FAIL;
msr_entry_idx = nested_vmx_load_msr(vcpu, exit_qual = nested_vmx_load_msr(vcpu,
vmcs12->vm_entry_msr_load_addr, vmcs12->vm_entry_msr_load_addr,
vmcs12->vm_entry_msr_load_count); vmcs12->vm_entry_msr_load_count);
if (msr_entry_idx) if (exit_qual)
goto fail; goto fail;
/* /*

View File

@ -1097,6 +1097,7 @@ static u32 msr_based_features[] = {
MSR_F10H_DECFG, MSR_F10H_DECFG,
MSR_IA32_UCODE_REV, MSR_IA32_UCODE_REV,
MSR_IA32_ARCH_CAPABILITIES,
}; };
static unsigned int num_msr_based_features; static unsigned int num_msr_based_features;
@ -1105,7 +1106,8 @@ static int kvm_get_msr_feature(struct kvm_msr_entry *msr)
{ {
switch (msr->index) { switch (msr->index) {
case MSR_IA32_UCODE_REV: case MSR_IA32_UCODE_REV:
rdmsrl(msr->index, msr->data); case MSR_IA32_ARCH_CAPABILITIES:
rdmsrl_safe(msr->index, &msr->data);
break; break;
default: default:
if (kvm_x86_ops->get_msr_feature(msr)) if (kvm_x86_ops->get_msr_feature(msr))

View File

@ -6,7 +6,7 @@ purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string
targets += $(purgatory-y) targets += $(purgatory-y)
PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y)) PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y))
$(obj)/sha256.o: $(srctree)/lib/sha256.c $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE
$(call if_changed_rule,cc_o_c) $(call if_changed_rule,cc_o_c)
LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib

View File

@ -1207,12 +1207,20 @@ asmlinkage __visible void __init xen_start_kernel(void)
xen_setup_features(); xen_setup_features();
xen_setup_machphys_mapping();
/* Install Xen paravirt ops */ /* Install Xen paravirt ops */
pv_info = xen_info; pv_info = xen_info;
pv_init_ops.patch = paravirt_patch_default; pv_init_ops.patch = paravirt_patch_default;
pv_cpu_ops = xen_cpu_ops; pv_cpu_ops = xen_cpu_ops;
xen_init_irq_ops();
/*
* Setup xen_vcpu early because it is needed for
* local_irq_disable(), irqs_disabled(), e.g. in printk().
*
* Don't do the full vcpu_info placement stuff until we have
* the cpu_possible_mask and a non-dummy shared_info.
*/
xen_vcpu_info_reset(0);
x86_platform.get_nmi_reason = xen_get_nmi_reason; x86_platform.get_nmi_reason = xen_get_nmi_reason;
@ -1225,10 +1233,12 @@ asmlinkage __visible void __init xen_start_kernel(void)
* Set up some pagetable state before starting to set any ptes. * Set up some pagetable state before starting to set any ptes.
*/ */
xen_setup_machphys_mapping();
xen_init_mmu_ops(); xen_init_mmu_ops();
/* Prevent unwanted bits from being set in PTEs. */ /* Prevent unwanted bits from being set in PTEs. */
__supported_pte_mask &= ~_PAGE_GLOBAL; __supported_pte_mask &= ~_PAGE_GLOBAL;
__default_kernel_pte_mask &= ~_PAGE_GLOBAL;
/* /*
* Prevent page tables from being allocated in highmem, even * Prevent page tables from being allocated in highmem, even
@ -1249,20 +1259,9 @@ asmlinkage __visible void __init xen_start_kernel(void)
get_cpu_cap(&boot_cpu_data); get_cpu_cap(&boot_cpu_data);
x86_configure_nx(); x86_configure_nx();
xen_init_irq_ops();
/* Let's presume PV guests always boot on vCPU with id 0. */ /* Let's presume PV guests always boot on vCPU with id 0. */
per_cpu(xen_vcpu_id, 0) = 0; per_cpu(xen_vcpu_id, 0) = 0;
/*
* Setup xen_vcpu early because idt_setup_early_handler needs it for
* local_irq_disable(), irqs_disabled().
*
* Don't do the full vcpu_info placement stuff until we have
* the cpu_possible_mask and a non-dummy shared_info.
*/
xen_vcpu_info_reset(0);
idt_setup_early_handler(); idt_setup_early_handler();
xen_init_capabilities(); xen_init_capabilities();

View File

@ -128,8 +128,6 @@ static const struct pv_irq_ops xen_irq_ops __initconst = {
void __init xen_init_irq_ops(void) void __init xen_init_irq_ops(void)
{ {
/* For PVH we use default pv_irq_ops settings. */ pv_irq_ops = xen_irq_ops;
if (!xen_feature(XENFEAT_hvm_callback_vector))
pv_irq_ops = xen_irq_ops;
x86_init.irqs.intr_init = xen_init_IRQ; x86_init.irqs.intr_init = xen_init_IRQ;
} }

View File

@ -267,8 +267,6 @@ bsg_map_hdr(struct request_queue *q, struct sg_io_v4 *hdr, fmode_t mode)
} else if (hdr->din_xfer_len) { } else if (hdr->din_xfer_len) {
ret = blk_rq_map_user(q, rq, NULL, uptr64(hdr->din_xferp), ret = blk_rq_map_user(q, rq, NULL, uptr64(hdr->din_xferp),
hdr->din_xfer_len, GFP_KERNEL); hdr->din_xfer_len, GFP_KERNEL);
} else {
ret = blk_rq_map_user(q, rq, NULL, NULL, 0, GFP_KERNEL);
} }
if (ret) if (ret)

View File

@ -1155,8 +1155,10 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
/* make one iovec available as scatterlist */ /* make one iovec available as scatterlist */
err = af_alg_make_sg(&rsgl->sgl, &msg->msg_iter, seglen); err = af_alg_make_sg(&rsgl->sgl, &msg->msg_iter, seglen);
if (err < 0) if (err < 0) {
rsgl->sg_num_bytes = 0;
return err; return err;
}
/* chain the new scatterlist with previous one */ /* chain the new scatterlist with previous one */
if (areq->last_rsgl) if (areq->last_rsgl)

View File

@ -51,16 +51,23 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/* /* Disable all GPEs */
* 1) Disable all GPEs
* 2) Enable all wakeup GPEs
*/
status = acpi_hw_disable_all_gpes(); status = acpi_hw_disable_all_gpes();
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/*
* If the target sleep state is S5, clear all GPEs and fixed events too
*/
if (sleep_state == ACPI_STATE_S5) {
status = acpi_hw_clear_acpi_status();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
}
acpi_gbl_system_awake_and_running = FALSE; acpi_gbl_system_awake_and_running = FALSE;
/* Enable all wakeup GPEs */
status = acpi_hw_enable_all_wakeup_gpes(); status = acpi_hw_enable_all_wakeup_gpes();
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);

View File

@ -182,19 +182,19 @@ acpi_ut_prefixed_namespace_error(const char *module_name,
switch (lookup_status) { switch (lookup_status) {
case AE_ALREADY_EXISTS: case AE_ALREADY_EXISTS:
acpi_os_printf("\n" ACPI_MSG_BIOS_ERROR); acpi_os_printf(ACPI_MSG_BIOS_ERROR);
message = "Failure creating"; message = "Failure creating";
break; break;
case AE_NOT_FOUND: case AE_NOT_FOUND:
acpi_os_printf("\n" ACPI_MSG_BIOS_ERROR); acpi_os_printf(ACPI_MSG_BIOS_ERROR);
message = "Could not resolve"; message = "Could not resolve";
break; break;
default: default:
acpi_os_printf("\n" ACPI_MSG_ERROR); acpi_os_printf(ACPI_MSG_ERROR);
message = "Failure resolving"; message = "Failure resolving";
break; break;
} }

View File

@ -717,10 +717,11 @@ void battery_hook_register(struct acpi_battery_hook *hook)
*/ */
pr_err("extension failed to load: %s", hook->name); pr_err("extension failed to load: %s", hook->name);
__battery_hook_unregister(hook, 0); __battery_hook_unregister(hook, 0);
return; goto end;
} }
} }
pr_info("new extension: %s\n", hook->name); pr_info("new extension: %s\n", hook->name);
end:
mutex_unlock(&hook_mutex); mutex_unlock(&hook_mutex);
} }
EXPORT_SYMBOL_GPL(battery_hook_register); EXPORT_SYMBOL_GPL(battery_hook_register);
@ -732,7 +733,7 @@ EXPORT_SYMBOL_GPL(battery_hook_register);
*/ */
static void battery_hook_add_battery(struct acpi_battery *battery) static void battery_hook_add_battery(struct acpi_battery *battery)
{ {
struct acpi_battery_hook *hook_node; struct acpi_battery_hook *hook_node, *tmp;
mutex_lock(&hook_mutex); mutex_lock(&hook_mutex);
INIT_LIST_HEAD(&battery->list); INIT_LIST_HEAD(&battery->list);
@ -744,15 +745,15 @@ static void battery_hook_add_battery(struct acpi_battery *battery)
* when a battery gets hotplugged or initialized * when a battery gets hotplugged or initialized
* during the battery module initialization. * during the battery module initialization.
*/ */
list_for_each_entry(hook_node, &battery_hook_list, list) { list_for_each_entry_safe(hook_node, tmp, &battery_hook_list, list) {
if (hook_node->add_battery(battery->bat)) { if (hook_node->add_battery(battery->bat)) {
/* /*
* The notification of the extensions has failed, to * The notification of the extensions has failed, to
* prevent further errors we will unload the extension. * prevent further errors we will unload the extension.
*/ */
__battery_hook_unregister(hook_node, 0);
pr_err("error in extension, unloading: %s", pr_err("error in extension, unloading: %s",
hook_node->name); hook_node->name);
__battery_hook_unregister(hook_node, 0);
} }
} }
mutex_unlock(&hook_mutex); mutex_unlock(&hook_mutex);

View File

@ -408,6 +408,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
const guid_t *guid; const guid_t *guid;
int rc, i; int rc, i;
if (cmd_rc)
*cmd_rc = -EINVAL;
func = cmd; func = cmd;
if (cmd == ND_CMD_CALL) { if (cmd == ND_CMD_CALL) {
call_pkg = buf; call_pkg = buf;
@ -518,6 +520,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
* If we return an error (like elsewhere) then caller wouldn't * If we return an error (like elsewhere) then caller wouldn't
* be able to rely upon data returned to make calculation. * be able to rely upon data returned to make calculation.
*/ */
if (cmd_rc)
*cmd_rc = 0;
return 0; return 0;
} }
@ -1273,7 +1277,7 @@ static ssize_t scrub_show(struct device *dev,
mutex_lock(&acpi_desc->init_mutex); mutex_lock(&acpi_desc->init_mutex);
rc = sprintf(buf, "%d%s", acpi_desc->scrub_count, rc = sprintf(buf, "%d%s", acpi_desc->scrub_count,
work_busy(&acpi_desc->dwork.work) acpi_desc->scrub_busy
&& !acpi_desc->cancel ? "+\n" : "\n"); && !acpi_desc->cancel ? "+\n" : "\n");
mutex_unlock(&acpi_desc->init_mutex); mutex_unlock(&acpi_desc->init_mutex);
} }
@ -2939,6 +2943,32 @@ static unsigned int __acpi_nfit_scrub(struct acpi_nfit_desc *acpi_desc,
return 0; return 0;
} }
static void __sched_ars(struct acpi_nfit_desc *acpi_desc, unsigned int tmo)
{
lockdep_assert_held(&acpi_desc->init_mutex);
acpi_desc->scrub_busy = 1;
/* note this should only be set from within the workqueue */
if (tmo)
acpi_desc->scrub_tmo = tmo;
queue_delayed_work(nfit_wq, &acpi_desc->dwork, tmo * HZ);
}
static void sched_ars(struct acpi_nfit_desc *acpi_desc)
{
__sched_ars(acpi_desc, 0);
}
static void notify_ars_done(struct acpi_nfit_desc *acpi_desc)
{
lockdep_assert_held(&acpi_desc->init_mutex);
acpi_desc->scrub_busy = 0;
acpi_desc->scrub_count++;
if (acpi_desc->scrub_count_state)
sysfs_notify_dirent(acpi_desc->scrub_count_state);
}
static void acpi_nfit_scrub(struct work_struct *work) static void acpi_nfit_scrub(struct work_struct *work)
{ {
struct acpi_nfit_desc *acpi_desc; struct acpi_nfit_desc *acpi_desc;
@ -2949,14 +2979,10 @@ static void acpi_nfit_scrub(struct work_struct *work)
mutex_lock(&acpi_desc->init_mutex); mutex_lock(&acpi_desc->init_mutex);
query_rc = acpi_nfit_query_poison(acpi_desc); query_rc = acpi_nfit_query_poison(acpi_desc);
tmo = __acpi_nfit_scrub(acpi_desc, query_rc); tmo = __acpi_nfit_scrub(acpi_desc, query_rc);
if (tmo) { if (tmo)
queue_delayed_work(nfit_wq, &acpi_desc->dwork, tmo * HZ); __sched_ars(acpi_desc, tmo);
acpi_desc->scrub_tmo = tmo; else
} else { notify_ars_done(acpi_desc);
acpi_desc->scrub_count++;
if (acpi_desc->scrub_count_state)
sysfs_notify_dirent(acpi_desc->scrub_count_state);
}
memset(acpi_desc->ars_status, 0, acpi_desc->max_ars); memset(acpi_desc->ars_status, 0, acpi_desc->max_ars);
mutex_unlock(&acpi_desc->init_mutex); mutex_unlock(&acpi_desc->init_mutex);
} }
@ -3037,7 +3063,7 @@ static int acpi_nfit_register_regions(struct acpi_nfit_desc *acpi_desc)
break; break;
} }
queue_delayed_work(nfit_wq, &acpi_desc->dwork, 0); sched_ars(acpi_desc);
return 0; return 0;
} }
@ -3239,7 +3265,7 @@ int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc, unsigned long flags)
} }
} }
if (scheduled) { if (scheduled) {
queue_delayed_work(nfit_wq, &acpi_desc->dwork, 0); sched_ars(acpi_desc);
dev_dbg(dev, "ars_scan triggered\n"); dev_dbg(dev, "ars_scan triggered\n");
} }
mutex_unlock(&acpi_desc->init_mutex); mutex_unlock(&acpi_desc->init_mutex);

View File

@ -203,6 +203,7 @@ struct acpi_nfit_desc {
unsigned int max_ars; unsigned int max_ars;
unsigned int scrub_count; unsigned int scrub_count;
unsigned int scrub_mode; unsigned int scrub_mode;
unsigned int scrub_busy:1;
unsigned int cancel:1; unsigned int cancel:1;
unsigned long dimm_cmd_force_en; unsigned long dimm_cmd_force_en;
unsigned long bus_cmd_force_en; unsigned long bus_cmd_force_en;

View File

@ -481,8 +481,14 @@ static int topology_get_acpi_cpu_tag(struct acpi_table_header *table,
if (cpu_node) { if (cpu_node) {
cpu_node = acpi_find_processor_package_id(table, cpu_node, cpu_node = acpi_find_processor_package_id(table, cpu_node,
level, flag); level, flag);
/* Only the first level has a guaranteed id */ /*
if (level == 0) * As per specification if the processor structure represents
* an actual processor, then ACPI processor ID must be valid.
* For processor containers ACPI_PPTT_ACPI_PROCESSOR_ID_VALID
* should be set if the UID is valid
*/
if (level == 0 ||
cpu_node->flags & ACPI_PPTT_ACPI_PROCESSOR_ID_VALID)
return cpu_node->acpi_processor_id; return cpu_node->acpi_processor_id;
return ACPI_PTR_DIFF(cpu_node, table); return ACPI_PTR_DIFF(cpu_node, table);
} }

View File

@ -398,7 +398,6 @@ config SATA_DWC_VDEBUG
config SATA_HIGHBANK config SATA_HIGHBANK
tristate "Calxeda Highbank SATA support" tristate "Calxeda Highbank SATA support"
depends on HAS_DMA
depends on ARCH_HIGHBANK || COMPILE_TEST depends on ARCH_HIGHBANK || COMPILE_TEST
help help
This option enables support for the Calxeda Highbank SoC's This option enables support for the Calxeda Highbank SoC's
@ -408,7 +407,6 @@ config SATA_HIGHBANK
config SATA_MV config SATA_MV
tristate "Marvell SATA support" tristate "Marvell SATA support"
depends on HAS_DMA
depends on PCI || ARCH_DOVE || ARCH_MV78XX0 || \ depends on PCI || ARCH_DOVE || ARCH_MV78XX0 || \
ARCH_MVEBU || ARCH_ORION5X || COMPILE_TEST ARCH_MVEBU || ARCH_ORION5X || COMPILE_TEST
select GENERIC_PHY select GENERIC_PHY

View File

@ -400,6 +400,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, 0x0f23), board_ahci_mobile }, /* Bay Trail AHCI */ { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_mobile }, /* Bay Trail AHCI */
{ PCI_VDEVICE(INTEL, 0x22a3), board_ahci_mobile }, /* Cherry Tr. AHCI */ { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_mobile }, /* Cherry Tr. AHCI */
{ PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_mobile }, /* ApolloLake AHCI */ { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_mobile }, /* ApolloLake AHCI */
{ PCI_VDEVICE(INTEL, 0x34d3), board_ahci_mobile }, /* Ice Lake LP AHCI */
/* JMicron 360/1/3/5/6, match class to avoid IDE function */ /* JMicron 360/1/3/5/6, match class to avoid IDE function */
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
@ -1280,6 +1281,59 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
return strcmp(buf, dmi->driver_data) < 0; return strcmp(buf, dmi->driver_data) < 0;
} }
static bool ahci_broken_lpm(struct pci_dev *pdev)
{
static const struct dmi_system_id sysids[] = {
/* Various Lenovo 50 series have LPM issues with older BIOSen */
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X250"),
},
.driver_data = "20180406", /* 1.31 */
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L450"),
},
.driver_data = "20180420", /* 1.28 */
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T450s"),
},
.driver_data = "20180315", /* 1.33 */
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W541"),
},
/*
* Note date based on release notes, 2.35 has been
* reported to be good, but I've been unable to get
* a hold of the reporter to get the DMI BIOS date.
* TODO: fix this.
*/
.driver_data = "20180310", /* 2.35 */
},
{ } /* terminate list */
};
const struct dmi_system_id *dmi = dmi_first_match(sysids);
int year, month, date;
char buf[9];
if (!dmi)
return false;
dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
return strcmp(buf, dmi->driver_data) < 0;
}
static bool ahci_broken_online(struct pci_dev *pdev) static bool ahci_broken_online(struct pci_dev *pdev)
{ {
#define ENCODE_BUSDEVFN(bus, slot, func) \ #define ENCODE_BUSDEVFN(bus, slot, func) \
@ -1694,6 +1748,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
"quirky BIOS, skipping spindown on poweroff\n"); "quirky BIOS, skipping spindown on poweroff\n");
} }
if (ahci_broken_lpm(pdev)) {
pi.flags |= ATA_FLAG_NO_LPM;
dev_warn(&pdev->dev,
"BIOS update required for Link Power Management support\n");
}
if (ahci_broken_suspend(pdev)) { if (ahci_broken_suspend(pdev)) {
hpriv->flags |= AHCI_HFLAG_NO_SUSPEND; hpriv->flags |= AHCI_HFLAG_NO_SUSPEND;
dev_warn(&pdev->dev, dev_warn(&pdev->dev,

View File

@ -82,7 +82,7 @@ static void ahci_mvebu_regret_option(struct ahci_host_priv *hpriv)
* *
* Return: 0 on success; Error code otherwise. * Return: 0 on success; Error code otherwise.
*/ */
int ahci_mvebu_stop_engine(struct ata_port *ap) static int ahci_mvebu_stop_engine(struct ata_port *ap)
{ {
void __iomem *port_mmio = ahci_port_base(ap); void __iomem *port_mmio = ahci_port_base(ap);
u32 tmp, port_fbs; u32 tmp, port_fbs;

View File

@ -35,6 +35,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/nospec.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
@ -1146,10 +1147,12 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf,
/* get the slot number from the message */ /* get the slot number from the message */
pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8; pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
if (pmp < EM_MAX_SLOTS) if (pmp < EM_MAX_SLOTS) {
pmp = array_index_nospec(pmp, EM_MAX_SLOTS);
emp = &pp->em_priv[pmp]; emp = &pp->em_priv[pmp];
else } else {
return -EINVAL; return -EINVAL;
}
/* mask off the activity bits if we are in sw_activity /* mask off the activity bits if we are in sw_activity
* mode, user should turn off sw_activity before setting * mode, user should turn off sw_activity before setting

View File

@ -2493,6 +2493,9 @@ int ata_dev_configure(struct ata_device *dev)
(id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2) (id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2)
dev->horkage |= ATA_HORKAGE_NOLPM; dev->horkage |= ATA_HORKAGE_NOLPM;
if (ap->flags & ATA_FLAG_NO_LPM)
dev->horkage |= ATA_HORKAGE_NOLPM;
if (dev->horkage & ATA_HORKAGE_NOLPM) { if (dev->horkage & ATA_HORKAGE_NOLPM) {
ata_dev_warn(dev, "LPM support broken, forcing max_power\n"); ata_dev_warn(dev, "LPM support broken, forcing max_power\n");
dev->link->ap->target_lpm_policy = ATA_LPM_MAX_POWER; dev->link->ap->target_lpm_policy = ATA_LPM_MAX_POWER;

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