Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
to pick up the KVM fix which is required for the NX series.
This commit is contained in:
commit
ca8888d7ae
|
@ -91,6 +91,11 @@ stable kernels.
|
||||||
| ARM | MMU-500 | #841119,826419 | N/A |
|
| ARM | MMU-500 | #841119,826419 | N/A |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
| Broadcom | Brahma-B53 | N/A | ARM64_ERRATUM_845719 |
|
||||||
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
| Broadcom | Brahma-B53 | N/A | ARM64_ERRATUM_843419 |
|
||||||
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Cavium | ThunderX ITS | #22375,24313 | CAVIUM_ERRATUM_22375 |
|
| Cavium | ThunderX ITS | #22375,24313 | CAVIUM_ERRATUM_22375 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Cavium | ThunderX ITS | #23144 | CAVIUM_ERRATUM_23144 |
|
| Cavium | ThunderX ITS | #23144 | CAVIUM_ERRATUM_23144 |
|
||||||
|
@ -126,7 +131,7 @@ stable kernels.
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
| Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Qualcomm Tech. | Falkor v1 | E1009 | QCOM_FALKOR_ERRATUM_1009 |
|
| Qualcomm Tech. | Kryo/Falkor v1 | E1009 | QCOM_FALKOR_ERRATUM_1009 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Qualcomm Tech. | QDF2400 ITS | E0065 | QCOM_QDF2400_ERRATUM_0065 |
|
| Qualcomm Tech. | QDF2400 ITS | E0065 | QCOM_QDF2400_ERRATUM_0065 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
==============================================================
|
=============================================================
|
||||||
Linux* Base Driver for the Intel(R) PRO/100 Family of Adapters
|
Linux Base Driver for the Intel(R) PRO/100 Family of Adapters
|
||||||
==============================================================
|
=============================================================
|
||||||
|
|
||||||
June 1, 2018
|
June 1, 2018
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ Contents
|
||||||
In This Release
|
In This Release
|
||||||
===============
|
===============
|
||||||
|
|
||||||
This file describes the Linux* Base Driver for the Intel(R) PRO/100 Family of
|
This file describes the Linux Base Driver for the Intel(R) PRO/100 Family of
|
||||||
Adapters. This driver includes support for Itanium(R)2-based systems.
|
Adapters. This driver includes support for Itanium(R)2-based systems.
|
||||||
|
|
||||||
For questions related to hardware requirements, refer to the documentation
|
For questions related to hardware requirements, refer to the documentation
|
||||||
|
@ -138,9 +138,9 @@ version 1.6 or later is required for this functionality.
|
||||||
The latest release of ethtool can be found from
|
The latest release of ethtool can be found from
|
||||||
https://www.kernel.org/pub/software/network/ethtool/
|
https://www.kernel.org/pub/software/network/ethtool/
|
||||||
|
|
||||||
Enabling Wake on LAN* (WoL)
|
Enabling Wake on LAN (WoL)
|
||||||
---------------------------
|
--------------------------
|
||||||
WoL is provided through the ethtool* utility. For instructions on
|
WoL is provided through the ethtool utility. For instructions on
|
||||||
enabling WoL with ethtool, refer to the ethtool man page. WoL will be
|
enabling WoL with ethtool, refer to the ethtool man page. WoL will be
|
||||||
enabled on the system during the next shut down or reboot. For this
|
enabled on the system during the next shut down or reboot. For this
|
||||||
driver version, in order to enable WoL, the e100 driver must be loaded
|
driver version, in order to enable WoL, the e100 driver must be loaded
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
===========================================================
|
==========================================================
|
||||||
Linux* Base Driver for Intel(R) Ethernet Network Connection
|
Linux Base Driver for Intel(R) Ethernet Network Connection
|
||||||
===========================================================
|
==========================================================
|
||||||
|
|
||||||
Intel Gigabit Linux driver.
|
Intel Gigabit Linux driver.
|
||||||
Copyright(c) 1999 - 2013 Intel Corporation.
|
Copyright(c) 1999 - 2013 Intel Corporation.
|
||||||
|
@ -438,10 +438,10 @@ ethtool
|
||||||
The latest release of ethtool can be found from
|
The latest release of ethtool can be found from
|
||||||
https://www.kernel.org/pub/software/network/ethtool/
|
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 is configured through the ethtool utility.
|
||||||
|
|
||||||
WoL will be enabled on the system during the next shut down or reboot.
|
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
|
For this driver version, in order to enable WoL, the e1000 driver must be
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
======================================================
|
=====================================================
|
||||||
Linux* Driver for Intel(R) Ethernet Network Connection
|
Linux Driver for Intel(R) Ethernet Network Connection
|
||||||
======================================================
|
=====================================================
|
||||||
|
|
||||||
Intel Gigabit Linux driver.
|
Intel Gigabit Linux driver.
|
||||||
Copyright(c) 2008-2018 Intel Corporation.
|
Copyright(c) 2008-2018 Intel Corporation.
|
||||||
|
@ -338,7 +338,7 @@ and higher cannot be forced. Use the autonegotiation advertising setting to
|
||||||
manually set devices for 1 Gbps and higher.
|
manually set devices for 1 Gbps and higher.
|
||||||
|
|
||||||
Speed, duplex, and autonegotiation advertising are configured through the
|
Speed, duplex, and autonegotiation advertising are configured through the
|
||||||
ethtool* utility.
|
ethtool utility.
|
||||||
|
|
||||||
Caution: Only experienced network administrators should force speed and duplex
|
Caution: Only experienced network administrators should force speed and duplex
|
||||||
or change autonegotiation advertising manually. The settings at the switch must
|
or change autonegotiation advertising manually. The settings at the switch must
|
||||||
|
@ -351,9 +351,9 @@ will not attempt to auto-negotiate with its link partner since those adapters
|
||||||
operate only in full duplex and only at their native speed.
|
operate only in full duplex and only at their native speed.
|
||||||
|
|
||||||
|
|
||||||
Enabling Wake on LAN* (WoL)
|
Enabling Wake on LAN (WoL)
|
||||||
---------------------------
|
--------------------------
|
||||||
WoL is configured through the ethtool* utility.
|
WoL is configured through the ethtool utility.
|
||||||
|
|
||||||
WoL will be enabled on the system during the next shut down or reboot. For
|
WoL will be enabled on the system during the next shut down or reboot. For
|
||||||
this driver version, in order to enable WoL, the e1000e driver must be loaded
|
this driver version, in order to enable WoL, the e1000e driver must be loaded
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
==============================================================
|
=============================================================
|
||||||
Linux* Base Driver for Intel(R) Ethernet Multi-host Controller
|
Linux Base Driver for Intel(R) Ethernet Multi-host Controller
|
||||||
==============================================================
|
=============================================================
|
||||||
|
|
||||||
August 20, 2018
|
August 20, 2018
|
||||||
Copyright(c) 2015-2018 Intel Corporation.
|
Copyright(c) 2015-2018 Intel Corporation.
|
||||||
|
@ -120,8 +120,8 @@ rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 m|v|t|s|d|f|n|r
|
||||||
Known Issues/Troubleshooting
|
Known Issues/Troubleshooting
|
||||||
============================
|
============================
|
||||||
|
|
||||||
Enabling SR-IOV in a 64-bit Microsoft* Windows Server* 2012/R2 guest OS under Linux KVM
|
Enabling SR-IOV in a 64-bit Microsoft Windows Server 2012/R2 guest OS under Linux KVM
|
||||||
---------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------
|
||||||
KVM Hypervisor/VMM supports direct assignment of a PCIe device to a VM. This
|
KVM Hypervisor/VMM supports direct assignment of a PCIe device to a VM. This
|
||||||
includes traditional PCIe devices, as well as SR-IOV-capable devices based on
|
includes traditional PCIe devices, as well as SR-IOV-capable devices based on
|
||||||
the Intel Ethernet Controller XL710.
|
the Intel Ethernet Controller XL710.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
==================================================================
|
=================================================================
|
||||||
Linux* Base Driver for the Intel(R) Ethernet Controller 700 Series
|
Linux Base Driver for the Intel(R) Ethernet Controller 700 Series
|
||||||
==================================================================
|
=================================================================
|
||||||
|
|
||||||
Intel 40 Gigabit Linux driver.
|
Intel 40 Gigabit Linux driver.
|
||||||
Copyright(c) 1999-2018 Intel Corporation.
|
Copyright(c) 1999-2018 Intel Corporation.
|
||||||
|
@ -384,7 +384,7 @@ NOTE: You cannot set the speed for devices based on the Intel(R) Ethernet
|
||||||
Network Adapter XXV710 based devices.
|
Network Adapter XXV710 based devices.
|
||||||
|
|
||||||
Speed, duplex, and autonegotiation advertising are configured through the
|
Speed, duplex, and autonegotiation advertising are configured through the
|
||||||
ethtool* utility.
|
ethtool utility.
|
||||||
|
|
||||||
Caution: Only experienced network administrators should force speed and duplex
|
Caution: Only experienced network administrators should force speed and duplex
|
||||||
or change autonegotiation advertising manually. The settings at the switch must
|
or change autonegotiation advertising manually. The settings at the switch must
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
==================================================================
|
=================================================================
|
||||||
Linux* Base Driver for Intel(R) Ethernet Adaptive Virtual Function
|
Linux Base Driver for Intel(R) Ethernet Adaptive Virtual Function
|
||||||
==================================================================
|
=================================================================
|
||||||
|
|
||||||
Intel Ethernet Adaptive Virtual Function Linux driver.
|
Intel Ethernet Adaptive Virtual Function Linux driver.
|
||||||
Copyright(c) 2013-2018 Intel Corporation.
|
Copyright(c) 2013-2018 Intel Corporation.
|
||||||
|
@ -19,7 +19,7 @@ Contents
|
||||||
Overview
|
Overview
|
||||||
========
|
========
|
||||||
|
|
||||||
This file describes the iavf Linux* Base Driver. This driver was formerly
|
This file describes the iavf Linux Base Driver. This driver was formerly
|
||||||
called i40evf.
|
called i40evf.
|
||||||
|
|
||||||
The iavf driver supports the below mentioned virtual function devices and
|
The iavf driver supports the below mentioned virtual function devices and
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
===================================================================
|
==================================================================
|
||||||
Linux* Base Driver for the Intel(R) Ethernet Connection E800 Series
|
Linux Base Driver for the Intel(R) Ethernet Connection E800 Series
|
||||||
===================================================================
|
==================================================================
|
||||||
|
|
||||||
Intel ice Linux driver.
|
Intel ice Linux driver.
|
||||||
Copyright(c) 2018 Intel Corporation.
|
Copyright(c) 2018 Intel Corporation.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
===========================================================
|
==========================================================
|
||||||
Linux* Base Driver for Intel(R) Ethernet Network Connection
|
Linux Base Driver for Intel(R) Ethernet Network Connection
|
||||||
===========================================================
|
==========================================================
|
||||||
|
|
||||||
Intel Gigabit Linux driver.
|
Intel Gigabit Linux driver.
|
||||||
Copyright(c) 1999-2018 Intel Corporation.
|
Copyright(c) 1999-2018 Intel Corporation.
|
||||||
|
@ -129,9 +129,9 @@ version is required for this functionality. Download it at:
|
||||||
https://www.kernel.org/pub/software/network/ethtool/
|
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 is configured through the ethtool utility.
|
||||||
|
|
||||||
WoL will be enabled on the system during the next shut down or reboot. For
|
WoL will be enabled on the system during the next shut down or reboot. For
|
||||||
this driver version, in order to enable WoL, the igb driver must be loaded
|
this driver version, in order to enable WoL, the igb driver must be loaded
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
============================================================
|
===========================================================
|
||||||
Linux* Base Virtual Function Driver for Intel(R) 1G Ethernet
|
Linux Base Virtual Function Driver for Intel(R) 1G Ethernet
|
||||||
============================================================
|
===========================================================
|
||||||
|
|
||||||
Intel Gigabit Virtual Function Linux driver.
|
Intel Gigabit Virtual Function Linux driver.
|
||||||
Copyright(c) 1999-2018 Intel Corporation.
|
Copyright(c) 1999-2018 Intel Corporation.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
=============================================================================
|
===========================================================================
|
||||||
Linux* Base Driver for the Intel(R) Ethernet 10 Gigabit PCI Express Adapters
|
Linux Base Driver for the Intel(R) Ethernet 10 Gigabit PCI Express Adapters
|
||||||
=============================================================================
|
===========================================================================
|
||||||
|
|
||||||
Intel 10 Gigabit Linux driver.
|
Intel 10 Gigabit Linux driver.
|
||||||
Copyright(c) 1999-2018 Intel Corporation.
|
Copyright(c) 1999-2018 Intel Corporation.
|
||||||
|
@ -519,8 +519,8 @@ The offload is also supported for ixgbe's VFs, but the VF must be set as
|
||||||
Known Issues/Troubleshooting
|
Known Issues/Troubleshooting
|
||||||
============================
|
============================
|
||||||
|
|
||||||
Enabling SR-IOV in a 64-bit Microsoft* Windows Server* 2012/R2 guest OS
|
Enabling SR-IOV in a 64-bit Microsoft Windows Server 2012/R2 guest OS
|
||||||
-----------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
Linux KVM Hypervisor/VMM supports direct assignment of a PCIe device to a VM.
|
Linux KVM Hypervisor/VMM supports direct assignment of a PCIe device to a VM.
|
||||||
This includes traditional PCIe devices, as well as SR-IOV-capable devices based
|
This includes traditional PCIe devices, as well as SR-IOV-capable devices based
|
||||||
on the Intel Ethernet Controller XL710.
|
on the Intel Ethernet Controller XL710.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
=============================================================
|
============================================================
|
||||||
Linux* Base Virtual Function Driver for Intel(R) 10G Ethernet
|
Linux Base Virtual Function Driver for Intel(R) 10G Ethernet
|
||||||
=============================================================
|
============================================================
|
||||||
|
|
||||||
Intel 10 Gigabit Virtual Function Linux driver.
|
Intel 10 Gigabit Virtual Function Linux driver.
|
||||||
Copyright(c) 1999-2018 Intel Corporation.
|
Copyright(c) 1999-2018 Intel Corporation.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
.. SPDX-License-Identifier: GPL-2.0+
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
==========================================================
|
========================================================
|
||||||
Linux* Driver for the Pensando(R) Ethernet adapter family
|
Linux Driver for the Pensando(R) Ethernet adapter family
|
||||||
==========================================================
|
========================================================
|
||||||
|
|
||||||
Pensando Linux Ethernet driver.
|
Pensando Linux Ethernet driver.
|
||||||
Copyright(c) 2019 Pensando Systems, Inc
|
Copyright(c) 2019 Pensando Systems, Inc
|
||||||
|
|
|
@ -207,8 +207,8 @@ TCP variables:
|
||||||
|
|
||||||
somaxconn - INTEGER
|
somaxconn - INTEGER
|
||||||
Limit of socket listen() backlog, known in userspace as SOMAXCONN.
|
Limit of socket listen() backlog, known in userspace as SOMAXCONN.
|
||||||
Defaults to 128. See also tcp_max_syn_backlog for additional tuning
|
Defaults to 4096. (Was 128 before linux-5.4)
|
||||||
for TCP sockets.
|
See also tcp_max_syn_backlog for additional tuning for TCP sockets.
|
||||||
|
|
||||||
tcp_abort_on_overflow - BOOLEAN
|
tcp_abort_on_overflow - BOOLEAN
|
||||||
If listening service is too slow to accept new connections,
|
If listening service is too slow to accept new connections,
|
||||||
|
@ -408,11 +408,14 @@ tcp_max_orphans - INTEGER
|
||||||
up to ~64K of unswappable memory.
|
up to ~64K of unswappable memory.
|
||||||
|
|
||||||
tcp_max_syn_backlog - INTEGER
|
tcp_max_syn_backlog - INTEGER
|
||||||
Maximal number of remembered connection requests, which have not
|
Maximal number of remembered connection requests (SYN_RECV),
|
||||||
received an acknowledgment from connecting client.
|
which have not received an acknowledgment from connecting client.
|
||||||
|
This is a per-listener limit.
|
||||||
The minimal value is 128 for low memory machines, and it will
|
The minimal value is 128 for low memory machines, and it will
|
||||||
increase in proportion to the memory of machine.
|
increase in proportion to the memory of machine.
|
||||||
If server suffers from overload, try increasing this number.
|
If server suffers from overload, try increasing this number.
|
||||||
|
Remember to also check /proc/sys/net/core/somaxconn
|
||||||
|
A SYN_RECV request socket consumes about 304 bytes of memory.
|
||||||
|
|
||||||
tcp_max_tw_buckets - INTEGER
|
tcp_max_tw_buckets - INTEGER
|
||||||
Maximal number of timewait sockets held by system simultaneously.
|
Maximal number of timewait sockets held by system simultaneously.
|
||||||
|
|
|
@ -11408,7 +11408,6 @@ F: include/trace/events/tcp.h
|
||||||
NETWORKING [TLS]
|
NETWORKING [TLS]
|
||||||
M: Boris Pismenny <borisp@mellanox.com>
|
M: Boris Pismenny <borisp@mellanox.com>
|
||||||
M: Aviad Yehezkel <aviadye@mellanox.com>
|
M: Aviad Yehezkel <aviadye@mellanox.com>
|
||||||
M: Dave Watson <davejwatson@fb.com>
|
|
||||||
M: John Fastabend <john.fastabend@gmail.com>
|
M: John Fastabend <john.fastabend@gmail.com>
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
M: Jakub Kicinski <jakub.kicinski@netronome.com>
|
M: Jakub Kicinski <jakub.kicinski@netronome.com>
|
||||||
|
@ -13906,7 +13905,7 @@ F: drivers/mtd/nand/raw/r852.h
|
||||||
|
|
||||||
RISC-V ARCHITECTURE
|
RISC-V ARCHITECTURE
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
M: Palmer Dabbelt <palmer@sifive.com>
|
M: Palmer Dabbelt <palmer@dabbelt.com>
|
||||||
M: Albert Ou <aou@eecs.berkeley.edu>
|
M: Albert Ou <aou@eecs.berkeley.edu>
|
||||||
L: linux-riscv@lists.infradead.org
|
L: linux-riscv@lists.infradead.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
|
||||||
|
@ -14783,7 +14782,7 @@ F: drivers/media/usb/siano/
|
||||||
F: drivers/media/mmc/siano/
|
F: drivers/media/mmc/siano/
|
||||||
|
|
||||||
SIFIVE DRIVERS
|
SIFIVE DRIVERS
|
||||||
M: Palmer Dabbelt <palmer@sifive.com>
|
M: Palmer Dabbelt <palmer@dabbelt.com>
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
L: linux-riscv@lists.infradead.org
|
L: linux-riscv@lists.infradead.org
|
||||||
T: git git://github.com/sifive/riscv-linux.git
|
T: git git://github.com/sifive/riscv-linux.git
|
||||||
|
@ -14793,7 +14792,7 @@ N: sifive
|
||||||
|
|
||||||
SIFIVE FU540 SYSTEM-ON-CHIP
|
SIFIVE FU540 SYSTEM-ON-CHIP
|
||||||
M: Paul Walmsley <paul.walmsley@sifive.com>
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
M: Palmer Dabbelt <palmer@sifive.com>
|
M: Palmer Dabbelt <palmer@dabbelt.com>
|
||||||
L: linux-riscv@lists.infradead.org
|
L: linux-riscv@lists.infradead.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pjw/sifive.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pjw/sifive.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 4
|
PATCHLEVEL = 4
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -65,6 +65,14 @@
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
reg_5v0: regulator-5v0 {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
|
||||||
|
regulator-name = "5v0-supply";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
};
|
||||||
|
|
||||||
cpu_intc: cpu-interrupt-controller {
|
cpu_intc: cpu-interrupt-controller {
|
||||||
compatible = "snps,archs-intc";
|
compatible = "snps,archs-intc";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
|
@ -264,6 +272,21 @@
|
||||||
clocks = <&input_clk>;
|
clocks = <&input_clk>;
|
||||||
cs-gpios = <&creg_gpio 0 GPIO_ACTIVE_LOW>,
|
cs-gpios = <&creg_gpio 0 GPIO_ACTIVE_LOW>,
|
||||||
<&creg_gpio 1 GPIO_ACTIVE_LOW>;
|
<&creg_gpio 1 GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
|
spi-flash@0 {
|
||||||
|
compatible = "sst26wf016b", "jedec,spi-nor";
|
||||||
|
reg = <0>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
spi-max-frequency = <4000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
adc@1 {
|
||||||
|
compatible = "ti,adc108s102";
|
||||||
|
reg = <1>;
|
||||||
|
vref-supply = <®_5v0>;
|
||||||
|
spi-max-frequency = <1000000>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
creg_gpio: gpio@14b0 {
|
creg_gpio: gpio@14b0 {
|
||||||
|
|
|
@ -32,6 +32,8 @@ CONFIG_INET=y
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
# CONFIG_STANDALONE is not set
|
# CONFIG_STANDALONE is not set
|
||||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||||
|
CONFIG_MTD=y
|
||||||
|
CONFIG_MTD_SPI_NOR=y
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
|
@ -55,6 +57,8 @@ CONFIG_GPIO_SYSFS=y
|
||||||
CONFIG_GPIO_DWAPB=y
|
CONFIG_GPIO_DWAPB=y
|
||||||
CONFIG_GPIO_SNPS_CREG=y
|
CONFIG_GPIO_SNPS_CREG=y
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
CONFIG_DRM=y
|
CONFIG_DRM=y
|
||||||
# CONFIG_DRM_FBDEV_EMULATION is not set
|
# CONFIG_DRM_FBDEV_EMULATION is not set
|
||||||
CONFIG_DRM_UDL=y
|
CONFIG_DRM_UDL=y
|
||||||
|
@ -72,6 +76,8 @@ CONFIG_MMC_SDHCI_PLTFM=y
|
||||||
CONFIG_MMC_DW=y
|
CONFIG_MMC_DW=y
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
CONFIG_DW_AXI_DMAC=y
|
CONFIG_DW_AXI_DMAC=y
|
||||||
|
CONFIG_IIO=y
|
||||||
|
CONFIG_TI_ADC108S102=y
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_VFAT_FS=y
|
CONFIG_VFAT_FS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
|
|
|
@ -614,8 +614,8 @@ static int arc_pmu_device_probe(struct platform_device *pdev)
|
||||||
/* loop thru all available h/w condition indexes */
|
/* loop thru all available h/w condition indexes */
|
||||||
for (i = 0; i < cc_bcr.c; i++) {
|
for (i = 0; i < cc_bcr.c; i++) {
|
||||||
write_aux_reg(ARC_REG_CC_INDEX, i);
|
write_aux_reg(ARC_REG_CC_INDEX, i);
|
||||||
cc_name.indiv.word0 = read_aux_reg(ARC_REG_CC_NAME0);
|
cc_name.indiv.word0 = le32_to_cpu(read_aux_reg(ARC_REG_CC_NAME0));
|
||||||
cc_name.indiv.word1 = read_aux_reg(ARC_REG_CC_NAME1);
|
cc_name.indiv.word1 = le32_to_cpu(read_aux_reg(ARC_REG_CC_NAME1));
|
||||||
|
|
||||||
arc_pmu_map_hw_event(i, cc_name.str);
|
arc_pmu_map_hw_event(i, cc_name.str);
|
||||||
arc_pmu_add_raw_event_attr(i, cc_name.str);
|
arc_pmu_add_raw_event_attr(i, cc_name.str);
|
||||||
|
|
|
@ -79,6 +79,7 @@
|
||||||
#define CAVIUM_CPU_PART_THUNDERX_83XX 0x0A3
|
#define CAVIUM_CPU_PART_THUNDERX_83XX 0x0A3
|
||||||
#define CAVIUM_CPU_PART_THUNDERX2 0x0AF
|
#define CAVIUM_CPU_PART_THUNDERX2 0x0AF
|
||||||
|
|
||||||
|
#define BRCM_CPU_PART_BRAHMA_B53 0x100
|
||||||
#define BRCM_CPU_PART_VULCAN 0x516
|
#define BRCM_CPU_PART_VULCAN 0x516
|
||||||
|
|
||||||
#define QCOM_CPU_PART_FALKOR_V1 0x800
|
#define QCOM_CPU_PART_FALKOR_V1 0x800
|
||||||
|
@ -105,6 +106,7 @@
|
||||||
#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
|
#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
|
||||||
#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
|
#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
|
||||||
#define MIDR_CAVIUM_THUNDERX2 MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX2)
|
#define MIDR_CAVIUM_THUNDERX2 MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX2)
|
||||||
|
#define MIDR_BRAHMA_B53 MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_BRAHMA_B53)
|
||||||
#define MIDR_BRCM_VULCAN MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN)
|
#define MIDR_BRCM_VULCAN MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN)
|
||||||
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
|
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
|
||||||
#define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
|
#define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
|
||||||
|
|
|
@ -32,11 +32,11 @@
|
||||||
#define PROT_DEFAULT (_PROT_DEFAULT | PTE_MAYBE_NG)
|
#define PROT_DEFAULT (_PROT_DEFAULT | PTE_MAYBE_NG)
|
||||||
#define PROT_SECT_DEFAULT (_PROT_SECT_DEFAULT | PMD_MAYBE_NG)
|
#define PROT_SECT_DEFAULT (_PROT_SECT_DEFAULT | PMD_MAYBE_NG)
|
||||||
|
|
||||||
#define PROT_DEVICE_nGnRnE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRnE))
|
#define PROT_DEVICE_nGnRnE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRnE))
|
||||||
#define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRE))
|
#define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRE))
|
||||||
#define PROT_NORMAL_NC (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_NC))
|
#define PROT_NORMAL_NC (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_NC))
|
||||||
#define PROT_NORMAL_WT (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_WT))
|
#define PROT_NORMAL_WT (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_WT))
|
||||||
#define PROT_NORMAL (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL))
|
#define PROT_NORMAL (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL))
|
||||||
|
|
||||||
#define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE))
|
#define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE))
|
||||||
#define PROT_SECT_NORMAL (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
|
#define PROT_SECT_NORMAL (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
|
||||||
|
@ -80,8 +80,9 @@
|
||||||
#define PAGE_S2_DEVICE __pgprot(_PROT_DEFAULT | PAGE_S2_MEMATTR(DEVICE_nGnRE) | PTE_S2_RDONLY | PTE_S2_XN)
|
#define PAGE_S2_DEVICE __pgprot(_PROT_DEFAULT | PAGE_S2_MEMATTR(DEVICE_nGnRE) | PTE_S2_RDONLY | PTE_S2_XN)
|
||||||
|
|
||||||
#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_VALID) | PTE_PROT_NONE | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
|
#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_VALID) | PTE_PROT_NONE | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
|
||||||
#define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
|
/* shared+writable pages are clean by default, hence PTE_RDONLY|PTE_WRITE */
|
||||||
#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE)
|
#define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
|
||||||
|
#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_WRITE)
|
||||||
#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
|
#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
|
||||||
#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN)
|
#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN)
|
||||||
#define PAGE_EXECONLY __pgprot(_PAGE_DEFAULT | PTE_RDONLY | PTE_NG | PTE_PXN)
|
#define PAGE_EXECONLY __pgprot(_PAGE_DEFAULT | PTE_RDONLY | PTE_NG | PTE_PXN)
|
||||||
|
|
|
@ -489,6 +489,7 @@ static const struct midr_range arm64_ssb_cpus[] = {
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A35),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A35),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A53),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A53),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A55),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A55),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_BRAHMA_B53),
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -573,6 +574,7 @@ static const struct midr_range spectre_v2_safe_list[] = {
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A35),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A35),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A53),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A53),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A55),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A55),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_BRAHMA_B53),
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -659,17 +661,23 @@ static const struct midr_range arm64_harden_el2_vectors[] = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
|
#ifdef CONFIG_ARM64_WORKAROUND_REPEAT_TLBI
|
||||||
|
static const struct arm64_cpu_capabilities arm64_repeat_tlbi_list[] = {
|
||||||
static const struct midr_range arm64_repeat_tlbi_cpus[] = {
|
|
||||||
#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1009
|
#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1009
|
||||||
MIDR_RANGE(MIDR_QCOM_FALKOR_V1, 0, 0, 0, 0),
|
{
|
||||||
|
ERRATA_MIDR_REV(MIDR_QCOM_FALKOR_V1, 0, 0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.midr_range.model = MIDR_QCOM_KRYO,
|
||||||
|
.matches = is_kryo_midr,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_1286807
|
#ifdef CONFIG_ARM64_ERRATUM_1286807
|
||||||
MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0),
|
{
|
||||||
|
ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0),
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CAVIUM_ERRATUM_27456
|
#ifdef CONFIG_CAVIUM_ERRATUM_27456
|
||||||
|
@ -737,6 +745,33 @@ static const struct midr_range erratum_1418040_list[] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_845719
|
||||||
|
static const struct midr_range erratum_845719_list[] = {
|
||||||
|
/* Cortex-A53 r0p[01234] */
|
||||||
|
MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
|
||||||
|
/* Brahma-B53 r0p[0] */
|
||||||
|
MIDR_REV(MIDR_BRAHMA_B53, 0, 0),
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_843419
|
||||||
|
static const struct arm64_cpu_capabilities erratum_843419_list[] = {
|
||||||
|
{
|
||||||
|
/* Cortex-A53 r0p[01234] */
|
||||||
|
.matches = is_affected_midr_range,
|
||||||
|
ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
|
||||||
|
MIDR_FIXED(0x4, BIT(8)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* Brahma-B53 r0p[0] */
|
||||||
|
.matches = is_affected_midr_range,
|
||||||
|
ERRATA_MIDR_REV(MIDR_BRAHMA_B53, 0, 0),
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
const struct arm64_cpu_capabilities arm64_errata[] = {
|
const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
#ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
|
#ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
|
||||||
{
|
{
|
||||||
|
@ -768,19 +803,18 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_843419
|
#ifdef CONFIG_ARM64_ERRATUM_843419
|
||||||
{
|
{
|
||||||
/* Cortex-A53 r0p[01234] */
|
|
||||||
.desc = "ARM erratum 843419",
|
.desc = "ARM erratum 843419",
|
||||||
.capability = ARM64_WORKAROUND_843419,
|
.capability = ARM64_WORKAROUND_843419,
|
||||||
ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
|
||||||
MIDR_FIXED(0x4, BIT(8)),
|
.matches = cpucap_multi_entry_cap_matches,
|
||||||
|
.match_list = erratum_843419_list,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_845719
|
#ifdef CONFIG_ARM64_ERRATUM_845719
|
||||||
{
|
{
|
||||||
/* Cortex-A53 r0p[01234] */
|
|
||||||
.desc = "ARM erratum 845719",
|
.desc = "ARM erratum 845719",
|
||||||
.capability = ARM64_WORKAROUND_845719,
|
.capability = ARM64_WORKAROUND_845719,
|
||||||
ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
|
ERRATA_MIDR_RANGE_LIST(erratum_845719_list),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CAVIUM_ERRATUM_23154
|
#ifdef CONFIG_CAVIUM_ERRATUM_23154
|
||||||
|
@ -816,6 +850,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
{
|
{
|
||||||
.desc = "Qualcomm Technologies Falkor/Kryo erratum 1003",
|
.desc = "Qualcomm Technologies Falkor/Kryo erratum 1003",
|
||||||
.capability = ARM64_WORKAROUND_QCOM_FALKOR_E1003,
|
.capability = ARM64_WORKAROUND_QCOM_FALKOR_E1003,
|
||||||
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
|
||||||
.matches = cpucap_multi_entry_cap_matches,
|
.matches = cpucap_multi_entry_cap_matches,
|
||||||
.match_list = qcom_erratum_1003_list,
|
.match_list = qcom_erratum_1003_list,
|
||||||
},
|
},
|
||||||
|
@ -824,7 +859,9 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||||
{
|
{
|
||||||
.desc = "Qualcomm erratum 1009, ARM erratum 1286807",
|
.desc = "Qualcomm erratum 1009, ARM erratum 1286807",
|
||||||
.capability = ARM64_WORKAROUND_REPEAT_TLBI,
|
.capability = ARM64_WORKAROUND_REPEAT_TLBI,
|
||||||
ERRATA_MIDR_RANGE_LIST(arm64_repeat_tlbi_cpus),
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
|
||||||
|
.matches = cpucap_multi_entry_cap_matches,
|
||||||
|
.match_list = arm64_repeat_tlbi_list,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_858921
|
#ifdef CONFIG_ARM64_ERRATUM_858921
|
||||||
|
|
|
@ -2125,7 +2125,7 @@ ftrace_regs_caller:
|
||||||
copy %rp, %r26
|
copy %rp, %r26
|
||||||
LDREG -FTRACE_FRAME_SIZE-PT_SZ_ALGN(%sp), %r25
|
LDREG -FTRACE_FRAME_SIZE-PT_SZ_ALGN(%sp), %r25
|
||||||
ldo -8(%r25), %r25
|
ldo -8(%r25), %r25
|
||||||
copy %r3, %arg2
|
ldo -FTRACE_FRAME_SIZE(%r1), %arg2
|
||||||
b,l ftrace_function_trampoline, %rp
|
b,l ftrace_function_trampoline, %rp
|
||||||
copy %r1, %arg3 /* struct pt_regs */
|
copy %r1, %arg3 /* struct pt_regs */
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,7 @@
|
||||||
|
|
||||||
static inline void kuap_update_sr(u32 sr, u32 addr, u32 end)
|
static inline void kuap_update_sr(u32 sr, u32 addr, u32 end)
|
||||||
{
|
{
|
||||||
|
addr &= 0xf0000000; /* align addr to start of segment */
|
||||||
barrier(); /* make sure thread.kuap is updated before playing with SRs */
|
barrier(); /* make sure thread.kuap is updated before playing with SRs */
|
||||||
while (addr < end) {
|
while (addr < end) {
|
||||||
mtsrin(sr, addr);
|
mtsrin(sr, addr);
|
||||||
|
|
|
@ -175,4 +175,7 @@ do { \
|
||||||
ARCH_DLINFO_CACHE_GEOMETRY; \
|
ARCH_DLINFO_CACHE_GEOMETRY; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/* Relocate the kernel image to @final_address */
|
||||||
|
void relocate(unsigned long final_address);
|
||||||
|
|
||||||
#endif /* _ASM_POWERPC_ELF_H */
|
#endif /* _ASM_POWERPC_ELF_H */
|
||||||
|
|
|
@ -3249,7 +3249,20 @@ static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
|
||||||
/* Switch to secure mode. */
|
/* Switch to secure mode. */
|
||||||
prom_printf("Switching to secure mode.\n");
|
prom_printf("Switching to secure mode.\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The ultravisor will do an integrity check of the kernel image but we
|
||||||
|
* relocated it so the check will fail. Restore the original image by
|
||||||
|
* relocating it back to the kernel virtual base address.
|
||||||
|
*/
|
||||||
|
if (IS_ENABLED(CONFIG_RELOCATABLE))
|
||||||
|
relocate(KERNELBASE);
|
||||||
|
|
||||||
ret = enter_secure_mode(kbase, fdt);
|
ret = enter_secure_mode(kbase, fdt);
|
||||||
|
|
||||||
|
/* Relocate the kernel again. */
|
||||||
|
if (IS_ENABLED(CONFIG_RELOCATABLE))
|
||||||
|
relocate(kbase);
|
||||||
|
|
||||||
if (ret != U_SUCCESS) {
|
if (ret != U_SUCCESS) {
|
||||||
prom_printf("Returned %d from switching to secure mode.\n", ret);
|
prom_printf("Returned %d from switching to secure mode.\n", ret);
|
||||||
prom_rtas_os_term("Switch to secure mode failed.\n");
|
prom_rtas_os_term("Switch to secure mode failed.\n");
|
||||||
|
|
|
@ -26,7 +26,8 @@ _end enter_prom $MEM_FUNCS reloc_offset __secondary_hold
|
||||||
__secondary_hold_acknowledge __secondary_hold_spinloop __start
|
__secondary_hold_acknowledge __secondary_hold_spinloop __start
|
||||||
logo_linux_clut224 btext_prepare_BAT
|
logo_linux_clut224 btext_prepare_BAT
|
||||||
reloc_got2 kernstart_addr memstart_addr linux_banner _stext
|
reloc_got2 kernstart_addr memstart_addr linux_banner _stext
|
||||||
__prom_init_toc_start __prom_init_toc_end btext_setup_display TOC."
|
__prom_init_toc_start __prom_init_toc_end btext_setup_display TOC.
|
||||||
|
relocate"
|
||||||
|
|
||||||
NM="$1"
|
NM="$1"
|
||||||
OBJ="$2"
|
OBJ="$2"
|
||||||
|
|
|
@ -42,7 +42,7 @@ void pnv_pcibios_bus_add_device(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct pci_dn *pdn = pci_get_pdn(pdev);
|
struct pci_dn *pdn = pci_get_pdn(pdev);
|
||||||
|
|
||||||
if (eeh_has_flag(EEH_FORCE_DISABLED))
|
if (!pdn || eeh_has_flag(EEH_FORCE_DISABLED))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dev_dbg(&pdev->dev, "EEH: Setting up device\n");
|
dev_dbg(&pdev->dev, "EEH: Setting up device\n");
|
||||||
|
|
|
@ -146,20 +146,25 @@ static int pnv_smp_cpu_disable(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pnv_flush_interrupts(void)
|
||||||
|
{
|
||||||
|
if (cpu_has_feature(CPU_FTR_ARCH_300)) {
|
||||||
|
if (xive_enabled())
|
||||||
|
xive_flush_interrupt();
|
||||||
|
else
|
||||||
|
icp_opal_flush_interrupt();
|
||||||
|
} else {
|
||||||
|
icp_native_flush_interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void pnv_smp_cpu_kill_self(void)
|
static void pnv_smp_cpu_kill_self(void)
|
||||||
{
|
{
|
||||||
|
unsigned long srr1, unexpected_mask, wmask;
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
unsigned long srr1, wmask;
|
|
||||||
u64 lpcr_val;
|
u64 lpcr_val;
|
||||||
|
|
||||||
/* Standard hot unplug procedure */
|
/* Standard hot unplug procedure */
|
||||||
/*
|
|
||||||
* This hard disables local interurpts, ensuring we have no lazy
|
|
||||||
* irqs pending.
|
|
||||||
*/
|
|
||||||
WARN_ON(irqs_disabled());
|
|
||||||
hard_irq_disable();
|
|
||||||
WARN_ON(lazy_irq_pending());
|
|
||||||
|
|
||||||
idle_task_exit();
|
idle_task_exit();
|
||||||
current->active_mm = NULL; /* for sanity */
|
current->active_mm = NULL; /* for sanity */
|
||||||
|
@ -172,6 +177,27 @@ static void pnv_smp_cpu_kill_self(void)
|
||||||
if (cpu_has_feature(CPU_FTR_ARCH_207S))
|
if (cpu_has_feature(CPU_FTR_ARCH_207S))
|
||||||
wmask = SRR1_WAKEMASK_P8;
|
wmask = SRR1_WAKEMASK_P8;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This turns the irq soft-disabled state we're called with, into a
|
||||||
|
* hard-disabled state with pending irq_happened interrupts cleared.
|
||||||
|
*
|
||||||
|
* PACA_IRQ_DEC - Decrementer should be ignored.
|
||||||
|
* PACA_IRQ_HMI - Can be ignored, processing is done in real mode.
|
||||||
|
* PACA_IRQ_DBELL, EE, PMI - Unexpected.
|
||||||
|
*/
|
||||||
|
hard_irq_disable();
|
||||||
|
if (generic_check_cpu_restart(cpu))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
unexpected_mask = ~(PACA_IRQ_DEC | PACA_IRQ_HMI | PACA_IRQ_HARD_DIS);
|
||||||
|
if (local_paca->irq_happened & unexpected_mask) {
|
||||||
|
if (local_paca->irq_happened & PACA_IRQ_EE)
|
||||||
|
pnv_flush_interrupts();
|
||||||
|
DBG("CPU%d Unexpected exit while offline irq_happened=%lx!\n",
|
||||||
|
cpu, local_paca->irq_happened);
|
||||||
|
}
|
||||||
|
local_paca->irq_happened = PACA_IRQ_HARD_DIS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We don't want to take decrementer interrupts while we are
|
* We don't want to take decrementer interrupts while we are
|
||||||
* offline, so clear LPCR:PECE1. We keep PECE2 (and
|
* offline, so clear LPCR:PECE1. We keep PECE2 (and
|
||||||
|
@ -197,6 +223,7 @@ static void pnv_smp_cpu_kill_self(void)
|
||||||
|
|
||||||
srr1 = pnv_cpu_offline(cpu);
|
srr1 = pnv_cpu_offline(cpu);
|
||||||
|
|
||||||
|
WARN_ON_ONCE(!irqs_disabled());
|
||||||
WARN_ON(lazy_irq_pending());
|
WARN_ON(lazy_irq_pending());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -212,13 +239,7 @@ static void pnv_smp_cpu_kill_self(void)
|
||||||
*/
|
*/
|
||||||
if (((srr1 & wmask) == SRR1_WAKEEE) ||
|
if (((srr1 & wmask) == SRR1_WAKEEE) ||
|
||||||
((srr1 & wmask) == SRR1_WAKEHVI)) {
|
((srr1 & wmask) == SRR1_WAKEHVI)) {
|
||||||
if (cpu_has_feature(CPU_FTR_ARCH_300)) {
|
pnv_flush_interrupts();
|
||||||
if (xive_enabled())
|
|
||||||
xive_flush_interrupt();
|
|
||||||
else
|
|
||||||
icp_opal_flush_interrupt();
|
|
||||||
} else
|
|
||||||
icp_native_flush_interrupt();
|
|
||||||
} else if ((srr1 & wmask) == SRR1_WAKEHDBELL) {
|
} else if ((srr1 & wmask) == SRR1_WAKEHDBELL) {
|
||||||
unsigned long msg = PPC_DBELL_TYPE(PPC_DBELL_SERVER);
|
unsigned long msg = PPC_DBELL_TYPE(PPC_DBELL_SERVER);
|
||||||
asm volatile(PPC_MSGCLR(%0) : : "r" (msg));
|
asm volatile(PPC_MSGCLR(%0) : : "r" (msg));
|
||||||
|
@ -266,7 +287,7 @@ static void pnv_smp_cpu_kill_self(void)
|
||||||
*/
|
*/
|
||||||
lpcr_val = mfspr(SPRN_LPCR) | (u64)LPCR_PECE1;
|
lpcr_val = mfspr(SPRN_LPCR) | (u64)LPCR_PECE1;
|
||||||
pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val);
|
pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val);
|
||||||
|
out:
|
||||||
DBG("CPU%d coming online...\n", cpu);
|
DBG("CPU%d coming online...\n", cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/mmiowb.h>
|
#include <asm/mmiowb.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
extern void __iomem *ioremap(phys_addr_t offset, unsigned long size);
|
extern void __iomem *ioremap(phys_addr_t offset, unsigned long size);
|
||||||
|
|
||||||
|
@ -161,6 +162,12 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
|
||||||
#define writeq(v,c) ({ __io_bw(); writeq_cpu((v),(c)); __io_aw(); })
|
#define writeq(v,c) ({ __io_bw(); writeq_cpu((v),(c)); __io_aw(); })
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I/O port access constants.
|
||||||
|
*/
|
||||||
|
#define IO_SPACE_LIMIT (PCI_IO_SIZE - 1)
|
||||||
|
#define PCI_IOBASE ((void __iomem *)PCI_IO_START)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Emulation routines for the port-mapped IO space used by some PCI drivers.
|
* Emulation routines for the port-mapped IO space used by some PCI drivers.
|
||||||
* These are defined as being "fully synchronous", but also "not guaranteed to
|
* These are defined as being "fully synchronous", but also "not guaranteed to
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
#ifndef _ASM_RISCV_IRQ_H
|
#ifndef _ASM_RISCV_IRQ_H
|
||||||
#define _ASM_RISCV_IRQ_H
|
#define _ASM_RISCV_IRQ_H
|
||||||
|
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#define NR_IRQS 0
|
#define NR_IRQS 0
|
||||||
|
|
||||||
void riscv_timer_interrupt(void);
|
void riscv_timer_interrupt(void);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#define _ASM_RISCV_PGTABLE_H
|
#define _ASM_RISCV_PGTABLE_H
|
||||||
|
|
||||||
#include <linux/mmzone.h>
|
#include <linux/mmzone.h>
|
||||||
|
#include <linux/sizes.h>
|
||||||
|
|
||||||
#include <asm/pgtable-bits.h>
|
#include <asm/pgtable-bits.h>
|
||||||
|
|
||||||
|
@ -86,6 +87,7 @@ extern pgd_t swapper_pg_dir[];
|
||||||
#define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1)
|
#define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1)
|
||||||
#define VMALLOC_END (PAGE_OFFSET - 1)
|
#define VMALLOC_END (PAGE_OFFSET - 1)
|
||||||
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
|
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
|
||||||
|
#define PCI_IO_SIZE SZ_16M
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Roughly size the vmemmap space to be large enough to fit enough
|
* Roughly size the vmemmap space to be large enough to fit enough
|
||||||
|
@ -100,7 +102,10 @@ extern pgd_t swapper_pg_dir[];
|
||||||
|
|
||||||
#define vmemmap ((struct page *)VMEMMAP_START)
|
#define vmemmap ((struct page *)VMEMMAP_START)
|
||||||
|
|
||||||
#define FIXADDR_TOP (VMEMMAP_START)
|
#define PCI_IO_END VMEMMAP_START
|
||||||
|
#define PCI_IO_START (PCI_IO_END - PCI_IO_SIZE)
|
||||||
|
#define FIXADDR_TOP PCI_IO_START
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
#define FIXADDR_SIZE PMD_SIZE
|
#define FIXADDR_SIZE PMD_SIZE
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#ifndef _ASM_RISCV_SWITCH_TO_H
|
#ifndef _ASM_RISCV_SWITCH_TO_H
|
||||||
#define _ASM_RISCV_SWITCH_TO_H
|
#define _ASM_RISCV_SWITCH_TO_H
|
||||||
|
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/csr.h>
|
#include <asm/csr.h>
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/hwcap.h>
|
#include <asm/hwcap.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
|
#include <asm/switch_to.h>
|
||||||
|
|
||||||
unsigned long elf_hwcap __read_mostly;
|
unsigned long elf_hwcap __read_mostly;
|
||||||
#ifdef CONFIG_FPU
|
#ifdef CONFIG_FPU
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019 SiFive, Inc.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_HEAD_H
|
||||||
|
#define __ASM_HEAD_H
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
|
||||||
|
extern atomic_t hart_lottery;
|
||||||
|
|
||||||
|
asmlinkage void do_page_fault(struct pt_regs *regs);
|
||||||
|
asmlinkage void __init setup_vm(uintptr_t dtb_pa);
|
||||||
|
|
||||||
|
extern void *__cpu_up_stack_pointer[];
|
||||||
|
extern void *__cpu_up_task_pointer[];
|
||||||
|
|
||||||
|
void __init parse_dtb(void);
|
||||||
|
|
||||||
|
#endif /* __ASM_HEAD_H */
|
|
@ -24,7 +24,7 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void __irq_entry do_IRQ(struct pt_regs *regs)
|
asmlinkage __visible void __irq_entry do_IRQ(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/moduleloader.h>
|
||||||
|
|
||||||
unsigned long module_emit_got_entry(struct module *mod, unsigned long val)
|
unsigned long module_emit_got_entry(struct module *mod, unsigned long val)
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
* Copyright (C) 2017 SiFive
|
* Copyright (C) 2017 SiFive
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/cpu.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/task_stack.h>
|
#include <linux/sched/task_stack.h>
|
||||||
|
@ -19,6 +20,7 @@
|
||||||
#include <asm/csr.h>
|
#include <asm/csr.h>
|
||||||
#include <asm/string.h>
|
#include <asm/string.h>
|
||||||
#include <asm/switch_to.h>
|
#include <asm/switch_to.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
extern asmlinkage void ret_from_fork(void);
|
extern asmlinkage void ret_from_fork(void);
|
||||||
extern asmlinkage void ret_from_kernel_thread(void);
|
extern asmlinkage void ret_from_kernel_thread(void);
|
||||||
|
|
|
@ -148,7 +148,7 @@ long arch_ptrace(struct task_struct *child, long request,
|
||||||
* Allows PTRACE_SYSCALL to work. These are called from entry.S in
|
* Allows PTRACE_SYSCALL to work. These are called from entry.S in
|
||||||
* {handle,ret_from}_syscall.
|
* {handle,ret_from}_syscall.
|
||||||
*/
|
*/
|
||||||
void do_syscall_trace_enter(struct pt_regs *regs)
|
__visible void do_syscall_trace_enter(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
||||||
if (tracehook_report_syscall_entry(regs))
|
if (tracehook_report_syscall_entry(regs))
|
||||||
|
@ -162,7 +162,7 @@ void do_syscall_trace_enter(struct pt_regs *regs)
|
||||||
audit_syscall_entry(regs->a7, regs->a0, regs->a1, regs->a2, regs->a3);
|
audit_syscall_entry(regs->a7, regs->a0, regs->a1, regs->a2, regs->a3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_syscall_trace_exit(struct pt_regs *regs)
|
__visible void do_syscall_trace_exit(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
audit_syscall_exit(regs);
|
audit_syscall_exit(regs);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
|
#include <linux/pm.h>
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
|
|
||||||
static void default_power_off(void)
|
static void default_power_off(void)
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
|
#include "head.h"
|
||||||
|
|
||||||
#ifdef CONFIG_DUMMY_CONSOLE
|
#ifdef CONFIG_DUMMY_CONSOLE
|
||||||
struct screen_info screen_info = {
|
struct screen_info screen_info = {
|
||||||
.orig_video_lines = 30,
|
.orig_video_lines = 30,
|
||||||
|
|
|
@ -26,7 +26,7 @@ struct rt_sigframe {
|
||||||
|
|
||||||
#ifdef CONFIG_FPU
|
#ifdef CONFIG_FPU
|
||||||
static long restore_fp_state(struct pt_regs *regs,
|
static long restore_fp_state(struct pt_regs *regs,
|
||||||
union __riscv_fp_state *sc_fpregs)
|
union __riscv_fp_state __user *sc_fpregs)
|
||||||
{
|
{
|
||||||
long err;
|
long err;
|
||||||
struct __riscv_d_ext_state __user *state = &sc_fpregs->d;
|
struct __riscv_d_ext_state __user *state = &sc_fpregs->d;
|
||||||
|
@ -53,7 +53,7 @@ static long restore_fp_state(struct pt_regs *regs,
|
||||||
}
|
}
|
||||||
|
|
||||||
static long save_fp_state(struct pt_regs *regs,
|
static long save_fp_state(struct pt_regs *regs,
|
||||||
union __riscv_fp_state *sc_fpregs)
|
union __riscv_fp_state __user *sc_fpregs)
|
||||||
{
|
{
|
||||||
long err;
|
long err;
|
||||||
struct __riscv_d_ext_state __user *state = &sc_fpregs->d;
|
struct __riscv_d_ext_state __user *state = &sc_fpregs->d;
|
||||||
|
@ -292,8 +292,8 @@ static void do_signal(struct pt_regs *regs)
|
||||||
* notification of userspace execution resumption
|
* notification of userspace execution resumption
|
||||||
* - triggered by the _TIF_WORK_MASK flags
|
* - triggered by the _TIF_WORK_MASK flags
|
||||||
*/
|
*/
|
||||||
asmlinkage void do_notify_resume(struct pt_regs *regs,
|
asmlinkage __visible void do_notify_resume(struct pt_regs *regs,
|
||||||
unsigned long thread_info_flags)
|
unsigned long thread_info_flags)
|
||||||
{
|
{
|
||||||
/* Handle pending signal delivery */
|
/* Handle pending signal delivery */
|
||||||
if (thread_info_flags & _TIF_SIGPENDING)
|
if (thread_info_flags & _TIF_SIGPENDING)
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
* Copyright (C) 2017 SiFive
|
* Copyright (C) 2017 SiFive
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/cpu.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/profile.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
|
|
@ -29,6 +29,9 @@
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
|
#include <asm/smp.h>
|
||||||
|
|
||||||
|
#include "head.h"
|
||||||
|
|
||||||
void *__cpu_up_stack_pointer[NR_CPUS];
|
void *__cpu_up_stack_pointer[NR_CPUS];
|
||||||
void *__cpu_up_task_pointer[NR_CPUS];
|
void *__cpu_up_task_pointer[NR_CPUS];
|
||||||
|
@ -130,7 +133,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
|
||||||
/*
|
/*
|
||||||
* C entry point for a secondary processor.
|
* C entry point for a secondary processor.
|
||||||
*/
|
*/
|
||||||
asmlinkage void __init smp_callin(void)
|
asmlinkage __visible void __init smp_callin(void)
|
||||||
{
|
{
|
||||||
struct mm_struct *mm = &init_mm;
|
struct mm_struct *mm = &init_mm;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <asm-generic/syscalls.h>
|
#include <asm-generic/syscalls.h>
|
||||||
#include <asm/vdso.h>
|
#include <asm/vdso.h>
|
||||||
|
#include <asm/syscall.h>
|
||||||
|
|
||||||
#undef __SYSCALL
|
#undef __SYSCALL
|
||||||
#define __SYSCALL(nr, call) [nr] = (call),
|
#define __SYSCALL(nr, call) [nr] = (call),
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <linux/clocksource.h>
|
#include <linux/clocksource.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
|
|
||||||
unsigned long riscv_timebase;
|
unsigned long riscv_timebase;
|
||||||
EXPORT_SYMBOL_GPL(riscv_timebase);
|
EXPORT_SYMBOL_GPL(riscv_timebase);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* Copyright (C) 2012 Regents of the University of California
|
* Copyright (C) 2012 Regents of the University of California
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/cpu.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
@ -83,7 +84,7 @@ static void do_trap_error(struct pt_regs *regs, int signo, int code,
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DO_ERROR_INFO(name, signo, code, str) \
|
#define DO_ERROR_INFO(name, signo, code, str) \
|
||||||
asmlinkage void name(struct pt_regs *regs) \
|
asmlinkage __visible void name(struct pt_regs *regs) \
|
||||||
{ \
|
{ \
|
||||||
do_trap_error(regs, signo, code, regs->sepc, "Oops - " str); \
|
do_trap_error(regs, signo, code, regs->sepc, "Oops - " str); \
|
||||||
}
|
}
|
||||||
|
@ -120,7 +121,7 @@ static inline unsigned long get_break_insn_length(unsigned long pc)
|
||||||
return (((insn & __INSN_LENGTH_MASK) == __INSN_LENGTH_32) ? 4UL : 2UL);
|
return (((insn & __INSN_LENGTH_MASK) == __INSN_LENGTH_32) ? 4UL : 2UL);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void do_trap_break(struct pt_regs *regs)
|
asmlinkage __visible void do_trap_break(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->sepc);
|
force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->sepc);
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
* Copyright (C) 2015 Regents of the University of California
|
* Copyright (C) 2015 Regents of the University of California
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/elf.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/binfmts.h>
|
#include <linux/binfmts.h>
|
||||||
|
@ -25,7 +26,7 @@ static union {
|
||||||
struct vdso_data data;
|
struct vdso_data data;
|
||||||
u8 page[PAGE_SIZE];
|
u8 page[PAGE_SIZE];
|
||||||
} vdso_data_store __page_aligned_data;
|
} vdso_data_store __page_aligned_data;
|
||||||
struct vdso_data *vdso_data = &vdso_data_store.data;
|
static struct vdso_data *vdso_data = &vdso_data_store.data;
|
||||||
|
|
||||||
static int __init vdso_init(void)
|
static int __init vdso_init(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
#include <asm/mmu_context.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When necessary, performs a deferred icache flush for the given MM context,
|
* When necessary, performs a deferred icache flush for the given MM context,
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
#include "../kernel/head.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine handles page faults. It determines the address and the
|
* This routine handles page faults. It determines the address and the
|
||||||
* problem, and then passes it off to one of the appropriate routines.
|
* problem, and then passes it off to one of the appropriate routines.
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#include "../kernel/head.h"
|
||||||
|
|
||||||
unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
|
unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
|
||||||
__page_aligned_bss;
|
__page_aligned_bss;
|
||||||
EXPORT_SYMBOL(empty_zero_page);
|
EXPORT_SYMBOL(empty_zero_page);
|
||||||
|
@ -337,8 +339,7 @@ static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __riscv_cmodel_medany
|
#ifndef __riscv_cmodel_medany
|
||||||
#error "setup_vm() is called from head.S before relocate so it should "
|
#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing."
|
||||||
"not use absolute addressing."
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
asmlinkage void __init setup_vm(uintptr_t dtb_pa)
|
asmlinkage void __init setup_vm(uintptr_t dtb_pa)
|
||||||
|
|
|
@ -142,7 +142,7 @@ static irqreturn_t l2_int_handler(int irq, void *device)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init sifive_l2_init(void)
|
static int __init sifive_l2_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
struct resource res;
|
struct resource res;
|
||||||
|
|
|
@ -35,6 +35,7 @@ struct unwind_state {
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
struct pt_regs *regs;
|
struct pt_regs *regs;
|
||||||
unsigned long sp, ip;
|
unsigned long sp, ip;
|
||||||
|
bool reuse_sp;
|
||||||
int graph_idx;
|
int graph_idx;
|
||||||
bool reliable;
|
bool reliable;
|
||||||
bool error;
|
bool error;
|
||||||
|
|
|
@ -69,18 +69,26 @@ DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL);
|
||||||
static ssize_t show_idle_time(struct device *dev,
|
static ssize_t show_idle_time(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
|
unsigned long long now, idle_time, idle_enter, idle_exit, in_idle;
|
||||||
struct s390_idle_data *idle = &per_cpu(s390_idle, dev->id);
|
struct s390_idle_data *idle = &per_cpu(s390_idle, dev->id);
|
||||||
unsigned long long now, idle_time, idle_enter, idle_exit;
|
|
||||||
unsigned int seq;
|
unsigned int seq;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
now = get_tod_clock();
|
|
||||||
seq = read_seqcount_begin(&idle->seqcount);
|
seq = read_seqcount_begin(&idle->seqcount);
|
||||||
idle_time = READ_ONCE(idle->idle_time);
|
idle_time = READ_ONCE(idle->idle_time);
|
||||||
idle_enter = READ_ONCE(idle->clock_idle_enter);
|
idle_enter = READ_ONCE(idle->clock_idle_enter);
|
||||||
idle_exit = READ_ONCE(idle->clock_idle_exit);
|
idle_exit = READ_ONCE(idle->clock_idle_exit);
|
||||||
} while (read_seqcount_retry(&idle->seqcount, seq));
|
} while (read_seqcount_retry(&idle->seqcount, seq));
|
||||||
idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0;
|
in_idle = 0;
|
||||||
|
now = get_tod_clock();
|
||||||
|
if (idle_enter) {
|
||||||
|
if (idle_exit) {
|
||||||
|
in_idle = idle_exit - idle_enter;
|
||||||
|
} else if (now > idle_enter) {
|
||||||
|
in_idle = now - idle_enter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idle_time += in_idle;
|
||||||
return sprintf(buf, "%llu\n", idle_time >> 12);
|
return sprintf(buf, "%llu\n", idle_time >> 12);
|
||||||
}
|
}
|
||||||
DEVICE_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
DEVICE_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
||||||
|
@ -88,17 +96,24 @@ DEVICE_ATTR(idle_time_us, 0444, show_idle_time, NULL);
|
||||||
u64 arch_cpu_idle_time(int cpu)
|
u64 arch_cpu_idle_time(int cpu)
|
||||||
{
|
{
|
||||||
struct s390_idle_data *idle = &per_cpu(s390_idle, cpu);
|
struct s390_idle_data *idle = &per_cpu(s390_idle, cpu);
|
||||||
unsigned long long now, idle_enter, idle_exit;
|
unsigned long long now, idle_enter, idle_exit, in_idle;
|
||||||
unsigned int seq;
|
unsigned int seq;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
now = get_tod_clock();
|
|
||||||
seq = read_seqcount_begin(&idle->seqcount);
|
seq = read_seqcount_begin(&idle->seqcount);
|
||||||
idle_enter = READ_ONCE(idle->clock_idle_enter);
|
idle_enter = READ_ONCE(idle->clock_idle_enter);
|
||||||
idle_exit = READ_ONCE(idle->clock_idle_exit);
|
idle_exit = READ_ONCE(idle->clock_idle_exit);
|
||||||
} while (read_seqcount_retry(&idle->seqcount, seq));
|
} while (read_seqcount_retry(&idle->seqcount, seq));
|
||||||
|
in_idle = 0;
|
||||||
return cputime_to_nsecs(idle_enter ? ((idle_exit ?: now) - idle_enter) : 0);
|
now = get_tod_clock();
|
||||||
|
if (idle_enter) {
|
||||||
|
if (idle_exit) {
|
||||||
|
in_idle = idle_exit - idle_enter;
|
||||||
|
} else if (now > idle_enter) {
|
||||||
|
in_idle = now - idle_enter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cputime_to_nsecs(in_idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_cpu_idle_enter(void)
|
void arch_cpu_idle_enter(void)
|
||||||
|
|
|
@ -46,10 +46,15 @@ bool unwind_next_frame(struct unwind_state *state)
|
||||||
|
|
||||||
regs = state->regs;
|
regs = state->regs;
|
||||||
if (unlikely(regs)) {
|
if (unlikely(regs)) {
|
||||||
sp = READ_ONCE_NOCHECK(regs->gprs[15]);
|
if (state->reuse_sp) {
|
||||||
if (unlikely(outside_of_stack(state, sp))) {
|
sp = state->sp;
|
||||||
if (!update_stack_info(state, sp))
|
state->reuse_sp = false;
|
||||||
goto out_err;
|
} else {
|
||||||
|
sp = READ_ONCE_NOCHECK(regs->gprs[15]);
|
||||||
|
if (unlikely(outside_of_stack(state, sp))) {
|
||||||
|
if (!update_stack_info(state, sp))
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sf = (struct stack_frame *) sp;
|
sf = (struct stack_frame *) sp;
|
||||||
ip = READ_ONCE_NOCHECK(sf->gprs[8]);
|
ip = READ_ONCE_NOCHECK(sf->gprs[8]);
|
||||||
|
@ -107,9 +112,9 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||||
{
|
{
|
||||||
struct stack_info *info = &state->stack_info;
|
struct stack_info *info = &state->stack_info;
|
||||||
unsigned long *mask = &state->stack_mask;
|
unsigned long *mask = &state->stack_mask;
|
||||||
|
bool reliable, reuse_sp;
|
||||||
struct stack_frame *sf;
|
struct stack_frame *sf;
|
||||||
unsigned long ip;
|
unsigned long ip;
|
||||||
bool reliable;
|
|
||||||
|
|
||||||
memset(state, 0, sizeof(*state));
|
memset(state, 0, sizeof(*state));
|
||||||
state->task = task;
|
state->task = task;
|
||||||
|
@ -134,10 +139,12 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||||
if (regs) {
|
if (regs) {
|
||||||
ip = READ_ONCE_NOCHECK(regs->psw.addr);
|
ip = READ_ONCE_NOCHECK(regs->psw.addr);
|
||||||
reliable = true;
|
reliable = true;
|
||||||
|
reuse_sp = true;
|
||||||
} else {
|
} else {
|
||||||
sf = (struct stack_frame *) sp;
|
sf = (struct stack_frame *) sp;
|
||||||
ip = READ_ONCE_NOCHECK(sf->gprs[8]);
|
ip = READ_ONCE_NOCHECK(sf->gprs[8]);
|
||||||
reliable = false;
|
reliable = false;
|
||||||
|
reuse_sp = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
|
@ -151,5 +158,6 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||||
state->sp = sp;
|
state->sp = sp;
|
||||||
state->ip = ip;
|
state->ip = ip;
|
||||||
state->reliable = reliable;
|
state->reliable = reliable;
|
||||||
|
state->reuse_sp = reuse_sp;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__unwind_start);
|
EXPORT_SYMBOL_GPL(__unwind_start);
|
||||||
|
|
|
@ -298,16 +298,16 @@ static int cmm_timeout_handler(struct ctl_table *ctl, int write,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write) {
|
if (write) {
|
||||||
len = *lenp;
|
len = min(*lenp, sizeof(buf));
|
||||||
if (copy_from_user(buf, buffer,
|
if (copy_from_user(buf, buffer, len))
|
||||||
len > sizeof(buf) ? sizeof(buf) : len))
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
buf[len - 1] = '\0';
|
||||||
cmm_skip_blanks(buf, &p);
|
cmm_skip_blanks(buf, &p);
|
||||||
nr = simple_strtoul(p, &p, 0);
|
nr = simple_strtoul(p, &p, 0);
|
||||||
cmm_skip_blanks(p, &p);
|
cmm_skip_blanks(p, &p);
|
||||||
seconds = simple_strtoul(p, &p, 0);
|
seconds = simple_strtoul(p, &p, 0);
|
||||||
cmm_set_timeout(nr, seconds);
|
cmm_set_timeout(nr, seconds);
|
||||||
|
*ppos += *lenp;
|
||||||
} else {
|
} else {
|
||||||
len = sprintf(buf, "%ld %ld\n",
|
len = sprintf(buf, "%ld %ld\n",
|
||||||
cmm_timeout_pages, cmm_timeout_seconds);
|
cmm_timeout_pages, cmm_timeout_seconds);
|
||||||
|
@ -315,9 +315,9 @@ static int cmm_timeout_handler(struct ctl_table *ctl, int write,
|
||||||
len = *lenp;
|
len = *lenp;
|
||||||
if (copy_to_user(buffer, buf, len))
|
if (copy_to_user(buffer, buf, len))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
*lenp = len;
|
||||||
|
*ppos += len;
|
||||||
}
|
}
|
||||||
*lenp = len;
|
|
||||||
*ppos += len;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1403,8 +1403,12 @@ static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||||
|
|
||||||
spin_unlock_irq(&ubd_dev->lock);
|
spin_unlock_irq(&ubd_dev->lock);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
blk_mq_requeue_request(req, true);
|
if (ret == -ENOMEM)
|
||||||
|
res = BLK_STS_RESOURCE;
|
||||||
|
else
|
||||||
|
res = BLK_STS_DEV_RESOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <asm/e820/types.h>
|
#include <asm/e820/types.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
|
#include <asm/boot.h>
|
||||||
|
|
||||||
#include "../string.h"
|
#include "../string.h"
|
||||||
#include "eboot.h"
|
#include "eboot.h"
|
||||||
|
@ -813,7 +814,8 @@ efi_main(struct efi_config *c, struct boot_params *boot_params)
|
||||||
status = efi_relocate_kernel(sys_table, &bzimage_addr,
|
status = efi_relocate_kernel(sys_table, &bzimage_addr,
|
||||||
hdr->init_size, hdr->init_size,
|
hdr->init_size, hdr->init_size,
|
||||||
hdr->pref_address,
|
hdr->pref_address,
|
||||||
hdr->kernel_alignment);
|
hdr->kernel_alignment,
|
||||||
|
LOAD_PHYSICAL_ADDR);
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
efi_printk(sys_table, "efi_relocate_kernel() failed!\n");
|
efi_printk(sys_table, "efi_relocate_kernel() failed!\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -377,7 +377,8 @@ static inline void perf_ibs_disable_event(struct perf_ibs *perf_ibs,
|
||||||
struct hw_perf_event *hwc, u64 config)
|
struct hw_perf_event *hwc, u64 config)
|
||||||
{
|
{
|
||||||
config &= ~perf_ibs->cnt_mask;
|
config &= ~perf_ibs->cnt_mask;
|
||||||
wrmsrl(hwc->config_base, config);
|
if (boot_cpu_data.x86 == 0x10)
|
||||||
|
wrmsrl(hwc->config_base, config);
|
||||||
config &= ~perf_ibs->enable_mask;
|
config &= ~perf_ibs->enable_mask;
|
||||||
wrmsrl(hwc->config_base, config);
|
wrmsrl(hwc->config_base, config);
|
||||||
}
|
}
|
||||||
|
@ -553,7 +554,8 @@ static struct perf_ibs perf_ibs_op = {
|
||||||
},
|
},
|
||||||
.msr = MSR_AMD64_IBSOPCTL,
|
.msr = MSR_AMD64_IBSOPCTL,
|
||||||
.config_mask = IBS_OP_CONFIG_MASK,
|
.config_mask = IBS_OP_CONFIG_MASK,
|
||||||
.cnt_mask = IBS_OP_MAX_CNT,
|
.cnt_mask = IBS_OP_MAX_CNT | IBS_OP_CUR_CNT |
|
||||||
|
IBS_OP_CUR_CNT_RAND,
|
||||||
.enable_mask = IBS_OP_ENABLE,
|
.enable_mask = IBS_OP_ENABLE,
|
||||||
.valid_mask = IBS_OP_VAL,
|
.valid_mask = IBS_OP_VAL,
|
||||||
.max_period = IBS_OP_MAX_CNT << 4,
|
.max_period = IBS_OP_MAX_CNT << 4,
|
||||||
|
@ -614,7 +616,7 @@ fail:
|
||||||
if (event->attr.sample_type & PERF_SAMPLE_RAW)
|
if (event->attr.sample_type & PERF_SAMPLE_RAW)
|
||||||
offset_max = perf_ibs->offset_max;
|
offset_max = perf_ibs->offset_max;
|
||||||
else if (check_rip)
|
else if (check_rip)
|
||||||
offset_max = 2;
|
offset_max = 3;
|
||||||
else
|
else
|
||||||
offset_max = 1;
|
offset_max = 1;
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -502,10 +502,8 @@ void uncore_pmu_event_start(struct perf_event *event, int flags)
|
||||||
local64_set(&event->hw.prev_count, uncore_read_counter(box, event));
|
local64_set(&event->hw.prev_count, uncore_read_counter(box, event));
|
||||||
uncore_enable_event(box, event);
|
uncore_enable_event(box, event);
|
||||||
|
|
||||||
if (box->n_active == 1) {
|
if (box->n_active == 1)
|
||||||
uncore_enable_box(box);
|
|
||||||
uncore_pmu_start_hrtimer(box);
|
uncore_pmu_start_hrtimer(box);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uncore_pmu_event_stop(struct perf_event *event, int flags)
|
void uncore_pmu_event_stop(struct perf_event *event, int flags)
|
||||||
|
@ -529,10 +527,8 @@ void uncore_pmu_event_stop(struct perf_event *event, int flags)
|
||||||
WARN_ON_ONCE(hwc->state & PERF_HES_STOPPED);
|
WARN_ON_ONCE(hwc->state & PERF_HES_STOPPED);
|
||||||
hwc->state |= PERF_HES_STOPPED;
|
hwc->state |= PERF_HES_STOPPED;
|
||||||
|
|
||||||
if (box->n_active == 0) {
|
if (box->n_active == 0)
|
||||||
uncore_disable_box(box);
|
|
||||||
uncore_pmu_cancel_hrtimer(box);
|
uncore_pmu_cancel_hrtimer(box);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & PERF_EF_UPDATE) && !(hwc->state & PERF_HES_UPTODATE)) {
|
if ((flags & PERF_EF_UPDATE) && !(hwc->state & PERF_HES_UPTODATE)) {
|
||||||
|
@ -778,6 +774,40 @@ static int uncore_pmu_event_init(struct perf_event *event)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void uncore_pmu_enable(struct pmu *pmu)
|
||||||
|
{
|
||||||
|
struct intel_uncore_pmu *uncore_pmu;
|
||||||
|
struct intel_uncore_box *box;
|
||||||
|
|
||||||
|
uncore_pmu = container_of(pmu, struct intel_uncore_pmu, pmu);
|
||||||
|
if (!uncore_pmu)
|
||||||
|
return;
|
||||||
|
|
||||||
|
box = uncore_pmu_to_box(uncore_pmu, smp_processor_id());
|
||||||
|
if (!box)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (uncore_pmu->type->ops->enable_box)
|
||||||
|
uncore_pmu->type->ops->enable_box(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uncore_pmu_disable(struct pmu *pmu)
|
||||||
|
{
|
||||||
|
struct intel_uncore_pmu *uncore_pmu;
|
||||||
|
struct intel_uncore_box *box;
|
||||||
|
|
||||||
|
uncore_pmu = container_of(pmu, struct intel_uncore_pmu, pmu);
|
||||||
|
if (!uncore_pmu)
|
||||||
|
return;
|
||||||
|
|
||||||
|
box = uncore_pmu_to_box(uncore_pmu, smp_processor_id());
|
||||||
|
if (!box)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (uncore_pmu->type->ops->disable_box)
|
||||||
|
uncore_pmu->type->ops->disable_box(box);
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t uncore_get_attr_cpumask(struct device *dev,
|
static ssize_t uncore_get_attr_cpumask(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
|
@ -803,6 +833,8 @@ static int uncore_pmu_register(struct intel_uncore_pmu *pmu)
|
||||||
pmu->pmu = (struct pmu) {
|
pmu->pmu = (struct pmu) {
|
||||||
.attr_groups = pmu->type->attr_groups,
|
.attr_groups = pmu->type->attr_groups,
|
||||||
.task_ctx_nr = perf_invalid_context,
|
.task_ctx_nr = perf_invalid_context,
|
||||||
|
.pmu_enable = uncore_pmu_enable,
|
||||||
|
.pmu_disable = uncore_pmu_disable,
|
||||||
.event_init = uncore_pmu_event_init,
|
.event_init = uncore_pmu_event_init,
|
||||||
.add = uncore_pmu_event_add,
|
.add = uncore_pmu_event_add,
|
||||||
.del = uncore_pmu_event_del,
|
.del = uncore_pmu_event_del,
|
||||||
|
|
|
@ -441,18 +441,6 @@ static inline int uncore_freerunning_hw_config(struct intel_uncore_box *box,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void uncore_disable_box(struct intel_uncore_box *box)
|
|
||||||
{
|
|
||||||
if (box->pmu->type->ops->disable_box)
|
|
||||||
box->pmu->type->ops->disable_box(box);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uncore_enable_box(struct intel_uncore_box *box)
|
|
||||||
{
|
|
||||||
if (box->pmu->type->ops->enable_box)
|
|
||||||
box->pmu->type->ops->enable_box(box);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uncore_disable_event(struct intel_uncore_box *box,
|
static inline void uncore_disable_event(struct intel_uncore_box *box,
|
||||||
struct perf_event *event)
|
struct perf_event *event)
|
||||||
{
|
{
|
||||||
|
|
|
@ -734,8 +734,14 @@ static int get_npt_level(struct kvm_vcpu *vcpu)
|
||||||
static void svm_set_efer(struct kvm_vcpu *vcpu, u64 efer)
|
static void svm_set_efer(struct kvm_vcpu *vcpu, u64 efer)
|
||||||
{
|
{
|
||||||
vcpu->arch.efer = efer;
|
vcpu->arch.efer = efer;
|
||||||
if (!npt_enabled && !(efer & EFER_LMA))
|
|
||||||
efer &= ~EFER_LME;
|
if (!npt_enabled) {
|
||||||
|
/* Shadow paging assumes NX to be available. */
|
||||||
|
efer |= EFER_NX;
|
||||||
|
|
||||||
|
if (!(efer & EFER_LMA))
|
||||||
|
efer &= ~EFER_LME;
|
||||||
|
}
|
||||||
|
|
||||||
to_svm(vcpu)->vmcb->save.efer = efer | EFER_SVME;
|
to_svm(vcpu)->vmcb->save.efer = efer | EFER_SVME;
|
||||||
mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR);
|
mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR);
|
||||||
|
|
|
@ -969,17 +969,9 @@ static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset)
|
||||||
u64 guest_efer = vmx->vcpu.arch.efer;
|
u64 guest_efer = vmx->vcpu.arch.efer;
|
||||||
u64 ignore_bits = 0;
|
u64 ignore_bits = 0;
|
||||||
|
|
||||||
if (!enable_ept) {
|
/* Shadow paging assumes NX to be available. */
|
||||||
/*
|
if (!enable_ept)
|
||||||
* NX is needed to handle CR0.WP=1, CR4.SMEP=1. Testing
|
guest_efer |= EFER_NX;
|
||||||
* host CPUID is more efficient than testing guest CPUID
|
|
||||||
* or CR4. Host SMEP is anyway a requirement for guest SMEP.
|
|
||||||
*/
|
|
||||||
if (boot_cpu_has(X86_FEATURE_SMEP))
|
|
||||||
guest_efer |= EFER_NX;
|
|
||||||
else if (!(guest_efer & EFER_NX))
|
|
||||||
ignore_bits |= EFER_NX;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LMA and LME handled by hardware; SCE meaningless outside long mode.
|
* LMA and LME handled by hardware; SCE meaningless outside long mode.
|
||||||
|
|
|
@ -2110,10 +2110,10 @@ static ssize_t ioc_weight_write(struct kernfs_open_file *of, char *buf,
|
||||||
goto einval;
|
goto einval;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irq(&iocg->ioc->lock);
|
spin_lock(&iocg->ioc->lock);
|
||||||
iocg->cfg_weight = v;
|
iocg->cfg_weight = v;
|
||||||
weight_updated(iocg);
|
weight_updated(iocg);
|
||||||
spin_unlock_irq(&iocg->ioc->lock);
|
spin_unlock(&iocg->ioc->lock);
|
||||||
|
|
||||||
blkg_conf_finish(&ctx);
|
blkg_conf_finish(&ctx);
|
||||||
return nbytes;
|
return nbytes;
|
||||||
|
|
|
@ -159,26 +159,34 @@ void acpi_processor_ignore_ppc_init(void)
|
||||||
|
|
||||||
void acpi_processor_ppc_init(struct cpufreq_policy *policy)
|
void acpi_processor_ppc_init(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
int cpu = policy->cpu;
|
unsigned int cpu;
|
||||||
struct acpi_processor *pr = per_cpu(processors, cpu);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!pr)
|
for_each_cpu(cpu, policy->related_cpus) {
|
||||||
return;
|
struct acpi_processor *pr = per_cpu(processors, cpu);
|
||||||
|
int ret;
|
||||||
|
|
||||||
ret = freq_qos_add_request(&policy->constraints, &pr->perflib_req,
|
if (!pr)
|
||||||
FREQ_QOS_MAX, INT_MAX);
|
continue;
|
||||||
if (ret < 0)
|
|
||||||
pr_err("Failed to add freq constraint for CPU%d (%d)\n", cpu,
|
ret = freq_qos_add_request(&policy->constraints,
|
||||||
ret);
|
&pr->perflib_req,
|
||||||
|
FREQ_QOS_MAX, INT_MAX);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("Failed to add freq constraint for CPU%d (%d)\n",
|
||||||
|
cpu, ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_processor_ppc_exit(struct cpufreq_policy *policy)
|
void acpi_processor_ppc_exit(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
struct acpi_processor *pr = per_cpu(processors, policy->cpu);
|
unsigned int cpu;
|
||||||
|
|
||||||
if (pr)
|
for_each_cpu(cpu, policy->related_cpus) {
|
||||||
freq_qos_remove_request(&pr->perflib_req);
|
struct acpi_processor *pr = per_cpu(processors, cpu);
|
||||||
|
|
||||||
|
if (pr)
|
||||||
|
freq_qos_remove_request(&pr->perflib_req);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_processor_get_performance_control(struct acpi_processor *pr)
|
static int acpi_processor_get_performance_control(struct acpi_processor *pr)
|
||||||
|
|
|
@ -127,26 +127,34 @@ static int cpufreq_set_cur_state(unsigned int cpu, int state)
|
||||||
|
|
||||||
void acpi_thermal_cpufreq_init(struct cpufreq_policy *policy)
|
void acpi_thermal_cpufreq_init(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
int cpu = policy->cpu;
|
unsigned int cpu;
|
||||||
struct acpi_processor *pr = per_cpu(processors, cpu);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!pr)
|
for_each_cpu(cpu, policy->related_cpus) {
|
||||||
return;
|
struct acpi_processor *pr = per_cpu(processors, cpu);
|
||||||
|
int ret;
|
||||||
|
|
||||||
ret = freq_qos_add_request(&policy->constraints, &pr->thermal_req,
|
if (!pr)
|
||||||
FREQ_QOS_MAX, INT_MAX);
|
continue;
|
||||||
if (ret < 0)
|
|
||||||
pr_err("Failed to add freq constraint for CPU%d (%d)\n", cpu,
|
ret = freq_qos_add_request(&policy->constraints,
|
||||||
ret);
|
&pr->thermal_req,
|
||||||
|
FREQ_QOS_MAX, INT_MAX);
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("Failed to add freq constraint for CPU%d (%d)\n",
|
||||||
|
cpu, ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_thermal_cpufreq_exit(struct cpufreq_policy *policy)
|
void acpi_thermal_cpufreq_exit(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
struct acpi_processor *pr = per_cpu(processors, policy->cpu);
|
unsigned int cpu;
|
||||||
|
|
||||||
if (pr)
|
for_each_cpu(cpu, policy->related_cpus) {
|
||||||
freq_qos_remove_request(&pr->thermal_req);
|
struct acpi_processor *pr = per_cpu(processors, policy->cpu);
|
||||||
|
|
||||||
|
if (pr)
|
||||||
|
freq_qos_remove_request(&pr->thermal_req);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else /* ! CONFIG_CPU_FREQ */
|
#else /* ! CONFIG_CPU_FREQ */
|
||||||
static int cpufreq_get_max_state(unsigned int cpu)
|
static int cpufreq_get_max_state(unsigned int cpu)
|
||||||
|
|
|
@ -1297,7 +1297,7 @@ static void make_established(struct sock *sk, u32 snd_isn, unsigned int opt)
|
||||||
tp->write_seq = snd_isn;
|
tp->write_seq = snd_isn;
|
||||||
tp->snd_nxt = snd_isn;
|
tp->snd_nxt = snd_isn;
|
||||||
tp->snd_una = snd_isn;
|
tp->snd_una = snd_isn;
|
||||||
inet_sk(sk)->inet_id = tp->write_seq ^ jiffies;
|
inet_sk(sk)->inet_id = prandom_u32();
|
||||||
assign_rxopt(sk, opt);
|
assign_rxopt(sk, opt);
|
||||||
|
|
||||||
if (tp->rcv_wnd > (RCV_BUFSIZ_M << 10))
|
if (tp->rcv_wnd > (RCV_BUFSIZ_M << 10))
|
||||||
|
|
|
@ -1702,7 +1702,7 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
return peekmsg(sk, msg, len, nonblock, flags);
|
return peekmsg(sk, msg, len, nonblock, flags);
|
||||||
|
|
||||||
if (sk_can_busy_loop(sk) &&
|
if (sk_can_busy_loop(sk) &&
|
||||||
skb_queue_empty(&sk->sk_receive_queue) &&
|
skb_queue_empty_lockless(&sk->sk_receive_queue) &&
|
||||||
sk->sk_state == TCP_ESTABLISHED)
|
sk->sk_state == TCP_ESTABLISHED)
|
||||||
sk_busy_loop(sk, nonblock);
|
sk_busy_loop(sk, nonblock);
|
||||||
|
|
||||||
|
|
|
@ -1707,6 +1707,14 @@ static void sdma_add_scripts(struct sdma_engine *sdma,
|
||||||
if (!sdma->script_number)
|
if (!sdma->script_number)
|
||||||
sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1;
|
sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1;
|
||||||
|
|
||||||
|
if (sdma->script_number > sizeof(struct sdma_script_start_addrs)
|
||||||
|
/ sizeof(s32)) {
|
||||||
|
dev_err(sdma->dev,
|
||||||
|
"SDMA script number %d not match with firmware.\n",
|
||||||
|
sdma->script_number);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < sdma->script_number; i++)
|
for (i = 0; i < sdma->script_number; i++)
|
||||||
if (addr_arr[i] > 0)
|
if (addr_arr[i] > 0)
|
||||||
saddr_arr[i] = addr_arr[i];
|
saddr_arr[i] = addr_arr[i];
|
||||||
|
|
|
@ -694,6 +694,25 @@ static int bam_dma_terminate_all(struct dma_chan *chan)
|
||||||
|
|
||||||
/* remove all transactions, including active transaction */
|
/* remove all transactions, including active transaction */
|
||||||
spin_lock_irqsave(&bchan->vc.lock, flag);
|
spin_lock_irqsave(&bchan->vc.lock, flag);
|
||||||
|
/*
|
||||||
|
* If we have transactions queued, then some might be committed to the
|
||||||
|
* hardware in the desc fifo. The only way to reset the desc fifo is
|
||||||
|
* to do a hardware reset (either by pipe or the entire block).
|
||||||
|
* bam_chan_init_hw() will trigger a pipe reset, and also reinit the
|
||||||
|
* pipe. If the pipe is left disabled (default state after pipe reset)
|
||||||
|
* and is accessed by a connected hardware engine, a fatal error in
|
||||||
|
* the BAM will occur. There is a small window where this could happen
|
||||||
|
* with bam_chan_init_hw(), but it is assumed that the caller has
|
||||||
|
* stopped activity on any attached hardware engine. Make sure to do
|
||||||
|
* this first so that the BAM hardware doesn't cause memory corruption
|
||||||
|
* by accessing freed resources.
|
||||||
|
*/
|
||||||
|
if (!list_empty(&bchan->desc_list)) {
|
||||||
|
async_desc = list_first_entry(&bchan->desc_list,
|
||||||
|
struct bam_async_desc, desc_node);
|
||||||
|
bam_chan_init_hw(bchan, async_desc->dir);
|
||||||
|
}
|
||||||
|
|
||||||
list_for_each_entry_safe(async_desc, tmp,
|
list_for_each_entry_safe(async_desc, tmp,
|
||||||
&bchan->desc_list, desc_node) {
|
&bchan->desc_list, desc_node) {
|
||||||
list_add(&async_desc->vd.node, &bchan->vc.desc_issued);
|
list_add(&async_desc->vd.node, &bchan->vc.desc_issued);
|
||||||
|
|
|
@ -134,6 +134,10 @@
|
||||||
#define SPRD_DMA_SRC_TRSF_STEP_OFFSET 0
|
#define SPRD_DMA_SRC_TRSF_STEP_OFFSET 0
|
||||||
#define SPRD_DMA_TRSF_STEP_MASK GENMASK(15, 0)
|
#define SPRD_DMA_TRSF_STEP_MASK GENMASK(15, 0)
|
||||||
|
|
||||||
|
/* SPRD DMA_SRC_BLK_STEP register definition */
|
||||||
|
#define SPRD_DMA_LLIST_HIGH_MASK GENMASK(31, 28)
|
||||||
|
#define SPRD_DMA_LLIST_HIGH_SHIFT 28
|
||||||
|
|
||||||
/* define DMA channel mode & trigger mode mask */
|
/* define DMA channel mode & trigger mode mask */
|
||||||
#define SPRD_DMA_CHN_MODE_MASK GENMASK(7, 0)
|
#define SPRD_DMA_CHN_MODE_MASK GENMASK(7, 0)
|
||||||
#define SPRD_DMA_TRG_MODE_MASK GENMASK(7, 0)
|
#define SPRD_DMA_TRG_MODE_MASK GENMASK(7, 0)
|
||||||
|
@ -208,6 +212,7 @@ struct sprd_dma_dev {
|
||||||
struct sprd_dma_chn channels[0];
|
struct sprd_dma_chn channels[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void sprd_dma_free_desc(struct virt_dma_desc *vd);
|
||||||
static bool sprd_dma_filter_fn(struct dma_chan *chan, void *param);
|
static bool sprd_dma_filter_fn(struct dma_chan *chan, void *param);
|
||||||
static struct of_dma_filter_info sprd_dma_info = {
|
static struct of_dma_filter_info sprd_dma_info = {
|
||||||
.filter_fn = sprd_dma_filter_fn,
|
.filter_fn = sprd_dma_filter_fn,
|
||||||
|
@ -609,12 +614,19 @@ static int sprd_dma_alloc_chan_resources(struct dma_chan *chan)
|
||||||
static void sprd_dma_free_chan_resources(struct dma_chan *chan)
|
static void sprd_dma_free_chan_resources(struct dma_chan *chan)
|
||||||
{
|
{
|
||||||
struct sprd_dma_chn *schan = to_sprd_dma_chan(chan);
|
struct sprd_dma_chn *schan = to_sprd_dma_chan(chan);
|
||||||
|
struct virt_dma_desc *cur_vd = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&schan->vc.lock, flags);
|
spin_lock_irqsave(&schan->vc.lock, flags);
|
||||||
|
if (schan->cur_desc)
|
||||||
|
cur_vd = &schan->cur_desc->vd;
|
||||||
|
|
||||||
sprd_dma_stop(schan);
|
sprd_dma_stop(schan);
|
||||||
spin_unlock_irqrestore(&schan->vc.lock, flags);
|
spin_unlock_irqrestore(&schan->vc.lock, flags);
|
||||||
|
|
||||||
|
if (cur_vd)
|
||||||
|
sprd_dma_free_desc(cur_vd);
|
||||||
|
|
||||||
vchan_free_chan_resources(&schan->vc);
|
vchan_free_chan_resources(&schan->vc);
|
||||||
pm_runtime_put(chan->device->dev);
|
pm_runtime_put(chan->device->dev);
|
||||||
}
|
}
|
||||||
|
@ -717,6 +729,7 @@ static int sprd_dma_fill_desc(struct dma_chan *chan,
|
||||||
u32 int_mode = flags & SPRD_DMA_INT_MASK;
|
u32 int_mode = flags & SPRD_DMA_INT_MASK;
|
||||||
int src_datawidth, dst_datawidth, src_step, dst_step;
|
int src_datawidth, dst_datawidth, src_step, dst_step;
|
||||||
u32 temp, fix_mode = 0, fix_en = 0;
|
u32 temp, fix_mode = 0, fix_en = 0;
|
||||||
|
phys_addr_t llist_ptr;
|
||||||
|
|
||||||
if (dir == DMA_MEM_TO_DEV) {
|
if (dir == DMA_MEM_TO_DEV) {
|
||||||
src_step = sprd_dma_get_step(slave_cfg->src_addr_width);
|
src_step = sprd_dma_get_step(slave_cfg->src_addr_width);
|
||||||
|
@ -814,13 +827,16 @@ static int sprd_dma_fill_desc(struct dma_chan *chan,
|
||||||
* Set the link-list pointer point to next link-list
|
* Set the link-list pointer point to next link-list
|
||||||
* configuration's physical address.
|
* configuration's physical address.
|
||||||
*/
|
*/
|
||||||
hw->llist_ptr = schan->linklist.phy_addr + temp;
|
llist_ptr = schan->linklist.phy_addr + temp;
|
||||||
|
hw->llist_ptr = lower_32_bits(llist_ptr);
|
||||||
|
hw->src_blk_step = (upper_32_bits(llist_ptr) << SPRD_DMA_LLIST_HIGH_SHIFT) &
|
||||||
|
SPRD_DMA_LLIST_HIGH_MASK;
|
||||||
} else {
|
} else {
|
||||||
hw->llist_ptr = 0;
|
hw->llist_ptr = 0;
|
||||||
|
hw->src_blk_step = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
hw->frg_step = 0;
|
hw->frg_step = 0;
|
||||||
hw->src_blk_step = 0;
|
|
||||||
hw->des_blk_step = 0;
|
hw->des_blk_step = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1023,15 +1039,22 @@ static int sprd_dma_resume(struct dma_chan *chan)
|
||||||
static int sprd_dma_terminate_all(struct dma_chan *chan)
|
static int sprd_dma_terminate_all(struct dma_chan *chan)
|
||||||
{
|
{
|
||||||
struct sprd_dma_chn *schan = to_sprd_dma_chan(chan);
|
struct sprd_dma_chn *schan = to_sprd_dma_chan(chan);
|
||||||
|
struct virt_dma_desc *cur_vd = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
LIST_HEAD(head);
|
LIST_HEAD(head);
|
||||||
|
|
||||||
spin_lock_irqsave(&schan->vc.lock, flags);
|
spin_lock_irqsave(&schan->vc.lock, flags);
|
||||||
|
if (schan->cur_desc)
|
||||||
|
cur_vd = &schan->cur_desc->vd;
|
||||||
|
|
||||||
sprd_dma_stop(schan);
|
sprd_dma_stop(schan);
|
||||||
|
|
||||||
vchan_get_all_descriptors(&schan->vc, &head);
|
vchan_get_all_descriptors(&schan->vc, &head);
|
||||||
spin_unlock_irqrestore(&schan->vc.lock, flags);
|
spin_unlock_irqrestore(&schan->vc.lock, flags);
|
||||||
|
|
||||||
|
if (cur_vd)
|
||||||
|
sprd_dma_free_desc(cur_vd);
|
||||||
|
|
||||||
vchan_dma_desc_free_list(&schan->vc, &head);
|
vchan_dma_desc_free_list(&schan->vc, &head);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#define ADMA_CH_CONFIG_MAX_BURST_SIZE 16
|
#define ADMA_CH_CONFIG_MAX_BURST_SIZE 16
|
||||||
#define ADMA_CH_CONFIG_WEIGHT_FOR_WRR(val) ((val) & 0xf)
|
#define ADMA_CH_CONFIG_WEIGHT_FOR_WRR(val) ((val) & 0xf)
|
||||||
#define ADMA_CH_CONFIG_MAX_BUFS 8
|
#define ADMA_CH_CONFIG_MAX_BUFS 8
|
||||||
|
#define TEGRA186_ADMA_CH_CONFIG_OUTSTANDING_REQS(reqs) (reqs << 4)
|
||||||
|
|
||||||
#define ADMA_CH_FIFO_CTRL 0x2c
|
#define ADMA_CH_FIFO_CTRL 0x2c
|
||||||
#define TEGRA210_ADMA_CH_FIFO_CTRL_TXSIZE(val) (((val) & 0xf) << 8)
|
#define TEGRA210_ADMA_CH_FIFO_CTRL_TXSIZE(val) (((val) & 0xf) << 8)
|
||||||
|
@ -77,6 +78,7 @@ struct tegra_adma;
|
||||||
* @ch_req_tx_shift: Register offset for AHUB transmit channel select.
|
* @ch_req_tx_shift: Register offset for AHUB transmit channel select.
|
||||||
* @ch_req_rx_shift: Register offset for AHUB receive channel select.
|
* @ch_req_rx_shift: Register offset for AHUB receive channel select.
|
||||||
* @ch_base_offset: Register offset of DMA channel registers.
|
* @ch_base_offset: Register offset of DMA channel registers.
|
||||||
|
* @has_outstanding_reqs: If DMA channel can have outstanding requests.
|
||||||
* @ch_fifo_ctrl: Default value for channel FIFO CTRL register.
|
* @ch_fifo_ctrl: Default value for channel FIFO CTRL register.
|
||||||
* @ch_req_mask: Mask for Tx or Rx channel select.
|
* @ch_req_mask: Mask for Tx or Rx channel select.
|
||||||
* @ch_req_max: Maximum number of Tx or Rx channels available.
|
* @ch_req_max: Maximum number of Tx or Rx channels available.
|
||||||
|
@ -95,6 +97,7 @@ struct tegra_adma_chip_data {
|
||||||
unsigned int ch_req_max;
|
unsigned int ch_req_max;
|
||||||
unsigned int ch_reg_size;
|
unsigned int ch_reg_size;
|
||||||
unsigned int nr_channels;
|
unsigned int nr_channels;
|
||||||
|
bool has_outstanding_reqs;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -594,6 +597,8 @@ static int tegra_adma_set_xfer_params(struct tegra_adma_chan *tdc,
|
||||||
ADMA_CH_CTRL_FLOWCTRL_EN;
|
ADMA_CH_CTRL_FLOWCTRL_EN;
|
||||||
ch_regs->config |= cdata->adma_get_burst_config(burst_size);
|
ch_regs->config |= cdata->adma_get_burst_config(burst_size);
|
||||||
ch_regs->config |= ADMA_CH_CONFIG_WEIGHT_FOR_WRR(1);
|
ch_regs->config |= ADMA_CH_CONFIG_WEIGHT_FOR_WRR(1);
|
||||||
|
if (cdata->has_outstanding_reqs)
|
||||||
|
ch_regs->config |= TEGRA186_ADMA_CH_CONFIG_OUTSTANDING_REQS(8);
|
||||||
ch_regs->fifo_ctrl = cdata->ch_fifo_ctrl;
|
ch_regs->fifo_ctrl = cdata->ch_fifo_ctrl;
|
||||||
ch_regs->tc = desc->period_len & ADMA_CH_TC_COUNT_MASK;
|
ch_regs->tc = desc->period_len & ADMA_CH_TC_COUNT_MASK;
|
||||||
|
|
||||||
|
@ -778,6 +783,7 @@ static const struct tegra_adma_chip_data tegra210_chip_data = {
|
||||||
.ch_req_tx_shift = 28,
|
.ch_req_tx_shift = 28,
|
||||||
.ch_req_rx_shift = 24,
|
.ch_req_rx_shift = 24,
|
||||||
.ch_base_offset = 0,
|
.ch_base_offset = 0,
|
||||||
|
.has_outstanding_reqs = false,
|
||||||
.ch_fifo_ctrl = TEGRA210_FIFO_CTRL_DEFAULT,
|
.ch_fifo_ctrl = TEGRA210_FIFO_CTRL_DEFAULT,
|
||||||
.ch_req_mask = 0xf,
|
.ch_req_mask = 0xf,
|
||||||
.ch_req_max = 10,
|
.ch_req_max = 10,
|
||||||
|
@ -792,6 +798,7 @@ static const struct tegra_adma_chip_data tegra186_chip_data = {
|
||||||
.ch_req_tx_shift = 27,
|
.ch_req_tx_shift = 27,
|
||||||
.ch_req_rx_shift = 22,
|
.ch_req_rx_shift = 22,
|
||||||
.ch_base_offset = 0x10000,
|
.ch_base_offset = 0x10000,
|
||||||
|
.has_outstanding_reqs = true,
|
||||||
.ch_fifo_ctrl = TEGRA186_FIFO_CTRL_DEFAULT,
|
.ch_fifo_ctrl = TEGRA186_FIFO_CTRL_DEFAULT,
|
||||||
.ch_req_mask = 0x1f,
|
.ch_req_mask = 0x1f,
|
||||||
.ch_req_max = 20,
|
.ch_req_max = 20,
|
||||||
|
|
|
@ -586,9 +586,22 @@ static struct dma_async_tx_descriptor *cppi41_dma_prep_slave_sg(
|
||||||
enum dma_transfer_direction dir, unsigned long tx_flags, void *context)
|
enum dma_transfer_direction dir, unsigned long tx_flags, void *context)
|
||||||
{
|
{
|
||||||
struct cppi41_channel *c = to_cpp41_chan(chan);
|
struct cppi41_channel *c = to_cpp41_chan(chan);
|
||||||
|
struct dma_async_tx_descriptor *txd = NULL;
|
||||||
|
struct cppi41_dd *cdd = c->cdd;
|
||||||
struct cppi41_desc *d;
|
struct cppi41_desc *d;
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
error = pm_runtime_get(cdd->ddev.dev);
|
||||||
|
if (error < 0) {
|
||||||
|
pm_runtime_put_noidle(cdd->ddev.dev);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cdd->is_suspended)
|
||||||
|
goto err_out_not_ready;
|
||||||
|
|
||||||
d = c->desc;
|
d = c->desc;
|
||||||
for_each_sg(sgl, sg, sg_len, i) {
|
for_each_sg(sgl, sg, sg_len, i) {
|
||||||
|
@ -611,7 +624,13 @@ static struct dma_async_tx_descriptor *cppi41_dma_prep_slave_sg(
|
||||||
d++;
|
d++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return &c->txd;
|
txd = &c->txd;
|
||||||
|
|
||||||
|
err_out_not_ready:
|
||||||
|
pm_runtime_mark_last_busy(cdd->ddev.dev);
|
||||||
|
pm_runtime_put_autosuspend(cdd->ddev.dev);
|
||||||
|
|
||||||
|
return txd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cppi41_compute_td_desc(struct cppi41_desc *d)
|
static void cppi41_compute_td_desc(struct cppi41_desc *d)
|
||||||
|
|
|
@ -68,6 +68,9 @@
|
||||||
#define XILINX_DMA_DMACR_CIRC_EN BIT(1)
|
#define XILINX_DMA_DMACR_CIRC_EN BIT(1)
|
||||||
#define XILINX_DMA_DMACR_RUNSTOP BIT(0)
|
#define XILINX_DMA_DMACR_RUNSTOP BIT(0)
|
||||||
#define XILINX_DMA_DMACR_FSYNCSRC_MASK GENMASK(6, 5)
|
#define XILINX_DMA_DMACR_FSYNCSRC_MASK GENMASK(6, 5)
|
||||||
|
#define XILINX_DMA_DMACR_DELAY_MASK GENMASK(31, 24)
|
||||||
|
#define XILINX_DMA_DMACR_FRAME_COUNT_MASK GENMASK(23, 16)
|
||||||
|
#define XILINX_DMA_DMACR_MASTER_MASK GENMASK(11, 8)
|
||||||
|
|
||||||
#define XILINX_DMA_REG_DMASR 0x0004
|
#define XILINX_DMA_REG_DMASR 0x0004
|
||||||
#define XILINX_DMA_DMASR_EOL_LATE_ERR BIT(15)
|
#define XILINX_DMA_DMASR_EOL_LATE_ERR BIT(15)
|
||||||
|
@ -1354,7 +1357,8 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan)
|
||||||
node);
|
node);
|
||||||
hw = &segment->hw;
|
hw = &segment->hw;
|
||||||
|
|
||||||
xilinx_write(chan, XILINX_DMA_REG_SRCDSTADDR, hw->buf_addr);
|
xilinx_write(chan, XILINX_DMA_REG_SRCDSTADDR,
|
||||||
|
xilinx_prep_dma_addr_t(hw->buf_addr));
|
||||||
|
|
||||||
/* Start the transfer */
|
/* Start the transfer */
|
||||||
dma_ctrl_write(chan, XILINX_DMA_REG_BTT,
|
dma_ctrl_write(chan, XILINX_DMA_REG_BTT,
|
||||||
|
@ -2117,8 +2121,10 @@ int xilinx_vdma_channel_set_config(struct dma_chan *dchan,
|
||||||
chan->config.gen_lock = cfg->gen_lock;
|
chan->config.gen_lock = cfg->gen_lock;
|
||||||
chan->config.master = cfg->master;
|
chan->config.master = cfg->master;
|
||||||
|
|
||||||
|
dmacr &= ~XILINX_DMA_DMACR_GENLOCK_EN;
|
||||||
if (cfg->gen_lock && chan->genlock) {
|
if (cfg->gen_lock && chan->genlock) {
|
||||||
dmacr |= XILINX_DMA_DMACR_GENLOCK_EN;
|
dmacr |= XILINX_DMA_DMACR_GENLOCK_EN;
|
||||||
|
dmacr &= ~XILINX_DMA_DMACR_MASTER_MASK;
|
||||||
dmacr |= cfg->master << XILINX_DMA_DMACR_MASTER_SHIFT;
|
dmacr |= cfg->master << XILINX_DMA_DMACR_MASTER_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2134,11 +2140,13 @@ int xilinx_vdma_channel_set_config(struct dma_chan *dchan,
|
||||||
chan->config.delay = cfg->delay;
|
chan->config.delay = cfg->delay;
|
||||||
|
|
||||||
if (cfg->coalesc <= XILINX_DMA_DMACR_FRAME_COUNT_MAX) {
|
if (cfg->coalesc <= XILINX_DMA_DMACR_FRAME_COUNT_MAX) {
|
||||||
|
dmacr &= ~XILINX_DMA_DMACR_FRAME_COUNT_MASK;
|
||||||
dmacr |= cfg->coalesc << XILINX_DMA_DMACR_FRAME_COUNT_SHIFT;
|
dmacr |= cfg->coalesc << XILINX_DMA_DMACR_FRAME_COUNT_SHIFT;
|
||||||
chan->config.coalesc = cfg->coalesc;
|
chan->config.coalesc = cfg->coalesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->delay <= XILINX_DMA_DMACR_DELAY_MAX) {
|
if (cfg->delay <= XILINX_DMA_DMACR_DELAY_MAX) {
|
||||||
|
dmacr &= ~XILINX_DMA_DMACR_DELAY_MASK;
|
||||||
dmacr |= cfg->delay << XILINX_DMA_DMACR_DELAY_SHIFT;
|
dmacr |= cfg->delay << XILINX_DMA_DMACR_DELAY_SHIFT;
|
||||||
chan->config.delay = cfg->delay;
|
chan->config.delay = cfg->delay;
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,6 +182,7 @@ config RESET_ATTACK_MITIGATION
|
||||||
|
|
||||||
config EFI_RCI2_TABLE
|
config EFI_RCI2_TABLE
|
||||||
bool "EFI Runtime Configuration Interface Table Version 2 Support"
|
bool "EFI Runtime Configuration Interface Table Version 2 Support"
|
||||||
|
depends on X86 || COMPILE_TEST
|
||||||
help
|
help
|
||||||
Displays the content of the Runtime Configuration Interface
|
Displays the content of the Runtime Configuration Interface
|
||||||
Table version 2 on Dell EMC PowerEdge systems as a binary
|
Table version 2 on Dell EMC PowerEdge systems as a binary
|
||||||
|
|
|
@ -554,7 +554,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
|
||||||
sizeof(*seed) + size);
|
sizeof(*seed) + size);
|
||||||
if (seed != NULL) {
|
if (seed != NULL) {
|
||||||
pr_notice("seeding entropy pool\n");
|
pr_notice("seeding entropy pool\n");
|
||||||
add_device_randomness(seed->bits, seed->size);
|
add_bootloader_randomness(seed->bits, seed->size);
|
||||||
early_memunmap(seed, sizeof(*seed) + size);
|
early_memunmap(seed, sizeof(*seed) + size);
|
||||||
} else {
|
} else {
|
||||||
pr_err("Could not map UEFI random seed!\n");
|
pr_err("Could not map UEFI random seed!\n");
|
||||||
|
|
|
@ -52,6 +52,7 @@ lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o string.o random.o \
|
||||||
|
|
||||||
lib-$(CONFIG_ARM) += arm32-stub.o
|
lib-$(CONFIG_ARM) += arm32-stub.o
|
||||||
lib-$(CONFIG_ARM64) += arm64-stub.o
|
lib-$(CONFIG_ARM64) += arm64-stub.o
|
||||||
|
CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
|
||||||
CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
|
CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -195,6 +195,7 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
|
||||||
unsigned long dram_base,
|
unsigned long dram_base,
|
||||||
efi_loaded_image_t *image)
|
efi_loaded_image_t *image)
|
||||||
{
|
{
|
||||||
|
unsigned long kernel_base;
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -204,9 +205,18 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
|
||||||
* loaded. These assumptions are made by the decompressor,
|
* loaded. These assumptions are made by the decompressor,
|
||||||
* before any memory map is available.
|
* before any memory map is available.
|
||||||
*/
|
*/
|
||||||
dram_base = round_up(dram_base, SZ_128M);
|
kernel_base = round_up(dram_base, SZ_128M);
|
||||||
|
|
||||||
status = reserve_kernel_base(sys_table, dram_base, reserve_addr,
|
/*
|
||||||
|
* Note that some platforms (notably, the Raspberry Pi 2) put
|
||||||
|
* spin-tables and other pieces of firmware at the base of RAM,
|
||||||
|
* abusing the fact that the window of TEXT_OFFSET bytes at the
|
||||||
|
* base of the kernel image is only partially used at the moment.
|
||||||
|
* (Up to 5 pages are used for the swapper page tables)
|
||||||
|
*/
|
||||||
|
kernel_base += TEXT_OFFSET - 5 * PAGE_SIZE;
|
||||||
|
|
||||||
|
status = reserve_kernel_base(sys_table, kernel_base, reserve_addr,
|
||||||
reserve_size);
|
reserve_size);
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
pr_efi_err(sys_table, "Unable to allocate memory for uncompressed kernel.\n");
|
pr_efi_err(sys_table, "Unable to allocate memory for uncompressed kernel.\n");
|
||||||
|
@ -220,7 +230,7 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
|
||||||
*image_size = image->image_size;
|
*image_size = image->image_size;
|
||||||
status = efi_relocate_kernel(sys_table, image_addr, *image_size,
|
status = efi_relocate_kernel(sys_table, image_addr, *image_size,
|
||||||
*image_size,
|
*image_size,
|
||||||
dram_base + MAX_UNCOMP_KERNEL_SIZE, 0);
|
kernel_base + MAX_UNCOMP_KERNEL_SIZE, 0, 0);
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
pr_efi_err(sys_table, "Failed to relocate kernel.\n");
|
pr_efi_err(sys_table, "Failed to relocate kernel.\n");
|
||||||
efi_free(sys_table, *reserve_size, *reserve_addr);
|
efi_free(sys_table, *reserve_size, *reserve_addr);
|
||||||
|
|
|
@ -260,11 +260,11 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate at the lowest possible address.
|
* Allocate at the lowest possible address that is not below 'min'.
|
||||||
*/
|
*/
|
||||||
efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
|
efi_status_t efi_low_alloc_above(efi_system_table_t *sys_table_arg,
|
||||||
unsigned long size, unsigned long align,
|
unsigned long size, unsigned long align,
|
||||||
unsigned long *addr)
|
unsigned long *addr, unsigned long min)
|
||||||
{
|
{
|
||||||
unsigned long map_size, desc_size, buff_size;
|
unsigned long map_size, desc_size, buff_size;
|
||||||
efi_memory_desc_t *map;
|
efi_memory_desc_t *map;
|
||||||
|
@ -311,13 +311,8 @@ efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
|
||||||
start = desc->phys_addr;
|
start = desc->phys_addr;
|
||||||
end = start + desc->num_pages * EFI_PAGE_SIZE;
|
end = start + desc->num_pages * EFI_PAGE_SIZE;
|
||||||
|
|
||||||
/*
|
if (start < min)
|
||||||
* Don't allocate at 0x0. It will confuse code that
|
start = min;
|
||||||
* checks pointers against NULL. Skip the first 8
|
|
||||||
* bytes so we start at a nice even number.
|
|
||||||
*/
|
|
||||||
if (start == 0x0)
|
|
||||||
start += 8;
|
|
||||||
|
|
||||||
start = round_up(start, align);
|
start = round_up(start, align);
|
||||||
if ((start + size) > end)
|
if ((start + size) > end)
|
||||||
|
@ -698,7 +693,8 @@ efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
|
||||||
unsigned long image_size,
|
unsigned long image_size,
|
||||||
unsigned long alloc_size,
|
unsigned long alloc_size,
|
||||||
unsigned long preferred_addr,
|
unsigned long preferred_addr,
|
||||||
unsigned long alignment)
|
unsigned long alignment,
|
||||||
|
unsigned long min_addr)
|
||||||
{
|
{
|
||||||
unsigned long cur_image_addr;
|
unsigned long cur_image_addr;
|
||||||
unsigned long new_addr = 0;
|
unsigned long new_addr = 0;
|
||||||
|
@ -731,8 +727,8 @@ efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
|
||||||
* possible.
|
* possible.
|
||||||
*/
|
*/
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
status = efi_low_alloc(sys_table_arg, alloc_size, alignment,
|
status = efi_low_alloc_above(sys_table_arg, alloc_size,
|
||||||
&new_addr);
|
alignment, &new_addr, min_addr);
|
||||||
}
|
}
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
pr_efi_err(sys_table_arg, "Failed to allocate usable memory for kernel.\n");
|
pr_efi_err(sys_table_arg, "Failed to allocate usable memory for kernel.\n");
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/efi.h>
|
#include <linux/efi.h>
|
||||||
|
#include <linux/security.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
@ -717,6 +718,13 @@ static long efi_test_ioctl(struct file *file, unsigned int cmd,
|
||||||
|
|
||||||
static int efi_test_open(struct inode *inode, struct file *file)
|
static int efi_test_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
|
int ret = security_locked_down(LOCKDOWN_EFI_TEST);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return -EACCES;
|
||||||
/*
|
/*
|
||||||
* nothing special to do here
|
* nothing special to do here
|
||||||
* We do accept multiple open files at the same time as we
|
* We do accept multiple open files at the same time as we
|
||||||
|
|
|
@ -88,6 +88,7 @@ int __init efi_tpm_eventlog_init(void)
|
||||||
|
|
||||||
if (tbl_size < 0) {
|
if (tbl_size < 0) {
|
||||||
pr_err(FW_BUG "Failed to parse event in TPM Final Events Log\n");
|
pr_err(FW_BUG "Failed to parse event in TPM Final Events Log\n");
|
||||||
|
ret = -EINVAL;
|
||||||
goto out_calc;
|
goto out_calc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -218,7 +218,7 @@ static struct dma_fence *amdgpu_job_run(struct drm_sched_job *sched_job)
|
||||||
struct amdgpu_ring *ring = to_amdgpu_ring(sched_job->sched);
|
struct amdgpu_ring *ring = to_amdgpu_ring(sched_job->sched);
|
||||||
struct dma_fence *fence = NULL, *finished;
|
struct dma_fence *fence = NULL, *finished;
|
||||||
struct amdgpu_job *job;
|
struct amdgpu_job *job;
|
||||||
int r;
|
int r = 0;
|
||||||
|
|
||||||
job = to_amdgpu_job(sched_job);
|
job = to_amdgpu_job(sched_job);
|
||||||
finished = &job->base.s_fence->finished;
|
finished = &job->base.s_fence->finished;
|
||||||
|
@ -243,6 +243,8 @@ static struct dma_fence *amdgpu_job_run(struct drm_sched_job *sched_job)
|
||||||
job->fence = dma_fence_get(fence);
|
job->fence = dma_fence_get(fence);
|
||||||
|
|
||||||
amdgpu_job_free_resources(job);
|
amdgpu_job_free_resources(job);
|
||||||
|
|
||||||
|
fence = r ? ERR_PTR(r) : fence;
|
||||||
return fence;
|
return fence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_1[] =
|
||||||
{
|
{
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0xffffffff, 0x00400014),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0xffffffff, 0x00400014),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_CPF_CLK_CTRL, 0xfcff8fff, 0xf8000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_CPF_CLK_CTRL, 0xfcff8fff, 0xf8000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CLK_CTRL, 0xc0000000, 0xc0000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CLK_CTRL, 0xcd000000, 0x0d000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQ_CLK_CTRL, 0x60000ff0, 0x60000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQ_CLK_CTRL, 0x60000ff0, 0x60000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQG_CLK_CTRL, 0x40000000, 0x40000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQG_CLK_CTRL, 0x40000000, 0x40000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_VGT_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_VGT_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
||||||
|
@ -140,7 +140,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_1[] =
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0xffffffff, 0x003c0014),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0xffffffff, 0x003c0014),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_GS_NGG_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_GS_NGG_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_IA_CLK_CTRL, 0xffff0fff, 0xffff0100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_IA_CLK_CTRL, 0xffff0fff, 0xffff0100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CLK_CTRL, 0xc0000000, 0xc0000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CLK_CTRL, 0xcd000000, 0x0d000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQ_CLK_CTRL, 0xf8ff0fff, 0x60000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQ_CLK_CTRL, 0xf8ff0fff, 0x60000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQG_CLK_CTRL, 0x40000ff0, 0x40000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQG_CLK_CTRL, 0x40000ff0, 0x40000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_VGT_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_VGT_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
||||||
|
@ -179,7 +179,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0x003e001f, 0x003c0014),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0x003e001f, 0x003c0014),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_GS_NGG_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_GS_NGG_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_IA_CLK_CTRL, 0xffff0fff, 0xffff0100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_IA_CLK_CTRL, 0xffff0fff, 0xffff0100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CLK_CTRL, 0xff7f0fff, 0xc0000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CLK_CTRL, 0xff7f0fff, 0x0d000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQ_CLK_CTRL, 0xffffcfff, 0x60000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQ_CLK_CTRL, 0xffffcfff, 0x60000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQG_CLK_CTRL, 0xffff0fff, 0x40000100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SQG_CLK_CTRL, 0xffff0fff, 0x40000100),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_VGT_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_VGT_CLK_CTRL, 0xffff8fff, 0xffff8100),
|
||||||
|
|
|
@ -151,6 +151,15 @@ static void gfxhub_v2_0_init_cache_regs(struct amdgpu_device *adev)
|
||||||
WREG32_SOC15(GC, 0, mmGCVM_L2_CNTL2, tmp);
|
WREG32_SOC15(GC, 0, mmGCVM_L2_CNTL2, tmp);
|
||||||
|
|
||||||
tmp = mmGCVM_L2_CNTL3_DEFAULT;
|
tmp = mmGCVM_L2_CNTL3_DEFAULT;
|
||||||
|
if (adev->gmc.translate_further) {
|
||||||
|
tmp = REG_SET_FIELD(tmp, GCVM_L2_CNTL3, BANK_SELECT, 12);
|
||||||
|
tmp = REG_SET_FIELD(tmp, GCVM_L2_CNTL3,
|
||||||
|
L2_CACHE_BIGK_FRAGMENT_SIZE, 9);
|
||||||
|
} else {
|
||||||
|
tmp = REG_SET_FIELD(tmp, GCVM_L2_CNTL3, BANK_SELECT, 9);
|
||||||
|
tmp = REG_SET_FIELD(tmp, GCVM_L2_CNTL3,
|
||||||
|
L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
|
||||||
|
}
|
||||||
WREG32_SOC15(GC, 0, mmGCVM_L2_CNTL3, tmp);
|
WREG32_SOC15(GC, 0, mmGCVM_L2_CNTL3, tmp);
|
||||||
|
|
||||||
tmp = mmGCVM_L2_CNTL4_DEFAULT;
|
tmp = mmGCVM_L2_CNTL4_DEFAULT;
|
||||||
|
|
|
@ -309,6 +309,7 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
|
||||||
|
|
||||||
job->vm_pd_addr = amdgpu_gmc_pd_addr(adev->gart.bo);
|
job->vm_pd_addr = amdgpu_gmc_pd_addr(adev->gart.bo);
|
||||||
job->vm_needs_flush = true;
|
job->vm_needs_flush = true;
|
||||||
|
job->ibs->ptr[job->ibs->length_dw++] = ring->funcs->nop;
|
||||||
amdgpu_ring_pad_ib(ring, &job->ibs[0]);
|
amdgpu_ring_pad_ib(ring, &job->ibs[0]);
|
||||||
r = amdgpu_job_submit(job, &adev->mman.entity,
|
r = amdgpu_job_submit(job, &adev->mman.entity,
|
||||||
AMDGPU_FENCE_OWNER_UNDEFINED, &fence);
|
AMDGPU_FENCE_OWNER_UNDEFINED, &fence);
|
||||||
|
|
|
@ -137,6 +137,15 @@ static void mmhub_v2_0_init_cache_regs(struct amdgpu_device *adev)
|
||||||
WREG32_SOC15(MMHUB, 0, mmMMVM_L2_CNTL2, tmp);
|
WREG32_SOC15(MMHUB, 0, mmMMVM_L2_CNTL2, tmp);
|
||||||
|
|
||||||
tmp = mmMMVM_L2_CNTL3_DEFAULT;
|
tmp = mmMMVM_L2_CNTL3_DEFAULT;
|
||||||
|
if (adev->gmc.translate_further) {
|
||||||
|
tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3, BANK_SELECT, 12);
|
||||||
|
tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3,
|
||||||
|
L2_CACHE_BIGK_FRAGMENT_SIZE, 9);
|
||||||
|
} else {
|
||||||
|
tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3, BANK_SELECT, 9);
|
||||||
|
tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3,
|
||||||
|
L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
|
||||||
|
}
|
||||||
WREG32_SOC15(MMHUB, 0, mmMMVM_L2_CNTL3, tmp);
|
WREG32_SOC15(MMHUB, 0, mmMMVM_L2_CNTL3, tmp);
|
||||||
|
|
||||||
tmp = mmMMVM_L2_CNTL4_DEFAULT;
|
tmp = mmMMVM_L2_CNTL4_DEFAULT;
|
||||||
|
|
|
@ -254,6 +254,7 @@ static const struct soc15_reg_golden golden_settings_sdma_4_3[] = {
|
||||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
||||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
||||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0),
|
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0),
|
||||||
|
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_WATERMK, 0xfc000000, 0x00000000)
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 sdma_v4_0_get_reg_offset(struct amdgpu_device *adev,
|
static u32 sdma_v4_0_get_reg_offset(struct amdgpu_device *adev,
|
||||||
|
|
|
@ -24,15 +24,20 @@
|
||||||
# It calculates Bandwidth and Watermarks values for HW programming
|
# It calculates Bandwidth and Watermarks values for HW programming
|
||||||
#
|
#
|
||||||
|
|
||||||
ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
|
calcs_ccflags := -mhard-float -msse
|
||||||
cc_stack_align := -mpreferred-stack-boundary=4
|
|
||||||
else ifneq ($(call cc-option, -mstack-alignment=16),)
|
ifdef CONFIG_CC_IS_GCC
|
||||||
cc_stack_align := -mstack-alignment=16
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
|
IS_OLD_GCC = 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
calcs_ccflags := -mhard-float -msse $(cc_stack_align)
|
ifdef IS_OLD_GCC
|
||||||
|
# Stack alignment mismatch, proceed with caution.
|
||||||
ifdef CONFIG_CC_IS_CLANG
|
# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
|
||||||
|
# (8B stack alignment).
|
||||||
|
calcs_ccflags += -mpreferred-stack-boundary=4
|
||||||
|
else
|
||||||
calcs_ccflags += -msse2
|
calcs_ccflags += -msse2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -580,6 +580,10 @@ static bool construct(struct dc *dc,
|
||||||
#ifdef CONFIG_DRM_AMD_DC_DCN2_0
|
#ifdef CONFIG_DRM_AMD_DC_DCN2_0
|
||||||
// Allocate memory for the vm_helper
|
// Allocate memory for the vm_helper
|
||||||
dc->vm_helper = kzalloc(sizeof(struct vm_helper), GFP_KERNEL);
|
dc->vm_helper = kzalloc(sizeof(struct vm_helper), GFP_KERNEL);
|
||||||
|
if (!dc->vm_helper) {
|
||||||
|
dm_error("%s: failed to create dc->vm_helper\n", __func__);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
memcpy(&dc->bb_overrides, &init_params->bb_overrides, sizeof(dc->bb_overrides));
|
memcpy(&dc->bb_overrides, &init_params->bb_overrides, sizeof(dc->bb_overrides));
|
||||||
|
|
|
@ -2767,6 +2767,15 @@ void core_link_enable_stream(
|
||||||
CONTROLLER_DP_TEST_PATTERN_VIDEOMODE,
|
CONTROLLER_DP_TEST_PATTERN_VIDEOMODE,
|
||||||
COLOR_DEPTH_UNDEFINED);
|
COLOR_DEPTH_UNDEFINED);
|
||||||
|
|
||||||
|
/* This second call is needed to reconfigure the DIG
|
||||||
|
* as a workaround for the incorrect value being applied
|
||||||
|
* from transmitter control.
|
||||||
|
*/
|
||||||
|
if (!dc_is_virtual_signal(pipe_ctx->stream->signal))
|
||||||
|
stream->link->link_enc->funcs->setup(
|
||||||
|
stream->link->link_enc,
|
||||||
|
pipe_ctx->stream->signal);
|
||||||
|
|
||||||
#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
|
#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
|
||||||
if (pipe_ctx->stream->timing.flags.DSC) {
|
if (pipe_ctx->stream->timing.flags.DSC) {
|
||||||
if (dc_is_dp_signal(pipe_ctx->stream->signal) ||
|
if (dc_is_dp_signal(pipe_ctx->stream->signal) ||
|
||||||
|
|
|
@ -374,6 +374,7 @@ void dal_ddc_service_i2c_query_dp_dual_mode_adaptor(
|
||||||
enum display_dongle_type *dongle = &sink_cap->dongle_type;
|
enum display_dongle_type *dongle = &sink_cap->dongle_type;
|
||||||
uint8_t type2_dongle_buf[DP_ADAPTOR_TYPE2_SIZE];
|
uint8_t type2_dongle_buf[DP_ADAPTOR_TYPE2_SIZE];
|
||||||
bool is_type2_dongle = false;
|
bool is_type2_dongle = false;
|
||||||
|
int retry_count = 2;
|
||||||
struct dp_hdmi_dongle_signature_data *dongle_signature;
|
struct dp_hdmi_dongle_signature_data *dongle_signature;
|
||||||
|
|
||||||
/* Assume we have no valid DP passive dongle connected */
|
/* Assume we have no valid DP passive dongle connected */
|
||||||
|
@ -386,13 +387,24 @@ void dal_ddc_service_i2c_query_dp_dual_mode_adaptor(
|
||||||
DP_HDMI_DONGLE_ADDRESS,
|
DP_HDMI_DONGLE_ADDRESS,
|
||||||
type2_dongle_buf,
|
type2_dongle_buf,
|
||||||
sizeof(type2_dongle_buf))) {
|
sizeof(type2_dongle_buf))) {
|
||||||
*dongle = DISPLAY_DONGLE_DP_DVI_DONGLE;
|
/* Passive HDMI dongles can sometimes fail here without retrying*/
|
||||||
sink_cap->max_hdmi_pixel_clock = DP_ADAPTOR_DVI_MAX_TMDS_CLK;
|
while (retry_count > 0) {
|
||||||
|
if (i2c_read(ddc,
|
||||||
|
DP_HDMI_DONGLE_ADDRESS,
|
||||||
|
type2_dongle_buf,
|
||||||
|
sizeof(type2_dongle_buf)))
|
||||||
|
break;
|
||||||
|
retry_count--;
|
||||||
|
}
|
||||||
|
if (retry_count == 0) {
|
||||||
|
*dongle = DISPLAY_DONGLE_DP_DVI_DONGLE;
|
||||||
|
sink_cap->max_hdmi_pixel_clock = DP_ADAPTOR_DVI_MAX_TMDS_CLK;
|
||||||
|
|
||||||
CONN_DATA_DETECT(ddc->link, type2_dongle_buf, sizeof(type2_dongle_buf),
|
CONN_DATA_DETECT(ddc->link, type2_dongle_buf, sizeof(type2_dongle_buf),
|
||||||
"DP-DVI passive dongle %dMhz: ",
|
"DP-DVI passive dongle %dMhz: ",
|
||||||
DP_ADAPTOR_DVI_MAX_TMDS_CLK / 1000);
|
DP_ADAPTOR_DVI_MAX_TMDS_CLK / 1000);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if Type 2 dongle.*/
|
/* Check if Type 2 dongle.*/
|
||||||
|
|
|
@ -404,6 +404,9 @@ bool resource_are_streams_timing_synchronizable(
|
||||||
if (stream1->view_format != stream2->view_format)
|
if (stream1->view_format != stream2->view_format)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (stream1->ignore_msa_timing_param || stream2->ignore_msa_timing_param)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
static bool is_dp_and_hdmi_sharable(
|
static bool is_dp_and_hdmi_sharable(
|
||||||
|
@ -1540,6 +1543,9 @@ bool dc_is_stream_unchanged(
|
||||||
if (!are_stream_backends_same(old_stream, stream))
|
if (!are_stream_backends_same(old_stream, stream))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (old_stream->ignore_msa_timing_param != stream->ignore_msa_timing_param)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -393,6 +393,10 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||||
|
|
||||||
|
rgb_resulted[hw_points].red = rgb_resulted[hw_points - 1].red;
|
||||||
|
rgb_resulted[hw_points].green = rgb_resulted[hw_points - 1].green;
|
||||||
|
rgb_resulted[hw_points].blue = rgb_resulted[hw_points - 1].blue;
|
||||||
|
|
||||||
// All 3 color channels have same x
|
// All 3 color channels have same x
|
||||||
corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||||
dc_fixpt_from_int(region_start));
|
dc_fixpt_from_int(region_start));
|
||||||
|
@ -464,13 +468,6 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||||
|
|
||||||
i = 1;
|
i = 1;
|
||||||
while (i != hw_points + 1) {
|
while (i != hw_points + 1) {
|
||||||
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
|
|
||||||
rgb_plus_1->red = rgb->red;
|
|
||||||
if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
|
|
||||||
rgb_plus_1->green = rgb->green;
|
|
||||||
if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
|
|
||||||
rgb_plus_1->blue = rgb->blue;
|
|
||||||
|
|
||||||
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
||||||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||||
|
@ -562,6 +559,10 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||||
|
|
||||||
|
rgb_resulted[hw_points].red = rgb_resulted[hw_points - 1].red;
|
||||||
|
rgb_resulted[hw_points].green = rgb_resulted[hw_points - 1].green;
|
||||||
|
rgb_resulted[hw_points].blue = rgb_resulted[hw_points - 1].blue;
|
||||||
|
|
||||||
corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||||
dc_fixpt_from_int(region_start));
|
dc_fixpt_from_int(region_start));
|
||||||
corner_points[0].green.x = corner_points[0].red.x;
|
corner_points[0].green.x = corner_points[0].red.x;
|
||||||
|
@ -624,13 +625,6 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||||
|
|
||||||
i = 1;
|
i = 1;
|
||||||
while (i != hw_points + 1) {
|
while (i != hw_points + 1) {
|
||||||
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
|
|
||||||
rgb_plus_1->red = rgb->red;
|
|
||||||
if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
|
|
||||||
rgb_plus_1->green = rgb->green;
|
|
||||||
if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
|
|
||||||
rgb_plus_1->blue = rgb->blue;
|
|
||||||
|
|
||||||
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
||||||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||||
|
|
|
@ -10,15 +10,20 @@ ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
|
||||||
DCN20 += dcn20_dsc.o
|
DCN20 += dcn20_dsc.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
|
CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mhard-float -msse
|
||||||
cc_stack_align := -mpreferred-stack-boundary=4
|
|
||||||
else ifneq ($(call cc-option, -mstack-alignment=16),)
|
ifdef CONFIG_CC_IS_GCC
|
||||||
cc_stack_align := -mstack-alignment=16
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
|
IS_OLD_GCC = 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o := -mhard-float -msse $(cc_stack_align)
|
ifdef IS_OLD_GCC
|
||||||
|
# Stack alignment mismatch, proceed with caution.
|
||||||
ifdef CONFIG_CC_IS_CLANG
|
# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
|
||||||
|
# (8B stack alignment).
|
||||||
|
CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o += -mpreferred-stack-boundary=4
|
||||||
|
else
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o += -msse2
|
CFLAGS_$(AMDDALPATH)/dc/dcn20/dcn20_resource.o += -msse2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -814,7 +814,7 @@ static const struct resource_caps res_cap_nv14 = {
|
||||||
.num_audio = 6,
|
.num_audio = 6,
|
||||||
.num_stream_encoder = 5,
|
.num_stream_encoder = 5,
|
||||||
.num_pll = 5,
|
.num_pll = 5,
|
||||||
.num_dwb = 0,
|
.num_dwb = 1,
|
||||||
.num_ddc = 5,
|
.num_ddc = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,15 +3,20 @@
|
||||||
|
|
||||||
DCN21 = dcn21_hubp.o dcn21_hubbub.o dcn21_resource.o
|
DCN21 = dcn21_hubp.o dcn21_hubbub.o dcn21_resource.o
|
||||||
|
|
||||||
ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
|
CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mhard-float -msse
|
||||||
cc_stack_align := -mpreferred-stack-boundary=4
|
|
||||||
else ifneq ($(call cc-option, -mstack-alignment=16),)
|
ifdef CONFIG_CC_IS_GCC
|
||||||
cc_stack_align := -mstack-alignment=16
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
|
IS_OLD_GCC = 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o := -mhard-float -msse $(cc_stack_align)
|
ifdef IS_OLD_GCC
|
||||||
|
# Stack alignment mismatch, proceed with caution.
|
||||||
ifdef CONFIG_CC_IS_CLANG
|
# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
|
||||||
|
# (8B stack alignment).
|
||||||
|
CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o += -mpreferred-stack-boundary=4
|
||||||
|
else
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o += -msse2
|
CFLAGS_$(AMDDALPATH)/dc/dcn21/dcn21_resource.o += -msse2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -24,15 +24,20 @@
|
||||||
# It provides the general basic services required by other DAL
|
# It provides the general basic services required by other DAL
|
||||||
# subcomponents.
|
# subcomponents.
|
||||||
|
|
||||||
ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
|
dml_ccflags := -mhard-float -msse
|
||||||
cc_stack_align := -mpreferred-stack-boundary=4
|
|
||||||
else ifneq ($(call cc-option, -mstack-alignment=16),)
|
ifdef CONFIG_CC_IS_GCC
|
||||||
cc_stack_align := -mstack-alignment=16
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
|
IS_OLD_GCC = 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
dml_ccflags := -mhard-float -msse $(cc_stack_align)
|
ifdef IS_OLD_GCC
|
||||||
|
# Stack alignment mismatch, proceed with caution.
|
||||||
ifdef CONFIG_CC_IS_CLANG
|
# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
|
||||||
|
# (8B stack alignment).
|
||||||
|
dml_ccflags += -mpreferred-stack-boundary=4
|
||||||
|
else
|
||||||
dml_ccflags += -msse2
|
dml_ccflags += -msse2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -2577,7 +2577,8 @@ static void dml20_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPer
|
||||||
mode_lib->vba.MinActiveDRAMClockChangeMargin
|
mode_lib->vba.MinActiveDRAMClockChangeMargin
|
||||||
+ mode_lib->vba.DRAMClockChangeLatency;
|
+ mode_lib->vba.DRAMClockChangeLatency;
|
||||||
|
|
||||||
if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 0) {
|
if (mode_lib->vba.MinActiveDRAMClockChangeMargin > 50) {
|
||||||
|
mode_lib->vba.DRAMClockChangeWatermark += 25;
|
||||||
mode_lib->vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
|
mode_lib->vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
|
||||||
} else {
|
} else {
|
||||||
if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) {
|
if (mode_lib->vba.SynchronizedVBlank || mode_lib->vba.NumberOfActivePlanes == 1) {
|
||||||
|
|
|
@ -1,15 +1,20 @@
|
||||||
#
|
#
|
||||||
# Makefile for the 'dsc' sub-component of DAL.
|
# Makefile for the 'dsc' sub-component of DAL.
|
||||||
|
|
||||||
ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
|
dsc_ccflags := -mhard-float -msse
|
||||||
cc_stack_align := -mpreferred-stack-boundary=4
|
|
||||||
else ifneq ($(call cc-option, -mstack-alignment=16),)
|
ifdef CONFIG_CC_IS_GCC
|
||||||
cc_stack_align := -mstack-alignment=16
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
|
IS_OLD_GCC = 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
dsc_ccflags := -mhard-float -msse $(cc_stack_align)
|
ifdef IS_OLD_GCC
|
||||||
|
# Stack alignment mismatch, proceed with caution.
|
||||||
ifdef CONFIG_CC_IS_CLANG
|
# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
|
||||||
|
# (8B stack alignment).
|
||||||
|
dsc_ccflags += -mpreferred-stack-boundary=4
|
||||||
|
else
|
||||||
dsc_ccflags += -msse2
|
dsc_ccflags += -msse2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -5098,9 +5098,7 @@ static void vega10_odn_update_soc_table(struct pp_hwmgr *hwmgr,
|
||||||
|
|
||||||
if (type == PP_OD_EDIT_SCLK_VDDC_TABLE) {
|
if (type == PP_OD_EDIT_SCLK_VDDC_TABLE) {
|
||||||
podn_vdd_dep = &data->odn_dpm_table.vdd_dep_on_sclk;
|
podn_vdd_dep = &data->odn_dpm_table.vdd_dep_on_sclk;
|
||||||
for (i = 0; i < podn_vdd_dep->count - 1; i++)
|
for (i = 0; i < podn_vdd_dep->count; i++)
|
||||||
od_vddc_lookup_table->entries[i].us_vdd = podn_vdd_dep->entries[i].vddc;
|
|
||||||
if (od_vddc_lookup_table->entries[i].us_vdd < podn_vdd_dep->entries[i].vddc)
|
|
||||||
od_vddc_lookup_table->entries[i].us_vdd = podn_vdd_dep->entries[i].vddc;
|
od_vddc_lookup_table->entries[i].us_vdd = podn_vdd_dep->entries[i].vddc;
|
||||||
} else if (type == PP_OD_EDIT_MCLK_VDDC_TABLE) {
|
} else if (type == PP_OD_EDIT_MCLK_VDDC_TABLE) {
|
||||||
podn_vdd_dep = &data->odn_dpm_table.vdd_dep_on_mclk;
|
podn_vdd_dep = &data->odn_dpm_table.vdd_dep_on_mclk;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue