Merge branch 'linus' into x86/timers
Pick up upstream changes to avoid conflicts
This commit is contained in:
commit
73ab603f44
@ -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.
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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>;
|
||||||
|
@ -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.
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ Required properties:
|
|||||||
|
|
||||||
Board connectors:
|
Board connectors:
|
||||||
* Headset Mic
|
* Headset Mic
|
||||||
* Secondary Mic",
|
* Secondary Mic
|
||||||
* DMIC
|
* DMIC
|
||||||
* Ext Spk
|
* Ext Spk
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
|
||||||
|
|
||||||
###
|
###
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
=======
|
=======
|
||||||
|
18
MAINTAINERS
18
MAINTAINERS
@ -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
|
||||||
|
15
Makefile
15
Makefile
@ -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)
|
||||||
|
@ -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 */
|
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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";
|
||||||
};
|
};
|
||||||
|
@ -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 {
|
||||||
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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]
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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) ;\
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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(
|
||||||
|
@ -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, ®s, 0, -1);
|
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, 0, -1);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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.
|
||||||
|
@ -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) {
|
||||||
|
@ -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".
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 *)
|
||||||
|
@ -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/
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
26
arch/x86/kernel/irqflags.S
Normal file
26
arch/x86/kernel/irqflags.S
Normal 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)
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user