Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
drivers/net/can/dev.cb552766c87
("can: dev: prevent potential information leak in can_fill_info()")3e77f70e73
("can: dev: move driver related infrastructure into separate subdir")0a042c6ec9
("can: dev: move netlink related code into seperate file") Code move. drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c57ac4a31c4
("net/mlx5e: Correctly handle changing the number of queues when the interface is down")214baf2287
("net/mlx5e: Support HTB offload") Adjacent code changes net/switchdev/switchdev.c20776b465c
("net: switchdev: don't set port_obj_info->handled true when -EOPNOTSUPP")ffb68fc58e
("net: switchdev: remove the transaction structure from port object notifiers")bae33f2b5a
("net: switchdev: remove the transaction structure from port attributes") Transaction parameter gets dropped otherwise keep the fix. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Коммит
c358f95205
3
.mailmap
3
.mailmap
|
@ -9,9 +9,6 @@
|
|||
#
|
||||
# Please keep this list dictionary sorted.
|
||||
#
|
||||
# This comment is parsed by git-shortlog:
|
||||
# repo-abbrev: /pub/scm/linux/kernel/git/
|
||||
#
|
||||
Aaron Durbin <adurbin@google.com>
|
||||
Adam Oldham <oldhamca@gmail.com>
|
||||
Adam Radford <aradford@gmail.com>
|
||||
|
|
|
@ -5,8 +5,8 @@ Description:
|
|||
Provide a place in sysfs for the device link objects in the
|
||||
kernel at any given time. The name of a device link directory,
|
||||
denoted as ... above, is of the form <supplier>--<consumer>
|
||||
where <supplier> is the supplier device name and <consumer> is
|
||||
the consumer device name.
|
||||
where <supplier> is the supplier bus:device name and <consumer>
|
||||
is the consumer bus:device name.
|
||||
|
||||
What: /sys/class/devlink/.../auto_remove_on
|
||||
Date: May 2020
|
||||
|
|
|
@ -4,5 +4,6 @@ Contact: Saravana Kannan <saravanak@google.com>
|
|||
Description:
|
||||
The /sys/devices/.../consumer:<consumer> are symlinks to device
|
||||
links where this device is the supplier. <consumer> denotes the
|
||||
name of the consumer in that device link. There can be zero or
|
||||
more of these symlinks for a given device.
|
||||
name of the consumer in that device link and is of the form
|
||||
bus:device name. There can be zero or more of these symlinks
|
||||
for a given device.
|
||||
|
|
|
@ -4,5 +4,6 @@ Contact: Saravana Kannan <saravanak@google.com>
|
|||
Description:
|
||||
The /sys/devices/.../supplier:<supplier> are symlinks to device
|
||||
links where this device is the consumer. <supplier> denotes the
|
||||
name of the supplier in that device link. There can be zero or
|
||||
more of these symlinks for a given device.
|
||||
name of the supplier in that device link and is of the form
|
||||
bus:device name. There can be zero or more of these symlinks
|
||||
for a given device.
|
||||
|
|
|
@ -916,21 +916,25 @@ Date: September 2014
|
|||
Contact: Subhash Jadavani <subhashj@codeaurora.org>
|
||||
Description: This entry could be used to set or show the UFS device
|
||||
runtime power management level. The current driver
|
||||
implementation supports 6 levels with next target states:
|
||||
implementation supports 7 levels with next target states:
|
||||
|
||||
== ====================================================
|
||||
0 an UFS device will stay active, an UIC link will
|
||||
0 UFS device will stay active, UIC link will
|
||||
stay active
|
||||
1 an UFS device will stay active, an UIC link will
|
||||
1 UFS device will stay active, UIC link will
|
||||
hibernate
|
||||
2 an UFS device will moved to sleep, an UIC link will
|
||||
2 UFS device will be moved to sleep, UIC link will
|
||||
stay active
|
||||
3 an UFS device will moved to sleep, an UIC link will
|
||||
3 UFS device will be moved to sleep, UIC link will
|
||||
hibernate
|
||||
4 an UFS device will be powered off, an UIC link will
|
||||
4 UFS device will be powered off, UIC link will
|
||||
hibernate
|
||||
5 an UFS device will be powered off, an UIC link will
|
||||
5 UFS device will be powered off, UIC link will
|
||||
be powered off
|
||||
6 UFS device will be moved to deep sleep, UIC link
|
||||
will be powered off. Note, deep sleep might not be
|
||||
supported in which case this value will not be
|
||||
accepted
|
||||
== ====================================================
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/rpm_target_dev_state
|
||||
|
@ -954,21 +958,25 @@ Date: September 2014
|
|||
Contact: Subhash Jadavani <subhashj@codeaurora.org>
|
||||
Description: This entry could be used to set or show the UFS device
|
||||
system power management level. The current driver
|
||||
implementation supports 6 levels with next target states:
|
||||
implementation supports 7 levels with next target states:
|
||||
|
||||
== ====================================================
|
||||
0 an UFS device will stay active, an UIC link will
|
||||
0 UFS device will stay active, UIC link will
|
||||
stay active
|
||||
1 an UFS device will stay active, an UIC link will
|
||||
1 UFS device will stay active, UIC link will
|
||||
hibernate
|
||||
2 an UFS device will moved to sleep, an UIC link will
|
||||
2 UFS device will be moved to sleep, UIC link will
|
||||
stay active
|
||||
3 an UFS device will moved to sleep, an UIC link will
|
||||
3 UFS device will be moved to sleep, UIC link will
|
||||
hibernate
|
||||
4 an UFS device will be powered off, an UIC link will
|
||||
4 UFS device will be powered off, UIC link will
|
||||
hibernate
|
||||
5 an UFS device will be powered off, an UIC link will
|
||||
5 UFS device will be powered off, UIC link will
|
||||
be powered off
|
||||
6 UFS device will be moved to deep sleep, UIC link
|
||||
will be powered off. Note, deep sleep might not be
|
||||
supported in which case this value will not be
|
||||
accepted
|
||||
== ====================================================
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/spm_target_dev_state
|
||||
|
|
|
@ -177,14 +177,20 @@ bitmap_flush_interval:number
|
|||
The bitmap flush interval in milliseconds. The metadata buffers
|
||||
are synchronized when this interval expires.
|
||||
|
||||
allow_discards
|
||||
Allow block discard requests (a.k.a. TRIM) for the integrity device.
|
||||
Discards are only allowed to devices using internal hash.
|
||||
|
||||
fix_padding
|
||||
Use a smaller padding of the tag area that is more
|
||||
space-efficient. If this option is not present, large padding is
|
||||
used - that is for compatibility with older kernels.
|
||||
|
||||
allow_discards
|
||||
Allow block discard requests (a.k.a. TRIM) for the integrity device.
|
||||
Discards are only allowed to devices using internal hash.
|
||||
legacy_recalculate
|
||||
Allow recalculating of volumes with HMAC keys. This is disabled by
|
||||
default for security reasons - an attacker could modify the volume,
|
||||
set recalc_sector to zero, and the kernel would not detect the
|
||||
modification.
|
||||
|
||||
The journal mode (D/J), buffer_sectors, journal_watermark, commit_time and
|
||||
allow_discards can be changed when reloading the target (load an inactive
|
||||
|
|
|
@ -160,29 +160,14 @@ intended for use in production as a security mitigation. Therefore it supports
|
|||
boot parameters that allow to disable KASAN competely or otherwise control
|
||||
particular KASAN features.
|
||||
|
||||
The things that can be controlled are:
|
||||
- ``kasan=off`` or ``=on`` controls whether KASAN is enabled (default: ``on``).
|
||||
|
||||
1. Whether KASAN is enabled at all.
|
||||
2. Whether KASAN collects and saves alloc/free stacks.
|
||||
3. Whether KASAN panics on a detected bug or not.
|
||||
- ``kasan.stacktrace=off`` or ``=on`` disables or enables alloc and free stack
|
||||
traces collection (default: ``on`` for ``CONFIG_DEBUG_KERNEL=y``, otherwise
|
||||
``off``).
|
||||
|
||||
The ``kasan.mode`` boot parameter allows to choose one of three main modes:
|
||||
|
||||
- ``kasan.mode=off`` - KASAN is disabled, no tag checks are performed
|
||||
- ``kasan.mode=prod`` - only essential production features are enabled
|
||||
- ``kasan.mode=full`` - all KASAN features are enabled
|
||||
|
||||
The chosen mode provides default control values for the features mentioned
|
||||
above. However it's also possible to override the default values by providing:
|
||||
|
||||
- ``kasan.stacktrace=off`` or ``=on`` - enable alloc/free stack collection
|
||||
(default: ``on`` for ``mode=full``,
|
||||
otherwise ``off``)
|
||||
- ``kasan.fault=report`` or ``=panic`` - only print KASAN report or also panic
|
||||
(default: ``report``)
|
||||
|
||||
If ``kasan.mode`` parameter is not provided, it defaults to ``full`` when
|
||||
``CONFIG_DEBUG_KERNEL`` is enabled, and to ``prod`` otherwise.
|
||||
- ``kasan.fault=report`` or ``=panic`` controls whether to only print a KASAN
|
||||
report or also panic the kernel (default: ``report``).
|
||||
|
||||
For developers
|
||||
~~~~~~~~~~~~~~
|
||||
|
|
|
@ -522,6 +522,63 @@ There's more boilerplate involved, but it can:
|
|||
* E.g. if we wanted to also test ``sha256sum``, we could add a ``sha256``
|
||||
field and reuse ``cases``.
|
||||
|
||||
* be converted to a "parameterized test", see below.
|
||||
|
||||
Parameterized Testing
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The table-driven testing pattern is common enough that KUnit has special
|
||||
support for it.
|
||||
|
||||
Reusing the same ``cases`` array from above, we can write the test as a
|
||||
"parameterized test" with the following.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
// This is copy-pasted from above.
|
||||
struct sha1_test_case {
|
||||
const char *str;
|
||||
const char *sha1;
|
||||
};
|
||||
struct sha1_test_case cases[] = {
|
||||
{
|
||||
.str = "hello world",
|
||||
.sha1 = "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed",
|
||||
},
|
||||
{
|
||||
.str = "hello world!",
|
||||
.sha1 = "430ce34d020724ed75a196dfc2ad67c77772d169",
|
||||
},
|
||||
};
|
||||
|
||||
// Need a helper function to generate a name for each test case.
|
||||
static void case_to_desc(const struct sha1_test_case *t, char *desc)
|
||||
{
|
||||
strcpy(desc, t->str);
|
||||
}
|
||||
// Creates `sha1_gen_params()` to iterate over `cases`.
|
||||
KUNIT_ARRAY_PARAM(sha1, cases, case_to_desc);
|
||||
|
||||
// Looks no different from a normal test.
|
||||
static void sha1_test(struct kunit *test)
|
||||
{
|
||||
// This function can just contain the body of the for-loop.
|
||||
// The former `cases[i]` is accessible under test->param_value.
|
||||
char out[40];
|
||||
struct sha1_test_case *test_param = (struct sha1_test_case *)(test->param_value);
|
||||
|
||||
sha1sum(test_param->str, out);
|
||||
KUNIT_EXPECT_STREQ_MSG(test, (char *)out, test_param->sha1,
|
||||
"sha1sum(%s)", test_param->str);
|
||||
}
|
||||
|
||||
// Instead of KUNIT_CASE, we use KUNIT_CASE_PARAM and pass in the
|
||||
// function declared by KUNIT_ARRAY_PARAM.
|
||||
static struct kunit_case sha1_test_cases[] = {
|
||||
KUNIT_CASE_PARAM(sha1_test, sha1_gen_params),
|
||||
{}
|
||||
};
|
||||
|
||||
.. _kunit-on-non-uml:
|
||||
|
||||
KUnit on non-UML architectures
|
||||
|
|
|
@ -16,8 +16,8 @@ description:
|
|||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- bosch,bmc150
|
||||
- bosch,bmi055
|
||||
- bosch,bmc150_accel
|
||||
- bosch,bmi055_accel
|
||||
- bosch,bma255
|
||||
- bosch,bma250e
|
||||
- bosch,bma222
|
||||
|
|
|
@ -7,8 +7,8 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||
title: Mediatek MT8192 with MT6359, RT1015 and RT5682 ASoC sound card driver
|
||||
|
||||
maintainers:
|
||||
- Jiaxin Yu <jiaxin.yu@mediatek.com>
|
||||
- Shane Chien <shane.chien@mediatek.com>
|
||||
- Jiaxin Yu <jiaxin.yu@mediatek.com>
|
||||
- Shane Chien <shane.chien@mediatek.com>
|
||||
|
||||
description:
|
||||
This binding describes the MT8192 sound card.
|
||||
|
|
|
@ -1807,12 +1807,24 @@ seg6_flowlabel - INTEGER
|
|||
``conf/default/*``:
|
||||
Change the interface-specific default settings.
|
||||
|
||||
These settings would be used during creating new interfaces.
|
||||
|
||||
|
||||
``conf/all/*``:
|
||||
Change all the interface-specific settings.
|
||||
|
||||
[XXX: Other special features than forwarding?]
|
||||
|
||||
conf/all/disable_ipv6 - BOOLEAN
|
||||
Changing this value is same as changing ``conf/default/disable_ipv6``
|
||||
setting and also all per-interface ``disable_ipv6`` settings to the same
|
||||
value.
|
||||
|
||||
Reading this value does not have any particular meaning. It does not say
|
||||
whether IPv6 support is enabled or disabled. Returned value can be 1
|
||||
also in the case when some interface has ``disable_ipv6`` set to 0 and
|
||||
has configured IPv6 addresses.
|
||||
|
||||
conf/all/forwarding - BOOLEAN
|
||||
Enable global IPv6 forwarding between all interfaces.
|
||||
|
||||
|
|
|
@ -360,10 +360,9 @@ since the last call to this ioctl. Bit 0 is the first page in the
|
|||
memory slot. Ensure the entire structure is cleared to avoid padding
|
||||
issues.
|
||||
|
||||
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 specifies
|
||||
the address space for which you want to return the dirty bitmap.
|
||||
They must be less than the value that KVM_CHECK_EXTENSION returns for
|
||||
the KVM_CAP_MULTI_ADDRESS_SPACE capability.
|
||||
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of slot field specifies
|
||||
the address space for which you want to return the dirty bitmap. See
|
||||
KVM_SET_USER_MEMORY_REGION for details on the usage of slot field.
|
||||
|
||||
The bits in the dirty bitmap are cleared before the ioctl returns, unless
|
||||
KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 is enabled. For more information,
|
||||
|
@ -1281,6 +1280,9 @@ field userspace_addr, which must point at user addressable memory for
|
|||
the entire memory slot size. Any object may back this memory, including
|
||||
anonymous memory, ordinary files, and hugetlbfs.
|
||||
|
||||
On architectures that support a form of address tagging, userspace_addr must
|
||||
be an untagged address.
|
||||
|
||||
It is recommended that the lower 21 bits of guest_phys_addr and userspace_addr
|
||||
be identical. This allows large pages in the guest to be backed by large
|
||||
pages in the host.
|
||||
|
@ -1333,7 +1335,7 @@ documentation when it pops into existence).
|
|||
|
||||
:Capability: KVM_CAP_ENABLE_CAP_VM
|
||||
:Architectures: all
|
||||
:Type: vcpu ioctl
|
||||
:Type: vm ioctl
|
||||
:Parameters: struct kvm_enable_cap (in)
|
||||
:Returns: 0 on success; -1 on error
|
||||
|
||||
|
@ -4432,7 +4434,7 @@ to I/O ports.
|
|||
:Capability: KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2
|
||||
:Architectures: x86, arm, arm64, mips
|
||||
:Type: vm ioctl
|
||||
:Parameters: struct kvm_dirty_log (in)
|
||||
:Parameters: struct kvm_clear_dirty_log (in)
|
||||
:Returns: 0 on success, -1 on error
|
||||
|
||||
::
|
||||
|
@ -4459,10 +4461,9 @@ in KVM's dirty bitmap, and dirty tracking is re-enabled for that page
|
|||
(for example via write-protection, or by clearing the dirty bit in
|
||||
a page table entry).
|
||||
|
||||
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 specifies
|
||||
the address space for which you want to return the dirty bitmap.
|
||||
They must be less than the value that KVM_CHECK_EXTENSION returns for
|
||||
the KVM_CAP_MULTI_ADDRESS_SPACE capability.
|
||||
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of slot field specifies
|
||||
the address space for which you want to clear the dirty status. See
|
||||
KVM_SET_USER_MEMORY_REGION for details on the usage of slot field.
|
||||
|
||||
This ioctl is mostly useful when KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2
|
||||
is enabled; for more information, see the description of the capability.
|
||||
|
|
29
MAINTAINERS
29
MAINTAINERS
|
@ -3247,6 +3247,7 @@ L: netdev@vger.kernel.org
|
|||
S: Supported
|
||||
W: http://sourceforge.net/projects/bonding/
|
||||
F: drivers/net/bonding/
|
||||
F: include/net/bonding.h
|
||||
F: include/uapi/linux/if_bonding.h
|
||||
|
||||
BOSCH SENSORTEC BMA400 ACCELEROMETER IIO DRIVER
|
||||
|
@ -3420,7 +3421,7 @@ F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
|||
F: drivers/pci/controller/pcie-brcmstb.c
|
||||
F: drivers/staging/vc04_services
|
||||
N: bcm2711
|
||||
N: bcm2835
|
||||
N: bcm283*
|
||||
|
||||
BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
|
@ -3899,7 +3900,7 @@ F: Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt
|
|||
F: drivers/mtd/nand/raw/cadence-nand-controller.c
|
||||
|
||||
CADENCE USB3 DRD IP DRIVER
|
||||
M: Peter Chen <peter.chen@nxp.com>
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
M: Pawel Laszczak <pawell@cadence.com>
|
||||
R: Roger Quadros <rogerq@kernel.org>
|
||||
R: Aswath Govindraju <a-govindraju@ti.com>
|
||||
|
@ -4184,7 +4185,7 @@ S: Maintained
|
|||
F: Documentation/translations/zh_CN/
|
||||
|
||||
CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
|
||||
M: Peter Chen <Peter.Chen@nxp.com>
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
||||
|
@ -4334,7 +4335,9 @@ W: https://clangbuiltlinux.github.io/
|
|||
B: https://github.com/ClangBuiltLinux/linux/issues
|
||||
C: irc://chat.freenode.net/clangbuiltlinux
|
||||
F: Documentation/kbuild/llvm.rst
|
||||
F: include/linux/compiler-clang.h
|
||||
F: scripts/clang-tools/
|
||||
F: scripts/clang-version.sh
|
||||
F: scripts/lld-version.sh
|
||||
K: \b(?i:clang|llvm)\b
|
||||
|
||||
|
@ -8454,11 +8457,8 @@ F: drivers/i3c/
|
|||
F: include/linux/i3c/
|
||||
|
||||
IA64 (Itanium) PLATFORM
|
||||
M: Tony Luck <tony.luck@intel.com>
|
||||
M: Fenghua Yu <fenghua.yu@intel.com>
|
||||
L: linux-ia64@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
|
||||
S: Orphan
|
||||
F: Documentation/ia64/
|
||||
F: arch/ia64/
|
||||
|
||||
|
@ -12436,6 +12436,7 @@ F: tools/testing/selftests/net/ipsec.c
|
|||
NETWORKING [IPv4/IPv6]
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
|
||||
M: David Ahern <dsahern@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
|
||||
|
@ -14527,10 +14528,18 @@ S: Supported
|
|||
F: drivers/crypto/qat/
|
||||
|
||||
QCOM AUDIO (ASoC) DRIVERS
|
||||
M: Patrick Lai <plai@codeaurora.org>
|
||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
M: Banajit Goswami <bgoswami@codeaurora.org>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: sound/soc/codecs/lpass-va-macro.c
|
||||
F: sound/soc/codecs/lpass-wsa-macro.*
|
||||
F: sound/soc/codecs/msm8916-wcd-analog.c
|
||||
F: sound/soc/codecs/msm8916-wcd-digital.c
|
||||
F: sound/soc/codecs/wcd9335.*
|
||||
F: sound/soc/codecs/wcd934x.c
|
||||
F: sound/soc/codecs/wcd-clsh-v2.*
|
||||
F: sound/soc/codecs/wsa881x.c
|
||||
F: sound/soc/qcom/
|
||||
|
||||
QCOM IPA DRIVER
|
||||
|
@ -16982,7 +16991,7 @@ M: Olivier Moysan <olivier.moysan@st.com>
|
|||
M: Arnaud Pouliquen <arnaud.pouliquen@st.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/st,stm32-*.txt
|
||||
F: Documentation/devicetree/bindings/iio/adc/st,stm32-*.yaml
|
||||
F: sound/soc/stm/
|
||||
|
||||
STM32 TIMER/LPTIMER DRIVERS
|
||||
|
@ -18435,7 +18444,7 @@ F: Documentation/usb/ohci.rst
|
|||
F: drivers/usb/host/ohci*
|
||||
|
||||
USB OTG FSM (Finite State Machine)
|
||||
M: Peter Chen <Peter.Chen@nxp.com>
|
||||
M: Peter Chen <peter.chen@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
|||
VERSION = 5
|
||||
PATCHLEVEL = 11
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -16,6 +16,13 @@
|
|||
stdout-path = &uart1;
|
||||
};
|
||||
|
||||
aliases {
|
||||
mmc0 = &usdhc2;
|
||||
mmc1 = &usdhc3;
|
||||
mmc2 = &usdhc4;
|
||||
/delete-property/ mmc3;
|
||||
};
|
||||
|
||||
memory@10000000 {
|
||||
device_type = "memory";
|
||||
reg = <0x10000000 0x80000000>;
|
||||
|
|
|
@ -418,7 +418,7 @@
|
|||
|
||||
/* VDD_AUD_1P8: Audio codec */
|
||||
reg_aud_1p8v: ldo3 {
|
||||
regulator-name = "vdd1p8";
|
||||
regulator-name = "vdd1p8a";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-boot-on;
|
||||
|
|
|
@ -137,7 +137,7 @@
|
|||
|
||||
lcd_backlight: lcd-backlight {
|
||||
compatible = "pwm-backlight";
|
||||
pwms = <&pwm4 0 5000000>;
|
||||
pwms = <&pwm4 0 5000000 0>;
|
||||
pwm-names = "LCD_BKLT_PWM";
|
||||
|
||||
brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
|
||||
|
@ -167,7 +167,7 @@
|
|||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabld";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c_cam: i2c-gpio-cam {
|
||||
|
@ -179,7 +179,7 @@
|
|||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabld";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -53,7 +53,6 @@
|
|||
&fec {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_microsom_enet_ar8035>;
|
||||
phy-handle = <&phy>;
|
||||
phy-mode = "rgmii-id";
|
||||
phy-reset-duration = <2>;
|
||||
phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
|
||||
|
@ -63,10 +62,19 @@
|
|||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
phy: ethernet-phy@0 {
|
||||
/*
|
||||
* The PHY can appear at either address 0 or 4 due to the
|
||||
* configuration (LED) pin not being pulled sufficiently.
|
||||
*/
|
||||
ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
qca,clk-out-frequency = <125000000>;
|
||||
};
|
||||
|
||||
ethernet-phy@4 {
|
||||
reg = <4>;
|
||||
qca,clk-out-frequency = <125000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
compatible = "nxp,pcf2127";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <2000000>;
|
||||
reset-source;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -12,4 +12,42 @@
|
|||
200000 0>;
|
||||
};
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
/* Modem trace memory */
|
||||
ram@06000000 {
|
||||
reg = <0x06000000 0x00f00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/* Modem shared memory */
|
||||
ram@06f00000 {
|
||||
reg = <0x06f00000 0x00100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/* Modem private memory */
|
||||
ram@07000000 {
|
||||
reg = <0x07000000 0x01000000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/*
|
||||
* Initial Secure Software ISSW memory
|
||||
*
|
||||
* This is probably only used if the kernel tries
|
||||
* to actually call into trustzone to run secure
|
||||
* applications, which the mainline kernel probably
|
||||
* will not do on this old chipset. But you can never
|
||||
* be too careful, so reserve this memory anyway.
|
||||
*/
|
||||
ram@17f00000 {
|
||||
reg = <0x17f00000 0x00100000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -12,4 +12,42 @@
|
|||
200000 0>;
|
||||
};
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
/* Modem trace memory */
|
||||
ram@06000000 {
|
||||
reg = <0x06000000 0x00f00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/* Modem shared memory */
|
||||
ram@06f00000 {
|
||||
reg = <0x06f00000 0x00100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/* Modem private memory */
|
||||
ram@07000000 {
|
||||
reg = <0x07000000 0x01000000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/*
|
||||
* Initial Secure Software ISSW memory
|
||||
*
|
||||
* This is probably only used if the kernel tries
|
||||
* to actually call into trustzone to run secure
|
||||
* applications, which the mainline kernel probably
|
||||
* will not do on this old chipset. But you can never
|
||||
* be too careful, so reserve this memory anyway.
|
||||
*/
|
||||
ram@17f00000 {
|
||||
reg = <0x17f00000 0x00100000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "ste-dbx5x0.dtsi"
|
||||
|
||||
/ {
|
||||
cpus {
|
||||
cpu@300 {
|
||||
/* cpufreq controls */
|
||||
operating-points = <1152000 0
|
||||
800000 0
|
||||
400000 0
|
||||
200000 0>;
|
||||
};
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
/*
|
||||
* Initial Secure Software ISSW memory
|
||||
*
|
||||
* This is probably only used if the kernel tries
|
||||
* to actually call into trustzone to run secure
|
||||
* applications, which the mainline kernel probably
|
||||
* will not do on this old chipset. But you can never
|
||||
* be too careful, so reserve this memory anyway.
|
||||
*/
|
||||
ram@17f00000 {
|
||||
reg = <0x17f00000 0x00100000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -4,7 +4,7 @@
|
|||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "ste-db8500.dtsi"
|
||||
#include "ste-db9500.dtsi"
|
||||
#include "ste-href-ab8500.dtsi"
|
||||
#include "ste-href-family-pinctrl.dtsi"
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
#define MX6Q_CCM_CCR 0x0
|
||||
|
||||
.align 3
|
||||
.arm
|
||||
|
||||
.macro sync_l2_cache
|
||||
|
||||
|
|
|
@ -4,11 +4,16 @@
|
|||
*/
|
||||
usb {
|
||||
compatible = "simple-bus";
|
||||
dma-ranges;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges = <0x0 0x0 0x0 0x68500000 0x0 0x00400000>;
|
||||
|
||||
/*
|
||||
* Internally, USB bus to the interconnect can only address up
|
||||
* to 40-bit
|
||||
*/
|
||||
dma-ranges = <0 0 0 0 0x100 0x0>;
|
||||
|
||||
usbphy0: usb-phy@0 {
|
||||
compatible = "brcm,sr-usb-combo-phy";
|
||||
reg = <0x0 0x00000000 0x0 0x100>;
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
reboot {
|
||||
compatible ="syscon-reboot";
|
||||
regmap = <&rst>;
|
||||
offset = <0xb0>;
|
||||
offset = <0>;
|
||||
mask = <0x02>;
|
||||
};
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@
|
|||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
spba: bus@30000000 {
|
||||
spba: spba-bus@30000000 {
|
||||
compatible = "fsl,spba-bus", "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
|
|
@ -266,7 +266,7 @@
|
|||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
gpio-ranges = <&iomuxc 0 56 26>, <&iomuxc 0 144 4>;
|
||||
gpio-ranges = <&iomuxc 0 56 26>, <&iomuxc 26 144 4>;
|
||||
};
|
||||
|
||||
gpio4: gpio@30230000 {
|
||||
|
|
|
@ -991,8 +991,6 @@ CONFIG_ARCH_TEGRA_210_SOC=y
|
|||
CONFIG_ARCH_TEGRA_186_SOC=y
|
||||
CONFIG_ARCH_TEGRA_194_SOC=y
|
||||
CONFIG_ARCH_TEGRA_234_SOC=y
|
||||
CONFIG_ARCH_K3_AM6_SOC=y
|
||||
CONFIG_ARCH_K3_J721E_SOC=y
|
||||
CONFIG_TI_SCI_PM_DOMAINS=y
|
||||
CONFIG_EXTCON_PTN5150=m
|
||||
CONFIG_EXTCON_USB_GPIO=y
|
||||
|
|
|
@ -352,8 +352,8 @@ kprobe_breakpoint_ss_handler(struct pt_regs *regs, unsigned int esr)
|
|||
unsigned long addr = instruction_pointer(regs);
|
||||
struct kprobe *cur = kprobe_running();
|
||||
|
||||
if (cur && (kcb->kprobe_status == KPROBE_HIT_SS)
|
||||
&& ((unsigned long)&cur->ainsn.api.insn[1] == addr)) {
|
||||
if (cur && (kcb->kprobe_status & (KPROBE_HIT_SS | KPROBE_REENTER)) &&
|
||||
((unsigned long)&cur->ainsn.api.insn[1] == addr)) {
|
||||
kprobes_restore_local_irqflag(kcb, regs);
|
||||
post_kprobe_handler(cur, kcb, regs);
|
||||
|
||||
|
|
|
@ -1396,8 +1396,9 @@ static void cpu_init_hyp_mode(void)
|
|||
* Calculate the raw per-cpu offset without a translation from the
|
||||
* kernel's mapping to the linear mapping, and store it in tpidr_el2
|
||||
* so that we can use adr_l to access per-cpu variables in EL2.
|
||||
* Also drop the KASAN tag which gets in the way...
|
||||
*/
|
||||
params->tpidr_el2 = (unsigned long)this_cpu_ptr_nvhe_sym(__per_cpu_start) -
|
||||
params->tpidr_el2 = (unsigned long)kasan_reset_tag(this_cpu_ptr_nvhe_sym(__per_cpu_start)) -
|
||||
(unsigned long)kvm_ksym_ref(CHOOSE_NVHE_SYM(__per_cpu_start));
|
||||
|
||||
params->mair_el2 = read_sysreg(mair_el1);
|
||||
|
|
|
@ -77,12 +77,6 @@ static unsigned long psci_forward(struct kvm_cpu_context *host_ctxt)
|
|||
cpu_reg(host_ctxt, 2), cpu_reg(host_ctxt, 3));
|
||||
}
|
||||
|
||||
static __noreturn unsigned long psci_forward_noreturn(struct kvm_cpu_context *host_ctxt)
|
||||
{
|
||||
psci_forward(host_ctxt);
|
||||
hyp_panic(); /* unreachable */
|
||||
}
|
||||
|
||||
static unsigned int find_cpu_id(u64 mpidr)
|
||||
{
|
||||
unsigned int i;
|
||||
|
@ -251,10 +245,13 @@ static unsigned long psci_0_2_handler(u64 func_id, struct kvm_cpu_context *host_
|
|||
case PSCI_0_2_FN_MIGRATE_INFO_TYPE:
|
||||
case PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU:
|
||||
return psci_forward(host_ctxt);
|
||||
/*
|
||||
* SYSTEM_OFF/RESET should not return according to the spec.
|
||||
* Allow it so as to stay robust to broken firmware.
|
||||
*/
|
||||
case PSCI_0_2_FN_SYSTEM_OFF:
|
||||
case PSCI_0_2_FN_SYSTEM_RESET:
|
||||
psci_forward_noreturn(host_ctxt);
|
||||
unreachable();
|
||||
return psci_forward(host_ctxt);
|
||||
case PSCI_0_2_FN64_CPU_SUSPEND:
|
||||
return psci_cpu_suspend(func_id, host_ctxt);
|
||||
case PSCI_0_2_FN64_CPU_ON:
|
||||
|
|
|
@ -788,7 +788,7 @@ u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1)
|
|||
{
|
||||
unsigned long *bmap = vcpu->kvm->arch.pmu_filter;
|
||||
u64 val, mask = 0;
|
||||
int base, i;
|
||||
int base, i, nr_events;
|
||||
|
||||
if (!pmceid1) {
|
||||
val = read_sysreg(pmceid0_el0);
|
||||
|
@ -801,13 +801,17 @@ u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1)
|
|||
if (!bmap)
|
||||
return val;
|
||||
|
||||
nr_events = kvm_pmu_event_mask(vcpu->kvm) + 1;
|
||||
|
||||
for (i = 0; i < 32; i += 8) {
|
||||
u64 byte;
|
||||
|
||||
byte = bitmap_get_value8(bmap, base + i);
|
||||
mask |= byte << i;
|
||||
byte = bitmap_get_value8(bmap, 0x4000 + base + i);
|
||||
mask |= byte << (32 + i);
|
||||
if (nr_events >= (0x4000 + base + 32)) {
|
||||
byte = bitmap_get_value8(bmap, 0x4000 + base + i);
|
||||
mask |= byte << (32 + i);
|
||||
}
|
||||
}
|
||||
|
||||
return val & mask;
|
||||
|
|
|
@ -43,6 +43,10 @@
|
|||
* 64bit interface.
|
||||
*/
|
||||
|
||||
#define reg_to_encoding(x) \
|
||||
sys_reg((u32)(x)->Op0, (u32)(x)->Op1, \
|
||||
(u32)(x)->CRn, (u32)(x)->CRm, (u32)(x)->Op2)
|
||||
|
||||
static bool read_from_write_only(struct kvm_vcpu *vcpu,
|
||||
struct sys_reg_params *params,
|
||||
const struct sys_reg_desc *r)
|
||||
|
@ -273,8 +277,7 @@ static bool trap_loregion(struct kvm_vcpu *vcpu,
|
|||
const struct sys_reg_desc *r)
|
||||
{
|
||||
u64 val = read_sanitised_ftr_reg(SYS_ID_AA64MMFR1_EL1);
|
||||
u32 sr = sys_reg((u32)r->Op0, (u32)r->Op1,
|
||||
(u32)r->CRn, (u32)r->CRm, (u32)r->Op2);
|
||||
u32 sr = reg_to_encoding(r);
|
||||
|
||||
if (!(val & (0xfUL << ID_AA64MMFR1_LOR_SHIFT))) {
|
||||
kvm_inject_undefined(vcpu);
|
||||
|
@ -590,6 +593,15 @@ static void reset_mpidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
|
|||
vcpu_write_sys_reg(vcpu, (1ULL << 31) | mpidr, MPIDR_EL1);
|
||||
}
|
||||
|
||||
static unsigned int pmu_visibility(const struct kvm_vcpu *vcpu,
|
||||
const struct sys_reg_desc *r)
|
||||
{
|
||||
if (kvm_vcpu_has_pmu(vcpu))
|
||||
return 0;
|
||||
|
||||
return REG_HIDDEN;
|
||||
}
|
||||
|
||||
static void reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
|
||||
{
|
||||
u64 pmcr, val;
|
||||
|
@ -613,9 +625,8 @@ static void reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
|
|||
static bool check_pmu_access_disabled(struct kvm_vcpu *vcpu, u64 flags)
|
||||
{
|
||||
u64 reg = __vcpu_sys_reg(vcpu, PMUSERENR_EL0);
|
||||
bool enabled = kvm_vcpu_has_pmu(vcpu);
|
||||
bool enabled = (reg & flags) || vcpu_mode_priv(vcpu);
|
||||
|
||||
enabled &= (reg & flags) || vcpu_mode_priv(vcpu);
|
||||
if (!enabled)
|
||||
kvm_inject_undefined(vcpu);
|
||||
|
||||
|
@ -900,11 +911,6 @@ static bool access_pmswinc(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
|||
static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
||||
const struct sys_reg_desc *r)
|
||||
{
|
||||
if (!kvm_vcpu_has_pmu(vcpu)) {
|
||||
kvm_inject_undefined(vcpu);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (p->is_write) {
|
||||
if (!vcpu_mode_priv(vcpu)) {
|
||||
kvm_inject_undefined(vcpu);
|
||||
|
@ -921,10 +927,6 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
|||
return true;
|
||||
}
|
||||
|
||||
#define reg_to_encoding(x) \
|
||||
sys_reg((u32)(x)->Op0, (u32)(x)->Op1, \
|
||||
(u32)(x)->CRn, (u32)(x)->CRm, (u32)(x)->Op2)
|
||||
|
||||
/* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in one go */
|
||||
#define DBG_BCR_BVR_WCR_WVR_EL1(n) \
|
||||
{ SYS_DESC(SYS_DBGBVRn_EL1(n)), \
|
||||
|
@ -936,15 +938,18 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
|||
{ SYS_DESC(SYS_DBGWCRn_EL1(n)), \
|
||||
trap_wcr, reset_wcr, 0, 0, get_wcr, set_wcr }
|
||||
|
||||
#define PMU_SYS_REG(r) \
|
||||
SYS_DESC(r), .reset = reset_unknown, .visibility = pmu_visibility
|
||||
|
||||
/* Macro to expand the PMEVCNTRn_EL0 register */
|
||||
#define PMU_PMEVCNTR_EL0(n) \
|
||||
{ SYS_DESC(SYS_PMEVCNTRn_EL0(n)), \
|
||||
access_pmu_evcntr, reset_unknown, (PMEVCNTR0_EL0 + n), }
|
||||
{ PMU_SYS_REG(SYS_PMEVCNTRn_EL0(n)), \
|
||||
.access = access_pmu_evcntr, .reg = (PMEVCNTR0_EL0 + n), }
|
||||
|
||||
/* Macro to expand the PMEVTYPERn_EL0 register */
|
||||
#define PMU_PMEVTYPER_EL0(n) \
|
||||
{ SYS_DESC(SYS_PMEVTYPERn_EL0(n)), \
|
||||
access_pmu_evtyper, reset_unknown, (PMEVTYPER0_EL0 + n), }
|
||||
{ PMU_SYS_REG(SYS_PMEVTYPERn_EL0(n)), \
|
||||
.access = access_pmu_evtyper, .reg = (PMEVTYPER0_EL0 + n), }
|
||||
|
||||
static bool undef_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
||||
const struct sys_reg_desc *r)
|
||||
|
@ -1020,8 +1025,7 @@ static bool access_arch_timer(struct kvm_vcpu *vcpu,
|
|||
static u64 read_id_reg(const struct kvm_vcpu *vcpu,
|
||||
struct sys_reg_desc const *r, bool raz)
|
||||
{
|
||||
u32 id = sys_reg((u32)r->Op0, (u32)r->Op1,
|
||||
(u32)r->CRn, (u32)r->CRm, (u32)r->Op2);
|
||||
u32 id = reg_to_encoding(r);
|
||||
u64 val = raz ? 0 : read_sanitised_ftr_reg(id);
|
||||
|
||||
if (id == SYS_ID_AA64PFR0_EL1) {
|
||||
|
@ -1062,8 +1066,7 @@ static u64 read_id_reg(const struct kvm_vcpu *vcpu,
|
|||
static unsigned int id_visibility(const struct kvm_vcpu *vcpu,
|
||||
const struct sys_reg_desc *r)
|
||||
{
|
||||
u32 id = sys_reg((u32)r->Op0, (u32)r->Op1,
|
||||
(u32)r->CRn, (u32)r->CRm, (u32)r->Op2);
|
||||
u32 id = reg_to_encoding(r);
|
||||
|
||||
switch (id) {
|
||||
case SYS_ID_AA64ZFR0_EL1:
|
||||
|
@ -1486,8 +1489,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
|||
{ SYS_DESC(SYS_FAR_EL1), access_vm_reg, reset_unknown, FAR_EL1 },
|
||||
{ SYS_DESC(SYS_PAR_EL1), NULL, reset_unknown, PAR_EL1 },
|
||||
|
||||
{ SYS_DESC(SYS_PMINTENSET_EL1), access_pminten, reset_unknown, PMINTENSET_EL1 },
|
||||
{ SYS_DESC(SYS_PMINTENCLR_EL1), access_pminten, reset_unknown, PMINTENSET_EL1 },
|
||||
{ PMU_SYS_REG(SYS_PMINTENSET_EL1),
|
||||
.access = access_pminten, .reg = PMINTENSET_EL1 },
|
||||
{ PMU_SYS_REG(SYS_PMINTENCLR_EL1),
|
||||
.access = access_pminten, .reg = PMINTENSET_EL1 },
|
||||
|
||||
{ SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 },
|
||||
{ SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 },
|
||||
|
@ -1526,23 +1531,36 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
|||
{ SYS_DESC(SYS_CSSELR_EL1), access_csselr, reset_unknown, CSSELR_EL1 },
|
||||
{ SYS_DESC(SYS_CTR_EL0), access_ctr },
|
||||
|
||||
{ SYS_DESC(SYS_PMCR_EL0), access_pmcr, reset_pmcr, PMCR_EL0 },
|
||||
{ SYS_DESC(SYS_PMCNTENSET_EL0), access_pmcnten, reset_unknown, PMCNTENSET_EL0 },
|
||||
{ SYS_DESC(SYS_PMCNTENCLR_EL0), access_pmcnten, reset_unknown, PMCNTENSET_EL0 },
|
||||
{ SYS_DESC(SYS_PMOVSCLR_EL0), access_pmovs, reset_unknown, PMOVSSET_EL0 },
|
||||
{ SYS_DESC(SYS_PMSWINC_EL0), access_pmswinc, reset_unknown, PMSWINC_EL0 },
|
||||
{ SYS_DESC(SYS_PMSELR_EL0), access_pmselr, reset_unknown, PMSELR_EL0 },
|
||||
{ SYS_DESC(SYS_PMCEID0_EL0), access_pmceid },
|
||||
{ SYS_DESC(SYS_PMCEID1_EL0), access_pmceid },
|
||||
{ SYS_DESC(SYS_PMCCNTR_EL0), access_pmu_evcntr, reset_unknown, PMCCNTR_EL0 },
|
||||
{ SYS_DESC(SYS_PMXEVTYPER_EL0), access_pmu_evtyper },
|
||||
{ SYS_DESC(SYS_PMXEVCNTR_EL0), access_pmu_evcntr },
|
||||
{ PMU_SYS_REG(SYS_PMCR_EL0), .access = access_pmcr,
|
||||
.reset = reset_pmcr, .reg = PMCR_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMCNTENSET_EL0),
|
||||
.access = access_pmcnten, .reg = PMCNTENSET_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMCNTENCLR_EL0),
|
||||
.access = access_pmcnten, .reg = PMCNTENSET_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMOVSCLR_EL0),
|
||||
.access = access_pmovs, .reg = PMOVSSET_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMSWINC_EL0),
|
||||
.access = access_pmswinc, .reg = PMSWINC_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMSELR_EL0),
|
||||
.access = access_pmselr, .reg = PMSELR_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMCEID0_EL0),
|
||||
.access = access_pmceid, .reset = NULL },
|
||||
{ PMU_SYS_REG(SYS_PMCEID1_EL0),
|
||||
.access = access_pmceid, .reset = NULL },
|
||||
{ PMU_SYS_REG(SYS_PMCCNTR_EL0),
|
||||
.access = access_pmu_evcntr, .reg = PMCCNTR_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMXEVTYPER_EL0),
|
||||
.access = access_pmu_evtyper, .reset = NULL },
|
||||
{ PMU_SYS_REG(SYS_PMXEVCNTR_EL0),
|
||||
.access = access_pmu_evcntr, .reset = NULL },
|
||||
/*
|
||||
* PMUSERENR_EL0 resets as unknown in 64bit mode while it resets as zero
|
||||
* in 32bit mode. Here we choose to reset it as zero for consistency.
|
||||
*/
|
||||
{ SYS_DESC(SYS_PMUSERENR_EL0), access_pmuserenr, reset_val, PMUSERENR_EL0, 0 },
|
||||
{ SYS_DESC(SYS_PMOVSSET_EL0), access_pmovs, reset_unknown, PMOVSSET_EL0 },
|
||||
{ PMU_SYS_REG(SYS_PMUSERENR_EL0), .access = access_pmuserenr,
|
||||
.reset = reset_val, .reg = PMUSERENR_EL0, .val = 0 },
|
||||
{ PMU_SYS_REG(SYS_PMOVSSET_EL0),
|
||||
.access = access_pmovs, .reg = PMOVSSET_EL0 },
|
||||
|
||||
{ SYS_DESC(SYS_TPIDR_EL0), NULL, reset_unknown, TPIDR_EL0 },
|
||||
{ SYS_DESC(SYS_TPIDRRO_EL0), NULL, reset_unknown, TPIDRRO_EL0 },
|
||||
|
@ -1694,7 +1712,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
|||
* PMCCFILTR_EL0 resets as unknown in 64bit mode while it resets as zero
|
||||
* in 32bit mode. Here we choose to reset it as zero for consistency.
|
||||
*/
|
||||
{ SYS_DESC(SYS_PMCCFILTR_EL0), access_pmu_evtyper, reset_val, PMCCFILTR_EL0, 0 },
|
||||
{ PMU_SYS_REG(SYS_PMCCFILTR_EL0), .access = access_pmu_evtyper,
|
||||
.reset = reset_val, .reg = PMCCFILTR_EL0, .val = 0 },
|
||||
|
||||
{ SYS_DESC(SYS_DACR32_EL2), NULL, reset_unknown, DACR32_EL2 },
|
||||
{ SYS_DESC(SYS_IFSR32_EL2), NULL, reset_unknown, IFSR32_EL2 },
|
||||
|
|
|
@ -709,10 +709,11 @@ static int do_tag_check_fault(unsigned long far, unsigned int esr,
|
|||
struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN for tag
|
||||
* check faults. Mask them out now so that userspace doesn't see them.
|
||||
* The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN
|
||||
* for tag check faults. Set them to corresponding bits in the untagged
|
||||
* address.
|
||||
*/
|
||||
far &= (1UL << 60) - 1;
|
||||
far = (__untagged_addr(far) & ~MTE_TAG_MASK) | (far & MTE_TAG_MASK);
|
||||
do_bad_area(far, esr, regs);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ extern void ia64_xchg_called_with_bad_pointer(void);
|
|||
})
|
||||
|
||||
#define xchg(ptr, x) \
|
||||
((__typeof__(*(ptr))) __xchg((unsigned long) (x), (ptr), sizeof(*(ptr))))
|
||||
({(__typeof__(*(ptr))) __xchg((unsigned long) (x), (ptr), sizeof(*(ptr)));})
|
||||
|
||||
/*
|
||||
* Atomic compare and exchange. Compare OLD with MEM, if identical,
|
||||
|
|
|
@ -171,30 +171,35 @@ void vtime_account_hardirq(struct task_struct *tsk)
|
|||
static irqreturn_t
|
||||
timer_interrupt (int irq, void *dev_id)
|
||||
{
|
||||
unsigned long cur_itm, new_itm, ticks;
|
||||
unsigned long new_itm;
|
||||
|
||||
if (cpu_is_offline(smp_processor_id())) {
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
new_itm = local_cpu_data->itm_next;
|
||||
cur_itm = ia64_get_itc();
|
||||
|
||||
if (!time_after(cur_itm, new_itm)) {
|
||||
if (!time_after(ia64_get_itc(), new_itm))
|
||||
printk(KERN_ERR "Oops: timer tick before it's due (itc=%lx,itm=%lx)\n",
|
||||
cur_itm, new_itm);
|
||||
ticks = 1;
|
||||
} else {
|
||||
ticks = DIV_ROUND_UP(cur_itm - new_itm,
|
||||
local_cpu_data->itm_delta);
|
||||
new_itm += ticks * local_cpu_data->itm_delta;
|
||||
ia64_get_itc(), new_itm);
|
||||
|
||||
while (1) {
|
||||
new_itm += local_cpu_data->itm_delta;
|
||||
|
||||
legacy_timer_tick(smp_processor_id() == time_keeper_id);
|
||||
|
||||
local_cpu_data->itm_next = new_itm;
|
||||
|
||||
if (time_after(new_itm, ia64_get_itc()))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Allow IPIs to interrupt the timer loop.
|
||||
*/
|
||||
local_irq_enable();
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
if (smp_processor_id() != time_keeper_id)
|
||||
ticks = 0;
|
||||
|
||||
legacy_timer_tick(ticks);
|
||||
|
||||
do {
|
||||
/*
|
||||
* If we're too close to the next clock tick for
|
||||
|
|
|
@ -51,6 +51,7 @@ extern void kmap_flush_tlb(unsigned long addr);
|
|||
|
||||
#define flush_cache_kmaps() BUG_ON(cpu_has_dc_aliases)
|
||||
|
||||
#define arch_kmap_local_set_pte(mm, vaddr, ptep, ptev) set_pte(ptep, ptev)
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) local_flush_tlb_one(vaddr)
|
||||
#define arch_kmap_local_post_unmap(vaddr) local_flush_tlb_one(vaddr)
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
void __iomem *ioremap(phys_addr_t offset, unsigned long size);
|
||||
|
||||
#define iounmap iounmap
|
||||
extern void iounmap(void *addr);
|
||||
extern void iounmap(void __iomem *addr);
|
||||
|
||||
#include <asm-generic/io.h>
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ void __iomem *__ref ioremap(phys_addr_t addr, unsigned long size)
|
|||
}
|
||||
EXPORT_SYMBOL(ioremap);
|
||||
|
||||
void iounmap(void *addr)
|
||||
void iounmap(void __iomem *addr)
|
||||
{
|
||||
/* If the page is from the fixmap pool then we just clear out
|
||||
* the fixmap mapping.
|
||||
|
|
|
@ -202,9 +202,8 @@ config PREFETCH
|
|||
depends on PA8X00 || PA7200
|
||||
|
||||
config MLONGCALLS
|
||||
bool "Enable the -mlong-calls compiler option for big kernels"
|
||||
default y if !MODULES || UBSAN || FTRACE
|
||||
default n
|
||||
def_bool y if !MODULES || UBSAN || FTRACE
|
||||
bool "Enable the -mlong-calls compiler option for big kernels" if MODULES && !UBSAN && !FTRACE
|
||||
depends on PA8X00
|
||||
help
|
||||
If you configure the kernel to include many drivers built-in instead
|
||||
|
|
|
@ -47,7 +47,4 @@ extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);
|
|||
extern int cpu_claim_irq(unsigned int irq, struct irq_chip *, void *);
|
||||
extern int cpu_check_affinity(struct irq_data *d, const struct cpumask *dest);
|
||||
|
||||
/* soft power switch support (power.c) */
|
||||
extern struct tasklet_struct power_tasklet;
|
||||
|
||||
#endif /* _ASM_PARISC_IRQ_H */
|
||||
|
|
|
@ -997,10 +997,17 @@ intr_do_preempt:
|
|||
bb,<,n %r20, 31 - PSW_SM_I, intr_restore
|
||||
nop
|
||||
|
||||
/* ssm PSW_SM_I done later in intr_restore */
|
||||
#ifdef CONFIG_MLONGCALLS
|
||||
ldil L%intr_restore, %r2
|
||||
load32 preempt_schedule_irq, %r1
|
||||
bv %r0(%r1)
|
||||
ldo R%intr_restore(%r2), %r2
|
||||
#else
|
||||
ldil L%intr_restore, %r1
|
||||
BL preempt_schedule_irq, %r2
|
||||
nop
|
||||
|
||||
b,n intr_restore /* ssm PSW_SM_I done by intr_restore */
|
||||
ldo R%intr_restore(%r1), %r2
|
||||
#endif
|
||||
#endif /* CONFIG_PREEMPTION */
|
||||
|
||||
/*
|
||||
|
|
|
@ -63,6 +63,12 @@
|
|||
nop; \
|
||||
nop;
|
||||
|
||||
#define SCV_ENTRY_FLUSH_SLOT \
|
||||
SCV_ENTRY_FLUSH_FIXUP_SECTION; \
|
||||
nop; \
|
||||
nop; \
|
||||
nop;
|
||||
|
||||
/*
|
||||
* r10 must be free to use, r13 must be paca
|
||||
*/
|
||||
|
@ -70,6 +76,13 @@
|
|||
STF_ENTRY_BARRIER_SLOT; \
|
||||
ENTRY_FLUSH_SLOT
|
||||
|
||||
/*
|
||||
* r10, ctr must be free to use, r13 must be paca
|
||||
*/
|
||||
#define SCV_INTERRUPT_TO_KERNEL \
|
||||
STF_ENTRY_BARRIER_SLOT; \
|
||||
SCV_ENTRY_FLUSH_SLOT
|
||||
|
||||
/*
|
||||
* Macros for annotating the expected destination of (h)rfid
|
||||
*
|
||||
|
|
|
@ -240,6 +240,14 @@ label##3: \
|
|||
FTR_ENTRY_OFFSET 957b-958b; \
|
||||
.popsection;
|
||||
|
||||
#define SCV_ENTRY_FLUSH_FIXUP_SECTION \
|
||||
957: \
|
||||
.pushsection __scv_entry_flush_fixup,"a"; \
|
||||
.align 2; \
|
||||
958: \
|
||||
FTR_ENTRY_OFFSET 957b-958b; \
|
||||
.popsection;
|
||||
|
||||
#define RFI_FLUSH_FIXUP_SECTION \
|
||||
951: \
|
||||
.pushsection __rfi_flush_fixup,"a"; \
|
||||
|
@ -273,10 +281,12 @@ label##3: \
|
|||
|
||||
extern long stf_barrier_fallback;
|
||||
extern long entry_flush_fallback;
|
||||
extern long scv_entry_flush_fallback;
|
||||
extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
|
||||
extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
|
||||
extern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup;
|
||||
extern long __start___entry_flush_fixup, __stop___entry_flush_fixup;
|
||||
extern long __start___scv_entry_flush_fixup, __stop___scv_entry_flush_fixup;
|
||||
extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
|
||||
extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
|
||||
extern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
|
||||
|
|
|
@ -58,6 +58,8 @@ extern pte_t *pkmap_page_table;
|
|||
|
||||
#define flush_cache_kmaps() flush_cache_all()
|
||||
|
||||
#define arch_kmap_local_set_pte(mm, vaddr, ptep, ptev) \
|
||||
__set_pte_at(mm, vaddr, ptep, ptev, 1)
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) \
|
||||
local_flush_tlb_page(NULL, vaddr)
|
||||
#define arch_kmap_local_post_unmap(vaddr) \
|
||||
|
|
|
@ -75,7 +75,7 @@ BEGIN_FTR_SECTION
|
|||
bne .Ltabort_syscall
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_TM)
|
||||
#endif
|
||||
INTERRUPT_TO_KERNEL
|
||||
SCV_INTERRUPT_TO_KERNEL
|
||||
mr r10,r1
|
||||
ld r1,PACAKSAVE(r13)
|
||||
std r10,0(r1)
|
||||
|
|
|
@ -2993,6 +2993,25 @@ TRAMP_REAL_BEGIN(entry_flush_fallback)
|
|||
ld r11,PACA_EXRFI+EX_R11(r13)
|
||||
blr
|
||||
|
||||
/*
|
||||
* The SCV entry flush happens with interrupts enabled, so it must disable
|
||||
* to prevent EXRFI being clobbered by NMIs (e.g., soft_nmi_common). r10
|
||||
* (containing LR) does not need to be preserved here because scv entry
|
||||
* puts 0 in the pt_regs, CTR can be clobbered for the same reason.
|
||||
*/
|
||||
TRAMP_REAL_BEGIN(scv_entry_flush_fallback)
|
||||
li r10,0
|
||||
mtmsrd r10,1
|
||||
lbz r10,PACAIRQHAPPENED(r13)
|
||||
ori r10,r10,PACA_IRQ_HARD_DIS
|
||||
stb r10,PACAIRQHAPPENED(r13)
|
||||
std r11,PACA_EXRFI+EX_R11(r13)
|
||||
L1D_DISPLACEMENT_FLUSH
|
||||
ld r11,PACA_EXRFI+EX_R11(r13)
|
||||
li r10,MSR_RI
|
||||
mtmsrd r10,1
|
||||
blr
|
||||
|
||||
TRAMP_REAL_BEGIN(rfi_flush_fallback)
|
||||
SET_SCRATCH0(r13);
|
||||
GET_PACA(r13);
|
||||
|
|
|
@ -145,6 +145,13 @@ SECTIONS
|
|||
__stop___entry_flush_fixup = .;
|
||||
}
|
||||
|
||||
. = ALIGN(8);
|
||||
__scv_entry_flush_fixup : AT(ADDR(__scv_entry_flush_fixup) - LOAD_OFFSET) {
|
||||
__start___scv_entry_flush_fixup = .;
|
||||
*(__scv_entry_flush_fixup)
|
||||
__stop___scv_entry_flush_fixup = .;
|
||||
}
|
||||
|
||||
. = ALIGN(8);
|
||||
__stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
|
||||
__start___stf_exit_barrier_fixup = .;
|
||||
|
|
|
@ -290,9 +290,6 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
|
|||
long *start, *end;
|
||||
int i;
|
||||
|
||||
start = PTRRELOC(&__start___entry_flush_fixup);
|
||||
end = PTRRELOC(&__stop___entry_flush_fixup);
|
||||
|
||||
instrs[0] = 0x60000000; /* nop */
|
||||
instrs[1] = 0x60000000; /* nop */
|
||||
instrs[2] = 0x60000000; /* nop */
|
||||
|
@ -312,6 +309,8 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
|
|||
if (types & L1D_FLUSH_MTTRIG)
|
||||
instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */
|
||||
|
||||
start = PTRRELOC(&__start___entry_flush_fixup);
|
||||
end = PTRRELOC(&__stop___entry_flush_fixup);
|
||||
for (i = 0; start < end; start++, i++) {
|
||||
dest = (void *)start + *start;
|
||||
|
||||
|
@ -328,6 +327,25 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
|
|||
patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
|
||||
}
|
||||
|
||||
start = PTRRELOC(&__start___scv_entry_flush_fixup);
|
||||
end = PTRRELOC(&__stop___scv_entry_flush_fixup);
|
||||
for (; start < end; start++, i++) {
|
||||
dest = (void *)start + *start;
|
||||
|
||||
pr_devel("patching dest %lx\n", (unsigned long)dest);
|
||||
|
||||
patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
|
||||
|
||||
if (types == L1D_FLUSH_FALLBACK)
|
||||
patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&scv_entry_flush_fallback,
|
||||
BRANCH_SET_LINK);
|
||||
else
|
||||
patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
|
||||
|
||||
patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
|
||||
}
|
||||
|
||||
|
||||
printk(KERN_DEBUG "entry-flush: patched %d locations (%s flush)\n", i,
|
||||
(types == L1D_FLUSH_NONE) ? "no" :
|
||||
(types == L1D_FLUSH_FALLBACK) ? "fallback displacement" :
|
||||
|
|
|
@ -29,7 +29,6 @@ config SUPERH
|
|||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_COPY_THREAD_TLS
|
||||
select HAVE_DEBUG_BUGVERBOSE
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/rtc.h>
|
||||
|
|
|
@ -27,13 +27,12 @@ CONFIG_NETFILTER=y
|
|||
CONFIG_ATALK=m
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_OFFBOARD=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_AEC62XX=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_ATP867X=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
|
|
|
@ -20,8 +20,6 @@ CONFIG_IP_PNP=y
|
|||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMC91X=y
|
||||
|
|
|
@ -44,16 +44,14 @@ CONFIG_NET_SCHED=y
|
|||
CONFIG_PARPORT=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_PLATFORM=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_ATA_GENERIC=y
|
||||
CONFIG_PATA_PLATFORM=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_NETDEVICES=y
|
||||
|
|
|
@ -116,9 +116,6 @@ CONFIG_MTD_UBI_GLUEBI=m
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
CONFIG_BLK_DEV_PLATFORM=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
|
|
|
@ -29,7 +29,6 @@ CONFIG_MTD_BLOCK=y
|
|||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_ROM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
|
|
|
@ -39,9 +39,6 @@ CONFIG_IP_PNP_RARP=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_NBD=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=m
|
||||
CONFIG_BLK_DEV_IDETAPE=m
|
||||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
|
|
|
@ -63,8 +63,7 @@ config PVR2_DMA
|
|||
|
||||
config G2_DMA
|
||||
tristate "G2 Bus DMA support"
|
||||
depends on SH_DREAMCAST
|
||||
select SH_DMA_API
|
||||
depends on SH_DREAMCAST && SH_DMA_API
|
||||
help
|
||||
This enables support for the DMA controller for the Dreamcast's
|
||||
G2 bus. Drivers that want this will generally enable this on
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include <cpu/gpio.h>
|
||||
#endif
|
||||
|
||||
#define ARCH_NR_GPIOS 512
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <cpu/mmu_context.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
! NOTE:
|
||||
! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
|
||||
|
|
|
@ -105,7 +105,7 @@ config VSYSCALL
|
|||
(the default value) say Y.
|
||||
|
||||
config NUMA
|
||||
bool "Non Uniform Memory Access (NUMA) Support"
|
||||
bool "Non-Uniform Memory Access (NUMA) Support"
|
||||
depends on MMU && SYS_SUPPORTS_NUMA
|
||||
select ARCH_WANT_NUMA_VARIABLE_LOCALITY
|
||||
default n
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <asm/processor.h>
|
||||
#include <asm/mmu_context.h>
|
||||
|
||||
static int asids_seq_show(struct seq_file *file, void *iter)
|
||||
static int asids_debugfs_show(struct seq_file *file, void *iter)
|
||||
{
|
||||
struct task_struct *p;
|
||||
|
||||
|
@ -48,18 +48,7 @@ static int asids_seq_show(struct seq_file *file, void *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int asids_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, asids_seq_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations asids_debugfs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = asids_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(asids_debugfs);
|
||||
|
||||
static int __init asids_debugfs_init(void)
|
||||
{
|
||||
|
|
|
@ -22,7 +22,7 @@ enum cache_type {
|
|||
CACHE_TYPE_UNIFIED,
|
||||
};
|
||||
|
||||
static int cache_seq_show(struct seq_file *file, void *iter)
|
||||
static int cache_debugfs_show(struct seq_file *file, void *iter)
|
||||
{
|
||||
unsigned int cache_type = (unsigned int)file->private;
|
||||
struct cache_info *cache;
|
||||
|
@ -94,18 +94,7 @@ static int cache_seq_show(struct seq_file *file, void *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cache_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, cache_seq_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations cache_debugfs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = cache_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(cache_debugfs);
|
||||
|
||||
static int __init cache_debugfs_init(void)
|
||||
{
|
||||
|
|
|
@ -812,7 +812,7 @@ bool __in_29bit_mode(void)
|
|||
return (__raw_readl(PMB_PASCR) & PASCR_SE) == 0;
|
||||
}
|
||||
|
||||
static int pmb_seq_show(struct seq_file *file, void *iter)
|
||||
static int pmb_debugfs_show(struct seq_file *file, void *iter)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -846,18 +846,7 @@ static int pmb_seq_show(struct seq_file *file, void *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pmb_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, pmb_seq_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations pmb_debugfs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = pmb_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(pmb_debugfs);
|
||||
|
||||
static int __init pmb_debugfs_init(void)
|
||||
{
|
||||
|
|
|
@ -50,10 +50,11 @@ extern pte_t *pkmap_page_table;
|
|||
|
||||
#define flush_cache_kmaps() flush_cache_all()
|
||||
|
||||
/* FIXME: Use __flush_tlb_one(vaddr) instead of flush_cache_all() -- Anton */
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) flush_cache_all()
|
||||
#define arch_kmap_local_post_unmap(vaddr) flush_cache_all()
|
||||
|
||||
/* FIXME: Use __flush_*_one(vaddr) instead of flush_*_all() -- Anton */
|
||||
#define arch_kmap_local_pre_map(vaddr, pteval) flush_cache_all()
|
||||
#define arch_kmap_local_pre_unmap(vaddr) flush_cache_all()
|
||||
#define arch_kmap_local_post_map(vaddr, pteval) flush_tlb_all()
|
||||
#define arch_kmap_local_post_unmap(vaddr) flush_tlb_all()
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
@ -73,10 +73,8 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs,
|
|||
unsigned int nr)
|
||||
{
|
||||
if (likely(nr < IA32_NR_syscalls)) {
|
||||
instrumentation_begin();
|
||||
nr = array_index_nospec(nr, IA32_NR_syscalls);
|
||||
regs->ax = ia32_sys_call_table[nr](regs);
|
||||
instrumentation_end();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,8 +89,11 @@ __visible noinstr void do_int80_syscall_32(struct pt_regs *regs)
|
|||
* or may not be necessary, but it matches the old asm behavior.
|
||||
*/
|
||||
nr = (unsigned int)syscall_enter_from_user_mode(regs, nr);
|
||||
instrumentation_begin();
|
||||
|
||||
do_syscall_32_irqs_on(regs, nr);
|
||||
|
||||
instrumentation_end();
|
||||
syscall_exit_to_user_mode(regs);
|
||||
}
|
||||
|
||||
|
@ -121,11 +122,12 @@ static noinstr bool __do_fast_syscall_32(struct pt_regs *regs)
|
|||
res = get_user(*(u32 *)®s->bp,
|
||||
(u32 __user __force *)(unsigned long)(u32)regs->sp);
|
||||
}
|
||||
instrumentation_end();
|
||||
|
||||
if (res) {
|
||||
/* User code screwed up. */
|
||||
regs->ax = -EFAULT;
|
||||
|
||||
instrumentation_end();
|
||||
syscall_exit_to_user_mode(regs);
|
||||
return false;
|
||||
}
|
||||
|
@ -135,6 +137,8 @@ static noinstr bool __do_fast_syscall_32(struct pt_regs *regs)
|
|||
|
||||
/* Now this is just like a normal syscall. */
|
||||
do_syscall_32_irqs_on(regs, nr);
|
||||
|
||||
instrumentation_end();
|
||||
syscall_exit_to_user_mode(regs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -16,14 +16,25 @@
|
|||
* Use kernel_fpu_begin/end() if you intend to use FPU in kernel context. It
|
||||
* disables preemption so be careful if you intend to use it for long periods
|
||||
* of time.
|
||||
* If you intend to use the FPU in softirq you need to check first with
|
||||
* If you intend to use the FPU in irq/softirq you need to check first with
|
||||
* irq_fpu_usable() if it is possible.
|
||||
*/
|
||||
extern void kernel_fpu_begin(void);
|
||||
|
||||
/* Kernel FPU states to initialize in kernel_fpu_begin_mask() */
|
||||
#define KFPU_387 _BITUL(0) /* 387 state will be initialized */
|
||||
#define KFPU_MXCSR _BITUL(1) /* MXCSR will be initialized */
|
||||
|
||||
extern void kernel_fpu_begin_mask(unsigned int kfpu_mask);
|
||||
extern void kernel_fpu_end(void);
|
||||
extern bool irq_fpu_usable(void);
|
||||
extern void fpregs_mark_activate(void);
|
||||
|
||||
/* Code that is unaware of kernel_fpu_begin_mask() can use this */
|
||||
static inline void kernel_fpu_begin(void)
|
||||
{
|
||||
kernel_fpu_begin_mask(KFPU_387 | KFPU_MXCSR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use fpregs_lock() while editing CPU's FPU registers or fpu->state.
|
||||
* A context switch will (and softirq might) save CPU's FPU registers to
|
||||
|
|
|
@ -613,6 +613,7 @@ DECLARE_IDTENTRY_VC(X86_TRAP_VC, exc_vmm_communication);
|
|||
|
||||
#ifdef CONFIG_XEN_PV
|
||||
DECLARE_IDTENTRY_XENCB(X86_TRAP_OTHER, exc_xen_hypervisor_callback);
|
||||
DECLARE_IDTENTRY_RAW(X86_TRAP_OTHER, exc_xen_unknown_trap);
|
||||
#endif
|
||||
|
||||
/* Device interrupts common/spurious */
|
||||
|
|
|
@ -97,6 +97,7 @@
|
|||
|
||||
#define INTEL_FAM6_LAKEFIELD 0x8A
|
||||
#define INTEL_FAM6_ALDERLAKE 0x97
|
||||
#define INTEL_FAM6_ALDERLAKE_L 0x9A
|
||||
|
||||
/* "Small Core" Processors (Atom) */
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ static inline void do_trace_rdpmc(unsigned int msr, u64 val, int failed) {}
|
|||
* think of extending them - you will be slapped with a stinking trout or a frozen
|
||||
* shark will reach you, wherever you are! You've been warned.
|
||||
*/
|
||||
static inline unsigned long long notrace __rdmsr(unsigned int msr)
|
||||
static __always_inline unsigned long long __rdmsr(unsigned int msr)
|
||||
{
|
||||
DECLARE_ARGS(val, low, high);
|
||||
|
||||
|
@ -98,7 +98,7 @@ static inline unsigned long long notrace __rdmsr(unsigned int msr)
|
|||
return EAX_EDX_VAL(val, low, high);
|
||||
}
|
||||
|
||||
static inline void notrace __wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
static __always_inline void __wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
asm volatile("1: wrmsr\n"
|
||||
"2:\n"
|
||||
|
|
|
@ -110,6 +110,8 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);
|
|||
#define topology_die_id(cpu) (cpu_data(cpu).cpu_die_id)
|
||||
#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)
|
||||
|
||||
extern unsigned int __max_die_per_package;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define topology_die_cpumask(cpu) (per_cpu(cpu_die_map, cpu))
|
||||
#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
|
||||
|
@ -118,8 +120,6 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);
|
|||
extern unsigned int __max_logical_packages;
|
||||
#define topology_max_packages() (__max_logical_packages)
|
||||
|
||||
extern unsigned int __max_die_per_package;
|
||||
|
||||
static inline int topology_max_die_per_package(void)
|
||||
{
|
||||
return __max_die_per_package;
|
||||
|
|
|
@ -542,12 +542,12 @@ static void bsp_init_amd(struct cpuinfo_x86 *c)
|
|||
u32 ecx;
|
||||
|
||||
ecx = cpuid_ecx(0x8000001e);
|
||||
nodes_per_socket = ((ecx >> 8) & 7) + 1;
|
||||
__max_die_per_package = nodes_per_socket = ((ecx >> 8) & 7) + 1;
|
||||
} else if (boot_cpu_has(X86_FEATURE_NODEID_MSR)) {
|
||||
u64 value;
|
||||
|
||||
rdmsrl(MSR_FAM10H_NODE_ID, value);
|
||||
nodes_per_socket = ((value >> 3) & 7) + 1;
|
||||
__max_die_per_package = nodes_per_socket = ((value >> 3) & 7) + 1;
|
||||
}
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_AMD_SSBD) &&
|
||||
|
|
|
@ -1992,10 +1992,9 @@ static __always_inline void exc_machine_check_kernel(struct pt_regs *regs)
|
|||
* that out because it's an indirect call. Annotate it.
|
||||
*/
|
||||
instrumentation_begin();
|
||||
trace_hardirqs_off_finish();
|
||||
|
||||
machine_check_vector(regs);
|
||||
if (regs->flags & X86_EFLAGS_IF)
|
||||
trace_hardirqs_on_prepare();
|
||||
|
||||
instrumentation_end();
|
||||
irqentry_nmi_exit(regs, irq_state);
|
||||
}
|
||||
|
@ -2004,7 +2003,9 @@ static __always_inline void exc_machine_check_user(struct pt_regs *regs)
|
|||
{
|
||||
irqentry_enter_from_user_mode(regs);
|
||||
instrumentation_begin();
|
||||
|
||||
machine_check_vector(regs);
|
||||
|
||||
instrumentation_end();
|
||||
irqentry_exit_to_user_mode(regs);
|
||||
}
|
||||
|
|
|
@ -25,10 +25,10 @@
|
|||
#define BITS_SHIFT_NEXT_LEVEL(eax) ((eax) & 0x1f)
|
||||
#define LEVEL_MAX_SIBLINGS(ebx) ((ebx) & 0xffff)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned int __max_die_per_package __read_mostly = 1;
|
||||
EXPORT_SYMBOL(__max_die_per_package);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* Check if given CPUID extended toplogy "leaf" is implemented
|
||||
*/
|
||||
|
|
|
@ -121,7 +121,7 @@ int copy_fpregs_to_fpstate(struct fpu *fpu)
|
|||
}
|
||||
EXPORT_SYMBOL(copy_fpregs_to_fpstate);
|
||||
|
||||
void kernel_fpu_begin(void)
|
||||
void kernel_fpu_begin_mask(unsigned int kfpu_mask)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
|
@ -141,13 +141,14 @@ void kernel_fpu_begin(void)
|
|||
}
|
||||
__cpu_invalidate_fpregs_state();
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_XMM))
|
||||
/* Put sane initial values into the control registers. */
|
||||
if (likely(kfpu_mask & KFPU_MXCSR) && boot_cpu_has(X86_FEATURE_XMM))
|
||||
ldmxcsr(MXCSR_DEFAULT);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_FPU))
|
||||
if (unlikely(kfpu_mask & KFPU_387) && boot_cpu_has(X86_FEATURE_FPU))
|
||||
asm volatile ("fninit");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kernel_fpu_begin);
|
||||
EXPORT_SYMBOL_GPL(kernel_fpu_begin_mask);
|
||||
|
||||
void kernel_fpu_end(void)
|
||||
{
|
||||
|
|
|
@ -660,17 +660,6 @@ static void __init trim_platform_memory_ranges(void)
|
|||
|
||||
static void __init trim_bios_range(void)
|
||||
{
|
||||
/*
|
||||
* A special case is the first 4Kb of memory;
|
||||
* This is a BIOS owned area, not kernel ram, but generally
|
||||
* not listed as such in the E820 table.
|
||||
*
|
||||
* This typically reserves additional memory (64KiB by default)
|
||||
* since some BIOSes are known to corrupt low memory. See the
|
||||
* Kconfig help text for X86_RESERVE_LOW.
|
||||
*/
|
||||
e820__range_update(0, PAGE_SIZE, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
|
||||
/*
|
||||
* special case: Some BIOSes report the PC BIOS
|
||||
* area (640Kb -> 1Mb) as RAM even though it is not.
|
||||
|
@ -728,6 +717,15 @@ early_param("reservelow", parse_reservelow);
|
|||
|
||||
static void __init trim_low_memory_range(void)
|
||||
{
|
||||
/*
|
||||
* A special case is the first 4Kb of memory;
|
||||
* This is a BIOS owned area, not kernel ram, but generally
|
||||
* not listed as such in the E820 table.
|
||||
*
|
||||
* This typically reserves additional memory (64KiB by default)
|
||||
* since some BIOSes are known to corrupt low memory. See the
|
||||
* Kconfig help text for X86_RESERVE_LOW.
|
||||
*/
|
||||
memblock_reserve(0, ALIGN(reserve_low, PAGE_SIZE));
|
||||
}
|
||||
|
||||
|
|
|
@ -225,7 +225,7 @@ static inline u64 sev_es_rd_ghcb_msr(void)
|
|||
return __rdmsr(MSR_AMD64_SEV_ES_GHCB);
|
||||
}
|
||||
|
||||
static inline void sev_es_wr_ghcb_msr(u64 val)
|
||||
static __always_inline void sev_es_wr_ghcb_msr(u64 val)
|
||||
{
|
||||
u32 low, high;
|
||||
|
||||
|
@ -286,6 +286,12 @@ static enum es_result vc_write_mem(struct es_em_ctxt *ctxt,
|
|||
u16 d2;
|
||||
u8 d1;
|
||||
|
||||
/* If instruction ran in kernel mode and the I/O buffer is in kernel space */
|
||||
if (!user_mode(ctxt->regs) && !access_ok(target, size)) {
|
||||
memcpy(dst, buf, size);
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
memcpy(&d1, buf, 1);
|
||||
|
@ -335,6 +341,12 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
|
|||
u16 d2;
|
||||
u8 d1;
|
||||
|
||||
/* If instruction ran in kernel mode and the I/O buffer is in kernel space */
|
||||
if (!user_mode(ctxt->regs) && !access_ok(s, size)) {
|
||||
memcpy(buf, src, size);
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
if (get_user(d1, s))
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#include <linux/numa.h>
|
||||
#include <linux/pgtable.h>
|
||||
#include <linux/overflow.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/desc.h>
|
||||
|
@ -2083,6 +2084,23 @@ static void init_counter_refs(void)
|
|||
this_cpu_write(arch_prev_mperf, mperf);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static struct syscore_ops freq_invariance_syscore_ops = {
|
||||
.resume = init_counter_refs,
|
||||
};
|
||||
|
||||
static void register_freq_invariance_syscore_ops(void)
|
||||
{
|
||||
/* Bail out if registered already. */
|
||||
if (freq_invariance_syscore_ops.node.prev)
|
||||
return;
|
||||
|
||||
register_syscore_ops(&freq_invariance_syscore_ops);
|
||||
}
|
||||
#else
|
||||
static inline void register_freq_invariance_syscore_ops(void) {}
|
||||
#endif
|
||||
|
||||
static void init_freq_invariance(bool secondary, bool cppc_ready)
|
||||
{
|
||||
bool ret = false;
|
||||
|
@ -2109,6 +2127,7 @@ static void init_freq_invariance(bool secondary, bool cppc_ready)
|
|||
if (ret) {
|
||||
init_counter_refs();
|
||||
static_branch_enable(&arch_scale_freq_key);
|
||||
register_freq_invariance_syscore_ops();
|
||||
pr_info("Estimated ratio of average max frequency by base frequency (times 1024): %llu\n", arch_max_freq_ratio);
|
||||
} else {
|
||||
pr_debug("Couldn't determine max cpu frequency, necessary for scale-invariant accounting.\n");
|
||||
|
|
|
@ -9,6 +9,34 @@
|
|||
(X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \
|
||||
| X86_CR4_OSXMMEXCPT | X86_CR4_PGE | X86_CR4_TSD | X86_CR4_FSGSBASE)
|
||||
|
||||
#define BUILD_KVM_GPR_ACCESSORS(lname, uname) \
|
||||
static __always_inline unsigned long kvm_##lname##_read(struct kvm_vcpu *vcpu)\
|
||||
{ \
|
||||
return vcpu->arch.regs[VCPU_REGS_##uname]; \
|
||||
} \
|
||||
static __always_inline void kvm_##lname##_write(struct kvm_vcpu *vcpu, \
|
||||
unsigned long val) \
|
||||
{ \
|
||||
vcpu->arch.regs[VCPU_REGS_##uname] = val; \
|
||||
}
|
||||
BUILD_KVM_GPR_ACCESSORS(rax, RAX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rbx, RBX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rcx, RCX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rdx, RDX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rbp, RBP)
|
||||
BUILD_KVM_GPR_ACCESSORS(rsi, RSI)
|
||||
BUILD_KVM_GPR_ACCESSORS(rdi, RDI)
|
||||
#ifdef CONFIG_X86_64
|
||||
BUILD_KVM_GPR_ACCESSORS(r8, R8)
|
||||
BUILD_KVM_GPR_ACCESSORS(r9, R9)
|
||||
BUILD_KVM_GPR_ACCESSORS(r10, R10)
|
||||
BUILD_KVM_GPR_ACCESSORS(r11, R11)
|
||||
BUILD_KVM_GPR_ACCESSORS(r12, R12)
|
||||
BUILD_KVM_GPR_ACCESSORS(r13, R13)
|
||||
BUILD_KVM_GPR_ACCESSORS(r14, R14)
|
||||
BUILD_KVM_GPR_ACCESSORS(r15, R15)
|
||||
#endif
|
||||
|
||||
static inline bool kvm_register_is_available(struct kvm_vcpu *vcpu,
|
||||
enum kvm_reg reg)
|
||||
{
|
||||
|
@ -34,35 +62,6 @@ static inline void kvm_register_mark_dirty(struct kvm_vcpu *vcpu,
|
|||
__set_bit(reg, (unsigned long *)&vcpu->arch.regs_dirty);
|
||||
}
|
||||
|
||||
#define BUILD_KVM_GPR_ACCESSORS(lname, uname) \
|
||||
static __always_inline unsigned long kvm_##lname##_read(struct kvm_vcpu *vcpu)\
|
||||
{ \
|
||||
return vcpu->arch.regs[VCPU_REGS_##uname]; \
|
||||
} \
|
||||
static __always_inline void kvm_##lname##_write(struct kvm_vcpu *vcpu, \
|
||||
unsigned long val) \
|
||||
{ \
|
||||
vcpu->arch.regs[VCPU_REGS_##uname] = val; \
|
||||
kvm_register_mark_dirty(vcpu, VCPU_REGS_##uname); \
|
||||
}
|
||||
BUILD_KVM_GPR_ACCESSORS(rax, RAX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rbx, RBX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rcx, RCX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rdx, RDX)
|
||||
BUILD_KVM_GPR_ACCESSORS(rbp, RBP)
|
||||
BUILD_KVM_GPR_ACCESSORS(rsi, RSI)
|
||||
BUILD_KVM_GPR_ACCESSORS(rdi, RDI)
|
||||
#ifdef CONFIG_X86_64
|
||||
BUILD_KVM_GPR_ACCESSORS(r8, R8)
|
||||
BUILD_KVM_GPR_ACCESSORS(r9, R9)
|
||||
BUILD_KVM_GPR_ACCESSORS(r10, R10)
|
||||
BUILD_KVM_GPR_ACCESSORS(r11, R11)
|
||||
BUILD_KVM_GPR_ACCESSORS(r12, R12)
|
||||
BUILD_KVM_GPR_ACCESSORS(r13, R13)
|
||||
BUILD_KVM_GPR_ACCESSORS(r14, R14)
|
||||
BUILD_KVM_GPR_ACCESSORS(r15, R15)
|
||||
#endif
|
||||
|
||||
static inline unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg)
|
||||
{
|
||||
if (WARN_ON_ONCE((unsigned int)reg >= NR_VCPU_REGS))
|
||||
|
|
|
@ -44,8 +44,15 @@
|
|||
#define PT32_ROOT_LEVEL 2
|
||||
#define PT32E_ROOT_LEVEL 3
|
||||
|
||||
static inline u64 rsvd_bits(int s, int e)
|
||||
static __always_inline u64 rsvd_bits(int s, int e)
|
||||
{
|
||||
BUILD_BUG_ON(__builtin_constant_p(e) && __builtin_constant_p(s) && e < s);
|
||||
|
||||
if (__builtin_constant_p(e))
|
||||
BUILD_BUG_ON(e > 63);
|
||||
else
|
||||
e &= 63;
|
||||
|
||||
if (e < s)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -200,6 +200,9 @@ static bool svm_get_nested_state_pages(struct kvm_vcpu *vcpu)
|
|||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
if (WARN_ON(!is_guest_mode(vcpu)))
|
||||
return true;
|
||||
|
||||
if (!nested_svm_vmrun_msrpm(svm)) {
|
||||
vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
||||
vcpu->run->internal.suberror =
|
||||
|
|
|
@ -1415,16 +1415,13 @@ static void sev_es_sync_to_ghcb(struct vcpu_svm *svm)
|
|||
* to be returned:
|
||||
* GPRs RAX, RBX, RCX, RDX
|
||||
*
|
||||
* Copy their values to the GHCB if they are dirty.
|
||||
* Copy their values, even if they may not have been written during the
|
||||
* VM-Exit. It's the guest's responsibility to not consume random data.
|
||||
*/
|
||||
if (kvm_register_is_dirty(vcpu, VCPU_REGS_RAX))
|
||||
ghcb_set_rax(ghcb, vcpu->arch.regs[VCPU_REGS_RAX]);
|
||||
if (kvm_register_is_dirty(vcpu, VCPU_REGS_RBX))
|
||||
ghcb_set_rbx(ghcb, vcpu->arch.regs[VCPU_REGS_RBX]);
|
||||
if (kvm_register_is_dirty(vcpu, VCPU_REGS_RCX))
|
||||
ghcb_set_rcx(ghcb, vcpu->arch.regs[VCPU_REGS_RCX]);
|
||||
if (kvm_register_is_dirty(vcpu, VCPU_REGS_RDX))
|
||||
ghcb_set_rdx(ghcb, vcpu->arch.regs[VCPU_REGS_RDX]);
|
||||
ghcb_set_rax(ghcb, vcpu->arch.regs[VCPU_REGS_RAX]);
|
||||
ghcb_set_rbx(ghcb, vcpu->arch.regs[VCPU_REGS_RBX]);
|
||||
ghcb_set_rcx(ghcb, vcpu->arch.regs[VCPU_REGS_RCX]);
|
||||
ghcb_set_rdx(ghcb, vcpu->arch.regs[VCPU_REGS_RDX]);
|
||||
}
|
||||
|
||||
static void sev_es_sync_from_ghcb(struct vcpu_svm *svm)
|
||||
|
|
|
@ -3739,6 +3739,8 @@ static __no_kcsan fastpath_t svm_vcpu_run(struct kvm_vcpu *vcpu)
|
|||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
trace_kvm_entry(vcpu);
|
||||
|
||||
svm->vmcb->save.rax = vcpu->arch.regs[VCPU_REGS_RAX];
|
||||
svm->vmcb->save.rsp = vcpu->arch.regs[VCPU_REGS_RSP];
|
||||
svm->vmcb->save.rip = vcpu->arch.regs[VCPU_REGS_RIP];
|
||||
|
|
|
@ -3124,13 +3124,9 @@ static int nested_vmx_check_vmentry_hw(struct kvm_vcpu *vcpu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
|
||||
static bool nested_get_evmcs_page(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
struct kvm_host_map *map;
|
||||
struct page *page;
|
||||
u64 hpa;
|
||||
|
||||
/*
|
||||
* hv_evmcs may end up being not mapped after migration (when
|
||||
|
@ -3153,6 +3149,17 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
|
|||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
struct kvm_host_map *map;
|
||||
struct page *page;
|
||||
u64 hpa;
|
||||
|
||||
if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
|
||||
/*
|
||||
* Translate L1 physical address to host physical
|
||||
|
@ -3221,6 +3228,18 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
|
|||
exec_controls_setbit(vmx, CPU_BASED_USE_MSR_BITMAPS);
|
||||
else
|
||||
exec_controls_clearbit(vmx, CPU_BASED_USE_MSR_BITMAPS);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool vmx_get_nested_state_pages(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (!nested_get_evmcs_page(vcpu))
|
||||
return false;
|
||||
|
||||
if (is_guest_mode(vcpu) && !nested_get_vmcs12_pages(vcpu))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -6077,11 +6096,14 @@ static int vmx_get_nested_state(struct kvm_vcpu *vcpu,
|
|||
if (is_guest_mode(vcpu)) {
|
||||
sync_vmcs02_to_vmcs12(vcpu, vmcs12);
|
||||
sync_vmcs02_to_vmcs12_rare(vcpu, vmcs12);
|
||||
} else if (!vmx->nested.need_vmcs12_to_shadow_sync) {
|
||||
if (vmx->nested.hv_evmcs)
|
||||
copy_enlightened_to_vmcs12(vmx);
|
||||
else if (enable_shadow_vmcs)
|
||||
copy_shadow_to_vmcs12(vmx);
|
||||
} else {
|
||||
copy_vmcs02_to_vmcs12_rare(vcpu, get_vmcs12(vcpu));
|
||||
if (!vmx->nested.need_vmcs12_to_shadow_sync) {
|
||||
if (vmx->nested.hv_evmcs)
|
||||
copy_enlightened_to_vmcs12(vmx);
|
||||
else if (enable_shadow_vmcs)
|
||||
copy_shadow_to_vmcs12(vmx);
|
||||
}
|
||||
}
|
||||
|
||||
BUILD_BUG_ON(sizeof(user_vmx_nested_state->vmcs12) < VMCS12_SIZE);
|
||||
|
@ -6602,7 +6624,7 @@ struct kvm_x86_nested_ops vmx_nested_ops = {
|
|||
.hv_timer_pending = nested_vmx_preemption_timer_pending,
|
||||
.get_state = vmx_get_nested_state,
|
||||
.set_state = vmx_set_nested_state,
|
||||
.get_nested_state_pages = nested_get_vmcs12_pages,
|
||||
.get_nested_state_pages = vmx_get_nested_state_pages,
|
||||
.write_log_dirty = nested_vmx_write_pml_buffer,
|
||||
.enable_evmcs = nested_enable_evmcs,
|
||||
.get_evmcs_version = nested_get_evmcs_version,
|
||||
|
|
|
@ -29,7 +29,7 @@ static struct kvm_event_hw_type_mapping intel_arch_events[] = {
|
|||
[4] = { 0x2e, 0x41, PERF_COUNT_HW_CACHE_MISSES },
|
||||
[5] = { 0xc4, 0x00, PERF_COUNT_HW_BRANCH_INSTRUCTIONS },
|
||||
[6] = { 0xc5, 0x00, PERF_COUNT_HW_BRANCH_MISSES },
|
||||
[7] = { 0x00, 0x30, PERF_COUNT_HW_REF_CPU_CYCLES },
|
||||
[7] = { 0x00, 0x03, PERF_COUNT_HW_REF_CPU_CYCLES },
|
||||
};
|
||||
|
||||
/* mapping between fixed pmc index and intel_arch_events array */
|
||||
|
@ -345,7 +345,9 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||
|
||||
pmu->nr_arch_gp_counters = min_t(int, eax.split.num_counters,
|
||||
x86_pmu.num_counters_gp);
|
||||
eax.split.bit_width = min_t(int, eax.split.bit_width, x86_pmu.bit_width_gp);
|
||||
pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << eax.split.bit_width) - 1;
|
||||
eax.split.mask_length = min_t(int, eax.split.mask_length, x86_pmu.events_mask_len);
|
||||
pmu->available_event_types = ~entry->ebx &
|
||||
((1ull << eax.split.mask_length) - 1);
|
||||
|
||||
|
@ -355,6 +357,8 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||
pmu->nr_arch_fixed_counters =
|
||||
min_t(int, edx.split.num_counters_fixed,
|
||||
x86_pmu.num_counters_fixed);
|
||||
edx.split.bit_width_fixed = min_t(int,
|
||||
edx.split.bit_width_fixed, x86_pmu.bit_width_fixed);
|
||||
pmu->counter_bitmask[KVM_PMC_FIXED] =
|
||||
((u64)1 << edx.split.bit_width_fixed) - 1;
|
||||
}
|
||||
|
|
|
@ -6653,6 +6653,8 @@ reenter_guest:
|
|||
if (vmx->emulation_required)
|
||||
return EXIT_FASTPATH_NONE;
|
||||
|
||||
trace_kvm_entry(vcpu);
|
||||
|
||||
if (vmx->ple_window_dirty) {
|
||||
vmx->ple_window_dirty = false;
|
||||
vmcs_write32(PLE_WINDOW, vmx->ple_window);
|
||||
|
|
|
@ -105,6 +105,7 @@ static u64 __read_mostly cr4_reserved_bits = CR4_RESERVED_BITS;
|
|||
|
||||
static void update_cr8_intercept(struct kvm_vcpu *vcpu);
|
||||
static void process_nmi(struct kvm_vcpu *vcpu);
|
||||
static void process_smi(struct kvm_vcpu *vcpu);
|
||||
static void enter_smm(struct kvm_vcpu *vcpu);
|
||||
static void __kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags);
|
||||
static void store_regs(struct kvm_vcpu *vcpu);
|
||||
|
@ -4230,6 +4231,9 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
|
|||
{
|
||||
process_nmi(vcpu);
|
||||
|
||||
if (kvm_check_request(KVM_REQ_SMI, vcpu))
|
||||
process_smi(vcpu);
|
||||
|
||||
/*
|
||||
* In guest mode, payload delivery should be deferred,
|
||||
* so that the L1 hypervisor can intercept #PF before
|
||||
|
@ -8802,9 +8806,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
|
|||
|
||||
if (kvm_request_pending(vcpu)) {
|
||||
if (kvm_check_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu)) {
|
||||
if (WARN_ON_ONCE(!is_guest_mode(vcpu)))
|
||||
;
|
||||
else if (unlikely(!kvm_x86_ops.nested_ops->get_nested_state_pages(vcpu))) {
|
||||
if (unlikely(!kvm_x86_ops.nested_ops->get_nested_state_pages(vcpu))) {
|
||||
r = 0;
|
||||
goto out;
|
||||
}
|
||||
|
@ -8988,8 +8990,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
|
|||
kvm_x86_ops.request_immediate_exit(vcpu);
|
||||
}
|
||||
|
||||
trace_kvm_entry(vcpu);
|
||||
|
||||
fpregs_assert_state_consistent();
|
||||
if (test_thread_flag(TIF_NEED_FPU_LOAD))
|
||||
switch_fpu_return();
|
||||
|
@ -11556,6 +11556,7 @@ int kvm_sev_es_string_io(struct kvm_vcpu *vcpu, unsigned int size,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_sev_es_string_io);
|
||||
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_entry);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_exit);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_fast_mmio);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_inj_virq);
|
||||
|
|
|
@ -26,6 +26,16 @@
|
|||
#include <asm/fpu/api.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
/*
|
||||
* Use KFPU_387. MMX instructions are not affected by MXCSR,
|
||||
* but both AMD and Intel documentation states that even integer MMX
|
||||
* operations will result in #MF if an exception is pending in FCW.
|
||||
*
|
||||
* EMMS is not needed afterwards because, after calling kernel_fpu_end(),
|
||||
* any subsequent user of the 387 stack will reinitialize it using
|
||||
* KFPU_387.
|
||||
*/
|
||||
|
||||
void *_mmx_memcpy(void *to, const void *from, size_t len)
|
||||
{
|
||||
void *p;
|
||||
|
@ -37,7 +47,7 @@ void *_mmx_memcpy(void *to, const void *from, size_t len)
|
|||
p = to;
|
||||
i = len >> 6; /* len/64 */
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"1: prefetch (%0)\n" /* This set is 28 bytes */
|
||||
|
@ -127,7 +137,7 @@ static void fast_clear_page(void *page)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
" pxor %%mm0, %%mm0\n" : :
|
||||
|
@ -160,7 +170,7 @@ static void fast_copy_page(void *to, void *from)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
/*
|
||||
* maybe the prefetch stuff can go before the expensive fnsave...
|
||||
|
@ -247,7 +257,7 @@ static void fast_clear_page(void *page)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
" pxor %%mm0, %%mm0\n" : :
|
||||
|
@ -282,7 +292,7 @@ static void fast_copy_page(void *to, void *from)
|
|||
{
|
||||
int i;
|
||||
|
||||
kernel_fpu_begin();
|
||||
kernel_fpu_begin_mask(KFPU_387);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"1: prefetch (%0)\n"
|
||||
|
|
|
@ -583,6 +583,13 @@ DEFINE_IDTENTRY_RAW(xenpv_exc_debug)
|
|||
exc_debug(regs);
|
||||
}
|
||||
|
||||
DEFINE_IDTENTRY_RAW(exc_xen_unknown_trap)
|
||||
{
|
||||
/* This should never happen and there is no way to handle it. */
|
||||
pr_err("Unknown trap in Xen PV mode.");
|
||||
BUG();
|
||||
}
|
||||
|
||||
struct trap_array_entry {
|
||||
void (*orig)(void);
|
||||
void (*xen)(void);
|
||||
|
@ -631,6 +638,7 @@ static bool __ref get_trap_addr(void **addr, unsigned int ist)
|
|||
{
|
||||
unsigned int nr;
|
||||
bool ist_okay = false;
|
||||
bool found = false;
|
||||
|
||||
/*
|
||||
* Replace trap handler addresses by Xen specific ones.
|
||||
|
@ -645,6 +653,7 @@ static bool __ref get_trap_addr(void **addr, unsigned int ist)
|
|||
if (*addr == entry->orig) {
|
||||
*addr = entry->xen;
|
||||
ist_okay = entry->ist_okay;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -655,9 +664,13 @@ static bool __ref get_trap_addr(void **addr, unsigned int ist)
|
|||
nr = (*addr - (void *)early_idt_handler_array[0]) /
|
||||
EARLY_IDT_HANDLER_SIZE;
|
||||
*addr = (void *)xen_early_idt_handler_array[nr];
|
||||
found = true;
|
||||
}
|
||||
|
||||
if (WARN_ON(ist != 0 && !ist_okay))
|
||||
if (!found)
|
||||
*addr = (void *)xen_asm_exc_xen_unknown_trap;
|
||||
|
||||
if (WARN_ON(found && ist != 0 && !ist_okay))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
|
|
@ -178,6 +178,7 @@ xen_pv_trap asm_exc_simd_coprocessor_error
|
|||
#ifdef CONFIG_IA32_EMULATION
|
||||
xen_pv_trap entry_INT80_compat
|
||||
#endif
|
||||
xen_pv_trap asm_exc_xen_unknown_trap
|
||||
xen_pv_trap asm_exc_xen_hypervisor_callback
|
||||
|
||||
__INIT
|
||||
|
|
|
@ -586,6 +586,8 @@ static int acpi_get_device_data(acpi_handle handle, struct acpi_device **device,
|
|||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
*device = NULL;
|
||||
|
||||
status = acpi_get_data_full(handle, acpi_scan_drop_device,
|
||||
(void **)device, callback);
|
||||
if (ACPI_FAILURE(status) || !*device) {
|
||||
|
|
|
@ -208,6 +208,16 @@ int device_links_read_lock_held(void)
|
|||
#endif
|
||||
#endif /* !CONFIG_SRCU */
|
||||
|
||||
static bool device_is_ancestor(struct device *dev, struct device *target)
|
||||
{
|
||||
while (target->parent) {
|
||||
target = target->parent;
|
||||
if (dev == target)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* device_is_dependent - Check if one device depends on another one
|
||||
* @dev: Device to check dependencies for.
|
||||
|
@ -221,7 +231,12 @@ int device_is_dependent(struct device *dev, void *target)
|
|||
struct device_link *link;
|
||||
int ret;
|
||||
|
||||
if (dev == target)
|
||||
/*
|
||||
* The "ancestors" check is needed to catch the case when the target
|
||||
* device has not been completely initialized yet and it is still
|
||||
* missing from the list of children of its parent device.
|
||||
*/
|
||||
if (dev == target || device_is_ancestor(dev, target))
|
||||
return 1;
|
||||
|
||||
ret = device_for_each_child(dev, target, device_is_dependent);
|
||||
|
@ -456,7 +471,9 @@ static int devlink_add_symlinks(struct device *dev,
|
|||
struct device *con = link->consumer;
|
||||
char *buf;
|
||||
|
||||
len = max(strlen(dev_name(sup)), strlen(dev_name(con)));
|
||||
len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
|
||||
strlen(dev_bus_name(con)) + strlen(dev_name(con)));
|
||||
len += strlen(":");
|
||||
len += strlen("supplier:") + 1;
|
||||
buf = kzalloc(len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
|
@ -470,12 +487,12 @@ static int devlink_add_symlinks(struct device *dev,
|
|||
if (ret)
|
||||
goto err_con;
|
||||
|
||||
snprintf(buf, len, "consumer:%s", dev_name(con));
|
||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||
ret = sysfs_create_link(&sup->kobj, &link->link_dev.kobj, buf);
|
||||
if (ret)
|
||||
goto err_con_dev;
|
||||
|
||||
snprintf(buf, len, "supplier:%s", dev_name(sup));
|
||||
snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
|
||||
ret = sysfs_create_link(&con->kobj, &link->link_dev.kobj, buf);
|
||||
if (ret)
|
||||
goto err_sup_dev;
|
||||
|
@ -483,7 +500,7 @@ static int devlink_add_symlinks(struct device *dev,
|
|||
goto out;
|
||||
|
||||
err_sup_dev:
|
||||
snprintf(buf, len, "consumer:%s", dev_name(con));
|
||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||
sysfs_remove_link(&sup->kobj, buf);
|
||||
err_con_dev:
|
||||
sysfs_remove_link(&link->link_dev.kobj, "consumer");
|
||||
|
@ -506,7 +523,9 @@ static void devlink_remove_symlinks(struct device *dev,
|
|||
sysfs_remove_link(&link->link_dev.kobj, "consumer");
|
||||
sysfs_remove_link(&link->link_dev.kobj, "supplier");
|
||||
|
||||
len = max(strlen(dev_name(sup)), strlen(dev_name(con)));
|
||||
len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
|
||||
strlen(dev_bus_name(con)) + strlen(dev_name(con)));
|
||||
len += strlen(":");
|
||||
len += strlen("supplier:") + 1;
|
||||
buf = kzalloc(len, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
|
@ -514,9 +533,9 @@ static void devlink_remove_symlinks(struct device *dev,
|
|||
return;
|
||||
}
|
||||
|
||||
snprintf(buf, len, "supplier:%s", dev_name(sup));
|
||||
snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
|
||||
sysfs_remove_link(&con->kobj, buf);
|
||||
snprintf(buf, len, "consumer:%s", dev_name(con));
|
||||
snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
|
||||
sysfs_remove_link(&sup->kobj, buf);
|
||||
kfree(buf);
|
||||
}
|
||||
|
@ -737,8 +756,9 @@ struct device_link *device_link_add(struct device *consumer,
|
|||
|
||||
link->link_dev.class = &devlink_class;
|
||||
device_set_pm_not_required(&link->link_dev);
|
||||
dev_set_name(&link->link_dev, "%s--%s",
|
||||
dev_name(supplier), dev_name(consumer));
|
||||
dev_set_name(&link->link_dev, "%s:%s--%s:%s",
|
||||
dev_bus_name(supplier), dev_name(supplier),
|
||||
dev_bus_name(consumer), dev_name(consumer));
|
||||
if (device_register(&link->link_dev)) {
|
||||
put_device(consumer);
|
||||
put_device(supplier);
|
||||
|
@ -1808,9 +1828,7 @@ const char *dev_driver_string(const struct device *dev)
|
|||
* never change once they are set, so they don't need special care.
|
||||
*/
|
||||
drv = READ_ONCE(dev->driver);
|
||||
return drv ? drv->name :
|
||||
(dev->bus ? dev->bus->name :
|
||||
(dev->class ? dev->class->name : ""));
|
||||
return drv ? drv->name : dev_bus_name(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(dev_driver_string);
|
||||
|
||||
|
|
|
@ -370,13 +370,6 @@ static void driver_bound(struct device *dev)
|
|||
|
||||
device_pm_check_callbacks(dev);
|
||||
|
||||
/*
|
||||
* Reorder successfully probed devices to the end of the device list.
|
||||
* This ensures that suspend/resume order matches probe order, which
|
||||
* is usually what drivers rely on.
|
||||
*/
|
||||
device_pm_move_to_tail(dev);
|
||||
|
||||
/*
|
||||
* Make sure the device is no longer in one of the deferred lists and
|
||||
* kick off retrying all pending devices
|
||||
|
@ -619,6 +612,8 @@ dev_groups_failed:
|
|||
else if (drv->remove)
|
||||
drv->remove(dev);
|
||||
probe_failed:
|
||||
kfree(dev->dma_range_map);
|
||||
dev->dma_range_map = NULL;
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
|
||||
|
|
|
@ -366,6 +366,8 @@ int devm_platform_get_irqs_affinity(struct platform_device *dev,
|
|||
return -ERANGE;
|
||||
|
||||
nvec = platform_irq_count(dev);
|
||||
if (nvec < 0)
|
||||
return nvec;
|
||||
|
||||
if (nvec < minvec)
|
||||
return -ENOSPC;
|
||||
|
|
|
@ -945,7 +945,8 @@ static void blkif_set_queue_limits(struct blkfront_info *info)
|
|||
if (info->feature_discard) {
|
||||
blk_queue_flag_set(QUEUE_FLAG_DISCARD, rq);
|
||||
blk_queue_max_discard_sectors(rq, get_capacity(gd));
|
||||
rq->limits.discard_granularity = info->discard_granularity;
|
||||
rq->limits.discard_granularity = info->discard_granularity ?:
|
||||
info->physical_sector_size;
|
||||
rq->limits.discard_alignment = info->discard_alignment;
|
||||
if (info->feature_secdiscard)
|
||||
blk_queue_flag_set(QUEUE_FLAG_SECERASE, rq);
|
||||
|
@ -2179,19 +2180,12 @@ static void blkfront_closing(struct blkfront_info *info)
|
|||
|
||||
static void blkfront_setup_discard(struct blkfront_info *info)
|
||||
{
|
||||
int err;
|
||||
unsigned int discard_granularity;
|
||||
unsigned int discard_alignment;
|
||||
|
||||
info->feature_discard = 1;
|
||||
err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
|
||||
"discard-granularity", "%u", &discard_granularity,
|
||||
"discard-alignment", "%u", &discard_alignment,
|
||||
NULL);
|
||||
if (!err) {
|
||||
info->discard_granularity = discard_granularity;
|
||||
info->discard_alignment = discard_alignment;
|
||||
}
|
||||
info->discard_granularity = xenbus_read_unsigned(info->xbdev->otherend,
|
||||
"discard-granularity",
|
||||
0);
|
||||
info->discard_alignment = xenbus_read_unsigned(info->xbdev->otherend,
|
||||
"discard-alignment", 0);
|
||||
info->feature_secdiscard =
|
||||
!!xenbus_read_unsigned(info->xbdev->otherend, "discard-secure",
|
||||
0);
|
||||
|
|
|
@ -54,6 +54,7 @@ static int integrator_lm_populate(int num, struct device *dev)
|
|||
ret = of_platform_default_populate(child, NULL, dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to populate module\n");
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,8 +6,6 @@ config MXC_CLK
|
|||
|
||||
config MXC_CLK_SCU
|
||||
tristate
|
||||
depends on ARCH_MXC
|
||||
depends on IMX_SCU && HAVE_ARM_SMCCC
|
||||
|
||||
config CLK_IMX1
|
||||
def_bool SOC_IMX1
|
||||
|
|
|
@ -392,7 +392,8 @@ static int mmp2_audio_clk_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused mmp2_audio_clk_suspend(struct device *dev)
|
||||
#ifdef CONFIG_PM
|
||||
static int mmp2_audio_clk_suspend(struct device *dev)
|
||||
{
|
||||
struct mmp2_audio_clk *priv = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -404,7 +405,7 @@ static int __maybe_unused mmp2_audio_clk_suspend(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused mmp2_audio_clk_resume(struct device *dev)
|
||||
static int mmp2_audio_clk_resume(struct device *dev)
|
||||
{
|
||||
struct mmp2_audio_clk *priv = dev_get_drvdata(dev);
|
||||
|
||||
|
@ -415,6 +416,7 @@ static int __maybe_unused mmp2_audio_clk_resume(struct device *dev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops mmp2_audio_clk_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(mmp2_audio_clk_suspend, mmp2_audio_clk_resume, NULL)
|
||||
|
|
|
@ -891,21 +891,6 @@ static struct clk_branch gcc_boot_rom_ahb_clk = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camera_ahb_clk = {
|
||||
.halt_reg = 0xb008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.hwcg_reg = 0xb008,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0xb008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camera_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camera_hf_axi_clk = {
|
||||
.halt_reg = 0xb020,
|
||||
.halt_check = BRANCH_HALT,
|
||||
|
@ -2317,7 +2302,6 @@ static struct clk_regmap *gcc_sc7180_clocks[] = {
|
|||
[GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr,
|
||||
[GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr,
|
||||
[GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
|
||||
[GCC_CAMERA_AHB_CLK] = &gcc_camera_ahb_clk.clkr,
|
||||
[GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr,
|
||||
[GCC_CAMERA_THROTTLE_HF_AXI_CLK] = &gcc_camera_throttle_hf_axi_clk.clkr,
|
||||
[GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr,
|
||||
|
@ -2519,11 +2503,12 @@ static int gcc_sc7180_probe(struct platform_device *pdev)
|
|||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_DISP_AHB_CLK
|
||||
* GCC_GPU_CFG_AHB_CLK
|
||||
* GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK,
|
||||
* GCC_DISP_AHB_CLK, GCC_GPU_CFG_AHB_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче