Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -122,6 +122,7 @@ ForEachMacros:
|
|||||||
- 'drm_for_each_bridge_in_chain'
|
- 'drm_for_each_bridge_in_chain'
|
||||||
- 'drm_for_each_connector_iter'
|
- 'drm_for_each_connector_iter'
|
||||||
- 'drm_for_each_crtc'
|
- 'drm_for_each_crtc'
|
||||||
|
- 'drm_for_each_crtc_reverse'
|
||||||
- 'drm_for_each_encoder'
|
- 'drm_for_each_encoder'
|
||||||
- 'drm_for_each_encoder_mask'
|
- 'drm_for_each_encoder_mask'
|
||||||
- 'drm_for_each_fb'
|
- 'drm_for_each_fb'
|
||||||
@@ -203,14 +204,13 @@ ForEachMacros:
|
|||||||
- 'for_each_matching_node'
|
- 'for_each_matching_node'
|
||||||
- 'for_each_matching_node_and_match'
|
- 'for_each_matching_node_and_match'
|
||||||
- 'for_each_member'
|
- 'for_each_member'
|
||||||
- 'for_each_mem_region'
|
|
||||||
- 'for_each_memblock_type'
|
|
||||||
- 'for_each_memcg_cache_index'
|
- 'for_each_memcg_cache_index'
|
||||||
- 'for_each_mem_pfn_range'
|
- 'for_each_mem_pfn_range'
|
||||||
- '__for_each_mem_range'
|
- '__for_each_mem_range'
|
||||||
- 'for_each_mem_range'
|
- 'for_each_mem_range'
|
||||||
- '__for_each_mem_range_rev'
|
- '__for_each_mem_range_rev'
|
||||||
- 'for_each_mem_range_rev'
|
- 'for_each_mem_range_rev'
|
||||||
|
- 'for_each_mem_region'
|
||||||
- 'for_each_migratetype_order'
|
- 'for_each_migratetype_order'
|
||||||
- 'for_each_msi_entry'
|
- 'for_each_msi_entry'
|
||||||
- 'for_each_msi_entry_safe'
|
- 'for_each_msi_entry_safe'
|
||||||
@@ -276,10 +276,8 @@ ForEachMacros:
|
|||||||
- 'for_each_reserved_mem_range'
|
- 'for_each_reserved_mem_range'
|
||||||
- 'for_each_reserved_mem_region'
|
- 'for_each_reserved_mem_region'
|
||||||
- 'for_each_rtd_codec_dais'
|
- 'for_each_rtd_codec_dais'
|
||||||
- 'for_each_rtd_codec_dais_rollback'
|
|
||||||
- 'for_each_rtd_components'
|
- 'for_each_rtd_components'
|
||||||
- 'for_each_rtd_cpu_dais'
|
- 'for_each_rtd_cpu_dais'
|
||||||
- 'for_each_rtd_cpu_dais_rollback'
|
|
||||||
- 'for_each_rtd_dais'
|
- 'for_each_rtd_dais'
|
||||||
- 'for_each_set_bit'
|
- 'for_each_set_bit'
|
||||||
- 'for_each_set_bit_from'
|
- 'for_each_set_bit_from'
|
||||||
@@ -298,6 +296,7 @@ ForEachMacros:
|
|||||||
- '__for_each_thread'
|
- '__for_each_thread'
|
||||||
- 'for_each_thread'
|
- 'for_each_thread'
|
||||||
- 'for_each_unicast_dest_pgid'
|
- 'for_each_unicast_dest_pgid'
|
||||||
|
- 'for_each_vsi'
|
||||||
- 'for_each_wakeup_source'
|
- 'for_each_wakeup_source'
|
||||||
- 'for_each_zone'
|
- 'for_each_zone'
|
||||||
- 'for_each_zone_zonelist'
|
- 'for_each_zone_zonelist'
|
||||||
@@ -330,6 +329,7 @@ ForEachMacros:
|
|||||||
- 'hlist_for_each_entry_rcu_bh'
|
- 'hlist_for_each_entry_rcu_bh'
|
||||||
- 'hlist_for_each_entry_rcu_notrace'
|
- 'hlist_for_each_entry_rcu_notrace'
|
||||||
- 'hlist_for_each_entry_safe'
|
- 'hlist_for_each_entry_safe'
|
||||||
|
- 'hlist_for_each_entry_srcu'
|
||||||
- '__hlist_for_each_rcu'
|
- '__hlist_for_each_rcu'
|
||||||
- 'hlist_for_each_safe'
|
- 'hlist_for_each_safe'
|
||||||
- 'hlist_nulls_for_each_entry'
|
- 'hlist_nulls_for_each_entry'
|
||||||
@@ -378,6 +378,7 @@ ForEachMacros:
|
|||||||
- 'list_for_each_entry_safe_continue'
|
- 'list_for_each_entry_safe_continue'
|
||||||
- 'list_for_each_entry_safe_from'
|
- 'list_for_each_entry_safe_from'
|
||||||
- 'list_for_each_entry_safe_reverse'
|
- 'list_for_each_entry_safe_reverse'
|
||||||
|
- 'list_for_each_entry_srcu'
|
||||||
- 'list_for_each_prev'
|
- 'list_for_each_prev'
|
||||||
- 'list_for_each_prev_safe'
|
- 'list_for_each_prev_safe'
|
||||||
- 'list_for_each_safe'
|
- 'list_for_each_safe'
|
||||||
@@ -411,6 +412,8 @@ 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'
|
||||||
|
- 'pcl_for_each_chunk'
|
||||||
|
- 'pcl_for_each_segment'
|
||||||
- 'pcm_for_each_format'
|
- 'pcm_for_each_format'
|
||||||
- 'ping_portaddr_for_each_entry'
|
- 'ping_portaddr_for_each_entry'
|
||||||
- 'plist_for_each'
|
- 'plist_for_each'
|
||||||
|
|||||||
@@ -13,6 +13,22 @@ This file documents the driver for the Rockchip ISP1 that is part of RK3288
|
|||||||
and RK3399 SoCs. The driver is located under drivers/staging/media/rkisp1
|
and RK3399 SoCs. The driver is located under drivers/staging/media/rkisp1
|
||||||
and uses the Media-Controller API.
|
and uses the Media-Controller API.
|
||||||
|
|
||||||
|
Revisions
|
||||||
|
=========
|
||||||
|
|
||||||
|
There exist multiple smaller revisions to this ISP that got introduced in
|
||||||
|
later SoCs. Revisions can be found in the enum :c:type:`rkisp1_cif_isp_version`
|
||||||
|
in the UAPI and the revision of the ISP inside the running SoC can be read
|
||||||
|
in the field hw_revision of struct media_device_info as returned by
|
||||||
|
ioctl MEDIA_IOC_DEVICE_INFO.
|
||||||
|
|
||||||
|
Versions in use are:
|
||||||
|
|
||||||
|
- RKISP1_V10: used at least in rk3288 and rk3399
|
||||||
|
- RKISP1_V11: declared in the original vendor code, but not used
|
||||||
|
- RKISP1_V12: used at least in rk3326 and px30
|
||||||
|
- RKISP1_V13: used at least in rk1808
|
||||||
|
|
||||||
Topology
|
Topology
|
||||||
========
|
========
|
||||||
.. _rkisp1_topology_graph:
|
.. _rkisp1_topology_graph:
|
||||||
|
|||||||
@@ -100,6 +100,11 @@ Instruction Macros
|
|||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
This section covers ``SYM_FUNC_*`` and ``SYM_CODE_*`` enumerated above.
|
This section covers ``SYM_FUNC_*`` and ``SYM_CODE_*`` enumerated above.
|
||||||
|
|
||||||
|
``objtool`` requires that all code must be contained in an ELF symbol. Symbol
|
||||||
|
names that have a ``.L`` prefix do not emit symbol table entries. ``.L``
|
||||||
|
prefixed symbols can be used within a code region, but should be avoided for
|
||||||
|
denoting a range of code via ``SYM_*_START/END`` annotations.
|
||||||
|
|
||||||
* ``SYM_FUNC_START`` and ``SYM_FUNC_START_LOCAL`` are supposed to be **the
|
* ``SYM_FUNC_START`` and ``SYM_FUNC_START_LOCAL`` are supposed to be **the
|
||||||
most frequent markings**. They are used for functions with standard calling
|
most frequent markings**. They are used for functions with standard calling
|
||||||
conventions -- global and local. Like in C, they both align the functions to
|
conventions -- global and local. Like in C, they both align the functions to
|
||||||
|
|||||||
@@ -232,7 +232,6 @@ properties:
|
|||||||
by this cpu (see ./idle-states.yaml).
|
by this cpu (see ./idle-states.yaml).
|
||||||
|
|
||||||
capacity-dmips-mhz:
|
capacity-dmips-mhz:
|
||||||
$ref: '/schemas/types.yaml#/definitions/uint32'
|
|
||||||
description:
|
description:
|
||||||
u32 value representing CPU capacity (see ./cpu-capacity.txt) in
|
u32 value representing CPU capacity (see ./cpu-capacity.txt) in
|
||||||
DMIPS/MHz, relative to highest capacity-dmips-mhz
|
DMIPS/MHz, relative to highest capacity-dmips-mhz
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ Optional properties:
|
|||||||
documents on how to describe the way the sii902x device is
|
documents on how to describe the way the sii902x device is
|
||||||
connected to the rest of the audio system:
|
connected to the rest of the audio system:
|
||||||
Documentation/devicetree/bindings/sound/simple-card.yaml
|
Documentation/devicetree/bindings/sound/simple-card.yaml
|
||||||
Documentation/devicetree/bindings/sound/audio-graph-card.txt
|
Documentation/devicetree/bindings/sound/audio-graph-card.yaml
|
||||||
Note: In case of the audio-graph-card binding the used port
|
Note: In case of the audio-graph-card binding the used port
|
||||||
index should be 3.
|
index should be 3.
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ connected to.
|
|||||||
|
|
||||||
For a description of the display interface sink function blocks, see
|
For a description of the display interface sink function blocks, see
|
||||||
Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt and
|
Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt and
|
||||||
Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.txt.
|
Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.
|
||||||
|
|
||||||
Required properties (all function blocks):
|
Required properties (all function blocks):
|
||||||
- compatible: "mediatek,<chip>-disp-<function>", one of
|
- compatible: "mediatek,<chip>-disp-<function>", one of
|
||||||
@@ -61,7 +61,7 @@ Required properties (DMA function blocks):
|
|||||||
"mediatek,<chip>-disp-wdma"
|
"mediatek,<chip>-disp-wdma"
|
||||||
the supported chips are mt2701, mt8167 and mt8173.
|
the supported chips are mt2701, mt8167 and mt8173.
|
||||||
- larb: Should contain a phandle pointing to the local arbiter device as defined
|
- larb: Should contain a phandle pointing to the local arbiter device as defined
|
||||||
in Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
in Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||||
- iommus: Should point to the respective IOMMU block with master port as
|
- iommus: Should point to the respective IOMMU block with master port as
|
||||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||||
for details.
|
for details.
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ properties:
|
|||||||
wlf,micd-timeout-ms:
|
wlf,micd-timeout-ms:
|
||||||
description:
|
description:
|
||||||
Timeout for microphone detection, specified in milliseconds.
|
Timeout for microphone detection, specified in milliseconds.
|
||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
|
||||||
|
|
||||||
wlf,micd-force-micbias:
|
wlf,micd-force-micbias:
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ properties:
|
|||||||
description:
|
description:
|
||||||
This property controls the Accumulation Dead band which allows to set the
|
This property controls the Accumulation Dead band which allows to set the
|
||||||
level of current below which no accumulation takes place.
|
level of current below which no accumulation takes place.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
maximum: 255
|
maximum: 255
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
|
|||||||
@@ -73,8 +73,6 @@ properties:
|
|||||||
description: |
|
description: |
|
||||||
Temperature sensor trimming factor. It can be used to manually adjust the
|
Temperature sensor trimming factor. It can be used to manually adjust the
|
||||||
temperature measurements within 7.130 degrees Celsius.
|
temperature measurements within 7.130 degrees Celsius.
|
||||||
maxItems: 1
|
|
||||||
items:
|
|
||||||
default: 0
|
default: 0
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 7130
|
maximum: 7130
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ properties:
|
|||||||
ti,bus-range-microvolt:
|
ti,bus-range-microvolt:
|
||||||
description: |
|
description: |
|
||||||
This is the operating range of the bus voltage in microvolt
|
This is the operating range of the bus voltage in microvolt
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
enum: [16000000, 32000000]
|
enum: [16000000, 32000000]
|
||||||
default: 32000000
|
default: 32000000
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,9 @@ properties:
|
|||||||
|
|
||||||
i2c-gpio,delay-us:
|
i2c-gpio,delay-us:
|
||||||
description: delay between GPIO operations (may depend on each platform)
|
description: delay between GPIO operations (may depend on each platform)
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
i2c-gpio,timeout-ms:
|
i2c-gpio,timeout-ms:
|
||||||
description: timeout to get data
|
description: timeout to get data
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
# Deprecated properties, do not use in new device tree sources:
|
# Deprecated properties, do not use in new device tree sources:
|
||||||
gpios:
|
gpios:
|
||||||
|
|||||||
@@ -66,21 +66,18 @@ properties:
|
|||||||
default: 400000
|
default: 400000
|
||||||
|
|
||||||
i2c-sda-hold-time-ns:
|
i2c-sda-hold-time-ns:
|
||||||
maxItems: 1
|
|
||||||
description: |
|
description: |
|
||||||
The property should contain the SDA hold time in nanoseconds. This option
|
The property should contain the SDA hold time in nanoseconds. This option
|
||||||
is only supported in hardware blocks version 1.11a or newer or on
|
is only supported in hardware blocks version 1.11a or newer or on
|
||||||
Microsemi SoCs.
|
Microsemi SoCs.
|
||||||
|
|
||||||
i2c-scl-falling-time-ns:
|
i2c-scl-falling-time-ns:
|
||||||
maxItems: 1
|
|
||||||
description: |
|
description: |
|
||||||
The property should contain the SCL falling time in nanoseconds.
|
The property should contain the SCL falling time in nanoseconds.
|
||||||
This value is used to compute the tLOW period.
|
This value is used to compute the tLOW period.
|
||||||
default: 300
|
default: 300
|
||||||
|
|
||||||
i2c-sda-falling-time-ns:
|
i2c-sda-falling-time-ns:
|
||||||
maxItems: 1
|
|
||||||
description: |
|
description: |
|
||||||
The property should contain the SDA falling time in nanoseconds.
|
The property should contain the SDA falling time in nanoseconds.
|
||||||
This value is used to compute the tHIGH period.
|
This value is used to compute the tHIGH period.
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ properties:
|
|||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
bipolar:
|
bipolar:
|
||||||
description: see Documentation/devicetree/bindings/iio/adc/adc.txt
|
description: see Documentation/devicetree/bindings/iio/adc/adc.yaml
|
||||||
type: boolean
|
type: boolean
|
||||||
|
|
||||||
required:
|
required:
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ properties:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
shunt-resistor-micro-ohms:
|
shunt-resistor-micro-ohms:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: |
|
description: |
|
||||||
Value in micro Ohms of the shunt resistor connected between the RS+ and
|
Value in micro Ohms of the shunt resistor connected between the RS+ and
|
||||||
RS- inputs, across which the current is measured. Value needed to compute
|
RS- inputs, across which the current is measured. Value needed to compute
|
||||||
|
|||||||
@@ -246,7 +246,6 @@ patternProperties:
|
|||||||
Resolution (bits) to use for conversions:
|
Resolution (bits) to use for conversions:
|
||||||
- can be 6, 8, 10 or 12 on stm32f4
|
- can be 6, 8, 10 or 12 on stm32f4
|
||||||
- can be 8, 10, 12, 14 or 16 on stm32h7 and stm32mp1
|
- can be 8, 10, 12, 14 or 16 on stm32h7 and stm32mp1
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
st,adc-channels:
|
st,adc-channels:
|
||||||
description: |
|
description: |
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ properties:
|
|||||||
const: 1
|
const: 1
|
||||||
|
|
||||||
ti,channel0-current-microamp:
|
ti,channel0-current-microamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: Channel 0 current in uA.
|
description: Channel 0 current in uA.
|
||||||
enum:
|
enum:
|
||||||
- 0
|
- 0
|
||||||
@@ -51,7 +50,6 @@ properties:
|
|||||||
- 20
|
- 20
|
||||||
|
|
||||||
ti,channel3-current-microamp:
|
ti,channel3-current-microamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: Channel 3 current in uA.
|
description: Channel 3 current in uA.
|
||||||
enum:
|
enum:
|
||||||
- 0
|
- 0
|
||||||
|
|||||||
@@ -46,31 +46,42 @@ properties:
|
|||||||
two properties must be present:
|
two properties must be present:
|
||||||
|
|
||||||
adi,range-microvolt:
|
adi,range-microvolt:
|
||||||
$ref: /schemas/types.yaml#/definitions/int32-array
|
|
||||||
description: |
|
description: |
|
||||||
Voltage output range specified as <minimum, maximum>
|
Voltage output range specified as <minimum, maximum>
|
||||||
enum:
|
oneOf:
|
||||||
- [[0, 5000000]]
|
- items:
|
||||||
- [[0, 10000000]]
|
- const: 0
|
||||||
- [[-5000000, 5000000]]
|
- enum: [5000000, 10000000]
|
||||||
- [[-10000000, 10000000]]
|
- items:
|
||||||
|
- const: -5000000
|
||||||
|
- const: 5000000
|
||||||
|
- items:
|
||||||
|
- const: -10000000
|
||||||
|
- const: 10000000
|
||||||
|
|
||||||
adi,range-microamp:
|
adi,range-microamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/int32-array
|
|
||||||
description: |
|
description: |
|
||||||
Current output range specified as <minimum, maximum>
|
Current output range specified as <minimum, maximum>
|
||||||
enum:
|
oneOf:
|
||||||
- [[0, 20000]]
|
- items:
|
||||||
- [[0, 24000]]
|
- const: 0
|
||||||
- [[4, 24000]]
|
- enum: [20000, 24000]
|
||||||
- [[-20000, 20000]]
|
- items:
|
||||||
- [[-24000, 24000]]
|
- const: 4
|
||||||
- [[-1000, 22000]]
|
- const: 24000
|
||||||
|
- items:
|
||||||
|
- const: -20000
|
||||||
|
- const: 20000
|
||||||
|
- items:
|
||||||
|
- const: -24000
|
||||||
|
- const: 24000
|
||||||
|
- items:
|
||||||
|
- const: -1000
|
||||||
|
- const: 22000
|
||||||
|
|
||||||
reset-gpios: true
|
reset-gpios: true
|
||||||
|
|
||||||
adi,dc-dc-ilim-microamp:
|
adi,dc-dc-ilim-microamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
enum: [150000, 200000, 250000, 300000, 350000, 400000]
|
enum: [150000, 200000, 250000, 300000, 350000, 400000]
|
||||||
description: |
|
description: |
|
||||||
The dc-to-dc converter current limit.
|
The dc-to-dc converter current limit.
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ properties:
|
|||||||
description: Connected to ADC_RDY pin.
|
description: Connected to ADC_RDY pin.
|
||||||
|
|
||||||
maxim,led-current-microamp:
|
maxim,led-current-microamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 2
|
maxItems: 2
|
||||||
description: |
|
description: |
|
||||||
|
|||||||
@@ -70,11 +70,9 @@ properties:
|
|||||||
|
|
||||||
touchscreen-x-mm:
|
touchscreen-x-mm:
|
||||||
description: horizontal length in mm of the touchscreen
|
description: horizontal length in mm of the touchscreen
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
touchscreen-y-mm:
|
touchscreen-y-mm:
|
||||||
description: vertical length in mm of the touchscreen
|
description: vertical length in mm of the touchscreen
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
touchscreen-size-x: [ touchscreen-size-y ]
|
touchscreen-size-x: [ touchscreen-size-y ]
|
||||||
|
|||||||
111
Documentation/devicetree/bindings/leds/richtek,rt8515.yaml
Normal file
111
Documentation/devicetree/bindings/leds/richtek,rt8515.yaml
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/leds/richtek,rt8515.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Richtek RT8515 1.5A dual channel LED driver
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Linus Walleij <linus.walleij@linaro.org>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Richtek RT8515 is a dual channel (two mode) LED driver that
|
||||||
|
supports driving a white LED in flash or torch mode. The maximum
|
||||||
|
current for each mode is defined in hardware using two resistors
|
||||||
|
RFS and RTS.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: richtek,rt8515
|
||||||
|
|
||||||
|
enf-gpios:
|
||||||
|
maxItems: 1
|
||||||
|
description: A connection to the 'ENF' (enable flash) pin.
|
||||||
|
|
||||||
|
ent-gpios:
|
||||||
|
maxItems: 1
|
||||||
|
description: A connection to the 'ENT' (enable torch) pin.
|
||||||
|
|
||||||
|
richtek,rfs-ohms:
|
||||||
|
minimum: 7680
|
||||||
|
maximum: 367000
|
||||||
|
description: The resistance value of the RFS resistor. This
|
||||||
|
resistors limits the maximum flash current. This must be set
|
||||||
|
for the property flash-max-microamp to work, the RFS resistor
|
||||||
|
defines the range of the dimmer setting (brightness) of the
|
||||||
|
flash LED.
|
||||||
|
|
||||||
|
richtek,rts-ohms:
|
||||||
|
minimum: 7680
|
||||||
|
maximum: 367000
|
||||||
|
description: The resistance value of the RTS resistor. This
|
||||||
|
resistors limits the maximum torch current. This must be set
|
||||||
|
for the property torch-max-microamp to work, the RTS resistor
|
||||||
|
defines the range of the dimmer setting (brightness) of the
|
||||||
|
torch LED.
|
||||||
|
|
||||||
|
led:
|
||||||
|
type: object
|
||||||
|
$ref: common.yaml#
|
||||||
|
properties:
|
||||||
|
function: true
|
||||||
|
color: true
|
||||||
|
flash-max-timeout-us: true
|
||||||
|
|
||||||
|
flash-max-microamp:
|
||||||
|
maximum: 700000
|
||||||
|
description: The maximum current for flash mode
|
||||||
|
is hardwired to the component using the RFS resistor to
|
||||||
|
ground. The maximum hardware current setting is calculated
|
||||||
|
according to the formula Imax = 5500 / RFS. The lowest
|
||||||
|
allowed resistance value is 7.86 kOhm giving an absolute
|
||||||
|
maximum current of 700mA. By setting this attribute in
|
||||||
|
the device tree, you can further restrict the maximum
|
||||||
|
current below the hardware limit. This requires the RFS
|
||||||
|
to be defined as it defines the maximum range.
|
||||||
|
|
||||||
|
led-max-microamp:
|
||||||
|
maximum: 700000
|
||||||
|
description: The maximum current for torch mode
|
||||||
|
is hardwired to the component using the RTS resistor to
|
||||||
|
ground. The maximum hardware current setting is calculated
|
||||||
|
according to the formula Imax = 5500 / RTS. The lowest
|
||||||
|
allowed resistance value is 7.86 kOhm giving an absolute
|
||||||
|
maximum current of 700mA. By setting this attribute in
|
||||||
|
the device tree, you can further restrict the maximum
|
||||||
|
current below the hardware limit. This requires the RTS
|
||||||
|
to be defined as it defines the maximum range.
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- ent-gpios
|
||||||
|
- enf-gpios
|
||||||
|
- led
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/leds/common.h>
|
||||||
|
|
||||||
|
led-controller {
|
||||||
|
compatible = "richtek,rt8515";
|
||||||
|
enf-gpios = <&gpio4 12 GPIO_ACTIVE_HIGH>;
|
||||||
|
ent-gpios = <&gpio4 13 GPIO_ACTIVE_HIGH>;
|
||||||
|
richtek,rfs-ohms = <16000>;
|
||||||
|
richtek,rts-ohms = <100000>;
|
||||||
|
|
||||||
|
led {
|
||||||
|
function = LED_FUNCTION_FLASH;
|
||||||
|
color = <LED_COLOR_ID_WHITE>;
|
||||||
|
flash-max-timeout-us = <250000>;
|
||||||
|
flash-max-microamp = <150000>;
|
||||||
|
led-max-microamp = <25000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
||||||
@@ -16,7 +16,7 @@ Required properties:
|
|||||||
- power-domains: a phandle to the power domain, see
|
- power-domains: a phandle to the power domain, see
|
||||||
Documentation/devicetree/bindings/power/power_domain.txt for details.
|
Documentation/devicetree/bindings/power/power_domain.txt for details.
|
||||||
- mediatek,larb: must contain the local arbiters in the current Socs, see
|
- mediatek,larb: must contain the local arbiters in the current Socs, see
|
||||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||||
for details.
|
for details.
|
||||||
- iommus: should point to the respective IOMMU block with master port as
|
- iommus: should point to the respective IOMMU block with master port as
|
||||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Required properties:
|
|||||||
- power-domains: a phandle to the power domain, see
|
- power-domains: a phandle to the power domain, see
|
||||||
Documentation/devicetree/bindings/power/power_domain.txt for details.
|
Documentation/devicetree/bindings/power/power_domain.txt for details.
|
||||||
- mediatek,larb: must contain the local arbiters in the current SoCs, see
|
- mediatek,larb: must contain the local arbiters in the current SoCs, see
|
||||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||||
for details.
|
for details.
|
||||||
- iommus: should point to the respective IOMMU block with master port as
|
- iommus: should point to the respective IOMMU block with master port as
|
||||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Required properties (DMA function blocks, child node):
|
|||||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||||
for details.
|
for details.
|
||||||
- mediatek,larb: must contain the local arbiters in the current Socs, see
|
- mediatek,larb: must contain the local arbiters in the current Socs, see
|
||||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||||
for details.
|
for details.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|||||||
@@ -259,7 +259,6 @@ properties:
|
|||||||
waiting for I/O signalling and card power supply to be stable,
|
waiting for I/O signalling and card power supply to be stable,
|
||||||
regardless of whether pwrseq-simple is used. Default to 10ms if
|
regardless of whether pwrseq-simple is used. Default to 10ms if
|
||||||
no available.
|
no available.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
default: 10
|
default: 10
|
||||||
|
|
||||||
supports-cqe:
|
supports-cqe:
|
||||||
|
|||||||
@@ -41,13 +41,11 @@ properties:
|
|||||||
description:
|
description:
|
||||||
Delay in ms after powering the card and de-asserting the
|
Delay in ms after powering the card and de-asserting the
|
||||||
reset-gpios (if any).
|
reset-gpios (if any).
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
power-off-delay-us:
|
power-off-delay-us:
|
||||||
description:
|
description:
|
||||||
Delay in us after asserting the reset-gpios (if any)
|
Delay in us after asserting the reset-gpios (if any)
|
||||||
during power off of the card.
|
during power off of the card.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
|||||||
@@ -122,7 +122,6 @@ properties:
|
|||||||
such as flow control thresholds.
|
such as flow control thresholds.
|
||||||
|
|
||||||
rx-internal-delay-ps:
|
rx-internal-delay-ps:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: |
|
description: |
|
||||||
RGMII Receive Clock Delay defined in pico seconds.
|
RGMII Receive Clock Delay defined in pico seconds.
|
||||||
This is used for controllers that have configurable RX internal delays.
|
This is used for controllers that have configurable RX internal delays.
|
||||||
@@ -140,7 +139,6 @@ properties:
|
|||||||
is used for components that can have configurable fifo sizes.
|
is used for components that can have configurable fifo sizes.
|
||||||
|
|
||||||
tx-internal-delay-ps:
|
tx-internal-delay-ps:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: |
|
description: |
|
||||||
RGMII Transmit Clock Delay defined in pico seconds.
|
RGMII Transmit Clock Delay defined in pico seconds.
|
||||||
This is used for controllers that have configurable TX internal delays.
|
This is used for controllers that have configurable TX internal delays.
|
||||||
|
|||||||
@@ -212,7 +212,6 @@ properties:
|
|||||||
Triplet of delays. The 1st cell is reset pre-delay in micro
|
Triplet of delays. The 1st cell is reset pre-delay in micro
|
||||||
seconds. The 2nd cell is reset pulse in micro seconds. The 3rd
|
seconds. The 2nd cell is reset pulse in micro seconds. The 3rd
|
||||||
cell is reset post-delay in micro seconds.
|
cell is reset post-delay in micro seconds.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 3
|
maxItems: 3
|
||||||
|
|
||||||
|
|||||||
@@ -83,21 +83,18 @@ properties:
|
|||||||
for each of the battery capacity lookup table.
|
for each of the battery capacity lookup table.
|
||||||
|
|
||||||
operating-range-celsius:
|
operating-range-celsius:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
|
||||||
description: operating temperature range of a battery
|
description: operating temperature range of a battery
|
||||||
items:
|
items:
|
||||||
- description: minimum temperature at which battery can operate
|
- description: minimum temperature at which battery can operate
|
||||||
- description: maximum temperature at which battery can operate
|
- description: maximum temperature at which battery can operate
|
||||||
|
|
||||||
ambient-celsius:
|
ambient-celsius:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
|
||||||
description: safe range of ambient temperature
|
description: safe range of ambient temperature
|
||||||
items:
|
items:
|
||||||
- description: alert when ambient temperature is lower than this value
|
- description: alert when ambient temperature is lower than this value
|
||||||
- description: alert when ambient temperature is higher than this value
|
- description: alert when ambient temperature is higher than this value
|
||||||
|
|
||||||
alert-celsius:
|
alert-celsius:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
|
||||||
description: safe range of battery temperature
|
description: safe range of battery temperature
|
||||||
items:
|
items:
|
||||||
- description: alert when battery temperature is lower than this value
|
- description: alert when battery temperature is lower than this value
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ properties:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
input-current-limit-microamp:
|
input-current-limit-microamp:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description: Maximum input current in micro Amps.
|
description: Maximum input current in micro Amps.
|
||||||
minimum: 50000
|
minimum: 50000
|
||||||
maximum: 500000
|
maximum: 500000
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ properties:
|
|||||||
description: IRQ line information.
|
description: IRQ line information.
|
||||||
|
|
||||||
dlg,irq-polling-delay-passive-ms:
|
dlg,irq-polling-delay-passive-ms:
|
||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
|
||||||
minimum: 1000
|
minimum: 1000
|
||||||
maximum: 10000
|
maximum: 10000
|
||||||
description: |
|
description: |
|
||||||
|
|||||||
@@ -72,11 +72,9 @@ properties:
|
|||||||
|
|
||||||
startup-delay-us:
|
startup-delay-us:
|
||||||
description: startup time in microseconds
|
description: startup time in microseconds
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
off-on-delay-us:
|
off-on-delay-us:
|
||||||
description: off delay time in microseconds
|
description: off delay time in microseconds
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
|
|
||||||
enable-active-high:
|
enable-active-high:
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ properties:
|
|||||||
1: chargeable
|
1: chargeable
|
||||||
|
|
||||||
quartz-load-femtofarads:
|
quartz-load-femtofarads:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description:
|
description:
|
||||||
The capacitive load of the quartz(x-tal), expressed in femto
|
The capacitive load of the quartz(x-tal), expressed in femto
|
||||||
Farad (fF). The default value shall be listed (if optional),
|
Farad (fF). The default value shall be listed (if optional),
|
||||||
@@ -47,7 +46,6 @@ properties:
|
|||||||
deprecated: true
|
deprecated: true
|
||||||
|
|
||||||
trickle-resistor-ohms:
|
trickle-resistor-ohms:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description:
|
description:
|
||||||
Selected resistor for trickle charger. Should be given
|
Selected resistor for trickle charger. Should be given
|
||||||
if trickle charger should be enabled.
|
if trickle charger should be enabled.
|
||||||
|
|||||||
@@ -88,14 +88,12 @@ properties:
|
|||||||
description:
|
description:
|
||||||
Rate at which poll occurs when auto-poll is set.
|
Rate at which poll occurs when auto-poll is set.
|
||||||
default 100ms.
|
default 100ms.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
default: 100
|
default: 100
|
||||||
|
|
||||||
poll-timeout-ms:
|
poll-timeout-ms:
|
||||||
description:
|
description:
|
||||||
Poll timeout when auto-poll is set, default
|
Poll timeout when auto-poll is set, default
|
||||||
3000ms.
|
3000ms.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
default: 3000
|
default: 3000
|
||||||
|
|
||||||
required:
|
required:
|
||||||
|
|||||||
@@ -41,14 +41,12 @@ properties:
|
|||||||
values of 2k, 4k or 8k. If set to 0 it will be off. If this node is not
|
values of 2k, 4k or 8k. If set to 0 it will be off. If this node is not
|
||||||
mentioned or if the value is unknown, then micbias resistor is set to
|
mentioned or if the value is unknown, then micbias resistor is set to
|
||||||
4k.
|
4k.
|
||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
|
||||||
enum: [ 0, 2, 4, 8 ]
|
enum: [ 0, 2, 4, 8 ]
|
||||||
|
|
||||||
micbias-voltage-m-volts:
|
micbias-voltage-m-volts:
|
||||||
description: The bias voltage to be used in mVolts. The voltage can take
|
description: The bias voltage to be used in mVolts. The voltage can take
|
||||||
values from 1.25V to 3V by 250mV steps. If this node is not mentioned
|
values from 1.25V to 3V by 250mV steps. If this node is not mentioned
|
||||||
or the value is unknown, then the value is set to 1.25V.
|
or the value is unknown, then the value is set to 1.25V.
|
||||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
|
||||||
enum: [ 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000 ]
|
enum: [ 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000 ]
|
||||||
|
|
||||||
lrclk-strength:
|
lrclk-strength:
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ properties:
|
|||||||
reg:
|
reg:
|
||||||
description: module registers
|
description: module registers
|
||||||
|
|
||||||
|
ranges: true
|
||||||
|
|
||||||
power-domains:
|
power-domains:
|
||||||
description:
|
description:
|
||||||
PM domain provider node and an args specifier containing
|
PM domain provider node and an args specifier containing
|
||||||
@@ -62,6 +64,8 @@ properties:
|
|||||||
'#size-cells':
|
'#size-cells':
|
||||||
const: 2
|
const: 2
|
||||||
|
|
||||||
|
dma-coherent: true
|
||||||
|
|
||||||
patternProperties:
|
patternProperties:
|
||||||
"^usb@":
|
"^usb@":
|
||||||
type: object
|
type: object
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ properties:
|
|||||||
pattern: "^watchdog(@.*|-[0-9a-f])?$"
|
pattern: "^watchdog(@.*|-[0-9a-f])?$"
|
||||||
|
|
||||||
timeout-sec:
|
timeout-sec:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
description:
|
description:
|
||||||
Contains the watchdog timeout in seconds.
|
Contains the watchdog timeout in seconds.
|
||||||
|
|
||||||
|
|||||||
@@ -1196,7 +1196,7 @@ icmp_errors_use_inbound_ifaddr - BOOLEAN
|
|||||||
|
|
||||||
If non-zero, the message will be sent with the primary address of
|
If non-zero, the message will be sent with the primary address of
|
||||||
the interface that received the packet that caused the icmp error.
|
the interface that received the packet that caused the icmp error.
|
||||||
This is the behaviour network many administrators will expect from
|
This is the behaviour many network administrators will expect from
|
||||||
a router. And it can make debugging complicated network layouts
|
a router. And it can make debugging complicated network layouts
|
||||||
much easier.
|
much easier.
|
||||||
|
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 11
|
PATCHLEVEL = 11
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ static int node_offset(void *fdt, const char *node_path)
|
|||||||
{
|
{
|
||||||
int offset = fdt_path_offset(fdt, node_path);
|
int offset = fdt_path_offset(fdt, node_path);
|
||||||
if (offset == -FDT_ERR_NOTFOUND)
|
if (offset == -FDT_ERR_NOTFOUND)
|
||||||
offset = fdt_add_subnode(fdt, 0, node_path);
|
/* Add the node to root if not found, dropping the leading '/' */
|
||||||
|
offset = fdt_add_subnode(fdt, 0, node_path + 1);
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -247,9 +247,11 @@ static inline const void *__tag_set(const void *addr, u8 tag)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The linear kernel range starts at the bottom of the virtual address space.
|
* Check whether an arbitrary address is within the linear map, which
|
||||||
|
* lives in the [PAGE_OFFSET, PAGE_END) interval at the bottom of the
|
||||||
|
* kernel's TTBR1 address range.
|
||||||
*/
|
*/
|
||||||
#define __is_lm_address(addr) (((u64)(addr) & ~PAGE_OFFSET) < (PAGE_END - PAGE_OFFSET))
|
#define __is_lm_address(addr) (((u64)(addr) ^ PAGE_OFFSET) < (PAGE_END - PAGE_OFFSET))
|
||||||
|
|
||||||
#define __lm_to_phys(addr) (((addr) & ~PAGE_OFFSET) + PHYS_OFFSET)
|
#define __lm_to_phys(addr) (((addr) & ~PAGE_OFFSET) + PHYS_OFFSET)
|
||||||
#define __kimg_to_phys(addr) ((addr) - kimage_voffset)
|
#define __kimg_to_phys(addr) ((addr) - kimage_voffset)
|
||||||
|
|||||||
@@ -180,14 +180,19 @@ void notrace restore_interrupts(void)
|
|||||||
|
|
||||||
void replay_soft_interrupts(void)
|
void replay_soft_interrupts(void)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* We use local_paca rather than get_paca() to avoid all
|
|
||||||
* the debug_smp_processor_id() business in this low level
|
|
||||||
* function
|
|
||||||
*/
|
|
||||||
unsigned char happened = local_paca->irq_happened;
|
|
||||||
struct pt_regs regs;
|
struct pt_regs regs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Be careful here, calling these interrupt handlers can cause
|
||||||
|
* softirqs to be raised, which they may run when calling irq_exit,
|
||||||
|
* which will cause local_irq_enable() to be run, which can then
|
||||||
|
* recurse into this function. Don't keep any state across
|
||||||
|
* interrupt handler calls which may change underneath us.
|
||||||
|
*
|
||||||
|
* We use local_paca rather than get_paca() to avoid all the
|
||||||
|
* debug_smp_processor_id() business in this low level function.
|
||||||
|
*/
|
||||||
|
|
||||||
ppc_save_regs(®s);
|
ppc_save_regs(®s);
|
||||||
regs.softe = IRQS_ENABLED;
|
regs.softe = IRQS_ENABLED;
|
||||||
|
|
||||||
@@ -209,7 +214,7 @@ again:
|
|||||||
* This is a higher priority interrupt than the others, so
|
* This is a higher priority interrupt than the others, so
|
||||||
* replay it first.
|
* replay it first.
|
||||||
*/
|
*/
|
||||||
if (IS_ENABLED(CONFIG_PPC_BOOK3S) && (happened & PACA_IRQ_HMI)) {
|
if (IS_ENABLED(CONFIG_PPC_BOOK3S) && (local_paca->irq_happened & PACA_IRQ_HMI)) {
|
||||||
local_paca->irq_happened &= ~PACA_IRQ_HMI;
|
local_paca->irq_happened &= ~PACA_IRQ_HMI;
|
||||||
regs.trap = 0xe60;
|
regs.trap = 0xe60;
|
||||||
handle_hmi_exception(®s);
|
handle_hmi_exception(®s);
|
||||||
@@ -217,7 +222,7 @@ again:
|
|||||||
hard_irq_disable();
|
hard_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (happened & PACA_IRQ_DEC) {
|
if (local_paca->irq_happened & PACA_IRQ_DEC) {
|
||||||
local_paca->irq_happened &= ~PACA_IRQ_DEC;
|
local_paca->irq_happened &= ~PACA_IRQ_DEC;
|
||||||
regs.trap = 0x900;
|
regs.trap = 0x900;
|
||||||
timer_interrupt(®s);
|
timer_interrupt(®s);
|
||||||
@@ -225,7 +230,7 @@ again:
|
|||||||
hard_irq_disable();
|
hard_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (happened & PACA_IRQ_EE) {
|
if (local_paca->irq_happened & PACA_IRQ_EE) {
|
||||||
local_paca->irq_happened &= ~PACA_IRQ_EE;
|
local_paca->irq_happened &= ~PACA_IRQ_EE;
|
||||||
regs.trap = 0x500;
|
regs.trap = 0x500;
|
||||||
do_IRQ(®s);
|
do_IRQ(®s);
|
||||||
@@ -233,7 +238,7 @@ again:
|
|||||||
hard_irq_disable();
|
hard_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_PPC_DOORBELL) && (happened & PACA_IRQ_DBELL)) {
|
if (IS_ENABLED(CONFIG_PPC_DOORBELL) && (local_paca->irq_happened & PACA_IRQ_DBELL)) {
|
||||||
local_paca->irq_happened &= ~PACA_IRQ_DBELL;
|
local_paca->irq_happened &= ~PACA_IRQ_DBELL;
|
||||||
if (IS_ENABLED(CONFIG_PPC_BOOK3E))
|
if (IS_ENABLED(CONFIG_PPC_BOOK3E))
|
||||||
regs.trap = 0x280;
|
regs.trap = 0x280;
|
||||||
@@ -245,7 +250,7 @@ again:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Book3E does not support soft-masking PMI interrupts */
|
/* Book3E does not support soft-masking PMI interrupts */
|
||||||
if (IS_ENABLED(CONFIG_PPC_BOOK3S) && (happened & PACA_IRQ_PMI)) {
|
if (IS_ENABLED(CONFIG_PPC_BOOK3S) && (local_paca->irq_happened & PACA_IRQ_PMI)) {
|
||||||
local_paca->irq_happened &= ~PACA_IRQ_PMI;
|
local_paca->irq_happened &= ~PACA_IRQ_PMI;
|
||||||
regs.trap = 0xf00;
|
regs.trap = 0xf00;
|
||||||
performance_monitor_exception(®s);
|
performance_monitor_exception(®s);
|
||||||
@@ -253,8 +258,7 @@ again:
|
|||||||
hard_irq_disable();
|
hard_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
happened = local_paca->irq_happened;
|
if (local_paca->irq_happened & ~PACA_IRQ_HARD_DIS) {
|
||||||
if (happened & ~PACA_IRQ_HARD_DIS) {
|
|
||||||
/*
|
/*
|
||||||
* We are responding to the next interrupt, so interrupt-off
|
* We are responding to the next interrupt, so interrupt-off
|
||||||
* latencies should be reset here.
|
* latencies should be reset here.
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ void __init setup_bootmem(void)
|
|||||||
max_pfn = PFN_DOWN(dram_end);
|
max_pfn = PFN_DOWN(dram_end);
|
||||||
max_low_pfn = max_pfn;
|
max_low_pfn = max_pfn;
|
||||||
dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
|
dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
|
||||||
set_max_mapnr(max_low_pfn);
|
set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_INITRD
|
#ifdef CONFIG_BLK_DEV_INITRD
|
||||||
setup_initrd();
|
setup_initrd();
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ void uv_query_info(void)
|
|||||||
uv_info.guest_cpu_stor_len = uvcb.cpu_stor_len;
|
uv_info.guest_cpu_stor_len = uvcb.cpu_stor_len;
|
||||||
uv_info.max_sec_stor_addr = ALIGN(uvcb.max_guest_stor_addr, PAGE_SIZE);
|
uv_info.max_sec_stor_addr = ALIGN(uvcb.max_guest_stor_addr, PAGE_SIZE);
|
||||||
uv_info.max_num_sec_conf = uvcb.max_num_sec_conf;
|
uv_info.max_num_sec_conf = uvcb.max_num_sec_conf;
|
||||||
uv_info.max_guest_cpus = uvcb.max_guest_cpus;
|
uv_info.max_guest_cpu_id = uvcb.max_guest_cpu_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
|
#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ struct uv_cb_qui {
|
|||||||
u32 max_num_sec_conf;
|
u32 max_num_sec_conf;
|
||||||
u64 max_guest_stor_addr;
|
u64 max_guest_stor_addr;
|
||||||
u8 reserved88[158 - 136];
|
u8 reserved88[158 - 136];
|
||||||
u16 max_guest_cpus;
|
u16 max_guest_cpu_id;
|
||||||
u8 reserveda0[200 - 160];
|
u8 reserveda0[200 - 160];
|
||||||
} __packed __aligned(8);
|
} __packed __aligned(8);
|
||||||
|
|
||||||
@@ -273,7 +273,7 @@ struct uv_info {
|
|||||||
unsigned long guest_cpu_stor_len;
|
unsigned long guest_cpu_stor_len;
|
||||||
unsigned long max_sec_stor_addr;
|
unsigned long max_sec_stor_addr;
|
||||||
unsigned int max_num_sec_conf;
|
unsigned int max_num_sec_conf;
|
||||||
unsigned short max_guest_cpus;
|
unsigned short max_guest_cpu_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct uv_info uv_info;
|
extern struct uv_info uv_info;
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ static ssize_t uv_query_max_guest_cpus(struct kobject *kobj,
|
|||||||
struct kobj_attribute *attr, char *page)
|
struct kobj_attribute *attr, char *page)
|
||||||
{
|
{
|
||||||
return scnprintf(page, PAGE_SIZE, "%d\n",
|
return scnprintf(page, PAGE_SIZE, "%d\n",
|
||||||
uv_info.max_guest_cpus);
|
uv_info.max_guest_cpu_id + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kobj_attribute uv_query_max_guest_cpus_attr =
|
static struct kobj_attribute uv_query_max_guest_cpus_attr =
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include <asm/export.h>
|
#include <asm/export.h>
|
||||||
|
|
||||||
/* rdi: arg1 ... normal C conventions. rax is saved/restored. */
|
/* rdi: arg1 ... normal C conventions. rax is saved/restored. */
|
||||||
.macro THUNK name, func, put_ret_addr_in_rdi=0
|
.macro THUNK name, func
|
||||||
SYM_FUNC_START_NOALIGN(\name)
|
SYM_FUNC_START_NOALIGN(\name)
|
||||||
pushq %rbp
|
pushq %rbp
|
||||||
movq %rsp, %rbp
|
movq %rsp, %rbp
|
||||||
@@ -25,13 +25,8 @@ SYM_FUNC_START_NOALIGN(\name)
|
|||||||
pushq %r10
|
pushq %r10
|
||||||
pushq %r11
|
pushq %r11
|
||||||
|
|
||||||
.if \put_ret_addr_in_rdi
|
|
||||||
/* 8(%rbp) is return addr on stack */
|
|
||||||
movq 8(%rbp), %rdi
|
|
||||||
.endif
|
|
||||||
|
|
||||||
call \func
|
call \func
|
||||||
jmp .L_restore
|
jmp __thunk_restore
|
||||||
SYM_FUNC_END(\name)
|
SYM_FUNC_END(\name)
|
||||||
_ASM_NOKPROBE(\name)
|
_ASM_NOKPROBE(\name)
|
||||||
.endm
|
.endm
|
||||||
@@ -44,7 +39,7 @@ SYM_FUNC_END(\name)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPTION
|
#ifdef CONFIG_PREEMPTION
|
||||||
SYM_CODE_START_LOCAL_NOALIGN(.L_restore)
|
SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore)
|
||||||
popq %r11
|
popq %r11
|
||||||
popq %r10
|
popq %r10
|
||||||
popq %r9
|
popq %r9
|
||||||
@@ -56,6 +51,6 @@ SYM_CODE_START_LOCAL_NOALIGN(.L_restore)
|
|||||||
popq %rdi
|
popq %rdi
|
||||||
popq %rbp
|
popq %rbp
|
||||||
ret
|
ret
|
||||||
_ASM_NOKPROBE(.L_restore)
|
_ASM_NOKPROBE(__thunk_restore)
|
||||||
SYM_CODE_END(.L_restore)
|
SYM_CODE_END(__thunk_restore)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1016,6 +1016,8 @@ static void blkcg_css_offline(struct cgroup_subsys_state *css)
|
|||||||
*/
|
*/
|
||||||
void blkcg_destroy_blkgs(struct blkcg *blkcg)
|
void blkcg_destroy_blkgs(struct blkcg *blkcg)
|
||||||
{
|
{
|
||||||
|
might_sleep();
|
||||||
|
|
||||||
spin_lock_irq(&blkcg->lock);
|
spin_lock_irq(&blkcg->lock);
|
||||||
|
|
||||||
while (!hlist_empty(&blkcg->blkg_list)) {
|
while (!hlist_empty(&blkcg->blkg_list)) {
|
||||||
@@ -1023,14 +1025,20 @@ void blkcg_destroy_blkgs(struct blkcg *blkcg)
|
|||||||
struct blkcg_gq, blkcg_node);
|
struct blkcg_gq, blkcg_node);
|
||||||
struct request_queue *q = blkg->q;
|
struct request_queue *q = blkg->q;
|
||||||
|
|
||||||
if (spin_trylock(&q->queue_lock)) {
|
if (need_resched() || !spin_trylock(&q->queue_lock)) {
|
||||||
|
/*
|
||||||
|
* Given that the system can accumulate a huge number
|
||||||
|
* of blkgs in pathological cases, check to see if we
|
||||||
|
* need to rescheduling to avoid softlockup.
|
||||||
|
*/
|
||||||
|
spin_unlock_irq(&blkcg->lock);
|
||||||
|
cond_resched();
|
||||||
|
spin_lock_irq(&blkcg->lock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
blkg_destroy(blkg);
|
blkg_destroy(blkg);
|
||||||
spin_unlock(&q->queue_lock);
|
spin_unlock(&q->queue_lock);
|
||||||
} else {
|
|
||||||
spin_unlock_irq(&blkcg->lock);
|
|
||||||
cpu_relax();
|
|
||||||
spin_lock_irq(&blkcg->lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irq(&blkcg->lock);
|
spin_unlock_irq(&blkcg->lock);
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ static inline bool hctx_may_queue(struct blk_mq_hw_ctx *hctx,
|
|||||||
struct request_queue *q = hctx->queue;
|
struct request_queue *q = hctx->queue;
|
||||||
struct blk_mq_tag_set *set = q->tag_set;
|
struct blk_mq_tag_set *set = q->tag_set;
|
||||||
|
|
||||||
if (!test_bit(BLK_MQ_S_TAG_ACTIVE, &q->queue_flags))
|
if (!test_bit(QUEUE_FLAG_HCTX_ACTIVE, &q->queue_flags))
|
||||||
return true;
|
return true;
|
||||||
users = atomic_read(&set->active_queues_shared_sbitmap);
|
users = atomic_read(&set->active_queues_shared_sbitmap);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -45,10 +45,11 @@ static void disk_release_events(struct gendisk *disk);
|
|||||||
void set_capacity(struct gendisk *disk, sector_t sectors)
|
void set_capacity(struct gendisk *disk, sector_t sectors)
|
||||||
{
|
{
|
||||||
struct block_device *bdev = disk->part0;
|
struct block_device *bdev = disk->part0;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock(&bdev->bd_size_lock);
|
spin_lock_irqsave(&bdev->bd_size_lock, flags);
|
||||||
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
|
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
|
||||||
spin_unlock(&bdev->bd_size_lock);
|
spin_unlock_irqrestore(&bdev->bd_size_lock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(set_capacity);
|
EXPORT_SYMBOL(set_capacity);
|
||||||
|
|
||||||
|
|||||||
@@ -88,9 +88,11 @@ static int (*check_part[])(struct parsed_partitions *) = {
|
|||||||
|
|
||||||
static void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
|
static void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
|
||||||
{
|
{
|
||||||
spin_lock(&bdev->bd_size_lock);
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&bdev->bd_size_lock, flags);
|
||||||
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
|
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
|
||||||
spin_unlock(&bdev->bd_size_lock);
|
spin_unlock_irqrestore(&bdev->bd_size_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct parsed_partitions *allocate_partitions(struct gendisk *hd)
|
static struct parsed_partitions *allocate_partitions(struct gendisk *hd)
|
||||||
@@ -384,7 +386,7 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
|
|||||||
|
|
||||||
err = blk_alloc_devt(bdev, &devt);
|
err = blk_alloc_devt(bdev, &devt);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_bdput;
|
goto out_put;
|
||||||
pdev->devt = devt;
|
pdev->devt = devt;
|
||||||
|
|
||||||
/* delay uevent until 'holders' subdir is created */
|
/* delay uevent until 'holders' subdir is created */
|
||||||
|
|||||||
@@ -1107,6 +1107,11 @@ static int nc_dma_get_range(struct device *dev, u64 *size)
|
|||||||
|
|
||||||
ncomp = (struct acpi_iort_named_component *)node->node_data;
|
ncomp = (struct acpi_iort_named_component *)node->node_data;
|
||||||
|
|
||||||
|
if (!ncomp->memory_address_limit) {
|
||||||
|
pr_warn(FW_BUG "Named component missing memory address limit\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
*size = ncomp->memory_address_limit >= 64 ? U64_MAX :
|
*size = ncomp->memory_address_limit >= 64 ? U64_MAX :
|
||||||
1ULL<<ncomp->memory_address_limit;
|
1ULL<<ncomp->memory_address_limit;
|
||||||
|
|
||||||
@@ -1126,6 +1131,11 @@ static int rc_dma_get_range(struct device *dev, u64 *size)
|
|||||||
|
|
||||||
rc = (struct acpi_iort_root_complex *)node->node_data;
|
rc = (struct acpi_iort_root_complex *)node->node_data;
|
||||||
|
|
||||||
|
if (!rc->memory_address_limit) {
|
||||||
|
pr_warn(FW_BUG "Root complex missing memory address limit\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
*size = rc->memory_address_limit >= 64 ? U64_MAX :
|
*size = rc->memory_address_limit >= 64 ? U64_MAX :
|
||||||
1ULL<<rc->memory_address_limit;
|
1ULL<<rc->memory_address_limit;
|
||||||
|
|
||||||
@@ -1173,8 +1183,8 @@ void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size)
|
|||||||
end = dmaaddr + size - 1;
|
end = dmaaddr + size - 1;
|
||||||
mask = DMA_BIT_MASK(ilog2(end) + 1);
|
mask = DMA_BIT_MASK(ilog2(end) + 1);
|
||||||
dev->bus_dma_limit = end;
|
dev->bus_dma_limit = end;
|
||||||
dev->coherent_dma_mask = mask;
|
dev->coherent_dma_mask = min(dev->coherent_dma_mask, mask);
|
||||||
*dev->dma_mask = mask;
|
*dev->dma_mask = min(*dev->dma_mask, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
*dma_addr = dmaaddr;
|
*dma_addr = dmaaddr;
|
||||||
|
|||||||
@@ -251,20 +251,12 @@ int __acpi_device_uevent_modalias(struct acpi_device *adev,
|
|||||||
if (add_uevent_var(env, "MODALIAS="))
|
if (add_uevent_var(env, "MODALIAS="))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
len = create_pnp_modalias(adev, &env->buf[env->buflen - 1],
|
if (adev->data.of_compatible)
|
||||||
sizeof(env->buf) - env->buflen);
|
|
||||||
if (len < 0)
|
|
||||||
return len;
|
|
||||||
|
|
||||||
env->buflen += len;
|
|
||||||
if (!adev->data.of_compatible)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (len > 0 && add_uevent_var(env, "MODALIAS="))
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
len = create_of_modalias(adev, &env->buf[env->buflen - 1],
|
len = create_of_modalias(adev, &env->buf[env->buflen - 1],
|
||||||
sizeof(env->buf) - env->buflen);
|
sizeof(env->buf) - env->buflen);
|
||||||
|
else
|
||||||
|
len = create_pnp_modalias(adev, &env->buf[env->buflen - 1],
|
||||||
|
sizeof(env->buf) - env->buflen);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
|
|||||||
@@ -174,6 +174,8 @@ struct acpi_thermal {
|
|||||||
struct thermal_zone_device *thermal_zone;
|
struct thermal_zone_device *thermal_zone;
|
||||||
int kelvin_offset; /* in millidegrees */
|
int kelvin_offset; /* in millidegrees */
|
||||||
struct work_struct thermal_check_work;
|
struct work_struct thermal_check_work;
|
||||||
|
struct mutex thermal_check_lock;
|
||||||
|
refcount_t thermal_check_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
@@ -495,14 +497,6 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void acpi_thermal_check(void *data)
|
|
||||||
{
|
|
||||||
struct acpi_thermal *tz = data;
|
|
||||||
|
|
||||||
thermal_zone_device_update(tz->thermal_zone,
|
|
||||||
THERMAL_EVENT_UNSPECIFIED);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* sys I/F for generic thermal sysfs support */
|
/* sys I/F for generic thermal sysfs support */
|
||||||
|
|
||||||
static int thermal_get_temp(struct thermal_zone_device *thermal, int *temp)
|
static int thermal_get_temp(struct thermal_zone_device *thermal, int *temp)
|
||||||
@@ -900,6 +894,12 @@ static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
|
|||||||
Driver Interface
|
Driver Interface
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static void acpi_queue_thermal_check(struct acpi_thermal *tz)
|
||||||
|
{
|
||||||
|
if (!work_pending(&tz->thermal_check_work))
|
||||||
|
queue_work(acpi_thermal_pm_queue, &tz->thermal_check_work);
|
||||||
|
}
|
||||||
|
|
||||||
static void acpi_thermal_notify(struct acpi_device *device, u32 event)
|
static void acpi_thermal_notify(struct acpi_device *device, u32 event)
|
||||||
{
|
{
|
||||||
struct acpi_thermal *tz = acpi_driver_data(device);
|
struct acpi_thermal *tz = acpi_driver_data(device);
|
||||||
@@ -910,17 +910,17 @@ static void acpi_thermal_notify(struct acpi_device *device, u32 event)
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ACPI_THERMAL_NOTIFY_TEMPERATURE:
|
case ACPI_THERMAL_NOTIFY_TEMPERATURE:
|
||||||
acpi_thermal_check(tz);
|
acpi_queue_thermal_check(tz);
|
||||||
break;
|
break;
|
||||||
case ACPI_THERMAL_NOTIFY_THRESHOLDS:
|
case ACPI_THERMAL_NOTIFY_THRESHOLDS:
|
||||||
acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_THRESHOLDS);
|
acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_THRESHOLDS);
|
||||||
acpi_thermal_check(tz);
|
acpi_queue_thermal_check(tz);
|
||||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
dev_name(&device->dev), event, 0);
|
dev_name(&device->dev), event, 0);
|
||||||
break;
|
break;
|
||||||
case ACPI_THERMAL_NOTIFY_DEVICES:
|
case ACPI_THERMAL_NOTIFY_DEVICES:
|
||||||
acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES);
|
acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES);
|
||||||
acpi_thermal_check(tz);
|
acpi_queue_thermal_check(tz);
|
||||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
dev_name(&device->dev), event, 0);
|
dev_name(&device->dev), event, 0);
|
||||||
break;
|
break;
|
||||||
@@ -1020,7 +1020,25 @@ static void acpi_thermal_check_fn(struct work_struct *work)
|
|||||||
{
|
{
|
||||||
struct acpi_thermal *tz = container_of(work, struct acpi_thermal,
|
struct acpi_thermal *tz = container_of(work, struct acpi_thermal,
|
||||||
thermal_check_work);
|
thermal_check_work);
|
||||||
acpi_thermal_check(tz);
|
|
||||||
|
/*
|
||||||
|
* In general, it is not sufficient to check the pending bit, because
|
||||||
|
* subsequent instances of this function may be queued after one of them
|
||||||
|
* has started running (e.g. if _TMP sleeps). Avoid bailing out if just
|
||||||
|
* one of them is running, though, because it may have done the actual
|
||||||
|
* check some time ago, so allow at least one of them to block on the
|
||||||
|
* mutex while another one is running the update.
|
||||||
|
*/
|
||||||
|
if (!refcount_dec_not_one(&tz->thermal_check_count))
|
||||||
|
return;
|
||||||
|
|
||||||
|
mutex_lock(&tz->thermal_check_lock);
|
||||||
|
|
||||||
|
thermal_zone_device_update(tz->thermal_zone, THERMAL_EVENT_UNSPECIFIED);
|
||||||
|
|
||||||
|
refcount_inc(&tz->thermal_check_count);
|
||||||
|
|
||||||
|
mutex_unlock(&tz->thermal_check_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_thermal_add(struct acpi_device *device)
|
static int acpi_thermal_add(struct acpi_device *device)
|
||||||
@@ -1052,6 +1070,8 @@ static int acpi_thermal_add(struct acpi_device *device)
|
|||||||
if (result)
|
if (result)
|
||||||
goto free_memory;
|
goto free_memory;
|
||||||
|
|
||||||
|
refcount_set(&tz->thermal_check_count, 3);
|
||||||
|
mutex_init(&tz->thermal_check_lock);
|
||||||
INIT_WORK(&tz->thermal_check_work, acpi_thermal_check_fn);
|
INIT_WORK(&tz->thermal_check_work, acpi_thermal_check_fn);
|
||||||
|
|
||||||
pr_info(PREFIX "%s [%s] (%ld C)\n", acpi_device_name(device),
|
pr_info(PREFIX "%s [%s] (%ld C)\n", acpi_device_name(device),
|
||||||
@@ -1117,7 +1137,7 @@ static int acpi_thermal_resume(struct device *dev)
|
|||||||
tz->state.active |= tz->trips.active[i].flags.enabled;
|
tz->state.active |= tz->trips.active[i].flags.enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
queue_work(acpi_thermal_pm_queue, &tz->thermal_check_work);
|
acpi_queue_thermal_check(tz);
|
||||||
|
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1022,6 +1022,12 @@ static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg,
|
|||||||
if (!sock)
|
if (!sock)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to make sure we don't get any errant requests while we're
|
||||||
|
* reallocating the ->socks array.
|
||||||
|
*/
|
||||||
|
blk_mq_freeze_queue(nbd->disk->queue);
|
||||||
|
|
||||||
if (!netlink && !nbd->task_setup &&
|
if (!netlink && !nbd->task_setup &&
|
||||||
!test_bit(NBD_RT_BOUND, &config->runtime_flags))
|
!test_bit(NBD_RT_BOUND, &config->runtime_flags))
|
||||||
nbd->task_setup = current;
|
nbd->task_setup = current;
|
||||||
@@ -1060,10 +1066,12 @@ static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg,
|
|||||||
nsock->cookie = 0;
|
nsock->cookie = 0;
|
||||||
socks[config->num_connections++] = nsock;
|
socks[config->num_connections++] = nsock;
|
||||||
atomic_inc(&config->live_connections);
|
atomic_inc(&config->live_connections);
|
||||||
|
blk_mq_unfreeze_queue(nbd->disk->queue);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
put_socket:
|
put_socket:
|
||||||
|
blk_mq_unfreeze_queue(nbd->disk->queue);
|
||||||
sockfd_put(sock);
|
sockfd_put(sock);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,10 @@
|
|||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
#define MB_TO_SECTS(mb) (((sector_t)mb * SZ_1M) >> SECTOR_SHIFT)
|
static inline sector_t mb_to_sects(unsigned long mb)
|
||||||
|
{
|
||||||
|
return ((sector_t)mb * SZ_1M) >> SECTOR_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
|
static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
|
||||||
{
|
{
|
||||||
@@ -77,12 +80,11 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
zone_capacity_sects = MB_TO_SECTS(dev->zone_capacity);
|
zone_capacity_sects = mb_to_sects(dev->zone_capacity);
|
||||||
dev_capacity_sects = MB_TO_SECTS(dev->size);
|
dev_capacity_sects = mb_to_sects(dev->size);
|
||||||
dev->zone_size_sects = MB_TO_SECTS(dev->zone_size);
|
dev->zone_size_sects = mb_to_sects(dev->zone_size);
|
||||||
dev->nr_zones = dev_capacity_sects >> ilog2(dev->zone_size_sects);
|
dev->nr_zones = round_up(dev_capacity_sects, dev->zone_size_sects)
|
||||||
if (dev_capacity_sects & (dev->zone_size_sects - 1))
|
>> ilog2(dev->zone_size_sects);
|
||||||
dev->nr_zones++;
|
|
||||||
|
|
||||||
dev->zones = kvmalloc_array(dev->nr_zones, sizeof(struct nullb_zone),
|
dev->zones = kvmalloc_array(dev->nr_zones, sizeof(struct nullb_zone),
|
||||||
GFP_KERNEL | __GFP_ZERO);
|
GFP_KERNEL | __GFP_ZERO);
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
* apple-properties.c - EFI device properties on Macs
|
* apple-properties.c - EFI device properties on Macs
|
||||||
* Copyright (C) 2016 Lukas Wunner <lukas@wunner.de>
|
* Copyright (C) 2016 Lukas Wunner <lukas@wunner.de>
|
||||||
*
|
*
|
||||||
* Note, all properties are considered as u8 arrays.
|
* Properties are stored either as:
|
||||||
* To get a value of any of them the caller must use device_property_read_u8_array().
|
* u8 arrays which can be retrieved with device_property_read_u8_array() or
|
||||||
|
* booleans which can be queried with device_property_present().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) "apple-properties: " fmt
|
#define pr_fmt(fmt) "apple-properties: " fmt
|
||||||
@@ -88,8 +89,12 @@ static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
|
|||||||
|
|
||||||
entry_data = ptr + key_len + sizeof(val_len);
|
entry_data = ptr + key_len + sizeof(val_len);
|
||||||
entry_len = val_len - sizeof(val_len);
|
entry_len = val_len - sizeof(val_len);
|
||||||
|
if (entry_len)
|
||||||
entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,
|
entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,
|
||||||
entry_len);
|
entry_len);
|
||||||
|
else
|
||||||
|
entry[i] = PROPERTY_ENTRY_BOOL(key);
|
||||||
|
|
||||||
if (dump_properties) {
|
if (dump_properties) {
|
||||||
dev_info(dev, "property: %s\n", key);
|
dev_info(dev, "property: %s\n", key);
|
||||||
print_hex_dump(KERN_INFO, pr_fmt(), DUMP_PREFIX_OFFSET,
|
print_hex_dump(KERN_INFO, pr_fmt(), DUMP_PREFIX_OFFSET,
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ DCN30 = dcn30_init.o dcn30_hubbub.o dcn30_hubp.o dcn30_dpp.o dcn30_optc.o \
|
|||||||
|
|
||||||
|
|
||||||
ifdef CONFIG_X86
|
ifdef CONFIG_X86
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o := -mhard-float -msse
|
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o := -msse
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o := -mhard-float -msse
|
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o := -msse
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_PPC64
|
ifdef CONFIG_PPC64
|
||||||
@@ -45,6 +45,8 @@ ifdef CONFIG_CC_IS_GCC
|
|||||||
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
IS_OLD_GCC = 1
|
IS_OLD_GCC = 1
|
||||||
endif
|
endif
|
||||||
|
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o += -mhard-float
|
||||||
|
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o += -mhard-float
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_X86
|
ifdef CONFIG_X86
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ DCN301 = dcn301_init.o dcn301_resource.o dcn301_dccg.o \
|
|||||||
dcn301_dio_link_encoder.o dcn301_hwseq.o dcn301_panel_cntl.o dcn301_hubbub.o
|
dcn301_dio_link_encoder.o dcn301_hwseq.o dcn301_panel_cntl.o dcn301_hubbub.o
|
||||||
|
|
||||||
ifdef CONFIG_X86
|
ifdef CONFIG_X86
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn301/dcn301_resource.o := -mhard-float -msse
|
CFLAGS_$(AMDDALPATH)/dc/dcn301/dcn301_resource.o := -msse
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_PPC64
|
ifdef CONFIG_PPC64
|
||||||
@@ -25,6 +25,7 @@ ifdef CONFIG_CC_IS_GCC
|
|||||||
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
IS_OLD_GCC = 1
|
IS_OLD_GCC = 1
|
||||||
endif
|
endif
|
||||||
|
CFLAGS_$(AMDDALPATH)/dc/dcn301/dcn301_resource.o += -mhard-float
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_X86
|
ifdef CONFIG_X86
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
DCN3_02 = dcn302_init.o dcn302_hwseq.o dcn302_resource.o
|
DCN3_02 = dcn302_init.o dcn302_hwseq.o dcn302_resource.o
|
||||||
|
|
||||||
ifdef CONFIG_X86
|
ifdef CONFIG_X86
|
||||||
CFLAGS_$(AMDDALPATH)/dc/dcn302/dcn302_resource.o := -mhard-float -msse
|
CFLAGS_$(AMDDALPATH)/dc/dcn302/dcn302_resource.o := -msse
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_PPC64
|
ifdef CONFIG_PPC64
|
||||||
@@ -24,6 +24,7 @@ ifdef CONFIG_CC_IS_GCC
|
|||||||
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||||
IS_OLD_GCC = 1
|
IS_OLD_GCC = 1
|
||||||
endif
|
endif
|
||||||
|
CFLAGS_$(AMDDALPATH)/dc/dcn302/dcn302_resource.o += -mhard-float
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_X86
|
ifdef CONFIG_X86
|
||||||
|
|||||||
@@ -553,6 +553,7 @@ struct pptable_funcs {
|
|||||||
*clock_req);
|
*clock_req);
|
||||||
uint32_t (*get_fan_control_mode)(struct smu_context *smu);
|
uint32_t (*get_fan_control_mode)(struct smu_context *smu);
|
||||||
int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode);
|
int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode);
|
||||||
|
int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t speed);
|
||||||
int (*set_fan_speed_rpm)(struct smu_context *smu, uint32_t speed);
|
int (*set_fan_speed_rpm)(struct smu_context *smu, uint32_t speed);
|
||||||
int (*set_xgmi_pstate)(struct smu_context *smu, uint32_t pstate);
|
int (*set_xgmi_pstate)(struct smu_context *smu, uint32_t pstate);
|
||||||
int (*gfx_off_control)(struct smu_context *smu, bool enable);
|
int (*gfx_off_control)(struct smu_context *smu, bool enable);
|
||||||
|
|||||||
@@ -203,6 +203,9 @@ int
|
|||||||
smu_v11_0_set_fan_control_mode(struct smu_context *smu,
|
smu_v11_0_set_fan_control_mode(struct smu_context *smu,
|
||||||
uint32_t mode);
|
uint32_t mode);
|
||||||
|
|
||||||
|
int
|
||||||
|
smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed);
|
||||||
|
|
||||||
int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
|
int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
|
||||||
uint32_t speed);
|
uint32_t speed);
|
||||||
|
|
||||||
|
|||||||
@@ -2151,19 +2151,14 @@ int smu_get_fan_speed_percent(struct smu_context *smu, uint32_t *speed)
|
|||||||
int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
|
int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
uint32_t rpm;
|
|
||||||
|
|
||||||
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
|
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
mutex_lock(&smu->mutex);
|
mutex_lock(&smu->mutex);
|
||||||
|
|
||||||
if (smu->ppt_funcs->set_fan_speed_rpm) {
|
if (smu->ppt_funcs->set_fan_speed_percent)
|
||||||
if (speed > 100)
|
ret = smu->ppt_funcs->set_fan_speed_percent(smu, speed);
|
||||||
speed = 100;
|
|
||||||
rpm = speed * smu->fan_max_rpm / 100;
|
|
||||||
ret = smu->ppt_funcs->set_fan_speed_rpm(smu, rpm);
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_unlock(&smu->mutex);
|
mutex_unlock(&smu->mutex);
|
||||||
|
|
||||||
|
|||||||
@@ -2326,6 +2326,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
|
|||||||
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
|
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
|
||||||
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
|
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
|
||||||
.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
|
.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
|
||||||
|
.set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
|
||||||
.set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
|
.set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
|
||||||
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
|
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
|
||||||
.gfx_off_control = smu_v11_0_gfx_off_control,
|
.gfx_off_control = smu_v11_0_gfx_off_control,
|
||||||
|
|||||||
@@ -2456,6 +2456,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
|
|||||||
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
|
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
|
||||||
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
|
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
|
||||||
.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
|
.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
|
||||||
|
.set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
|
||||||
.set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
|
.set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
|
||||||
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
|
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
|
||||||
.gfx_off_control = smu_v11_0_gfx_off_control,
|
.gfx_off_control = smu_v11_0_gfx_off_control,
|
||||||
|
|||||||
@@ -2802,6 +2802,7 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
|
|||||||
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
|
.display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
|
||||||
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
|
.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
|
||||||
.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
|
.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
|
||||||
|
.set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
|
||||||
.set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
|
.set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
|
||||||
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
|
.set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
|
||||||
.gfx_off_control = smu_v11_0_gfx_off_control,
|
.gfx_off_control = smu_v11_0_gfx_off_control,
|
||||||
|
|||||||
@@ -1173,6 +1173,35 @@ smu_v11_0_set_fan_static_mode(struct smu_context *smu, uint32_t mode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = smu->adev;
|
||||||
|
uint32_t duty100, duty;
|
||||||
|
uint64_t tmp64;
|
||||||
|
|
||||||
|
if (speed > 100)
|
||||||
|
speed = 100;
|
||||||
|
|
||||||
|
if (smu_v11_0_auto_fan_control(smu, 0))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
duty100 = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL1),
|
||||||
|
CG_FDO_CTRL1, FMAX_DUTY100);
|
||||||
|
if (!duty100)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
tmp64 = (uint64_t)speed * duty100;
|
||||||
|
do_div(tmp64, 100);
|
||||||
|
duty = (uint32_t)tmp64;
|
||||||
|
|
||||||
|
WREG32_SOC15(THM, 0, mmCG_FDO_CTRL0,
|
||||||
|
REG_SET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL0),
|
||||||
|
CG_FDO_CTRL0, FDO_STATIC_DUTY, duty));
|
||||||
|
|
||||||
|
return smu_v11_0_set_fan_static_mode(smu, FDO_PWM_MODE_STATIC);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
smu_v11_0_set_fan_control_mode(struct smu_context *smu,
|
smu_v11_0_set_fan_control_mode(struct smu_context *smu,
|
||||||
uint32_t mode)
|
uint32_t mode)
|
||||||
@@ -1181,7 +1210,7 @@ smu_v11_0_set_fan_control_mode(struct smu_context *smu,
|
|||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case AMD_FAN_CTRL_NONE:
|
case AMD_FAN_CTRL_NONE:
|
||||||
ret = smu_v11_0_set_fan_speed_rpm(smu, smu->fan_max_rpm);
|
ret = smu_v11_0_set_fan_speed_percent(smu, 100);
|
||||||
break;
|
break;
|
||||||
case AMD_FAN_CTRL_MANUAL:
|
case AMD_FAN_CTRL_MANUAL:
|
||||||
ret = smu_v11_0_auto_fan_control(smu, 0);
|
ret = smu_v11_0_auto_fan_control(smu, 0);
|
||||||
|
|||||||
@@ -2755,12 +2755,11 @@ static void icl_mg_phy_ddi_vswing_sequence(struct intel_encoder *encoder,
|
|||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
ddi_translations = icl_get_mg_buf_trans(encoder, crtc_state, &n_entries);
|
ddi_translations = icl_get_mg_buf_trans(encoder, crtc_state, &n_entries);
|
||||||
/* The table does not have values for level 3 and level 9. */
|
if (level >= n_entries) {
|
||||||
if (level >= n_entries || level == 3 || level == 9) {
|
|
||||||
drm_dbg_kms(&dev_priv->drm,
|
drm_dbg_kms(&dev_priv->drm,
|
||||||
"DDI translation not found for level %d. Using %d instead.",
|
"DDI translation not found for level %d. Using %d instead.",
|
||||||
level, n_entries - 2);
|
level, n_entries - 1);
|
||||||
level = n_entries - 2;
|
level = n_entries - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set MG_TX_LINK_PARAMS cri_use_fs32 to 0. */
|
/* Set MG_TX_LINK_PARAMS cri_use_fs32 to 0. */
|
||||||
|
|||||||
@@ -390,6 +390,16 @@ static void emit_batch(struct i915_vma * const vma,
|
|||||||
&cb_kernel_ivb,
|
&cb_kernel_ivb,
|
||||||
desc_count);
|
desc_count);
|
||||||
|
|
||||||
|
/* Reset inherited context registers */
|
||||||
|
gen7_emit_pipeline_invalidate(&cmds);
|
||||||
|
batch_add(&cmds, MI_LOAD_REGISTER_IMM(2));
|
||||||
|
batch_add(&cmds, i915_mmio_reg_offset(CACHE_MODE_0_GEN7));
|
||||||
|
batch_add(&cmds, 0xffff0000);
|
||||||
|
batch_add(&cmds, i915_mmio_reg_offset(CACHE_MODE_1));
|
||||||
|
batch_add(&cmds, 0xffff0000 | PIXEL_SUBSPAN_COLLECT_OPT_DISABLE);
|
||||||
|
gen7_emit_pipeline_flush(&cmds);
|
||||||
|
|
||||||
|
/* Switch to the media pipeline and our base address */
|
||||||
gen7_emit_pipeline_invalidate(&cmds);
|
gen7_emit_pipeline_invalidate(&cmds);
|
||||||
batch_add(&cmds, PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
|
batch_add(&cmds, PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
|
||||||
batch_add(&cmds, MI_NOOP);
|
batch_add(&cmds, MI_NOOP);
|
||||||
@@ -399,9 +409,11 @@ static void emit_batch(struct i915_vma * const vma,
|
|||||||
gen7_emit_state_base_address(&cmds, descriptors);
|
gen7_emit_state_base_address(&cmds, descriptors);
|
||||||
gen7_emit_pipeline_invalidate(&cmds);
|
gen7_emit_pipeline_invalidate(&cmds);
|
||||||
|
|
||||||
|
/* Set the clear-residual kernel state */
|
||||||
gen7_emit_vfe_state(&cmds, bv, urb_size - 1, 0, 0);
|
gen7_emit_vfe_state(&cmds, bv, urb_size - 1, 0, 0);
|
||||||
gen7_emit_interface_descriptor_load(&cmds, descriptors, desc_count);
|
gen7_emit_interface_descriptor_load(&cmds, descriptors, desc_count);
|
||||||
|
|
||||||
|
/* Execute the kernel on all HW threads */
|
||||||
for (i = 0; i < num_primitives(bv); i++)
|
for (i = 0; i < num_primitives(bv); i++)
|
||||||
gen7_emit_media_object(&cmds, i);
|
gen7_emit_media_object(&cmds, i);
|
||||||
|
|
||||||
|
|||||||
@@ -526,16 +526,39 @@ static int init_ggtt(struct i915_ggtt *ggtt)
|
|||||||
|
|
||||||
mutex_init(&ggtt->error_mutex);
|
mutex_init(&ggtt->error_mutex);
|
||||||
if (ggtt->mappable_end) {
|
if (ggtt->mappable_end) {
|
||||||
/* Reserve a mappable slot for our lockless error capture */
|
/*
|
||||||
ret = drm_mm_insert_node_in_range(&ggtt->vm.mm,
|
* Reserve a mappable slot for our lockless error capture.
|
||||||
|
*
|
||||||
|
* We strongly prefer taking address 0x0 in order to protect
|
||||||
|
* other critical buffers against accidental overwrites,
|
||||||
|
* as writing to address 0 is a very common mistake.
|
||||||
|
*
|
||||||
|
* Since 0 may already be in use by the system (e.g. the BIOS
|
||||||
|
* framebuffer), we let the reservation fail quietly and hope
|
||||||
|
* 0 remains reserved always.
|
||||||
|
*
|
||||||
|
* If we fail to reserve 0, and then fail to find any space
|
||||||
|
* for an error-capture, remain silent. We can afford not
|
||||||
|
* to reserve an error_capture node as we have fallback
|
||||||
|
* paths, and we trust that 0 will remain reserved. However,
|
||||||
|
* the only likely reason for failure to insert is a driver
|
||||||
|
* bug, which we expect to cause other failures...
|
||||||
|
*/
|
||||||
|
ggtt->error_capture.size = I915_GTT_PAGE_SIZE;
|
||||||
|
ggtt->error_capture.color = I915_COLOR_UNEVICTABLE;
|
||||||
|
if (drm_mm_reserve_node(&ggtt->vm.mm, &ggtt->error_capture))
|
||||||
|
drm_mm_insert_node_in_range(&ggtt->vm.mm,
|
||||||
&ggtt->error_capture,
|
&ggtt->error_capture,
|
||||||
PAGE_SIZE, 0,
|
ggtt->error_capture.size, 0,
|
||||||
I915_COLOR_UNEVICTABLE,
|
ggtt->error_capture.color,
|
||||||
0, ggtt->mappable_end,
|
0, ggtt->mappable_end,
|
||||||
DRM_MM_INSERT_LOW);
|
DRM_MM_INSERT_LOW);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
if (drm_mm_node_allocated(&ggtt->error_capture))
|
||||||
|
drm_dbg(&ggtt->vm.i915->drm,
|
||||||
|
"Reserved GGTT:[%llx, %llx] for use by error capture\n",
|
||||||
|
ggtt->error_capture.start,
|
||||||
|
ggtt->error_capture.start + ggtt->error_capture.size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The upper portion of the GuC address space has a sizeable hole
|
* The upper portion of the GuC address space has a sizeable hole
|
||||||
@@ -548,7 +571,7 @@ static int init_ggtt(struct i915_ggtt *ggtt)
|
|||||||
|
|
||||||
/* Clear any non-preallocated blocks */
|
/* Clear any non-preallocated blocks */
|
||||||
drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) {
|
drm_mm_for_each_hole(entry, &ggtt->vm.mm, hole_start, hole_end) {
|
||||||
drm_dbg_kms(&ggtt->vm.i915->drm,
|
drm_dbg(&ggtt->vm.i915->drm,
|
||||||
"clearing unused GTT space: [%lx, %lx]\n",
|
"clearing unused GTT space: [%lx, %lx]\n",
|
||||||
hole_start, hole_end);
|
hole_start, hole_end);
|
||||||
ggtt->vm.clear_range(&ggtt->vm, hole_start,
|
ggtt->vm.clear_range(&ggtt->vm, hole_start,
|
||||||
|
|||||||
@@ -631,24 +631,26 @@ static int flush_lazy_signals(struct i915_active *ref)
|
|||||||
|
|
||||||
int __i915_active_wait(struct i915_active *ref, int state)
|
int __i915_active_wait(struct i915_active *ref, int state)
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
|
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
if (!i915_active_acquire_if_busy(ref))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Any fence added after the wait begins will not be auto-signaled */
|
/* Any fence added after the wait begins will not be auto-signaled */
|
||||||
|
if (i915_active_acquire_if_busy(ref)) {
|
||||||
|
int err;
|
||||||
|
|
||||||
err = flush_lazy_signals(ref);
|
err = flush_lazy_signals(ref);
|
||||||
i915_active_release(ref);
|
i915_active_release(ref);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (!i915_active_is_idle(ref) &&
|
if (___wait_var_event(ref, i915_active_is_idle(ref),
|
||||||
___wait_var_event(ref, i915_active_is_idle(ref),
|
|
||||||
state, 0, 0, schedule()))
|
state, 0, 0, schedule()))
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After the wait is complete, the caller may free the active.
|
||||||
|
* We have to flush any concurrent retirement before returning.
|
||||||
|
*/
|
||||||
flush_work(&ref->work);
|
flush_work(&ref->work);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1346,7 +1346,7 @@ intel_subplatform(const struct intel_runtime_info *info, enum intel_platform p)
|
|||||||
{
|
{
|
||||||
const unsigned int pi = __platform_mask_index(info, p);
|
const unsigned int pi = __platform_mask_index(info, p);
|
||||||
|
|
||||||
return info->platform_mask[pi] & INTEL_SUBPLATFORM_BITS;
|
return info->platform_mask[pi] & ((1 << INTEL_SUBPLATFORM_BITS) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __always_inline bool
|
static __always_inline bool
|
||||||
|
|||||||
@@ -1880,7 +1880,7 @@ static int igt_cs_tlb(void *arg)
|
|||||||
vma = i915_vma_instance(out, vm, NULL);
|
vma = i915_vma_instance(out, vm, NULL);
|
||||||
if (IS_ERR(vma)) {
|
if (IS_ERR(vma)) {
|
||||||
err = PTR_ERR(vma);
|
err = PTR_ERR(vma);
|
||||||
goto out_put_batch;
|
goto out_put_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = i915_vma_pin(vma, 0, 0,
|
err = i915_vma_pin(vma, 0, 0,
|
||||||
|
|||||||
@@ -88,7 +88,11 @@ base507c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
|||||||
NVVAL(NV507C, SET_CONVERSION, OFS, 0x64));
|
NVVAL(NV507C, SET_CONVERSION, OFS, 0x64));
|
||||||
} else {
|
} else {
|
||||||
PUSH_MTHD(push, NV507C, SET_PROCESSING,
|
PUSH_MTHD(push, NV507C, SET_PROCESSING,
|
||||||
NVDEF(NV507C, SET_PROCESSING, USE_GAIN_OFS, DISABLE));
|
NVDEF(NV507C, SET_PROCESSING, USE_GAIN_OFS, DISABLE),
|
||||||
|
|
||||||
|
SET_CONVERSION,
|
||||||
|
NVVAL(NV507C, SET_CONVERSION, GAIN, 0) |
|
||||||
|
NVVAL(NV507C, SET_CONVERSION, OFS, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSH_MTHD(push, NV507C, SURFACE_SET_OFFSET(0, 0), asyw->image.offset[0] >> 8);
|
PUSH_MTHD(push, NV507C, SURFACE_SET_OFFSET(0, 0), asyw->image.offset[0] >> 8);
|
||||||
|
|||||||
@@ -49,7 +49,11 @@ base827c_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
|||||||
NVVAL(NV827C, SET_CONVERSION, OFS, 0x64));
|
NVVAL(NV827C, SET_CONVERSION, OFS, 0x64));
|
||||||
} else {
|
} else {
|
||||||
PUSH_MTHD(push, NV827C, SET_PROCESSING,
|
PUSH_MTHD(push, NV827C, SET_PROCESSING,
|
||||||
NVDEF(NV827C, SET_PROCESSING, USE_GAIN_OFS, DISABLE));
|
NVDEF(NV827C, SET_PROCESSING, USE_GAIN_OFS, DISABLE),
|
||||||
|
|
||||||
|
SET_CONVERSION,
|
||||||
|
NVVAL(NV827C, SET_CONVERSION, GAIN, 0) |
|
||||||
|
NVVAL(NV827C, SET_CONVERSION, OFS, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSH_MTHD(push, NV827C, SURFACE_SET_OFFSET(0, 0), asyw->image.offset[0] >> 8,
|
PUSH_MTHD(push, NV827C, SURFACE_SET_OFFSET(0, 0), asyw->image.offset[0] >> 8,
|
||||||
|
|||||||
@@ -2663,6 +2663,14 @@ nv50_display_create(struct drm_device *dev)
|
|||||||
else
|
else
|
||||||
nouveau_display(dev)->format_modifiers = disp50xx_modifiers;
|
nouveau_display(dev)->format_modifiers = disp50xx_modifiers;
|
||||||
|
|
||||||
|
if (disp->disp->object.oclass >= GK104_DISP) {
|
||||||
|
dev->mode_config.cursor_width = 256;
|
||||||
|
dev->mode_config.cursor_height = 256;
|
||||||
|
} else {
|
||||||
|
dev->mode_config.cursor_width = 64;
|
||||||
|
dev->mode_config.cursor_height = 64;
|
||||||
|
}
|
||||||
|
|
||||||
/* create crtc objects to represent the hw heads */
|
/* create crtc objects to represent the hw heads */
|
||||||
if (disp->disp->object.oclass >= GV100_DISP)
|
if (disp->disp->object.oclass >= GV100_DISP)
|
||||||
crtcs = nvif_rd32(&device->object, 0x610060) & 0xff;
|
crtcs = nvif_rd32(&device->object, 0x610060) & 0xff;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "head.h"
|
#include "head.h"
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
|
#include "nvif/push.h"
|
||||||
#include <nvif/push507c.h>
|
#include <nvif/push507c.h>
|
||||||
|
|
||||||
#include <nvhw/class/cl917d.h>
|
#include <nvhw/class/cl917d.h>
|
||||||
@@ -73,6 +74,31 @@ head917d_base(struct nv50_head *head, struct nv50_head_atom *asyh)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
head917d_curs_set(struct nv50_head *head, struct nv50_head_atom *asyh)
|
||||||
|
{
|
||||||
|
struct nvif_push *push = nv50_disp(head->base.base.dev)->core->chan.push;
|
||||||
|
const int i = head->base.index;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = PUSH_WAIT(push, 5);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
PUSH_MTHD(push, NV917D, HEAD_SET_CONTROL_CURSOR(i),
|
||||||
|
NVDEF(NV917D, HEAD_SET_CONTROL_CURSOR, ENABLE, ENABLE) |
|
||||||
|
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, FORMAT, asyh->curs.format) |
|
||||||
|
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, SIZE, asyh->curs.layout) |
|
||||||
|
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, HOT_SPOT_X, 0) |
|
||||||
|
NVVAL(NV917D, HEAD_SET_CONTROL_CURSOR, HOT_SPOT_Y, 0) |
|
||||||
|
NVDEF(NV917D, HEAD_SET_CONTROL_CURSOR, COMPOSITION, ALPHA_BLEND),
|
||||||
|
|
||||||
|
HEAD_SET_OFFSET_CURSOR(i), asyh->curs.offset >> 8);
|
||||||
|
|
||||||
|
PUSH_MTHD(push, NV917D, HEAD_SET_CONTEXT_DMA_CURSOR(i), asyh->curs.handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
head917d_curs_layout(struct nv50_head *head, struct nv50_wndw_atom *asyw,
|
head917d_curs_layout(struct nv50_head *head, struct nv50_wndw_atom *asyw,
|
||||||
struct nv50_head_atom *asyh)
|
struct nv50_head_atom *asyh)
|
||||||
@@ -101,7 +127,7 @@ head917d = {
|
|||||||
.core_clr = head907d_core_clr,
|
.core_clr = head907d_core_clr,
|
||||||
.curs_layout = head917d_curs_layout,
|
.curs_layout = head917d_curs_layout,
|
||||||
.curs_format = head507d_curs_format,
|
.curs_format = head507d_curs_format,
|
||||||
.curs_set = head907d_curs_set,
|
.curs_set = head917d_curs_set,
|
||||||
.curs_clr = head907d_curs_clr,
|
.curs_clr = head907d_curs_clr,
|
||||||
.base = head917d_base,
|
.base = head917d_base,
|
||||||
.ovly = head907d_ovly,
|
.ovly = head907d_ovly,
|
||||||
|
|||||||
@@ -702,6 +702,11 @@ nv50_wndw_init(struct nv50_wndw *wndw)
|
|||||||
nvif_notify_get(&wndw->notify);
|
nvif_notify_get(&wndw->notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const u64 nv50_cursor_format_modifiers[] = {
|
||||||
|
DRM_FORMAT_MOD_LINEAR,
|
||||||
|
DRM_FORMAT_MOD_INVALID,
|
||||||
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
nv50_wndw_new_(const struct nv50_wndw_func *func, struct drm_device *dev,
|
nv50_wndw_new_(const struct nv50_wndw_func *func, struct drm_device *dev,
|
||||||
enum drm_plane_type type, const char *name, int index,
|
enum drm_plane_type type, const char *name, int index,
|
||||||
@@ -713,6 +718,7 @@ nv50_wndw_new_(const struct nv50_wndw_func *func, struct drm_device *dev,
|
|||||||
struct nvif_mmu *mmu = &drm->client.mmu;
|
struct nvif_mmu *mmu = &drm->client.mmu;
|
||||||
struct nv50_disp *disp = nv50_disp(dev);
|
struct nv50_disp *disp = nv50_disp(dev);
|
||||||
struct nv50_wndw *wndw;
|
struct nv50_wndw *wndw;
|
||||||
|
const u64 *format_modifiers;
|
||||||
int nformat;
|
int nformat;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -728,10 +734,13 @@ nv50_wndw_new_(const struct nv50_wndw_func *func, struct drm_device *dev,
|
|||||||
|
|
||||||
for (nformat = 0; format[nformat]; nformat++);
|
for (nformat = 0; format[nformat]; nformat++);
|
||||||
|
|
||||||
ret = drm_universal_plane_init(dev, &wndw->plane, heads, &nv50_wndw,
|
if (type == DRM_PLANE_TYPE_CURSOR)
|
||||||
format, nformat,
|
format_modifiers = nv50_cursor_format_modifiers;
|
||||||
nouveau_display(dev)->format_modifiers,
|
else
|
||||||
type, "%s-%d", name, index);
|
format_modifiers = nouveau_display(dev)->format_modifiers;
|
||||||
|
|
||||||
|
ret = drm_universal_plane_init(dev, &wndw->plane, heads, &nv50_wndw, format, nformat,
|
||||||
|
format_modifiers, type, "%s-%d", name, index);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(*pwndw);
|
kfree(*pwndw);
|
||||||
*pwndw = NULL;
|
*pwndw = NULL;
|
||||||
|
|||||||
@@ -66,6 +66,10 @@
|
|||||||
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_ALPHA_BLEND (0x00000000)
|
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_ALPHA_BLEND (0x00000000)
|
||||||
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_PREMULT_ALPHA_BLEND (0x00000001)
|
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_PREMULT_ALPHA_BLEND (0x00000001)
|
||||||
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_XOR (0x00000002)
|
#define NV917D_HEAD_SET_CONTROL_CURSOR_COMPOSITION_XOR (0x00000002)
|
||||||
|
#define NV917D_HEAD_SET_OFFSET_CURSOR(a) (0x00000484 + (a)*0x00000300)
|
||||||
|
#define NV917D_HEAD_SET_OFFSET_CURSOR_ORIGIN 31:0
|
||||||
|
#define NV917D_HEAD_SET_CONTEXT_DMA_CURSOR(a) (0x0000048C + (a)*0x00000300)
|
||||||
|
#define NV917D_HEAD_SET_CONTEXT_DMA_CURSOR_HANDLE 31:0
|
||||||
#define NV917D_HEAD_SET_DITHER_CONTROL(a) (0x000004A0 + (a)*0x00000300)
|
#define NV917D_HEAD_SET_DITHER_CONTROL(a) (0x000004A0 + (a)*0x00000300)
|
||||||
#define NV917D_HEAD_SET_DITHER_CONTROL_ENABLE 0:0
|
#define NV917D_HEAD_SET_DITHER_CONTROL_ENABLE 0:0
|
||||||
#define NV917D_HEAD_SET_DITHER_CONTROL_ENABLE_DISABLE (0x00000000)
|
#define NV917D_HEAD_SET_DITHER_CONTROL_ENABLE_DISABLE (0x00000000)
|
||||||
|
|||||||
@@ -123,85 +123,85 @@ PUSH_KICK(struct nvif_push *push)
|
|||||||
} while(0)
|
} while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PUSH_1(X,f,ds,n,c,o,p,s,mA,dA) do { \
|
#define PUSH_1(X,f,ds,n,o,p,s,mA,dA) do { \
|
||||||
PUSH_##o##_HDR((p), s, mA, (c)+(n)); \
|
PUSH_##o##_HDR((p), s, mA, (ds)+(n)); \
|
||||||
PUSH_##f(X, (p), X##mA, 1, o, (dA), ds, ""); \
|
PUSH_##f(X, (p), X##mA, 1, o, (dA), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_2(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_2(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (1?PUSH_##o##_INC), "mthd1"); \
|
PUSH_ASSERT((mB) - (mA) == (1?PUSH_##o##_INC), "mthd1"); \
|
||||||
PUSH_1(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_1(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_3(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_3(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd2"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd2"); \
|
||||||
PUSH_2(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_2(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_4(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_4(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd3"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd3"); \
|
||||||
PUSH_3(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_3(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_5(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_5(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd4"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd4"); \
|
||||||
PUSH_4(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_4(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_6(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_6(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd5"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd5"); \
|
||||||
PUSH_5(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_5(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_7(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_7(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd6"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd6"); \
|
||||||
PUSH_6(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_6(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_8(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_8(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd7"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd7"); \
|
||||||
PUSH_7(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_7(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_9(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_9(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd8"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd8"); \
|
||||||
PUSH_8(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_8(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PUSH_10(X,f,ds,n,c,o,p,s,mB,dB,mA,dA,a...) do { \
|
#define PUSH_10(X,f,ds,n,o,p,s,mB,dB,mA,dA,a...) do { \
|
||||||
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd9"); \
|
PUSH_ASSERT((mB) - (mA) == (0?PUSH_##o##_INC), "mthd9"); \
|
||||||
PUSH_9(X, DATA_, 1, ds, (c)+(n), o, (p), s, X##mA, (dA), ##a); \
|
PUSH_9(X, DATA_, 1, (ds) + (n), o, (p), s, X##mA, (dA), ##a); \
|
||||||
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
PUSH_##f(X, (p), X##mB, 0, o, (dB), ds, ""); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define PUSH_1D(X,o,p,s,mA,dA) \
|
#define PUSH_1D(X,o,p,s,mA,dA) \
|
||||||
PUSH_1(X, DATA_, 1, 1, 0, o, (p), s, X##mA, (dA))
|
PUSH_1(X, DATA_, 1, 0, o, (p), s, X##mA, (dA))
|
||||||
#define PUSH_2D(X,o,p,s,mA,dA,mB,dB) \
|
#define PUSH_2D(X,o,p,s,mA,dA,mB,dB) \
|
||||||
PUSH_2(X, DATA_, 1, 1, 0, o, (p), s, X##mB, (dB), \
|
PUSH_2(X, DATA_, 1, 0, o, (p), s, X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_3D(X,o,p,s,mA,dA,mB,dB,mC,dC) \
|
#define PUSH_3D(X,o,p,s,mA,dA,mB,dB,mC,dC) \
|
||||||
PUSH_3(X, DATA_, 1, 1, 0, o, (p), s, X##mC, (dC), \
|
PUSH_3(X, DATA_, 1, 0, o, (p), s, X##mC, (dC), \
|
||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_4D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD) \
|
#define PUSH_4D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD) \
|
||||||
PUSH_4(X, DATA_, 1, 1, 0, o, (p), s, X##mD, (dD), \
|
PUSH_4(X, DATA_, 1, 0, o, (p), s, X##mD, (dD), \
|
||||||
X##mC, (dC), \
|
X##mC, (dC), \
|
||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_5D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE) \
|
#define PUSH_5D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE) \
|
||||||
PUSH_5(X, DATA_, 1, 1, 0, o, (p), s, X##mE, (dE), \
|
PUSH_5(X, DATA_, 1, 0, o, (p), s, X##mE, (dE), \
|
||||||
X##mD, (dD), \
|
X##mD, (dD), \
|
||||||
X##mC, (dC), \
|
X##mC, (dC), \
|
||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_6D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF) \
|
#define PUSH_6D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF) \
|
||||||
PUSH_6(X, DATA_, 1, 1, 0, o, (p), s, X##mF, (dF), \
|
PUSH_6(X, DATA_, 1, 0, o, (p), s, X##mF, (dF), \
|
||||||
X##mE, (dE), \
|
X##mE, (dE), \
|
||||||
X##mD, (dD), \
|
X##mD, (dD), \
|
||||||
X##mC, (dC), \
|
X##mC, (dC), \
|
||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_7D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG) \
|
#define PUSH_7D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG) \
|
||||||
PUSH_7(X, DATA_, 1, 1, 0, o, (p), s, X##mG, (dG), \
|
PUSH_7(X, DATA_, 1, 0, o, (p), s, X##mG, (dG), \
|
||||||
X##mF, (dF), \
|
X##mF, (dF), \
|
||||||
X##mE, (dE), \
|
X##mE, (dE), \
|
||||||
X##mD, (dD), \
|
X##mD, (dD), \
|
||||||
@@ -209,7 +209,7 @@ PUSH_KICK(struct nvif_push *push)
|
|||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_8D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH) \
|
#define PUSH_8D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH) \
|
||||||
PUSH_8(X, DATA_, 1, 1, 0, o, (p), s, X##mH, (dH), \
|
PUSH_8(X, DATA_, 1, 0, o, (p), s, X##mH, (dH), \
|
||||||
X##mG, (dG), \
|
X##mG, (dG), \
|
||||||
X##mF, (dF), \
|
X##mF, (dF), \
|
||||||
X##mE, (dE), \
|
X##mE, (dE), \
|
||||||
@@ -218,7 +218,7 @@ PUSH_KICK(struct nvif_push *push)
|
|||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_9D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI) \
|
#define PUSH_9D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI) \
|
||||||
PUSH_9(X, DATA_, 1, 1, 0, o, (p), s, X##mI, (dI), \
|
PUSH_9(X, DATA_, 1, 0, o, (p), s, X##mI, (dI), \
|
||||||
X##mH, (dH), \
|
X##mH, (dH), \
|
||||||
X##mG, (dG), \
|
X##mG, (dG), \
|
||||||
X##mF, (dF), \
|
X##mF, (dF), \
|
||||||
@@ -228,7 +228,7 @@ PUSH_KICK(struct nvif_push *push)
|
|||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_10D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI,mJ,dJ) \
|
#define PUSH_10D(X,o,p,s,mA,dA,mB,dB,mC,dC,mD,dD,mE,dE,mF,dF,mG,dG,mH,dH,mI,dI,mJ,dJ) \
|
||||||
PUSH_10(X, DATA_, 1, 1, 0, o, (p), s, X##mJ, (dJ), \
|
PUSH_10(X, DATA_, 1, 0, o, (p), s, X##mJ, (dJ), \
|
||||||
X##mI, (dI), \
|
X##mI, (dI), \
|
||||||
X##mH, (dH), \
|
X##mH, (dH), \
|
||||||
X##mG, (dG), \
|
X##mG, (dG), \
|
||||||
@@ -240,12 +240,12 @@ PUSH_KICK(struct nvif_push *push)
|
|||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
|
|
||||||
#define PUSH_1P(X,o,p,s,mA,dp,ds) \
|
#define PUSH_1P(X,o,p,s,mA,dp,ds) \
|
||||||
PUSH_1(X, DATAp, ds, ds, 0, o, (p), s, X##mA, (dp))
|
PUSH_1(X, DATAp, ds, 0, o, (p), s, X##mA, (dp))
|
||||||
#define PUSH_2P(X,o,p,s,mA,dA,mB,dp,ds) \
|
#define PUSH_2P(X,o,p,s,mA,dA,mB,dp,ds) \
|
||||||
PUSH_2(X, DATAp, ds, ds, 0, o, (p), s, X##mB, (dp), \
|
PUSH_2(X, DATAp, ds, 0, o, (p), s, X##mB, (dp), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
#define PUSH_3P(X,o,p,s,mA,dA,mB,dB,mC,dp,ds) \
|
#define PUSH_3P(X,o,p,s,mA,dA,mB,dB,mC,dp,ds) \
|
||||||
PUSH_3(X, DATAp, ds, ds, 0, o, (p), s, X##mC, (dp), \
|
PUSH_3(X, DATAp, ds, 0, o, (p), s, X##mC, (dp), \
|
||||||
X##mB, (dB), \
|
X##mB, (dB), \
|
||||||
X##mA, (dA))
|
X##mA, (dA))
|
||||||
|
|
||||||
|
|||||||
@@ -315,6 +315,10 @@ nouveau_svmm_init(struct drm_device *dev, void *data,
|
|||||||
struct drm_nouveau_svm_init *args = data;
|
struct drm_nouveau_svm_init *args = data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/* We need to fail if svm is disabled */
|
||||||
|
if (!cli->drm->svm)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
/* Allocate tracking for SVM-enabled VMM. */
|
/* Allocate tracking for SVM-enabled VMM. */
|
||||||
if (!(svmm = kzalloc(sizeof(*svmm), GFP_KERNEL)))
|
if (!(svmm = kzalloc(sizeof(*svmm), GFP_KERNEL)))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|||||||
@@ -620,11 +620,11 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
|
|||||||
* for now we just allocate globally.
|
* for now we just allocate globally.
|
||||||
*/
|
*/
|
||||||
if (!hvs->hvs5)
|
if (!hvs->hvs5)
|
||||||
/* 96kB */
|
/* 48k words of 2x12-bit pixels */
|
||||||
drm_mm_init(&hvs->lbm_mm, 0, 96 * 1024);
|
drm_mm_init(&hvs->lbm_mm, 0, 48 * 1024);
|
||||||
else
|
else
|
||||||
/* 70k words */
|
/* 60k words of 4x12-bit pixels */
|
||||||
drm_mm_init(&hvs->lbm_mm, 0, 70 * 2 * 1024);
|
drm_mm_init(&hvs->lbm_mm, 0, 60 * 1024);
|
||||||
|
|
||||||
/* Upload filter kernels. We only have the one for now, so we
|
/* Upload filter kernels. We only have the one for now, so we
|
||||||
* keep it around for the lifetime of the driver.
|
* keep it around for the lifetime of the driver.
|
||||||
|
|||||||
@@ -437,6 +437,7 @@ static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst)
|
|||||||
static u32 vc4_lbm_size(struct drm_plane_state *state)
|
static u32 vc4_lbm_size(struct drm_plane_state *state)
|
||||||
{
|
{
|
||||||
struct vc4_plane_state *vc4_state = to_vc4_plane_state(state);
|
struct vc4_plane_state *vc4_state = to_vc4_plane_state(state);
|
||||||
|
struct vc4_dev *vc4 = to_vc4_dev(state->plane->dev);
|
||||||
u32 pix_per_line;
|
u32 pix_per_line;
|
||||||
u32 lbm;
|
u32 lbm;
|
||||||
|
|
||||||
@@ -472,7 +473,11 @@ static u32 vc4_lbm_size(struct drm_plane_state *state)
|
|||||||
lbm = pix_per_line * 16;
|
lbm = pix_per_line * 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
lbm = roundup(lbm, 32);
|
/* Align it to 64 or 128 (hvs5) bytes */
|
||||||
|
lbm = roundup(lbm, vc4->hvs->hvs5 ? 128 : 64);
|
||||||
|
|
||||||
|
/* Each "word" of the LBM memory contains 2 or 4 (hvs5) pixels */
|
||||||
|
lbm /= vc4->hvs->hvs5 ? 4 : 2;
|
||||||
|
|
||||||
return lbm;
|
return lbm;
|
||||||
}
|
}
|
||||||
@@ -912,9 +917,9 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
|
|||||||
if (!vc4_state->is_unity) {
|
if (!vc4_state->is_unity) {
|
||||||
vc4_dlist_write(vc4_state,
|
vc4_dlist_write(vc4_state,
|
||||||
VC4_SET_FIELD(vc4_state->crtc_w,
|
VC4_SET_FIELD(vc4_state->crtc_w,
|
||||||
SCALER_POS1_SCL_WIDTH) |
|
SCALER5_POS1_SCL_WIDTH) |
|
||||||
VC4_SET_FIELD(vc4_state->crtc_h,
|
VC4_SET_FIELD(vc4_state->crtc_h,
|
||||||
SCALER_POS1_SCL_HEIGHT));
|
SCALER5_POS1_SCL_HEIGHT));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Position Word 2: Source Image Size */
|
/* Position Word 2: Source Image Size */
|
||||||
|
|||||||
@@ -1275,7 +1275,8 @@ static int mtk_i2c_probe(struct platform_device *pdev)
|
|||||||
mtk_i2c_clock_disable(i2c);
|
mtk_i2c_clock_disable(i2c);
|
||||||
|
|
||||||
ret = devm_request_irq(&pdev->dev, irq, mtk_i2c_irq,
|
ret = devm_request_irq(&pdev->dev, irq, mtk_i2c_irq,
|
||||||
IRQF_TRIGGER_NONE, I2C_DRV_NAME, i2c);
|
IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE,
|
||||||
|
I2C_DRV_NAME, i2c);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"Request I2C IRQ %d fail\n", irq);
|
"Request I2C IRQ %d fail\n", irq);
|
||||||
@@ -1302,7 +1303,16 @@ static int mtk_i2c_remove(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int mtk_i2c_resume(struct device *dev)
|
static int mtk_i2c_suspend_noirq(struct device *dev)
|
||||||
|
{
|
||||||
|
struct mtk_i2c *i2c = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
i2c_mark_adapter_suspended(&i2c->adap);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mtk_i2c_resume_noirq(struct device *dev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct mtk_i2c *i2c = dev_get_drvdata(dev);
|
struct mtk_i2c *i2c = dev_get_drvdata(dev);
|
||||||
@@ -1317,12 +1327,15 @@ static int mtk_i2c_resume(struct device *dev)
|
|||||||
|
|
||||||
mtk_i2c_clock_disable(i2c);
|
mtk_i2c_clock_disable(i2c);
|
||||||
|
|
||||||
|
i2c_mark_adapter_resumed(&i2c->adap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct dev_pm_ops mtk_i2c_pm = {
|
static const struct dev_pm_ops mtk_i2c_pm = {
|
||||||
SET_SYSTEM_SLEEP_PM_OPS(NULL, mtk_i2c_resume)
|
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_i2c_suspend_noirq,
|
||||||
|
mtk_i2c_resume_noirq)
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_driver mtk_i2c_driver = {
|
static struct platform_driver mtk_i2c_driver = {
|
||||||
|
|||||||
@@ -84,12 +84,9 @@ static inline bool is_rd890_iommu(struct pci_dev *pdev)
|
|||||||
(pdev->device == PCI_DEVICE_ID_RD890_IOMMU);
|
(pdev->device == PCI_DEVICE_ID_RD890_IOMMU);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool iommu_feature(struct amd_iommu *iommu, u64 f)
|
static inline bool iommu_feature(struct amd_iommu *iommu, u64 mask)
|
||||||
{
|
{
|
||||||
if (!(iommu->cap & (1 << IOMMU_CAP_EFR)))
|
return !!(iommu->features & mask);
|
||||||
return false;
|
|
||||||
|
|
||||||
return !!(iommu->features & f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u64 iommu_virt_to_phys(void *vaddr)
|
static inline u64 iommu_virt_to_phys(void *vaddr)
|
||||||
|
|||||||
@@ -387,6 +387,10 @@
|
|||||||
#define IOMMU_CAP_NPCACHE 26
|
#define IOMMU_CAP_NPCACHE 26
|
||||||
#define IOMMU_CAP_EFR 27
|
#define IOMMU_CAP_EFR 27
|
||||||
|
|
||||||
|
/* IOMMU IVINFO */
|
||||||
|
#define IOMMU_IVINFO_OFFSET 36
|
||||||
|
#define IOMMU_IVINFO_EFRSUP BIT(0)
|
||||||
|
|
||||||
/* IOMMU Feature Reporting Field (for IVHD type 10h */
|
/* IOMMU Feature Reporting Field (for IVHD type 10h */
|
||||||
#define IOMMU_FEAT_GASUP_SHIFT 6
|
#define IOMMU_FEAT_GASUP_SHIFT 6
|
||||||
|
|
||||||
|
|||||||
@@ -257,6 +257,8 @@ static void init_device_table_dma(void);
|
|||||||
|
|
||||||
static bool amd_iommu_pre_enabled = true;
|
static bool amd_iommu_pre_enabled = true;
|
||||||
|
|
||||||
|
static u32 amd_iommu_ivinfo __initdata;
|
||||||
|
|
||||||
bool translation_pre_enabled(struct amd_iommu *iommu)
|
bool translation_pre_enabled(struct amd_iommu *iommu)
|
||||||
{
|
{
|
||||||
return (iommu->flags & AMD_IOMMU_FLAG_TRANS_PRE_ENABLED);
|
return (iommu->flags & AMD_IOMMU_FLAG_TRANS_PRE_ENABLED);
|
||||||
@@ -296,6 +298,18 @@ int amd_iommu_get_num_iommus(void)
|
|||||||
return amd_iommus_present;
|
return amd_iommus_present;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For IVHD type 0x11/0x40, EFR is also available via IVHD.
|
||||||
|
* Default to IVHD EFR since it is available sooner
|
||||||
|
* (i.e. before PCI init).
|
||||||
|
*/
|
||||||
|
static void __init early_iommu_features_init(struct amd_iommu *iommu,
|
||||||
|
struct ivhd_header *h)
|
||||||
|
{
|
||||||
|
if (amd_iommu_ivinfo & IOMMU_IVINFO_EFRSUP)
|
||||||
|
iommu->features = h->efr_reg;
|
||||||
|
}
|
||||||
|
|
||||||
/* Access to l1 and l2 indexed register spaces */
|
/* Access to l1 and l2 indexed register spaces */
|
||||||
|
|
||||||
static u32 iommu_read_l1(struct amd_iommu *iommu, u16 l1, u8 address)
|
static u32 iommu_read_l1(struct amd_iommu *iommu, u16 l1, u8 address)
|
||||||
@@ -1577,6 +1591,9 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)
|
|||||||
|
|
||||||
if (h->efr_reg & BIT(IOMMU_EFR_XTSUP_SHIFT))
|
if (h->efr_reg & BIT(IOMMU_EFR_XTSUP_SHIFT))
|
||||||
amd_iommu_xt_mode = IRQ_REMAP_X2APIC_MODE;
|
amd_iommu_xt_mode = IRQ_REMAP_X2APIC_MODE;
|
||||||
|
|
||||||
|
early_iommu_features_init(iommu, h);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -1770,6 +1787,35 @@ static const struct attribute_group *amd_iommu_groups[] = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: IVHD 0x11 and 0x40 also contains exact copy
|
||||||
|
* of the IOMMU Extended Feature Register [MMIO Offset 0030h].
|
||||||
|
* Default to EFR in IVHD since it is available sooner (i.e. before PCI init).
|
||||||
|
*/
|
||||||
|
static void __init late_iommu_features_init(struct amd_iommu *iommu)
|
||||||
|
{
|
||||||
|
u64 features;
|
||||||
|
|
||||||
|
if (!(iommu->cap & (1 << IOMMU_CAP_EFR)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* read extended feature bits */
|
||||||
|
features = readq(iommu->mmio_base + MMIO_EXT_FEATURES);
|
||||||
|
|
||||||
|
if (!iommu->features) {
|
||||||
|
iommu->features = features;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check and warn if EFR values from
|
||||||
|
* IVHD and MMIO conflict.
|
||||||
|
*/
|
||||||
|
if (features != iommu->features)
|
||||||
|
pr_warn(FW_WARN "EFR mismatch. Use IVHD EFR (%#llx : %#llx\n).",
|
||||||
|
features, iommu->features);
|
||||||
|
}
|
||||||
|
|
||||||
static int __init iommu_init_pci(struct amd_iommu *iommu)
|
static int __init iommu_init_pci(struct amd_iommu *iommu)
|
||||||
{
|
{
|
||||||
int cap_ptr = iommu->cap_ptr;
|
int cap_ptr = iommu->cap_ptr;
|
||||||
@@ -1789,8 +1835,7 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
|
|||||||
if (!(iommu->cap & (1 << IOMMU_CAP_IOTLB)))
|
if (!(iommu->cap & (1 << IOMMU_CAP_IOTLB)))
|
||||||
amd_iommu_iotlb_sup = false;
|
amd_iommu_iotlb_sup = false;
|
||||||
|
|
||||||
/* read extended feature bits */
|
late_iommu_features_init(iommu);
|
||||||
iommu->features = readq(iommu->mmio_base + MMIO_EXT_FEATURES);
|
|
||||||
|
|
||||||
if (iommu_feature(iommu, FEATURE_GT)) {
|
if (iommu_feature(iommu, FEATURE_GT)) {
|
||||||
int glxval;
|
int glxval;
|
||||||
@@ -2607,6 +2652,11 @@ static void __init free_dma_resources(void)
|
|||||||
free_unity_maps();
|
free_unity_maps();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init ivinfo_init(void *ivrs)
|
||||||
|
{
|
||||||
|
amd_iommu_ivinfo = *((u32 *)(ivrs + IOMMU_IVINFO_OFFSET));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the hardware init function for AMD IOMMU in the system.
|
* This is the hardware init function for AMD IOMMU in the system.
|
||||||
* This function is called either from amd_iommu_init or from the interrupt
|
* This function is called either from amd_iommu_init or from the interrupt
|
||||||
@@ -2661,6 +2711,8 @@ static int __init early_amd_iommu_init(void)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
ivinfo_init(ivrs_base);
|
||||||
|
|
||||||
amd_iommu_target_ivhd_type = get_highest_supported_ivhd_type(ivrs_base);
|
amd_iommu_target_ivhd_type = get_highest_supported_ivhd_type(ivrs_base);
|
||||||
DUMP_printk("Using IVHD type %#x\n", amd_iommu_target_ivhd_type);
|
DUMP_printk("Using IVHD type %#x\n", amd_iommu_target_ivhd_type);
|
||||||
|
|
||||||
|
|||||||
@@ -1496,7 +1496,7 @@ void qi_flush_dev_iotlb_pasid(struct intel_iommu *iommu, u16 sid, u16 pfsid,
|
|||||||
* Max Invs Pending (MIP) is set to 0 for now until we have DIT in
|
* Max Invs Pending (MIP) is set to 0 for now until we have DIT in
|
||||||
* ECAP.
|
* ECAP.
|
||||||
*/
|
*/
|
||||||
if (addr & GENMASK_ULL(size_order + VTD_PAGE_SHIFT, 0))
|
if (!IS_ALIGNED(addr, VTD_PAGE_SIZE << size_order))
|
||||||
pr_warn_ratelimited("Invalidate non-aligned address %llx, order %d\n",
|
pr_warn_ratelimited("Invalidate non-aligned address %llx, order %d\n",
|
||||||
addr, size_order);
|
addr, size_order);
|
||||||
|
|
||||||
|
|||||||
@@ -5440,6 +5440,36 @@ intel_iommu_domain_set_attr(struct iommu_domain *domain,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool domain_use_flush_queue(void)
|
||||||
|
{
|
||||||
|
struct dmar_drhd_unit *drhd;
|
||||||
|
struct intel_iommu *iommu;
|
||||||
|
bool r = true;
|
||||||
|
|
||||||
|
if (intel_iommu_strict)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The flush queue implementation does not perform page-selective
|
||||||
|
* invalidations that are required for efficient TLB flushes in virtual
|
||||||
|
* environments. The benefit of batching is likely to be much lower than
|
||||||
|
* the overhead of synchronizing the virtual and physical IOMMU
|
||||||
|
* page-tables.
|
||||||
|
*/
|
||||||
|
rcu_read_lock();
|
||||||
|
for_each_active_iommu(iommu, drhd) {
|
||||||
|
if (!cap_caching_mode(iommu->cap))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pr_warn_once("IOMMU batching is disabled due to virtualization");
|
||||||
|
r = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
intel_iommu_domain_get_attr(struct iommu_domain *domain,
|
intel_iommu_domain_get_attr(struct iommu_domain *domain,
|
||||||
enum iommu_attr attr, void *data)
|
enum iommu_attr attr, void *data)
|
||||||
@@ -5450,7 +5480,7 @@ intel_iommu_domain_get_attr(struct iommu_domain *domain,
|
|||||||
case IOMMU_DOMAIN_DMA:
|
case IOMMU_DOMAIN_DMA:
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
|
case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
|
||||||
*(int *)data = !intel_iommu_strict;
|
*(int *)data = domain_use_flush_queue();
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|||||||
@@ -928,6 +928,9 @@ config LEDS_ACER_A500
|
|||||||
This option enables support for the Power Button LED of
|
This option enables support for the Power Button LED of
|
||||||
Acer Iconia Tab A500.
|
Acer Iconia Tab A500.
|
||||||
|
|
||||||
|
comment "Flash and Torch LED drivers"
|
||||||
|
source "drivers/leds/flash/Kconfig"
|
||||||
|
|
||||||
comment "LED Triggers"
|
comment "LED Triggers"
|
||||||
source "drivers/leds/trigger/Kconfig"
|
source "drivers/leds/trigger/Kconfig"
|
||||||
|
|
||||||
|
|||||||
@@ -103,5 +103,8 @@ obj-$(CONFIG_LEDS_SPI_BYTE) += leds-spi-byte.o
|
|||||||
# LED Userspace Drivers
|
# LED Userspace Drivers
|
||||||
obj-$(CONFIG_LEDS_USER) += uleds.o
|
obj-$(CONFIG_LEDS_USER) += uleds.o
|
||||||
|
|
||||||
|
# Flash and Torch LED Drivers
|
||||||
|
obj-$(CONFIG_LEDS_CLASS_FLASH) += flash/
|
||||||
|
|
||||||
# LED Triggers
|
# LED Triggers
|
||||||
obj-$(CONFIG_LEDS_TRIGGERS) += trigger/
|
obj-$(CONFIG_LEDS_TRIGGERS) += trigger/
|
||||||
|
|||||||
15
drivers/leds/flash/Kconfig
Normal file
15
drivers/leds/flash/Kconfig
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
if LEDS_CLASS_FLASH
|
||||||
|
|
||||||
|
config LEDS_RT8515
|
||||||
|
tristate "LED support for Richtek RT8515 flash/torch LED"
|
||||||
|
depends on GPIOLIB
|
||||||
|
help
|
||||||
|
This option enables support for the Richtek RT8515 flash
|
||||||
|
and torch LEDs found on some mobile phones.
|
||||||
|
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called leds-rt8515.
|
||||||
|
|
||||||
|
endif # LEDS_CLASS_FLASH
|
||||||
3
drivers/leds/flash/Makefile
Normal file
3
drivers/leds/flash/Makefile
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
obj-$(CONFIG_LEDS_RT8515) += leds-rt8515.o
|
||||||
397
drivers/leds/flash/leds-rt8515.c
Normal file
397
drivers/leds/flash/leds-rt8515.c
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* LED driver for Richtek RT8515 flash/torch white LEDs
|
||||||
|
* found on some Samsung mobile phones.
|
||||||
|
*
|
||||||
|
* This is a 1.5A Boost dual channel driver produced around 2011.
|
||||||
|
*
|
||||||
|
* The component lacks a datasheet, but in the schematic picture
|
||||||
|
* from the LG P970 service manual you can see the connections
|
||||||
|
* from the RT8515 to the LED, with two resistors connected
|
||||||
|
* from the pins "RFS" and "RTS" to ground.
|
||||||
|
*
|
||||||
|
* On the LG P970:
|
||||||
|
* RFS (resistance flash setting?) is 20 kOhm
|
||||||
|
* RTS (resistance torch setting?) is 39 kOhm
|
||||||
|
*
|
||||||
|
* Some sleuthing finds us the RT9387A which we have a datasheet for:
|
||||||
|
* https://static5.arrow.com/pdfs/2014/7/27/8/21/12/794/rtt_/manual/94download_ds.jspprt9387a.jspprt9387a.pdf
|
||||||
|
* This apparently works the same way so in theory this driver
|
||||||
|
* should cover RT9387A as well. This has not been tested, please
|
||||||
|
* update the compatibles if you add RT9387A support.
|
||||||
|
*
|
||||||
|
* Linus Walleij <linus.walleij@linaro.org>
|
||||||
|
*/
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/err.h>
|
||||||
|
#include <linux/gpio/consumer.h>
|
||||||
|
#include <linux/led-class-flash.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/property.h>
|
||||||
|
#include <linux/regulator/consumer.h>
|
||||||
|
|
||||||
|
#include <media/v4l2-flash-led-class.h>
|
||||||
|
|
||||||
|
/* We can provide 15-700 mA out to the LED */
|
||||||
|
#define RT8515_MIN_IOUT_MA 15
|
||||||
|
#define RT8515_MAX_IOUT_MA 700
|
||||||
|
/* The maximum intensity is 1-16 for flash and 1-100 for torch */
|
||||||
|
#define RT8515_FLASH_MAX 16
|
||||||
|
#define RT8515_TORCH_MAX 100
|
||||||
|
|
||||||
|
#define RT8515_TIMEOUT_US 250000U
|
||||||
|
#define RT8515_MAX_TIMEOUT_US 300000U
|
||||||
|
|
||||||
|
struct rt8515 {
|
||||||
|
struct led_classdev_flash fled;
|
||||||
|
struct device *dev;
|
||||||
|
struct v4l2_flash *v4l2_flash;
|
||||||
|
struct mutex lock;
|
||||||
|
struct regulator *reg;
|
||||||
|
struct gpio_desc *enable_torch;
|
||||||
|
struct gpio_desc *enable_flash;
|
||||||
|
struct timer_list powerdown_timer;
|
||||||
|
u32 max_timeout; /* Flash max timeout */
|
||||||
|
int flash_max_intensity;
|
||||||
|
int torch_max_intensity;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct rt8515 *to_rt8515(struct led_classdev_flash *fled)
|
||||||
|
{
|
||||||
|
return container_of(fled, struct rt8515, fled);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rt8515_gpio_led_off(struct rt8515 *rt)
|
||||||
|
{
|
||||||
|
gpiod_set_value(rt->enable_flash, 0);
|
||||||
|
gpiod_set_value(rt->enable_torch, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rt8515_gpio_brightness_commit(struct gpio_desc *gpiod,
|
||||||
|
int brightness)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Toggling a GPIO line with a small delay increases the
|
||||||
|
* brightness one step at a time.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < brightness; i++) {
|
||||||
|
gpiod_set_value(gpiod, 0);
|
||||||
|
udelay(1);
|
||||||
|
gpiod_set_value(gpiod, 1);
|
||||||
|
udelay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is setting the torch light level */
|
||||||
|
static int rt8515_led_brightness_set(struct led_classdev *led,
|
||||||
|
enum led_brightness brightness)
|
||||||
|
{
|
||||||
|
struct led_classdev_flash *fled = lcdev_to_flcdev(led);
|
||||||
|
struct rt8515 *rt = to_rt8515(fled);
|
||||||
|
|
||||||
|
mutex_lock(&rt->lock);
|
||||||
|
|
||||||
|
if (brightness == LED_OFF) {
|
||||||
|
/* Off */
|
||||||
|
rt8515_gpio_led_off(rt);
|
||||||
|
} else if (brightness < RT8515_TORCH_MAX) {
|
||||||
|
/* Step it up to movie mode brightness using the flash pin */
|
||||||
|
rt8515_gpio_brightness_commit(rt->enable_torch, brightness);
|
||||||
|
} else {
|
||||||
|
/* Max torch brightness requested */
|
||||||
|
gpiod_set_value(rt->enable_torch, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&rt->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rt8515_led_flash_strobe_set(struct led_classdev_flash *fled,
|
||||||
|
bool state)
|
||||||
|
{
|
||||||
|
struct rt8515 *rt = to_rt8515(fled);
|
||||||
|
struct led_flash_setting *timeout = &fled->timeout;
|
||||||
|
int brightness = rt->flash_max_intensity;
|
||||||
|
|
||||||
|
mutex_lock(&rt->lock);
|
||||||
|
|
||||||
|
if (state) {
|
||||||
|
/* Enable LED flash mode and set brightness */
|
||||||
|
rt8515_gpio_brightness_commit(rt->enable_flash, brightness);
|
||||||
|
/* Set timeout */
|
||||||
|
mod_timer(&rt->powerdown_timer,
|
||||||
|
jiffies + usecs_to_jiffies(timeout->val));
|
||||||
|
} else {
|
||||||
|
del_timer_sync(&rt->powerdown_timer);
|
||||||
|
/* Turn the LED off */
|
||||||
|
rt8515_gpio_led_off(rt);
|
||||||
|
}
|
||||||
|
|
||||||
|
fled->led_cdev.brightness = LED_OFF;
|
||||||
|
/* After this the torch LED will be disabled */
|
||||||
|
|
||||||
|
mutex_unlock(&rt->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rt8515_led_flash_strobe_get(struct led_classdev_flash *fled,
|
||||||
|
bool *state)
|
||||||
|
{
|
||||||
|
struct rt8515 *rt = to_rt8515(fled);
|
||||||
|
|
||||||
|
*state = timer_pending(&rt->powerdown_timer);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rt8515_led_flash_timeout_set(struct led_classdev_flash *fled,
|
||||||
|
u32 timeout)
|
||||||
|
{
|
||||||
|
/* The timeout is stored in the led-class-flash core */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct led_flash_ops rt8515_flash_ops = {
|
||||||
|
.strobe_set = rt8515_led_flash_strobe_set,
|
||||||
|
.strobe_get = rt8515_led_flash_strobe_get,
|
||||||
|
.timeout_set = rt8515_led_flash_timeout_set,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void rt8515_powerdown_timer(struct timer_list *t)
|
||||||
|
{
|
||||||
|
struct rt8515 *rt = from_timer(rt, t, powerdown_timer);
|
||||||
|
|
||||||
|
/* Turn the LED off */
|
||||||
|
rt8515_gpio_led_off(rt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rt8515_init_flash_timeout(struct rt8515 *rt)
|
||||||
|
{
|
||||||
|
struct led_classdev_flash *fled = &rt->fled;
|
||||||
|
struct led_flash_setting *s;
|
||||||
|
|
||||||
|
/* Init flash timeout setting */
|
||||||
|
s = &fled->timeout;
|
||||||
|
s->min = 1;
|
||||||
|
s->max = rt->max_timeout;
|
||||||
|
s->step = 1;
|
||||||
|
/*
|
||||||
|
* Set default timeout to RT8515_TIMEOUT_US except if
|
||||||
|
* max_timeout from DT is lower.
|
||||||
|
*/
|
||||||
|
s->val = min(rt->max_timeout, RT8515_TIMEOUT_US);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS)
|
||||||
|
/* Configure the V2L2 flash subdevice */
|
||||||
|
static void rt8515_init_v4l2_flash_config(struct rt8515 *rt,
|
||||||
|
struct v4l2_flash_config *v4l2_sd_cfg)
|
||||||
|
{
|
||||||
|
struct led_classdev *led = &rt->fled.led_cdev;
|
||||||
|
struct led_flash_setting *s;
|
||||||
|
|
||||||
|
strscpy(v4l2_sd_cfg->dev_name, led->dev->kobj.name,
|
||||||
|
sizeof(v4l2_sd_cfg->dev_name));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Init flash intensity setting: this is a linear scale
|
||||||
|
* capped from the device tree max intensity setting
|
||||||
|
* 1..flash_max_intensity
|
||||||
|
*/
|
||||||
|
s = &v4l2_sd_cfg->intensity;
|
||||||
|
s->min = 1;
|
||||||
|
s->max = rt->flash_max_intensity;
|
||||||
|
s->step = 1;
|
||||||
|
s->val = s->max;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rt8515_v4l2_flash_release(struct rt8515 *rt)
|
||||||
|
{
|
||||||
|
v4l2_flash_release(rt->v4l2_flash);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
static void rt8515_init_v4l2_flash_config(struct rt8515 *rt,
|
||||||
|
struct v4l2_flash_config *v4l2_sd_cfg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rt8515_v4l2_flash_release(struct rt8515 *rt)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void rt8515_determine_max_intensity(struct rt8515 *rt,
|
||||||
|
struct fwnode_handle *led,
|
||||||
|
const char *resistance,
|
||||||
|
const char *max_ua_prop, int hw_max,
|
||||||
|
int *max_intensity_setting)
|
||||||
|
{
|
||||||
|
u32 res = 0; /* Can't be 0 so 0 is undefined */
|
||||||
|
u32 ua;
|
||||||
|
u32 max_ma;
|
||||||
|
int max_intensity;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
fwnode_property_read_u32(rt->dev->fwnode, resistance, &res);
|
||||||
|
ret = fwnode_property_read_u32(led, max_ua_prop, &ua);
|
||||||
|
|
||||||
|
/* Missing info in DT, OK go with hardware maxima */
|
||||||
|
if (ret || res == 0) {
|
||||||
|
dev_err(rt->dev,
|
||||||
|
"either %s or %s missing from DT, using HW max\n",
|
||||||
|
resistance, max_ua_prop);
|
||||||
|
max_ma = RT8515_MAX_IOUT_MA;
|
||||||
|
max_intensity = hw_max;
|
||||||
|
goto out_assign_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Formula from the datasheet, this is the maximum current
|
||||||
|
* defined by the hardware.
|
||||||
|
*/
|
||||||
|
max_ma = (5500 * 1000) / res;
|
||||||
|
/*
|
||||||
|
* Calculate max intensity (linear scaling)
|
||||||
|
* Formula is ((ua / 1000) / max_ma) * 100, then simplified
|
||||||
|
*/
|
||||||
|
max_intensity = (ua / 10) / max_ma;
|
||||||
|
|
||||||
|
dev_info(rt->dev,
|
||||||
|
"current restricted from %u to %u mA, max intensity %d/100\n",
|
||||||
|
max_ma, (ua / 1000), max_intensity);
|
||||||
|
|
||||||
|
out_assign_max:
|
||||||
|
dev_info(rt->dev, "max intensity %d/%d = %d mA\n",
|
||||||
|
max_intensity, hw_max, max_ma);
|
||||||
|
*max_intensity_setting = max_intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rt8515_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
struct fwnode_handle *child;
|
||||||
|
struct rt8515 *rt;
|
||||||
|
struct led_classdev *led;
|
||||||
|
struct led_classdev_flash *fled;
|
||||||
|
struct led_init_data init_data = {};
|
||||||
|
struct v4l2_flash_config v4l2_sd_cfg = {};
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
rt = devm_kzalloc(dev, sizeof(*rt), GFP_KERNEL);
|
||||||
|
if (!rt)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
rt->dev = dev;
|
||||||
|
fled = &rt->fled;
|
||||||
|
led = &fled->led_cdev;
|
||||||
|
|
||||||
|
/* ENF - Enable Flash line */
|
||||||
|
rt->enable_flash = devm_gpiod_get(dev, "enf", GPIOD_OUT_LOW);
|
||||||
|
if (IS_ERR(rt->enable_flash))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(rt->enable_flash),
|
||||||
|
"cannot get ENF (enable flash) GPIO\n");
|
||||||
|
|
||||||
|
/* ENT - Enable Torch line */
|
||||||
|
rt->enable_torch = devm_gpiod_get(dev, "ent", GPIOD_OUT_LOW);
|
||||||
|
if (IS_ERR(rt->enable_torch))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(rt->enable_torch),
|
||||||
|
"cannot get ENT (enable torch) GPIO\n");
|
||||||
|
|
||||||
|
child = fwnode_get_next_available_child_node(dev->fwnode, NULL);
|
||||||
|
if (!child) {
|
||||||
|
dev_err(dev,
|
||||||
|
"No fwnode child node found for connected LED.\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
init_data.fwnode = child;
|
||||||
|
|
||||||
|
rt8515_determine_max_intensity(rt, child, "richtek,rfs-ohms",
|
||||||
|
"flash-max-microamp",
|
||||||
|
RT8515_FLASH_MAX,
|
||||||
|
&rt->flash_max_intensity);
|
||||||
|
rt8515_determine_max_intensity(rt, child, "richtek,rts-ohms",
|
||||||
|
"led-max-microamp",
|
||||||
|
RT8515_TORCH_MAX,
|
||||||
|
&rt->torch_max_intensity);
|
||||||
|
|
||||||
|
ret = fwnode_property_read_u32(child, "flash-max-timeout-us",
|
||||||
|
&rt->max_timeout);
|
||||||
|
if (ret) {
|
||||||
|
rt->max_timeout = RT8515_MAX_TIMEOUT_US;
|
||||||
|
dev_warn(dev,
|
||||||
|
"flash-max-timeout-us property missing\n");
|
||||||
|
}
|
||||||
|
timer_setup(&rt->powerdown_timer, rt8515_powerdown_timer, 0);
|
||||||
|
rt8515_init_flash_timeout(rt);
|
||||||
|
|
||||||
|
fled->ops = &rt8515_flash_ops;
|
||||||
|
|
||||||
|
led->max_brightness = rt->torch_max_intensity;
|
||||||
|
led->brightness_set_blocking = rt8515_led_brightness_set;
|
||||||
|
led->flags |= LED_CORE_SUSPENDRESUME | LED_DEV_CAP_FLASH;
|
||||||
|
|
||||||
|
mutex_init(&rt->lock);
|
||||||
|
|
||||||
|
platform_set_drvdata(pdev, rt);
|
||||||
|
|
||||||
|
ret = devm_led_classdev_flash_register_ext(dev, fled, &init_data);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "can't register LED %s\n", led->name);
|
||||||
|
mutex_destroy(&rt->lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt8515_init_v4l2_flash_config(rt, &v4l2_sd_cfg);
|
||||||
|
|
||||||
|
/* Create a V4L2 Flash device if V4L2 flash is enabled */
|
||||||
|
rt->v4l2_flash = v4l2_flash_init(dev, child, fled, NULL, &v4l2_sd_cfg);
|
||||||
|
if (IS_ERR(rt->v4l2_flash)) {
|
||||||
|
ret = PTR_ERR(rt->v4l2_flash);
|
||||||
|
dev_err(dev, "failed to register V4L2 flash device (%d)\n",
|
||||||
|
ret);
|
||||||
|
/*
|
||||||
|
* Continue without the V4L2 flash
|
||||||
|
* (we still have the classdev)
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rt8515_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct rt8515 *rt = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
rt8515_v4l2_flash_release(rt);
|
||||||
|
del_timer_sync(&rt->powerdown_timer);
|
||||||
|
mutex_destroy(&rt->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id rt8515_match[] = {
|
||||||
|
{ .compatible = "richtek,rt8515", },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, rt8515_match);
|
||||||
|
|
||||||
|
static struct platform_driver rt8515_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "rt8515",
|
||||||
|
.of_match_table = rt8515_match,
|
||||||
|
},
|
||||||
|
.probe = rt8515_probe,
|
||||||
|
.remove = rt8515_remove,
|
||||||
|
};
|
||||||
|
module_platform_driver(rt8515_driver);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
|
||||||
|
MODULE_DESCRIPTION("Richtek RT8515 LED driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
@@ -378,14 +378,15 @@ void led_trigger_event(struct led_trigger *trig,
|
|||||||
enum led_brightness brightness)
|
enum led_brightness brightness)
|
||||||
{
|
{
|
||||||
struct led_classdev *led_cdev;
|
struct led_classdev *led_cdev;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (!trig)
|
if (!trig)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
read_lock(&trig->leddev_list_lock);
|
read_lock_irqsave(&trig->leddev_list_lock, flags);
|
||||||
list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
|
list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
|
||||||
led_set_brightness(led_cdev, brightness);
|
led_set_brightness(led_cdev, brightness);
|
||||||
read_unlock(&trig->leddev_list_lock);
|
read_unlock_irqrestore(&trig->leddev_list_lock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(led_trigger_event);
|
EXPORT_SYMBOL_GPL(led_trigger_event);
|
||||||
|
|
||||||
@@ -396,11 +397,12 @@ static void led_trigger_blink_setup(struct led_trigger *trig,
|
|||||||
int invert)
|
int invert)
|
||||||
{
|
{
|
||||||
struct led_classdev *led_cdev;
|
struct led_classdev *led_cdev;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (!trig)
|
if (!trig)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
read_lock(&trig->leddev_list_lock);
|
read_lock_irqsave(&trig->leddev_list_lock, flags);
|
||||||
list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) {
|
list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) {
|
||||||
if (oneshot)
|
if (oneshot)
|
||||||
led_blink_set_oneshot(led_cdev, delay_on, delay_off,
|
led_blink_set_oneshot(led_cdev, delay_on, delay_off,
|
||||||
@@ -408,7 +410,7 @@ static void led_trigger_blink_setup(struct led_trigger *trig,
|
|||||||
else
|
else
|
||||||
led_blink_set(led_cdev, delay_on, delay_off);
|
led_blink_set(led_cdev, delay_on, delay_off);
|
||||||
}
|
}
|
||||||
read_unlock(&trig->leddev_list_lock);
|
read_unlock_irqrestore(&trig->leddev_list_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void led_trigger_blink(struct led_trigger *trig,
|
void led_trigger_blink(struct led_trigger *trig,
|
||||||
|
|||||||
@@ -96,14 +96,14 @@ static int ariel_led_probe(struct platform_device *pdev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
leds[0].ec_index = EC_BLUE_LED;
|
leds[0].ec_index = EC_BLUE_LED;
|
||||||
leds[0].led_cdev.name = "blue:power",
|
leds[0].led_cdev.name = "blue:power";
|
||||||
leds[0].led_cdev.default_trigger = "default-on";
|
leds[0].led_cdev.default_trigger = "default-on";
|
||||||
|
|
||||||
leds[1].ec_index = EC_AMBER_LED;
|
leds[1].ec_index = EC_AMBER_LED;
|
||||||
leds[1].led_cdev.name = "amber:status",
|
leds[1].led_cdev.name = "amber:status";
|
||||||
|
|
||||||
leds[2].ec_index = EC_GREEN_LED;
|
leds[2].ec_index = EC_GREEN_LED;
|
||||||
leds[2].led_cdev.name = "green:status",
|
leds[2].led_cdev.name = "green:status";
|
||||||
leds[2].led_cdev.default_trigger = "default-on";
|
leds[2].led_cdev.default_trigger = "default-on";
|
||||||
|
|
||||||
for (i = 0; i < NLEDS; i++) {
|
for (i = 0; i < NLEDS; i++) {
|
||||||
|
|||||||
@@ -679,7 +679,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
|
|||||||
led->cdev.brightness_get = lm3533_led_get;
|
led->cdev.brightness_get = lm3533_led_get;
|
||||||
led->cdev.blink_set = lm3533_led_blink_set;
|
led->cdev.blink_set = lm3533_led_blink_set;
|
||||||
led->cdev.brightness = LED_OFF;
|
led->cdev.brightness = LED_OFF;
|
||||||
led->cdev.groups = lm3533_led_attribute_groups,
|
led->cdev.groups = lm3533_led_attribute_groups;
|
||||||
led->id = pdev->id;
|
led->id = pdev->id;
|
||||||
|
|
||||||
mutex_init(&led->mutex);
|
mutex_init(&led->mutex);
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
#define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \
|
#define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \
|
||||||
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||||
{ \
|
{ \
|
||||||
|
if (sb->version < BCACHE_SB_VERSION_CDEV_WITH_FEATURES) \
|
||||||
|
return 0; \
|
||||||
return (((sb)->feature_compat & \
|
return (((sb)->feature_compat & \
|
||||||
BCH##_FEATURE_COMPAT_##flagname) != 0); \
|
BCH##_FEATURE_COMPAT_##flagname) != 0); \
|
||||||
} \
|
} \
|
||||||
@@ -50,6 +52,8 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
|||||||
#define BCH_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
|
#define BCH_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
|
||||||
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||||
{ \
|
{ \
|
||||||
|
if (sb->version < BCACHE_SB_VERSION_CDEV_WITH_FEATURES) \
|
||||||
|
return 0; \
|
||||||
return (((sb)->feature_ro_compat & \
|
return (((sb)->feature_ro_compat & \
|
||||||
BCH##_FEATURE_RO_COMPAT_##flagname) != 0); \
|
BCH##_FEATURE_RO_COMPAT_##flagname) != 0); \
|
||||||
} \
|
} \
|
||||||
@@ -67,6 +71,8 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
|||||||
#define BCH_FEATURE_INCOMPAT_FUNCS(name, flagname) \
|
#define BCH_FEATURE_INCOMPAT_FUNCS(name, flagname) \
|
||||||
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||||
{ \
|
{ \
|
||||||
|
if (sb->version < BCACHE_SB_VERSION_CDEV_WITH_FEATURES) \
|
||||||
|
return 0; \
|
||||||
return (((sb)->feature_incompat & \
|
return (((sb)->feature_incompat & \
|
||||||
BCH##_FEATURE_INCOMPAT_##flagname) != 0); \
|
BCH##_FEATURE_INCOMPAT_##flagname) != 0); \
|
||||||
} \
|
} \
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
struct rkisp1_match_data {
|
struct rkisp1_match_data {
|
||||||
const char * const *clks;
|
const char * const *clks;
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
|
enum rkisp1_cif_isp_version isp_ver;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
@@ -411,15 +412,16 @@ static const char * const rk3399_isp_clks[] = {
|
|||||||
"hclk",
|
"hclk",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct rkisp1_match_data rk3399_isp_clk_data = {
|
static const struct rkisp1_match_data rk3399_isp_match_data = {
|
||||||
.clks = rk3399_isp_clks,
|
.clks = rk3399_isp_clks,
|
||||||
.size = ARRAY_SIZE(rk3399_isp_clks),
|
.size = ARRAY_SIZE(rk3399_isp_clks),
|
||||||
|
.isp_ver = RKISP1_V10,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id rkisp1_of_match[] = {
|
static const struct of_device_id rkisp1_of_match[] = {
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3399-cif-isp",
|
.compatible = "rockchip,rk3399-cif-isp",
|
||||||
.data = &rk3399_isp_clk_data,
|
.data = &rk3399_isp_match_data,
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
@@ -457,15 +459,15 @@ static void rkisp1_debug_init(struct rkisp1_device *rkisp1)
|
|||||||
|
|
||||||
static int rkisp1_probe(struct platform_device *pdev)
|
static int rkisp1_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct rkisp1_match_data *clk_data;
|
const struct rkisp1_match_data *match_data;
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct rkisp1_device *rkisp1;
|
struct rkisp1_device *rkisp1;
|
||||||
struct v4l2_device *v4l2_dev;
|
struct v4l2_device *v4l2_dev;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int ret, irq;
|
int ret, irq;
|
||||||
|
|
||||||
clk_data = of_device_get_match_data(&pdev->dev);
|
match_data = of_device_get_match_data(&pdev->dev);
|
||||||
if (!clk_data)
|
if (!match_data)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
rkisp1 = devm_kzalloc(dev, sizeof(*rkisp1), GFP_KERNEL);
|
rkisp1 = devm_kzalloc(dev, sizeof(*rkisp1), GFP_KERNEL);
|
||||||
@@ -494,15 +496,16 @@ static int rkisp1_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
rkisp1->irq = irq;
|
rkisp1->irq = irq;
|
||||||
|
|
||||||
for (i = 0; i < clk_data->size; i++)
|
for (i = 0; i < match_data->size; i++)
|
||||||
rkisp1->clks[i].id = clk_data->clks[i];
|
rkisp1->clks[i].id = match_data->clks[i];
|
||||||
ret = devm_clk_bulk_get(dev, clk_data->size, rkisp1->clks);
|
ret = devm_clk_bulk_get(dev, match_data->size, rkisp1->clks);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
rkisp1->clk_size = clk_data->size;
|
rkisp1->clk_size = match_data->size;
|
||||||
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
pm_runtime_enable(&pdev->dev);
|
||||||
|
|
||||||
|
rkisp1->media_dev.hw_revision = match_data->isp_ver;
|
||||||
strscpy(rkisp1->media_dev.model, RKISP1_DRIVER_NAME,
|
strscpy(rkisp1->media_dev.model, RKISP1_DRIVER_NAME,
|
||||||
sizeof(rkisp1->media_dev.model));
|
sizeof(rkisp1->media_dev.model));
|
||||||
rkisp1->media_dev.dev = &pdev->dev;
|
rkisp1->media_dev.dev = &pdev->dev;
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ static void rkisp1_goc_config(struct rkisp1_params *params,
|
|||||||
RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
|
RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA);
|
||||||
rkisp1_write(params->rkisp1, arg->mode, RKISP1_CIF_ISP_GAMMA_OUT_MODE);
|
rkisp1_write(params->rkisp1, arg->mode, RKISP1_CIF_ISP_GAMMA_OUT_MODE);
|
||||||
|
|
||||||
for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES; i++)
|
for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10; i++)
|
||||||
rkisp1_write(params->rkisp1, arg->gamma_y[i],
|
rkisp1_write(params->rkisp1, arg->gamma_y[i],
|
||||||
RKISP1_CIF_ISP_GAMMA_OUT_Y_0 + i * 4);
|
RKISP1_CIF_ISP_GAMMA_OUT_Y_0 + i * 4);
|
||||||
}
|
}
|
||||||
@@ -589,7 +589,6 @@ static void rkisp1_hst_config(struct rkisp1_params *params,
|
|||||||
RKISP1_CIF_ISP_HIST_WEIGHT_22TO03,
|
RKISP1_CIF_ISP_HIST_WEIGHT_22TO03,
|
||||||
RKISP1_CIF_ISP_HIST_WEIGHT_13TO43,
|
RKISP1_CIF_ISP_HIST_WEIGHT_13TO43,
|
||||||
RKISP1_CIF_ISP_HIST_WEIGHT_04TO34,
|
RKISP1_CIF_ISP_HIST_WEIGHT_04TO34,
|
||||||
RKISP1_CIF_ISP_HIST_WEIGHT_44,
|
|
||||||
};
|
};
|
||||||
const u8 *weight;
|
const u8 *weight;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@@ -622,6 +621,8 @@ static void rkisp1_hst_config(struct rkisp1_params *params,
|
|||||||
weight[2],
|
weight[2],
|
||||||
weight[3]),
|
weight[3]),
|
||||||
hist_weight_regs[i]);
|
hist_weight_regs[i]);
|
||||||
|
|
||||||
|
rkisp1_write(params->rkisp1, weight[0] & 0x1F, RKISP1_CIF_ISP_HIST_WEIGHT_44);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -365,6 +365,7 @@
|
|||||||
#define RKISP1_CIF_ISP_MAX_HIST_PREDIVIDER 0x0000007F
|
#define RKISP1_CIF_ISP_MAX_HIST_PREDIVIDER 0x0000007F
|
||||||
#define RKISP1_CIF_ISP_HIST_ROW_NUM 5
|
#define RKISP1_CIF_ISP_HIST_ROW_NUM 5
|
||||||
#define RKISP1_CIF_ISP_HIST_COLUMN_NUM 5
|
#define RKISP1_CIF_ISP_HIST_COLUMN_NUM 5
|
||||||
|
#define RKISP1_CIF_ISP_HIST_GET_BIN(x) ((x) & 0x000FFFFF)
|
||||||
|
|
||||||
/* AUTO FOCUS MEASUREMENT: ISP_AFM_CTRL */
|
/* AUTO FOCUS MEASUREMENT: ISP_AFM_CTRL */
|
||||||
#define RKISP1_ISP_AFM_CTRL_ENABLE BIT(0)
|
#define RKISP1_ISP_AFM_CTRL_ENABLE BIT(0)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user