Merge 5.7-rc3 into android-mainline
Linux 5.7-rc3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I7ac2896e866a898b1f42fc8fd6d60b40a75ae1f0
This commit is contained in:
@@ -142,10 +142,13 @@ ForEachMacros:
|
|||||||
- 'for_each_card_auxs'
|
- 'for_each_card_auxs'
|
||||||
- 'for_each_card_auxs_safe'
|
- 'for_each_card_auxs_safe'
|
||||||
- 'for_each_card_components'
|
- 'for_each_card_components'
|
||||||
|
- 'for_each_card_dapms'
|
||||||
- 'for_each_card_pre_auxs'
|
- 'for_each_card_pre_auxs'
|
||||||
- 'for_each_card_prelinks'
|
- 'for_each_card_prelinks'
|
||||||
- 'for_each_card_rtds'
|
- 'for_each_card_rtds'
|
||||||
- 'for_each_card_rtds_safe'
|
- 'for_each_card_rtds_safe'
|
||||||
|
- 'for_each_card_widgets'
|
||||||
|
- 'for_each_card_widgets_safe'
|
||||||
- 'for_each_cgroup_storage_type'
|
- 'for_each_cgroup_storage_type'
|
||||||
- 'for_each_child_of_node'
|
- 'for_each_child_of_node'
|
||||||
- 'for_each_clear_bit'
|
- 'for_each_clear_bit'
|
||||||
@@ -160,6 +163,7 @@ ForEachMacros:
|
|||||||
- 'for_each_cpu_and'
|
- 'for_each_cpu_and'
|
||||||
- 'for_each_cpu_not'
|
- 'for_each_cpu_not'
|
||||||
- 'for_each_cpu_wrap'
|
- 'for_each_cpu_wrap'
|
||||||
|
- 'for_each_dapm_widgets'
|
||||||
- 'for_each_dev_addr'
|
- 'for_each_dev_addr'
|
||||||
- 'for_each_dev_scope'
|
- 'for_each_dev_scope'
|
||||||
- 'for_each_displayid_db'
|
- 'for_each_displayid_db'
|
||||||
@@ -170,7 +174,6 @@ ForEachMacros:
|
|||||||
- 'for_each_dpcm_fe'
|
- 'for_each_dpcm_fe'
|
||||||
- 'for_each_drhd_unit'
|
- 'for_each_drhd_unit'
|
||||||
- 'for_each_dss_dev'
|
- 'for_each_dss_dev'
|
||||||
- 'for_each_efi_handle'
|
|
||||||
- 'for_each_efi_memory_desc'
|
- 'for_each_efi_memory_desc'
|
||||||
- 'for_each_efi_memory_desc_in_map'
|
- 'for_each_efi_memory_desc_in_map'
|
||||||
- 'for_each_element'
|
- 'for_each_element'
|
||||||
@@ -191,6 +194,7 @@ ForEachMacros:
|
|||||||
- 'for_each_ip_tunnel_rcu'
|
- 'for_each_ip_tunnel_rcu'
|
||||||
- 'for_each_irq_nr'
|
- 'for_each_irq_nr'
|
||||||
- 'for_each_link_codecs'
|
- 'for_each_link_codecs'
|
||||||
|
- 'for_each_link_cpus'
|
||||||
- 'for_each_link_platforms'
|
- 'for_each_link_platforms'
|
||||||
- 'for_each_lru'
|
- 'for_each_lru'
|
||||||
- 'for_each_matching_node'
|
- 'for_each_matching_node'
|
||||||
@@ -250,6 +254,7 @@ ForEachMacros:
|
|||||||
- 'for_each_pci_bridge'
|
- 'for_each_pci_bridge'
|
||||||
- 'for_each_pci_dev'
|
- 'for_each_pci_dev'
|
||||||
- 'for_each_pci_msi_entry'
|
- 'for_each_pci_msi_entry'
|
||||||
|
- 'for_each_pcm_streams'
|
||||||
- 'for_each_populated_zone'
|
- 'for_each_populated_zone'
|
||||||
- 'for_each_possible_cpu'
|
- 'for_each_possible_cpu'
|
||||||
- 'for_each_present_cpu'
|
- 'for_each_present_cpu'
|
||||||
@@ -260,9 +265,12 @@ ForEachMacros:
|
|||||||
- 'for_each_property_of_node'
|
- 'for_each_property_of_node'
|
||||||
- 'for_each_registered_fb'
|
- 'for_each_registered_fb'
|
||||||
- 'for_each_reserved_mem_region'
|
- 'for_each_reserved_mem_region'
|
||||||
- 'for_each_rtd_codec_dai'
|
- 'for_each_rtd_codec_dais'
|
||||||
- 'for_each_rtd_codec_dai_rollback'
|
- 'for_each_rtd_codec_dais_rollback'
|
||||||
- 'for_each_rtd_components'
|
- 'for_each_rtd_components'
|
||||||
|
- 'for_each_rtd_cpu_dais'
|
||||||
|
- 'for_each_rtd_cpu_dais_rollback'
|
||||||
|
- 'for_each_rtd_dais'
|
||||||
- 'for_each_set_bit'
|
- 'for_each_set_bit'
|
||||||
- 'for_each_set_bit_from'
|
- 'for_each_set_bit_from'
|
||||||
- 'for_each_set_clump8'
|
- 'for_each_set_clump8'
|
||||||
@@ -334,6 +342,7 @@ ForEachMacros:
|
|||||||
- 'klp_for_each_object'
|
- 'klp_for_each_object'
|
||||||
- 'klp_for_each_object_safe'
|
- 'klp_for_each_object_safe'
|
||||||
- 'klp_for_each_object_static'
|
- 'klp_for_each_object_static'
|
||||||
|
- 'kunit_suite_for_each_test_case'
|
||||||
- 'kvm_for_each_memslot'
|
- 'kvm_for_each_memslot'
|
||||||
- 'kvm_for_each_vcpu'
|
- 'kvm_for_each_vcpu'
|
||||||
- 'list_for_each'
|
- 'list_for_each'
|
||||||
@@ -387,6 +396,7 @@ ForEachMacros:
|
|||||||
- 'of_property_for_each_string'
|
- 'of_property_for_each_string'
|
||||||
- 'of_property_for_each_u32'
|
- 'of_property_for_each_u32'
|
||||||
- 'pci_bus_for_each_resource'
|
- 'pci_bus_for_each_resource'
|
||||||
|
- 'pcm_for_each_format'
|
||||||
- 'ping_portaddr_for_each_entry'
|
- 'ping_portaddr_for_each_entry'
|
||||||
- 'plist_for_each'
|
- 'plist_for_each'
|
||||||
- 'plist_for_each_continue'
|
- 'plist_for_each_continue'
|
||||||
@@ -482,7 +492,7 @@ KeepEmptyLinesAtTheStartOfBlocks: false
|
|||||||
MacroBlockBegin: ''
|
MacroBlockBegin: ''
|
||||||
MacroBlockEnd: ''
|
MacroBlockEnd: ''
|
||||||
MaxEmptyLinesToKeep: 1
|
MaxEmptyLinesToKeep: 1
|
||||||
NamespaceIndentation: Inner
|
NamespaceIndentation: None
|
||||||
#ObjCBinPackProtocolList: Auto # Unknown to clang-format-5.0
|
#ObjCBinPackProtocolList: Auto # Unknown to clang-format-5.0
|
||||||
ObjCBlockIndentWidth: 8
|
ObjCBlockIndentWidth: 8
|
||||||
ObjCSpaceAfterProperty: true
|
ObjCSpaceAfterProperty: true
|
||||||
|
@@ -5187,8 +5187,7 @@
|
|||||||
|
|
||||||
usbcore.old_scheme_first=
|
usbcore.old_scheme_first=
|
||||||
[USB] Start with the old device initialization
|
[USB] Start with the old device initialization
|
||||||
scheme, applies only to low and full-speed devices
|
scheme (default 0 = off).
|
||||||
(default 0 = off).
|
|
||||||
|
|
||||||
usbcore.usbfs_memory_mb=
|
usbcore.usbfs_memory_mb=
|
||||||
[USB] Memory limit (in MB) for buffers allocated by
|
[USB] Memory limit (in MB) for buffers allocated by
|
||||||
|
@@ -23,13 +23,14 @@ optional external memory-mapped interface.
|
|||||||
|
|
||||||
Version 1 of the Activity Monitors architecture implements a counter group
|
Version 1 of the Activity Monitors architecture implements a counter group
|
||||||
of four fixed and architecturally defined 64-bit event counters.
|
of four fixed and architecturally defined 64-bit event counters.
|
||||||
- CPU cycle counter: increments at the frequency of the CPU.
|
|
||||||
- Constant counter: increments at the fixed frequency of the system
|
- CPU cycle counter: increments at the frequency of the CPU.
|
||||||
clock.
|
- Constant counter: increments at the fixed frequency of the system
|
||||||
- Instructions retired: increments with every architecturally executed
|
clock.
|
||||||
instruction.
|
- Instructions retired: increments with every architecturally executed
|
||||||
- Memory stall cycles: counts instruction dispatch stall cycles caused by
|
instruction.
|
||||||
misses in the last level cache within the clock domain.
|
- Memory stall cycles: counts instruction dispatch stall cycles caused by
|
||||||
|
misses in the last level cache within the clock domain.
|
||||||
|
|
||||||
When in WFI or WFE these counters do not increment.
|
When in WFI or WFE these counters do not increment.
|
||||||
|
|
||||||
@@ -57,11 +58,12 @@ counters, only the presence of the extension.
|
|||||||
|
|
||||||
Firmware (code running at higher exception levels, e.g. arm-tf) support is
|
Firmware (code running at higher exception levels, e.g. arm-tf) support is
|
||||||
needed to:
|
needed to:
|
||||||
- Enable access for lower exception levels (EL2 and EL1) to the AMU
|
|
||||||
registers.
|
- Enable access for lower exception levels (EL2 and EL1) to the AMU
|
||||||
- Enable the counters. If not enabled these will read as 0.
|
registers.
|
||||||
- Save/restore the counters before/after the CPU is being put/brought up
|
- Enable the counters. If not enabled these will read as 0.
|
||||||
from the 'off' power state.
|
- Save/restore the counters before/after the CPU is being put/brought up
|
||||||
|
from the 'off' power state.
|
||||||
|
|
||||||
When using kernels that have this feature enabled but boot with broken
|
When using kernels that have this feature enabled but boot with broken
|
||||||
firmware the user may experience panics or lockups when accessing the
|
firmware the user may experience panics or lockups when accessing the
|
||||||
@@ -78,10 +80,11 @@ are not trapped in EL2/EL3.
|
|||||||
|
|
||||||
The fixed counters of AMUv1 are accessible though the following system
|
The fixed counters of AMUv1 are accessible though the following system
|
||||||
register definitions:
|
register definitions:
|
||||||
- SYS_AMEVCNTR0_CORE_EL0
|
|
||||||
- SYS_AMEVCNTR0_CONST_EL0
|
- SYS_AMEVCNTR0_CORE_EL0
|
||||||
- SYS_AMEVCNTR0_INST_RET_EL0
|
- SYS_AMEVCNTR0_CONST_EL0
|
||||||
- SYS_AMEVCNTR0_MEM_STALL_EL0
|
- SYS_AMEVCNTR0_INST_RET_EL0
|
||||||
|
- SYS_AMEVCNTR0_MEM_STALL_EL0
|
||||||
|
|
||||||
Auxiliary platform specific counters can be accessed using
|
Auxiliary platform specific counters can be accessed using
|
||||||
SYS_AMEVCNTR1_EL0(n), where n is a value between 0 and 15.
|
SYS_AMEVCNTR1_EL0(n), where n is a value between 0 and 15.
|
||||||
@@ -93,9 +96,10 @@ Userspace access
|
|||||||
----------------
|
----------------
|
||||||
|
|
||||||
Currently, access from userspace to the AMU registers is disabled due to:
|
Currently, access from userspace to the AMU registers is disabled due to:
|
||||||
- Security reasons: they might expose information about code executed in
|
|
||||||
secure mode.
|
- Security reasons: they might expose information about code executed in
|
||||||
- Purpose: AMU counters are intended for system management use.
|
secure mode.
|
||||||
|
- Purpose: AMU counters are intended for system management use.
|
||||||
|
|
||||||
Also, the presence of the feature is not visible to userspace.
|
Also, the presence of the feature is not visible to userspace.
|
||||||
|
|
||||||
@@ -105,8 +109,9 @@ Virtualization
|
|||||||
|
|
||||||
Currently, access from userspace (EL0) and kernelspace (EL1) on the KVM
|
Currently, access from userspace (EL0) and kernelspace (EL1) on the KVM
|
||||||
guest side is disabled due to:
|
guest side is disabled due to:
|
||||||
- Security reasons: they might expose information about code executed
|
|
||||||
by other guests or the host.
|
- Security reasons: they might expose information about code executed
|
||||||
|
by other guests or the host.
|
||||||
|
|
||||||
Any attempt to access the AMU registers will result in an UNDEFINED
|
Any attempt to access the AMU registers will result in an UNDEFINED
|
||||||
exception being injected into the guest.
|
exception being injected into the guest.
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
DT_DOC_CHECKER ?= dt-doc-validate
|
DT_DOC_CHECKER ?= dt-doc-validate
|
||||||
DT_EXTRACT_EX ?= dt-extract-example
|
DT_EXTRACT_EX ?= dt-extract-example
|
||||||
DT_MK_SCHEMA ?= dt-mk-schema
|
DT_MK_SCHEMA ?= dt-mk-schema
|
||||||
|
DT_MK_SCHEMA_USERONLY_FLAG := $(if $(DT_SCHEMA_FILES), -u)
|
||||||
|
|
||||||
quiet_cmd_chk_binding = CHKDT $(patsubst $(srctree)/%,%,$<)
|
quiet_cmd_chk_binding = CHKDT $(patsubst $(srctree)/%,%,$<)
|
||||||
cmd_chk_binding = $(DT_DOC_CHECKER) -u $(srctree)/$(src) $< ; \
|
cmd_chk_binding = $(DT_DOC_CHECKER) -u $(srctree)/$(src) $< ; \
|
||||||
@@ -13,16 +14,18 @@ $(obj)/%.example.dts: $(src)/%.yaml FORCE
|
|||||||
# Use full schemas when checking %.example.dts
|
# Use full schemas when checking %.example.dts
|
||||||
DT_TMP_SCHEMA := $(obj)/processed-schema-examples.yaml
|
DT_TMP_SCHEMA := $(obj)/processed-schema-examples.yaml
|
||||||
|
|
||||||
quiet_cmd_mk_schema = SCHEMA $@
|
find_cmd = find $(srctree)/$(src) \( -name '*.yaml' ! \
|
||||||
cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(real-prereqs)
|
|
||||||
|
|
||||||
DT_DOCS = $(addprefix $(src)/, \
|
|
||||||
$(shell \
|
|
||||||
cd $(srctree)/$(src) && \
|
|
||||||
find * \( -name '*.yaml' ! \
|
|
||||||
-name 'processed-schema*' ! \
|
-name 'processed-schema*' ! \
|
||||||
-name '*.example.dt.yaml' \) \
|
-name '*.example.dt.yaml' \)
|
||||||
))
|
|
||||||
|
quiet_cmd_mk_schema = SCHEMA $@
|
||||||
|
cmd_mk_schema = rm -f $@ ; \
|
||||||
|
$(if $(DT_MK_SCHEMA_FLAGS), \
|
||||||
|
echo $(real-prereqs), \
|
||||||
|
$(find_cmd)) | \
|
||||||
|
xargs $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) >> $@
|
||||||
|
|
||||||
|
DT_DOCS = $(shell $(find_cmd) | sed -e 's|^$(srctree)/||')
|
||||||
|
|
||||||
DT_SCHEMA_FILES ?= $(DT_DOCS)
|
DT_SCHEMA_FILES ?= $(DT_DOCS)
|
||||||
|
|
||||||
@@ -37,7 +40,7 @@ override DTC_FLAGS := \
|
|||||||
$(obj)/processed-schema-examples.yaml: $(DT_DOCS) FORCE
|
$(obj)/processed-schema-examples.yaml: $(DT_DOCS) FORCE
|
||||||
$(call if_changed,mk_schema)
|
$(call if_changed,mk_schema)
|
||||||
|
|
||||||
$(obj)/processed-schema.yaml: DT_MK_SCHEMA_FLAGS := -u
|
$(obj)/processed-schema.yaml: DT_MK_SCHEMA_FLAGS := $(DT_MK_SCHEMA_USERONLY_FLAG)
|
||||||
$(obj)/processed-schema.yaml: $(DT_SCHEMA_FILES) FORCE
|
$(obj)/processed-schema.yaml: $(DT_SCHEMA_FILES) FORCE
|
||||||
$(call if_changed,mk_schema)
|
$(call if_changed,mk_schema)
|
||||||
|
|
||||||
|
@@ -37,7 +37,6 @@ examples:
|
|||||||
dsi {
|
dsi {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
reg = <0xff450000 0x1000>;
|
|
||||||
|
|
||||||
panel@0 {
|
panel@0 {
|
||||||
compatible = "leadtek,ltk500hd1829";
|
compatible = "leadtek,ltk500hd1829";
|
||||||
|
@@ -96,12 +96,20 @@ properties:
|
|||||||
If set, reverse the bit order described in the data mappings below on all
|
If set, reverse the bit order described in the data mappings below on all
|
||||||
data lanes, transmitting bits for slots 6 to 0 instead of 0 to 6.
|
data lanes, transmitting bits for slots 6 to 0 instead of 0 to 6.
|
||||||
|
|
||||||
|
port: true
|
||||||
|
ports: true
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- data-mapping
|
- data-mapping
|
||||||
- width-mm
|
- width-mm
|
||||||
- height-mm
|
- height-mm
|
||||||
- panel-timing
|
- panel-timing
|
||||||
- port
|
|
||||||
|
oneOf:
|
||||||
|
- required:
|
||||||
|
- port
|
||||||
|
- required:
|
||||||
|
- ports
|
||||||
|
|
||||||
...
|
...
|
||||||
|
@@ -37,7 +37,6 @@ examples:
|
|||||||
dsi {
|
dsi {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
reg = <0xff450000 0x1000>;
|
|
||||||
|
|
||||||
panel@0 {
|
panel@0 {
|
||||||
compatible = "xinpeng,xpp055c272";
|
compatible = "xinpeng,xpp055c272";
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: "http://devicetree.org/schemas/bindings/iio/adc/st,stm32-adc.yaml#"
|
$id: "http://devicetree.org/schemas/iio/adc/st,stm32-adc.yaml#"
|
||||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||||
|
|
||||||
title: STMicroelectronics STM32 ADC bindings
|
title: STMicroelectronics STM32 ADC bindings
|
||||||
|
@@ -259,8 +259,6 @@ properties:
|
|||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
additionalProperties: false
|
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
required:
|
required:
|
||||||
|
@@ -97,7 +97,7 @@ then:
|
|||||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
- minimum: 0
|
- minimum: 0
|
||||||
maximum: 63
|
maximum: 63
|
||||||
default: 0
|
default: 32
|
||||||
|
|
||||||
qcom,charge-ctrl-value:
|
qcom,charge-ctrl-value:
|
||||||
description:
|
description:
|
||||||
@@ -130,7 +130,7 @@ then:
|
|||||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
- minimum: 0
|
- minimum: 0
|
||||||
maximum: 3
|
maximum: 3
|
||||||
default: 2
|
default: 0
|
||||||
|
|
||||||
qcom,preemphasis-width:
|
qcom,preemphasis-width:
|
||||||
description:
|
description:
|
||||||
@@ -152,7 +152,7 @@ then:
|
|||||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
- minimum: 0
|
- minimum: 0
|
||||||
maximum: 3
|
maximum: 3
|
||||||
default: 0
|
default: 1
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
@@ -37,7 +37,6 @@ properties:
|
|||||||
type: object
|
type: object
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
additionalProperties: false
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
@@ -75,7 +75,8 @@ properties:
|
|||||||
description: |
|
description: |
|
||||||
disables over voltage protection of this buck
|
disables over voltage protection of this buck
|
||||||
|
|
||||||
additionalProperties: false
|
unevaluatedProperties: false
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
required:
|
required:
|
||||||
|
@@ -35,6 +35,8 @@ patternProperties:
|
|||||||
description:
|
description:
|
||||||
should be "ldo1", ..., "ldo7"
|
should be "ldo1", ..., "ldo7"
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
"^BUCK[1-7]$":
|
"^BUCK[1-7]$":
|
||||||
type: object
|
type: object
|
||||||
allOf:
|
allOf:
|
||||||
@@ -103,5 +105,7 @@ patternProperties:
|
|||||||
|
|
||||||
required:
|
required:
|
||||||
- regulator-name
|
- regulator-name
|
||||||
additionalProperties: false
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
@@ -41,6 +41,8 @@ patternProperties:
|
|||||||
description:
|
description:
|
||||||
should be "ldo1", ..., "ldo7"
|
should be "ldo1", ..., "ldo7"
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
"^BUCK[1-8]$":
|
"^BUCK[1-8]$":
|
||||||
type: object
|
type: object
|
||||||
allOf:
|
allOf:
|
||||||
@@ -99,5 +101,7 @@ patternProperties:
|
|||||||
|
|
||||||
required:
|
required:
|
||||||
- regulator-name
|
- regulator-name
|
||||||
additionalProperties: false
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
@@ -40,6 +40,8 @@ patternProperties:
|
|||||||
description:
|
description:
|
||||||
should be "ldo1", ..., "ldo6"
|
should be "ldo1", ..., "ldo6"
|
||||||
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
"^BUCK[1-6]$":
|
"^BUCK[1-6]$":
|
||||||
type: object
|
type: object
|
||||||
allOf:
|
allOf:
|
||||||
@@ -93,5 +95,7 @@ patternProperties:
|
|||||||
|
|
||||||
required:
|
required:
|
||||||
- regulator-name
|
- regulator-name
|
||||||
additionalProperties: false
|
|
||||||
|
unevaluatedProperties: false
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
@@ -56,6 +56,9 @@ properties:
|
|||||||
- const: tx
|
- const: tx
|
||||||
- const: rx
|
- const: rx
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
rockchip,capture-channels:
|
rockchip,capture-channels:
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: /schemas/types.yaml#/definitions/uint32
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
@@ -1,45 +0,0 @@
|
|||||||
* Rockchip SPDIF transceiver
|
|
||||||
|
|
||||||
The S/PDIF audio block is a stereo transceiver that allows the
|
|
||||||
processor to receive and transmit digital audio via an coaxial cable or
|
|
||||||
a fibre cable.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
|
|
||||||
- compatible: should be one of the following:
|
|
||||||
- "rockchip,rk3066-spdif"
|
|
||||||
- "rockchip,rk3188-spdif"
|
|
||||||
- "rockchip,rk3228-spdif"
|
|
||||||
- "rockchip,rk3288-spdif"
|
|
||||||
- "rockchip,rk3328-spdif"
|
|
||||||
- "rockchip,rk3366-spdif"
|
|
||||||
- "rockchip,rk3368-spdif"
|
|
||||||
- "rockchip,rk3399-spdif"
|
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
|
||||||
region.
|
|
||||||
- interrupts: should contain the SPDIF interrupt.
|
|
||||||
- dmas: DMA specifiers for tx dma. See the DMA client binding,
|
|
||||||
Documentation/devicetree/bindings/dma/dma.txt
|
|
||||||
- dma-names: should be "tx"
|
|
||||||
- clocks: a list of phandle + clock-specifier pairs, one for each entry
|
|
||||||
in clock-names.
|
|
||||||
- clock-names: should contain following:
|
|
||||||
- "hclk": clock for SPDIF controller
|
|
||||||
- "mclk" : clock for SPDIF bus
|
|
||||||
|
|
||||||
Required properties on RK3288:
|
|
||||||
- rockchip,grf: the phandle of the syscon node for the general register
|
|
||||||
file (GRF)
|
|
||||||
|
|
||||||
Example for the rk3188 SPDIF controller:
|
|
||||||
|
|
||||||
spdif: spdif@1011e000 {
|
|
||||||
compatible = "rockchip,rk3188-spdif", "rockchip,rk3066-spdif";
|
|
||||||
reg = <0x1011e000 0x2000>;
|
|
||||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
dmas = <&dmac1_s 8>;
|
|
||||||
dma-names = "tx";
|
|
||||||
clock-names = "hclk", "mclk";
|
|
||||||
clocks = <&cru HCLK_SPDIF>, <&cru SCLK_SPDIF>;
|
|
||||||
#sound-dai-cells = <0>;
|
|
||||||
};
|
|
101
Documentation/devicetree/bindings/sound/rockchip-spdif.yaml
Normal file
101
Documentation/devicetree/bindings/sound/rockchip-spdif.yaml
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/sound/rockchip-spdif.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Rockchip SPDIF transceiver
|
||||||
|
|
||||||
|
description:
|
||||||
|
The S/PDIF audio block is a stereo transceiver that allows the
|
||||||
|
processor to receive and transmit digital audio via a coaxial or
|
||||||
|
fibre cable.
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Heiko Stuebner <heiko@sntech.de>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- const: rockchip,rk3066-spdif
|
||||||
|
- const: rockchip,rk3228-spdif
|
||||||
|
- const: rockchip,rk3328-spdif
|
||||||
|
- const: rockchip,rk3366-spdif
|
||||||
|
- const: rockchip,rk3368-spdif
|
||||||
|
- const: rockchip,rk3399-spdif
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- rockchip,rk3188-spdif
|
||||||
|
- rockchip,rk3288-spdif
|
||||||
|
- const: rockchip,rk3066-spdif
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: clock for SPDIF bus
|
||||||
|
- description: clock for SPDIF controller
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: mclk
|
||||||
|
- const: hclk
|
||||||
|
|
||||||
|
dmas:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
dma-names:
|
||||||
|
const: tx
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
rockchip,grf:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
description:
|
||||||
|
The phandle of the syscon node for the GRF register.
|
||||||
|
Required property on RK3288.
|
||||||
|
|
||||||
|
"#sound-dai-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- dmas
|
||||||
|
- dma-names
|
||||||
|
- "#sound-dai-cells"
|
||||||
|
|
||||||
|
if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: rockchip,rk3288-spdif
|
||||||
|
|
||||||
|
then:
|
||||||
|
required:
|
||||||
|
- rockchip,grf
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/rk3188-cru.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
spdif: spdif@1011e000 {
|
||||||
|
compatible = "rockchip,rk3188-spdif", "rockchip,rk3066-spdif";
|
||||||
|
reg = <0x1011e000 0x2000>;
|
||||||
|
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&cru SCLK_SPDIF>, <&cru HCLK_SPDIF>;
|
||||||
|
clock-names = "mclk", "hclk";
|
||||||
|
dmas = <&dmac1_s 8>;
|
||||||
|
dma-names = "tx";
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
};
|
@@ -18,6 +18,7 @@ properties:
|
|||||||
- renesas,r8a774c0-usb3-peri # RZ/G2E
|
- renesas,r8a774c0-usb3-peri # RZ/G2E
|
||||||
- renesas,r8a7795-usb3-peri # R-Car H3
|
- renesas,r8a7795-usb3-peri # R-Car H3
|
||||||
- renesas,r8a7796-usb3-peri # R-Car M3-W
|
- renesas,r8a7796-usb3-peri # R-Car M3-W
|
||||||
|
- renesas,r8a77961-usb3-peri # R-Car M3-W+
|
||||||
- renesas,r8a77965-usb3-peri # R-Car M3-N
|
- renesas,r8a77965-usb3-peri # R-Car M3-N
|
||||||
- renesas,r8a77990-usb3-peri # R-Car E3
|
- renesas,r8a77990-usb3-peri # R-Car E3
|
||||||
- const: renesas,rcar-gen3-usb3-peri
|
- const: renesas,rcar-gen3-usb3-peri
|
||||||
|
@@ -40,6 +40,7 @@ properties:
|
|||||||
- renesas,usbhs-r8a774c0 # RZ/G2E
|
- renesas,usbhs-r8a774c0 # RZ/G2E
|
||||||
- renesas,usbhs-r8a7795 # R-Car H3
|
- renesas,usbhs-r8a7795 # R-Car H3
|
||||||
- renesas,usbhs-r8a7796 # R-Car M3-W
|
- renesas,usbhs-r8a7796 # R-Car M3-W
|
||||||
|
- renesas,usbhs-r8a77961 # R-Car M3-W+
|
||||||
- renesas,usbhs-r8a77965 # R-Car M3-N
|
- renesas,usbhs-r8a77965 # R-Car M3-N
|
||||||
- renesas,usbhs-r8a77990 # R-Car E3
|
- renesas,usbhs-r8a77990 # R-Car E3
|
||||||
- renesas,usbhs-r8a77995 # R-Car D3
|
- renesas,usbhs-r8a77995 # R-Car D3
|
||||||
|
@@ -16,7 +16,8 @@ Required properties:
|
|||||||
- "renesas,xhci-r8a7791" for r8a7791 SoC
|
- "renesas,xhci-r8a7791" for r8a7791 SoC
|
||||||
- "renesas,xhci-r8a7793" for r8a7793 SoC
|
- "renesas,xhci-r8a7793" for r8a7793 SoC
|
||||||
- "renesas,xhci-r8a7795" for r8a7795 SoC
|
- "renesas,xhci-r8a7795" for r8a7795 SoC
|
||||||
- "renesas,xhci-r8a7796" for r8a7796 SoC
|
- "renesas,xhci-r8a7796" for r8a77960 SoC
|
||||||
|
- "renesas,xhci-r8a77961" for r8a77961 SoC
|
||||||
- "renesas,xhci-r8a77965" for r8a77965 SoC
|
- "renesas,xhci-r8a77965" for r8a77965 SoC
|
||||||
- "renesas,xhci-r8a77990" for r8a77990 SoC
|
- "renesas,xhci-r8a77990" for r8a77990 SoC
|
||||||
- "renesas,rcar-gen2-xhci" for a generic R-Car Gen2 or RZ/G1 compatible
|
- "renesas,rcar-gen2-xhci" for a generic R-Car Gen2 or RZ/G1 compatible
|
||||||
|
@@ -79,8 +79,8 @@ created with any of::
|
|||||||
struct dentry *parent, u8 *value);
|
struct dentry *parent, u8 *value);
|
||||||
void debugfs_create_u16(const char *name, umode_t mode,
|
void debugfs_create_u16(const char *name, umode_t mode,
|
||||||
struct dentry *parent, u16 *value);
|
struct dentry *parent, u16 *value);
|
||||||
struct dentry *debugfs_create_u32(const char *name, umode_t mode,
|
void debugfs_create_u32(const char *name, umode_t mode,
|
||||||
struct dentry *parent, u32 *value);
|
struct dentry *parent, u32 *value);
|
||||||
void debugfs_create_u64(const char *name, umode_t mode,
|
void debugfs_create_u64(const char *name, umode_t mode,
|
||||||
struct dentry *parent, u64 *value);
|
struct dentry *parent, u64 *value);
|
||||||
|
|
||||||
|
@@ -1241,7 +1241,8 @@ When kbuild executes, the following steps are followed (roughly):
|
|||||||
will be displayed with "make KBUILD_VERBOSE=0".
|
will be displayed with "make KBUILD_VERBOSE=0".
|
||||||
|
|
||||||
|
|
||||||
--- 6.9 Preprocessing linker scripts
|
6.9 Preprocessing linker scripts
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
When the vmlinux image is built, the linker script
|
When the vmlinux image is built, the linker script
|
||||||
arch/$(ARCH)/kernel/vmlinux.lds is used.
|
arch/$(ARCH)/kernel/vmlinux.lds is used.
|
||||||
|
@@ -983,6 +983,13 @@ ip_early_demux - BOOLEAN
|
|||||||
reduces overall throughput, in such case you should disable it.
|
reduces overall throughput, in such case you should disable it.
|
||||||
Default: 1
|
Default: 1
|
||||||
|
|
||||||
|
ping_group_range - 2 INTEGERS
|
||||||
|
Restrict ICMP_PROTO datagram sockets to users in the group range.
|
||||||
|
The default is "1 0", meaning, that nobody (not even root) may
|
||||||
|
create ping sockets. Setting it to "100 100" would grant permissions
|
||||||
|
to the single group. "0 4294967295" would enable it for the world, "100
|
||||||
|
4294967295" would enable it for the users, but not daemons.
|
||||||
|
|
||||||
tcp_early_demux - BOOLEAN
|
tcp_early_demux - BOOLEAN
|
||||||
Enable early demux for established TCP sockets.
|
Enable early demux for established TCP sockets.
|
||||||
Default: 1
|
Default: 1
|
||||||
|
70
MAINTAINERS
70
MAINTAINERS
@@ -189,7 +189,7 @@ F: drivers/net/hamradio/6pack.c
|
|||||||
M: Johannes Berg <johannes@sipsolutions.net>
|
M: Johannes Berg <johannes@sipsolutions.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
||||||
F: Documentation/driver-api/80211/cfg80211.rst
|
F: Documentation/driver-api/80211/cfg80211.rst
|
||||||
@@ -505,7 +505,7 @@ F: drivers/hwmon/adm1029.c
|
|||||||
ADM8211 WIRELESS DRIVER
|
ADM8211 WIRELESS DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
F: drivers/net/wireless/admtek/adm8211.*
|
F: drivers/net/wireless/admtek/adm8211.*
|
||||||
|
|
||||||
ADP1653 FLASH CONTROLLER DRIVER
|
ADP1653 FLASH CONTROLLER DRIVER
|
||||||
@@ -570,7 +570,7 @@ F: Documentation/devicetree/bindings/iio/accel/adi,adxl345.yaml
|
|||||||
F: drivers/input/misc/adxl34x.c
|
F: drivers/input/misc/adxl34x.c
|
||||||
|
|
||||||
ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
|
ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
F: Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
|
F: Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
|
||||||
@@ -922,7 +922,7 @@ F: arch/arm64/boot/dts/amd/amd-seattle-xgbe*.dtsi
|
|||||||
F: drivers/net/ethernet/amd/xgbe/
|
F: drivers/net/ethernet/amd/xgbe/
|
||||||
|
|
||||||
ANALOG DEVICES INC AD5686 DRIVER
|
ANALOG DEVICES INC AD5686 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
@@ -930,7 +930,7 @@ F: drivers/iio/dac/ad5686*
|
|||||||
F: drivers/iio/dac/ad5696*
|
F: drivers/iio/dac/ad5696*
|
||||||
|
|
||||||
ANALOG DEVICES INC AD5758 DRIVER
|
ANALOG DEVICES INC AD5758 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
L: linux-iio@vger.kernel.org
|
L: linux-iio@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
@@ -946,7 +946,7 @@ F: Documentation/devicetree/bindings/iio/adc/adi,ad7091r5.yaml
|
|||||||
F: drivers/iio/adc/ad7091r5.c
|
F: drivers/iio/adc/ad7091r5.c
|
||||||
|
|
||||||
ANALOG DEVICES INC AD7124 DRIVER
|
ANALOG DEVICES INC AD7124 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
L: linux-iio@vger.kernel.org
|
L: linux-iio@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
@@ -970,7 +970,7 @@ F: Documentation/devicetree/bindings/iio/adc/adi,ad7292.yaml
|
|||||||
F: drivers/iio/adc/ad7292.c
|
F: drivers/iio/adc/ad7292.c
|
||||||
|
|
||||||
ANALOG DEVICES INC AD7606 DRIVER
|
ANALOG DEVICES INC AD7606 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
M: Beniamin Bia <beniamin.bia@analog.com>
|
M: Beniamin Bia <beniamin.bia@analog.com>
|
||||||
L: linux-iio@vger.kernel.org
|
L: linux-iio@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
@@ -979,7 +979,7 @@ F: Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
|
|||||||
F: drivers/iio/adc/ad7606.c
|
F: drivers/iio/adc/ad7606.c
|
||||||
|
|
||||||
ANALOG DEVICES INC AD7768-1 DRIVER
|
ANALOG DEVICES INC AD7768-1 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
L: linux-iio@vger.kernel.org
|
L: linux-iio@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
@@ -1040,7 +1040,7 @@ F: Documentation/devicetree/bindings/hwmon/adi,adm1177.yaml
|
|||||||
F: drivers/hwmon/adm1177.c
|
F: drivers/hwmon/adm1177.c
|
||||||
|
|
||||||
ANALOG DEVICES INC ADP5061 DRIVER
|
ANALOG DEVICES INC ADP5061 DRIVER
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
@@ -1109,7 +1109,6 @@ F: drivers/iio/amplifiers/hmc425a.c
|
|||||||
ANALOG DEVICES INC IIO DRIVERS
|
ANALOG DEVICES INC IIO DRIVERS
|
||||||
M: Lars-Peter Clausen <lars@metafoo.de>
|
M: Lars-Peter Clausen <lars@metafoo.de>
|
||||||
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
M: Michael Hennerich <Michael.Hennerich@analog.com>
|
||||||
M: Stefan Popa <stefan.popa@analog.com>
|
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://wiki.analog.com/
|
W: http://wiki.analog.com/
|
||||||
W: http://ez.analog.com/community/linux-device-drivers
|
W: http://ez.analog.com/community/linux-device-drivers
|
||||||
@@ -2850,14 +2849,14 @@ M: Nick Kossifidis <mickflemm@gmail.com>
|
|||||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath5k
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath5k
|
||||||
F: drivers/net/wireless/ath/ath5k/
|
F: drivers/net/wireless/ath/ath5k/
|
||||||
|
|
||||||
ATHEROS ATH6KL WIRELESS DRIVER
|
ATHEROS ATH6KL WIRELESS DRIVER
|
||||||
M: Kalle Valo <kvalo@codeaurora.org>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath6kl
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath6kl
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||||
F: drivers/net/wireless/ath/ath6kl/
|
F: drivers/net/wireless/ath/ath6kl/
|
||||||
|
|
||||||
@@ -3020,7 +3019,7 @@ B43 WIRELESS DRIVER
|
|||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: b43-dev@lists.infradead.org
|
L: b43-dev@lists.infradead.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/b43
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/b43
|
||||||
F: drivers/net/wireless/broadcom/b43/
|
F: drivers/net/wireless/broadcom/b43/
|
||||||
|
|
||||||
B43LEGACY WIRELESS DRIVER
|
B43LEGACY WIRELESS DRIVER
|
||||||
@@ -3028,7 +3027,7 @@ M: Larry Finger <Larry.Finger@lwfinger.net>
|
|||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: b43-dev@lists.infradead.org
|
L: b43-dev@lists.infradead.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/b43
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/b43
|
||||||
F: drivers/net/wireless/broadcom/b43legacy/
|
F: drivers/net/wireless/broadcom/b43legacy/
|
||||||
|
|
||||||
BACKLIGHT CLASS/SUBSYSTEM
|
BACKLIGHT CLASS/SUBSYSTEM
|
||||||
@@ -3843,7 +3842,7 @@ CARL9170 LINUX COMMUNITY WIRELESS DRIVER
|
|||||||
M: Christian Lamparter <chunkeey@googlemail.com>
|
M: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/carl9170
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/carl9170
|
||||||
F: drivers/net/wireless/ath/carl9170/
|
F: drivers/net/wireless/ath/carl9170/
|
||||||
|
|
||||||
CAVIUM I2C DRIVER
|
CAVIUM I2C DRIVER
|
||||||
@@ -5176,6 +5175,7 @@ S: Maintained
|
|||||||
F: drivers/soc/fsl/dpio
|
F: drivers/soc/fsl/dpio
|
||||||
|
|
||||||
DPAA2 ETHERNET DRIVER
|
DPAA2 ETHERNET DRIVER
|
||||||
|
M: Ioana Ciornei <ioana.ciornei@nxp.com>
|
||||||
M: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
M: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -9329,6 +9329,7 @@ M: Christian Borntraeger <borntraeger@de.ibm.com>
|
|||||||
M: Janosch Frank <frankja@linux.ibm.com>
|
M: Janosch Frank <frankja@linux.ibm.com>
|
||||||
R: David Hildenbrand <david@redhat.com>
|
R: David Hildenbrand <david@redhat.com>
|
||||||
R: Cornelia Huck <cohuck@redhat.com>
|
R: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
R: Claudio Imbrenda <imbrenda@linux.ibm.com>
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||||
@@ -9416,6 +9417,13 @@ F: include/linux/keyctl.h
|
|||||||
F: include/uapi/linux/keyctl.h
|
F: include/uapi/linux/keyctl.h
|
||||||
F: security/keys/
|
F: security/keys/
|
||||||
|
|
||||||
|
KFIFO
|
||||||
|
M: Stefani Seibold <stefani@seibold.net>
|
||||||
|
S: Maintained
|
||||||
|
F: include/linux/kfifo.h
|
||||||
|
F: lib/kfifo.c
|
||||||
|
F: samples/kfifo/
|
||||||
|
|
||||||
KGDB / KDB /debug_core
|
KGDB / KDB /debug_core
|
||||||
M: Jason Wessel <jason.wessel@windriver.com>
|
M: Jason Wessel <jason.wessel@windriver.com>
|
||||||
M: Daniel Thompson <daniel.thompson@linaro.org>
|
M: Daniel Thompson <daniel.thompson@linaro.org>
|
||||||
@@ -10067,7 +10075,7 @@ MAC80211
|
|||||||
M: Johannes Berg <johannes@sipsolutions.net>
|
M: Johannes Berg <johannes@sipsolutions.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
||||||
F: Documentation/networking/mac80211-injection.txt
|
F: Documentation/networking/mac80211-injection.txt
|
||||||
@@ -10697,7 +10705,6 @@ MEDIATEK MT76 WIRELESS LAN DRIVER
|
|||||||
M: Felix Fietkau <nbd@nbd.name>
|
M: Felix Fietkau <nbd@nbd.name>
|
||||||
M: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
|
M: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
|
||||||
R: Ryder Lee <ryder.lee@mediatek.com>
|
R: Ryder Lee <ryder.lee@mediatek.com>
|
||||||
R: Roy Luo <royluo@google.com>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/wireless/mediatek/mt76/
|
F: drivers/net/wireless/mediatek/mt76/
|
||||||
@@ -12654,7 +12661,7 @@ F: fs/orangefs/
|
|||||||
ORINOCO DRIVER
|
ORINOCO DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/orinoco
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/orinoco
|
||||||
W: http://www.nongnu.org/orinoco/
|
W: http://www.nongnu.org/orinoco/
|
||||||
F: drivers/net/wireless/intersil/orinoco/
|
F: drivers/net/wireless/intersil/orinoco/
|
||||||
|
|
||||||
@@ -12680,7 +12687,7 @@ P54 WIRELESS DRIVER
|
|||||||
M: Christian Lamparter <chunkeey@googlemail.com>
|
M: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/p54
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/p54
|
||||||
F: drivers/net/wireless/intersil/p54/
|
F: drivers/net/wireless/intersil/p54/
|
||||||
|
|
||||||
PACKING
|
PACKING
|
||||||
@@ -13048,7 +13055,7 @@ F: drivers/pci/controller/pci-xgene-msi.c
|
|||||||
|
|
||||||
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
|
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
|
||||||
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||||
R: Andrew Murray <amurray@thegoodpenguin.co.uk>
|
R: Rob Herring <robh@kernel.org>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
Q: http://patchwork.ozlabs.org/project/linux-pci/list/
|
Q: http://patchwork.ozlabs.org/project/linux-pci/list/
|
||||||
@@ -13601,7 +13608,7 @@ PRISM54 WIRELESS DRIVER
|
|||||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Obsolete
|
S: Obsolete
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/p54
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/p54
|
||||||
F: drivers/net/wireless/intersil/prism54/
|
F: drivers/net/wireless/intersil/prism54/
|
||||||
|
|
||||||
PROC FILESYSTEM
|
PROC FILESYSTEM
|
||||||
@@ -13942,7 +13949,7 @@ QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
|
|||||||
M: Kalle Valo <kvalo@codeaurora.org>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: ath10k@lists.infradead.org
|
L: ath10k@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath10k
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||||
F: drivers/net/wireless/ath/ath10k/
|
F: drivers/net/wireless/ath/ath10k/
|
||||||
|
|
||||||
@@ -13957,7 +13964,7 @@ QUALCOMM ATHEROS ATH9K WIRELESS DRIVER
|
|||||||
M: QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
|
M: QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/ath9k
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath9k
|
||||||
F: drivers/net/wireless/ath/ath9k/
|
F: drivers/net/wireless/ath/ath9k/
|
||||||
|
|
||||||
QUALCOMM CAMERA SUBSYSTEM DRIVER
|
QUALCOMM CAMERA SUBSYSTEM DRIVER
|
||||||
@@ -14054,13 +14061,12 @@ QUALCOMM WCN36XX WIRELESS DRIVER
|
|||||||
M: Kalle Valo <kvalo@codeaurora.org>
|
M: Kalle Valo <kvalo@codeaurora.org>
|
||||||
L: wcn36xx@lists.infradead.org
|
L: wcn36xx@lists.infradead.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/wcn36xx
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/wcn36xx
|
||||||
T: git git://github.com/KrasnikovEugene/wcn36xx.git
|
T: git git://github.com/KrasnikovEugene/wcn36xx.git
|
||||||
F: drivers/net/wireless/ath/wcn36xx/
|
F: drivers/net/wireless/ath/wcn36xx/
|
||||||
|
|
||||||
QUANTENNA QTNFMAC WIRELESS DRIVER
|
QUANTENNA QTNFMAC WIRELESS DRIVER
|
||||||
M: Igor Mitsyanko <imitsyanko@quantenna.com>
|
M: Igor Mitsyanko <imitsyanko@quantenna.com>
|
||||||
M: Avinash Patil <avinashp@quantenna.com>
|
|
||||||
M: Sergey Matyukevich <smatyukevich@quantenna.com>
|
M: Sergey Matyukevich <smatyukevich@quantenna.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -14282,7 +14288,7 @@ REALTEK WIRELESS DRIVER (rtlwifi family)
|
|||||||
M: Ping-Ke Shih <pkshih@realtek.com>
|
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||||
F: drivers/net/wireless/realtek/rtlwifi/
|
F: drivers/net/wireless/realtek/rtlwifi/
|
||||||
|
|
||||||
@@ -14417,7 +14423,7 @@ RFKILL
|
|||||||
M: Johannes Berg <johannes@sipsolutions.net>
|
M: Johannes Berg <johannes@sipsolutions.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
|
||||||
F: Documentation/ABI/stable/sysfs-class-rfkill
|
F: Documentation/ABI/stable/sysfs-class-rfkill
|
||||||
@@ -14566,7 +14572,7 @@ F: drivers/media/dvb-frontends/rtl2832_sdr*
|
|||||||
RTL8180 WIRELESS DRIVER
|
RTL8180 WIRELESS DRIVER
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
||||||
|
|
||||||
@@ -14576,7 +14582,7 @@ M: Hin-Tak Leung <htl10@users.sourceforge.net>
|
|||||||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://wireless.kernel.org/
|
W: https://wireless.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
||||||
|
|
||||||
@@ -16931,8 +16937,8 @@ F: drivers/media/platform/ti-vpe/
|
|||||||
TI WILINK WIRELESS DRIVERS
|
TI WILINK WIRELESS DRIVERS
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Orphan
|
S: Orphan
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/wl12xx
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl12xx
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/wl1251
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
|
||||||
F: drivers/net/wireless/ti/
|
F: drivers/net/wireless/ti/
|
||||||
F: include/linux/wl12xx.h
|
F: include/linux/wl12xx.h
|
||||||
@@ -18214,7 +18220,7 @@ M: Maya Erez <merez@codeaurora.org>
|
|||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: wil6210@qti.qualcomm.com
|
L: wil6210@qti.qualcomm.com
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://wireless.kernel.org/en/users/Drivers/wil6210
|
W: https://wireless.wiki.kernel.org/en/users/Drivers/wil6210
|
||||||
F: drivers/net/wireless/ath/wil6210/
|
F: drivers/net/wireless/ath/wil6210/
|
||||||
|
|
||||||
WIMAX STACK
|
WIMAX STACK
|
||||||
|
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 7
|
PATCHLEVEL = 7
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc3
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
|
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
|
||||||
*
|
*
|
||||||
* Amit Bhor, Sameer Dhavale: Codito Technologies 2004
|
* Amit Bhor, Sameer Dhavale: Codito Technologies 2004
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ASM_ARC_MODULE_H
|
#ifndef _ASM_ARC_MODULE_H
|
||||||
@@ -19,8 +18,4 @@ struct mod_arch_specific {
|
|||||||
const char *secstr;
|
const char *secstr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MODULE_PROC_FAMILY "ARC700"
|
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
|
||||||
|
|
||||||
#endif /* _ASM_ARC_MODULE_H */
|
#endif /* _ASM_ARC_MODULE_H */
|
||||||
|
8
arch/arc/include/asm/vermagic.h
Normal file
8
arch/arc/include/asm/vermagic.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC "ARC700"
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -14,6 +14,9 @@
|
|||||||
soc {
|
soc {
|
||||||
firmware: firmware {
|
firmware: firmware {
|
||||||
compatible = "raspberrypi,bcm2835-firmware", "simple-bus";
|
compatible = "raspberrypi,bcm2835-firmware", "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
mboxes = <&mailbox>;
|
mboxes = <&mailbox>;
|
||||||
dma-ranges;
|
dma-ranges;
|
||||||
};
|
};
|
||||||
|
@@ -372,6 +372,7 @@
|
|||||||
"dsi0_ddr2",
|
"dsi0_ddr2",
|
||||||
"dsi0_ddr";
|
"dsi0_ddr";
|
||||||
|
|
||||||
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
aux: aux@7e215000 {
|
aux: aux@7e215000 {
|
||||||
|
@@ -341,6 +341,11 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* RNG not directly accessible on N950/N9. */
|
||||||
|
&rng_target {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
&usb_otg_hs {
|
&usb_otg_hs {
|
||||||
interface-type = <0>;
|
interface-type = <0>;
|
||||||
usb-phy = <&usb2_phy>;
|
usb-phy = <&usb2_phy>;
|
||||||
|
@@ -37,30 +37,6 @@ struct mod_arch_specific {
|
|||||||
struct module;
|
struct module;
|
||||||
u32 get_module_plt(struct module *mod, unsigned long loc, Elf32_Addr val);
|
u32 get_module_plt(struct module *mod, unsigned long loc, Elf32_Addr val);
|
||||||
|
|
||||||
/*
|
|
||||||
* Add the ARM architecture version to the version magic string
|
|
||||||
*/
|
|
||||||
#define MODULE_ARCH_VERMAGIC_ARMVSN "ARMv" __stringify(__LINUX_ARM_ARCH__) " "
|
|
||||||
|
|
||||||
/* Add __virt_to_phys patching state as well */
|
|
||||||
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
|
|
||||||
#define MODULE_ARCH_VERMAGIC_P2V "p2v8 "
|
|
||||||
#else
|
|
||||||
#define MODULE_ARCH_VERMAGIC_P2V ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Add instruction set architecture tag to distinguish ARM/Thumb kernels */
|
|
||||||
#ifdef CONFIG_THUMB2_KERNEL
|
|
||||||
#define MODULE_ARCH_VERMAGIC_ARMTHUMB "thumb2 "
|
|
||||||
#else
|
|
||||||
#define MODULE_ARCH_VERMAGIC_ARMTHUMB ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC \
|
|
||||||
MODULE_ARCH_VERMAGIC_ARMVSN \
|
|
||||||
MODULE_ARCH_VERMAGIC_ARMTHUMB \
|
|
||||||
MODULE_ARCH_VERMAGIC_P2V
|
|
||||||
|
|
||||||
#ifdef CONFIG_THUMB2_KERNEL
|
#ifdef CONFIG_THUMB2_KERNEL
|
||||||
#define HAVE_ARCH_KALLSYMS_SYMBOL_VALUE
|
#define HAVE_ARCH_KALLSYMS_SYMBOL_VALUE
|
||||||
static inline unsigned long kallsyms_symbol_value(const Elf_Sym *sym)
|
static inline unsigned long kallsyms_symbol_value(const Elf_Sym *sym)
|
||||||
|
31
arch/arm/include/asm/vermagic.h
Normal file
31
arch/arm/include/asm/vermagic.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add the ARM architecture version to the version magic string
|
||||||
|
*/
|
||||||
|
#define MODULE_ARCH_VERMAGIC_ARMVSN "ARMv" __stringify(__LINUX_ARM_ARCH__) " "
|
||||||
|
|
||||||
|
/* Add __virt_to_phys patching state as well */
|
||||||
|
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
|
||||||
|
#define MODULE_ARCH_VERMAGIC_P2V "p2v8 "
|
||||||
|
#else
|
||||||
|
#define MODULE_ARCH_VERMAGIC_P2V ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Add instruction set architecture tag to distinguish ARM/Thumb kernels */
|
||||||
|
#ifdef CONFIG_THUMB2_KERNEL
|
||||||
|
#define MODULE_ARCH_VERMAGIC_ARMTHUMB "thumb2 "
|
||||||
|
#else
|
||||||
|
#define MODULE_ARCH_VERMAGIC_ARMTHUMB ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC \
|
||||||
|
MODULE_ARCH_VERMAGIC_ARMVSN \
|
||||||
|
MODULE_ARCH_VERMAGIC_ARMTHUMB \
|
||||||
|
MODULE_ARCH_VERMAGIC_P2V
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -91,8 +91,10 @@ AFLAGS_suspend-imx6.o :=-Wa,-march=armv7-a
|
|||||||
obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o
|
obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o
|
||||||
obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o
|
obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(CONFIG_ARM_CPU_SUSPEND),y)
|
||||||
AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a
|
AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a
|
||||||
obj-$(CONFIG_SOC_IMX6) += resume-imx6.o
|
obj-$(CONFIG_SOC_IMX6) += resume-imx6.o
|
||||||
|
endif
|
||||||
obj-$(CONFIG_SOC_IMX6) += pm-imx6.o
|
obj-$(CONFIG_SOC_IMX6) += pm-imx6.o
|
||||||
|
|
||||||
obj-$(CONFIG_SOC_IMX1) += mach-imx1.o
|
obj-$(CONFIG_SOC_IMX1) += mach-imx1.o
|
||||||
|
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
#include <asm-generic/module.h>
|
#include <asm-generic/module.h>
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC "aarch64"
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_MODULE_PLTS
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
struct mod_plt_sec {
|
struct mod_plt_sec {
|
||||||
int plt_shndx;
|
int plt_shndx;
|
||||||
|
@@ -47,7 +47,7 @@ static inline void ptrauth_keys_init_user(struct ptrauth_keys_user *keys)
|
|||||||
get_random_bytes(&keys->apga, sizeof(keys->apga));
|
get_random_bytes(&keys->apga, sizeof(keys->apga));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __ptrauth_key_install(k, v) \
|
#define __ptrauth_key_install_nosync(k, v) \
|
||||||
do { \
|
do { \
|
||||||
struct ptrauth_key __pki_v = (v); \
|
struct ptrauth_key __pki_v = (v); \
|
||||||
write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \
|
write_sysreg_s(__pki_v.lo, SYS_ ## k ## KEYLO_EL1); \
|
||||||
@@ -62,8 +62,11 @@ static __always_inline void ptrauth_keys_init_kernel(struct ptrauth_keys_kernel
|
|||||||
|
|
||||||
static __always_inline void ptrauth_keys_switch_kernel(struct ptrauth_keys_kernel *keys)
|
static __always_inline void ptrauth_keys_switch_kernel(struct ptrauth_keys_kernel *keys)
|
||||||
{
|
{
|
||||||
if (system_supports_address_auth())
|
if (!system_supports_address_auth())
|
||||||
__ptrauth_key_install(APIA, keys->apia);
|
return;
|
||||||
|
|
||||||
|
__ptrauth_key_install_nosync(APIA, keys->apia);
|
||||||
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg);
|
extern int ptrauth_prctl_reset_keys(struct task_struct *tsk, unsigned long arg);
|
||||||
|
10
arch/arm64/include/asm/vermagic.h
Normal file
10
arch/arm64/include/asm/vermagic.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2012 ARM Ltd.
|
||||||
|
*/
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC "aarch64"
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
2
arch/h8300/kernel/.gitignore
vendored
Normal file
2
arch/h8300/kernel/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
vmlinux.lds
|
@@ -3,11 +3,11 @@
|
|||||||
* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ASM_MODULE_H
|
#ifndef _ASM_VERMAGIC_H
|
||||||
#define _ASM_MODULE_H
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
#include <asm-generic/module.h>
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC __stringify(PROCESSOR_MODEL_NAME) " "
|
#define MODULE_ARCH_VERMAGIC __stringify(PROCESSOR_MODEL_NAME) " "
|
||||||
|
|
||||||
#endif
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -26,10 +26,6 @@ struct mod_arch_specific {
|
|||||||
unsigned int next_got_entry; /* index of next available got entry */
|
unsigned int next_got_entry; /* index of next available got entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MODULE_PROC_FAMILY "ia64"
|
|
||||||
#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY \
|
|
||||||
"gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__)
|
|
||||||
|
|
||||||
#define ARCH_SHF_SMALL SHF_IA_64_SHORT
|
#define ARCH_SHF_SMALL SHF_IA_64_SHORT
|
||||||
|
|
||||||
#endif /* _ASM_IA64_MODULE_H */
|
#endif /* _ASM_IA64_MODULE_H */
|
||||||
|
15
arch/ia64/include/asm/vermagic.h
Normal file
15
arch/ia64/include/asm/vermagic.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2003 Hewlett-Packard Co
|
||||||
|
* David Mosberger-Tang <davidm@hpl.hp.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC "ia64" \
|
||||||
|
"gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__)
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -83,65 +83,4 @@ search_module_dbetables(unsigned long addr)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_BMIPS
|
|
||||||
#define MODULE_PROC_FAMILY "BMIPS "
|
|
||||||
#elif defined CONFIG_CPU_MIPS32_R1
|
|
||||||
#define MODULE_PROC_FAMILY "MIPS32_R1 "
|
|
||||||
#elif defined CONFIG_CPU_MIPS32_R2
|
|
||||||
#define MODULE_PROC_FAMILY "MIPS32_R2 "
|
|
||||||
#elif defined CONFIG_CPU_MIPS32_R6
|
|
||||||
#define MODULE_PROC_FAMILY "MIPS32_R6 "
|
|
||||||
#elif defined CONFIG_CPU_MIPS64_R1
|
|
||||||
#define MODULE_PROC_FAMILY "MIPS64_R1 "
|
|
||||||
#elif defined CONFIG_CPU_MIPS64_R2
|
|
||||||
#define MODULE_PROC_FAMILY "MIPS64_R2 "
|
|
||||||
#elif defined CONFIG_CPU_MIPS64_R6
|
|
||||||
#define MODULE_PROC_FAMILY "MIPS64_R6 "
|
|
||||||
#elif defined CONFIG_CPU_R3000
|
|
||||||
#define MODULE_PROC_FAMILY "R3000 "
|
|
||||||
#elif defined CONFIG_CPU_TX39XX
|
|
||||||
#define MODULE_PROC_FAMILY "TX39XX "
|
|
||||||
#elif defined CONFIG_CPU_VR41XX
|
|
||||||
#define MODULE_PROC_FAMILY "VR41XX "
|
|
||||||
#elif defined CONFIG_CPU_R4X00
|
|
||||||
#define MODULE_PROC_FAMILY "R4X00 "
|
|
||||||
#elif defined CONFIG_CPU_TX49XX
|
|
||||||
#define MODULE_PROC_FAMILY "TX49XX "
|
|
||||||
#elif defined CONFIG_CPU_R5000
|
|
||||||
#define MODULE_PROC_FAMILY "R5000 "
|
|
||||||
#elif defined CONFIG_CPU_R5500
|
|
||||||
#define MODULE_PROC_FAMILY "R5500 "
|
|
||||||
#elif defined CONFIG_CPU_NEVADA
|
|
||||||
#define MODULE_PROC_FAMILY "NEVADA "
|
|
||||||
#elif defined CONFIG_CPU_R10000
|
|
||||||
#define MODULE_PROC_FAMILY "R10000 "
|
|
||||||
#elif defined CONFIG_CPU_RM7000
|
|
||||||
#define MODULE_PROC_FAMILY "RM7000 "
|
|
||||||
#elif defined CONFIG_CPU_SB1
|
|
||||||
#define MODULE_PROC_FAMILY "SB1 "
|
|
||||||
#elif defined CONFIG_CPU_LOONGSON32
|
|
||||||
#define MODULE_PROC_FAMILY "LOONGSON32 "
|
|
||||||
#elif defined CONFIG_CPU_LOONGSON2EF
|
|
||||||
#define MODULE_PROC_FAMILY "LOONGSON2EF "
|
|
||||||
#elif defined CONFIG_CPU_LOONGSON64
|
|
||||||
#define MODULE_PROC_FAMILY "LOONGSON64 "
|
|
||||||
#elif defined CONFIG_CPU_CAVIUM_OCTEON
|
|
||||||
#define MODULE_PROC_FAMILY "OCTEON "
|
|
||||||
#elif defined CONFIG_CPU_XLR
|
|
||||||
#define MODULE_PROC_FAMILY "XLR "
|
|
||||||
#elif defined CONFIG_CPU_XLP
|
|
||||||
#define MODULE_PROC_FAMILY "XLP "
|
|
||||||
#else
|
|
||||||
#error MODULE_PROC_FAMILY undefined for your processor configuration
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_32BIT
|
|
||||||
#define MODULE_KERNEL_TYPE "32BIT "
|
|
||||||
#elif defined CONFIG_64BIT
|
|
||||||
#define MODULE_KERNEL_TYPE "64BIT "
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC \
|
|
||||||
MODULE_PROC_FAMILY MODULE_KERNEL_TYPE
|
|
||||||
|
|
||||||
#endif /* _ASM_MODULE_H */
|
#endif /* _ASM_MODULE_H */
|
||||||
|
66
arch/mips/include/asm/vermagic.h
Normal file
66
arch/mips/include/asm/vermagic.h
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_BMIPS
|
||||||
|
#define MODULE_PROC_FAMILY "BMIPS "
|
||||||
|
#elif defined CONFIG_CPU_MIPS32_R1
|
||||||
|
#define MODULE_PROC_FAMILY "MIPS32_R1 "
|
||||||
|
#elif defined CONFIG_CPU_MIPS32_R2
|
||||||
|
#define MODULE_PROC_FAMILY "MIPS32_R2 "
|
||||||
|
#elif defined CONFIG_CPU_MIPS32_R6
|
||||||
|
#define MODULE_PROC_FAMILY "MIPS32_R6 "
|
||||||
|
#elif defined CONFIG_CPU_MIPS64_R1
|
||||||
|
#define MODULE_PROC_FAMILY "MIPS64_R1 "
|
||||||
|
#elif defined CONFIG_CPU_MIPS64_R2
|
||||||
|
#define MODULE_PROC_FAMILY "MIPS64_R2 "
|
||||||
|
#elif defined CONFIG_CPU_MIPS64_R6
|
||||||
|
#define MODULE_PROC_FAMILY "MIPS64_R6 "
|
||||||
|
#elif defined CONFIG_CPU_R3000
|
||||||
|
#define MODULE_PROC_FAMILY "R3000 "
|
||||||
|
#elif defined CONFIG_CPU_TX39XX
|
||||||
|
#define MODULE_PROC_FAMILY "TX39XX "
|
||||||
|
#elif defined CONFIG_CPU_VR41XX
|
||||||
|
#define MODULE_PROC_FAMILY "VR41XX "
|
||||||
|
#elif defined CONFIG_CPU_R4X00
|
||||||
|
#define MODULE_PROC_FAMILY "R4X00 "
|
||||||
|
#elif defined CONFIG_CPU_TX49XX
|
||||||
|
#define MODULE_PROC_FAMILY "TX49XX "
|
||||||
|
#elif defined CONFIG_CPU_R5000
|
||||||
|
#define MODULE_PROC_FAMILY "R5000 "
|
||||||
|
#elif defined CONFIG_CPU_R5500
|
||||||
|
#define MODULE_PROC_FAMILY "R5500 "
|
||||||
|
#elif defined CONFIG_CPU_NEVADA
|
||||||
|
#define MODULE_PROC_FAMILY "NEVADA "
|
||||||
|
#elif defined CONFIG_CPU_R10000
|
||||||
|
#define MODULE_PROC_FAMILY "R10000 "
|
||||||
|
#elif defined CONFIG_CPU_RM7000
|
||||||
|
#define MODULE_PROC_FAMILY "RM7000 "
|
||||||
|
#elif defined CONFIG_CPU_SB1
|
||||||
|
#define MODULE_PROC_FAMILY "SB1 "
|
||||||
|
#elif defined CONFIG_CPU_LOONGSON32
|
||||||
|
#define MODULE_PROC_FAMILY "LOONGSON32 "
|
||||||
|
#elif defined CONFIG_CPU_LOONGSON2EF
|
||||||
|
#define MODULE_PROC_FAMILY "LOONGSON2EF "
|
||||||
|
#elif defined CONFIG_CPU_LOONGSON64
|
||||||
|
#define MODULE_PROC_FAMILY "LOONGSON64 "
|
||||||
|
#elif defined CONFIG_CPU_CAVIUM_OCTEON
|
||||||
|
#define MODULE_PROC_FAMILY "OCTEON "
|
||||||
|
#elif defined CONFIG_CPU_XLR
|
||||||
|
#define MODULE_PROC_FAMILY "XLR "
|
||||||
|
#elif defined CONFIG_CPU_XLP
|
||||||
|
#define MODULE_PROC_FAMILY "XLP "
|
||||||
|
#else
|
||||||
|
#error MODULE_PROC_FAMILY undefined for your processor configuration
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_32BIT
|
||||||
|
#define MODULE_KERNEL_TYPE "32BIT "
|
||||||
|
#elif defined CONFIG_64BIT
|
||||||
|
#define MODULE_KERNEL_TYPE "64BIT "
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC \
|
||||||
|
MODULE_PROC_FAMILY MODULE_KERNEL_TYPE
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -1,11 +1,9 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
// Copyright (C) 2005-2017 Andes Technology Corporation
|
// Copyright (C) 2005-2017 Andes Technology Corporation
|
||||||
|
|
||||||
#ifndef _ASM_NDS32_MODULE_H
|
#ifndef _ASM_VERMAGIC_H
|
||||||
#define _ASM_NDS32_MODULE_H
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
#include <asm-generic/module.h>
|
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC "NDS32v3"
|
#define MODULE_ARCH_VERMAGIC "NDS32v3"
|
||||||
|
|
||||||
#endif /* _ASM_NDS32_MODULE_H */
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -3,28 +3,10 @@
|
|||||||
#define _ASM_POWERPC_MODULE_H
|
#define _ASM_POWERPC_MODULE_H
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
/*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <asm/bug.h>
|
#include <asm/bug.h>
|
||||||
#include <asm-generic/module.h>
|
#include <asm-generic/module.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_MPROFILE_KERNEL
|
|
||||||
#define MODULE_ARCH_VERMAGIC_FTRACE "mprofile-kernel "
|
|
||||||
#else
|
|
||||||
#define MODULE_ARCH_VERMAGIC_FTRACE ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_RELOCATABLE
|
|
||||||
#define MODULE_ARCH_VERMAGIC_RELOCATABLE "relocatable "
|
|
||||||
#else
|
|
||||||
#define MODULE_ARCH_VERMAGIC_RELOCATABLE ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC MODULE_ARCH_VERMAGIC_FTRACE MODULE_ARCH_VERMAGIC_RELOCATABLE
|
|
||||||
|
|
||||||
#ifndef __powerpc64__
|
#ifndef __powerpc64__
|
||||||
/*
|
/*
|
||||||
* Thanks to Paul M for explaining this.
|
* Thanks to Paul M for explaining this.
|
||||||
|
20
arch/powerpc/include/asm/vermagic.h
Normal file
20
arch/powerpc/include/asm/vermagic.h
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_MPROFILE_KERNEL
|
||||||
|
#define MODULE_ARCH_VERMAGIC_FTRACE "mprofile-kernel "
|
||||||
|
#else
|
||||||
|
#define MODULE_ARCH_VERMAGIC_FTRACE ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_RELOCATABLE
|
||||||
|
#define MODULE_ARCH_VERMAGIC_RELOCATABLE "relocatable "
|
||||||
|
#else
|
||||||
|
#define MODULE_ARCH_VERMAGIC_RELOCATABLE ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC \
|
||||||
|
MODULE_ARCH_VERMAGIC_FTRACE MODULE_ARCH_VERMAGIC_RELOCATABLE
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -732,7 +732,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_SPE)
|
|||||||
stw r10,_CCR(r1)
|
stw r10,_CCR(r1)
|
||||||
stw r1,KSP(r3) /* Set old stack pointer */
|
stw r1,KSP(r3) /* Set old stack pointer */
|
||||||
|
|
||||||
kuap_check r2, r4
|
kuap_check r2, r0
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* We need a sync somewhere here to make sure that if the
|
/* We need a sync somewhere here to make sure that if the
|
||||||
* previous task gets rescheduled on another CPU, it sees all
|
* previous task gets rescheduled on another CPU, it sees all
|
||||||
|
@@ -534,6 +534,8 @@ static bool __init parse_cache_info(struct device_node *np,
|
|||||||
lsizep = of_get_property(np, propnames[3], NULL);
|
lsizep = of_get_property(np, propnames[3], NULL);
|
||||||
if (bsizep == NULL)
|
if (bsizep == NULL)
|
||||||
bsizep = lsizep;
|
bsizep = lsizep;
|
||||||
|
if (lsizep == NULL)
|
||||||
|
lsizep = bsizep;
|
||||||
if (lsizep != NULL)
|
if (lsizep != NULL)
|
||||||
lsize = be32_to_cpu(*lsizep);
|
lsize = be32_to_cpu(*lsizep);
|
||||||
if (bsizep != NULL)
|
if (bsizep != NULL)
|
||||||
|
@@ -604,18 +604,19 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|||||||
*/
|
*/
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
ptep = __find_linux_pte(vcpu->arch.pgdir, hva, NULL, &shift);
|
ptep = __find_linux_pte(vcpu->arch.pgdir, hva, NULL, &shift);
|
||||||
|
pte = __pte(0);
|
||||||
|
if (ptep)
|
||||||
|
pte = *ptep;
|
||||||
|
local_irq_enable();
|
||||||
/*
|
/*
|
||||||
* If the PTE disappeared temporarily due to a THP
|
* If the PTE disappeared temporarily due to a THP
|
||||||
* collapse, just return and let the guest try again.
|
* collapse, just return and let the guest try again.
|
||||||
*/
|
*/
|
||||||
if (!ptep) {
|
if (!pte_present(pte)) {
|
||||||
local_irq_enable();
|
|
||||||
if (page)
|
if (page)
|
||||||
put_page(page);
|
put_page(page);
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
}
|
}
|
||||||
pte = *ptep;
|
|
||||||
local_irq_enable();
|
|
||||||
hpa = pte_pfn(pte) << PAGE_SHIFT;
|
hpa = pte_pfn(pte) << PAGE_SHIFT;
|
||||||
pte_size = PAGE_SIZE;
|
pte_size = PAGE_SIZE;
|
||||||
if (shift)
|
if (shift)
|
||||||
|
@@ -815,18 +815,19 @@ int kvmppc_book3s_instantiate_page(struct kvm_vcpu *vcpu,
|
|||||||
*/
|
*/
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
ptep = __find_linux_pte(vcpu->arch.pgdir, hva, NULL, &shift);
|
ptep = __find_linux_pte(vcpu->arch.pgdir, hva, NULL, &shift);
|
||||||
|
pte = __pte(0);
|
||||||
|
if (ptep)
|
||||||
|
pte = *ptep;
|
||||||
|
local_irq_enable();
|
||||||
/*
|
/*
|
||||||
* If the PTE disappeared temporarily due to a THP
|
* If the PTE disappeared temporarily due to a THP
|
||||||
* collapse, just return and let the guest try again.
|
* collapse, just return and let the guest try again.
|
||||||
*/
|
*/
|
||||||
if (!ptep) {
|
if (!pte_present(pte)) {
|
||||||
local_irq_enable();
|
|
||||||
if (page)
|
if (page)
|
||||||
put_page(page);
|
put_page(page);
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
}
|
}
|
||||||
pte = *ptep;
|
|
||||||
local_irq_enable();
|
|
||||||
|
|
||||||
/* If we're logging dirty pages, always map single pages */
|
/* If we're logging dirty pages, always map single pages */
|
||||||
large_enable = !(memslot->flags & KVM_MEM_LOG_DIRTY_PAGES);
|
large_enable = !(memslot->flags & KVM_MEM_LOG_DIRTY_PAGES);
|
||||||
|
@@ -185,6 +185,7 @@ void mmu_mark_initmem_nx(void)
|
|||||||
mmu_mapin_ram_chunk(etext8, einittext8, PAGE_KERNEL);
|
mmu_mapin_ram_chunk(etext8, einittext8, PAGE_KERNEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_tlbil_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_STRICT_KERNEL_RWX
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||||
@@ -199,6 +200,8 @@ void mmu_mark_rodata_ro(void)
|
|||||||
~(LARGE_PAGE_SIZE_8M - 1)));
|
~(LARGE_PAGE_SIZE_8M - 1)));
|
||||||
mmu_patch_addis(&patch__dtlbmiss_romem_top, -__pa(_sinittext));
|
mmu_patch_addis(&patch__dtlbmiss_romem_top, -__pa(_sinittext));
|
||||||
|
|
||||||
|
_tlbil_all();
|
||||||
|
|
||||||
/* Update page tables for PTDUMP and BDI */
|
/* Update page tables for PTDUMP and BDI */
|
||||||
mmu_mapin_ram_chunk(0, sinittext, __pgprot(0));
|
mmu_mapin_ram_chunk(0, sinittext, __pgprot(0));
|
||||||
mmu_mapin_ram_chunk(0, etext, PAGE_KERNEL_ROX);
|
mmu_mapin_ram_chunk(0, etext, PAGE_KERNEL_ROX);
|
||||||
|
@@ -397,7 +397,7 @@ config PPC_KUAP
|
|||||||
|
|
||||||
config PPC_KUAP_DEBUG
|
config PPC_KUAP_DEBUG
|
||||||
bool "Extra debugging for Kernel Userspace Access Protection"
|
bool "Extra debugging for Kernel Userspace Access Protection"
|
||||||
depends on PPC_KUAP && (PPC_RADIX_MMU || PPC_32)
|
depends on PPC_KUAP && (PPC_RADIX_MMU || PPC32)
|
||||||
help
|
help
|
||||||
Add extra debugging for Kernel Userspace Access Protection (KUAP)
|
Add extra debugging for Kernel Userspace Access Protection (KUAP)
|
||||||
If you're unsure, say N.
|
If you're unsure, say N.
|
||||||
|
@@ -6,8 +6,6 @@
|
|||||||
|
|
||||||
#include <asm-generic/module.h>
|
#include <asm-generic/module.h>
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC "riscv"
|
|
||||||
|
|
||||||
struct module;
|
struct module;
|
||||||
unsigned long module_emit_got_entry(struct module *mod, unsigned long val);
|
unsigned long module_emit_got_entry(struct module *mod, unsigned long val);
|
||||||
unsigned long module_emit_plt_entry(struct module *mod, unsigned long val);
|
unsigned long module_emit_plt_entry(struct module *mod, unsigned long val);
|
||||||
|
9
arch/riscv/include/asm/vermagic.h
Normal file
9
arch/riscv/include/asm/vermagic.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/* Copyright (C) 2017 Andes Technology Corporation */
|
||||||
|
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC "riscv"
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -7,9 +7,7 @@
|
|||||||
#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
|
#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
|
||||||
int __bootdata_preserved(prot_virt_guest);
|
int __bootdata_preserved(prot_virt_guest);
|
||||||
#endif
|
#endif
|
||||||
#if IS_ENABLED(CONFIG_KVM)
|
|
||||||
struct uv_info __bootdata_preserved(uv_info);
|
struct uv_info __bootdata_preserved(uv_info);
|
||||||
#endif
|
|
||||||
|
|
||||||
void uv_query_info(void)
|
void uv_query_info(void)
|
||||||
{
|
{
|
||||||
|
@@ -133,7 +133,7 @@ void diag_stat_inc(enum diag_stat_enum nr)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(diag_stat_inc);
|
EXPORT_SYMBOL(diag_stat_inc);
|
||||||
|
|
||||||
void diag_stat_inc_norecursion(enum diag_stat_enum nr)
|
void notrace diag_stat_inc_norecursion(enum diag_stat_enum nr)
|
||||||
{
|
{
|
||||||
this_cpu_inc(diag_stat.counter[nr]);
|
this_cpu_inc(diag_stat.counter[nr]);
|
||||||
trace_s390_diagnose_norecursion(diag_map[nr].code);
|
trace_s390_diagnose_norecursion(diag_map[nr].code);
|
||||||
|
@@ -403,7 +403,7 @@ int smp_find_processor_id(u16 address)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool arch_vcpu_is_preempted(int cpu)
|
bool notrace arch_vcpu_is_preempted(int cpu)
|
||||||
{
|
{
|
||||||
if (test_cpu_flag_of(CIF_ENABLED_WAIT, cpu))
|
if (test_cpu_flag_of(CIF_ENABLED_WAIT, cpu))
|
||||||
return false;
|
return false;
|
||||||
@@ -413,7 +413,7 @@ bool arch_vcpu_is_preempted(int cpu)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(arch_vcpu_is_preempted);
|
EXPORT_SYMBOL(arch_vcpu_is_preempted);
|
||||||
|
|
||||||
void smp_yield_cpu(int cpu)
|
void notrace smp_yield_cpu(int cpu)
|
||||||
{
|
{
|
||||||
if (!MACHINE_HAS_DIAG9C)
|
if (!MACHINE_HAS_DIAG9C)
|
||||||
return;
|
return;
|
||||||
|
@@ -14,7 +14,7 @@ EXPORT_TRACEPOINT_SYMBOL(s390_diagnose);
|
|||||||
|
|
||||||
static DEFINE_PER_CPU(unsigned int, diagnose_trace_depth);
|
static DEFINE_PER_CPU(unsigned int, diagnose_trace_depth);
|
||||||
|
|
||||||
void trace_s390_diagnose_norecursion(int diag_nr)
|
void notrace trace_s390_diagnose_norecursion(int diag_nr)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int *depth;
|
unsigned int *depth;
|
||||||
|
@@ -23,10 +23,11 @@
|
|||||||
int __bootdata_preserved(prot_virt_guest);
|
int __bootdata_preserved(prot_virt_guest);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct uv_info __bootdata_preserved(uv_info);
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_KVM)
|
#if IS_ENABLED(CONFIG_KVM)
|
||||||
int prot_virt_host;
|
int prot_virt_host;
|
||||||
EXPORT_SYMBOL(prot_virt_host);
|
EXPORT_SYMBOL(prot_virt_host);
|
||||||
struct uv_info __bootdata_preserved(uv_info);
|
|
||||||
EXPORT_SYMBOL(uv_info);
|
EXPORT_SYMBOL(uv_info);
|
||||||
|
|
||||||
static int __init prot_virt_setup(char *val)
|
static int __init prot_virt_setup(char *val)
|
||||||
|
@@ -393,7 +393,7 @@ static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu)
|
|||||||
if (psw_mchk_disabled(vcpu))
|
if (psw_mchk_disabled(vcpu))
|
||||||
active_mask &= ~IRQ_PEND_MCHK_MASK;
|
active_mask &= ~IRQ_PEND_MCHK_MASK;
|
||||||
/* PV guest cpus can have a single interruption injected at a time. */
|
/* PV guest cpus can have a single interruption injected at a time. */
|
||||||
if (kvm_s390_pv_cpu_is_protected(vcpu) &&
|
if (kvm_s390_pv_cpu_get_handle(vcpu) &&
|
||||||
vcpu->arch.sie_block->iictl != IICTL_CODE_NONE)
|
vcpu->arch.sie_block->iictl != IICTL_CODE_NONE)
|
||||||
active_mask &= ~(IRQ_PEND_EXT_II_MASK |
|
active_mask &= ~(IRQ_PEND_EXT_II_MASK |
|
||||||
IRQ_PEND_IO_MASK |
|
IRQ_PEND_IO_MASK |
|
||||||
|
@@ -1939,6 +1939,9 @@ static int gfn_to_memslot_approx(struct kvm_memslots *slots, gfn_t gfn)
|
|||||||
start = slot + 1;
|
start = slot + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (start >= slots->used_slots)
|
||||||
|
return slots->used_slots - 1;
|
||||||
|
|
||||||
if (gfn >= memslots[start].base_gfn &&
|
if (gfn >= memslots[start].base_gfn &&
|
||||||
gfn < memslots[start].base_gfn + memslots[start].npages) {
|
gfn < memslots[start].base_gfn + memslots[start].npages) {
|
||||||
atomic_set(&slots->lru_slot, start);
|
atomic_set(&slots->lru_slot, start);
|
||||||
|
@@ -115,7 +115,6 @@ static struct irq_chip zpci_irq_chip = {
|
|||||||
.name = "PCI-MSI",
|
.name = "PCI-MSI",
|
||||||
.irq_unmask = pci_msi_unmask_irq,
|
.irq_unmask = pci_msi_unmask_irq,
|
||||||
.irq_mask = pci_msi_mask_irq,
|
.irq_mask = pci_msi_mask_irq,
|
||||||
.irq_set_affinity = zpci_set_irq_affinity,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void zpci_handle_cpu_local_irq(bool rescan)
|
static void zpci_handle_cpu_local_irq(bool rescan)
|
||||||
@@ -276,7 +275,9 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
|||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
if (hwirq - bit >= msi_vecs)
|
if (hwirq - bit >= msi_vecs)
|
||||||
break;
|
break;
|
||||||
irq = __irq_alloc_descs(-1, 0, 1, 0, THIS_MODULE, msi->affinity);
|
irq = __irq_alloc_descs(-1, 0, 1, 0, THIS_MODULE,
|
||||||
|
(irq_delivery == DIRECTED) ?
|
||||||
|
msi->affinity : NULL);
|
||||||
if (irq < 0)
|
if (irq < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
rc = irq_set_msi_desc(irq, msi);
|
rc = irq_set_msi_desc(irq, msi);
|
||||||
|
@@ -11,32 +11,4 @@ struct mod_arch_specific {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
|
||||||
# ifdef CONFIG_CPU_SH2
|
|
||||||
# define MODULE_PROC_FAMILY "SH2LE "
|
|
||||||
# elif defined CONFIG_CPU_SH3
|
|
||||||
# define MODULE_PROC_FAMILY "SH3LE "
|
|
||||||
# elif defined CONFIG_CPU_SH4
|
|
||||||
# define MODULE_PROC_FAMILY "SH4LE "
|
|
||||||
# elif defined CONFIG_CPU_SH5
|
|
||||||
# define MODULE_PROC_FAMILY "SH5LE "
|
|
||||||
# else
|
|
||||||
# error unknown processor family
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# ifdef CONFIG_CPU_SH2
|
|
||||||
# define MODULE_PROC_FAMILY "SH2BE "
|
|
||||||
# elif defined CONFIG_CPU_SH3
|
|
||||||
# define MODULE_PROC_FAMILY "SH3BE "
|
|
||||||
# elif defined CONFIG_CPU_SH4
|
|
||||||
# define MODULE_PROC_FAMILY "SH4BE "
|
|
||||||
# elif defined CONFIG_CPU_SH5
|
|
||||||
# define MODULE_PROC_FAMILY "SH5BE "
|
|
||||||
# else
|
|
||||||
# error unknown processor family
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
|
||||||
|
|
||||||
#endif /* _ASM_SH_MODULE_H */
|
#endif /* _ASM_SH_MODULE_H */
|
||||||
|
34
arch/sh/include/asm/vermagic.h
Normal file
34
arch/sh/include/asm/vermagic.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||||
|
# ifdef CONFIG_CPU_SH2
|
||||||
|
# define MODULE_PROC_FAMILY "SH2LE "
|
||||||
|
# elif defined CONFIG_CPU_SH3
|
||||||
|
# define MODULE_PROC_FAMILY "SH3LE "
|
||||||
|
# elif defined CONFIG_CPU_SH4
|
||||||
|
# define MODULE_PROC_FAMILY "SH4LE "
|
||||||
|
# elif defined CONFIG_CPU_SH5
|
||||||
|
# define MODULE_PROC_FAMILY "SH5LE "
|
||||||
|
# else
|
||||||
|
# error unknown processor family
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef CONFIG_CPU_SH2
|
||||||
|
# define MODULE_PROC_FAMILY "SH2BE "
|
||||||
|
# elif defined CONFIG_CPU_SH3
|
||||||
|
# define MODULE_PROC_FAMILY "SH3BE "
|
||||||
|
# elif defined CONFIG_CPU_SH4
|
||||||
|
# define MODULE_PROC_FAMILY "SH4BE "
|
||||||
|
# elif defined CONFIG_CPU_SH5
|
||||||
|
# define MODULE_PROC_FAMILY "SH5BE "
|
||||||
|
# else
|
||||||
|
# error unknown processor family
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -412,7 +412,7 @@ int arch_add_memory(int nid, u64 start, u64 size,
|
|||||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (WARN_ON_ONCE(params->pgprot.pgprot != PAGE_KERNEL.pgprot)
|
if (WARN_ON_ONCE(params->pgprot.pgprot != PAGE_KERNEL.pgprot))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* We only have ZONE_NORMAL, so this is easy.. */
|
/* We only have ZONE_NORMAL, so this is easy.. */
|
||||||
|
@@ -140,6 +140,7 @@ export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE)
|
|||||||
# When cleaning we don't include .config, so we don't include
|
# When cleaning we don't include .config, so we don't include
|
||||||
# TT or skas makefiles and don't clean skas_ptregs.h.
|
# TT or skas makefiles and don't clean skas_ptregs.h.
|
||||||
CLEAN_FILES += linux x.i gmon.out
|
CLEAN_FILES += linux x.i gmon.out
|
||||||
|
MRPROPER_DIRS += arch/$(SUBARCH)/include/generated
|
||||||
|
|
||||||
archclean:
|
archclean:
|
||||||
@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
|
@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
|
||||||
|
@@ -151,7 +151,7 @@ config X86
|
|||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
||||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD if X86_64
|
select HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD if X86_64
|
||||||
select HAVE_ARCH_USERFAULTFD_WP if USERFAULTFD
|
select HAVE_ARCH_USERFAULTFD_WP if X86_64 && USERFAULTFD
|
||||||
select HAVE_ARCH_VMAP_STACK if X86_64
|
select HAVE_ARCH_VMAP_STACK if X86_64
|
||||||
select HAVE_ARCH_WITHIN_STACK_FRAMES
|
select HAVE_ARCH_WITHIN_STACK_FRAMES
|
||||||
select HAVE_ASM_MODVERSIONS
|
select HAVE_ASM_MODVERSIONS
|
||||||
|
@@ -643,6 +643,7 @@ static const struct x86_cpu_id intel_cstates_match[] __initconst = {
|
|||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT_PLUS, &glm_cstates),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT_PLUS, &glm_cstates),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, &glm_cstates),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, &glm_cstates),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT, &glm_cstates),
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT, &glm_cstates),
|
||||||
|
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_L, &glm_cstates),
|
||||||
|
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_L, &icl_cstates),
|
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_L, &icl_cstates),
|
||||||
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE, &icl_cstates),
|
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE, &icl_cstates),
|
||||||
|
@@ -13,64 +13,4 @@ struct mod_arch_specific {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
/* X86_64 does not define MODULE_PROC_FAMILY */
|
|
||||||
#elif defined CONFIG_M486SX
|
|
||||||
#define MODULE_PROC_FAMILY "486SX "
|
|
||||||
#elif defined CONFIG_M486
|
|
||||||
#define MODULE_PROC_FAMILY "486 "
|
|
||||||
#elif defined CONFIG_M586
|
|
||||||
#define MODULE_PROC_FAMILY "586 "
|
|
||||||
#elif defined CONFIG_M586TSC
|
|
||||||
#define MODULE_PROC_FAMILY "586TSC "
|
|
||||||
#elif defined CONFIG_M586MMX
|
|
||||||
#define MODULE_PROC_FAMILY "586MMX "
|
|
||||||
#elif defined CONFIG_MCORE2
|
|
||||||
#define MODULE_PROC_FAMILY "CORE2 "
|
|
||||||
#elif defined CONFIG_MATOM
|
|
||||||
#define MODULE_PROC_FAMILY "ATOM "
|
|
||||||
#elif defined CONFIG_M686
|
|
||||||
#define MODULE_PROC_FAMILY "686 "
|
|
||||||
#elif defined CONFIG_MPENTIUMII
|
|
||||||
#define MODULE_PROC_FAMILY "PENTIUMII "
|
|
||||||
#elif defined CONFIG_MPENTIUMIII
|
|
||||||
#define MODULE_PROC_FAMILY "PENTIUMIII "
|
|
||||||
#elif defined CONFIG_MPENTIUMM
|
|
||||||
#define MODULE_PROC_FAMILY "PENTIUMM "
|
|
||||||
#elif defined CONFIG_MPENTIUM4
|
|
||||||
#define MODULE_PROC_FAMILY "PENTIUM4 "
|
|
||||||
#elif defined CONFIG_MK6
|
|
||||||
#define MODULE_PROC_FAMILY "K6 "
|
|
||||||
#elif defined CONFIG_MK7
|
|
||||||
#define MODULE_PROC_FAMILY "K7 "
|
|
||||||
#elif defined CONFIG_MK8
|
|
||||||
#define MODULE_PROC_FAMILY "K8 "
|
|
||||||
#elif defined CONFIG_MELAN
|
|
||||||
#define MODULE_PROC_FAMILY "ELAN "
|
|
||||||
#elif defined CONFIG_MCRUSOE
|
|
||||||
#define MODULE_PROC_FAMILY "CRUSOE "
|
|
||||||
#elif defined CONFIG_MEFFICEON
|
|
||||||
#define MODULE_PROC_FAMILY "EFFICEON "
|
|
||||||
#elif defined CONFIG_MWINCHIPC6
|
|
||||||
#define MODULE_PROC_FAMILY "WINCHIPC6 "
|
|
||||||
#elif defined CONFIG_MWINCHIP3D
|
|
||||||
#define MODULE_PROC_FAMILY "WINCHIP3D "
|
|
||||||
#elif defined CONFIG_MCYRIXIII
|
|
||||||
#define MODULE_PROC_FAMILY "CYRIXIII "
|
|
||||||
#elif defined CONFIG_MVIAC3_2
|
|
||||||
#define MODULE_PROC_FAMILY "VIAC3-2 "
|
|
||||||
#elif defined CONFIG_MVIAC7
|
|
||||||
#define MODULE_PROC_FAMILY "VIAC7 "
|
|
||||||
#elif defined CONFIG_MGEODEGX1
|
|
||||||
#define MODULE_PROC_FAMILY "GEODEGX1 "
|
|
||||||
#elif defined CONFIG_MGEODE_LX
|
|
||||||
#define MODULE_PROC_FAMILY "GEODE "
|
|
||||||
#else
|
|
||||||
#error unknown processor family
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_MODULE_H */
|
#endif /* _ASM_X86_MODULE_H */
|
||||||
|
@@ -237,27 +237,6 @@ enum ssb_mitigation {
|
|||||||
extern char __indirect_thunk_start[];
|
extern char __indirect_thunk_start[];
|
||||||
extern char __indirect_thunk_end[];
|
extern char __indirect_thunk_end[];
|
||||||
|
|
||||||
/*
|
|
||||||
* On VMEXIT we must ensure that no RSB predictions learned in the guest
|
|
||||||
* can be followed in the host, by overwriting the RSB completely. Both
|
|
||||||
* retpoline and IBRS mitigations for Spectre v2 need this; only on future
|
|
||||||
* CPUs with IBRS_ALL *might* it be avoided.
|
|
||||||
*/
|
|
||||||
static inline void vmexit_fill_RSB(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_RETPOLINE
|
|
||||||
unsigned long loops;
|
|
||||||
|
|
||||||
asm volatile (ANNOTATE_NOSPEC_ALTERNATIVE
|
|
||||||
ALTERNATIVE("jmp 910f",
|
|
||||||
__stringify(__FILL_RETURN_BUFFER(%0, RSB_CLEAR_LOOPS, %1)),
|
|
||||||
X86_FEATURE_RETPOLINE)
|
|
||||||
"910:"
|
|
||||||
: "=r" (loops), ASM_CALL_CONSTRAINT
|
|
||||||
: : "memory" );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static __always_inline
|
static __always_inline
|
||||||
void alternative_msr_write(unsigned int msr, u64 val, unsigned int feature)
|
void alternative_msr_write(unsigned int msr, u64 val, unsigned int feature)
|
||||||
{
|
{
|
||||||
|
68
arch/x86/include/asm/vermagic.h
Normal file
68
arch/x86/include/asm/vermagic.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
|
||||||
|
#ifndef _ASM_VERMAGIC_H
|
||||||
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
/* X86_64 does not define MODULE_PROC_FAMILY */
|
||||||
|
#elif defined CONFIG_M486SX
|
||||||
|
#define MODULE_PROC_FAMILY "486SX "
|
||||||
|
#elif defined CONFIG_M486
|
||||||
|
#define MODULE_PROC_FAMILY "486 "
|
||||||
|
#elif defined CONFIG_M586
|
||||||
|
#define MODULE_PROC_FAMILY "586 "
|
||||||
|
#elif defined CONFIG_M586TSC
|
||||||
|
#define MODULE_PROC_FAMILY "586TSC "
|
||||||
|
#elif defined CONFIG_M586MMX
|
||||||
|
#define MODULE_PROC_FAMILY "586MMX "
|
||||||
|
#elif defined CONFIG_MCORE2
|
||||||
|
#define MODULE_PROC_FAMILY "CORE2 "
|
||||||
|
#elif defined CONFIG_MATOM
|
||||||
|
#define MODULE_PROC_FAMILY "ATOM "
|
||||||
|
#elif defined CONFIG_M686
|
||||||
|
#define MODULE_PROC_FAMILY "686 "
|
||||||
|
#elif defined CONFIG_MPENTIUMII
|
||||||
|
#define MODULE_PROC_FAMILY "PENTIUMII "
|
||||||
|
#elif defined CONFIG_MPENTIUMIII
|
||||||
|
#define MODULE_PROC_FAMILY "PENTIUMIII "
|
||||||
|
#elif defined CONFIG_MPENTIUMM
|
||||||
|
#define MODULE_PROC_FAMILY "PENTIUMM "
|
||||||
|
#elif defined CONFIG_MPENTIUM4
|
||||||
|
#define MODULE_PROC_FAMILY "PENTIUM4 "
|
||||||
|
#elif defined CONFIG_MK6
|
||||||
|
#define MODULE_PROC_FAMILY "K6 "
|
||||||
|
#elif defined CONFIG_MK7
|
||||||
|
#define MODULE_PROC_FAMILY "K7 "
|
||||||
|
#elif defined CONFIG_MK8
|
||||||
|
#define MODULE_PROC_FAMILY "K8 "
|
||||||
|
#elif defined CONFIG_MELAN
|
||||||
|
#define MODULE_PROC_FAMILY "ELAN "
|
||||||
|
#elif defined CONFIG_MCRUSOE
|
||||||
|
#define MODULE_PROC_FAMILY "CRUSOE "
|
||||||
|
#elif defined CONFIG_MEFFICEON
|
||||||
|
#define MODULE_PROC_FAMILY "EFFICEON "
|
||||||
|
#elif defined CONFIG_MWINCHIPC6
|
||||||
|
#define MODULE_PROC_FAMILY "WINCHIPC6 "
|
||||||
|
#elif defined CONFIG_MWINCHIP3D
|
||||||
|
#define MODULE_PROC_FAMILY "WINCHIP3D "
|
||||||
|
#elif defined CONFIG_MCYRIXIII
|
||||||
|
#define MODULE_PROC_FAMILY "CYRIXIII "
|
||||||
|
#elif defined CONFIG_MVIAC3_2
|
||||||
|
#define MODULE_PROC_FAMILY "VIAC3-2 "
|
||||||
|
#elif defined CONFIG_MVIAC7
|
||||||
|
#define MODULE_PROC_FAMILY "VIAC7 "
|
||||||
|
#elif defined CONFIG_MGEODEGX1
|
||||||
|
#define MODULE_PROC_FAMILY "GEODEGX1 "
|
||||||
|
#elif defined CONFIG_MGEODE_LX
|
||||||
|
#define MODULE_PROC_FAMILY "GEODE "
|
||||||
|
#else
|
||||||
|
#error unknown processor family
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
||||||
|
#else
|
||||||
|
# define MODULE_ARCH_VERMAGIC ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ASM_VERMAGIC_H */
|
@@ -147,7 +147,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
|||||||
*((volatile u32 *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) = 0;
|
*((volatile u32 *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_freq_invariance(void);
|
static void init_freq_invariance(bool secondary);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Report back to the Boot Processor during boot time or to the caller processor
|
* Report back to the Boot Processor during boot time or to the caller processor
|
||||||
@@ -185,7 +185,7 @@ static void smp_callin(void)
|
|||||||
*/
|
*/
|
||||||
set_cpu_sibling_map(raw_smp_processor_id());
|
set_cpu_sibling_map(raw_smp_processor_id());
|
||||||
|
|
||||||
init_freq_invariance();
|
init_freq_invariance(true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get our bogomips.
|
* Get our bogomips.
|
||||||
@@ -1341,7 +1341,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
set_sched_topology(x86_topology);
|
set_sched_topology(x86_topology);
|
||||||
|
|
||||||
set_cpu_sibling_map(0);
|
set_cpu_sibling_map(0);
|
||||||
init_freq_invariance();
|
init_freq_invariance(false);
|
||||||
smp_sanity_check();
|
smp_sanity_check();
|
||||||
|
|
||||||
switch (apic_intr_mode) {
|
switch (apic_intr_mode) {
|
||||||
@@ -1877,9 +1877,6 @@ static bool knl_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq,
|
|||||||
int err, i;
|
int err, i;
|
||||||
u64 msr;
|
u64 msr;
|
||||||
|
|
||||||
if (!x86_match_cpu(has_knl_turbo_ratio_limits))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
err = rdmsrl_safe(MSR_PLATFORM_INFO, base_freq);
|
err = rdmsrl_safe(MSR_PLATFORM_INFO, base_freq);
|
||||||
if (err)
|
if (err)
|
||||||
return false;
|
return false;
|
||||||
@@ -1945,18 +1942,23 @@ static bool skx_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq, int size)
|
|||||||
|
|
||||||
static bool core_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq)
|
static bool core_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq)
|
||||||
{
|
{
|
||||||
|
u64 msr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = rdmsrl_safe(MSR_PLATFORM_INFO, base_freq);
|
err = rdmsrl_safe(MSR_PLATFORM_INFO, base_freq);
|
||||||
if (err)
|
if (err)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
err = rdmsrl_safe(MSR_TURBO_RATIO_LIMIT, turbo_freq);
|
err = rdmsrl_safe(MSR_TURBO_RATIO_LIMIT, &msr);
|
||||||
if (err)
|
if (err)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*base_freq = (*base_freq >> 8) & 0xFF; /* max P state */
|
*base_freq = (*base_freq >> 8) & 0xFF; /* max P state */
|
||||||
*turbo_freq = (*turbo_freq >> 24) & 0xFF; /* 4C turbo */
|
*turbo_freq = (msr >> 24) & 0xFF; /* 4C turbo */
|
||||||
|
|
||||||
|
/* The CPU may have less than 4 cores */
|
||||||
|
if (!*turbo_freq)
|
||||||
|
*turbo_freq = msr & 0xFF; /* 1C turbo */
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1972,7 +1974,8 @@ static bool intel_set_max_freq_ratio(void)
|
|||||||
skx_set_max_freq_ratio(&base_freq, &turbo_freq, 1))
|
skx_set_max_freq_ratio(&base_freq, &turbo_freq, 1))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (knl_set_max_freq_ratio(&base_freq, &turbo_freq, 1))
|
if (x86_match_cpu(has_knl_turbo_ratio_limits) &&
|
||||||
|
knl_set_max_freq_ratio(&base_freq, &turbo_freq, 1))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (x86_match_cpu(has_skx_turbo_ratio_limits) &&
|
if (x86_match_cpu(has_skx_turbo_ratio_limits) &&
|
||||||
@@ -1985,13 +1988,22 @@ static bool intel_set_max_freq_ratio(void)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
/*
|
||||||
|
* Some hypervisors advertise X86_FEATURE_APERFMPERF
|
||||||
|
* but then fill all MSR's with zeroes.
|
||||||
|
*/
|
||||||
|
if (!base_freq) {
|
||||||
|
pr_debug("Couldn't determine cpu base frequency, necessary for scale-invariant accounting.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
arch_turbo_freq_ratio = div_u64(turbo_freq * SCHED_CAPACITY_SCALE,
|
arch_turbo_freq_ratio = div_u64(turbo_freq * SCHED_CAPACITY_SCALE,
|
||||||
base_freq);
|
base_freq);
|
||||||
arch_set_max_freq_ratio(turbo_disabled());
|
arch_set_max_freq_ratio(turbo_disabled());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_counter_refs(void *arg)
|
static void init_counter_refs(void)
|
||||||
{
|
{
|
||||||
u64 aperf, mperf;
|
u64 aperf, mperf;
|
||||||
|
|
||||||
@@ -2002,18 +2014,25 @@ static void init_counter_refs(void *arg)
|
|||||||
this_cpu_write(arch_prev_mperf, mperf);
|
this_cpu_write(arch_prev_mperf, mperf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_freq_invariance(void)
|
static void init_freq_invariance(bool secondary)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
if (smp_processor_id() != 0 || !boot_cpu_has(X86_FEATURE_APERFMPERF))
|
if (!boot_cpu_has(X86_FEATURE_APERFMPERF))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (secondary) {
|
||||||
|
if (static_branch_likely(&arch_scale_freq_key)) {
|
||||||
|
init_counter_refs();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||||
ret = intel_set_max_freq_ratio();
|
ret = intel_set_max_freq_ratio();
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
on_each_cpu(init_counter_refs, NULL, 1);
|
init_counter_refs();
|
||||||
static_branch_enable(&arch_scale_freq_key);
|
static_branch_enable(&arch_scale_freq_key);
|
||||||
} else {
|
} else {
|
||||||
pr_debug("Couldn't determine max cpu frequency, necessary for scale-invariant accounting.\n");
|
pr_debug("Couldn't determine max cpu frequency, necessary for scale-invariant accounting.\n");
|
||||||
|
@@ -3,6 +3,10 @@
|
|||||||
ccflags-y += -Iarch/x86/kvm
|
ccflags-y += -Iarch/x86/kvm
|
||||||
ccflags-$(CONFIG_KVM_WERROR) += -Werror
|
ccflags-$(CONFIG_KVM_WERROR) += -Werror
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_FRAME_POINTER),y)
|
||||||
|
OBJECT_FILES_NON_STANDARD_vmenter.o := y
|
||||||
|
endif
|
||||||
|
|
||||||
KVM := ../../../virt/kvm
|
KVM := ../../../virt/kvm
|
||||||
|
|
||||||
kvm-y += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o \
|
kvm-y += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o \
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/psp-sev.h>
|
#include <linux/psp-sev.h>
|
||||||
|
#include <linux/pagemap.h>
|
||||||
#include <linux/swap.h>
|
#include <linux/swap.h>
|
||||||
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
@@ -1117,7 +1118,7 @@ int __init sev_hardware_setup(void)
|
|||||||
/* Maximum number of encrypted guests supported simultaneously */
|
/* Maximum number of encrypted guests supported simultaneously */
|
||||||
max_sev_asid = cpuid_ecx(0x8000001F);
|
max_sev_asid = cpuid_ecx(0x8000001F);
|
||||||
|
|
||||||
if (!max_sev_asid)
|
if (!svm_sev_enabled())
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Minimum ASID value that should be used for SEV guest */
|
/* Minimum ASID value that should be used for SEV guest */
|
||||||
@@ -1156,6 +1157,9 @@ err:
|
|||||||
|
|
||||||
void sev_hardware_teardown(void)
|
void sev_hardware_teardown(void)
|
||||||
{
|
{
|
||||||
|
if (!svm_sev_enabled())
|
||||||
|
return;
|
||||||
|
|
||||||
bitmap_free(sev_asid_bitmap);
|
bitmap_free(sev_asid_bitmap);
|
||||||
bitmap_free(sev_reclaim_asid_bitmap);
|
bitmap_free(sev_reclaim_asid_bitmap);
|
||||||
|
|
||||||
|
@@ -3276,7 +3276,7 @@ static void svm_cancel_injection(struct kvm_vcpu *vcpu)
|
|||||||
svm_complete_interrupts(svm);
|
svm_complete_interrupts(svm);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool __svm_vcpu_run(unsigned long vmcb_pa, unsigned long *regs);
|
void __svm_vcpu_run(unsigned long vmcb_pa, unsigned long *regs);
|
||||||
|
|
||||||
static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
@@ -3330,13 +3330,8 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
|||||||
*/
|
*/
|
||||||
x86_spec_ctrl_set_guest(svm->spec_ctrl, svm->virt_spec_ctrl);
|
x86_spec_ctrl_set_guest(svm->spec_ctrl, svm->virt_spec_ctrl);
|
||||||
|
|
||||||
local_irq_enable();
|
|
||||||
|
|
||||||
__svm_vcpu_run(svm->vmcb_pa, (unsigned long *)&svm->vcpu.arch.regs);
|
__svm_vcpu_run(svm->vmcb_pa, (unsigned long *)&svm->vcpu.arch.regs);
|
||||||
|
|
||||||
/* Eliminate branch target predictions from guest mode */
|
|
||||||
vmexit_fill_RSB();
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
wrmsrl(MSR_GS_BASE, svm->host.gs_base);
|
wrmsrl(MSR_GS_BASE, svm->host.gs_base);
|
||||||
#else
|
#else
|
||||||
@@ -3366,8 +3361,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
reload_tss(vcpu);
|
reload_tss(vcpu);
|
||||||
|
|
||||||
local_irq_disable();
|
|
||||||
|
|
||||||
x86_spec_ctrl_restore_host(svm->spec_ctrl, svm->virt_spec_ctrl);
|
x86_spec_ctrl_restore_host(svm->spec_ctrl, svm->virt_spec_ctrl);
|
||||||
|
|
||||||
vcpu->arch.cr2 = svm->vmcb->save.cr2;
|
vcpu->arch.cr2 = svm->vmcb->save.cr2;
|
||||||
@@ -3411,7 +3404,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
mark_all_clean(svm->vmcb);
|
mark_all_clean(svm->vmcb);
|
||||||
}
|
}
|
||||||
STACK_FRAME_NON_STANDARD(svm_vcpu_run);
|
|
||||||
|
|
||||||
static void svm_load_mmu_pgd(struct kvm_vcpu *vcpu, unsigned long root)
|
static void svm_load_mmu_pgd(struct kvm_vcpu *vcpu, unsigned long root)
|
||||||
{
|
{
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
#include <asm/asm.h>
|
#include <asm/asm.h>
|
||||||
#include <asm/bitsperlong.h>
|
#include <asm/bitsperlong.h>
|
||||||
#include <asm/kvm_vcpu_regs.h>
|
#include <asm/kvm_vcpu_regs.h>
|
||||||
|
#include <asm/nospec-branch.h>
|
||||||
|
|
||||||
#define WORD_SIZE (BITS_PER_LONG / 8)
|
#define WORD_SIZE (BITS_PER_LONG / 8)
|
||||||
|
|
||||||
@@ -35,7 +36,6 @@
|
|||||||
*/
|
*/
|
||||||
SYM_FUNC_START(__svm_vcpu_run)
|
SYM_FUNC_START(__svm_vcpu_run)
|
||||||
push %_ASM_BP
|
push %_ASM_BP
|
||||||
mov %_ASM_SP, %_ASM_BP
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
push %r15
|
push %r15
|
||||||
push %r14
|
push %r14
|
||||||
@@ -78,6 +78,7 @@ SYM_FUNC_START(__svm_vcpu_run)
|
|||||||
pop %_ASM_AX
|
pop %_ASM_AX
|
||||||
|
|
||||||
/* Enter guest mode */
|
/* Enter guest mode */
|
||||||
|
sti
|
||||||
1: vmload %_ASM_AX
|
1: vmload %_ASM_AX
|
||||||
jmp 3f
|
jmp 3f
|
||||||
2: cmpb $0, kvm_rebooting
|
2: cmpb $0, kvm_rebooting
|
||||||
@@ -99,6 +100,13 @@ SYM_FUNC_START(__svm_vcpu_run)
|
|||||||
ud2
|
ud2
|
||||||
_ASM_EXTABLE(5b, 6b)
|
_ASM_EXTABLE(5b, 6b)
|
||||||
7:
|
7:
|
||||||
|
cli
|
||||||
|
|
||||||
|
#ifdef CONFIG_RETPOLINE
|
||||||
|
/* IMPORTANT: Stuff the RSB immediately after VM-Exit, before RET! */
|
||||||
|
FILL_RETURN_BUFFER %_ASM_AX, RSB_CLEAR_LOOPS, X86_FEATURE_RETPOLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
/* "POP" @regs to RAX. */
|
/* "POP" @regs to RAX. */
|
||||||
pop %_ASM_AX
|
pop %_ASM_AX
|
||||||
|
|
||||||
|
@@ -5533,8 +5533,25 @@ static bool nested_vmx_exit_handled_vmcs_access(struct kvm_vcpu *vcpu,
|
|||||||
return 1 & (b >> (field & 7));
|
return 1 & (b >> (field & 7));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool nested_vmx_exit_handled_mtf(struct vmcs12 *vmcs12)
|
||||||
|
{
|
||||||
|
u32 entry_intr_info = vmcs12->vm_entry_intr_info_field;
|
||||||
|
|
||||||
|
if (nested_cpu_has_mtf(vmcs12))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An MTF VM-exit may be injected into the guest by setting the
|
||||||
|
* interruption-type to 7 (other event) and the vector field to 0. Such
|
||||||
|
* is the case regardless of the 'monitor trap flag' VM-execution
|
||||||
|
* control.
|
||||||
|
*/
|
||||||
|
return entry_intr_info == (INTR_INFO_VALID_MASK
|
||||||
|
| INTR_TYPE_OTHER_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return 1 if we should exit from L2 to L1 to handle an exit, or 0 if we
|
* Return true if we should exit from L2 to L1 to handle an exit, or false if we
|
||||||
* should handle it ourselves in L0 (and then continue L2). Only call this
|
* should handle it ourselves in L0 (and then continue L2). Only call this
|
||||||
* when in is_guest_mode (L2).
|
* when in is_guest_mode (L2).
|
||||||
*/
|
*/
|
||||||
@@ -5633,7 +5650,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
|
|||||||
case EXIT_REASON_MWAIT_INSTRUCTION:
|
case EXIT_REASON_MWAIT_INSTRUCTION:
|
||||||
return nested_cpu_has(vmcs12, CPU_BASED_MWAIT_EXITING);
|
return nested_cpu_has(vmcs12, CPU_BASED_MWAIT_EXITING);
|
||||||
case EXIT_REASON_MONITOR_TRAP_FLAG:
|
case EXIT_REASON_MONITOR_TRAP_FLAG:
|
||||||
return nested_cpu_has_mtf(vmcs12);
|
return nested_vmx_exit_handled_mtf(vmcs12);
|
||||||
case EXIT_REASON_MONITOR_INSTRUCTION:
|
case EXIT_REASON_MONITOR_INSTRUCTION:
|
||||||
return nested_cpu_has(vmcs12, CPU_BASED_MONITOR_EXITING);
|
return nested_cpu_has(vmcs12, CPU_BASED_MONITOR_EXITING);
|
||||||
case EXIT_REASON_PAUSE_INSTRUCTION:
|
case EXIT_REASON_PAUSE_INSTRUCTION:
|
||||||
|
@@ -4572,7 +4572,7 @@ static int handle_rmode_exception(struct kvm_vcpu *vcpu,
|
|||||||
*/
|
*/
|
||||||
static void kvm_machine_check(void)
|
static void kvm_machine_check(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_X86_MCE) && defined(CONFIG_X86_64)
|
#if defined(CONFIG_X86_MCE)
|
||||||
struct pt_regs regs = {
|
struct pt_regs regs = {
|
||||||
.cs = 3, /* Fake ring 3 no matter what the guest ran on */
|
.cs = 3, /* Fake ring 3 no matter what the guest ran on */
|
||||||
.flags = X86_EFLAGS_IF,
|
.flags = X86_EFLAGS_IF,
|
||||||
|
@@ -3060,6 +3060,17 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||||||
case MSR_IA32_PERF_CTL:
|
case MSR_IA32_PERF_CTL:
|
||||||
case MSR_AMD64_DC_CFG:
|
case MSR_AMD64_DC_CFG:
|
||||||
case MSR_F15H_EX_CFG:
|
case MSR_F15H_EX_CFG:
|
||||||
|
/*
|
||||||
|
* Intel Sandy Bridge CPUs must support the RAPL (running average power
|
||||||
|
* limit) MSRs. Just return 0, as we do not want to expose the host
|
||||||
|
* data here. Do not conditionalize this on CPUID, as KVM does not do
|
||||||
|
* so for existing CPU-specific MSRs.
|
||||||
|
*/
|
||||||
|
case MSR_RAPL_POWER_UNIT:
|
||||||
|
case MSR_PP0_ENERGY_STATUS: /* Power plane 0 (core) */
|
||||||
|
case MSR_PP1_ENERGY_STATUS: /* Power plane 1 (graphics uncore) */
|
||||||
|
case MSR_PKG_ENERGY_STATUS: /* Total package */
|
||||||
|
case MSR_DRAM_ENERGY_STATUS: /* DRAM controller */
|
||||||
msr_info->data = 0;
|
msr_info->data = 0;
|
||||||
break;
|
break;
|
||||||
case MSR_F15H_PERF_CTL0 ... MSR_F15H_PERF_CTR5:
|
case MSR_F15H_PERF_CTL0 ... MSR_F15H_PERF_CTR5:
|
||||||
@@ -5049,10 +5060,13 @@ set_identity_unlock:
|
|||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
if (copy_from_user(&u.ps, argp, sizeof(u.ps)))
|
if (copy_from_user(&u.ps, argp, sizeof(u.ps)))
|
||||||
goto out;
|
goto out;
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
r = -ENXIO;
|
r = -ENXIO;
|
||||||
if (!kvm->arch.vpit)
|
if (!kvm->arch.vpit)
|
||||||
goto out;
|
goto set_pit_out;
|
||||||
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
||||||
|
set_pit_out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_GET_PIT2: {
|
case KVM_GET_PIT2: {
|
||||||
@@ -5072,10 +5086,13 @@ set_identity_unlock:
|
|||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
||||||
goto out;
|
goto out;
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
r = -ENXIO;
|
r = -ENXIO;
|
||||||
if (!kvm->arch.vpit)
|
if (!kvm->arch.vpit)
|
||||||
goto out;
|
goto set_pit2_out;
|
||||||
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
||||||
|
set_pit2_out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_REINJECT_CONTROL: {
|
case KVM_REINJECT_CONTROL: {
|
||||||
|
@@ -158,6 +158,19 @@ static bool is_ereg(u32 reg)
|
|||||||
BIT(BPF_REG_AX));
|
BIT(BPF_REG_AX));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* is_ereg_8l() == true if BPF register 'reg' is mapped to access x86-64
|
||||||
|
* lower 8-bit registers dil,sil,bpl,spl,r8b..r15b, which need extra byte
|
||||||
|
* of encoding. al,cl,dl,bl have simpler encoding.
|
||||||
|
*/
|
||||||
|
static bool is_ereg_8l(u32 reg)
|
||||||
|
{
|
||||||
|
return is_ereg(reg) ||
|
||||||
|
(1 << reg) & (BIT(BPF_REG_1) |
|
||||||
|
BIT(BPF_REG_2) |
|
||||||
|
BIT(BPF_REG_FP));
|
||||||
|
}
|
||||||
|
|
||||||
static bool is_axreg(u32 reg)
|
static bool is_axreg(u32 reg)
|
||||||
{
|
{
|
||||||
return reg == BPF_REG_0;
|
return reg == BPF_REG_0;
|
||||||
@@ -598,9 +611,8 @@ static void emit_stx(u8 **pprog, u32 size, u32 dst_reg, u32 src_reg, int off)
|
|||||||
switch (size) {
|
switch (size) {
|
||||||
case BPF_B:
|
case BPF_B:
|
||||||
/* Emit 'mov byte ptr [rax + off], al' */
|
/* Emit 'mov byte ptr [rax + off], al' */
|
||||||
if (is_ereg(dst_reg) || is_ereg(src_reg) ||
|
if (is_ereg(dst_reg) || is_ereg_8l(src_reg))
|
||||||
/* We have to add extra byte for x86 SIL, DIL regs */
|
/* Add extra byte for eregs or SIL,DIL,BPL in src_reg */
|
||||||
src_reg == BPF_REG_1 || src_reg == BPF_REG_2)
|
|
||||||
EMIT2(add_2mod(0x40, dst_reg, src_reg), 0x88);
|
EMIT2(add_2mod(0x40, dst_reg, src_reg), 0x88);
|
||||||
else
|
else
|
||||||
EMIT1(0x88);
|
EMIT1(0x88);
|
||||||
|
@@ -1847,14 +1847,16 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
|
|||||||
case BPF_B:
|
case BPF_B:
|
||||||
case BPF_H:
|
case BPF_H:
|
||||||
case BPF_W:
|
case BPF_W:
|
||||||
if (!bpf_prog->aux->verifier_zext)
|
if (bpf_prog->aux->verifier_zext)
|
||||||
break;
|
break;
|
||||||
if (dstk) {
|
if (dstk) {
|
||||||
EMIT3(0xC7, add_1reg(0x40, IA32_EBP),
|
EMIT3(0xC7, add_1reg(0x40, IA32_EBP),
|
||||||
STACK_VAR(dst_hi));
|
STACK_VAR(dst_hi));
|
||||||
EMIT(0x0, 4);
|
EMIT(0x0, 4);
|
||||||
} else {
|
} else {
|
||||||
EMIT3(0xC7, add_1reg(0xC0, dst_hi), 0);
|
/* xor dst_hi,dst_hi */
|
||||||
|
EMIT2(0x33,
|
||||||
|
add_2reg(0xC0, dst_hi, dst_hi));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BPF_DW:
|
case BPF_DW:
|
||||||
@@ -2013,8 +2015,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
|
|||||||
case BPF_JMP | BPF_JSET | BPF_X:
|
case BPF_JMP | BPF_JSET | BPF_X:
|
||||||
case BPF_JMP32 | BPF_JSET | BPF_X: {
|
case BPF_JMP32 | BPF_JSET | BPF_X: {
|
||||||
bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
|
bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
|
||||||
u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
|
u8 dreg_lo = IA32_EAX;
|
||||||
u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
|
u8 dreg_hi = IA32_EDX;
|
||||||
u8 sreg_lo = sstk ? IA32_ECX : src_lo;
|
u8 sreg_lo = sstk ? IA32_ECX : src_lo;
|
||||||
u8 sreg_hi = sstk ? IA32_EBX : src_hi;
|
u8 sreg_hi = sstk ? IA32_EBX : src_hi;
|
||||||
|
|
||||||
@@ -2026,6 +2028,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
|
|||||||
add_2reg(0x40, IA32_EBP,
|
add_2reg(0x40, IA32_EBP,
|
||||||
IA32_EDX),
|
IA32_EDX),
|
||||||
STACK_VAR(dst_hi));
|
STACK_VAR(dst_hi));
|
||||||
|
} else {
|
||||||
|
/* mov dreg_lo,dst_lo */
|
||||||
|
EMIT2(0x89, add_2reg(0xC0, dreg_lo, dst_lo));
|
||||||
|
if (is_jmp64)
|
||||||
|
/* mov dreg_hi,dst_hi */
|
||||||
|
EMIT2(0x89,
|
||||||
|
add_2reg(0xC0, dreg_hi, dst_hi));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sstk) {
|
if (sstk) {
|
||||||
@@ -2050,8 +2059,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
|
|||||||
case BPF_JMP | BPF_JSET | BPF_K:
|
case BPF_JMP | BPF_JSET | BPF_K:
|
||||||
case BPF_JMP32 | BPF_JSET | BPF_K: {
|
case BPF_JMP32 | BPF_JSET | BPF_K: {
|
||||||
bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
|
bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
|
||||||
u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
|
u8 dreg_lo = IA32_EAX;
|
||||||
u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
|
u8 dreg_hi = IA32_EDX;
|
||||||
u8 sreg_lo = IA32_ECX;
|
u8 sreg_lo = IA32_ECX;
|
||||||
u8 sreg_hi = IA32_EBX;
|
u8 sreg_hi = IA32_EBX;
|
||||||
u32 hi;
|
u32 hi;
|
||||||
@@ -2064,6 +2073,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
|
|||||||
add_2reg(0x40, IA32_EBP,
|
add_2reg(0x40, IA32_EBP,
|
||||||
IA32_EDX),
|
IA32_EDX),
|
||||||
STACK_VAR(dst_hi));
|
STACK_VAR(dst_hi));
|
||||||
|
} else {
|
||||||
|
/* mov dreg_lo,dst_lo */
|
||||||
|
EMIT2(0x89, add_2reg(0xC0, dreg_lo, dst_lo));
|
||||||
|
if (is_jmp64)
|
||||||
|
/* mov dreg_hi,dst_hi */
|
||||||
|
EMIT2(0x89,
|
||||||
|
add_2reg(0xC0, dreg_hi, dst_hi));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mov ecx,imm32 */
|
/* mov ecx,imm32 */
|
||||||
|
@@ -1,8 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* include/asm-xtensa/module.h
|
|
||||||
*
|
|
||||||
* This file contains the module code specific to the Xtensa architecture.
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
@@ -10,11 +6,12 @@
|
|||||||
* Copyright (C) 2001 - 2005 Tensilica Inc.
|
* Copyright (C) 2001 - 2005 Tensilica Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XTENSA_MODULE_H
|
#ifndef _ASM_VERMAGIC_H
|
||||||
#define _XTENSA_MODULE_H
|
#define _ASM_VERMAGIC_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
#include <variant/core.h>
|
||||||
|
|
||||||
#define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " "
|
#define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " "
|
||||||
|
|
||||||
#include <asm-generic/module.h>
|
#endif /* _ASM_VERMAGIC_H */
|
||||||
|
|
||||||
#endif /* _XTENSA_MODULE_H */
|
|
@@ -1591,7 +1591,7 @@ skip_surplus_transfers:
|
|||||||
vrate_min, vrate_max);
|
vrate_min, vrate_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_iocost_ioc_vrate_adj(ioc, vrate, &missed_ppm, rq_wait_pct,
|
trace_iocost_ioc_vrate_adj(ioc, vrate, missed_ppm, rq_wait_pct,
|
||||||
nr_lagging, nr_shortages,
|
nr_lagging, nr_shortages,
|
||||||
nr_surpluses);
|
nr_surpluses);
|
||||||
|
|
||||||
@@ -1600,7 +1600,7 @@ skip_surplus_transfers:
|
|||||||
ioc->period_us * vrate * INUSE_MARGIN_PCT, 100);
|
ioc->period_us * vrate * INUSE_MARGIN_PCT, 100);
|
||||||
} else if (ioc->busy_level != prev_busy_level || nr_lagging) {
|
} else if (ioc->busy_level != prev_busy_level || nr_lagging) {
|
||||||
trace_iocost_ioc_vrate_adj(ioc, atomic64_read(&ioc->vtime_rate),
|
trace_iocost_ioc_vrate_adj(ioc, atomic64_read(&ioc->vtime_rate),
|
||||||
&missed_ppm, rq_wait_pct, nr_lagging,
|
missed_ppm, rq_wait_pct, nr_lagging,
|
||||||
nr_shortages, nr_surpluses);
|
nr_shortages, nr_surpluses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -87,18 +87,6 @@ static const struct dmi_system_id dmi_lid_quirks[] = {
|
|||||||
},
|
},
|
||||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_DISABLED,
|
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_DISABLED,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Asus T200TA, _LID keeps reporting closed after every second
|
|
||||||
* openening of the lid. Causing immediate re-suspend after
|
|
||||||
* opening every other open. Using LID_INIT_OPEN fixes this.
|
|
||||||
*/
|
|
||||||
.matches = {
|
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "T200TA"),
|
|
||||||
},
|
|
||||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
/* GP-electronic T701, _LID method points to a floating GPIO */
|
/* GP-electronic T701, _LID method points to a floating GPIO */
|
||||||
.matches = {
|
.matches = {
|
||||||
|
@@ -322,10 +322,10 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
|
|||||||
resource->res.data.extended_irq.polarity =
|
resource->res.data.extended_irq.polarity =
|
||||||
link->irq.polarity;
|
link->irq.polarity;
|
||||||
if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
|
if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
|
||||||
resource->res.data.irq.shareable =
|
resource->res.data.extended_irq.shareable =
|
||||||
ACPI_EXCLUSIVE;
|
ACPI_EXCLUSIVE;
|
||||||
else
|
else
|
||||||
resource->res.data.irq.shareable = ACPI_SHARED;
|
resource->res.data.extended_irq.shareable = ACPI_SHARED;
|
||||||
resource->res.data.extended_irq.interrupt_count = 1;
|
resource->res.data.extended_irq.interrupt_count = 1;
|
||||||
resource->res.data.extended_irq.interrupts[0] = irq;
|
resource->res.data.extended_irq.interrupts[0] = irq;
|
||||||
/* ignore resource_source, it's optional */
|
/* ignore resource_source, it's optional */
|
||||||
|
@@ -145,7 +145,7 @@ enum {
|
|||||||
|
|
||||||
/* PORT_IDMA_CTL bits */
|
/* PORT_IDMA_CTL bits */
|
||||||
IDMA_CTL_RST_ATA = (1 << 2), /* hardreset ATA bus */
|
IDMA_CTL_RST_ATA = (1 << 2), /* hardreset ATA bus */
|
||||||
IDMA_CTL_RST_IDMA = (1 << 5), /* reset IDMA machinary */
|
IDMA_CTL_RST_IDMA = (1 << 5), /* reset IDMA machinery */
|
||||||
IDMA_CTL_GO = (1 << 7), /* IDMA mode go */
|
IDMA_CTL_GO = (1 << 7), /* IDMA mode go */
|
||||||
IDMA_CTL_ATA_NIEN = (1 << 8), /* ATA IRQ disable */
|
IDMA_CTL_ATA_NIEN = (1 << 8), /* ATA IRQ disable */
|
||||||
|
|
||||||
|
@@ -45,5 +45,4 @@ struct ctl_table firmware_config_table[] = {
|
|||||||
},
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(firmware_config_table);
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -731,7 +731,7 @@ static bool dpm_async_fn(struct device *dev, async_func_t func)
|
|||||||
|
|
||||||
if (is_async(dev)) {
|
if (is_async(dev)) {
|
||||||
get_device(dev);
|
get_device(dev);
|
||||||
async_schedule(func, dev);
|
async_schedule_dev(func, dev);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -85,26 +85,35 @@ struct nullb {
|
|||||||
char disk_name[DISK_NAME_LEN];
|
char disk_name[DISK_NAME_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
blk_status_t null_process_cmd(struct nullb_cmd *cmd,
|
||||||
|
enum req_opf op, sector_t sector,
|
||||||
|
unsigned int nr_sectors);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_ZONED
|
#ifdef CONFIG_BLK_DEV_ZONED
|
||||||
int null_zone_init(struct nullb_device *dev);
|
int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q);
|
||||||
void null_zone_exit(struct nullb_device *dev);
|
int null_register_zoned_dev(struct nullb *nullb);
|
||||||
|
void null_free_zoned_dev(struct nullb_device *dev);
|
||||||
int null_report_zones(struct gendisk *disk, sector_t sector,
|
int null_report_zones(struct gendisk *disk, sector_t sector,
|
||||||
unsigned int nr_zones, report_zones_cb cb, void *data);
|
unsigned int nr_zones, report_zones_cb cb, void *data);
|
||||||
blk_status_t null_handle_zoned(struct nullb_cmd *cmd,
|
blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd,
|
||||||
enum req_opf op, sector_t sector,
|
enum req_opf op, sector_t sector,
|
||||||
sector_t nr_sectors);
|
sector_t nr_sectors);
|
||||||
size_t null_zone_valid_read_len(struct nullb *nullb,
|
size_t null_zone_valid_read_len(struct nullb *nullb,
|
||||||
sector_t sector, unsigned int len);
|
sector_t sector, unsigned int len);
|
||||||
#else
|
#else
|
||||||
static inline int null_zone_init(struct nullb_device *dev)
|
static inline int null_init_zoned_dev(struct nullb_device *dev,
|
||||||
|
struct request_queue *q)
|
||||||
{
|
{
|
||||||
pr_err("CONFIG_BLK_DEV_ZONED not enabled\n");
|
pr_err("CONFIG_BLK_DEV_ZONED not enabled\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
static inline void null_zone_exit(struct nullb_device *dev) {}
|
static inline int null_register_zoned_dev(struct nullb *nullb)
|
||||||
static inline blk_status_t null_handle_zoned(struct nullb_cmd *cmd,
|
{
|
||||||
enum req_opf op, sector_t sector,
|
return -ENODEV;
|
||||||
sector_t nr_sectors)
|
}
|
||||||
|
static inline void null_free_zoned_dev(struct nullb_device *dev) {}
|
||||||
|
static inline blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd,
|
||||||
|
enum req_opf op, sector_t sector, sector_t nr_sectors)
|
||||||
{
|
{
|
||||||
return BLK_STS_NOTSUPP;
|
return BLK_STS_NOTSUPP;
|
||||||
}
|
}
|
||||||
|
@@ -580,7 +580,7 @@ static void null_free_dev(struct nullb_device *dev)
|
|||||||
if (!dev)
|
if (!dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
null_zone_exit(dev);
|
null_free_zoned_dev(dev);
|
||||||
badblocks_exit(&dev->badblocks);
|
badblocks_exit(&dev->badblocks);
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
}
|
}
|
||||||
@@ -1276,6 +1276,25 @@ static inline void nullb_complete_cmd(struct nullb_cmd *cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blk_status_t null_process_cmd(struct nullb_cmd *cmd,
|
||||||
|
enum req_opf op, sector_t sector,
|
||||||
|
unsigned int nr_sectors)
|
||||||
|
{
|
||||||
|
struct nullb_device *dev = cmd->nq->dev;
|
||||||
|
blk_status_t ret;
|
||||||
|
|
||||||
|
if (dev->badblocks.shift != -1) {
|
||||||
|
ret = null_handle_badblocks(cmd, sector, nr_sectors);
|
||||||
|
if (ret != BLK_STS_OK)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->memory_backed)
|
||||||
|
return null_handle_memory_backed(cmd, op);
|
||||||
|
|
||||||
|
return BLK_STS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static blk_status_t null_handle_cmd(struct nullb_cmd *cmd, sector_t sector,
|
static blk_status_t null_handle_cmd(struct nullb_cmd *cmd, sector_t sector,
|
||||||
sector_t nr_sectors, enum req_opf op)
|
sector_t nr_sectors, enum req_opf op)
|
||||||
{
|
{
|
||||||
@@ -1294,17 +1313,11 @@ static blk_status_t null_handle_cmd(struct nullb_cmd *cmd, sector_t sector,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nullb->dev->badblocks.shift != -1) {
|
if (dev->zoned)
|
||||||
cmd->error = null_handle_badblocks(cmd, sector, nr_sectors);
|
cmd->error = null_process_zoned_cmd(cmd, op,
|
||||||
if (cmd->error != BLK_STS_OK)
|
sector, nr_sectors);
|
||||||
goto out;
|
else
|
||||||
}
|
cmd->error = null_process_cmd(cmd, op, sector, nr_sectors);
|
||||||
|
|
||||||
if (dev->memory_backed)
|
|
||||||
cmd->error = null_handle_memory_backed(cmd, op);
|
|
||||||
|
|
||||||
if (!cmd->error && dev->zoned)
|
|
||||||
cmd->error = null_handle_zoned(cmd, op, sector, nr_sectors);
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
nullb_complete_cmd(cmd);
|
nullb_complete_cmd(cmd);
|
||||||
@@ -1605,19 +1618,12 @@ static int null_gendisk_register(struct nullb *nullb)
|
|||||||
disk->queue = nullb->q;
|
disk->queue = nullb->q;
|
||||||
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
|
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_ZONED
|
|
||||||
if (nullb->dev->zoned) {
|
if (nullb->dev->zoned) {
|
||||||
if (queue_is_mq(nullb->q)) {
|
int ret = null_register_zoned_dev(nullb);
|
||||||
int ret = blk_revalidate_disk_zones(disk);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
|
||||||
blk_queue_chunk_sectors(nullb->q,
|
|
||||||
nullb->dev->zone_size_sects);
|
|
||||||
nullb->q->nr_zones = blkdev_nr_zones(disk);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
add_disk(disk);
|
add_disk(disk);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1773,14 +1779,9 @@ static int null_add_dev(struct nullb_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dev->zoned) {
|
if (dev->zoned) {
|
||||||
rv = null_zone_init(dev);
|
rv = null_init_zoned_dev(dev, nullb->q);
|
||||||
if (rv)
|
if (rv)
|
||||||
goto out_cleanup_blk_queue;
|
goto out_cleanup_blk_queue;
|
||||||
|
|
||||||
nullb->q->limits.zoned = BLK_ZONED_HM;
|
|
||||||
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, nullb->q);
|
|
||||||
blk_queue_required_elevator_features(nullb->q,
|
|
||||||
ELEVATOR_F_ZBD_SEQ_WRITE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nullb->q->queuedata = nullb;
|
nullb->q->queuedata = nullb;
|
||||||
@@ -1809,8 +1810,7 @@ static int null_add_dev(struct nullb_device *dev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out_cleanup_zone:
|
out_cleanup_zone:
|
||||||
if (dev->zoned)
|
null_free_zoned_dev(dev);
|
||||||
null_zone_exit(dev);
|
|
||||||
out_cleanup_blk_queue:
|
out_cleanup_blk_queue:
|
||||||
blk_cleanup_queue(nullb->q);
|
blk_cleanup_queue(nullb->q);
|
||||||
out_cleanup_tags:
|
out_cleanup_tags:
|
||||||
|
@@ -13,7 +13,7 @@ static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
|
|||||||
return sect >> ilog2(dev->zone_size_sects);
|
return sect >> ilog2(dev->zone_size_sects);
|
||||||
}
|
}
|
||||||
|
|
||||||
int null_zone_init(struct nullb_device *dev)
|
int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
|
||||||
{
|
{
|
||||||
sector_t dev_size = (sector_t)dev->size * 1024 * 1024;
|
sector_t dev_size = (sector_t)dev->size * 1024 * 1024;
|
||||||
sector_t sector = 0;
|
sector_t sector = 0;
|
||||||
@@ -61,10 +61,27 @@ int null_zone_init(struct nullb_device *dev)
|
|||||||
sector += dev->zone_size_sects;
|
sector += dev->zone_size_sects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
q->limits.zoned = BLK_ZONED_HM;
|
||||||
|
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
|
||||||
|
blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void null_zone_exit(struct nullb_device *dev)
|
int null_register_zoned_dev(struct nullb *nullb)
|
||||||
|
{
|
||||||
|
struct request_queue *q = nullb->q;
|
||||||
|
|
||||||
|
if (queue_is_mq(q))
|
||||||
|
return blk_revalidate_disk_zones(nullb->disk);
|
||||||
|
|
||||||
|
blk_queue_chunk_sectors(q, nullb->dev->zone_size_sects);
|
||||||
|
q->nr_zones = blkdev_nr_zones(nullb->disk);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void null_free_zoned_dev(struct nullb_device *dev)
|
||||||
{
|
{
|
||||||
kvfree(dev->zones);
|
kvfree(dev->zones);
|
||||||
}
|
}
|
||||||
@@ -126,11 +143,16 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
|
|||||||
struct nullb_device *dev = cmd->nq->dev;
|
struct nullb_device *dev = cmd->nq->dev;
|
||||||
unsigned int zno = null_zone_no(dev, sector);
|
unsigned int zno = null_zone_no(dev, sector);
|
||||||
struct blk_zone *zone = &dev->zones[zno];
|
struct blk_zone *zone = &dev->zones[zno];
|
||||||
|
blk_status_t ret;
|
||||||
|
|
||||||
|
trace_nullb_zone_op(cmd, zno, zone->cond);
|
||||||
|
|
||||||
|
if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
|
||||||
|
return null_process_cmd(cmd, REQ_OP_WRITE, sector, nr_sectors);
|
||||||
|
|
||||||
switch (zone->cond) {
|
switch (zone->cond) {
|
||||||
case BLK_ZONE_COND_FULL:
|
case BLK_ZONE_COND_FULL:
|
||||||
/* Cannot write to a full zone */
|
/* Cannot write to a full zone */
|
||||||
cmd->error = BLK_STS_IOERR;
|
|
||||||
return BLK_STS_IOERR;
|
return BLK_STS_IOERR;
|
||||||
case BLK_ZONE_COND_EMPTY:
|
case BLK_ZONE_COND_EMPTY:
|
||||||
case BLK_ZONE_COND_IMP_OPEN:
|
case BLK_ZONE_COND_IMP_OPEN:
|
||||||
@@ -143,19 +165,18 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
|
|||||||
if (zone->cond != BLK_ZONE_COND_EXP_OPEN)
|
if (zone->cond != BLK_ZONE_COND_EXP_OPEN)
|
||||||
zone->cond = BLK_ZONE_COND_IMP_OPEN;
|
zone->cond = BLK_ZONE_COND_IMP_OPEN;
|
||||||
|
|
||||||
|
ret = null_process_cmd(cmd, REQ_OP_WRITE, sector, nr_sectors);
|
||||||
|
if (ret != BLK_STS_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
zone->wp += nr_sectors;
|
zone->wp += nr_sectors;
|
||||||
if (zone->wp == zone->start + zone->len)
|
if (zone->wp == zone->start + zone->len)
|
||||||
zone->cond = BLK_ZONE_COND_FULL;
|
zone->cond = BLK_ZONE_COND_FULL;
|
||||||
break;
|
return BLK_STS_OK;
|
||||||
case BLK_ZONE_COND_NOT_WP:
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
/* Invalid zone condition */
|
/* Invalid zone condition */
|
||||||
return BLK_STS_IOERR;
|
return BLK_STS_IOERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_nullb_zone_op(cmd, zno, zone->cond);
|
|
||||||
return BLK_STS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static blk_status_t null_zone_mgmt(struct nullb_cmd *cmd, enum req_opf op,
|
static blk_status_t null_zone_mgmt(struct nullb_cmd *cmd, enum req_opf op,
|
||||||
@@ -216,8 +237,8 @@ static blk_status_t null_zone_mgmt(struct nullb_cmd *cmd, enum req_opf op,
|
|||||||
return BLK_STS_OK;
|
return BLK_STS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_status_t null_handle_zoned(struct nullb_cmd *cmd, enum req_opf op,
|
blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd, enum req_opf op,
|
||||||
sector_t sector, sector_t nr_sectors)
|
sector_t sector, sector_t nr_sectors)
|
||||||
{
|
{
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case REQ_OP_WRITE:
|
case REQ_OP_WRITE:
|
||||||
@@ -229,6 +250,6 @@ blk_status_t null_handle_zoned(struct nullb_cmd *cmd, enum req_opf op,
|
|||||||
case REQ_OP_ZONE_FINISH:
|
case REQ_OP_ZONE_FINISH:
|
||||||
return null_zone_mgmt(cmd, op, sector);
|
return null_zone_mgmt(cmd, op, sector);
|
||||||
default:
|
default:
|
||||||
return BLK_STS_OK;
|
return null_process_cmd(cmd, op, sector, nr_sectors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include <linux/blk-mq.h>
|
#include <linux/blk-mq.h>
|
||||||
#include <linux/blk-mq-virtio.h>
|
#include <linux/blk-mq-virtio.h>
|
||||||
#include <linux/numa.h>
|
#include <linux/numa.h>
|
||||||
|
#include <uapi/linux/virtio_ring.h>
|
||||||
|
|
||||||
#define PART_BITS 4
|
#define PART_BITS 4
|
||||||
#define VQ_NAME_LEN 16
|
#define VQ_NAME_LEN 16
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/virtio.h>
|
#include <linux/virtio.h>
|
||||||
#include <linux/virtio_rng.h>
|
#include <linux/virtio_rng.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
static DEFINE_IDA(rng_index_ida);
|
static DEFINE_IDA(rng_index_ida);
|
||||||
|
|
||||||
|
@@ -323,7 +323,7 @@ int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx,
|
|||||||
|
|
||||||
for (i = 0; i < chip->nr_allocated_banks; i++) {
|
for (i = 0; i < chip->nr_allocated_banks; i++) {
|
||||||
if (digests[i].alg_id != chip->allocated_banks[i].alg_id) {
|
if (digests[i].alg_id != chip->allocated_banks[i].alg_id) {
|
||||||
rc = EINVAL;
|
rc = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -681,6 +681,7 @@ out:
|
|||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(tpm2_get_cc_attrs_tbl);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tpm2_startup - turn on the TPM
|
* tpm2_startup - turn on the TPM
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2012 IBM Corporation
|
* Copyright (C) 2012-2020 IBM Corporation
|
||||||
*
|
*
|
||||||
* Author: Ashley Lai <ashleydlai@gmail.com>
|
* Author: Ashley Lai <ashleydlai@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -134,6 +134,64 @@ static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ibmvtpm_crq_send_init - Send a CRQ initialize message
|
||||||
|
* @ibmvtpm: vtpm device struct
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* 0 on success.
|
||||||
|
* Non-zero on failure.
|
||||||
|
*/
|
||||||
|
static int ibmvtpm_crq_send_init(struct ibmvtpm_dev *ibmvtpm)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = ibmvtpm_send_crq_word(ibmvtpm->vdev, INIT_CRQ_CMD);
|
||||||
|
if (rc != H_SUCCESS)
|
||||||
|
dev_err(ibmvtpm->dev,
|
||||||
|
"%s failed rc=%d\n", __func__, rc);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tpm_ibmvtpm_resume - Resume from suspend
|
||||||
|
*
|
||||||
|
* @dev: device struct
|
||||||
|
*
|
||||||
|
* Return: Always 0.
|
||||||
|
*/
|
||||||
|
static int tpm_ibmvtpm_resume(struct device *dev)
|
||||||
|
{
|
||||||
|
struct tpm_chip *chip = dev_get_drvdata(dev);
|
||||||
|
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (rc)
|
||||||
|
msleep(100);
|
||||||
|
rc = plpar_hcall_norets(H_ENABLE_CRQ,
|
||||||
|
ibmvtpm->vdev->unit_address);
|
||||||
|
} while (rc == H_IN_PROGRESS || rc == H_BUSY || H_IS_LONG_BUSY(rc));
|
||||||
|
|
||||||
|
if (rc) {
|
||||||
|
dev_err(dev, "Error enabling ibmvtpm rc=%d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = vio_enable_interrupts(ibmvtpm->vdev);
|
||||||
|
if (rc) {
|
||||||
|
dev_err(dev, "Error vio_enable_interrupts rc=%d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ibmvtpm_crq_send_init(ibmvtpm);
|
||||||
|
if (rc)
|
||||||
|
dev_err(dev, "Error send_init rc=%d\n", rc);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tpm_ibmvtpm_send() - Send a TPM command
|
* tpm_ibmvtpm_send() - Send a TPM command
|
||||||
* @chip: tpm chip struct
|
* @chip: tpm chip struct
|
||||||
@@ -147,6 +205,7 @@ static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||||||
static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
|
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
|
||||||
|
bool retry = true;
|
||||||
int rc, sig;
|
int rc, sig;
|
||||||
|
|
||||||
if (!ibmvtpm->rtce_buf) {
|
if (!ibmvtpm->rtce_buf) {
|
||||||
@@ -180,18 +239,27 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||||||
*/
|
*/
|
||||||
ibmvtpm->tpm_processing_cmd = true;
|
ibmvtpm->tpm_processing_cmd = true;
|
||||||
|
|
||||||
|
again:
|
||||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev,
|
rc = ibmvtpm_send_crq(ibmvtpm->vdev,
|
||||||
IBMVTPM_VALID_CMD, VTPM_TPM_COMMAND,
|
IBMVTPM_VALID_CMD, VTPM_TPM_COMMAND,
|
||||||
count, ibmvtpm->rtce_dma_handle);
|
count, ibmvtpm->rtce_dma_handle);
|
||||||
if (rc != H_SUCCESS) {
|
if (rc != H_SUCCESS) {
|
||||||
|
/*
|
||||||
|
* H_CLOSED can be returned after LPM resume. Call
|
||||||
|
* tpm_ibmvtpm_resume() to re-enable the CRQ then retry
|
||||||
|
* ibmvtpm_send_crq() once before failing.
|
||||||
|
*/
|
||||||
|
if (rc == H_CLOSED && retry) {
|
||||||
|
tpm_ibmvtpm_resume(ibmvtpm->dev);
|
||||||
|
retry = false;
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
|
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
|
||||||
rc = 0;
|
|
||||||
ibmvtpm->tpm_processing_cmd = false;
|
ibmvtpm->tpm_processing_cmd = false;
|
||||||
} else
|
}
|
||||||
rc = 0;
|
|
||||||
|
|
||||||
spin_unlock(&ibmvtpm->rtce_lock);
|
spin_unlock(&ibmvtpm->rtce_lock);
|
||||||
return rc;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tpm_ibmvtpm_cancel(struct tpm_chip *chip)
|
static void tpm_ibmvtpm_cancel(struct tpm_chip *chip)
|
||||||
@@ -269,26 +337,6 @@ static int ibmvtpm_crq_send_init_complete(struct ibmvtpm_dev *ibmvtpm)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* ibmvtpm_crq_send_init - Send a CRQ initialize message
|
|
||||||
* @ibmvtpm: vtpm device struct
|
|
||||||
*
|
|
||||||
* Return:
|
|
||||||
* 0 on success.
|
|
||||||
* Non-zero on failure.
|
|
||||||
*/
|
|
||||||
static int ibmvtpm_crq_send_init(struct ibmvtpm_dev *ibmvtpm)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = ibmvtpm_send_crq_word(ibmvtpm->vdev, INIT_CRQ_CMD);
|
|
||||||
if (rc != H_SUCCESS)
|
|
||||||
dev_err(ibmvtpm->dev,
|
|
||||||
"ibmvtpm_crq_send_init failed rc=%d\n", rc);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tpm_ibmvtpm_remove - ibm vtpm remove entry point
|
* tpm_ibmvtpm_remove - ibm vtpm remove entry point
|
||||||
* @vdev: vio device struct
|
* @vdev: vio device struct
|
||||||
@@ -401,44 +449,6 @@ static int ibmvtpm_reset_crq(struct ibmvtpm_dev *ibmvtpm)
|
|||||||
ibmvtpm->crq_dma_handle, CRQ_RES_BUF_SIZE);
|
ibmvtpm->crq_dma_handle, CRQ_RES_BUF_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* tpm_ibmvtpm_resume - Resume from suspend
|
|
||||||
*
|
|
||||||
* @dev: device struct
|
|
||||||
*
|
|
||||||
* Return: Always 0.
|
|
||||||
*/
|
|
||||||
static int tpm_ibmvtpm_resume(struct device *dev)
|
|
||||||
{
|
|
||||||
struct tpm_chip *chip = dev_get_drvdata(dev);
|
|
||||||
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (rc)
|
|
||||||
msleep(100);
|
|
||||||
rc = plpar_hcall_norets(H_ENABLE_CRQ,
|
|
||||||
ibmvtpm->vdev->unit_address);
|
|
||||||
} while (rc == H_IN_PROGRESS || rc == H_BUSY || H_IS_LONG_BUSY(rc));
|
|
||||||
|
|
||||||
if (rc) {
|
|
||||||
dev_err(dev, "Error enabling ibmvtpm rc=%d\n", rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = vio_enable_interrupts(ibmvtpm->vdev);
|
|
||||||
if (rc) {
|
|
||||||
dev_err(dev, "Error vio_enable_interrupts rc=%d\n", rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = ibmvtpm_crq_send_init(ibmvtpm);
|
|
||||||
if (rc)
|
|
||||||
dev_err(dev, "Error send_init rc=%d\n", rc);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool tpm_ibmvtpm_req_canceled(struct tpm_chip *chip, u8 status)
|
static bool tpm_ibmvtpm_req_canceled(struct tpm_chip *chip, u8 status)
|
||||||
{
|
{
|
||||||
return (status == 0);
|
return (status == 0);
|
||||||
|
@@ -433,6 +433,9 @@ static void disable_interrupts(struct tpm_chip *chip)
|
|||||||
u32 intmask;
|
u32 intmask;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (priv->irq == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
rc = tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask);
|
rc = tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
intmask = 0;
|
intmask = 0;
|
||||||
@@ -1062,9 +1065,12 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
|
|||||||
if (irq) {
|
if (irq) {
|
||||||
tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED,
|
tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED,
|
||||||
irq);
|
irq);
|
||||||
if (!(chip->flags & TPM_CHIP_FLAG_IRQ))
|
if (!(chip->flags & TPM_CHIP_FLAG_IRQ)) {
|
||||||
dev_err(&chip->dev, FW_BUG
|
dev_err(&chip->dev, FW_BUG
|
||||||
"TPM interrupt not working, polling instead\n");
|
"TPM interrupt not working, polling instead\n");
|
||||||
|
|
||||||
|
disable_interrupts(chip);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
tpm_tis_probe_irq(chip, intmask);
|
tpm_tis_probe_irq(chip, intmask);
|
||||||
}
|
}
|
||||||
|
@@ -44,6 +44,7 @@ MODULE_PARM_DESC(base, "ACCES 104-QUAD-8 base addresses");
|
|||||||
* @base: base port address of the IIO device
|
* @base: base port address of the IIO device
|
||||||
*/
|
*/
|
||||||
struct quad8_iio {
|
struct quad8_iio {
|
||||||
|
struct mutex lock;
|
||||||
struct counter_device counter;
|
struct counter_device counter;
|
||||||
unsigned int fck_prescaler[QUAD8_NUM_COUNTERS];
|
unsigned int fck_prescaler[QUAD8_NUM_COUNTERS];
|
||||||
unsigned int preset[QUAD8_NUM_COUNTERS];
|
unsigned int preset[QUAD8_NUM_COUNTERS];
|
||||||
@@ -123,6 +124,8 @@ static int quad8_read_raw(struct iio_dev *indio_dev,
|
|||||||
/* Borrow XOR Carry effectively doubles count range */
|
/* Borrow XOR Carry effectively doubles count range */
|
||||||
*val = (borrow ^ carry) << 24;
|
*val = (borrow ^ carry) << 24;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Reset Byte Pointer; transfer Counter to Output Latch */
|
/* Reset Byte Pointer; transfer Counter to Output Latch */
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP | QUAD8_RLD_CNTR_OUT,
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP | QUAD8_RLD_CNTR_OUT,
|
||||||
base_offset + 1);
|
base_offset + 1);
|
||||||
@@ -130,6 +133,8 @@ static int quad8_read_raw(struct iio_dev *indio_dev,
|
|||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
*val |= (unsigned int)inb(base_offset) << (8 * i);
|
*val |= (unsigned int)inb(base_offset) << (8 * i);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
case IIO_CHAN_INFO_ENABLE:
|
case IIO_CHAN_INFO_ENABLE:
|
||||||
*val = priv->ab_enable[chan->channel];
|
*val = priv->ab_enable[chan->channel];
|
||||||
@@ -160,6 +165,8 @@ static int quad8_write_raw(struct iio_dev *indio_dev,
|
|||||||
if ((unsigned int)val > 0xFFFFFF)
|
if ((unsigned int)val > 0xFFFFFF)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Reset Byte Pointer */
|
/* Reset Byte Pointer */
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
|
||||||
|
|
||||||
@@ -183,12 +190,16 @@ static int quad8_write_raw(struct iio_dev *indio_dev,
|
|||||||
/* Reset Error flag */
|
/* Reset Error flag */
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_E, base_offset + 1);
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_E, base_offset + 1);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
case IIO_CHAN_INFO_ENABLE:
|
case IIO_CHAN_INFO_ENABLE:
|
||||||
/* only boolean values accepted */
|
/* only boolean values accepted */
|
||||||
if (val < 0 || val > 1)
|
if (val < 0 || val > 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->ab_enable[chan->channel] = val;
|
priv->ab_enable[chan->channel] = val;
|
||||||
|
|
||||||
ior_cfg = val | priv->preset_enable[chan->channel] << 1;
|
ior_cfg = val | priv->preset_enable[chan->channel] << 1;
|
||||||
@@ -196,11 +207,18 @@ static int quad8_write_raw(struct iio_dev *indio_dev,
|
|||||||
/* Load I/O control configuration */
|
/* Load I/O control configuration */
|
||||||
outb(QUAD8_CTR_IOR | ior_cfg, base_offset + 1);
|
outb(QUAD8_CTR_IOR | ior_cfg, base_offset + 1);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
case IIO_CHAN_INFO_SCALE:
|
case IIO_CHAN_INFO_SCALE:
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Quadrature scaling only available in quadrature mode */
|
/* Quadrature scaling only available in quadrature mode */
|
||||||
if (!priv->quadrature_mode[chan->channel] && (val2 || val != 1))
|
if (!priv->quadrature_mode[chan->channel] &&
|
||||||
|
(val2 || val != 1)) {
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Only three gain states (1, 0.5, 0.25) */
|
/* Only three gain states (1, 0.5, 0.25) */
|
||||||
if (val == 1 && !val2)
|
if (val == 1 && !val2)
|
||||||
@@ -214,11 +232,15 @@ static int quad8_write_raw(struct iio_dev *indio_dev,
|
|||||||
priv->quadrature_scale[chan->channel] = 2;
|
priv->quadrature_scale[chan->channel] = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,6 +277,8 @@ static ssize_t quad8_write_preset(struct iio_dev *indio_dev, uintptr_t private,
|
|||||||
if (preset > 0xFFFFFF)
|
if (preset > 0xFFFFFF)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->preset[chan->channel] = preset;
|
priv->preset[chan->channel] = preset;
|
||||||
|
|
||||||
/* Reset Byte Pointer */
|
/* Reset Byte Pointer */
|
||||||
@@ -264,6 +288,8 @@ static ssize_t quad8_write_preset(struct iio_dev *indio_dev, uintptr_t private,
|
|||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
outb(preset >> (8 * i), base_offset);
|
outb(preset >> (8 * i), base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,6 +319,8 @@ static ssize_t quad8_write_set_to_preset_on_index(struct iio_dev *indio_dev,
|
|||||||
/* Preset enable is active low in Input/Output Control register */
|
/* Preset enable is active low in Input/Output Control register */
|
||||||
preset_enable = !preset_enable;
|
preset_enable = !preset_enable;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->preset_enable[chan->channel] = preset_enable;
|
priv->preset_enable[chan->channel] = preset_enable;
|
||||||
|
|
||||||
ior_cfg = priv->ab_enable[chan->channel] |
|
ior_cfg = priv->ab_enable[chan->channel] |
|
||||||
@@ -301,6 +329,8 @@ static ssize_t quad8_write_set_to_preset_on_index(struct iio_dev *indio_dev,
|
|||||||
/* Load I/O control configuration to Input / Output Control Register */
|
/* Load I/O control configuration to Input / Output Control Register */
|
||||||
outb(QUAD8_CTR_IOR | ior_cfg, base_offset);
|
outb(QUAD8_CTR_IOR | ior_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,6 +388,8 @@ static int quad8_set_count_mode(struct iio_dev *indio_dev,
|
|||||||
unsigned int mode_cfg = cnt_mode << 1;
|
unsigned int mode_cfg = cnt_mode << 1;
|
||||||
const int base_offset = priv->base + 2 * chan->channel + 1;
|
const int base_offset = priv->base + 2 * chan->channel + 1;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->count_mode[chan->channel] = cnt_mode;
|
priv->count_mode[chan->channel] = cnt_mode;
|
||||||
|
|
||||||
/* Add quadrature mode configuration */
|
/* Add quadrature mode configuration */
|
||||||
@@ -367,6 +399,8 @@ static int quad8_set_count_mode(struct iio_dev *indio_dev,
|
|||||||
/* Load mode configuration to Counter Mode Register */
|
/* Load mode configuration to Counter Mode Register */
|
||||||
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,19 +428,26 @@ static int quad8_set_synchronous_mode(struct iio_dev *indio_dev,
|
|||||||
const struct iio_chan_spec *chan, unsigned int synchronous_mode)
|
const struct iio_chan_spec *chan, unsigned int synchronous_mode)
|
||||||
{
|
{
|
||||||
struct quad8_iio *const priv = iio_priv(indio_dev);
|
struct quad8_iio *const priv = iio_priv(indio_dev);
|
||||||
const unsigned int idr_cfg = synchronous_mode |
|
|
||||||
priv->index_polarity[chan->channel] << 1;
|
|
||||||
const int base_offset = priv->base + 2 * chan->channel + 1;
|
const int base_offset = priv->base + 2 * chan->channel + 1;
|
||||||
|
unsigned int idr_cfg = synchronous_mode;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
|
idr_cfg |= priv->index_polarity[chan->channel] << 1;
|
||||||
|
|
||||||
/* Index function must be non-synchronous in non-quadrature mode */
|
/* Index function must be non-synchronous in non-quadrature mode */
|
||||||
if (synchronous_mode && !priv->quadrature_mode[chan->channel])
|
if (synchronous_mode && !priv->quadrature_mode[chan->channel]) {
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
priv->synchronous_mode[chan->channel] = synchronous_mode;
|
priv->synchronous_mode[chan->channel] = synchronous_mode;
|
||||||
|
|
||||||
/* Load Index Control configuration to Index Control Register */
|
/* Load Index Control configuration to Index Control Register */
|
||||||
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,8 +475,12 @@ static int quad8_set_quadrature_mode(struct iio_dev *indio_dev,
|
|||||||
const struct iio_chan_spec *chan, unsigned int quadrature_mode)
|
const struct iio_chan_spec *chan, unsigned int quadrature_mode)
|
||||||
{
|
{
|
||||||
struct quad8_iio *const priv = iio_priv(indio_dev);
|
struct quad8_iio *const priv = iio_priv(indio_dev);
|
||||||
unsigned int mode_cfg = priv->count_mode[chan->channel] << 1;
|
|
||||||
const int base_offset = priv->base + 2 * chan->channel + 1;
|
const int base_offset = priv->base + 2 * chan->channel + 1;
|
||||||
|
unsigned int mode_cfg;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
|
mode_cfg = priv->count_mode[chan->channel] << 1;
|
||||||
|
|
||||||
if (quadrature_mode)
|
if (quadrature_mode)
|
||||||
mode_cfg |= (priv->quadrature_scale[chan->channel] + 1) << 3;
|
mode_cfg |= (priv->quadrature_scale[chan->channel] + 1) << 3;
|
||||||
@@ -453,6 +498,8 @@ static int quad8_set_quadrature_mode(struct iio_dev *indio_dev,
|
|||||||
/* Load mode configuration to Counter Mode Register */
|
/* Load mode configuration to Counter Mode Register */
|
||||||
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,15 +527,20 @@ static int quad8_set_index_polarity(struct iio_dev *indio_dev,
|
|||||||
const struct iio_chan_spec *chan, unsigned int index_polarity)
|
const struct iio_chan_spec *chan, unsigned int index_polarity)
|
||||||
{
|
{
|
||||||
struct quad8_iio *const priv = iio_priv(indio_dev);
|
struct quad8_iio *const priv = iio_priv(indio_dev);
|
||||||
const unsigned int idr_cfg = priv->synchronous_mode[chan->channel] |
|
|
||||||
index_polarity << 1;
|
|
||||||
const int base_offset = priv->base + 2 * chan->channel + 1;
|
const int base_offset = priv->base + 2 * chan->channel + 1;
|
||||||
|
unsigned int idr_cfg = index_polarity << 1;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
|
idr_cfg |= priv->synchronous_mode[chan->channel];
|
||||||
|
|
||||||
priv->index_polarity[chan->channel] = index_polarity;
|
priv->index_polarity[chan->channel] = index_polarity;
|
||||||
|
|
||||||
/* Load Index Control configuration to Index Control Register */
|
/* Load Index Control configuration to Index Control Register */
|
||||||
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,7 +641,7 @@ static int quad8_signal_read(struct counter_device *counter,
|
|||||||
static int quad8_count_read(struct counter_device *counter,
|
static int quad8_count_read(struct counter_device *counter,
|
||||||
struct counter_count *count, unsigned long *val)
|
struct counter_count *count, unsigned long *val)
|
||||||
{
|
{
|
||||||
const struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
const int base_offset = priv->base + 2 * count->id;
|
const int base_offset = priv->base + 2 * count->id;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
unsigned int borrow;
|
unsigned int borrow;
|
||||||
@@ -603,6 +655,8 @@ static int quad8_count_read(struct counter_device *counter,
|
|||||||
/* Borrow XOR Carry effectively doubles count range */
|
/* Borrow XOR Carry effectively doubles count range */
|
||||||
*val = (unsigned long)(borrow ^ carry) << 24;
|
*val = (unsigned long)(borrow ^ carry) << 24;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Reset Byte Pointer; transfer Counter to Output Latch */
|
/* Reset Byte Pointer; transfer Counter to Output Latch */
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP | QUAD8_RLD_CNTR_OUT,
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP | QUAD8_RLD_CNTR_OUT,
|
||||||
base_offset + 1);
|
base_offset + 1);
|
||||||
@@ -610,13 +664,15 @@ static int quad8_count_read(struct counter_device *counter,
|
|||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
*val |= (unsigned long)inb(base_offset) << (8 * i);
|
*val |= (unsigned long)inb(base_offset) << (8 * i);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int quad8_count_write(struct counter_device *counter,
|
static int quad8_count_write(struct counter_device *counter,
|
||||||
struct counter_count *count, unsigned long val)
|
struct counter_count *count, unsigned long val)
|
||||||
{
|
{
|
||||||
const struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
const int base_offset = priv->base + 2 * count->id;
|
const int base_offset = priv->base + 2 * count->id;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -624,6 +680,8 @@ static int quad8_count_write(struct counter_device *counter,
|
|||||||
if (val > 0xFFFFFF)
|
if (val > 0xFFFFFF)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Reset Byte Pointer */
|
/* Reset Byte Pointer */
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
|
||||||
|
|
||||||
@@ -647,6 +705,8 @@ static int quad8_count_write(struct counter_device *counter,
|
|||||||
/* Reset Error flag */
|
/* Reset Error flag */
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_E, base_offset + 1);
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_E, base_offset + 1);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -667,13 +727,13 @@ static enum counter_count_function quad8_count_functions_list[] = {
|
|||||||
static int quad8_function_get(struct counter_device *counter,
|
static int quad8_function_get(struct counter_device *counter,
|
||||||
struct counter_count *count, size_t *function)
|
struct counter_count *count, size_t *function)
|
||||||
{
|
{
|
||||||
const struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
const int id = count->id;
|
const int id = count->id;
|
||||||
const unsigned int quadrature_mode = priv->quadrature_mode[id];
|
|
||||||
const unsigned int scale = priv->quadrature_scale[id];
|
|
||||||
|
|
||||||
if (quadrature_mode)
|
mutex_lock(&priv->lock);
|
||||||
switch (scale) {
|
|
||||||
|
if (priv->quadrature_mode[id])
|
||||||
|
switch (priv->quadrature_scale[id]) {
|
||||||
case 0:
|
case 0:
|
||||||
*function = QUAD8_COUNT_FUNCTION_QUADRATURE_X1;
|
*function = QUAD8_COUNT_FUNCTION_QUADRATURE_X1;
|
||||||
break;
|
break;
|
||||||
@@ -687,6 +747,8 @@ static int quad8_function_get(struct counter_device *counter,
|
|||||||
else
|
else
|
||||||
*function = QUAD8_COUNT_FUNCTION_PULSE_DIRECTION;
|
*function = QUAD8_COUNT_FUNCTION_PULSE_DIRECTION;
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,10 +759,15 @@ static int quad8_function_set(struct counter_device *counter,
|
|||||||
const int id = count->id;
|
const int id = count->id;
|
||||||
unsigned int *const quadrature_mode = priv->quadrature_mode + id;
|
unsigned int *const quadrature_mode = priv->quadrature_mode + id;
|
||||||
unsigned int *const scale = priv->quadrature_scale + id;
|
unsigned int *const scale = priv->quadrature_scale + id;
|
||||||
unsigned int mode_cfg = priv->count_mode[id] << 1;
|
|
||||||
unsigned int *const synchronous_mode = priv->synchronous_mode + id;
|
unsigned int *const synchronous_mode = priv->synchronous_mode + id;
|
||||||
const unsigned int idr_cfg = priv->index_polarity[id] << 1;
|
|
||||||
const int base_offset = priv->base + 2 * id + 1;
|
const int base_offset = priv->base + 2 * id + 1;
|
||||||
|
unsigned int mode_cfg;
|
||||||
|
unsigned int idr_cfg;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
|
mode_cfg = priv->count_mode[id] << 1;
|
||||||
|
idr_cfg = priv->index_polarity[id] << 1;
|
||||||
|
|
||||||
if (function == QUAD8_COUNT_FUNCTION_PULSE_DIRECTION) {
|
if (function == QUAD8_COUNT_FUNCTION_PULSE_DIRECTION) {
|
||||||
*quadrature_mode = 0;
|
*quadrature_mode = 0;
|
||||||
@@ -736,6 +803,8 @@ static int quad8_function_set(struct counter_device *counter,
|
|||||||
/* Load mode configuration to Counter Mode Register */
|
/* Load mode configuration to Counter Mode Register */
|
||||||
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -852,15 +921,20 @@ static int quad8_index_polarity_set(struct counter_device *counter,
|
|||||||
{
|
{
|
||||||
struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
const size_t channel_id = signal->id - 16;
|
const size_t channel_id = signal->id - 16;
|
||||||
const unsigned int idr_cfg = priv->synchronous_mode[channel_id] |
|
|
||||||
index_polarity << 1;
|
|
||||||
const int base_offset = priv->base + 2 * channel_id + 1;
|
const int base_offset = priv->base + 2 * channel_id + 1;
|
||||||
|
unsigned int idr_cfg = index_polarity << 1;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
|
idr_cfg |= priv->synchronous_mode[channel_id];
|
||||||
|
|
||||||
priv->index_polarity[channel_id] = index_polarity;
|
priv->index_polarity[channel_id] = index_polarity;
|
||||||
|
|
||||||
/* Load Index Control configuration to Index Control Register */
|
/* Load Index Control configuration to Index Control Register */
|
||||||
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -887,19 +961,26 @@ static int quad8_synchronous_mode_set(struct counter_device *counter,
|
|||||||
{
|
{
|
||||||
struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
const size_t channel_id = signal->id - 16;
|
const size_t channel_id = signal->id - 16;
|
||||||
const unsigned int idr_cfg = synchronous_mode |
|
|
||||||
priv->index_polarity[channel_id] << 1;
|
|
||||||
const int base_offset = priv->base + 2 * channel_id + 1;
|
const int base_offset = priv->base + 2 * channel_id + 1;
|
||||||
|
unsigned int idr_cfg = synchronous_mode;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
|
idr_cfg |= priv->index_polarity[channel_id] << 1;
|
||||||
|
|
||||||
/* Index function must be non-synchronous in non-quadrature mode */
|
/* Index function must be non-synchronous in non-quadrature mode */
|
||||||
if (synchronous_mode && !priv->quadrature_mode[channel_id])
|
if (synchronous_mode && !priv->quadrature_mode[channel_id]) {
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
priv->synchronous_mode[channel_id] = synchronous_mode;
|
priv->synchronous_mode[channel_id] = synchronous_mode;
|
||||||
|
|
||||||
/* Load Index Control configuration to Index Control Register */
|
/* Load Index Control configuration to Index Control Register */
|
||||||
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
outb(QUAD8_CTR_IDR | idr_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -964,6 +1045,8 @@ static int quad8_count_mode_set(struct counter_device *counter,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->count_mode[count->id] = cnt_mode;
|
priv->count_mode[count->id] = cnt_mode;
|
||||||
|
|
||||||
/* Set count mode configuration value */
|
/* Set count mode configuration value */
|
||||||
@@ -976,6 +1059,8 @@ static int quad8_count_mode_set(struct counter_device *counter,
|
|||||||
/* Load mode configuration to Counter Mode Register */
|
/* Load mode configuration to Counter Mode Register */
|
||||||
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
outb(QUAD8_CTR_CMR | mode_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1017,6 +1102,8 @@ static ssize_t quad8_count_enable_write(struct counter_device *counter,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->ab_enable[count->id] = ab_enable;
|
priv->ab_enable[count->id] = ab_enable;
|
||||||
|
|
||||||
ior_cfg = ab_enable | priv->preset_enable[count->id] << 1;
|
ior_cfg = ab_enable | priv->preset_enable[count->id] << 1;
|
||||||
@@ -1024,6 +1111,8 @@ static ssize_t quad8_count_enable_write(struct counter_device *counter,
|
|||||||
/* Load I/O control configuration */
|
/* Load I/O control configuration */
|
||||||
outb(QUAD8_CTR_IOR | ior_cfg, base_offset + 1);
|
outb(QUAD8_CTR_IOR | ior_cfg, base_offset + 1);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1052,14 +1141,28 @@ static ssize_t quad8_count_preset_read(struct counter_device *counter,
|
|||||||
return sprintf(buf, "%u\n", priv->preset[count->id]);
|
return sprintf(buf, "%u\n", priv->preset[count->id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void quad8_preset_register_set(struct quad8_iio *quad8iio, int id,
|
||||||
|
unsigned int preset)
|
||||||
|
{
|
||||||
|
const unsigned int base_offset = quad8iio->base + 2 * id;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
quad8iio->preset[id] = preset;
|
||||||
|
|
||||||
|
/* Reset Byte Pointer */
|
||||||
|
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
|
||||||
|
|
||||||
|
/* Set Preset Register */
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
outb(preset >> (8 * i), base_offset);
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t quad8_count_preset_write(struct counter_device *counter,
|
static ssize_t quad8_count_preset_write(struct counter_device *counter,
|
||||||
struct counter_count *count, void *private, const char *buf, size_t len)
|
struct counter_count *count, void *private, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
const int base_offset = priv->base + 2 * count->id;
|
|
||||||
unsigned int preset;
|
unsigned int preset;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
|
||||||
|
|
||||||
ret = kstrtouint(buf, 0, &preset);
|
ret = kstrtouint(buf, 0, &preset);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -1069,14 +1172,11 @@ static ssize_t quad8_count_preset_write(struct counter_device *counter,
|
|||||||
if (preset > 0xFFFFFF)
|
if (preset > 0xFFFFFF)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
priv->preset[count->id] = preset;
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Reset Byte Pointer */
|
quad8_preset_register_set(priv, count->id, preset);
|
||||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
|
|
||||||
|
|
||||||
/* Set Preset Register */
|
mutex_unlock(&priv->lock);
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
outb(preset >> (8 * i), base_offset);
|
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
@@ -1084,15 +1184,20 @@ static ssize_t quad8_count_preset_write(struct counter_device *counter,
|
|||||||
static ssize_t quad8_count_ceiling_read(struct counter_device *counter,
|
static ssize_t quad8_count_ceiling_read(struct counter_device *counter,
|
||||||
struct counter_count *count, void *private, char *buf)
|
struct counter_count *count, void *private, char *buf)
|
||||||
{
|
{
|
||||||
const struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Range Limit and Modulo-N count modes use preset value as ceiling */
|
/* Range Limit and Modulo-N count modes use preset value as ceiling */
|
||||||
switch (priv->count_mode[count->id]) {
|
switch (priv->count_mode[count->id]) {
|
||||||
case 1:
|
case 1:
|
||||||
case 3:
|
case 3:
|
||||||
return quad8_count_preset_read(counter, count, private, buf);
|
mutex_unlock(&priv->lock);
|
||||||
|
return sprintf(buf, "%u\n", priv->preset[count->id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
/* By default 0x1FFFFFF (25 bits unsigned) is maximum count */
|
/* By default 0x1FFFFFF (25 bits unsigned) is maximum count */
|
||||||
return sprintf(buf, "33554431\n");
|
return sprintf(buf, "33554431\n");
|
||||||
}
|
}
|
||||||
@@ -1101,15 +1206,29 @@ static ssize_t quad8_count_ceiling_write(struct counter_device *counter,
|
|||||||
struct counter_count *count, void *private, const char *buf, size_t len)
|
struct counter_count *count, void *private, const char *buf, size_t len)
|
||||||
{
|
{
|
||||||
struct quad8_iio *const priv = counter->priv;
|
struct quad8_iio *const priv = counter->priv;
|
||||||
|
unsigned int ceiling;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = kstrtouint(buf, 0, &ceiling);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Only 24-bit values are supported */
|
||||||
|
if (ceiling > 0xFFFFFF)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
/* Range Limit and Modulo-N count modes use preset value as ceiling */
|
/* Range Limit and Modulo-N count modes use preset value as ceiling */
|
||||||
switch (priv->count_mode[count->id]) {
|
switch (priv->count_mode[count->id]) {
|
||||||
case 1:
|
case 1:
|
||||||
case 3:
|
case 3:
|
||||||
return quad8_count_preset_write(counter, count, private, buf,
|
quad8_preset_register_set(priv, count->id, ceiling);
|
||||||
len);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1137,6 +1256,8 @@ static ssize_t quad8_count_preset_enable_write(struct counter_device *counter,
|
|||||||
/* Preset enable is active low in Input/Output Control register */
|
/* Preset enable is active low in Input/Output Control register */
|
||||||
preset_enable = !preset_enable;
|
preset_enable = !preset_enable;
|
||||||
|
|
||||||
|
mutex_lock(&priv->lock);
|
||||||
|
|
||||||
priv->preset_enable[count->id] = preset_enable;
|
priv->preset_enable[count->id] = preset_enable;
|
||||||
|
|
||||||
ior_cfg = priv->ab_enable[count->id] | (unsigned int)preset_enable << 1;
|
ior_cfg = priv->ab_enable[count->id] | (unsigned int)preset_enable << 1;
|
||||||
@@ -1144,6 +1265,8 @@ static ssize_t quad8_count_preset_enable_write(struct counter_device *counter,
|
|||||||
/* Load I/O control configuration to Input / Output Control Register */
|
/* Load I/O control configuration to Input / Output Control Register */
|
||||||
outb(QUAD8_CTR_IOR | ior_cfg, base_offset);
|
outb(QUAD8_CTR_IOR | ior_cfg, base_offset);
|
||||||
|
|
||||||
|
mutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1429,6 +1552,9 @@ static int quad8_probe(struct device *dev, unsigned int id)
|
|||||||
quad8iio->counter.priv = quad8iio;
|
quad8iio->counter.priv = quad8iio;
|
||||||
quad8iio->base = base[id];
|
quad8iio->base = base[id];
|
||||||
|
|
||||||
|
/* Initialize mutex */
|
||||||
|
mutex_init(&quad8iio->lock);
|
||||||
|
|
||||||
/* Reset all counters and disable interrupt function */
|
/* Reset all counters and disable interrupt function */
|
||||||
outb(QUAD8_CHAN_OP_RESET_COUNTERS, base[id] + QUAD8_REG_CHAN_OP);
|
outb(QUAD8_CHAN_OP_RESET_COUNTERS, base[id] + QUAD8_REG_CHAN_OP);
|
||||||
/* Set initial configuration for all counters */
|
/* Set initial configuration for all counters */
|
||||||
|
@@ -120,12 +120,10 @@ out:
|
|||||||
static int chcr_ktls_update_connection_state(struct chcr_ktls_info *tx_info,
|
static int chcr_ktls_update_connection_state(struct chcr_ktls_info *tx_info,
|
||||||
int new_state)
|
int new_state)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* This function can be called from both rx (interrupt context) and tx
|
/* This function can be called from both rx (interrupt context) and tx
|
||||||
* queue contexts.
|
* queue contexts.
|
||||||
*/
|
*/
|
||||||
spin_lock_irqsave(&tx_info->lock, flags);
|
spin_lock_bh(&tx_info->lock);
|
||||||
switch (tx_info->connection_state) {
|
switch (tx_info->connection_state) {
|
||||||
case KTLS_CONN_CLOSED:
|
case KTLS_CONN_CLOSED:
|
||||||
tx_info->connection_state = new_state;
|
tx_info->connection_state = new_state;
|
||||||
@@ -169,7 +167,7 @@ static int chcr_ktls_update_connection_state(struct chcr_ktls_info *tx_info,
|
|||||||
pr_err("unknown KTLS connection state\n");
|
pr_err("unknown KTLS connection state\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&tx_info->lock, flags);
|
spin_unlock_bh(&tx_info->lock);
|
||||||
|
|
||||||
return tx_info->connection_state;
|
return tx_info->connection_state;
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@ config IMX_DSP
|
|||||||
|
|
||||||
config IMX_SCU
|
config IMX_SCU
|
||||||
bool "IMX SCU Protocol driver"
|
bool "IMX SCU Protocol driver"
|
||||||
depends on IMX_MBOX || COMPILE_TEST
|
depends on IMX_MBOX
|
||||||
help
|
help
|
||||||
The System Controller Firmware (SCFW) is a low-level system function
|
The System Controller Firmware (SCFW) is a low-level system function
|
||||||
which runs on a dedicated Cortex-M core to provide power, clock, and
|
which runs on a dedicated Cortex-M core to provide power, clock, and
|
||||||
@@ -24,6 +24,6 @@ config IMX_SCU
|
|||||||
|
|
||||||
config IMX_SCU_PD
|
config IMX_SCU_PD
|
||||||
bool "IMX SCU Power Domain driver"
|
bool "IMX SCU Power Domain driver"
|
||||||
depends on IMX_SCU || COMPILE_TEST
|
depends on IMX_SCU
|
||||||
help
|
help
|
||||||
The System Controller Firmware (SCFW) based power domain driver.
|
The System Controller Firmware (SCFW) based power domain driver.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user