mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
Merge remote branch 'android12-5.10' of https://android.googlesource.com/kernel/common
* android12-5.10: (1647 commits)
FROMGIT: mm/page_owner: record the timestamp of all pages during free
UPSTREAM: mm/page_io: use pr_alert_ratelimited for swap read/write errors
ANDROID: roll back xt_IDLETIMER to 5.10.21 upstream/vanilla version
ANDROID: qcom: Add ip, rtnl and free related symbols
FROMGIT: power: supply: Fix build error when CONFIG_POWER_SUPPLY is not enabled.
FROMGIT: usb: dwc3: gadget: modify the scale in vbus_draw callback
BACKPORT: FROMLIST: usb: dwc3: gadget: Clear DEP flags after stop transfers in ep disable
FROMLIST: Makefile: fix GDB warning with CONFIG_RELR
ANDROID: refresh ABI XML before enabling KMI enforcement
Revert "Revert "ANDROID: GKI: Enable bounds sanitizer""
Revert "ANDROID: Revert "f2fs: fix to tag FIEMAP_EXTENT_MERGED in f2fs_fiemap()""
ANDROID: Enforce KMI stability
ANDROID: enable options prior to enforcing KMI
Revert "ANDROID: GKI: temporarily disable LTO/CFI"
ANDROID: gki_defconfig: Enable NET_CLS_{BASIC,TCINDEX,MATCHALL} & NET_ACT_{GACT,MIRRED}
FROMLIST: selftests: Add a MREMAP_DONTUNMAP selftest for shmem
FROMLIST: mm: Extend MREMAP_DONTUNMAP to non-anonymous mappings
ANDROID: GKI: enable CONFIG_CMA_SYSFS
ANDROID: make cma_sysfs experimental
FROMLIST: mm: cma: support sysfs
...
Change-Id: I6145eddeb253bea33164fc909e7790d30f17ef1f
This commit is contained in:
commit
d648938407
|
|
@ -26,8 +26,9 @@ Date: September 2008
|
|||
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
||||
Description:
|
||||
The file /sys/devices/system/memory/memoryX/phys_device
|
||||
is read-only and is designed to show the name of physical
|
||||
memory device. Implementation is currently incomplete.
|
||||
is read-only; it is a legacy interface only ever used on s390x
|
||||
to expose the covered storage increment.
|
||||
Users: Legacy s390-tools lsmem/chmem
|
||||
|
||||
What: /sys/devices/system/memory/memoryX/phys_index
|
||||
Date: September 2008
|
||||
|
|
|
|||
|
|
@ -409,3 +409,27 @@ Description: Give a way to change checkpoint merge daemon's io priority.
|
|||
I/O priority "3". We can select the class between "rt" and "be",
|
||||
and set the I/O priority within valid range of it. "," delimiter
|
||||
is necessary in between I/O class and priority number.
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/compr_written_block
|
||||
Date: March 2021
|
||||
Contact: "Daeho Jeong" <daehojeong@google.com>
|
||||
Description: Show the block count written after compression since mount. Note
|
||||
that when the compressed blocks are deleted, this count doesn't
|
||||
decrease. If you write "0" here, you can initialize
|
||||
compr_written_block and compr_saved_block to "0".
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/compr_saved_block
|
||||
Date: March 2021
|
||||
Contact: "Daeho Jeong" <daehojeong@google.com>
|
||||
Description: Show the saved block count with compression since mount. Note
|
||||
that when the compressed blocks are deleted, this count doesn't
|
||||
decrease. If you write "0" here, you can initialize
|
||||
compr_written_block and compr_saved_block to "0".
|
||||
|
||||
What: /sys/fs/f2fs/<disk>/compr_new_inode
|
||||
Date: March 2021
|
||||
Contact: "Daeho Jeong" <daehojeong@google.com>
|
||||
Description: Show the count of inode newly enabled for compression since mount.
|
||||
Note that when the compression is disabled for the files, this count
|
||||
doesn't decrease. If you write "0" here, you can initialize
|
||||
compr_new_inode to "0".
|
||||
|
|
|
|||
25
Documentation/ABI/testing/sysfs-kernel-mm-cma
Normal file
25
Documentation/ABI/testing/sysfs-kernel-mm-cma
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
What: /sys/kernel/mm/cma/
|
||||
Date: Feb 2021
|
||||
Contact: Minchan Kim <minchan@kernel.org>
|
||||
Description:
|
||||
/sys/kernel/mm/cma/ contains a subdirectory for each CMA
|
||||
heap name (also sometimes called CMA areas).
|
||||
|
||||
Each CMA heap subdirectory (that is, each
|
||||
/sys/kernel/mm/cma/<cma-heap-name> directory) contains the
|
||||
following items:
|
||||
|
||||
alloc_pages_success
|
||||
alloc_pages_fail
|
||||
|
||||
What: /sys/kernel/mm/cma/<cma-heap-name>/alloc_pages_success
|
||||
Date: Feb 2021
|
||||
Contact: Minchan Kim <minchan@kernel.org>
|
||||
Description:
|
||||
the number of pages CMA API succeeded to allocate
|
||||
|
||||
What: /sys/kernel/mm/cma/<cma-heap-name>/alloc_pages_fail
|
||||
Date: Feb 2021
|
||||
Contact: Minchan Kim <minchan@kernel.org>
|
||||
Description:
|
||||
the number of pages CMA API failed to allocate
|
||||
|
|
@ -160,8 +160,8 @@ Under each memory block, you can see 5 files:
|
|||
|
||||
"online_movable", "online", "offline" command
|
||||
which will be performed on all sections in the block.
|
||||
``phys_device`` read-only: designed to show the name of physical memory
|
||||
device. This is not well implemented now.
|
||||
``phys_device`` read-only: legacy interface only ever used on s390x to
|
||||
expose the covered storage increment.
|
||||
``removable`` read-only: contains an integer value indicating
|
||||
whether the memory block is removable or not
|
||||
removable. A value of 1 indicates that the memory
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ PMU events
|
|||
----------
|
||||
|
||||
The PMU driver registers a single PMU device for the whole interconnect,
|
||||
see /sys/bus/event_source/devices/arm_cmn. Multi-chip systems may link
|
||||
see /sys/bus/event_source/devices/arm_cmn_0. Multi-chip systems may link
|
||||
more than one CMN together via external CCIX links - in this situation,
|
||||
each mesh counts its own events entirely independently, and additional
|
||||
PMU devices will be named arm_cmn_{1..n}.
|
||||
|
|
|
|||
|
|
@ -999,11 +999,11 @@ that benefit from having their data cached, zone_reclaim_mode should be
|
|||
left disabled as the caching effect is likely to be more important than
|
||||
data locality.
|
||||
|
||||
zone_reclaim may be enabled if it's known that the workload is partitioned
|
||||
such that each partition fits within a NUMA node and that accessing remote
|
||||
memory would cause a measurable performance reduction. The page allocator
|
||||
will then reclaim easily reusable pages (those page cache pages that are
|
||||
currently not used) before allocating off node pages.
|
||||
Consider enabling one or more zone_reclaim mode bits if it's known that the
|
||||
workload is partitioned such that each partition fits within a NUMA node
|
||||
and that accessing remote memory would cause a measurable performance
|
||||
reduction. The page allocator will take additional actions before
|
||||
allocating off node pages.
|
||||
|
||||
Allowing zone reclaim to write out pages stops processes that are
|
||||
writing large amounts of data from dirtying pages on other nodes. Zone
|
||||
|
|
|
|||
|
|
@ -1,105 +0,0 @@
|
|||
* Mediatek IOMMU Architecture Implementation
|
||||
|
||||
Some Mediatek SOCs contain a Multimedia Memory Management Unit (M4U), and
|
||||
this M4U have two generations of HW architecture. Generation one uses flat
|
||||
pagetable, and only supports 4K size page mapping. Generation two uses the
|
||||
ARM Short-Descriptor translation table format for address translation.
|
||||
|
||||
About the M4U Hardware Block Diagram, please check below:
|
||||
|
||||
EMI (External Memory Interface)
|
||||
|
|
||||
m4u (Multimedia Memory Management Unit)
|
||||
|
|
||||
+--------+
|
||||
| |
|
||||
gals0-rx gals1-rx (Global Async Local Sync rx)
|
||||
| |
|
||||
| |
|
||||
gals0-tx gals1-tx (Global Async Local Sync tx)
|
||||
| | Some SoCs may have GALS.
|
||||
+--------+
|
||||
|
|
||||
SMI Common(Smart Multimedia Interface Common)
|
||||
|
|
||||
+----------------+-------
|
||||
| |
|
||||
| gals-rx There may be GALS in some larbs.
|
||||
| |
|
||||
| |
|
||||
| gals-tx
|
||||
| |
|
||||
SMI larb0 SMI larb1 ... SoCs have several SMI local arbiter(larb).
|
||||
(display) (vdec)
|
||||
| |
|
||||
| |
|
||||
+-----+-----+ +----+----+
|
||||
| | | | | |
|
||||
| | |... | | | ... There are different ports in each larb.
|
||||
| | | | | |
|
||||
OVL0 RDMA0 WDMA0 MC PP VLD
|
||||
|
||||
As above, The Multimedia HW will go through SMI and M4U while it
|
||||
access EMI. SMI is a bridge between m4u and the Multimedia HW. It contain
|
||||
smi local arbiter and smi common. It will control whether the Multimedia
|
||||
HW should go though the m4u for translation or bypass it and talk
|
||||
directly with EMI. And also SMI help control the power domain and clocks for
|
||||
each local arbiter.
|
||||
Normally we specify a local arbiter(larb) for each multimedia HW
|
||||
like display, video decode, and camera. And there are different ports
|
||||
in each larb. Take a example, There are many ports like MC, PP, VLD in the
|
||||
video decode local arbiter, all these ports are according to the video HW.
|
||||
In some SoCs, there may be a GALS(Global Async Local Sync) module between
|
||||
smi-common and m4u, and additional GALS module between smi-larb and
|
||||
smi-common. GALS can been seen as a "asynchronous fifo" which could help
|
||||
synchronize for the modules in different clock frequency.
|
||||
|
||||
Required properties:
|
||||
- compatible : must be one of the following string:
|
||||
"mediatek,mt2701-m4u" for mt2701 which uses generation one m4u HW.
|
||||
"mediatek,mt2712-m4u" for mt2712 which uses generation two m4u HW.
|
||||
"mediatek,mt6779-m4u" for mt6779 which uses generation two m4u HW.
|
||||
"mediatek,mt7623-m4u", "mediatek,mt2701-m4u" for mt7623 which uses
|
||||
generation one m4u HW.
|
||||
"mediatek,mt8167-m4u" for mt8167 which uses generation two m4u HW.
|
||||
"mediatek,mt8173-m4u" for mt8173 which uses generation two m4u HW.
|
||||
"mediatek,mt8183-m4u" for mt8183 which uses generation two m4u HW.
|
||||
- reg : m4u register base and size.
|
||||
- interrupts : the interrupt of m4u.
|
||||
- clocks : must contain one entry for each clock-names.
|
||||
- clock-names : Only 1 optional clock:
|
||||
- "bclk": the block clock of m4u.
|
||||
Here is the list which require this "bclk":
|
||||
- mt2701, mt2712, mt7623 and mt8173.
|
||||
Note that m4u use the EMI clock which always has been enabled before kernel
|
||||
if there is no this "bclk".
|
||||
- mediatek,larbs : List of phandle to the local arbiters in the current Socs.
|
||||
Refer to bindings/memory-controllers/mediatek,smi-larb.txt. It must sort
|
||||
according to the local arbiter index, like larb0, larb1, larb2...
|
||||
- iommu-cells : must be 1. This is the mtk_m4u_id according to the HW.
|
||||
Specifies the mtk_m4u_id as defined in
|
||||
dt-binding/memory/mt2701-larb-port.h for mt2701, mt7623
|
||||
dt-binding/memory/mt2712-larb-port.h for mt2712,
|
||||
dt-binding/memory/mt6779-larb-port.h for mt6779,
|
||||
dt-binding/memory/mt8167-larb-port.h for mt8167,
|
||||
dt-binding/memory/mt8173-larb-port.h for mt8173, and
|
||||
dt-binding/memory/mt8183-larb-port.h for mt8183.
|
||||
|
||||
Example:
|
||||
iommu: iommu@10205000 {
|
||||
compatible = "mediatek,mt8173-m4u";
|
||||
reg = <0 0x10205000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_LOW>;
|
||||
clocks = <&infracfg CLK_INFRA_M4U>;
|
||||
clock-names = "bclk";
|
||||
mediatek,larbs = <&larb0 &larb1 &larb2 &larb3 &larb4 &larb5>;
|
||||
#iommu-cells = <1>;
|
||||
};
|
||||
|
||||
Example for a client device:
|
||||
display {
|
||||
compatible = "mediatek,mt8173-disp";
|
||||
iommus = <&iommu M4U_PORT_DISP_OVL0>,
|
||||
<&iommu M4U_PORT_DISP_RDMA0>;
|
||||
...
|
||||
};
|
||||
183
Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
Normal file
183
Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/iommu/mediatek,iommu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek IOMMU Architecture Implementation
|
||||
|
||||
maintainers:
|
||||
- Yong Wu <yong.wu@mediatek.com>
|
||||
|
||||
description: |+
|
||||
Some MediaTek SOCs contain a Multimedia Memory Management Unit (M4U), and
|
||||
this M4U have two generations of HW architecture. Generation one uses flat
|
||||
pagetable, and only supports 4K size page mapping. Generation two uses the
|
||||
ARM Short-Descriptor translation table format for address translation.
|
||||
|
||||
About the M4U Hardware Block Diagram, please check below:
|
||||
|
||||
EMI (External Memory Interface)
|
||||
|
|
||||
m4u (Multimedia Memory Management Unit)
|
||||
|
|
||||
+--------+
|
||||
| |
|
||||
gals0-rx gals1-rx (Global Async Local Sync rx)
|
||||
| |
|
||||
| |
|
||||
gals0-tx gals1-tx (Global Async Local Sync tx)
|
||||
| | Some SoCs may have GALS.
|
||||
+--------+
|
||||
|
|
||||
SMI Common(Smart Multimedia Interface Common)
|
||||
|
|
||||
+----------------+-------
|
||||
| |
|
||||
| gals-rx There may be GALS in some larbs.
|
||||
| |
|
||||
| |
|
||||
| gals-tx
|
||||
| |
|
||||
SMI larb0 SMI larb1 ... SoCs have several SMI local arbiter(larb).
|
||||
(display) (vdec)
|
||||
| |
|
||||
| |
|
||||
+-----+-----+ +----+----+
|
||||
| | | | | |
|
||||
| | |... | | | ... There are different ports in each larb.
|
||||
| | | | | |
|
||||
OVL0 RDMA0 WDMA0 MC PP VLD
|
||||
|
||||
As above, The Multimedia HW will go through SMI and M4U while it
|
||||
access EMI. SMI is a bridge between m4u and the Multimedia HW. It contain
|
||||
smi local arbiter and smi common. It will control whether the Multimedia
|
||||
HW should go though the m4u for translation or bypass it and talk
|
||||
directly with EMI. And also SMI help control the power domain and clocks for
|
||||
each local arbiter.
|
||||
|
||||
Normally we specify a local arbiter(larb) for each multimedia HW
|
||||
like display, video decode, and camera. And there are different ports
|
||||
in each larb. Take a example, There are many ports like MC, PP, VLD in the
|
||||
video decode local arbiter, all these ports are according to the video HW.
|
||||
|
||||
In some SoCs, there may be a GALS(Global Async Local Sync) module between
|
||||
smi-common and m4u, and additional GALS module between smi-larb and
|
||||
smi-common. GALS can been seen as a "asynchronous fifo" which could help
|
||||
synchronize for the modules in different clock frequency.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- mediatek,mt2701-m4u # generation one
|
||||
- mediatek,mt2712-m4u # generation two
|
||||
- mediatek,mt6779-m4u # generation two
|
||||
- mediatek,mt8167-m4u # generation two
|
||||
- mediatek,mt8173-m4u # generation two
|
||||
- mediatek,mt8183-m4u # generation two
|
||||
- mediatek,mt8192-m4u # generation two
|
||||
|
||||
- description: mt7623 generation one
|
||||
items:
|
||||
- const: mediatek,mt7623-m4u
|
||||
- const: mediatek,mt2701-m4u
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: bclk is the block clock.
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: bclk
|
||||
|
||||
mediatek,larbs:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
minItems: 1
|
||||
maxItems: 32
|
||||
description: |
|
||||
List of phandle to the local arbiters in the current Socs.
|
||||
Refer to bindings/memory-controllers/mediatek,smi-larb.yaml. It must sort
|
||||
according to the local arbiter index, like larb0, larb1, larb2...
|
||||
|
||||
'#iommu-cells':
|
||||
const: 1
|
||||
description: |
|
||||
This is the mtk_m4u_id according to the HW. Specifies the mtk_m4u_id as
|
||||
defined in
|
||||
dt-binding/memory/mt2701-larb-port.h for mt2701 and mt7623,
|
||||
dt-binding/memory/mt2712-larb-port.h for mt2712,
|
||||
dt-binding/memory/mt6779-larb-port.h for mt6779,
|
||||
dt-binding/memory/mt8167-larb-port.h for mt8167,
|
||||
dt-binding/memory/mt8173-larb-port.h for mt8173,
|
||||
dt-binding/memory/mt8183-larb-port.h for mt8183,
|
||||
dt-binding/memory/mt8192-larb-port.h for mt8192.
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- mediatek,larbs
|
||||
- '#iommu-cells'
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- mediatek,mt2701-m4u
|
||||
- mediatek,mt2712-m4u
|
||||
- mediatek,mt8173-m4u
|
||||
- mediatek,mt8192-m4u
|
||||
|
||||
then:
|
||||
required:
|
||||
- clocks
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt8192-m4u
|
||||
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
iommu: iommu@10205000 {
|
||||
compatible = "mediatek,mt8173-m4u";
|
||||
reg = <0x10205000 0x1000>;
|
||||
interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_LOW>;
|
||||
clocks = <&infracfg CLK_INFRA_M4U>;
|
||||
clock-names = "bclk";
|
||||
mediatek,larbs = <&larb0 &larb1 &larb2
|
||||
&larb3 &larb4 &larb5>;
|
||||
#iommu-cells = <1>;
|
||||
};
|
||||
|
||||
- |
|
||||
#include <dt-bindings/memory/mt8173-larb-port.h>
|
||||
|
||||
/* Example for a client device */
|
||||
display {
|
||||
compatible = "mediatek,mt8173-disp";
|
||||
iommus = <&iommu M4U_PORT_DISP_OVL0>,
|
||||
<&iommu M4U_PORT_DISP_RDMA0>;
|
||||
};
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
SMI (Smart Multimedia Interface) Common
|
||||
|
||||
The hardware block diagram please check bindings/iommu/mediatek,iommu.txt
|
||||
|
||||
Mediatek SMI have two generations of HW architecture, here is the list
|
||||
which generation the SoCs use:
|
||||
generation 1: mt2701 and mt7623.
|
||||
generation 2: mt2712, mt6779, mt8167, mt8173 and mt8183.
|
||||
|
||||
There's slight differences between the two SMI, for generation 2, the
|
||||
register which control the iommu port is at each larb's register base. But
|
||||
for generation 1, the register is at smi ao base(smi always on register
|
||||
base). Besides that, the smi async clock should be prepared and enabled for
|
||||
SMI generation 1 to transform the smi clock into emi clock domain, but that is
|
||||
not needed for SMI generation 2.
|
||||
|
||||
Required properties:
|
||||
- compatible : must be one of :
|
||||
"mediatek,mt2701-smi-common"
|
||||
"mediatek,mt2712-smi-common"
|
||||
"mediatek,mt6779-smi-common"
|
||||
"mediatek,mt7623-smi-common", "mediatek,mt2701-smi-common"
|
||||
"mediatek,mt8167-smi-common"
|
||||
"mediatek,mt8173-smi-common"
|
||||
"mediatek,mt8183-smi-common"
|
||||
- reg : the register and size of the SMI block.
|
||||
- power-domains : a phandle to the power domain of this local arbiter.
|
||||
- clocks : Must contain an entry for each entry in clock-names.
|
||||
- clock-names : must contain 3 entries for generation 1 smi HW and 2 entries
|
||||
for generation 2 smi HW as follows:
|
||||
- "apb" : Advanced Peripheral Bus clock, It's the clock for setting
|
||||
the register.
|
||||
- "smi" : It's the clock for transfer data and command.
|
||||
They may be the same if both source clocks are the same.
|
||||
- "async" : asynchronous clock, it help transform the smi clock into the emi
|
||||
clock domain, this clock is only needed by generation 1 smi HW.
|
||||
and these 2 option clocks for generation 2 smi HW:
|
||||
- "gals0": the path0 clock of GALS(Global Async Local Sync).
|
||||
- "gals1": the path1 clock of GALS(Global Async Local Sync).
|
||||
Here is the list which has this GALS: mt6779 and mt8183.
|
||||
|
||||
Example:
|
||||
smi_common: smi@14022000 {
|
||||
compatible = "mediatek,mt8173-smi-common";
|
||||
reg = <0 0x14022000 0 0x1000>;
|
||||
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
|
||||
clocks = <&mmsys CLK_MM_SMI_COMMON>,
|
||||
<&mmsys CLK_MM_SMI_COMMON>;
|
||||
clock-names = "apb", "smi";
|
||||
};
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (c) 2020 MediaTek Inc.
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/memory-controllers/mediatek,smi-common.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: SMI (Smart Multimedia Interface) Common
|
||||
|
||||
maintainers:
|
||||
- Yong Wu <yong.wu@mediatek.com>
|
||||
|
||||
description: |
|
||||
The hardware block diagram please check bindings/iommu/mediatek,iommu.yaml
|
||||
|
||||
MediaTek SMI have two generations of HW architecture, here is the list
|
||||
which generation the SoCs use:
|
||||
generation 1: mt2701 and mt7623.
|
||||
generation 2: mt2712, mt6779, mt8167, mt8173 and mt8183.
|
||||
|
||||
There's slight differences between the two SMI, for generation 2, the
|
||||
register which control the iommu port is at each larb's register base. But
|
||||
for generation 1, the register is at smi ao base(smi always on register
|
||||
base). Besides that, the smi async clock should be prepared and enabled for
|
||||
SMI generation 1 to transform the smi clock into emi clock domain, but that is
|
||||
not needed for SMI generation 2.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- mediatek,mt2701-smi-common
|
||||
- mediatek,mt2712-smi-common
|
||||
- mediatek,mt6779-smi-common
|
||||
- mediatek,mt8167-smi-common
|
||||
- mediatek,mt8173-smi-common
|
||||
- mediatek,mt8183-smi-common
|
||||
|
||||
- description: for mt7623
|
||||
items:
|
||||
- const: mediatek,mt7623-smi-common
|
||||
- const: mediatek,mt2701-smi-common
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
description: |
|
||||
apb and smi are mandatory. the async is only for generation 1 smi HW.
|
||||
gals(global async local sync) also is optional, see below.
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
items:
|
||||
- description: apb is Advanced Peripheral Bus clock, It's the clock for
|
||||
setting the register.
|
||||
- description: smi is the clock for transfer data and command.
|
||||
- description: async is asynchronous clock, it help transform the smi
|
||||
clock into the emi clock domain.
|
||||
- description: gals0 is the path0 clock of gals.
|
||||
- description: gals1 is the path1 clock of gals.
|
||||
|
||||
clock-names:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- power-domains
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
allOf:
|
||||
- if: # only for gen1 HW
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- mediatek,mt2701-smi-common
|
||||
then:
|
||||
properties:
|
||||
clock:
|
||||
items:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
clock-names:
|
||||
items:
|
||||
- const: apb
|
||||
- const: smi
|
||||
- const: async
|
||||
|
||||
- if: # for gen2 HW that have gals
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt6779-smi-common
|
||||
- mediatek,mt8183-smi-common
|
||||
|
||||
then:
|
||||
properties:
|
||||
clock:
|
||||
items:
|
||||
minItems: 4
|
||||
maxItems: 4
|
||||
clock-names:
|
||||
items:
|
||||
- const: apb
|
||||
- const: smi
|
||||
- const: gals0
|
||||
- const: gals1
|
||||
|
||||
else: # for gen2 HW that don't have gals
|
||||
properties:
|
||||
clock:
|
||||
items:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
clock-names:
|
||||
items:
|
||||
- const: apb
|
||||
- const: smi
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |+
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <dt-bindings/power/mt8173-power.h>
|
||||
|
||||
smi_common: smi@14022000 {
|
||||
compatible = "mediatek,mt8173-smi-common";
|
||||
reg = <0x14022000 0x1000>;
|
||||
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
|
||||
clocks = <&mmsys CLK_MM_SMI_COMMON>,
|
||||
<&mmsys CLK_MM_SMI_COMMON>;
|
||||
clock-names = "apb", "smi";
|
||||
};
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
SMI (Smart Multimedia Interface) Local Arbiter
|
||||
|
||||
The hardware block diagram please check bindings/iommu/mediatek,iommu.txt
|
||||
|
||||
Required properties:
|
||||
- compatible : must be one of :
|
||||
"mediatek,mt2701-smi-larb"
|
||||
"mediatek,mt2712-smi-larb"
|
||||
"mediatek,mt6779-smi-larb"
|
||||
"mediatek,mt7623-smi-larb", "mediatek,mt2701-smi-larb"
|
||||
"mediatek,mt8167-smi-larb"
|
||||
"mediatek,mt8173-smi-larb"
|
||||
"mediatek,mt8183-smi-larb"
|
||||
- reg : the register and size of this local arbiter.
|
||||
- mediatek,smi : a phandle to the smi_common node.
|
||||
- power-domains : a phandle to the power domain of this local arbiter.
|
||||
- clocks : Must contain an entry for each entry in clock-names.
|
||||
- clock-names: must contain 2 entries, as follows:
|
||||
- "apb" : Advanced Peripheral Bus clock, It's the clock for setting
|
||||
the register.
|
||||
- "smi" : It's the clock for transfer data and command.
|
||||
and this optional clock name:
|
||||
- "gals": the clock for GALS(Global Async Local Sync).
|
||||
Here is the list which has this GALS: mt8183.
|
||||
|
||||
Required property for mt2701, mt2712, mt6779, mt7623 and mt8167:
|
||||
- mediatek,larb-id :the hardware id of this larb.
|
||||
|
||||
Example:
|
||||
larb1: larb@16010000 {
|
||||
compatible = "mediatek,mt8173-smi-larb";
|
||||
reg = <0 0x16010000 0 0x1000>;
|
||||
mediatek,smi = <&smi_common>;
|
||||
power-domains = <&scpsys MT8173_POWER_DOMAIN_VDEC>;
|
||||
clocks = <&vdecsys CLK_VDEC_CKEN>,
|
||||
<&vdecsys CLK_VDEC_LARB_CKEN>;
|
||||
clock-names = "apb", "smi";
|
||||
};
|
||||
|
||||
Example for mt2701:
|
||||
larb0: larb@14010000 {
|
||||
compatible = "mediatek,mt2701-smi-larb";
|
||||
reg = <0 0x14010000 0 0x1000>;
|
||||
mediatek,smi = <&smi_common>;
|
||||
mediatek,larb-id = <0>;
|
||||
clocks = <&mmsys CLK_MM_SMI_LARB0>,
|
||||
<&mmsys CLK_MM_SMI_LARB0>;
|
||||
clock-names = "apb", "smi";
|
||||
power-domains = <&scpsys MT2701_POWER_DOMAIN_DISP>;
|
||||
};
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (c) 2020 MediaTek Inc.
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/memory-controllers/mediatek,smi-larb.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: SMI (Smart Multimedia Interface) Local Arbiter
|
||||
|
||||
maintainers:
|
||||
- Yong Wu <yong.wu@mediatek.com>
|
||||
|
||||
description: |
|
||||
The hardware block diagram please check bindings/iommu/mediatek,iommu.yaml
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- mediatek,mt2701-smi-larb
|
||||
- mediatek,mt2712-smi-larb
|
||||
- mediatek,mt6779-smi-larb
|
||||
- mediatek,mt8167-smi-larb
|
||||
- mediatek,mt8173-smi-larb
|
||||
- mediatek,mt8183-smi-larb
|
||||
|
||||
- description: for mt7623
|
||||
items:
|
||||
- const: mediatek,mt7623-smi-larb
|
||||
- const: mediatek,mt2701-smi-larb
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
description: |
|
||||
apb and smi are mandatory. gals(global async local sync) is optional.
|
||||
minItems: 2
|
||||
maxItems: 3
|
||||
items:
|
||||
- description: apb is Advanced Peripheral Bus clock, It's the clock for
|
||||
setting the register.
|
||||
- description: smi is the clock for transfer data and command.
|
||||
- description: the clock for gals.
|
||||
|
||||
clock-names:
|
||||
minItems: 2
|
||||
maxItems: 3
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
mediatek,smi:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: a phandle to the smi_common node.
|
||||
|
||||
mediatek,larb-id:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
minimum: 0
|
||||
maximum: 31
|
||||
description: the hardware id of this larb. It's only required when this
|
||||
hardward id is not consecutive from its M4U point of view.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
|
||||
allOf:
|
||||
- if: # HW has gals
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt8183-smi-larb
|
||||
|
||||
then:
|
||||
properties:
|
||||
clock:
|
||||
items:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
clock-names:
|
||||
items:
|
||||
- const: apb
|
||||
- const: smi
|
||||
- const: gals
|
||||
|
||||
else:
|
||||
properties:
|
||||
clock:
|
||||
items:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
clock-names:
|
||||
items:
|
||||
- const: apb
|
||||
- const: smi
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- mediatek,mt2701-smi-larb
|
||||
- mediatek,mt2712-smi-larb
|
||||
- mediatek,mt6779-smi-larb
|
||||
- mediatek,mt8167-smi-larb
|
||||
|
||||
then:
|
||||
required:
|
||||
- mediatek,larb-id
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |+
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <dt-bindings/power/mt8173-power.h>
|
||||
|
||||
larb1: larb@16010000 {
|
||||
compatible = "mediatek,mt8173-smi-larb";
|
||||
reg = <0x16010000 0x1000>;
|
||||
mediatek,smi = <&smi_common>;
|
||||
power-domains = <&scpsys MT8173_POWER_DOMAIN_VDEC>;
|
||||
clocks = <&vdecsys CLK_VDEC_CKEN>,
|
||||
<&vdecsys CLK_VDEC_LARB_CKEN>;
|
||||
clock-names = "apb", "smi";
|
||||
};
|
||||
|
|
@ -38,7 +38,7 @@ Following example uses irq pin number 3 of gpio0 for out of band wake-on-bt:
|
|||
compatible = "usb1286,204e";
|
||||
reg = <1>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupt-name = "wakeup";
|
||||
interrupt-names = "wakeup";
|
||||
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -206,6 +206,11 @@ properties:
|
|||
Indicates that full-duplex is used. When absent, half
|
||||
duplex is assumed.
|
||||
|
||||
pause:
|
||||
$ref: /schemas/types.yaml#definitions/flag
|
||||
description:
|
||||
Indicates that pause should be enabled.
|
||||
|
||||
asym-pause:
|
||||
$ref: /schemas/types.yaml#definitions/flag
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -217,6 +217,12 @@ between the calls to start() and stop(), so holding a lock during that time
|
|||
is a reasonable thing to do. The seq_file code will also avoid taking any
|
||||
other locks while the iterator is active.
|
||||
|
||||
The iterater value returned by start() or next() is guaranteed to be
|
||||
passed to a subsequent next() or stop() call. This allows resources
|
||||
such as locks that were taken to be reliably released. There is *no*
|
||||
guarantee that the iterator will be passed to show(), though in practice
|
||||
it often will be.
|
||||
|
||||
|
||||
Formatted output
|
||||
================
|
||||
|
|
|
|||
|
|
@ -560,6 +560,27 @@ Some of these date from the very introduction of KMS in 2008 ...
|
|||
|
||||
Level: Intermediate
|
||||
|
||||
Remove automatic page mapping from dma-buf importing
|
||||
----------------------------------------------------
|
||||
|
||||
When importing dma-bufs, the dma-buf and PRIME frameworks automatically map
|
||||
imported pages into the importer's DMA area. drm_gem_prime_fd_to_handle() and
|
||||
drm_gem_prime_handle_to_fd() require that importers call dma_buf_attach()
|
||||
even if they never do actual device DMA, but only CPU access through
|
||||
dma_buf_vmap(). This is a problem for USB devices, which do not support DMA
|
||||
operations.
|
||||
|
||||
To fix the issue, automatic page mappings should be removed from the
|
||||
buffer-sharing code. Fixing this is a bit more involved, since the import/export
|
||||
cache is also tied to &drm_gem_object.import_attach. Meanwhile we paper over
|
||||
this problem for USB devices by fishing out the USB host controller device, as
|
||||
long as that supports DMA. Otherwise importing can still needlessly fail.
|
||||
|
||||
Contact: Thomas Zimmermann <tzimmermann@suse.de>, Daniel Vetter
|
||||
|
||||
Level: Advanced
|
||||
|
||||
|
||||
Better Testing
|
||||
==============
|
||||
|
||||
|
|
|
|||
|
|
@ -630,16 +630,15 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max
|
|||
|
||||
default: initial size of receive buffer used by TCP sockets.
|
||||
This value overrides net.core.rmem_default used by other protocols.
|
||||
Default: 87380 bytes. This value results in window of 65535 with
|
||||
default setting of tcp_adv_win_scale and tcp_app_win:0 and a bit
|
||||
less for default tcp_app_win. See below about these variables.
|
||||
Default: 131072 bytes.
|
||||
This value results in initial window of 65535.
|
||||
|
||||
max: maximal size of receive buffer allowed for automatically
|
||||
selected receiver buffers for TCP socket. This value does not override
|
||||
net.core.rmem_max. Calling setsockopt() with SO_RCVBUF disables
|
||||
automatic tuning of that socket's receive buffer size, in which
|
||||
case this value is ignored.
|
||||
Default: between 87380B and 6MB, depending on RAM size.
|
||||
Default: between 131072 and 6MB, depending on RAM size.
|
||||
|
||||
tcp_sack - BOOLEAN
|
||||
Enable select acknowledgments (SACKS).
|
||||
|
|
|
|||
|
|
@ -144,77 +144,13 @@ Please send incremental versions on top of what has been merged in order to fix
|
|||
the patches the way they would look like if your latest patch series was to be
|
||||
merged.
|
||||
|
||||
Q: How can I tell what patches are queued up for backporting to the various stable releases?
|
||||
--------------------------------------------------------------------------------------------
|
||||
A: Normally Greg Kroah-Hartman collects stable commits himself, but for
|
||||
networking, Dave collects up patches he deems critical for the
|
||||
networking subsystem, and then hands them off to Greg.
|
||||
|
||||
There is a patchworks queue that you can see here:
|
||||
|
||||
https://patchwork.kernel.org/bundle/netdev/stable/?state=*
|
||||
|
||||
It contains the patches which Dave has selected, but not yet handed off
|
||||
to Greg. If Greg already has the patch, then it will be here:
|
||||
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git
|
||||
|
||||
A quick way to find whether the patch is in this stable-queue is to
|
||||
simply clone the repo, and then git grep the mainline commit ID, e.g.
|
||||
::
|
||||
|
||||
stable-queue$ git grep -l 284041ef21fdf2e
|
||||
releases/3.0.84/ipv6-fix-possible-crashes-in-ip6_cork_release.patch
|
||||
releases/3.4.51/ipv6-fix-possible-crashes-in-ip6_cork_release.patch
|
||||
releases/3.9.8/ipv6-fix-possible-crashes-in-ip6_cork_release.patch
|
||||
stable/stable-queue$
|
||||
|
||||
Q: I see a network patch and I think it should be backported to stable.
|
||||
-----------------------------------------------------------------------
|
||||
Q: Should I request it via stable@vger.kernel.org like the references in
|
||||
the kernel's Documentation/process/stable-kernel-rules.rst file say?
|
||||
A: No, not for networking. Check the stable queues as per above first
|
||||
to see if it is already queued. If not, then send a mail to netdev,
|
||||
listing the upstream commit ID and why you think it should be a stable
|
||||
candidate.
|
||||
|
||||
Before you jump to go do the above, do note that the normal stable rules
|
||||
in :ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>`
|
||||
still apply. So you need to explicitly indicate why it is a critical
|
||||
fix and exactly what users are impacted. In addition, you need to
|
||||
convince yourself that you *really* think it has been overlooked,
|
||||
vs. having been considered and rejected.
|
||||
|
||||
Generally speaking, the longer it has had a chance to "soak" in
|
||||
mainline, the better the odds that it is an OK candidate for stable. So
|
||||
scrambling to request a commit be added the day after it appears should
|
||||
be avoided.
|
||||
|
||||
Q: I have created a network patch and I think it should be backported to stable.
|
||||
--------------------------------------------------------------------------------
|
||||
Q: Should I add a Cc: stable@vger.kernel.org like the references in the
|
||||
kernel's Documentation/ directory say?
|
||||
A: No. See above answer. In short, if you think it really belongs in
|
||||
stable, then ensure you write a decent commit log that describes who
|
||||
gets impacted by the bug fix and how it manifests itself, and when the
|
||||
bug was introduced. If you do that properly, then the commit will get
|
||||
handled appropriately and most likely get put in the patchworks stable
|
||||
queue if it really warrants it.
|
||||
|
||||
If you think there is some valid information relating to it being in
|
||||
stable that does *not* belong in the commit log, then use the three dash
|
||||
marker line as described in
|
||||
:ref:`Documentation/process/submitting-patches.rst <the_canonical_patch_format>`
|
||||
to temporarily embed that information into the patch that you send.
|
||||
|
||||
Q: Are all networking bug fixes backported to all stable releases?
|
||||
------------------------------------------------------------------
|
||||
A: Due to capacity, Dave could only take care of the backports for the
|
||||
last two stable releases. For earlier stable releases, each stable
|
||||
branch maintainer is supposed to take care of them. If you find any
|
||||
patch is missing from an earlier stable branch, please notify
|
||||
stable@vger.kernel.org with either a commit ID or a formal patch
|
||||
backported, and CC Dave and other relevant networking developers.
|
||||
Q: Are there special rules regarding stable submissions on netdev?
|
||||
---------------------------------------------------------------
|
||||
While it used to be the case that netdev submissions were not supposed
|
||||
to carry explicit ``CC: stable@vger.kernel.org`` tags that is no longer
|
||||
the case today. Please follow the standard stable rules in
|
||||
:ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>`,
|
||||
and make sure you include appropriate Fixes tags!
|
||||
|
||||
Q: Is the comment style convention different for the networking content?
|
||||
------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ Power Management
|
|||
userland-swsusp
|
||||
|
||||
powercap/powercap
|
||||
powercap/dtpm
|
||||
|
||||
regulator/consumer
|
||||
regulator/design
|
||||
|
|
|
|||
212
Documentation/power/powercap/dtpm.rst
Normal file
212
Documentation/power/powercap/dtpm.rst
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==========================================
|
||||
Dynamic Thermal Power Management framework
|
||||
==========================================
|
||||
|
||||
On the embedded world, the complexity of the SoC leads to an
|
||||
increasing number of hotspots which need to be monitored and mitigated
|
||||
as a whole in order to prevent the temperature to go above the
|
||||
normative and legally stated 'skin temperature'.
|
||||
|
||||
Another aspect is to sustain the performance for a given power budget,
|
||||
for example virtual reality where the user can feel dizziness if the
|
||||
performance is capped while a big CPU is processing something else. Or
|
||||
reduce the battery charging because the dissipated power is too high
|
||||
compared with the power consumed by other devices.
|
||||
|
||||
The user space is the most adequate place to dynamically act on the
|
||||
different devices by limiting their power given an application
|
||||
profile: it has the knowledge of the platform.
|
||||
|
||||
The Dynamic Thermal Power Management (DTPM) is a technique acting on
|
||||
the device power by limiting and/or balancing a power budget among
|
||||
different devices.
|
||||
|
||||
The DTPM framework provides an unified interface to act on the
|
||||
device power.
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The DTPM framework relies on the powercap framework to create the
|
||||
powercap entries in the sysfs directory and implement the backend
|
||||
driver to do the connection with the power manageable device.
|
||||
|
||||
The DTPM is a tree representation describing the power constraints
|
||||
shared between devices, not their physical positions.
|
||||
|
||||
The nodes of the tree are a virtual description aggregating the power
|
||||
characteristics of the children nodes and their power limitations.
|
||||
|
||||
The leaves of the tree are the real power manageable devices.
|
||||
|
||||
For instance::
|
||||
|
||||
SoC
|
||||
|
|
||||
`-- pkg
|
||||
|
|
||||
|-- pd0 (cpu0-3)
|
||||
|
|
||||
`-- pd1 (cpu4-5)
|
||||
|
||||
The pkg power will be the sum of pd0 and pd1 power numbers::
|
||||
|
||||
SoC (400mW - 3100mW)
|
||||
|
|
||||
`-- pkg (400mW - 3100mW)
|
||||
|
|
||||
|-- pd0 (100mW - 700mW)
|
||||
|
|
||||
`-- pd1 (300mW - 2400mW)
|
||||
|
||||
When the nodes are inserted in the tree, their power characteristics are propagated to the parents::
|
||||
|
||||
SoC (600mW - 5900mW)
|
||||
|
|
||||
|-- pkg (400mW - 3100mW)
|
||||
| |
|
||||
| |-- pd0 (100mW - 700mW)
|
||||
| |
|
||||
| `-- pd1 (300mW - 2400mW)
|
||||
|
|
||||
`-- pd2 (200mW - 2800mW)
|
||||
|
||||
Each node have a weight on a 2^10 basis reflecting the percentage of power consumption along the siblings::
|
||||
|
||||
SoC (w=1024)
|
||||
|
|
||||
|-- pkg (w=538)
|
||||
| |
|
||||
| |-- pd0 (w=231)
|
||||
| |
|
||||
| `-- pd1 (w=794)
|
||||
|
|
||||
`-- pd2 (w=486)
|
||||
|
||||
Note the sum of weights at the same level are equal to 1024.
|
||||
|
||||
When a power limitation is applied to a node, then it is distributed along the children given their weights. For example, if we set a power limitation of 3200mW at the 'SoC' root node, the resulting tree will be::
|
||||
|
||||
SoC (w=1024) <--- power_limit = 3200mW
|
||||
|
|
||||
|-- pkg (w=538) --> power_limit = 1681mW
|
||||
| |
|
||||
| |-- pd0 (w=231) --> power_limit = 378mW
|
||||
| |
|
||||
| `-- pd1 (w=794) --> power_limit = 1303mW
|
||||
|
|
||||
`-- pd2 (w=486) --> power_limit = 1519mW
|
||||
|
||||
|
||||
Flat description
|
||||
----------------
|
||||
|
||||
A root node is created and it is the parent of all the nodes. This
|
||||
description is the simplest one and it is supposed to give to user
|
||||
space a flat representation of all the devices supporting the power
|
||||
limitation without any power limitation distribution.
|
||||
|
||||
Hierarchical description
|
||||
------------------------
|
||||
|
||||
The different devices supporting the power limitation are represented
|
||||
hierarchically. There is one root node, all intermediate nodes are
|
||||
grouping the child nodes which can be intermediate nodes also or real
|
||||
devices.
|
||||
|
||||
The intermediate nodes aggregate the power information and allows to
|
||||
set the power limit given the weight of the nodes.
|
||||
|
||||
User space API
|
||||
==============
|
||||
|
||||
As stated in the overview, the DTPM framework is built on top of the
|
||||
powercap framework. Thus the sysfs interface is the same, please refer
|
||||
to the powercap documentation for further details.
|
||||
|
||||
* power_uw: Instantaneous power consumption. If the node is an
|
||||
intermediate node, then the power consumption will be the sum of all
|
||||
children power consumption.
|
||||
|
||||
* max_power_range_uw: The power range resulting of the maximum power
|
||||
minus the minimum power.
|
||||
|
||||
* name: The name of the node. This is implementation dependent. Even
|
||||
if it is not recommended for the user space, several nodes can have
|
||||
the same name.
|
||||
|
||||
* constraint_X_name: The name of the constraint.
|
||||
|
||||
* constraint_X_max_power_uw: The maximum power limit to be applicable
|
||||
to the node.
|
||||
|
||||
* constraint_X_power_limit_uw: The power limit to be applied to the
|
||||
node. If the value contained in constraint_X_max_power_uw is set,
|
||||
the constraint will be removed.
|
||||
|
||||
* constraint_X_time_window_us: The meaning of this file will depend
|
||||
on the constraint number.
|
||||
|
||||
Constraints
|
||||
-----------
|
||||
|
||||
* Constraint 0: The power limitation is immediately applied, without
|
||||
limitation in time.
|
||||
|
||||
Kernel API
|
||||
==========
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
The DTPM framework has no power limiting backend support. It is
|
||||
generic and provides a set of API to let the different drivers to
|
||||
implement the backend part for the power limitation and create the
|
||||
power constraints tree.
|
||||
|
||||
It is up to the platform to provide the initialization function to
|
||||
allocate and link the different nodes of the tree.
|
||||
|
||||
A special macro has the role of declaring a node and the corresponding
|
||||
initialization function via a description structure. This one contains
|
||||
an optional parent field allowing to hook different devices to an
|
||||
already existing tree at boot time.
|
||||
|
||||
For instance::
|
||||
|
||||
struct dtpm_descr my_descr = {
|
||||
.name = "my_name",
|
||||
.init = my_init_func,
|
||||
};
|
||||
|
||||
DTPM_DECLARE(my_descr);
|
||||
|
||||
The nodes of the DTPM tree are described with dtpm structure. The
|
||||
steps to add a new power limitable device is done in three steps:
|
||||
|
||||
* Allocate the dtpm node
|
||||
* Set the power number of the dtpm node
|
||||
* Register the dtpm node
|
||||
|
||||
The registration of the dtpm node is done with the powercap
|
||||
ops. Basically, it must implements the callbacks to get and set the
|
||||
power and the limit.
|
||||
|
||||
Alternatively, if the node to be inserted is an intermediate one, then
|
||||
a simple function to insert it as a future parent is available.
|
||||
|
||||
If a device has its power characteristics changing, then the tree must
|
||||
be updated with the new power numbers and weights.
|
||||
|
||||
Nomenclature
|
||||
------------
|
||||
|
||||
* dtpm_alloc() : Allocate and initialize a dtpm structure
|
||||
|
||||
* dtpm_register() : Add the dtpm node to the tree
|
||||
|
||||
* dtpm_unregister() : Remove the dtpm node from the tree
|
||||
|
||||
* dtpm_update_power() : Update the power characteristics of the dtpm node
|
||||
|
|
@ -35,12 +35,6 @@ Rules on what kind of patches are accepted, and which ones are not, into the
|
|||
Procedure for submitting patches to the -stable tree
|
||||
----------------------------------------------------
|
||||
|
||||
- If the patch covers files in net/ or drivers/net please follow netdev stable
|
||||
submission guidelines as described in
|
||||
:ref:`Documentation/networking/netdev-FAQ.rst <netdev-FAQ>`
|
||||
after first checking the stable networking queue at
|
||||
https://patchwork.kernel.org/bundle/netdev/stable/?state=*
|
||||
to ensure the requested patch is not already queued up.
|
||||
- Security patches should not be handled (solely) by the -stable review
|
||||
process but should follow the procedures in
|
||||
:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`.
|
||||
|
|
|
|||
|
|
@ -250,11 +250,6 @@ should also read
|
|||
:ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>`
|
||||
in addition to this file.
|
||||
|
||||
Note, however, that some subsystem maintainers want to come to their own
|
||||
conclusions on which patches should go to the stable trees. The networking
|
||||
maintainer, in particular, would rather not see individual developers
|
||||
adding lines like the above to their patches.
|
||||
|
||||
If changes affect userland-kernel interfaces, please send the MAN-PAGES
|
||||
maintainer (as listed in the MAINTAINERS file) a man-pages patch, or at
|
||||
least a notification of the change, so that some information makes its way
|
||||
|
|
|
|||
|
|
@ -189,13 +189,10 @@ num_phys
|
|||
The event interface::
|
||||
|
||||
/* LLDD calls these to notify the class of an event. */
|
||||
void (*notify_ha_event)(struct sas_ha_struct *, enum ha_event);
|
||||
void (*notify_port_event)(struct sas_phy *, enum port_event);
|
||||
void (*notify_phy_event)(struct sas_phy *, enum phy_event);
|
||||
|
||||
When sas_register_ha() returns, those are set and can be
|
||||
called by the LLDD to notify the SAS layer of such events
|
||||
the SAS layer.
|
||||
void sas_notify_port_event(struct sas_phy *, enum port_event);
|
||||
void sas_notify_phy_event(struct sas_phy *, enum phy_event);
|
||||
void sas_notify_port_event_gfp(struct sas_phy *, enum port_event, gfp_t);
|
||||
void sas_notify_phy_event_gfp(struct sas_phy *, enum phy_event, gfp_t);
|
||||
|
||||
The port notification::
|
||||
|
||||
|
|
|
|||
|
|
@ -1040,8 +1040,8 @@ The keyctl syscall functions are:
|
|||
|
||||
"key" is the ID of the key to be watched.
|
||||
|
||||
"queue_fd" is a file descriptor referring to an open "/dev/watch_queue"
|
||||
which manages the buffer into which notifications will be delivered.
|
||||
"queue_fd" is a file descriptor referring to an open pipe which
|
||||
manages the buffer into which notifications will be delivered.
|
||||
|
||||
"filter" is either NULL to remove a watch or a filter specification to
|
||||
indicate what events are required from the key.
|
||||
|
|
|
|||
|
|
@ -182,6 +182,9 @@ is dependent on the CPU capability and the kernel configuration. The limit can
|
|||
be retrieved using KVM_CAP_ARM_VM_IPA_SIZE of the KVM_CHECK_EXTENSION
|
||||
ioctl() at run-time.
|
||||
|
||||
Creation of the VM will fail if the requested IPA size (whether it is
|
||||
implicit or explicit) is unsupported on the host.
|
||||
|
||||
Please note that configuring the IPA size does not affect the capability
|
||||
exposed by the guest CPUs in ID_AA64MMFR0_EL1[PARange]. It only affects
|
||||
size of the address translated by the stage2 level (guest physical to
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ size change due to this facility.
|
|||
|
||||
text data bss dec hex filename
|
||||
48800 2445 644 51889 cab1 mm/page_alloc.o
|
||||
6574 108 29 6711 1a37 mm/page_owner.o
|
||||
6662 108 29 6799 1a8f mm/page_owner.o
|
||||
1025 8 8 1041 411 mm/page_ext.o
|
||||
|
||||
Although, roughly, 8 KB code is added in total, page_alloc.o increase by
|
||||
|
|
|
|||
19
MAINTAINERS
19
MAINTAINERS
|
|
@ -1155,7 +1155,7 @@ M: Joel Fernandes <joel@joelfernandes.org>
|
|||
M: Christian Brauner <christian@brauner.io>
|
||||
M: Hridya Valsaraju <hridya@google.com>
|
||||
M: Suren Baghdasaryan <surenb@google.com>
|
||||
L: devel@driverdev.osuosl.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
|
||||
F: drivers/android/
|
||||
|
|
@ -8007,7 +8007,6 @@ F: drivers/crypto/hisilicon/sec2/sec_main.c
|
|||
|
||||
HISILICON STAGING DRIVERS FOR HIKEY 960/970
|
||||
M: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Maintained
|
||||
F: drivers/staging/hikey9xx/
|
||||
|
||||
|
|
@ -9757,6 +9756,18 @@ F: include/linux/keyctl.h
|
|||
F: include/uapi/linux/keyctl.h
|
||||
F: security/keys/
|
||||
|
||||
KFENCE
|
||||
M: Alexander Potapenko <glider@google.com>
|
||||
M: Marco Elver <elver@google.com>
|
||||
R: Dmitry Vyukov <dvyukov@google.com>
|
||||
L: kasan-dev@googlegroups.com
|
||||
S: Maintained
|
||||
F: Documentation/dev-tools/kfence.rst
|
||||
F: arch/*/include/asm/kfence.h
|
||||
F: include/linux/kfence.h
|
||||
F: lib/Kconfig.kfence
|
||||
F: mm/kfence/
|
||||
|
||||
KFIFO
|
||||
M: Stefani Seibold <stefani@seibold.net>
|
||||
S: Maintained
|
||||
|
|
@ -16684,7 +16695,7 @@ F: drivers/staging/vt665?/
|
|||
|
||||
STAGING SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: devel@driverdev.osuosl.org
|
||||
L: linux-staging@lists.linux.dev
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
|
||||
F: drivers/staging/
|
||||
|
|
@ -18726,7 +18737,7 @@ VME SUBSYSTEM
|
|||
M: Martyn Welch <martyn@welchs.me.uk>
|
||||
M: Manohar Vanga <manohar.vanga@gmail.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: devel@driverdev.osuosl.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||
F: Documentation/driver-api/vme.rst
|
||||
|
|
|
|||
26
Makefile
26
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 19
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
|
|
@ -914,7 +914,13 @@ KBUILD_LDFLAGS += --thinlto-cache-dir=$(extmod-prefix).thinlto-cache
|
|||
else
|
||||
CC_FLAGS_LTO += -flto
|
||||
endif
|
||||
|
||||
ifeq ($(SRCARCH),x86)
|
||||
# TODO(b/182572011): Revert workaround for compiler / linker bug.
|
||||
CC_FLAGS_LTO += -fvisibility=hidden
|
||||
else
|
||||
CC_FLAGS_LTO += -fvisibility=default
|
||||
endif
|
||||
|
||||
# Limit inlining across translation units to reduce binary size
|
||||
KBUILD_LDFLAGS += -mllvm -import-instr-limit=5
|
||||
|
|
@ -1024,7 +1030,7 @@ LDFLAGS_vmlinux += $(call ld-option, -X,)
|
|||
endif
|
||||
|
||||
ifeq ($(CONFIG_RELR),y)
|
||||
LDFLAGS_vmlinux += --pack-dyn-relocs=relr
|
||||
LDFLAGS_vmlinux += --pack-dyn-relocs=relr --use-android-relr-tags
|
||||
endif
|
||||
|
||||
# We never want expected sections to be placed heuristically by the
|
||||
|
|
@ -1166,7 +1172,7 @@ quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include
|
|||
cmd_headers_install = \
|
||||
mkdir -p $(INSTALL_HDR_PATH); \
|
||||
rsync -mrl --include='*/' --include='*\.h' --exclude='*' \
|
||||
usr/include $(INSTALL_HDR_PATH)
|
||||
$(hdr-prefix)usr/include $(INSTALL_HDR_PATH);
|
||||
|
||||
PHONY += headers_install
|
||||
headers_install: headers
|
||||
|
|
@ -1340,11 +1346,19 @@ define filechk_utsrelease.h
|
|||
endef
|
||||
|
||||
define filechk_version.h
|
||||
echo \#define LINUX_VERSION_CODE $(shell \
|
||||
expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
|
||||
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'
|
||||
if [ $(SUBLEVEL) -gt 255 ]; then \
|
||||
echo \#define LINUX_VERSION_CODE $(shell \
|
||||
expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + 255); \
|
||||
else \
|
||||
echo \#define LINUX_VERSION_CODE $(shell \
|
||||
expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \
|
||||
fi; \
|
||||
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + \
|
||||
((c) > 255 ? 255 : (c)))'
|
||||
endef
|
||||
|
||||
$(version_h): PATCHLEVEL := $(if $(PATCHLEVEL), $(PATCHLEVEL), 0)
|
||||
$(version_h): SUBLEVEL := $(if $(SUBLEVEL), $(SUBLEVEL), 0)
|
||||
$(version_h): FORCE
|
||||
$(call filechk,version.h)
|
||||
$(Q)rm -f $(old_version_h)
|
||||
|
|
|
|||
13
android/OWNERS
Normal file
13
android/OWNERS
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
# If we ever add another OWNERS above this directory, it's likely to be
|
||||
# more permissive, so don't inherit from it
|
||||
set noparent
|
||||
gki-abi-approvers@google.com
|
||||
adelva@google.com
|
||||
maennich@google.com
|
||||
saravanak@google.com
|
||||
sspatil@google.com
|
||||
tkjos@google.com
|
||||
willmcvicker@google.com
|
||||
# Downstream boards maintained directly in this manifest branch
|
||||
per-file abi_gki_aarch64_cuttlefish = adelva@google.com, rammuthiah@google.com
|
||||
per-file abi_gki_aarch64_goldfish = rkir@google.com
|
||||
185917
android/abi_gki_aarch64.xml
185917
android/abi_gki_aarch64.xml
File diff suppressed because it is too large
Load Diff
|
|
@ -28,6 +28,8 @@
|
|||
amba_bustype
|
||||
amba_driver_register
|
||||
amba_driver_unregister
|
||||
android_debug_per_cpu_symbol
|
||||
android_debug_symbol
|
||||
anon_inode_getfile
|
||||
__arch_clear_user
|
||||
__arch_copy_from_user
|
||||
|
|
@ -144,6 +146,7 @@
|
|||
cfg80211_unlink_bss
|
||||
cfg80211_update_owe_info_event
|
||||
cfg80211_vendor_cmd_reply
|
||||
__cfi_slowpath
|
||||
cgroup_path_ns
|
||||
cgroup_taskset_first
|
||||
cgroup_taskset_next
|
||||
|
|
@ -230,6 +233,7 @@
|
|||
consume_skb
|
||||
contig_page_data
|
||||
_copy_from_iter_full
|
||||
copy_from_kernel_nofault
|
||||
__cpu_active_mask
|
||||
cpu_bit_bitmap
|
||||
cpufreq_cpu_get
|
||||
|
|
@ -398,6 +402,7 @@
|
|||
__dev_kfree_skb_any
|
||||
devm_add_action
|
||||
devm_backlight_device_register
|
||||
devm_blk_ksm_init
|
||||
devm_clk_bulk_get
|
||||
devm_clk_bulk_get_all
|
||||
devm_clk_get
|
||||
|
|
@ -1042,6 +1047,8 @@
|
|||
iio_channel_get_all
|
||||
iio_read_channel_processed
|
||||
import_iovec
|
||||
in4_pton
|
||||
in6_pton
|
||||
inc_zone_page_state
|
||||
in_egroup_p
|
||||
init_dummy_netdev
|
||||
|
|
@ -1118,9 +1125,11 @@
|
|||
iounmap
|
||||
__iowrite32_copy
|
||||
ip_compute_csum
|
||||
ipi_desc_get
|
||||
iput
|
||||
__ipv6_addr_type
|
||||
ipv6_ext_hdr
|
||||
ipv6_find_hdr
|
||||
ipv6_skip_exthdr
|
||||
irq_chip_ack_parent
|
||||
irq_chip_disable_parent
|
||||
|
|
@ -1169,6 +1178,7 @@
|
|||
irq_work_queue
|
||||
irq_work_queue_on
|
||||
irq_work_sync
|
||||
is_dma_buf_file
|
||||
is_vmalloc_addr
|
||||
jiffies
|
||||
jiffies_to_msecs
|
||||
|
|
@ -1225,6 +1235,9 @@
|
|||
kset_create_and_add
|
||||
ksize
|
||||
ksoftirqd
|
||||
kstat
|
||||
kstat_irqs_cpu
|
||||
kstat_irqs_usr
|
||||
kstrdup
|
||||
kstrdup_const
|
||||
kstrndup
|
||||
|
|
@ -1271,6 +1284,7 @@
|
|||
ktime_get_seconds
|
||||
ktime_get_with_offset
|
||||
kvfree
|
||||
kvfree_call_rcu
|
||||
kvmalloc_node
|
||||
led_classdev_flash_register_ext
|
||||
led_classdev_flash_unregister
|
||||
|
|
@ -1286,6 +1300,8 @@
|
|||
__local_bh_enable_ip
|
||||
__lock_page
|
||||
lock_sock_nested
|
||||
log_buf_addr_get
|
||||
log_buf_len_get
|
||||
__log_post_read_mmio
|
||||
__log_read_mmio
|
||||
__log_write_mmio
|
||||
|
|
@ -1405,6 +1421,8 @@
|
|||
nonseekable_open
|
||||
noop_llseek
|
||||
nr_cpu_ids
|
||||
nr_ipi_get
|
||||
nr_irqs
|
||||
ns_capable
|
||||
nsecs_to_jiffies
|
||||
ns_to_timespec64
|
||||
|
|
@ -1552,6 +1570,7 @@
|
|||
pci_bus_type
|
||||
pci_clear_master
|
||||
pci_d3cold_disable
|
||||
pci_dev_present
|
||||
pci_device_group
|
||||
pci_disable_device
|
||||
pci_disable_msi
|
||||
|
|
@ -1591,6 +1610,7 @@
|
|||
percpu_down_write
|
||||
__percpu_init_rwsem
|
||||
__per_cpu_offset
|
||||
per_cpu_ptr_to_phys
|
||||
percpu_up_write
|
||||
perf_aux_output_begin
|
||||
perf_aux_output_end
|
||||
|
|
@ -1812,12 +1832,14 @@
|
|||
__register_chrdev
|
||||
register_chrdev_region
|
||||
register_console
|
||||
register_die_notifier
|
||||
register_ftrace_export
|
||||
register_inet6addr_notifier
|
||||
register_inetaddr_notifier
|
||||
register_kprobe
|
||||
register_kretprobe
|
||||
register_memory_notifier
|
||||
register_module_notifier
|
||||
register_netdev
|
||||
register_netdevice
|
||||
register_netdevice_notifier
|
||||
|
|
@ -1920,8 +1942,10 @@
|
|||
rproc_add_subdev
|
||||
rproc_alloc
|
||||
rproc_boot
|
||||
rproc_coredump_add_custom_segment
|
||||
rproc_coredump_add_segment
|
||||
rproc_coredump_set_elf_info
|
||||
rproc_coredump_using_sections
|
||||
rproc_del
|
||||
rproc_free
|
||||
rproc_get_by_child
|
||||
|
|
@ -1942,12 +1966,14 @@
|
|||
rtnl_lock
|
||||
rtnl_register_module
|
||||
rtnl_trylock
|
||||
rtnl_unicast
|
||||
rtnl_unlock
|
||||
rtnl_unregister
|
||||
runqueues
|
||||
sched_clock
|
||||
sched_feat_keys
|
||||
sched_feat_names
|
||||
sched_setattr
|
||||
sched_set_fifo
|
||||
sched_set_fifo_low
|
||||
sched_set_normal
|
||||
|
|
@ -1992,6 +2018,7 @@
|
|||
sdhci_set_bus_width
|
||||
sdhci_set_power_noreg
|
||||
sdhci_setup_host
|
||||
seq_buf_printf
|
||||
seq_hex_dump
|
||||
seq_lseek
|
||||
seq_open
|
||||
|
|
@ -2235,6 +2262,7 @@
|
|||
sysfs_create_group
|
||||
sysfs_create_groups
|
||||
sysfs_create_link
|
||||
sysfs_emit
|
||||
__sysfs_match_string
|
||||
sysfs_notify
|
||||
sysfs_remove_bin_file
|
||||
|
|
@ -2343,6 +2371,11 @@
|
|||
__tracepoint_android_vh_cpu_idle_exit
|
||||
__tracepoint_android_vh_dump_throttled_rt_tasks
|
||||
__tracepoint_android_vh_freq_table_limits
|
||||
__tracepoint_android_vh_ftrace_dump_buffer
|
||||
__tracepoint_android_vh_ftrace_format_check
|
||||
__tracepoint_android_vh_ftrace_oops_enter
|
||||
__tracepoint_android_vh_ftrace_oops_exit
|
||||
__tracepoint_android_vh_ftrace_size_check
|
||||
__tracepoint_android_vh_iommu_setup_dma_ops
|
||||
__tracepoint_android_vh_ipi_stop
|
||||
__tracepoint_android_vh_jiffies_update
|
||||
|
|
@ -2351,8 +2384,10 @@
|
|||
__tracepoint_android_vh_show_max_freq
|
||||
__tracepoint_android_vh_show_resume_epoch_val
|
||||
__tracepoint_android_vh_show_suspend_epoch_val
|
||||
__tracepoint_android_vh_timer_calc_index
|
||||
__tracepoint_binder_transaction_received
|
||||
__tracepoint_cpu_frequency
|
||||
__tracepoint_cpu_frequency_limits
|
||||
__tracepoint_cpu_idle
|
||||
__tracepoint_ipi_entry
|
||||
__tracepoint_ipi_raise
|
||||
|
|
@ -2446,11 +2481,13 @@
|
|||
__unregister_chrdev
|
||||
unregister_chrdev_region
|
||||
unregister_console
|
||||
unregister_die_notifier
|
||||
unregister_ftrace_export
|
||||
unregister_inet6addr_notifier
|
||||
unregister_inetaddr_notifier
|
||||
unregister_kprobe
|
||||
unregister_kretprobe
|
||||
unregister_module_notifier
|
||||
unregister_netdev
|
||||
unregister_netdevice_many
|
||||
unregister_netdevice_notifier
|
||||
|
|
@ -2659,5 +2696,15 @@
|
|||
xa_find_after
|
||||
xa_load
|
||||
xa_store
|
||||
xhci_alloc_command
|
||||
xhci_alloc_erst
|
||||
xhci_free_command
|
||||
xhci_free_erst
|
||||
xhci_get_endpoint_index
|
||||
xhci_queue_stop_endpoint
|
||||
xhci_ring_alloc
|
||||
xhci_ring_cmd_db
|
||||
xhci_ring_free
|
||||
xhci_trb_virt_to_dma
|
||||
zone_watermark_ok
|
||||
zone_watermark_ok_safe
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
__alloc_pages_nodemask
|
||||
__alloc_skb
|
||||
alloc_workqueue
|
||||
amba_driver_register
|
||||
amba_driver_unregister
|
||||
__arch_copy_from_user
|
||||
__arch_copy_to_user
|
||||
arm64_const_caps_ready
|
||||
|
|
@ -33,12 +35,19 @@
|
|||
capable
|
||||
cfg80211_inform_bss_data
|
||||
cfg80211_put_bss
|
||||
__cfi_slowpath
|
||||
__check_object_size
|
||||
__class_create
|
||||
class_destroy
|
||||
clk_disable
|
||||
clk_enable
|
||||
clk_get_rate
|
||||
clk_prepare
|
||||
clk_unprepare
|
||||
complete
|
||||
__const_udelay
|
||||
consume_skb
|
||||
contig_page_data
|
||||
__cpuhp_remove_state
|
||||
__cpuhp_setup_state
|
||||
__cpuhp_state_add_instance
|
||||
|
|
@ -59,6 +68,7 @@
|
|||
debugfs_remove
|
||||
delayed_work_timer_fn
|
||||
del_gendisk
|
||||
del_timer
|
||||
del_timer_sync
|
||||
destroy_workqueue
|
||||
_dev_err
|
||||
|
|
@ -71,9 +81,11 @@
|
|||
_dev_info
|
||||
__dev_kfree_skb_any
|
||||
devm_ioremap
|
||||
devm_ioremap_resource
|
||||
devm_kfree
|
||||
devm_kmalloc
|
||||
devm_request_threaded_irq
|
||||
_dev_notice
|
||||
dev_queue_xmit
|
||||
dev_set_name
|
||||
_dev_warn
|
||||
|
|
@ -97,13 +109,14 @@
|
|||
event_triggers_call
|
||||
fd_install
|
||||
finish_wait
|
||||
flush_dcache_page
|
||||
flush_work
|
||||
flush_workqueue
|
||||
fput
|
||||
free_irq
|
||||
free_netdev
|
||||
__free_pages
|
||||
free_pages
|
||||
freezing_slow_path
|
||||
fs_bio_set
|
||||
get_device
|
||||
__get_free_pages
|
||||
|
|
@ -122,17 +135,21 @@
|
|||
init_timer_key
|
||||
init_wait_entry
|
||||
__init_waitqueue_head
|
||||
input_alloc_absinfo
|
||||
input_allocate_device
|
||||
input_event
|
||||
input_free_device
|
||||
input_mt_init_slots
|
||||
input_register_device
|
||||
input_set_abs_params
|
||||
input_unregister_device
|
||||
__ioremap
|
||||
iounmap
|
||||
jiffies
|
||||
jiffies_to_msecs
|
||||
kasan_flag_enabled
|
||||
kfree
|
||||
kfree_skb
|
||||
kill_anon_super
|
||||
kimage_voffset
|
||||
__kmalloc
|
||||
kmalloc_caches
|
||||
|
|
@ -148,8 +165,12 @@
|
|||
kobject_uevent
|
||||
krealloc
|
||||
kstrdup
|
||||
kstrndup
|
||||
kstrtobool
|
||||
kstrtoint
|
||||
kstrtouint
|
||||
kstrtoull
|
||||
kthread_create_on_node
|
||||
ktime_get
|
||||
ktime_get_mono_fast_ns
|
||||
ktime_get_raw_ts64
|
||||
|
|
@ -196,9 +217,13 @@
|
|||
netif_tx_wake_queue
|
||||
nf_conntrack_destroy
|
||||
no_llseek
|
||||
nonseekable_open
|
||||
noop_llseek
|
||||
nr_cpu_ids
|
||||
__num_online_cpus
|
||||
of_find_property
|
||||
of_get_property
|
||||
of_property_read_variable_u32_array
|
||||
param_ops_bint
|
||||
param_ops_bool
|
||||
param_ops_charp
|
||||
|
|
@ -222,10 +247,6 @@
|
|||
__per_cpu_offset
|
||||
perf_trace_buf_alloc
|
||||
perf_trace_run_bpf_submit
|
||||
platform_device_add
|
||||
platform_device_alloc
|
||||
platform_device_del
|
||||
platform_device_put
|
||||
platform_device_unregister
|
||||
__platform_driver_register
|
||||
platform_driver_unregister
|
||||
|
|
@ -234,7 +255,11 @@
|
|||
pm_runtime_allow
|
||||
__pm_runtime_disable
|
||||
pm_runtime_enable
|
||||
pm_runtime_force_resume
|
||||
pm_runtime_force_suspend
|
||||
__pm_runtime_idle
|
||||
__pm_runtime_resume
|
||||
pm_runtime_set_autosuspend_delay
|
||||
__pm_runtime_suspend
|
||||
__pm_runtime_use_autosuspend
|
||||
preempt_schedule
|
||||
|
|
@ -261,12 +286,18 @@
|
|||
__rcu_read_lock
|
||||
__rcu_read_unlock
|
||||
refcount_warn_saturate
|
||||
__refrigerator
|
||||
register_blkdev
|
||||
register_netdev
|
||||
register_netdevice
|
||||
register_netdevice_notifier
|
||||
register_shrinker
|
||||
register_virtio_device
|
||||
register_virtio_driver
|
||||
regmap_exit
|
||||
__regmap_init
|
||||
regmap_read
|
||||
regmap_write
|
||||
remap_pfn_range
|
||||
__request_module
|
||||
request_threaded_irq
|
||||
|
|
@ -282,6 +313,13 @@
|
|||
seq_printf
|
||||
seq_read
|
||||
seq_release
|
||||
serio_close
|
||||
serio_interrupt
|
||||
serio_open
|
||||
serio_reconnect
|
||||
__serio_register_driver
|
||||
__serio_register_port
|
||||
serio_unregister_driver
|
||||
set_disk_ro
|
||||
sg_alloc_table
|
||||
sg_free_table
|
||||
|
|
@ -290,7 +328,10 @@
|
|||
sg_next
|
||||
simple_strtoul
|
||||
skb_add_rx_frag
|
||||
skb_dequeue
|
||||
skb_push
|
||||
skb_put
|
||||
skb_queue_tail
|
||||
snd_card_disconnect
|
||||
snd_card_free
|
||||
snd_card_new
|
||||
|
|
@ -330,7 +371,6 @@
|
|||
strncmp
|
||||
strncpy
|
||||
strsep
|
||||
strstr
|
||||
submit_bio
|
||||
sync_file_create
|
||||
synchronize_rcu
|
||||
|
|
@ -338,6 +378,7 @@
|
|||
__sysfs_match_string
|
||||
sysfs_remove_group
|
||||
sysfs_remove_link
|
||||
system_freezing_cnt
|
||||
system_wq
|
||||
trace_event_buffer_commit
|
||||
trace_event_buffer_reserve
|
||||
|
|
@ -351,6 +392,7 @@
|
|||
trace_raw_output_prep
|
||||
trace_seq_printf
|
||||
try_module_get
|
||||
__udelay
|
||||
unlock_page
|
||||
unregister_blkdev
|
||||
unregister_netdev
|
||||
|
|
@ -360,6 +402,7 @@
|
|||
unregister_virtio_driver
|
||||
up_read
|
||||
up_write
|
||||
__usecs_to_jiffies
|
||||
usleep_range
|
||||
vabits_actual
|
||||
vfree
|
||||
|
|
@ -386,8 +429,62 @@
|
|||
vring_transport_features
|
||||
wait_for_completion
|
||||
__wake_up
|
||||
wake_up_process
|
||||
__warn_printk
|
||||
|
||||
# required by ambakmi.ko
|
||||
amba_release_regions
|
||||
amba_request_regions
|
||||
clk_get
|
||||
clk_put
|
||||
serio_unregister_port
|
||||
|
||||
# required by armmmci.ko
|
||||
clk_round_rate
|
||||
clk_set_rate
|
||||
devm_clk_get
|
||||
devm_of_iomap
|
||||
devm_pinctrl_get
|
||||
__devm_reset_control_get
|
||||
dmam_alloc_attrs
|
||||
dma_release_channel
|
||||
dma_request_chan
|
||||
mmc_add_host
|
||||
mmc_alloc_host
|
||||
mmc_free_host
|
||||
mmc_gpiod_request_cd
|
||||
mmc_gpiod_request_ro
|
||||
mmc_gpio_get_cd
|
||||
mmc_gpio_get_ro
|
||||
mmc_of_parse
|
||||
mmc_regulator_get_supply
|
||||
mmc_regulator_set_ocr
|
||||
mmc_regulator_set_vqmmc
|
||||
mmc_remove_host
|
||||
mmc_request_done
|
||||
mmc_send_tuning
|
||||
pinctrl_lookup_state
|
||||
pinctrl_pm_select_sleep_state
|
||||
pinctrl_select_default_state
|
||||
pinctrl_select_state
|
||||
regulator_disable
|
||||
regulator_enable
|
||||
reset_control_assert
|
||||
reset_control_deassert
|
||||
sg_miter_next
|
||||
sg_miter_start
|
||||
sg_miter_stop
|
||||
|
||||
# required by clk-vexpress-osc.ko
|
||||
clk_hw_set_rate_range
|
||||
devm_clk_hw_register
|
||||
devm_of_clk_add_hw_provider
|
||||
of_clk_hw_simple_get
|
||||
of_property_read_string
|
||||
|
||||
# required by deferred-free-helper.ko
|
||||
sched_set_normal
|
||||
|
||||
# required by dummy-cpufreq.ko
|
||||
cpufreq_generic_attr
|
||||
cpufreq_register_driver
|
||||
|
|
@ -402,6 +499,7 @@
|
|||
device_find_child
|
||||
device_match_name
|
||||
platform_bus_type
|
||||
strstr
|
||||
|
||||
# required by gnss-serial.ko
|
||||
gnss_allocate_device
|
||||
|
|
@ -409,8 +507,6 @@
|
|||
gnss_insert_raw
|
||||
gnss_put_device
|
||||
gnss_register_device
|
||||
of_property_read_variable_u32_array
|
||||
__pm_runtime_idle
|
||||
serdev_device_close
|
||||
serdev_device_open
|
||||
serdev_device_set_baudrate
|
||||
|
|
@ -419,9 +515,6 @@
|
|||
serdev_device_write
|
||||
serdev_device_write_wakeup
|
||||
|
||||
# required by goldfish_address_space.ko
|
||||
__ioremap
|
||||
|
||||
# required by goldfish_battery.ko
|
||||
power_supply_changed
|
||||
power_supply_get_drvdata
|
||||
|
|
@ -440,6 +533,18 @@
|
|||
dma_fence_default_wait
|
||||
dma_fence_free
|
||||
|
||||
# required by hci_vhci.ko
|
||||
bt_err
|
||||
_copy_from_iter_full
|
||||
hci_alloc_dev
|
||||
hci_free_dev
|
||||
hci_recv_frame
|
||||
hci_register_dev
|
||||
hci_unregister_dev
|
||||
skb_pull
|
||||
skb_queue_head
|
||||
skb_queue_purge
|
||||
|
||||
# required by ledtrig-audio.ko
|
||||
led_trigger_event
|
||||
led_trigger_register_simple
|
||||
|
|
@ -488,11 +593,12 @@
|
|||
ieee80211_remain_on_channel_expired
|
||||
ieee80211_rx_irqsafe
|
||||
ieee80211_scan_completed
|
||||
ieee80211_stop_queues
|
||||
ieee80211_stop_tx_ba_cb_irqsafe
|
||||
ieee80211_tx_status_irqsafe
|
||||
ieee80211_unregister_hw
|
||||
ieee80211_wake_queues
|
||||
init_net
|
||||
kstrndup
|
||||
__netdev_alloc_skb
|
||||
netif_rx
|
||||
netlink_broadcast
|
||||
|
|
@ -518,10 +624,7 @@
|
|||
simple_attr_release
|
||||
skb_copy
|
||||
skb_copy_expand
|
||||
skb_dequeue
|
||||
__skb_ext_put
|
||||
skb_push
|
||||
skb_queue_tail
|
||||
skb_trim
|
||||
skb_unlink
|
||||
unregister_pernet_device
|
||||
|
|
@ -561,7 +664,6 @@
|
|||
fget
|
||||
file_path
|
||||
flush_signals
|
||||
flush_workqueue
|
||||
free_buffer_head
|
||||
int_pow
|
||||
invalidate_bdev
|
||||
|
|
@ -572,10 +674,7 @@
|
|||
kernfs_put
|
||||
kobject_del
|
||||
kobject_get
|
||||
kstrtobool
|
||||
kstrtoll
|
||||
kstrtouint
|
||||
kthread_create_on_node
|
||||
kthread_parkme
|
||||
kthread_should_park
|
||||
kthread_should_stop
|
||||
|
|
@ -611,7 +710,6 @@
|
|||
unregister_reboot_notifier
|
||||
unregister_sysctl_table
|
||||
vfs_fsync
|
||||
wake_up_process
|
||||
|
||||
# required by nd_virtio.ko
|
||||
bio_chain
|
||||
|
|
@ -634,6 +732,46 @@
|
|||
netdev_pick_tx
|
||||
pci_bus_type
|
||||
|
||||
# required by page_pool.ko
|
||||
mod_node_page_state
|
||||
|
||||
# required by psmouse.ko
|
||||
bus_register_notifier
|
||||
bus_unregister_notifier
|
||||
device_add_groups
|
||||
device_create_file
|
||||
device_remove_file
|
||||
device_remove_groups
|
||||
i2c_adapter_type
|
||||
i2c_bus_type
|
||||
i2c_client_type
|
||||
i2c_for_each_dev
|
||||
i2c_new_scanned_device
|
||||
i2c_unregister_device
|
||||
i2c_verify_adapter
|
||||
input_mt_assign_slots
|
||||
input_mt_drop_unused
|
||||
input_mt_report_finger_count
|
||||
input_mt_report_pointer_emulation
|
||||
input_mt_report_slot_state
|
||||
input_mt_sync_frame
|
||||
input_set_capability
|
||||
kstrtou8
|
||||
pm_wakeup_dev_event
|
||||
ps2_begin_command
|
||||
ps2_cmd_aborted
|
||||
ps2_command
|
||||
ps2_drain
|
||||
ps2_end_command
|
||||
ps2_handle_ack
|
||||
ps2_handle_response
|
||||
ps2_init
|
||||
ps2_sendbyte
|
||||
ps2_sliced_command
|
||||
serio_rescan
|
||||
serio_unregister_child_port
|
||||
strcasecmp
|
||||
|
||||
# required by pulse8-cec.ko
|
||||
cec_allocate_adapter
|
||||
cec_delete_adapter
|
||||
|
|
@ -643,18 +781,17 @@
|
|||
cec_s_phys_addr
|
||||
cec_transmit_attempt_done_ts
|
||||
cec_unregister_adapter
|
||||
serio_close
|
||||
serio_open
|
||||
__serio_register_driver
|
||||
serio_unregister_driver
|
||||
strscpy
|
||||
wait_for_completion_timeout
|
||||
|
||||
# required by rtc-test.ko
|
||||
add_timer
|
||||
del_timer
|
||||
device_init_wakeup
|
||||
devm_rtc_allocate_device
|
||||
platform_device_add
|
||||
platform_device_alloc
|
||||
platform_device_del
|
||||
platform_device_put
|
||||
__rtc_register_device
|
||||
rtc_time64_to_tm
|
||||
rtc_tm_to_time64
|
||||
|
|
@ -685,9 +822,6 @@
|
|||
kvasprintf
|
||||
ns_to_timespec64
|
||||
pm_runtime_forbid
|
||||
pm_runtime_force_resume
|
||||
pm_runtime_force_suspend
|
||||
pm_runtime_set_autosuspend_delay
|
||||
__printk_ratelimit
|
||||
regcache_mark_dirty
|
||||
snd_ctl_add_vmaster_hook
|
||||
|
|
@ -715,15 +849,10 @@
|
|||
__pm_runtime_set_status
|
||||
regcache_cache_only
|
||||
regcache_sync
|
||||
regmap_exit
|
||||
__regmap_init
|
||||
regmap_read
|
||||
regmap_update_bits_base
|
||||
regmap_write
|
||||
snd_pcm_format_width
|
||||
__sw_hweight64
|
||||
timecounter_init
|
||||
__udelay
|
||||
|
||||
# required by snd-hda-intel.ko
|
||||
bpf_trace_run1
|
||||
|
|
@ -749,6 +878,7 @@
|
|||
# required by system_heap.ko
|
||||
dma_heap_add
|
||||
dma_heap_get_dev
|
||||
dma_heap_get_name
|
||||
dma_sync_sg_for_cpu
|
||||
__sg_page_iter_next
|
||||
__sg_page_iter_start
|
||||
|
|
@ -770,8 +900,6 @@
|
|||
idr_replace
|
||||
jiffies_to_usecs
|
||||
memchr_inv
|
||||
of_find_property
|
||||
of_get_property
|
||||
of_property_match_string
|
||||
pm_suspend_global_flags
|
||||
securityfs_create_dir
|
||||
|
|
@ -780,12 +908,27 @@
|
|||
seq_putc
|
||||
seq_write
|
||||
unregister_chrdev_region
|
||||
__usecs_to_jiffies
|
||||
|
||||
# required by tpm_vtpm_proxy.ko
|
||||
anon_inode_getfile
|
||||
compat_ptr_ioctl
|
||||
|
||||
# required by vexpress-config.ko
|
||||
devres_add
|
||||
devres_alloc_node
|
||||
devres_free
|
||||
of_device_is_compatible
|
||||
of_find_compatible_node
|
||||
of_get_next_parent
|
||||
of_parse_phandle
|
||||
of_platform_populate
|
||||
of_root
|
||||
|
||||
# required by vexpress-sysreg.ko
|
||||
bgpio_init
|
||||
devm_gpiochip_add_data_with_key
|
||||
devm_mfd_add_devices
|
||||
|
||||
# required by virt_wifi.ko
|
||||
cfg80211_connect_done
|
||||
cfg80211_disconnected
|
||||
|
|
@ -963,7 +1106,6 @@
|
|||
blk_queue_max_segment_size
|
||||
blk_rq_map_kern
|
||||
__blk_rq_map_sg
|
||||
_dev_notice
|
||||
set_capacity_revalidate_and_notify
|
||||
string_get_size
|
||||
virtio_max_dma_size
|
||||
|
|
@ -974,7 +1116,6 @@
|
|||
cdev_del
|
||||
device_destroy
|
||||
fasync_helper
|
||||
freezing_slow_path
|
||||
hvc_alloc
|
||||
hvc_instantiate
|
||||
hvc_kick
|
||||
|
|
@ -982,22 +1123,14 @@
|
|||
hvc_remove
|
||||
__hvc_resize
|
||||
kill_fasync
|
||||
nonseekable_open
|
||||
pipe_lock
|
||||
pipe_unlock
|
||||
__refrigerator
|
||||
__register_chrdev
|
||||
single_open
|
||||
single_release
|
||||
__splice_from_pipe
|
||||
system_freezing_cnt
|
||||
__unregister_chrdev
|
||||
|
||||
# required by virtio_input.ko
|
||||
input_alloc_absinfo
|
||||
input_mt_init_slots
|
||||
input_set_abs_params
|
||||
|
||||
# required by virtio_mmio.ko
|
||||
device_for_each_child
|
||||
devm_platform_ioremap_resource
|
||||
|
|
@ -1086,33 +1219,6 @@
|
|||
nvdimm_bus_unregister
|
||||
nvdimm_pmem_region_create
|
||||
|
||||
# required by virtiofs.ko
|
||||
deactivate_locked_super
|
||||
flush_delayed_work
|
||||
__fs_parse
|
||||
fuse_conn_destroy
|
||||
fuse_conn_init
|
||||
fuse_dequeue_forget
|
||||
fuse_dev_alloc
|
||||
fuse_dev_free
|
||||
fuse_dev_install
|
||||
fuse_fill_super_common
|
||||
fuse_free_conn
|
||||
fuse_get_unique
|
||||
fuse_len_args
|
||||
fuse_mount_get
|
||||
fuse_mount_put
|
||||
fuse_mount_remove
|
||||
fuse_request_end
|
||||
fuse_send_init
|
||||
get_anon_bdev
|
||||
init_user_ns
|
||||
lockref_get
|
||||
memchr
|
||||
register_filesystem
|
||||
sget_fc
|
||||
unregister_filesystem
|
||||
|
||||
# required by vmw_vsock_virtio_transport.ko
|
||||
lock_sock_nested
|
||||
release_sock
|
||||
|
|
@ -1163,6 +1269,7 @@
|
|||
crypto_has_alg
|
||||
disk_end_io_acct
|
||||
disk_start_io_acct
|
||||
flush_dcache_page
|
||||
free_percpu
|
||||
fsync_bdev
|
||||
idr_find
|
||||
|
|
@ -1177,19 +1284,18 @@
|
|||
# required by zsmalloc.ko
|
||||
alloc_anon_inode
|
||||
__ClearPageMovable
|
||||
contig_page_data
|
||||
dec_zone_page_state
|
||||
inc_zone_page_state
|
||||
init_pseudo
|
||||
iput
|
||||
kern_mount
|
||||
kern_unmount
|
||||
kill_anon_super
|
||||
__lock_page
|
||||
page_mapping
|
||||
_raw_read_lock
|
||||
_raw_read_unlock
|
||||
_raw_write_lock
|
||||
_raw_write_unlock
|
||||
register_shrinker
|
||||
__SetPageMovable
|
||||
unregister_shrinker
|
||||
|
|
|
|||
|
|
@ -1175,9 +1175,9 @@ __armv4_mmu_cache_off:
|
|||
__armv7_mmu_cache_off:
|
||||
mrc p15, 0, r0, c1, c0
|
||||
#ifdef CONFIG_MMU
|
||||
bic r0, r0, #0x000d
|
||||
bic r0, r0, #0x0005
|
||||
#else
|
||||
bic r0, r0, #0x000c
|
||||
bic r0, r0, #0x0004
|
||||
#endif
|
||||
mcr p15, 0, r0, c1, c0 @ turn MMU and cache off
|
||||
mov r0, #0
|
||||
|
|
@ -1440,8 +1440,7 @@ ENTRY(efi_enter_kernel)
|
|||
mov r4, r0 @ preserve image base
|
||||
mov r8, r1 @ preserve DT pointer
|
||||
|
||||
ARM( adrl r0, call_cache_fn )
|
||||
THUMB( adr r0, call_cache_fn )
|
||||
adr_l r0, call_cache_fn
|
||||
adr r1, 0f @ clean the region of code we
|
||||
bl cache_clean_flush @ may run with the MMU off
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,9 @@ reg_5p0v_usb: regulator-5v-usb {
|
|||
|
||||
system-leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&helios_system_led_pins>;
|
||||
|
||||
status-led {
|
||||
label = "helios4:green:status";
|
||||
gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
|
||||
|
|
@ -86,6 +89,9 @@ fault-led {
|
|||
|
||||
io-leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&helios_io_led_pins>;
|
||||
|
||||
sata1-led {
|
||||
label = "helios4:green:ata1";
|
||||
gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;
|
||||
|
|
@ -121,11 +127,15 @@ usb-led {
|
|||
fan1: j10-pwm {
|
||||
compatible = "pwm-fan";
|
||||
pwms = <&gpio1 9 40000>; /* Target freq:25 kHz */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&helios_fan1_pins>;
|
||||
};
|
||||
|
||||
fan2: j17-pwm {
|
||||
compatible = "pwm-fan";
|
||||
pwms = <&gpio1 23 40000>; /* Target freq:25 kHz */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&helios_fan2_pins>;
|
||||
};
|
||||
|
||||
usb2_phy: usb2-phy {
|
||||
|
|
@ -286,16 +296,22 @@ helios_sdhci_pins: helios-sdhci-pins {
|
|||
"mpp39", "mpp40";
|
||||
marvell,function = "sd0";
|
||||
};
|
||||
helios_led_pins: helios-led-pins {
|
||||
marvell,pins = "mpp24", "mpp25",
|
||||
"mpp49", "mpp50",
|
||||
helios_system_led_pins: helios-system-led-pins {
|
||||
marvell,pins = "mpp24", "mpp25";
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
helios_io_led_pins: helios-io-led-pins {
|
||||
marvell,pins = "mpp49", "mpp50",
|
||||
"mpp52", "mpp53",
|
||||
"mpp54";
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
helios_fan_pins: helios-fan-pins {
|
||||
marvell,pins = "mpp41", "mpp43",
|
||||
"mpp48", "mpp55";
|
||||
helios_fan1_pins: helios_fan1_pins {
|
||||
marvell,pins = "mpp41", "mpp43";
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
helios_fan2_pins: helios_fan2_pins {
|
||||
marvell,pins = "mpp48", "mpp55";
|
||||
marvell,function = "gpio";
|
||||
};
|
||||
microsom_spi1_cs_pins: spi1-cs-pins {
|
||||
|
|
|
|||
|
|
@ -370,6 +370,7 @@ lpc_snoop: lpc-snoop@10 {
|
|||
compatible = "aspeed,ast2400-lpc-snoop";
|
||||
reg = <0x10 0x8>;
|
||||
interrupts = <8>;
|
||||
clocks = <&syscon ASPEED_CLK_GATE_LCLK>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -492,6 +492,7 @@ lpc_snoop: lpc-snoop@10 {
|
|||
compatible = "aspeed,ast2500-lpc-snoop";
|
||||
reg = <0x10 0x8>;
|
||||
interrupts = <8>;
|
||||
clocks = <&syscon ASPEED_CLK_GATE_LCLK>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -513,6 +513,7 @@ lpc_snoop: lpc-snoop@0 {
|
|||
compatible = "aspeed,ast2600-lpc-snoop";
|
||||
reg = <0x0 0x80>;
|
||||
interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&syscon ASPEED_CLK_GATE_LCLK>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ &i2c_0 {
|
|||
s2mps14_pmic@66 {
|
||||
compatible = "samsung,s2mps14-pmic";
|
||||
interrupt-parent = <&gpx3>;
|
||||
interrupts = <5 IRQ_TYPE_NONE>;
|
||||
interrupts = <5 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&s2mps14_irq>;
|
||||
reg = <0x66>;
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ &i2c_0 {
|
|||
s2mps14_pmic@66 {
|
||||
compatible = "samsung,s2mps14-pmic";
|
||||
interrupt-parent = <&gpx0>;
|
||||
interrupts = <7 IRQ_TYPE_NONE>;
|
||||
interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
|
||||
reg = <0x66>;
|
||||
wakeup-source;
|
||||
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ &i2c_0 {
|
|||
s2mps14_pmic@66 {
|
||||
compatible = "samsung,s2mps14-pmic";
|
||||
interrupt-parent = <&gpx0>;
|
||||
interrupts = <7 IRQ_TYPE_NONE>;
|
||||
interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
|
||||
reg = <0x66>;
|
||||
wakeup-source;
|
||||
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ s5m8767-pmic@66 {
|
|||
compatible = "samsung,s5m8767-pmic";
|
||||
reg = <0x66>;
|
||||
interrupt-parent = <&gpx3>;
|
||||
interrupts = <2 IRQ_TYPE_NONE>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&s5m8767_irq &s5m8767_dvs &s5m8767_ds>;
|
||||
wakeup-source;
|
||||
|
|
|
|||
|
|
@ -349,7 +349,7 @@ s2mps11_pmic@66 {
|
|||
reg = <0x66>;
|
||||
|
||||
interrupt-parent = <&gpx3>;
|
||||
interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&s2mps11_irq>;
|
||||
|
||||
|
|
|
|||
|
|
@ -509,7 +509,7 @@ s2mps11_pmic@66 {
|
|||
samsung,s2mps11-acokb-ground;
|
||||
|
||||
interrupt-parent = <&gpx0>;
|
||||
interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&s2mps11_irq>;
|
||||
|
||||
|
|
|
|||
|
|
@ -33,10 +33,12 @@ thermal-zones {
|
|||
};
|
||||
|
||||
ocp {
|
||||
/* 4430 has only gpio_86 tshut and no talert interrupt */
|
||||
bandgap: bandgap@4a002260 {
|
||||
reg = <0x4a002260 0x4
|
||||
0x4a00232C 0x4>;
|
||||
compatible = "ti,omap4430-bandgap";
|
||||
gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
#thermal-sensor-cells = <0>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -494,4 +494,88 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||
#define _ASM_NOKPROBE(entry)
|
||||
#endif
|
||||
|
||||
.macro __adldst_l, op, reg, sym, tmp, c
|
||||
.if __LINUX_ARM_ARCH__ < 7
|
||||
ldr\c \tmp, .La\@
|
||||
.subsection 1
|
||||
.align 2
|
||||
.La\@: .long \sym - .Lpc\@
|
||||
.previous
|
||||
.else
|
||||
.ifnb \c
|
||||
THUMB( ittt \c )
|
||||
.endif
|
||||
movw\c \tmp, #:lower16:\sym - .Lpc\@
|
||||
movt\c \tmp, #:upper16:\sym - .Lpc\@
|
||||
.endif
|
||||
|
||||
#ifndef CONFIG_THUMB2_KERNEL
|
||||
.set .Lpc\@, . + 8 // PC bias
|
||||
.ifc \op, add
|
||||
add\c \reg, \tmp, pc
|
||||
.else
|
||||
\op\c \reg, [pc, \tmp]
|
||||
.endif
|
||||
#else
|
||||
.Lb\@: add\c \tmp, \tmp, pc
|
||||
/*
|
||||
* In Thumb-2 builds, the PC bias depends on whether we are currently
|
||||
* emitting into a .arm or a .thumb section. The size of the add opcode
|
||||
* above will be 2 bytes when emitting in Thumb mode and 4 bytes when
|
||||
* emitting in ARM mode, so let's use this to account for the bias.
|
||||
*/
|
||||
.set .Lpc\@, . + (. - .Lb\@)
|
||||
|
||||
.ifnc \op, add
|
||||
\op\c \reg, [\tmp]
|
||||
.endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* mov_l - move a constant value or [relocated] address into a register
|
||||
*/
|
||||
.macro mov_l, dst:req, imm:req
|
||||
.if __LINUX_ARM_ARCH__ < 7
|
||||
ldr \dst, =\imm
|
||||
.else
|
||||
movw \dst, #:lower16:\imm
|
||||
movt \dst, #:upper16:\imm
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* adr_l - adr pseudo-op with unlimited range
|
||||
*
|
||||
* @dst: destination register
|
||||
* @sym: name of the symbol
|
||||
* @cond: conditional opcode suffix
|
||||
*/
|
||||
.macro adr_l, dst:req, sym:req, cond
|
||||
__adldst_l add, \dst, \sym, \dst, \cond
|
||||
.endm
|
||||
|
||||
/*
|
||||
* ldr_l - ldr <literal> pseudo-op with unlimited range
|
||||
*
|
||||
* @dst: destination register
|
||||
* @sym: name of the symbol
|
||||
* @cond: conditional opcode suffix
|
||||
*/
|
||||
.macro ldr_l, dst:req, sym:req, cond
|
||||
__adldst_l ldr, \dst, \sym, \dst, \cond
|
||||
.endm
|
||||
|
||||
/*
|
||||
* str_l - str <literal> pseudo-op with unlimited range
|
||||
*
|
||||
* @src: source register
|
||||
* @sym: name of the symbol
|
||||
* @tmp: mandatory scratch register
|
||||
* @cond: conditional opcode suffix
|
||||
*/
|
||||
.macro str_l, src:req, sym:req, tmp:req, cond
|
||||
__adldst_l str, \src, \sym, \tmp, \cond
|
||||
.endm
|
||||
|
||||
#endif /* __ASM_ASSEMBLER_H__ */
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <asm/thread_info.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/assembler.h>
|
||||
#include "iwmmxt.h"
|
||||
|
||||
#if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B)
|
||||
#define PJ4(code...) code
|
||||
|
|
@ -113,33 +114,33 @@ concan_save:
|
|||
|
||||
concan_dump:
|
||||
|
||||
wstrw wCSSF, [r1, #MMX_WCSSF]
|
||||
wstrw wCASF, [r1, #MMX_WCASF]
|
||||
wstrw wCGR0, [r1, #MMX_WCGR0]
|
||||
wstrw wCGR1, [r1, #MMX_WCGR1]
|
||||
wstrw wCGR2, [r1, #MMX_WCGR2]
|
||||
wstrw wCGR3, [r1, #MMX_WCGR3]
|
||||
wstrw wCSSF, r1, MMX_WCSSF
|
||||
wstrw wCASF, r1, MMX_WCASF
|
||||
wstrw wCGR0, r1, MMX_WCGR0
|
||||
wstrw wCGR1, r1, MMX_WCGR1
|
||||
wstrw wCGR2, r1, MMX_WCGR2
|
||||
wstrw wCGR3, r1, MMX_WCGR3
|
||||
|
||||
1: @ MUP? wRn
|
||||
tst r2, #0x2
|
||||
beq 2f
|
||||
|
||||
wstrd wR0, [r1, #MMX_WR0]
|
||||
wstrd wR1, [r1, #MMX_WR1]
|
||||
wstrd wR2, [r1, #MMX_WR2]
|
||||
wstrd wR3, [r1, #MMX_WR3]
|
||||
wstrd wR4, [r1, #MMX_WR4]
|
||||
wstrd wR5, [r1, #MMX_WR5]
|
||||
wstrd wR6, [r1, #MMX_WR6]
|
||||
wstrd wR7, [r1, #MMX_WR7]
|
||||
wstrd wR8, [r1, #MMX_WR8]
|
||||
wstrd wR9, [r1, #MMX_WR9]
|
||||
wstrd wR10, [r1, #MMX_WR10]
|
||||
wstrd wR11, [r1, #MMX_WR11]
|
||||
wstrd wR12, [r1, #MMX_WR12]
|
||||
wstrd wR13, [r1, #MMX_WR13]
|
||||
wstrd wR14, [r1, #MMX_WR14]
|
||||
wstrd wR15, [r1, #MMX_WR15]
|
||||
wstrd wR0, r1, MMX_WR0
|
||||
wstrd wR1, r1, MMX_WR1
|
||||
wstrd wR2, r1, MMX_WR2
|
||||
wstrd wR3, r1, MMX_WR3
|
||||
wstrd wR4, r1, MMX_WR4
|
||||
wstrd wR5, r1, MMX_WR5
|
||||
wstrd wR6, r1, MMX_WR6
|
||||
wstrd wR7, r1, MMX_WR7
|
||||
wstrd wR8, r1, MMX_WR8
|
||||
wstrd wR9, r1, MMX_WR9
|
||||
wstrd wR10, r1, MMX_WR10
|
||||
wstrd wR11, r1, MMX_WR11
|
||||
wstrd wR12, r1, MMX_WR12
|
||||
wstrd wR13, r1, MMX_WR13
|
||||
wstrd wR14, r1, MMX_WR14
|
||||
wstrd wR15, r1, MMX_WR15
|
||||
|
||||
2: teq r0, #0 @ anything to load?
|
||||
reteq lr @ if not, return
|
||||
|
|
@ -147,30 +148,30 @@ concan_dump:
|
|||
concan_load:
|
||||
|
||||
@ Load wRn
|
||||
wldrd wR0, [r0, #MMX_WR0]
|
||||
wldrd wR1, [r0, #MMX_WR1]
|
||||
wldrd wR2, [r0, #MMX_WR2]
|
||||
wldrd wR3, [r0, #MMX_WR3]
|
||||
wldrd wR4, [r0, #MMX_WR4]
|
||||
wldrd wR5, [r0, #MMX_WR5]
|
||||
wldrd wR6, [r0, #MMX_WR6]
|
||||
wldrd wR7, [r0, #MMX_WR7]
|
||||
wldrd wR8, [r0, #MMX_WR8]
|
||||
wldrd wR9, [r0, #MMX_WR9]
|
||||
wldrd wR10, [r0, #MMX_WR10]
|
||||
wldrd wR11, [r0, #MMX_WR11]
|
||||
wldrd wR12, [r0, #MMX_WR12]
|
||||
wldrd wR13, [r0, #MMX_WR13]
|
||||
wldrd wR14, [r0, #MMX_WR14]
|
||||
wldrd wR15, [r0, #MMX_WR15]
|
||||
wldrd wR0, r0, MMX_WR0
|
||||
wldrd wR1, r0, MMX_WR1
|
||||
wldrd wR2, r0, MMX_WR2
|
||||
wldrd wR3, r0, MMX_WR3
|
||||
wldrd wR4, r0, MMX_WR4
|
||||
wldrd wR5, r0, MMX_WR5
|
||||
wldrd wR6, r0, MMX_WR6
|
||||
wldrd wR7, r0, MMX_WR7
|
||||
wldrd wR8, r0, MMX_WR8
|
||||
wldrd wR9, r0, MMX_WR9
|
||||
wldrd wR10, r0, MMX_WR10
|
||||
wldrd wR11, r0, MMX_WR11
|
||||
wldrd wR12, r0, MMX_WR12
|
||||
wldrd wR13, r0, MMX_WR13
|
||||
wldrd wR14, r0, MMX_WR14
|
||||
wldrd wR15, r0, MMX_WR15
|
||||
|
||||
@ Load wCx
|
||||
wldrw wCSSF, [r0, #MMX_WCSSF]
|
||||
wldrw wCASF, [r0, #MMX_WCASF]
|
||||
wldrw wCGR0, [r0, #MMX_WCGR0]
|
||||
wldrw wCGR1, [r0, #MMX_WCGR1]
|
||||
wldrw wCGR2, [r0, #MMX_WCGR2]
|
||||
wldrw wCGR3, [r0, #MMX_WCGR3]
|
||||
wldrw wCSSF, r0, MMX_WCSSF
|
||||
wldrw wCASF, r0, MMX_WCASF
|
||||
wldrw wCGR0, r0, MMX_WCGR0
|
||||
wldrw wCGR1, r0, MMX_WCGR1
|
||||
wldrw wCGR2, r0, MMX_WCGR2
|
||||
wldrw wCGR3, r0, MMX_WCGR3
|
||||
|
||||
@ clear CUP/MUP (only if r1 != 0)
|
||||
teq r1, #0
|
||||
|
|
|
|||
47
arch/arm/kernel/iwmmxt.h
Normal file
47
arch/arm/kernel/iwmmxt.h
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef __IWMMXT_H__
|
||||
#define __IWMMXT_H__
|
||||
|
||||
.irp b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
|
||||
.set .LwR\b, \b
|
||||
.set .Lr\b, \b
|
||||
.endr
|
||||
|
||||
.set .LwCSSF, 0x2
|
||||
.set .LwCASF, 0x3
|
||||
.set .LwCGR0, 0x8
|
||||
.set .LwCGR1, 0x9
|
||||
.set .LwCGR2, 0xa
|
||||
.set .LwCGR3, 0xb
|
||||
|
||||
.macro wldrd, reg:req, base:req, offset:req
|
||||
.inst 0xedd00100 | (.L\reg << 12) | (.L\base << 16) | (\offset >> 2)
|
||||
.endm
|
||||
|
||||
.macro wldrw, reg:req, base:req, offset:req
|
||||
.inst 0xfd900100 | (.L\reg << 12) | (.L\base << 16) | (\offset >> 2)
|
||||
.endm
|
||||
|
||||
.macro wstrd, reg:req, base:req, offset:req
|
||||
.inst 0xedc00100 | (.L\reg << 12) | (.L\base << 16) | (\offset >> 2)
|
||||
.endm
|
||||
|
||||
.macro wstrw, reg:req, base:req, offset:req
|
||||
.inst 0xfd800100 | (.L\reg << 12) | (.L\base << 16) | (\offset >> 2)
|
||||
.endm
|
||||
|
||||
#ifdef __clang__
|
||||
|
||||
#define wCon c1
|
||||
|
||||
.macro tmrc, dest:req, control:req
|
||||
mrc p1, 0, \dest, \control, c0, 0
|
||||
.endm
|
||||
|
||||
.macro tmcr, control:req, src:req
|
||||
mcr p1, 0, \src, \control, c0, 0
|
||||
.endm
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -248,6 +248,7 @@ struct oabi_epoll_event {
|
|||
__u64 data;
|
||||
} __attribute__ ((packed,aligned(4)));
|
||||
|
||||
#ifdef CONFIG_EPOLL
|
||||
asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd,
|
||||
struct oabi_epoll_event __user *event)
|
||||
{
|
||||
|
|
@ -298,6 +299,20 @@ asmlinkage long sys_oabi_epoll_wait(int epfd,
|
|||
kfree(kbuf);
|
||||
return err ? -EFAULT : ret;
|
||||
}
|
||||
#else
|
||||
asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd,
|
||||
struct oabi_epoll_event __user *event)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_epoll_wait(int epfd,
|
||||
struct oabi_epoll_event __user *events,
|
||||
int maxevents, int timeout)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct oabi_sembuf {
|
||||
unsigned short sem_num;
|
||||
|
|
|
|||
|
|
@ -442,7 +442,7 @@ ENDPROC(at91_backup_mode)
|
|||
str tmp1, [pmc, #AT91_PMC_PLL_UPDT]
|
||||
|
||||
/* step 2. */
|
||||
ldr tmp1, =#AT91_PMC_PLL_ACR_DEFAULT_PLLA
|
||||
ldr tmp1, =AT91_PMC_PLL_ACR_DEFAULT_PLLA
|
||||
str tmp1, [pmc, #AT91_PMC_PLL_ACR]
|
||||
|
||||
/* step 3. */
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ config MACH_IXP4XX_OF
|
|||
select I2C
|
||||
select I2C_IOP3XX
|
||||
select PCI
|
||||
select TIMER_OF
|
||||
select USE_OF
|
||||
help
|
||||
Say 'Y' here to support Device Tree-based IXP4xx platforms.
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
@ and an offset to the irq acknowledgment word
|
||||
|
||||
ENTRY(s3c24xx_spi_fiq_rx)
|
||||
s3c24xx_spi_fix_rx:
|
||||
.word fiq_rx_end - fiq_rx_start
|
||||
.word fiq_rx_irq_ack - fiq_rx_start
|
||||
fiq_rx_start:
|
||||
|
|
@ -49,7 +48,7 @@ fiq_rx_start:
|
|||
strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
|
||||
|
||||
subs fiq_rcount, fiq_rcount, #1
|
||||
subnes pc, lr, #4 @@ return, still have work to do
|
||||
subsne pc, lr, #4 @@ return, still have work to do
|
||||
|
||||
@@ set IRQ controller so that next op will trigger IRQ
|
||||
mov fiq_rtmp, #0
|
||||
|
|
@ -61,7 +60,6 @@ fiq_rx_irq_ack:
|
|||
fiq_rx_end:
|
||||
|
||||
ENTRY(s3c24xx_spi_fiq_txrx)
|
||||
s3c24xx_spi_fiq_txrx:
|
||||
.word fiq_txrx_end - fiq_txrx_start
|
||||
.word fiq_txrx_irq_ack - fiq_txrx_start
|
||||
fiq_txrx_start:
|
||||
|
|
@ -76,7 +74,7 @@ fiq_txrx_start:
|
|||
strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
|
||||
|
||||
subs fiq_rcount, fiq_rcount, #1
|
||||
subnes pc, lr, #4 @@ return, still have work to do
|
||||
subsne pc, lr, #4 @@ return, still have work to do
|
||||
|
||||
mov fiq_rtmp, #0
|
||||
str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ]
|
||||
|
|
@ -88,7 +86,6 @@ fiq_txrx_irq_ack:
|
|||
fiq_txrx_end:
|
||||
|
||||
ENTRY(s3c24xx_spi_fiq_tx)
|
||||
s3c24xx_spi_fix_tx:
|
||||
.word fiq_tx_end - fiq_tx_start
|
||||
.word fiq_tx_irq_ack - fiq_tx_start
|
||||
fiq_tx_start:
|
||||
|
|
@ -101,7 +98,7 @@ fiq_tx_start:
|
|||
strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
|
||||
|
||||
subs fiq_rcount, fiq_rcount, #1
|
||||
subnes pc, lr, #4 @@ return, still have work to do
|
||||
subsne pc, lr, #4 @@ return, still have work to do
|
||||
|
||||
mov fiq_rtmp, #0
|
||||
str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ]
|
||||
|
|
|
|||
|
|
@ -55,25 +55,25 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_GROUP("Data-processing (register), (register-shifted register), (immediate)")
|
||||
|
||||
#define _DATA_PROCESSING_DNM(op,s,val) \
|
||||
TEST_RR( op "eq" s " r0, r",1, VAL1,", r",2, val, "") \
|
||||
TEST_RR( op "ne" s " r1, r",1, VAL1,", r",2, val, ", lsl #3") \
|
||||
TEST_RR( op "cs" s " r2, r",3, VAL1,", r",2, val, ", lsr #4") \
|
||||
TEST_RR( op "cc" s " r3, r",3, VAL1,", r",2, val, ", asr #5") \
|
||||
TEST_RR( op "mi" s " r4, r",5, VAL1,", r",2, N(val),", asr #6") \
|
||||
TEST_RR( op "pl" s " r5, r",5, VAL1,", r",2, val, ", ror #7") \
|
||||
TEST_RR( op "vs" s " r6, r",7, VAL1,", r",2, val, ", rrx") \
|
||||
TEST_R( op "vc" s " r6, r",7, VAL1,", pc, lsl #3") \
|
||||
TEST_R( op "vc" s " r6, r",7, VAL1,", sp, lsr #4") \
|
||||
TEST_R( op "vc" s " r6, pc, r",7, VAL1,", asr #5") \
|
||||
TEST_R( op "vc" s " r6, sp, r",7, VAL1,", ror #6") \
|
||||
TEST_RRR( op "hi" s " r8, r",9, VAL1,", r",14,val, ", lsl r",0, 3,"")\
|
||||
TEST_RRR( op "ls" s " r9, r",9, VAL1,", r",14,val, ", lsr r",7, 4,"")\
|
||||
TEST_RRR( op "ge" s " r10, r",11,VAL1,", r",14,val, ", asr r",7, 5,"")\
|
||||
TEST_RRR( op "lt" s " r11, r",11,VAL1,", r",14,N(val),", asr r",7, 6,"")\
|
||||
TEST_RR( op "gt" s " r12, r13" ", r",14,val, ", ror r",14,7,"")\
|
||||
TEST_RR( op "le" s " r14, r",0, val, ", r13" ", lsl r",14,8,"")\
|
||||
TEST_R( op "eq" s " r0, r",11,VAL1,", #0xf5") \
|
||||
TEST_R( op "ne" s " r11, r",0, VAL1,", #0xf5000000") \
|
||||
TEST_RR( op s "eq r0, r",1, VAL1,", r",2, val, "") \
|
||||
TEST_RR( op s "ne r1, r",1, VAL1,", r",2, val, ", lsl #3") \
|
||||
TEST_RR( op s "cs r2, r",3, VAL1,", r",2, val, ", lsr #4") \
|
||||
TEST_RR( op s "cc r3, r",3, VAL1,", r",2, val, ", asr #5") \
|
||||
TEST_RR( op s "mi r4, r",5, VAL1,", r",2, N(val),", asr #6") \
|
||||
TEST_RR( op s "pl r5, r",5, VAL1,", r",2, val, ", ror #7") \
|
||||
TEST_RR( op s "vs r6, r",7, VAL1,", r",2, val, ", rrx") \
|
||||
TEST_R( op s "vc r6, r",7, VAL1,", pc, lsl #3") \
|
||||
TEST_R( op s "vc r6, r",7, VAL1,", sp, lsr #4") \
|
||||
TEST_R( op s "vc r6, pc, r",7, VAL1,", asr #5") \
|
||||
TEST_R( op s "vc r6, sp, r",7, VAL1,", ror #6") \
|
||||
TEST_RRR( op s "hi r8, r",9, VAL1,", r",14,val, ", lsl r",0, 3,"")\
|
||||
TEST_RRR( op s "ls r9, r",9, VAL1,", r",14,val, ", lsr r",7, 4,"")\
|
||||
TEST_RRR( op s "ge r10, r",11,VAL1,", r",14,val, ", asr r",7, 5,"")\
|
||||
TEST_RRR( op s "lt r11, r",11,VAL1,", r",14,N(val),", asr r",7, 6,"")\
|
||||
TEST_RR( op s "gt r12, r13" ", r",14,val, ", ror r",14,7,"")\
|
||||
TEST_RR( op s "le r14, r",0, val, ", r13" ", lsl r",14,8,"")\
|
||||
TEST_R( op s "eq r0, r",11,VAL1,", #0xf5") \
|
||||
TEST_R( op s "ne r11, r",0, VAL1,", #0xf5000000") \
|
||||
TEST_R( op s " r7, r",8, VAL2,", #0x000af000") \
|
||||
TEST( op s " r4, pc" ", #0x00005a00")
|
||||
|
||||
|
|
@ -104,23 +104,23 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_R( op " r",8, VAL2,", #0x000af000")
|
||||
|
||||
#define _DATA_PROCESSING_DM(op,s,val) \
|
||||
TEST_R( op "eq" s " r0, r",1, val, "") \
|
||||
TEST_R( op "ne" s " r1, r",1, val, ", lsl #3") \
|
||||
TEST_R( op "cs" s " r2, r",3, val, ", lsr #4") \
|
||||
TEST_R( op "cc" s " r3, r",3, val, ", asr #5") \
|
||||
TEST_R( op "mi" s " r4, r",5, N(val),", asr #6") \
|
||||
TEST_R( op "pl" s " r5, r",5, val, ", ror #7") \
|
||||
TEST_R( op "vs" s " r6, r",10,val, ", rrx") \
|
||||
TEST( op "vs" s " r7, pc, lsl #3") \
|
||||
TEST( op "vs" s " r7, sp, lsr #4") \
|
||||
TEST_RR( op "vc" s " r8, r",7, val, ", lsl r",0, 3,"") \
|
||||
TEST_RR( op "hi" s " r9, r",9, val, ", lsr r",7, 4,"") \
|
||||
TEST_RR( op "ls" s " r10, r",9, val, ", asr r",7, 5,"") \
|
||||
TEST_RR( op "ge" s " r11, r",11,N(val),", asr r",7, 6,"") \
|
||||
TEST_RR( op "lt" s " r12, r",11,val, ", ror r",14,7,"") \
|
||||
TEST_R( op "gt" s " r14, r13" ", lsl r",14,8,"") \
|
||||
TEST( op "eq" s " r0, #0xf5") \
|
||||
TEST( op "ne" s " r11, #0xf5000000") \
|
||||
TEST_R( op s "eq r0, r",1, val, "") \
|
||||
TEST_R( op s "ne r1, r",1, val, ", lsl #3") \
|
||||
TEST_R( op s "cs r2, r",3, val, ", lsr #4") \
|
||||
TEST_R( op s "cc r3, r",3, val, ", asr #5") \
|
||||
TEST_R( op s "mi r4, r",5, N(val),", asr #6") \
|
||||
TEST_R( op s "pl r5, r",5, val, ", ror #7") \
|
||||
TEST_R( op s "vs r6, r",10,val, ", rrx") \
|
||||
TEST( op s "vs r7, pc, lsl #3") \
|
||||
TEST( op s "vs r7, sp, lsr #4") \
|
||||
TEST_RR( op s "vc r8, r",7, val, ", lsl r",0, 3,"") \
|
||||
TEST_RR( op s "hi r9, r",9, val, ", lsr r",7, 4,"") \
|
||||
TEST_RR( op s "ls r10, r",9, val, ", asr r",7, 5,"") \
|
||||
TEST_RR( op s "ge r11, r",11,N(val),", asr r",7, 6,"") \
|
||||
TEST_RR( op s "lt r12, r",11,val, ", ror r",14,7,"") \
|
||||
TEST_R( op s "gt r14, r13" ", lsl r",14,8,"") \
|
||||
TEST( op s "eq r0, #0xf5") \
|
||||
TEST( op s "ne r11, #0xf5000000") \
|
||||
TEST( op s " r7, #0x000af000") \
|
||||
TEST( op s " r4, #0x00005a00")
|
||||
|
||||
|
|
@ -166,10 +166,10 @@ void kprobe_arm_test_cases(void)
|
|||
|
||||
/* Data-processing with PC as a target and status registers updated */
|
||||
TEST_UNSUPPORTED("movs pc, r1")
|
||||
TEST_UNSUPPORTED("movs pc, r1, lsl r2")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1b0f211) " @movs pc, r1, lsl r2")
|
||||
TEST_UNSUPPORTED("movs pc, #0x10000")
|
||||
TEST_UNSUPPORTED("adds pc, lr, r1")
|
||||
TEST_UNSUPPORTED("adds pc, lr, r1, lsl r2")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe09ef211) " @adds pc, lr, r1, lsl r2")
|
||||
TEST_UNSUPPORTED("adds pc, lr, #4")
|
||||
|
||||
/* Data-processing with SP as target */
|
||||
|
|
@ -352,7 +352,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe000029f) " @ mul r0, pc, r2")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0000f91) " @ mul r0, r1, pc")
|
||||
TEST_RR( "muls r0, r",1, VAL1,", r",2, VAL2,"")
|
||||
TEST_RR( "mullss r7, r",8, VAL2,", r",9, VAL2,"")
|
||||
TEST_RR( "mulsls r7, r",8, VAL2,", r",9, VAL2,"")
|
||||
TEST_R( "muls lr, r",4, VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe01f0291) " @ muls pc, r1, r2")
|
||||
|
||||
|
|
@ -361,7 +361,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_RR( "mla lr, r",1, VAL2,", r",2, VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe02f3291) " @ mla pc, r1, r2, r3")
|
||||
TEST_RRR( "mlas r0, r",1, VAL1,", r",2, VAL2,", r",3, VAL3,"")
|
||||
TEST_RRR( "mlahis r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
|
||||
TEST_RRR( "mlashi r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
|
||||
TEST_RR( "mlas lr, r",1, VAL2,", r",2, VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe03f3291) " @ mlas pc, r1, r2, r3")
|
||||
|
||||
|
|
@ -394,7 +394,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe081f392) " @ umull pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe08f1392) " @ umull r1, pc, r2, r3")
|
||||
TEST_RR( "umulls r0, r1, r",2, VAL1,", r",3, VAL2,"")
|
||||
TEST_RR( "umulllss r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_RR( "umullsls r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_R( "umulls lr, r12, r",11,VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe091f392) " @ umulls pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe09f1392) " @ umulls r1, pc, r2, r3")
|
||||
|
|
@ -405,7 +405,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe0af1392) " @ umlal pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0a1f392) " @ umlal r1, pc, r2, r3")
|
||||
TEST_RRRR( "umlals r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
|
||||
TEST_RRRR( "umlalles r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRRR( "umlalsle r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRR( "umlals r",14,VAL3,", r",7, VAL4,", r",5, VAL1,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0bf1392) " @ umlals pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0b1f392) " @ umlals r1, pc, r2, r3")
|
||||
|
|
@ -416,7 +416,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe0c1f392) " @ smull pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0cf1392) " @ smull r1, pc, r2, r3")
|
||||
TEST_RR( "smulls r0, r1, r",2, VAL1,", r",3, VAL2,"")
|
||||
TEST_RR( "smulllss r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_RR( "smullsls r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_R( "smulls lr, r12, r",11,VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0d1f392) " @ smulls pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0df1392) " @ smulls r1, pc, r2, r3")
|
||||
|
|
@ -427,7 +427,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe0ef1392) " @ smlal pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0e1f392) " @ smlal r1, pc, r2, r3")
|
||||
TEST_RRRR( "smlals r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
|
||||
TEST_RRRR( "smlalles r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRRR( "smlalsle r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRR( "smlals r",14,VAL3,", r",7, VAL4,", r",5, VAL1,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0ff1392) " @ smlals pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0f0f392) " @ smlals r0, pc, r2, r3")
|
||||
|
|
@ -450,7 +450,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe10f0091) " @ swp r0, r1, [pc]")
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
TEST_RP("swpb lr, r",7,VAL2,", [r",8,0,"]")
|
||||
TEST_R( "swpvsb r0, r",1,VAL1,", [sp]")
|
||||
TEST_R( "swpbvs r0, r",1,VAL1,", [sp]")
|
||||
#else
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe148e097) " @ swpb lr, r7, [r8]")
|
||||
TEST_UNSUPPORTED(__inst_arm(0x614d0091) " @ swpvsb r0, r1, [sp]")
|
||||
|
|
@ -477,11 +477,11 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_GROUP("Extra load/store instructions")
|
||||
|
||||
TEST_RPR( "strh r",0, VAL1,", [r",1, 48,", -r",2, 24,"]")
|
||||
TEST_RPR( "streqh r",14,VAL2,", [r",11,0, ", r",12, 48,"]")
|
||||
TEST_UNSUPPORTED( "streqh r14, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "streqh r14, [r12, r13]")
|
||||
TEST_RPR( "strheq r",14,VAL2,", [r",11,0, ", r",12, 48,"]")
|
||||
TEST_UNSUPPORTED( "strheq r14, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "strheq r14, [r12, r13]")
|
||||
TEST_RPR( "strh r",1, VAL1,", [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_RPR( "strneh r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strhne r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strh r",2, VAL1,", [r",3, 24,"], r",4, 48,"")
|
||||
TEST_RPR( "strh r",10,VAL2,", [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1afc0ba) " @ strh r12, [pc, r10]!")
|
||||
|
|
@ -489,9 +489,9 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe089a0bf) " @ strh r10, [r9], pc")
|
||||
|
||||
TEST_PR( "ldrh r0, [r",0, 48,", -r",2, 24,"]")
|
||||
TEST_PR( "ldrcsh r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrhcs r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrh r1, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrcch r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrhcc r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrh r2, [r",3, 24,"], r",4, 48,"")
|
||||
TEST_PR( "ldrh r10, [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1bfc0ba) " @ ldrh r12, [pc, r10]!")
|
||||
|
|
@ -499,9 +499,9 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe099a0bf) " @ ldrh r10, [r9], pc")
|
||||
|
||||
TEST_RP( "strh r",0, VAL1,", [r",1, 24,", #-2]")
|
||||
TEST_RP( "strmih r",14,VAL2,", [r",13,0, ", #2]")
|
||||
TEST_RP( "strhmi r",14,VAL2,", [r",13,0, ", #2]")
|
||||
TEST_RP( "strh r",1, VAL1,", [r",2, 24,", #4]!")
|
||||
TEST_RP( "strplh r",12,VAL2,", [r",11,24,", #-4]!")
|
||||
TEST_RP( "strhpl r",12,VAL2,", [r",11,24,", #-4]!")
|
||||
TEST_RP( "strh r",2, VAL1,", [r",3, 24,"], #48")
|
||||
TEST_RP( "strh r",10,VAL2,", [r",9, 64,"], #-48")
|
||||
TEST_RP( "strh r",3, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
|
||||
|
|
@ -511,9 +511,9 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe0c9f3b0) " @ strh pc, [r9], #48")
|
||||
|
||||
TEST_P( "ldrh r0, [r",0, 24,", #-2]")
|
||||
TEST_P( "ldrvsh r14, [r",13,0, ", #2]")
|
||||
TEST_P( "ldrhvs r14, [r",13,0, ", #2]")
|
||||
TEST_P( "ldrh r1, [r",2, 24,", #4]!")
|
||||
TEST_P( "ldrvch r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrhvc r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrh r2, [r",3, 24,"], #48")
|
||||
TEST_P( "ldrh r10, [r",9, 64,"], #-48")
|
||||
TEST( "ldrh r0, [pc, #0]")
|
||||
|
|
@ -521,18 +521,18 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe0d9f3b0) " @ ldrh pc, [r9], #48")
|
||||
|
||||
TEST_PR( "ldrsb r0, [r",0, 48,", -r",2, 24,"]")
|
||||
TEST_PR( "ldrhisb r14, [r",13,0,", r",12, 48,"]")
|
||||
TEST_PR( "ldrsbhi r14, [r",13,0,", r",12, 48,"]")
|
||||
TEST_PR( "ldrsb r1, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrlssb r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrsbls r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrsb r2, [r",3, 24,"], r",4, 48,"")
|
||||
TEST_PR( "ldrsb r10, [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1bfc0da) " @ ldrsb r12, [pc, r10]!")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe099f0db) " @ ldrsb pc, [r9], r11")
|
||||
|
||||
TEST_P( "ldrsb r0, [r",0, 24,", #-1]")
|
||||
TEST_P( "ldrgesb r14, [r",13,0, ", #1]")
|
||||
TEST_P( "ldrsbge r14, [r",13,0, ", #1]")
|
||||
TEST_P( "ldrsb r1, [r",2, 24,", #4]!")
|
||||
TEST_P( "ldrltsb r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrsblt r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrsb r2, [r",3, 24,"], #48")
|
||||
TEST_P( "ldrsb r10, [r",9, 64,"], #-48")
|
||||
TEST( "ldrsb r0, [pc, #0]")
|
||||
|
|
@ -540,18 +540,18 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe0d9f3d0) " @ ldrsb pc, [r9], #48")
|
||||
|
||||
TEST_PR( "ldrsh r0, [r",0, 48,", -r",2, 24,"]")
|
||||
TEST_PR( "ldrgtsh r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrshgt r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrsh r1, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrlesh r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrshle r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrsh r2, [r",3, 24,"], r",4, 48,"")
|
||||
TEST_PR( "ldrsh r10, [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1bfc0fa) " @ ldrsh r12, [pc, r10]!")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe099f0fb) " @ ldrsh pc, [r9], r11")
|
||||
|
||||
TEST_P( "ldrsh r0, [r",0, 24,", #-1]")
|
||||
TEST_P( "ldreqsh r14, [r",13,0 ,", #1]")
|
||||
TEST_P( "ldrsheq r14, [r",13,0 ,", #1]")
|
||||
TEST_P( "ldrsh r1, [r",2, 24,", #4]!")
|
||||
TEST_P( "ldrnesh r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrshne r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrsh r2, [r",3, 24,"], #48")
|
||||
TEST_P( "ldrsh r10, [r",9, 64,"], #-48")
|
||||
TEST( "ldrsh r0, [pc, #0]")
|
||||
|
|
@ -571,30 +571,30 @@ void kprobe_arm_test_cases(void)
|
|||
|
||||
#if __LINUX_ARM_ARCH__ >= 5
|
||||
TEST_RPR( "strd r",0, VAL1,", [r",1, 48,", -r",2,24,"]")
|
||||
TEST_RPR( "strccd r",8, VAL2,", [r",11,0, ", r",12,48,"]")
|
||||
TEST_UNSUPPORTED( "strccd r8, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "strccd r8, [r12, r13]")
|
||||
TEST_RPR( "strdcc r",8, VAL2,", [r",11,0, ", r",12,48,"]")
|
||||
TEST_UNSUPPORTED( "strdcc r8, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "strdcc r8, [r12, r13]")
|
||||
TEST_RPR( "strd r",4, VAL1,", [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_RPR( "strcsd r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strd r",2, VAL1,", [r",5, 24,"], r",4,48,"")
|
||||
TEST_RPR( "strd r",10,VAL2,", [r",9, 48,"], -r",7,24,"")
|
||||
TEST_RPR( "strdcs r",12,VAL2,", r13, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strd r",2, VAL1,", r3, [r",5, 24,"], r",4,48,"")
|
||||
TEST_RPR( "strd r",10,VAL2,", r11, [r",9, 48,"], -r",7,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1afc0fa) " @ strd r12, [pc, r10]!")
|
||||
|
||||
TEST_PR( "ldrd r0, [r",0, 48,", -r",2,24,"]")
|
||||
TEST_PR( "ldrmid r8, [r",13,0, ", r",12,48,"]")
|
||||
TEST_PR( "ldrdmi r8, [r",13,0, ", r",12,48,"]")
|
||||
TEST_PR( "ldrd r4, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrpld r6, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrd r2, [r",5, 24,"], r",4,48,"")
|
||||
TEST_PR( "ldrd r10, [r",9,48,"], -r",7,24,"")
|
||||
TEST_PR( "ldrdpl r6, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrd r2, r3, [r",5, 24,"], r",4,48,"")
|
||||
TEST_PR( "ldrd r10, r11, [r",9,48,"], -r",7,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1afc0da) " @ ldrd r12, [pc, r10]!")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089f0db) " @ ldrd pc, [r9], r11")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089e0db) " @ ldrd lr, [r9], r11")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089c0df) " @ ldrd r12, [r9], pc")
|
||||
|
||||
TEST_RP( "strd r",0, VAL1,", [r",1, 24,", #-8]")
|
||||
TEST_RP( "strvsd r",8, VAL2,", [r",13,0, ", #8]")
|
||||
TEST_RP( "strdvs r",8, VAL2,", [r",13,0, ", #8]")
|
||||
TEST_RP( "strd r",4, VAL1,", [r",2, 24,", #16]!")
|
||||
TEST_RP( "strvcd r",12,VAL2,", [r",11,24,", #-16]!")
|
||||
TEST_RP( "strdvc r",12,VAL2,", r13, [r",11,24,", #-16]!")
|
||||
TEST_RP( "strd r",2, VAL1,", [r",4, 24,"], #48")
|
||||
TEST_RP( "strd r",10,VAL2,", [r",9, 64,"], #-48")
|
||||
TEST_RP( "strd r",6, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
|
||||
|
|
@ -603,9 +603,9 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_UNSUPPORTED(__inst_arm(0xe1efc3f0) " @ strd r12, [pc, #48]!")
|
||||
|
||||
TEST_P( "ldrd r0, [r",0, 24,", #-8]")
|
||||
TEST_P( "ldrhid r8, [r",13,0, ", #8]")
|
||||
TEST_P( "ldrdhi r8, [r",13,0, ", #8]")
|
||||
TEST_P( "ldrd r4, [r",2, 24,", #16]!")
|
||||
TEST_P( "ldrlsd r6, [r",11,24,", #-16]!")
|
||||
TEST_P( "ldrdls r6, [r",11,24,", #-16]!")
|
||||
TEST_P( "ldrd r2, [r",5, 24,"], #48")
|
||||
TEST_P( "ldrd r10, [r",9,6,"], #-48")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1efc3d0) " @ ldrd r12, [pc, #48]!")
|
||||
|
|
@ -1084,63 +1084,63 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_GROUP("Branch, branch with link, and block data transfer")
|
||||
|
||||
TEST_P( "stmda r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmeqda r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmneda r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmdaeq r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmdane r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmda r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmda r",13,0, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmda r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmcsda r",4, 15*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmccda r",7, 15*4,"!, {r8-r15}")
|
||||
TEST_BF_P("ldmdacs r",4, 15*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmdacc r",7, 15*4,"!, {r8-r15}")
|
||||
TEST_P( "ldmda r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmda r",14,15*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmia r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmmiia r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmplia r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmiami r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmiapl r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmia r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmia r",14,0, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmia r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmvsia r",4, 0, ", {r0-r15}")
|
||||
TEST_BF_P("ldmvcia r",7, 8*4, "!, {r8-r15}")
|
||||
TEST_BF_P("ldmiavs r",4, 0, ", {r0-r15}")
|
||||
TEST_BF_P("ldmiavc r",7, 8*4, "!, {r8-r15}")
|
||||
TEST_P( "ldmia r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmia r",14,15*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmdb r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmhidb r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmlsdb r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmdbhi r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmdbls r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmdb r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmdb r",13,4, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmdb r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmgedb r",4, 16*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmltdb r",7, 16*4,"!, {r8-r15}")
|
||||
TEST_BF_P("ldmdbge r",4, 16*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmdblt r",7, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "ldmdb r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmdb r",14,16*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmib r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmgtib r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmleib r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmibgt r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmible r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmib r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmib r",13,-4, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmib r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmeqib r",4, -4,", {r0-r15}")
|
||||
TEST_BF_P("ldmneib r",7, 7*4,"!, {r8-r15}")
|
||||
TEST_BF_P("ldmibeq r",4, -4,", {r0-r15}")
|
||||
TEST_BF_P("ldmibne r",7, 7*4,"!, {r8-r15}")
|
||||
TEST_P( "ldmib r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmib r",14,14*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmdb r",13,16*4,"!, {r3-r12,lr}")
|
||||
TEST_P( "stmeqdb r",13,16*4,"!, {r3-r12}")
|
||||
TEST_P( "stmnedb r",2, 16*4,", {r3-r12,lr}")
|
||||
TEST_P( "stmdbeq r",13,16*4,"!, {r3-r12}")
|
||||
TEST_P( "stmdbne r",2, 16*4,", {r3-r12,lr}")
|
||||
TEST_P( "stmdb r",13,16*4,"!, {r2-r12,lr}")
|
||||
TEST_P( "stmdb r",0, 16*4,", {r0-r12}")
|
||||
TEST_P( "stmdb r",0, 16*4,", {r0-r12,lr}")
|
||||
|
||||
TEST_BF_P("ldmia r",13,5*4, "!, {r3-r12,pc}")
|
||||
TEST_P( "ldmccia r",13,5*4, "!, {r3-r12}")
|
||||
TEST_BF_P("ldmcsia r",2, 5*4, "!, {r3-r12,pc}")
|
||||
TEST_P( "ldmiacc r",13,5*4, "!, {r3-r12}")
|
||||
TEST_BF_P("ldmiacs r",2, 5*4, "!, {r3-r12,pc}")
|
||||
TEST_BF_P("ldmia r",13,4*4, "!, {r2-r12,pc}")
|
||||
TEST_P( "ldmia r",0, 16*4,", {r0-r12}")
|
||||
TEST_P( "ldmia r",0, 16*4,", {r0-r12,lr}")
|
||||
|
|
@ -1174,80 +1174,80 @@ void kprobe_arm_test_cases(void)
|
|||
#define TEST_COPROCESSOR(code) TEST_UNSUPPORTED(code)
|
||||
|
||||
#define COPROCESSOR_INSTRUCTIONS_ST_LD(two,cc) \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13], {1}") \
|
||||
\
|
||||
TEST_COPROCESSOR( "stc"two" 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two" 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "stc"two" p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two" p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##daf0001) " @ stc"two" 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d2f0001) " @ stc"two" 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##caf0001) " @ stc"two" 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c2f0001) " @ stc"two" 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "stc"two" 0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "stc"two"l 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two"l 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "stc"two" p0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "stc"two"l p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two"l p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##def0001) " @ stc"two"l 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d6f0001) " @ stc"two"l 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##cef0001) " @ stc"two"l 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c6f0001) " @ stc"two"l 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "stc"two"l 0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two" 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two" 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "stc"two"l p0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two" p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two" p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##dbf0001) " @ ldc"two" 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d3f0001) " @ ldc"two" 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##cbf0001) " @ ldc"two" 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c3f0001) " @ ldc"two" 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "ldc"two" 0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two"l 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two"l 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "ldc"two" p0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two"l p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two"l p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##dff0001) " @ ldc"two"l 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d7f0001) " @ ldc"two"l 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##cff0001) " @ ldc"two"l 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c7f0001) " @ ldc"two"l 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "ldc"two"l 0, cr0, [r15], {1}")
|
||||
TEST_COPROCESSOR( "ldc"two"l p0, cr0, [r15], {1}")
|
||||
|
||||
#define COPROCESSOR_INSTRUCTIONS_MC_MR(two,cc) \
|
||||
\
|
||||
TEST_COPROCESSOR( "mcrr"two" 0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mcrr"two" 15, 0, r14, r0, cr15") \
|
||||
TEST_COPROCESSOR( "mcrr"two" p0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mcrr"two" p15, 0, r14, r0, cr15") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c4f00f0) " @ mcrr"two" 0, 15, r0, r15, cr0") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c40ff0f) " @ mcrr"two" 15, 0, r15, r0, cr15") \
|
||||
TEST_COPROCESSOR( "mrrc"two" 0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mrrc"two" 15, 0, r14, r0, cr15") \
|
||||
TEST_COPROCESSOR( "mrrc"two" p0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mrrc"two" p15, 0, r14, r0, cr15") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c5f00f0) " @ mrrc"two" 0, 15, r0, r15, cr0") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c50ff0f) " @ mrrc"two" 15, 0, r15, r0, cr15") \
|
||||
TEST_COPROCESSOR( "cdp"two" 15, 15, cr15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "cdp"two" 0, 0, cr0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mcr"two" 15, 7, r15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mcr"two" 0, 0, r0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mrc"two" 15, 7, r15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mrc"two" 0, 0, r0, cr0, cr0, 0")
|
||||
TEST_COPROCESSOR( "cdp"two" p15, 15, cr15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "cdp"two" p0, 0, cr0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mcr"two" p15, 7, r15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mcr"two" p0, 0, r0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mrc"two" p15, 7, r14, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mrc"two" p0, 0, r0, cr0, cr0, 0")
|
||||
|
||||
COPROCESSOR_INSTRUCTIONS_ST_LD("",e)
|
||||
#if __LINUX_ARM_ARCH__ >= 5
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ struct test_arg_end {
|
|||
|
||||
#define TESTCASE_START(title) \
|
||||
__asm__ __volatile__ ( \
|
||||
".syntax unified \n\t" \
|
||||
"bl __kprobes_test_case_start \n\t" \
|
||||
".pushsection .rodata \n\t" \
|
||||
"10: \n\t" \
|
||||
|
|
|
|||
|
|
@ -93,12 +93,39 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
|
|||
int i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct gnttab_unmap_grant_ref unmap;
|
||||
int rc;
|
||||
|
||||
if (map_ops[i].status)
|
||||
continue;
|
||||
if (unlikely(!set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT,
|
||||
map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT))) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (likely(set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT,
|
||||
map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT)))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Signal an error for this slot. This in turn requires
|
||||
* immediate unmapping.
|
||||
*/
|
||||
map_ops[i].status = GNTST_general_error;
|
||||
unmap.host_addr = map_ops[i].host_addr,
|
||||
unmap.handle = map_ops[i].handle;
|
||||
map_ops[i].handle = ~0;
|
||||
if (map_ops[i].flags & GNTMAP_device_map)
|
||||
unmap.dev_bus_addr = map_ops[i].dev_bus_addr;
|
||||
else
|
||||
unmap.dev_bus_addr = 0;
|
||||
|
||||
/*
|
||||
* Pre-populate the status field, to be recognizable in
|
||||
* the log message below.
|
||||
*/
|
||||
unmap.status = 1;
|
||||
|
||||
rc = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
|
||||
&unmap, 1);
|
||||
if (rc || unmap.status != GNTST_okay)
|
||||
pr_err_once("gnttab unmap failed: rc=%d st=%d\n",
|
||||
rc, unmap.status);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -528,7 +528,7 @@ config ARM64_ERRATUM_1024718
|
|||
help
|
||||
This option adds a workaround for ARM Cortex-A55 Erratum 1024718.
|
||||
|
||||
Affected Cortex-A55 cores (r0p0, r0p1, r1p0) could cause incorrect
|
||||
Affected Cortex-A55 cores (all revisions) could cause incorrect
|
||||
update of the hardware dirty bit when the DBM/AP bits are updated
|
||||
without a break-before-make. The workaround is to disable the usage
|
||||
of hardware DBM locally on the affected cores. CPUs not affected by
|
||||
|
|
@ -958,8 +958,9 @@ choice
|
|||
that is selected here.
|
||||
|
||||
config CPU_BIG_ENDIAN
|
||||
bool "Build big-endian kernel"
|
||||
help
|
||||
bool "Build big-endian kernel"
|
||||
depends on !LD_IS_LLD || LLD_VERSION >= 130000
|
||||
help
|
||||
Say Y if you plan on running a kernel with a big-endian userspace.
|
||||
|
||||
config CPU_LITTLE_ENDIAN
|
||||
|
|
@ -1711,7 +1712,6 @@ endmenu
|
|||
config ARM64_SVE
|
||||
bool "ARM Scalable Vector Extension support"
|
||||
default y
|
||||
depends on !KVM || ARM64_VHE
|
||||
help
|
||||
The Scalable Vector Extension (SVE) is an extension to the AArch64
|
||||
execution state which complements and extends the SIMD functionality
|
||||
|
|
@ -1740,12 +1740,6 @@ config ARM64_SVE
|
|||
booting the kernel. If unsure and you are not observing these
|
||||
symptoms, you should assume that it is safe to say Y.
|
||||
|
||||
CPUs that support SVE are architecturally required to support the
|
||||
Virtualization Host Extensions (VHE), so the kernel makes no
|
||||
provision for supporting SVE alongside KVM without VHE enabled.
|
||||
Thus, you will need to enable CONFIG_ARM64_VHE if you want to support
|
||||
KVM in the same kernel image.
|
||||
|
||||
config ARM64_MODULE_PLTS
|
||||
bool "Use PLTs to allow module memory to spill over into vmalloc area"
|
||||
depends on MODULES
|
||||
|
|
|
|||
|
|
@ -126,8 +126,6 @@ &de {
|
|||
};
|
||||
|
||||
&ehci0 {
|
||||
phys = <&usbphy 0>;
|
||||
phy-names = "usb";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
@ -169,6 +167,7 @@ &mmc2 {
|
|||
pinctrl-0 = <&mmc2_pins>, <&mmc2_ds_pin>;
|
||||
vmmc-supply = <®_dcdc1>;
|
||||
vqmmc-supply = <®_eldo1>;
|
||||
max-frequency = <200000000>;
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
cap-mmc-hw-reset;
|
||||
|
|
@ -177,8 +176,6 @@ &mmc2 {
|
|||
};
|
||||
|
||||
&ohci0 {
|
||||
phys = <&usbphy 0>;
|
||||
phy-names = "usb";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ &mmc0 {
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc0_pins>;
|
||||
vmmc-supply = <®_dcdc1>;
|
||||
non-removable;
|
||||
disable-wp;
|
||||
bus-width = <4>;
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
|
||||
|
|
|
|||
|
|
@ -514,7 +514,7 @@ mmc2: mmc@1c11000 {
|
|||
resets = <&ccu RST_BUS_MMC2>;
|
||||
reset-names = "ahb";
|
||||
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
|
||||
max-frequency = <200000000>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
|
@ -593,6 +593,8 @@ ehci0: usb@1c1a000 {
|
|||
<&ccu CLK_USB_OHCI0>;
|
||||
resets = <&ccu RST_BUS_OHCI0>,
|
||||
<&ccu RST_BUS_EHCI0>;
|
||||
phys = <&usbphy 0>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -603,6 +605,8 @@ ohci0: usb@1c1a400 {
|
|||
clocks = <&ccu CLK_BUS_OHCI0>,
|
||||
<&ccu CLK_USB_OHCI0>;
|
||||
resets = <&ccu RST_BUS_OHCI0>;
|
||||
phys = <&usbphy 0>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -436,6 +436,7 @@ mmc0: mmc@4020000 {
|
|||
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc0_pins>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
|
@ -452,6 +453,7 @@ mmc1: mmc@4021000 {
|
|||
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc1_pins>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
|
@ -468,6 +470,7 @@ mmc2: mmc@4022000 {
|
|||
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc2_pins>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
|
@ -667,6 +670,8 @@ ehci0: usb@5101000 {
|
|||
<&ccu CLK_USB_OHCI0>;
|
||||
resets = <&ccu RST_BUS_OHCI0>,
|
||||
<&ccu RST_BUS_EHCI0>;
|
||||
phys = <&usb2phy 0>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -677,6 +682,8 @@ ohci0: usb@5101400 {
|
|||
clocks = <&ccu CLK_BUS_OHCI0>,
|
||||
<&ccu CLK_USB_OHCI0>;
|
||||
resets = <&ccu RST_BUS_OHCI0>;
|
||||
phys = <&usb2phy 0>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -227,8 +227,6 @@ ethmac: ethernet@ff3f0000 {
|
|||
"timing-adjustment";
|
||||
rx-fifo-depth = <4096>;
|
||||
tx-fifo-depth = <2048>;
|
||||
resets = <&reset RESET_ETHERNET>;
|
||||
reset-names = "stmmaceth";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -224,8 +224,6 @@ ethmac: ethernet@ff3f0000 {
|
|||
"timing-adjustment";
|
||||
rx-fifo-depth = <4096>;
|
||||
tx-fifo-depth = <2048>;
|
||||
resets = <&reset RESET_ETHERNET>;
|
||||
reset-names = "stmmaceth";
|
||||
status = "disabled";
|
||||
|
||||
mdio0: mdio {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/meson-gxbb-power.h>
|
||||
#include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
|
||||
/ {
|
||||
|
|
@ -576,8 +575,6 @@ ethmac: ethernet@c9410000 {
|
|||
interrupt-names = "macirq";
|
||||
rx-fifo-depth = <4096>;
|
||||
tx-fifo-depth = <2048>;
|
||||
resets = <&reset RESET_ETHERNET>;
|
||||
reset-names = "stmmaceth";
|
||||
power-domains = <&pwrc PWRC_GXBB_ETHERNET_MEM_ID>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -89,13 +89,12 @@ &pcie {
|
|||
status = "okay";
|
||||
};
|
||||
|
||||
&sd_emmc_a {
|
||||
sd-uhs-sdr50;
|
||||
};
|
||||
|
||||
&usb {
|
||||
phys = <&usb2_phy0>, <&usb2_phy1>;
|
||||
phy-names = "usb2-phy0", "usb2-phy1";
|
||||
};
|
||||
*/
|
||||
|
||||
&sd_emmc_a {
|
||||
sd-uhs-sdr50;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ &hsi2c_0 {
|
|||
s2mps13-pmic@66 {
|
||||
compatible = "samsung,s2mps13-pmic";
|
||||
interrupt-parent = <&gpa0>;
|
||||
interrupts = <7 IRQ_TYPE_NONE>;
|
||||
interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
|
||||
reg = <0x66>;
|
||||
samsung,s2mps11-wrstbi-ground;
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ &hsi2c_4 {
|
|||
s2mps15_pmic@66 {
|
||||
compatible = "samsung,s2mps15-pmic";
|
||||
reg = <0x66>;
|
||||
interrupts = <2 IRQ_TYPE_NONE>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-parent = <&gpa0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_irq>;
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ gmac1: ethernet@ff802000 {
|
|||
rx-fifo-depth = <16384>;
|
||||
snps,multicast-filter-bins = <256>;
|
||||
iommus = <&smmu 2>;
|
||||
altr,sysmgr-syscon = <&sysmgr 0x48 8>;
|
||||
altr,sysmgr-syscon = <&sysmgr 0x48 0>;
|
||||
clocks = <&clkmgr AGILEX_EMAC1_CLK>, <&clkmgr AGILEX_EMAC_PTP_CLK>;
|
||||
clock-names = "stmmaceth", "ptp_ref";
|
||||
status = "disabled";
|
||||
|
|
@ -184,7 +184,7 @@ gmac2: ethernet@ff804000 {
|
|||
rx-fifo-depth = <16384>;
|
||||
snps,multicast-filter-bins = <256>;
|
||||
iommus = <&smmu 3>;
|
||||
altr,sysmgr-syscon = <&sysmgr 0x4c 16>;
|
||||
altr,sysmgr-syscon = <&sysmgr 0x4c 0>;
|
||||
clocks = <&clkmgr AGILEX_EMAC2_CLK>, <&clkmgr AGILEX_EMAC_PTP_CLK>;
|
||||
clock-names = "stmmaceth", "ptp_ref";
|
||||
status = "disabled";
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ partition@0 {
|
|||
};
|
||||
|
||||
partition@20000 {
|
||||
label = "u-boot";
|
||||
label = "a53-firmware";
|
||||
reg = <0x20000 0x160000>;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -698,6 +698,8 @@ mmc1: mmc@11240000 {
|
|||
clocks = <&pericfg CLK_PERI_MSDC30_1_PD>,
|
||||
<&topckgen CLK_TOP_AXI_SEL>;
|
||||
clock-names = "source", "hclk";
|
||||
resets = <&pericfg MT7622_PERI_MSDC1_SW_RST>;
|
||||
reset-names = "hrst";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -106,6 +106,9 @@ accelerometer: accelerometer@10 {
|
|||
interrupt-parent = <&msmgpio>;
|
||||
interrupts = <115 IRQ_TYPE_EDGE_RISING>;
|
||||
|
||||
vdd-supply = <&pm8916_l17>;
|
||||
vddio-supply = <&pm8916_l5>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&accel_int_default>;
|
||||
};
|
||||
|
|
@ -113,6 +116,9 @@ accelerometer: accelerometer@10 {
|
|||
magnetometer@12 {
|
||||
compatible = "bosch,bmc150_magn";
|
||||
reg = <0x12>;
|
||||
|
||||
vdd-supply = <&pm8916_l17>;
|
||||
vddio-supply = <&pm8916_l5>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ touchscreen@48 {
|
|||
|
||||
&pronto {
|
||||
iris {
|
||||
compatible = "qcom,wcn3680";
|
||||
compatible = "qcom,wcn3660b";
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ tz@86500000 {
|
|||
no-map;
|
||||
};
|
||||
|
||||
reserved@8668000 {
|
||||
reserved@86680000 {
|
||||
reg = <0x0 0x86680000 0x0 0x80000>;
|
||||
no-map;
|
||||
};
|
||||
|
|
@ -68,7 +68,7 @@ rmtfs@86700000 {
|
|||
qcom,client-id = <1>;
|
||||
};
|
||||
|
||||
rfsa@867e00000 {
|
||||
rfsa@867e0000 {
|
||||
reg = <0x0 0x867e0000 0x0 0x20000>;
|
||||
no-map;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ vreg_s4a_1p8: vreg-s4a-1p8 {
|
|||
|
||||
&apps_rsc {
|
||||
pm8009-rpmh-regulators {
|
||||
compatible = "qcom,pm8009-rpmh-regulators";
|
||||
compatible = "qcom,pm8009-1-rpmh-regulators";
|
||||
qcom,pmic-id = "f";
|
||||
|
||||
vdd-s1-supply = <&vph_pwr>;
|
||||
|
|
@ -123,6 +123,13 @@ pm8009-rpmh-regulators {
|
|||
vdd-l5-l6-supply = <&vreg_bob>;
|
||||
vdd-l7-supply = <&vreg_s4a_1p8>;
|
||||
|
||||
vreg_s2f_0p95: smps2 {
|
||||
regulator-name = "vreg_s2f_0p95";
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <952000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_AUTO>;
|
||||
};
|
||||
|
||||
vreg_l1f_1p1: ldo1 {
|
||||
regulator-name = "vreg_l1f_1p1";
|
||||
regulator-min-microvolt = <1104000>;
|
||||
|
|
|
|||
|
|
@ -1114,11 +1114,11 @@ camera@10 {
|
|||
reg = <0x10>;
|
||||
|
||||
// CAM0_RST_N
|
||||
reset-gpios = <&tlmm 9 0>;
|
||||
reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cam0_default>;
|
||||
gpios = <&tlmm 13 0>,
|
||||
<&tlmm 9 0>;
|
||||
<&tlmm 9 GPIO_ACTIVE_LOW>;
|
||||
|
||||
clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
|
||||
clock-names = "xvclk";
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ reg_audio: regulator_audio {
|
|||
regulator-name = "audio-1.8V";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
gpio = <&gpio_exp2 7 GPIO_ACTIVE_HIGH>;
|
||||
gpio = <&gpio_exp4 1 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -88,7 +88,6 @@ &hscif0 {
|
|||
pinctrl-names = "default";
|
||||
uart-has-rtscts;
|
||||
status = "okay";
|
||||
max-speed = <4000000>;
|
||||
|
||||
bluetooth {
|
||||
compatible = "brcm,bcm43438-bt";
|
||||
|
|
@ -97,6 +96,7 @@ bluetooth {
|
|||
device-wakeup-gpios = <&pca9654 5 GPIO_ACTIVE_HIGH>;
|
||||
clocks = <&osc_32k>;
|
||||
clock-names = "extclk";
|
||||
max-speed = <4000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -147,7 +147,7 @@ pca9654_lte: gpio@21 {
|
|||
};
|
||||
|
||||
eeprom@50 {
|
||||
compatible = "microchip,at24c64", "atmel,24c64";
|
||||
compatible = "microchip,24c64", "atmel,24c64";
|
||||
pagesize = <32>;
|
||||
read-only; /* Manufacturing EEPROM programmed at factory */
|
||||
reg = <0x50>;
|
||||
|
|
|
|||
|
|
@ -928,6 +928,7 @@ gmac2phy: ethernet@ff550000 {
|
|||
phy-mode = "rmii";
|
||||
phy-handle = <&phy>;
|
||||
snps,txpbl = <0x4>;
|
||||
clock_in_out = "output";
|
||||
status = "disabled";
|
||||
|
||||
mdio {
|
||||
|
|
|
|||
|
|
@ -86,6 +86,8 @@ CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
|
|||
CONFIG_KPROBES=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_SHADOW_CALL_STACK=y
|
||||
CONFIG_LTO_CLANG_FULL=y
|
||||
CONFIG_CFI_CLANG=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
|
|
@ -104,7 +106,9 @@ CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
|
|||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_DEBUGFS=y
|
||||
CONFIG_CMA_SYSFS=y
|
||||
CONFIG_CMA_AREAS=16
|
||||
CONFIG_READ_ONLY_THP_FOR_FS=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
|
|
@ -219,13 +223,20 @@ CONFIG_MAC802154=y
|
|||
CONFIG_NET_SCHED=y
|
||||
CONFIG_NET_SCH_HTB=y
|
||||
CONFIG_NET_SCH_PRIO=y
|
||||
CONFIG_NET_SCH_TBF=y
|
||||
CONFIG_NET_SCH_INGRESS=y
|
||||
CONFIG_NET_CLS_BASIC=y
|
||||
CONFIG_NET_CLS_TCINDEX=y
|
||||
CONFIG_NET_CLS_FW=y
|
||||
CONFIG_NET_CLS_U32=y
|
||||
CONFIG_NET_CLS_BPF=y
|
||||
CONFIG_NET_CLS_MATCHALL=y
|
||||
CONFIG_NET_EMATCH=y
|
||||
CONFIG_NET_EMATCH_U32=y
|
||||
CONFIG_NET_CLS_ACT=y
|
||||
CONFIG_NET_ACT_POLICE=y
|
||||
CONFIG_NET_ACT_GACT=y
|
||||
CONFIG_NET_ACT_MIRRED=y
|
||||
CONFIG_VSOCKETS=y
|
||||
CONFIG_BPF_JIT=y
|
||||
CONFIG_BT=y
|
||||
|
|
@ -284,6 +295,7 @@ CONFIG_DM_BOW=y
|
|||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
CONFIG_WIREGUARD=y
|
||||
CONFIG_IFB=y
|
||||
CONFIG_TUN=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_PHYLIB=y
|
||||
|
|
@ -297,11 +309,10 @@ CONFIG_USB_RTL8152=y
|
|||
CONFIG_USB_USBNET=y
|
||||
# CONFIG_USB_NET_AX8817X is not set
|
||||
# CONFIG_USB_NET_AX88179_178A is not set
|
||||
# CONFIG_USB_NET_CDCETHER is not set
|
||||
# CONFIG_USB_NET_CDC_NCM is not set
|
||||
# CONFIG_USB_NET_NET1080 is not set
|
||||
# CONFIG_USB_NET_CDC_SUBSET is not set
|
||||
# CONFIG_USB_NET_ZAURUS is not set
|
||||
CONFIG_USB_NET_AQC111=y
|
||||
# CONFIG_WLAN_VENDOR_ADMTEK is not set
|
||||
# CONFIG_WLAN_VENDOR_ATH is not set
|
||||
# CONFIG_WLAN_VENDOR_ATMEL is not set
|
||||
|
|
@ -500,6 +511,8 @@ CONFIG_IIO_BUFFER=y
|
|||
CONFIG_IIO_TRIGGER=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_POWERCAP=y
|
||||
CONFIG_DTPM=y
|
||||
CONFIG_RAS=y
|
||||
CONFIG_ANDROID=y
|
||||
CONFIG_ANDROID_BINDER_IPC=y
|
||||
|
|
@ -606,6 +619,7 @@ CONFIG_CRYPTO_ANSI_CPRNG=y
|
|||
CONFIG_CRC8=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_STACK_HASH_ORDER=12
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PRINTK_CALLER=y
|
||||
CONFIG_DYNAMIC_DEBUG_CORE=y
|
||||
|
|
@ -625,9 +639,10 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
|||
CONFIG_KASAN=y
|
||||
CONFIG_KASAN_HW_TAGS=y
|
||||
CONFIG_KFENCE=y
|
||||
CONFIG_KFENCE_SAMPLE_INTERVAL=0
|
||||
CONFIG_KFENCE_SAMPLE_INTERVAL=500
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_PANIC_TIMEOUT=-1
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_WQ_WATCHDOG=y
|
||||
CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 Crypto Extensions");
|
|||
#define aes_mac_update neon_aes_mac_update
|
||||
MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 NEON");
|
||||
#endif
|
||||
#if defined(USE_V8_CRYPTO_EXTENSIONS) || !defined(CONFIG_CRYPTO_AES_ARM64_BS)
|
||||
#if defined(USE_V8_CRYPTO_EXTENSIONS) || !IS_ENABLED(CONFIG_CRYPTO_AES_ARM64_BS)
|
||||
MODULE_ALIAS_CRYPTO("ecb(aes)");
|
||||
MODULE_ALIAS_CRYPTO("cbc(aes)");
|
||||
MODULE_ALIAS_CRYPTO("ctr(aes)");
|
||||
|
|
@ -650,7 +650,7 @@ static int __maybe_unused xts_decrypt(struct skcipher_request *req)
|
|||
}
|
||||
|
||||
static struct skcipher_alg aes_algs[] = { {
|
||||
#if defined(USE_V8_CRYPTO_EXTENSIONS) || !defined(CONFIG_CRYPTO_AES_ARM64_BS)
|
||||
#if defined(USE_V8_CRYPTO_EXTENSIONS) || !IS_ENABLED(CONFIG_CRYPTO_AES_ARM64_BS)
|
||||
.base = {
|
||||
.cra_name = "__ecb(aes)",
|
||||
.cra_driver_name = "__ecb-aes-" MODE,
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
MODULE_DESCRIPTION("SHA1 secure hash using ARMv8 Crypto Extensions");
|
||||
MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS_CRYPTO("sha1");
|
||||
|
||||
struct sha1_ce_state {
|
||||
struct sha1_state sst;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@
|
|||
MODULE_DESCRIPTION("SHA-224/SHA-256 secure hash using ARMv8 Crypto Extensions");
|
||||
MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS_CRYPTO("sha224");
|
||||
MODULE_ALIAS_CRYPTO("sha256");
|
||||
|
||||
struct sha256_ce_state {
|
||||
struct sha256_state sst;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,10 @@
|
|||
MODULE_DESCRIPTION("SHA3 secure hash using ARMv8 Crypto Extensions");
|
||||
MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS_CRYPTO("sha3-224");
|
||||
MODULE_ALIAS_CRYPTO("sha3-256");
|
||||
MODULE_ALIAS_CRYPTO("sha3-384");
|
||||
MODULE_ALIAS_CRYPTO("sha3-512");
|
||||
|
||||
asmlinkage void sha3_ce_transform(u64 *st, const u8 *data, int blocks,
|
||||
int md_len);
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@
|
|||
MODULE_DESCRIPTION("SHA-384/SHA-512 secure hash using ARMv8 Crypto Extensions");
|
||||
MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS_CRYPTO("sha384");
|
||||
MODULE_ALIAS_CRYPTO("sha512");
|
||||
|
||||
asmlinkage void sha512_ce_transform(struct sha512_state *sst, u8 const *src,
|
||||
int blocks);
|
||||
|
|
|
|||
|
|
@ -676,11 +676,11 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU
|
|||
.endm
|
||||
|
||||
/*
|
||||
* Set SCTLR_EL1 to the passed value, and invalidate the local icache
|
||||
* Set SCTLR_ELx to the @reg value, and invalidate the local icache
|
||||
* in the process. This is called when setting the MMU on.
|
||||
*/
|
||||
.macro set_sctlr_el1, reg
|
||||
msr sctlr_el1, \reg
|
||||
.macro set_sctlr, sreg, reg
|
||||
msr \sreg, \reg
|
||||
isb
|
||||
/*
|
||||
* Invalidate the local I-cache so that any instructions fetched
|
||||
|
|
@ -692,6 +692,14 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU
|
|||
isb
|
||||
.endm
|
||||
|
||||
.macro set_sctlr_el1, reg
|
||||
set_sctlr sctlr_el1, \reg
|
||||
.endm
|
||||
|
||||
.macro set_sctlr_el2, reg
|
||||
set_sctlr sctlr_el2, \reg
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Check whether to yield to another runnable task from kernel mode NEON code
|
||||
* (which runs with preemption disabled).
|
||||
|
|
|
|||
|
|
@ -607,6 +607,7 @@ void check_local_cpu_capabilities(void);
|
|||
|
||||
u64 read_sanitised_ftr_reg(u32 id);
|
||||
u64 __read_sysreg_by_encoding(u32 sys_id);
|
||||
int copy_ftr_reg(u32 id, struct arm64_ftr_reg *dst);
|
||||
|
||||
static inline bool cpu_supports_mixed_endian_el0(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -130,6 +130,15 @@ static inline void sve_user_enable(void)
|
|||
sysreg_clear_set(cpacr_el1, 0, CPACR_EL1_ZEN_EL0EN);
|
||||
}
|
||||
|
||||
#define sve_cond_update_zcr_vq(val, reg) \
|
||||
do { \
|
||||
u64 __zcr = read_sysreg_s((reg)); \
|
||||
u64 __new = __zcr & ~ZCR_ELx_LEN_MASK; \
|
||||
__new |= (val) & ZCR_ELx_LEN_MASK; \
|
||||
if (__zcr != __new) \
|
||||
write_sysreg_s(__new, (reg)); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Probing and setup functions.
|
||||
* Calls to these functions must be serialised with one another.
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
* Author: Catalin Marinas <catalin.marinas@arm.com>
|
||||
*/
|
||||
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.macro fpsimd_save state, tmpnr
|
||||
stp q0, q1, [\state, #16 * 0]
|
||||
stp q2, q3, [\state, #16 * 2]
|
||||
|
|
@ -230,8 +232,7 @@
|
|||
str w\nxtmp, [\xpfpsr, #4]
|
||||
.endm
|
||||
|
||||
.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp, xtmp2
|
||||
sve_load_vq \xvqminus1, x\nxtmp, \xtmp2
|
||||
.macro __sve_load nxbase, xpfpsr, nxtmp
|
||||
_for n, 0, 31, _sve_ldr_v \n, \nxbase, \n - 34
|
||||
_sve_ldr_p 0, \nxbase
|
||||
_sve_wrffr 0
|
||||
|
|
@ -242,3 +243,8 @@
|
|||
ldr w\nxtmp, [\xpfpsr, #4]
|
||||
msr fpcr, x\nxtmp
|
||||
.endm
|
||||
|
||||
.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp, xtmp2
|
||||
sve_load_vq \xvqminus1, x\nxtmp, \xtmp2
|
||||
__sve_load \nxbase, \xpfpsr, \nxtmp
|
||||
.endm
|
||||
|
|
|
|||
|
|
@ -10,11 +10,15 @@
|
|||
#define __HYP_CONCAT(a, b) a ## b
|
||||
#define HYP_CONCAT(a, b) __HYP_CONCAT(a, b)
|
||||
|
||||
#ifndef __KVM_NVHE_HYPERVISOR__
|
||||
/*
|
||||
* KVM nVHE code has its own symbol namespace prefixed with __kvm_nvhe_,
|
||||
* to separate it from the kernel proper.
|
||||
*/
|
||||
#define kvm_nvhe_sym(sym) __kvm_nvhe_##sym
|
||||
#else
|
||||
#define kvm_nvhe_sym(sym) sym
|
||||
#endif
|
||||
|
||||
#ifdef LINKER_SCRIPT
|
||||
|
||||
|
|
@ -56,6 +60,9 @@
|
|||
*/
|
||||
#define KVM_NVHE_ALIAS(sym) kvm_nvhe_sym(sym) = sym;
|
||||
|
||||
/* Defines a linker script alias for KVM nVHE hyp symbols */
|
||||
#define KVM_NVHE_ALIAS_HYP(first, sec) kvm_nvhe_sym(first) = kvm_nvhe_sym(sec);
|
||||
|
||||
#endif /* LINKER_SCRIPT */
|
||||
|
||||
#endif /* __ARM64_HYP_IMAGE_H__ */
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
#define __KVM_HOST_SMCCC_FUNC___kvm_flush_vm_context 2
|
||||
#define __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid_ipa 3
|
||||
#define __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid 4
|
||||
#define __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_local_vmid 5
|
||||
#define __KVM_HOST_SMCCC_FUNC___kvm_flush_cpu_context 5
|
||||
#define __KVM_HOST_SMCCC_FUNC___kvm_timer_set_cntvoff 6
|
||||
#define __KVM_HOST_SMCCC_FUNC___kvm_enable_ssbs 7
|
||||
#define __KVM_HOST_SMCCC_FUNC___vgic_v3_get_gic_config 8
|
||||
|
|
@ -57,6 +57,12 @@
|
|||
#define __KVM_HOST_SMCCC_FUNC___kvm_get_mdcr_el2 12
|
||||
#define __KVM_HOST_SMCCC_FUNC___vgic_v3_save_aprs 13
|
||||
#define __KVM_HOST_SMCCC_FUNC___vgic_v3_restore_aprs 14
|
||||
#define __KVM_HOST_SMCCC_FUNC___pkvm_init 15
|
||||
#define __KVM_HOST_SMCCC_FUNC___pkvm_create_mappings 16
|
||||
#define __KVM_HOST_SMCCC_FUNC___pkvm_create_private_mapping 17
|
||||
#define __KVM_HOST_SMCCC_FUNC___pkvm_cpu_set_vector 18
|
||||
#define __KVM_HOST_SMCCC_FUNC___pkvm_prot_finalize 19
|
||||
#define __KVM_HOST_SMCCC_FUNC___pkvm_mark_hyp 20
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
|
@ -154,6 +160,9 @@ struct kvm_nvhe_init_params {
|
|||
unsigned long tpidr_el2;
|
||||
unsigned long stack_hyp_va;
|
||||
phys_addr_t pgd_pa;
|
||||
unsigned long hcr_el2;
|
||||
unsigned long vttbr;
|
||||
unsigned long vtcr;
|
||||
};
|
||||
|
||||
/* Translate a kernel address @ptr into its equivalent linear mapping */
|
||||
|
|
@ -183,10 +192,10 @@ DECLARE_KVM_HYP_SYM(__bp_harden_hyp_vecs);
|
|||
#define __bp_harden_hyp_vecs CHOOSE_HYP_SYM(__bp_harden_hyp_vecs)
|
||||
|
||||
extern void __kvm_flush_vm_context(void);
|
||||
extern void __kvm_flush_cpu_context(struct kvm_s2_mmu *mmu);
|
||||
extern void __kvm_tlb_flush_vmid_ipa(struct kvm_s2_mmu *mmu, phys_addr_t ipa,
|
||||
int level);
|
||||
extern void __kvm_tlb_flush_vmid(struct kvm_s2_mmu *mmu);
|
||||
extern void __kvm_tlb_flush_local_vmid(struct kvm_s2_mmu *mmu);
|
||||
|
||||
extern void __kvm_timer_set_cntvoff(u64 cntvoff);
|
||||
|
||||
|
|
|
|||
19
arch/arm64/include/asm/kvm_cpufeature.h
Normal file
19
arch/arm64/include/asm/kvm_cpufeature.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2020 - Google LLC
|
||||
* Author: Quentin Perret <qperret@google.com>
|
||||
*/
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
#ifndef KVM_HYP_CPU_FTR_REG
|
||||
#if defined(__KVM_NVHE_HYPERVISOR__)
|
||||
#define KVM_HYP_CPU_FTR_REG(name) extern struct arm64_ftr_reg name
|
||||
#else
|
||||
#define KVM_HYP_CPU_FTR_REG(name) extern struct arm64_ftr_reg kvm_nvhe_sym(name)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_ctrel0);
|
||||
KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_id_aa64mmfr0_el1);
|
||||
KVM_HYP_CPU_FTR_REG(arm64_ftr_reg_id_aa64mmfr1_el1);
|
||||
|
|
@ -95,7 +95,7 @@ struct kvm_s2_mmu {
|
|||
/* The last vcpu id that ran on each physical CPU */
|
||||
int __percpu *last_vcpu_ran;
|
||||
|
||||
struct kvm *kvm;
|
||||
struct kvm_arch *arch;
|
||||
};
|
||||
|
||||
struct kvm_arch_memory_slot {
|
||||
|
|
@ -375,8 +375,10 @@ struct kvm_vcpu_arch {
|
|||
};
|
||||
|
||||
/* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */
|
||||
#define vcpu_sve_pffr(vcpu) ((void *)((char *)((vcpu)->arch.sve_state) + \
|
||||
sve_ffr_offset((vcpu)->arch.sve_max_vl)))
|
||||
#define vcpu_sve_pffr(vcpu) (kern_hyp_va((vcpu)->arch.sve_state) + \
|
||||
sve_ffr_offset((vcpu)->arch.sve_max_vl))
|
||||
|
||||
#define vcpu_sve_max_vq(vcpu) sve_vq_from_vl((vcpu)->arch.sve_max_vl)
|
||||
|
||||
#define vcpu_sve_state_size(vcpu) ({ \
|
||||
size_t __size_ret; \
|
||||
|
|
@ -385,7 +387,7 @@ struct kvm_vcpu_arch {
|
|||
if (WARN_ON(!sve_vl_valid((vcpu)->arch.sve_max_vl))) { \
|
||||
__size_ret = 0; \
|
||||
} else { \
|
||||
__vcpu_vq = sve_vq_from_vl((vcpu)->arch.sve_max_vl); \
|
||||
__vcpu_vq = vcpu_sve_max_vq(vcpu); \
|
||||
__size_ret = SVE_SIG_REGS_SIZE(__vcpu_vq); \
|
||||
} \
|
||||
\
|
||||
|
|
@ -594,6 +596,7 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
|
|||
void kvm_arm_halt_guest(struct kvm *kvm);
|
||||
void kvm_arm_resume_guest(struct kvm *kvm);
|
||||
|
||||
#ifndef __KVM_NVHE_HYPERVISOR__
|
||||
#define kvm_call_hyp_nvhe(f, ...) \
|
||||
({ \
|
||||
struct arm_smccc_res res; \
|
||||
|
|
@ -633,6 +636,11 @@ void kvm_arm_resume_guest(struct kvm *kvm);
|
|||
\
|
||||
ret; \
|
||||
})
|
||||
#else /* __KVM_NVHE_HYPERVISOR__ */
|
||||
#define kvm_call_hyp(f, ...) f(__VA_ARGS__)
|
||||
#define kvm_call_hyp_ret(f, ...) f(__VA_ARGS__)
|
||||
#define kvm_call_hyp_nvhe(f, ...) f(__VA_ARGS__)
|
||||
#endif /* __KVM_NVHE_HYPERVISOR__ */
|
||||
|
||||
void force_vm_exit(const cpumask_t *mask);
|
||||
void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot);
|
||||
|
|
@ -695,19 +703,6 @@ static inline void kvm_init_host_cpu_context(struct kvm_cpu_context *cpu_ctxt)
|
|||
ctxt_sys_reg(cpu_ctxt, MPIDR_EL1) = read_cpuid_mpidr();
|
||||
}
|
||||
|
||||
static inline bool kvm_arch_requires_vhe(void)
|
||||
{
|
||||
/*
|
||||
* The Arm architecture specifies that implementation of SVE
|
||||
* requires VHE also to be implemented. The KVM code for arm64
|
||||
* relies on this when SVE is present:
|
||||
*/
|
||||
if (system_supports_sve())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void kvm_arm_vcpu_ptrauth_trap(struct kvm_vcpu *vcpu);
|
||||
|
||||
static inline void kvm_arch_hardware_unsetup(void) {}
|
||||
|
|
@ -748,9 +743,13 @@ void kvm_clr_pmu_events(u32 clr);
|
|||
|
||||
void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu);
|
||||
void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu);
|
||||
|
||||
void setup_kvm_el2_caps(void);
|
||||
#else
|
||||
static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {}
|
||||
static inline void kvm_clr_pmu_events(u32 clr) {}
|
||||
|
||||
static inline void setup_kvm_el2_caps(void) {}
|
||||
#endif
|
||||
|
||||
void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu);
|
||||
|
|
@ -774,5 +773,12 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu);
|
|||
(test_bit(KVM_ARM_VCPU_PMU_V3, (vcpu)->arch.features))
|
||||
|
||||
int kvm_trng_call(struct kvm_vcpu *vcpu);
|
||||
#ifdef CONFIG_KVM
|
||||
extern phys_addr_t hyp_mem_base;
|
||||
extern phys_addr_t hyp_mem_size;
|
||||
void __init kvm_hyp_reserve(void);
|
||||
#else
|
||||
static inline void kvm_hyp_reserve(void) { }
|
||||
#endif
|
||||
|
||||
#endif /* __ARM64_KVM_HOST_H__ */
|
||||
|
|
|
|||
|
|
@ -90,6 +90,8 @@ void __debug_restore_host_buffers_nvhe(struct kvm_vcpu *vcpu);
|
|||
|
||||
void __fpsimd_save_state(struct user_fpsimd_state *fp_regs);
|
||||
void __fpsimd_restore_state(struct user_fpsimd_state *fp_regs);
|
||||
void __sve_save_state(void *sve_pffr, u32 *fpsr);
|
||||
void __sve_restore_state(void *sve_pffr, u32 *fpsr);
|
||||
|
||||
#ifndef __KVM_NVHE_HYPERVISOR__
|
||||
void activate_traps_vhe_load(struct kvm_vcpu *vcpu);
|
||||
|
|
@ -106,4 +108,12 @@ void __noreturn __hyp_do_panic(struct kvm_cpu_context *host_ctxt, u64 spsr,
|
|||
u64 elr, u64 par);
|
||||
#endif
|
||||
|
||||
#ifdef __KVM_NVHE_HYPERVISOR__
|
||||
void __pkvm_init_switch_pgd(phys_addr_t phys, unsigned long size,
|
||||
phys_addr_t pgd, void *sp, void *cont_fn);
|
||||
int __pkvm_init(phys_addr_t phys, unsigned long size, unsigned long nr_cpus,
|
||||
unsigned long *per_cpu_base, u32 hyp_va_bits);
|
||||
void __noreturn __host_enter(struct kvm_cpu_context *host_ctxt);
|
||||
#endif
|
||||
|
||||
#endif /* __ARM64_KVM_HYP_H__ */
|
||||
|
|
|
|||
|
|
@ -166,7 +166,15 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu);
|
|||
|
||||
phys_addr_t kvm_mmu_get_httbr(void);
|
||||
phys_addr_t kvm_get_idmap_vector(void);
|
||||
int kvm_mmu_init(void);
|
||||
int kvm_mmu_init(u32 *hyp_va_bits);
|
||||
|
||||
static inline void *__kvm_vector_slot2addr(void *base,
|
||||
enum arm64_hyp_spectre_vector slot)
|
||||
{
|
||||
int idx = slot - (slot != HYP_VECTOR_DIRECT);
|
||||
|
||||
return base + (idx * SZ_2K);
|
||||
}
|
||||
|
||||
struct kvm;
|
||||
|
||||
|
|
@ -262,9 +270,9 @@ static __always_inline u64 kvm_get_vttbr(struct kvm_s2_mmu *mmu)
|
|||
* Must be called from hyp code running at EL2 with an updated VTTBR
|
||||
* and interrupts disabled.
|
||||
*/
|
||||
static __always_inline void __load_guest_stage2(struct kvm_s2_mmu *mmu)
|
||||
static __always_inline void __load_stage2(struct kvm_s2_mmu *mmu, unsigned long vtcr)
|
||||
{
|
||||
write_sysreg(kern_hyp_va(mmu->kvm)->arch.vtcr, vtcr_el2);
|
||||
write_sysreg(vtcr, vtcr_el2);
|
||||
write_sysreg(kvm_get_vttbr(mmu), vttbr_el2);
|
||||
|
||||
/*
|
||||
|
|
@ -275,5 +283,14 @@ static __always_inline void __load_guest_stage2(struct kvm_s2_mmu *mmu)
|
|||
asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_SPECULATIVE_AT));
|
||||
}
|
||||
|
||||
static __always_inline void __load_guest_stage2(struct kvm_s2_mmu *mmu)
|
||||
{
|
||||
__load_stage2(mmu, kern_hyp_va(mmu->arch)->vtcr);
|
||||
}
|
||||
|
||||
static inline struct kvm *kvm_s2_mmu_to_kvm(struct kvm_s2_mmu *mmu)
|
||||
{
|
||||
return container_of(mmu->arch, struct kvm, arch);
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ARM64_KVM_MMU_H__ */
|
||||
|
|
|
|||
|
|
@ -11,22 +11,77 @@
|
|||
#include <linux/kvm_host.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define KVM_PGTABLE_MAX_LEVELS 4U
|
||||
|
||||
static inline u64 kvm_get_parange(u64 mmfr0)
|
||||
{
|
||||
u64 parange = cpuid_feature_extract_unsigned_field(mmfr0,
|
||||
ID_AA64MMFR0_PARANGE_SHIFT);
|
||||
if (parange > ID_AA64MMFR0_PARANGE_MAX)
|
||||
parange = ID_AA64MMFR0_PARANGE_MAX;
|
||||
|
||||
return parange;
|
||||
}
|
||||
|
||||
typedef u64 kvm_pte_t;
|
||||
|
||||
/**
|
||||
* struct kvm_pgtable_mm_ops - Memory management callbacks.
|
||||
* @zalloc_page: Allocate a single zeroed memory page. The @arg parameter
|
||||
* can be used by the walker to pass a memcache. The
|
||||
* initial refcount of the page is 1.
|
||||
* @zalloc_pages_exact: Allocate an exact number of zeroed memory pages. The
|
||||
* @size parameter is in bytes, and is rounded-up to the
|
||||
* next page boundary. The resulting allocation is
|
||||
* physically contiguous.
|
||||
* @free_pages_exact: Free an exact number of memory pages previously
|
||||
* allocated by zalloc_pages_exact.
|
||||
* @get_page: Increment the refcount on a page.
|
||||
* @put_page: Decrement the refcount on a page. When the refcount
|
||||
* reaches 0 the page is automatically freed.
|
||||
* @page_count: Return the refcount of a page.
|
||||
* @phys_to_virt: Convert a physical address into a virtual address mapped
|
||||
* in the current context.
|
||||
* @virt_to_phys: Convert a virtual address mapped in the current context
|
||||
* into a physical address.
|
||||
*/
|
||||
struct kvm_pgtable_mm_ops {
|
||||
void* (*zalloc_page)(void *arg);
|
||||
void* (*zalloc_pages_exact)(size_t size);
|
||||
void (*free_pages_exact)(void *addr, size_t size);
|
||||
void (*get_page)(void *addr);
|
||||
void (*put_page)(void *addr);
|
||||
int (*page_count)(void *addr);
|
||||
void* (*phys_to_virt)(phys_addr_t phys);
|
||||
phys_addr_t (*virt_to_phys)(void *addr);
|
||||
};
|
||||
|
||||
/**
|
||||
* enum kvm_pgtable_stage2_flags - Stage-2 page-table flags.
|
||||
* @KVM_PGTABLE_S2_NOFWB: Don't enforce Normal-WB even if the CPUs have
|
||||
* ARM64_HAS_STAGE2_FWB.
|
||||
*/
|
||||
enum kvm_pgtable_stage2_flags {
|
||||
KVM_PGTABLE_S2_NOFWB = BIT(0),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct kvm_pgtable - KVM page-table.
|
||||
* @ia_bits: Maximum input address size, in bits.
|
||||
* @start_level: Level at which the page-table walk starts.
|
||||
* @pgd: Pointer to the first top-level entry of the page-table.
|
||||
* @mm_ops: Memory management callbacks.
|
||||
* @mmu: Stage-2 KVM MMU struct. Unused for stage-1 page-tables.
|
||||
*/
|
||||
struct kvm_pgtable {
|
||||
u32 ia_bits;
|
||||
u32 start_level;
|
||||
kvm_pte_t *pgd;
|
||||
struct kvm_pgtable_mm_ops *mm_ops;
|
||||
|
||||
/* Stage-2 only */
|
||||
struct kvm_s2_mmu *mmu;
|
||||
enum kvm_pgtable_stage2_flags flags;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -49,6 +104,16 @@ enum kvm_pgtable_prot {
|
|||
#define PAGE_HYP_RO (KVM_PGTABLE_PROT_R)
|
||||
#define PAGE_HYP_DEVICE (PAGE_HYP | KVM_PGTABLE_PROT_DEVICE)
|
||||
|
||||
/**
|
||||
* struct kvm_mem_range - Range of Intermediate Physical Addresses
|
||||
* @start: Start of the range.
|
||||
* @end: End of the range.
|
||||
*/
|
||||
struct kvm_mem_range {
|
||||
u64 start;
|
||||
u64 end;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum kvm_pgtable_walk_flags - Flags to control a depth-first page-table walk.
|
||||
* @KVM_PGTABLE_WALK_LEAF: Visit leaf entries, including invalid
|
||||
|
|
@ -86,10 +151,12 @@ struct kvm_pgtable_walker {
|
|||
* kvm_pgtable_hyp_init() - Initialise a hypervisor stage-1 page-table.
|
||||
* @pgt: Uninitialised page-table structure to initialise.
|
||||
* @va_bits: Maximum virtual address bits.
|
||||
* @mm_ops: Memory management callbacks.
|
||||
*
|
||||
* Return: 0 on success, negative error code on failure.
|
||||
*/
|
||||
int kvm_pgtable_hyp_init(struct kvm_pgtable *pgt, u32 va_bits);
|
||||
int kvm_pgtable_hyp_init(struct kvm_pgtable *pgt, u32 va_bits,
|
||||
struct kvm_pgtable_mm_ops *mm_ops);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_hyp_destroy() - Destroy an unused hypervisor stage-1 page-table.
|
||||
|
|
@ -122,14 +189,38 @@ void kvm_pgtable_hyp_destroy(struct kvm_pgtable *pgt);
|
|||
int kvm_pgtable_hyp_map(struct kvm_pgtable *pgt, u64 addr, u64 size, u64 phys,
|
||||
enum kvm_pgtable_prot prot);
|
||||
|
||||
/**
|
||||
* kvm_get_vtcr() - Helper to construct VTCR_EL2
|
||||
* @mmfr0: Sanitized value of SYS_ID_AA64MMFR0_EL1 register.
|
||||
* @mmfr1: Sanitized value of SYS_ID_AA64MMFR1_EL1 register.
|
||||
* @phys_shfit: Value to set in VTCR_EL2.T0SZ.
|
||||
*
|
||||
* The VTCR value is common across all the physical CPUs on the system.
|
||||
* We use system wide sanitised values to fill in different fields,
|
||||
* except for Hardware Management of Access Flags. HA Flag is set
|
||||
* unconditionally on all CPUs, as it is safe to run with or without
|
||||
* the feature and the bit is RES0 on CPUs that don't support it.
|
||||
*
|
||||
* Return: VTCR_EL2 value
|
||||
*/
|
||||
u64 kvm_get_vtcr(u64 mmfr0, u64 mmfr1, u32 phys_shift);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_init() - Initialise a guest stage-2 page-table.
|
||||
* @pgt: Uninitialised page-table structure to initialise.
|
||||
* @kvm: KVM structure representing the guest virtual machine.
|
||||
* @arch: Arch-specific KVM structure representing the guest virtual
|
||||
* machine.
|
||||
* @mm_ops: Memory management callbacks.
|
||||
* @flags: Stage-2 configuration flags.
|
||||
*
|
||||
* Return: 0 on success, negative error code on failure.
|
||||
*/
|
||||
int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm *kvm);
|
||||
int kvm_pgtable_stage2_init_flags(struct kvm_pgtable *pgt, struct kvm_arch *arch,
|
||||
struct kvm_pgtable_mm_ops *mm_ops,
|
||||
enum kvm_pgtable_stage2_flags flags);
|
||||
|
||||
#define kvm_pgtable_stage2_init(pgt, arch, mm_ops) \
|
||||
kvm_pgtable_stage2_init_flags(pgt, arch, mm_ops, 0)
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_destroy() - Destroy an unused guest stage-2 page-table.
|
||||
|
|
@ -147,8 +238,8 @@ void kvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt);
|
|||
* @size: Size of the mapping.
|
||||
* @phys: Physical address of the memory to map.
|
||||
* @prot: Permissions and attributes for the mapping.
|
||||
* @mc: Cache of pre-allocated GFP_PGTABLE_USER memory from which to
|
||||
* allocate page-table pages.
|
||||
* @mc: Cache of pre-allocated and zeroed memory from which to allocate
|
||||
* page-table pages.
|
||||
*
|
||||
* The offset of @addr within a page is ignored, @size is rounded-up to
|
||||
* the next page boundary and @phys is rounded-down to the previous page
|
||||
|
|
@ -170,7 +261,28 @@ void kvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt);
|
|||
*/
|
||||
int kvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
u64 phys, enum kvm_pgtable_prot prot,
|
||||
struct kvm_mmu_memory_cache *mc);
|
||||
void *mc);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_set_owner() - Annotate invalid mappings with metadata
|
||||
* encoding the ownership of a page in the
|
||||
* IPA space.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @addr: Base intermediate physical address to annotate.
|
||||
* @size: Size of the annotated range.
|
||||
* @mc: Cache of pre-allocated and zeroed memory from which to allocate
|
||||
* page-table pages.
|
||||
* @owner_id: Unique identifier for the owner of the page.
|
||||
*
|
||||
* By default, all page-tables are owned by identifier 0. This function can be
|
||||
* used to mark portions of the IPA space as owned by other entities. When a
|
||||
* stage 2 is used with identity-mappings, these annotations allow to use the
|
||||
* page-table data structure as a simple rmap.
|
||||
*
|
||||
* Return: 0 on success, negative error code on failure.
|
||||
*/
|
||||
int kvm_pgtable_stage2_set_owner(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
void *mc, u8 owner_id);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_unmap() - Remove a mapping from a guest stage-2 page-table.
|
||||
|
|
@ -311,4 +423,23 @@ int kvm_pgtable_stage2_flush(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
|||
int kvm_pgtable_walk(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
||||
struct kvm_pgtable_walker *walker);
|
||||
|
||||
/**
|
||||
* kvm_pgtable_stage2_find_range() - Find a range of Intermediate Physical
|
||||
* Addresses with compatible permission
|
||||
* attributes.
|
||||
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init().
|
||||
* @addr: Address that must be covered by the range.
|
||||
* @prot: Protection attributes that the range must be compatible with.
|
||||
* @range: Range structure used to limit the search space at call time and
|
||||
* that will hold the result.
|
||||
*
|
||||
* The offset of @addr within a page is ignored. An IPA is compatible with @prot
|
||||
* iff its corresponding stage-2 page-table entry has default ownership and, if
|
||||
* valid, is mapped with protection attributes identical to @prot.
|
||||
*
|
||||
* Return: 0 on success, negative error code on failure.
|
||||
*/
|
||||
int kvm_pgtable_stage2_find_range(struct kvm_pgtable *pgt, u64 addr,
|
||||
enum kvm_pgtable_prot prot,
|
||||
struct kvm_mem_range *range);
|
||||
#endif /* __ARM64_KVM_PGTABLE_H__ */
|
||||
|
|
|
|||
|
|
@ -237,8 +237,8 @@ static inline const void *__tag_set(const void *addr, u8 tag)
|
|||
#define arch_init_tags(max_tag) mte_init_tags(max_tag)
|
||||
#define arch_get_random_tag() mte_get_random_tag()
|
||||
#define arch_get_mem_tag(addr) mte_get_mem_tag(addr)
|
||||
#define arch_set_mem_tag_range(addr, size, tag) \
|
||||
mte_set_mem_tag_range((addr), (size), (tag))
|
||||
#define arch_set_mem_tag_range(addr, size, tag, init) \
|
||||
mte_set_mem_tag_range((addr), (size), (tag), (init))
|
||||
#endif /* CONFIG_KASAN_HW_TAGS */
|
||||
|
||||
/*
|
||||
|
|
@ -335,6 +335,11 @@ static inline void *phys_to_virt(phys_addr_t x)
|
|||
#define ARCH_PFN_OFFSET ((unsigned long)PHYS_PFN_OFFSET)
|
||||
|
||||
#if !defined(CONFIG_SPARSEMEM_VMEMMAP) || defined(CONFIG_DEBUG_VIRTUAL)
|
||||
#define page_to_virt(x) ({ \
|
||||
__typeof__(x) __page = x; \
|
||||
void *__addr = __va(page_to_phys(__page)); \
|
||||
(void *)__tag_set((const void *)__addr, page_kasan_tag(__page));\
|
||||
})
|
||||
#define virt_to_page(x) pfn_to_page(virt_to_pfn(x))
|
||||
#else
|
||||
#define page_to_virt(x) ({ \
|
||||
|
|
|
|||
|
|
@ -65,10 +65,7 @@ extern u64 idmap_ptrs_per_pgd;
|
|||
|
||||
static inline bool __cpu_uses_extended_idmap(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_ARM64_VA_BITS_52))
|
||||
return false;
|
||||
|
||||
return unlikely(idmap_t0sz != TCR_T0SZ(VA_BITS));
|
||||
return unlikely(idmap_t0sz != TCR_T0SZ(vabits_actual));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||
SECTIONS {
|
||||
.plt (NOLOAD) : { BYTE(0) }
|
||||
.init.plt (NOLOAD) : { BYTE(0) }
|
||||
.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
|
||||
.plt 0 (NOLOAD) : { BYTE(0) }
|
||||
.init.plt 0 (NOLOAD) : { BYTE(0) }
|
||||
.text.ftrace_trampoline 0 (NOLOAD) : { BYTE(0) }
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ static inline u8 mte_get_random_tag(void)
|
|||
* Note: The address must be non-NULL and MTE_GRANULE_SIZE aligned and
|
||||
* size must be non-zero and MTE_GRANULE_SIZE aligned.
|
||||
*/
|
||||
static inline void mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
||||
static inline void mte_set_mem_tag_range(void *addr, size_t size,
|
||||
u8 tag, bool init)
|
||||
{
|
||||
u64 curr, end;
|
||||
|
||||
|
|
@ -63,18 +64,27 @@ static inline void mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
|||
curr = (u64)__tag_set(addr, tag);
|
||||
end = curr + size;
|
||||
|
||||
do {
|
||||
/*
|
||||
* 'asm volatile' is required to prevent the compiler to move
|
||||
* the statement outside of the loop.
|
||||
*/
|
||||
asm volatile(__MTE_PREAMBLE "stg %0, [%0]"
|
||||
:
|
||||
: "r" (curr)
|
||||
: "memory");
|
||||
|
||||
curr += MTE_GRANULE_SIZE;
|
||||
} while (curr != end);
|
||||
/*
|
||||
* 'asm volatile' is required to prevent the compiler to move
|
||||
* the statement outside of the loop.
|
||||
*/
|
||||
if (init) {
|
||||
do {
|
||||
asm volatile(__MTE_PREAMBLE "stzg %0, [%0]"
|
||||
:
|
||||
: "r" (curr)
|
||||
: "memory");
|
||||
curr += MTE_GRANULE_SIZE;
|
||||
} while (curr != end);
|
||||
} else {
|
||||
do {
|
||||
asm volatile(__MTE_PREAMBLE "stg %0, [%0]"
|
||||
:
|
||||
: "r" (curr)
|
||||
: "memory");
|
||||
curr += MTE_GRANULE_SIZE;
|
||||
} while (curr != end);
|
||||
}
|
||||
}
|
||||
|
||||
void mte_enable_kernel(void);
|
||||
|
|
@ -100,7 +110,8 @@ static inline u8 mte_get_random_tag(void)
|
|||
return 0xFF;
|
||||
}
|
||||
|
||||
static inline void mte_set_mem_tag_range(void *addr, size_t size, u8 tag)
|
||||
static inline void mte_set_mem_tag_range(void *addr, size_t size,
|
||||
u8 tag, bool init)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -66,16 +66,15 @@ extern bool arm64_use_ng_mappings;
|
|||
#define _PAGE_DEFAULT (_PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL))
|
||||
|
||||
#define PAGE_KERNEL __pgprot(PROT_NORMAL)
|
||||
#define PAGE_KERNEL_TAGGED __pgprot(PROT_NORMAL_TAGGED)
|
||||
#define PAGE_KERNEL_RO __pgprot((PROT_NORMAL & ~PTE_WRITE) | PTE_RDONLY)
|
||||
#define PAGE_KERNEL_ROX __pgprot((PROT_NORMAL & ~(PTE_WRITE | PTE_PXN)) | PTE_RDONLY)
|
||||
#define PAGE_KERNEL_EXEC __pgprot(PROT_NORMAL & ~PTE_PXN)
|
||||
#define PAGE_KERNEL_EXEC_CONT __pgprot((PROT_NORMAL & ~PTE_PXN) | PTE_CONT)
|
||||
|
||||
#define PAGE_S2_MEMATTR(attr) \
|
||||
#define PAGE_S2_MEMATTR(attr, has_fwb) \
|
||||
({ \
|
||||
u64 __val; \
|
||||
if (cpus_have_const_cap(ARM64_HAS_STAGE2_FWB)) \
|
||||
if (has_fwb) \
|
||||
__val = PTE_S2_MEMATTR(MT_S2_FWB_ ## attr); \
|
||||
else \
|
||||
__val = PTE_S2_MEMATTR(MT_S2_ ## attr); \
|
||||
|
|
|
|||
|
|
@ -485,6 +485,9 @@ static inline pmd_t pmd_mkdevmap(pmd_t pmd)
|
|||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
|
||||
#define pgprot_device(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_PXN | PTE_UXN)
|
||||
#define pgprot_tagged(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_TAGGED))
|
||||
#define pgprot_mhp pgprot_tagged
|
||||
/*
|
||||
* DMA allocations for non-coherent devices use what the Arm architecture calls
|
||||
* "Normal non-cacheable" memory, which permits speculation, unaligned accesses
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ extern char __hyp_idmap_text_start[], __hyp_idmap_text_end[];
|
|||
extern char __hyp_text_start[], __hyp_text_end[];
|
||||
extern char __hyp_rodata_start[], __hyp_rodata_end[];
|
||||
extern char __hyp_reloc_begin[], __hyp_reloc_end[];
|
||||
extern char __hyp_bss_start[], __hyp_bss_end[];
|
||||
extern char __idmap_text_start[], __idmap_text_end[];
|
||||
extern char __initdata_begin[], __initdata_end[];
|
||||
extern char __inittext_begin[], __inittext_end[];
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user