drm-misc-next for 6.17:
UAPI Changes: Cross-subsystem Changes: Core Changes: - ci: Add Device tree validation and kunit - connector: Move HDR sink metadat to drm_display_info Driver Changes: - bochs: drm_panic Support - panfrost: MT8370 Support - bridge: - tc358767: Convert to devm_drm_bridge_alloc() -----BEGIN PGP SIGNATURE----- iJUEABMJAB0WIQTkHFbLp4ejekA/qfgnX84Zoj2+dgUCaFz/WQAKCRAnX84Zoj2+ dkleAYCy2fVEqt/1/A9UDlpfxEQi52JvmmxQPRo34iDb2sB1MdWseNC4fqYNtrUe LpVma94BfjfKq+UTvsj4SSEuhRFVQty+x8yjXZIj4ckBD2MP1B2+NfQrhDKMTeWP /s0b2UaLQw== =tS63 -----END PGP SIGNATURE----- Merge tag 'drm-misc-next-2025-06-26' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next drm-misc-next for 6.17: UAPI Changes: Cross-subsystem Changes: Core Changes: - ci: Add Device tree validation and kunit - connector: Move HDR sink metadat to drm_display_info Driver Changes: - bochs: drm_panic Support - panfrost: MT8370 Support - bridge: - tc358767: Convert to devm_drm_bridge_alloc() Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <mripard@redhat.com> Link: https://lore.kernel.org/r/20250626-sincere-loon-of-effort-6dbdf9@houatpull/1279/head
commit
f41830c57b
|
|
@ -42,6 +42,7 @@ properties:
|
||||||
- enum:
|
- enum:
|
||||||
- mediatek,mt8188-mali
|
- mediatek,mt8188-mali
|
||||||
- mediatek,mt8192-mali
|
- mediatek,mt8192-mali
|
||||||
|
- mediatek,mt8370-mali
|
||||||
- const: arm,mali-valhall-jm # Mali Valhall GPU model/revision is fully discoverable
|
- const: arm,mali-valhall-jm # Mali Valhall GPU model/revision is fully discoverable
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
|
|
@ -225,7 +226,9 @@ allOf:
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
contains:
|
contains:
|
||||||
const: mediatek,mt8186-mali
|
enum:
|
||||||
|
- mediatek,mt8186-mali
|
||||||
|
- mediatek,mt8370-mali
|
||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
power-domains:
|
power-domains:
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,22 @@
|
||||||
<&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
<&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Please note that overriding compatibles is a discouraged practice and is a
|
||||||
|
* clear indication of nodes not being, well, compatible!
|
||||||
|
*
|
||||||
|
* This is a special case, where the GPU is the same as MT8188, but with one
|
||||||
|
* of the cores fused out in this lower-binned SoC.
|
||||||
|
*/
|
||||||
|
&gpu {
|
||||||
|
compatible = "mediatek,mt8370-mali", "arm,mali-valhall-jm";
|
||||||
|
|
||||||
|
power-domains = <&spm MT8188_POWER_DOMAIN_MFG2>,
|
||||||
|
<&spm MT8188_POWER_DOMAIN_MFG3>;
|
||||||
|
|
||||||
|
power-domain-names = "core0", "core1";
|
||||||
|
};
|
||||||
|
|
||||||
&ppi_cluster0 {
|
&ppi_cluster0 {
|
||||||
affinity = <&cpu0 &cpu1 &cpu2 &cpu3>;
|
affinity = <&cpu0 &cpu1 &cpu2 &cpu3>;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -344,6 +344,14 @@
|
||||||
#define COLOR_BAR_MODE_BARS 2
|
#define COLOR_BAR_MODE_BARS 2
|
||||||
#define PLL_DBG 0x0a04
|
#define PLL_DBG 0x0a04
|
||||||
|
|
||||||
|
enum tc_mode {
|
||||||
|
mode_dpi_to_edp = BIT(1) | BIT(2),
|
||||||
|
mode_dpi_to_dp = BIT(1),
|
||||||
|
mode_dsi_to_edp = BIT(0) | BIT(2),
|
||||||
|
mode_dsi_to_dp = BIT(0),
|
||||||
|
mode_dsi_to_dpi = BIT(0) | BIT(1),
|
||||||
|
};
|
||||||
|
|
||||||
static bool tc_test_pattern;
|
static bool tc_test_pattern;
|
||||||
module_param_named(test, tc_test_pattern, bool, 0644);
|
module_param_named(test, tc_test_pattern, bool, 0644);
|
||||||
|
|
||||||
|
|
@ -2327,7 +2335,6 @@ static int tc_probe_dpi_bridge_endpoint(struct tc_data *tc)
|
||||||
if (bridge) {
|
if (bridge) {
|
||||||
tc->panel_bridge = bridge;
|
tc->panel_bridge = bridge;
|
||||||
tc->bridge.type = DRM_MODE_CONNECTOR_DPI;
|
tc->bridge.type = DRM_MODE_CONNECTOR_DPI;
|
||||||
tc->bridge.funcs = &tc_dpi_bridge_funcs;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -2360,7 +2367,6 @@ static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
|
||||||
tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
|
tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
tc->bridge.funcs = &tc_edp_bridge_funcs;
|
|
||||||
if (tc->hpd_pin >= 0)
|
if (tc->hpd_pin >= 0)
|
||||||
tc->bridge.ops |= DRM_BRIDGE_OP_DETECT;
|
tc->bridge.ops |= DRM_BRIDGE_OP_DETECT;
|
||||||
tc->bridge.ops |= DRM_BRIDGE_OP_EDID;
|
tc->bridge.ops |= DRM_BRIDGE_OP_EDID;
|
||||||
|
|
@ -2368,17 +2374,11 @@ static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tc_probe_bridge_endpoint(struct tc_data *tc)
|
static enum tc_mode tc_probe_get_mode(struct device *dev)
|
||||||
{
|
{
|
||||||
struct device *dev = tc->dev;
|
|
||||||
struct of_endpoint endpoint;
|
struct of_endpoint endpoint;
|
||||||
struct device_node *node = NULL;
|
struct device_node *node = NULL;
|
||||||
const u8 mode_dpi_to_edp = BIT(1) | BIT(2);
|
enum tc_mode mode = 0;
|
||||||
const u8 mode_dpi_to_dp = BIT(1);
|
|
||||||
const u8 mode_dsi_to_edp = BIT(0) | BIT(2);
|
|
||||||
const u8 mode_dsi_to_dp = BIT(0);
|
|
||||||
const u8 mode_dsi_to_dpi = BIT(0) | BIT(1);
|
|
||||||
u8 mode = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine bridge configuration.
|
* Determine bridge configuration.
|
||||||
|
|
@ -2401,7 +2401,27 @@ static int tc_probe_bridge_endpoint(struct tc_data *tc)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
mode |= BIT(endpoint.port);
|
mode |= BIT(endpoint.port);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode != mode_dpi_to_edp &&
|
||||||
|
mode != mode_dpi_to_dp &&
|
||||||
|
mode != mode_dsi_to_dpi &&
|
||||||
|
mode != mode_dsi_to_edp &&
|
||||||
|
mode != mode_dsi_to_dp) {
|
||||||
|
dev_warn(dev, "Invalid mode (0x%x) is not supported!\n", mode);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tc_probe_bridge_endpoint(struct tc_data *tc, enum tc_mode mode)
|
||||||
|
{
|
||||||
|
struct device *dev = tc->dev;
|
||||||
|
struct of_endpoint endpoint;
|
||||||
|
struct device_node *node = NULL;
|
||||||
|
|
||||||
|
for_each_endpoint_of_node(dev->of_node, node) {
|
||||||
if (endpoint.port == 2) {
|
if (endpoint.port == 2) {
|
||||||
of_property_read_u8_array(node, "toshiba,pre-emphasis",
|
of_property_read_u8_array(node, "toshiba,pre-emphasis",
|
||||||
tc->pre_emphasis,
|
tc->pre_emphasis,
|
||||||
|
|
@ -2427,24 +2447,28 @@ static int tc_probe_bridge_endpoint(struct tc_data *tc)
|
||||||
return tc_probe_edp_bridge_endpoint(tc);
|
return tc_probe_edp_bridge_endpoint(tc);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_warn(dev, "Invalid mode (0x%x) is not supported!\n", mode);
|
/* Should never happen, mode was validated by tc_probe_get_mode() */
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tc_probe(struct i2c_client *client)
|
static int tc_probe(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct device *dev = &client->dev;
|
struct device *dev = &client->dev;
|
||||||
|
const struct drm_bridge_funcs *funcs;
|
||||||
struct tc_data *tc;
|
struct tc_data *tc;
|
||||||
|
int mode;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL);
|
mode = tc_probe_get_mode(dev);
|
||||||
if (!tc)
|
funcs = (mode == mode_dsi_to_dpi) ? &tc_dpi_bridge_funcs : &tc_edp_bridge_funcs;
|
||||||
return -ENOMEM;
|
|
||||||
|
tc = devm_drm_bridge_alloc(dev, struct tc_data, bridge, funcs);
|
||||||
|
if (IS_ERR(tc))
|
||||||
|
return PTR_ERR(tc);
|
||||||
|
|
||||||
tc->dev = dev;
|
tc->dev = dev;
|
||||||
|
|
||||||
ret = tc_probe_bridge_endpoint(tc);
|
ret = tc_probe_bridge_endpoint(tc, mode);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
.dt-check-base:
|
||||||
|
stage: static-checks
|
||||||
|
timeout: "30m"
|
||||||
|
variables:
|
||||||
|
GIT_DEPTH: 1
|
||||||
|
FF_USE_NEW_BASH_EVAL_STRATEGY: 'true'
|
||||||
|
SCHEMA: "display:gpu"
|
||||||
|
VENV_PATH: "/tmp/dtcheck-venv"
|
||||||
|
before_script:
|
||||||
|
- apt-get update -qq
|
||||||
|
# Minimum supported version of LLVM for building x86 kernels is 15.0.0.
|
||||||
|
# In mesa-ci containers, LLVM_VERSION is defined as a container-level property and is currently set to 19.
|
||||||
|
- apt-get install -y --no-install-recommends clang-${LLVM_VERSION} lld-${LLVM_VERSION} llvm-${LLVM_VERSION} python3-dev python3-venv python3-pip yamllint
|
||||||
|
- python3 -m venv "${VENV_PATH}"
|
||||||
|
- source "${VENV_PATH}/bin/activate"
|
||||||
|
- pip3 install dtschema
|
||||||
|
script:
|
||||||
|
- drivers/gpu/drm/ci/${SCRIPT_NAME}
|
||||||
|
artifacts:
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- ${ARTIFACT_FILE}
|
||||||
|
allow_failure:
|
||||||
|
exit_codes:
|
||||||
|
- 102
|
||||||
|
|
||||||
|
dtbs-check:arm32:
|
||||||
|
extends:
|
||||||
|
- .build:arm32
|
||||||
|
- .dt-check-base
|
||||||
|
variables:
|
||||||
|
SCRIPT_NAME: "dtbs-check.sh"
|
||||||
|
ARTIFACT_FILE: "dtbs-check.log"
|
||||||
|
|
||||||
|
dtbs-check:arm64:
|
||||||
|
extends:
|
||||||
|
- .build:arm64
|
||||||
|
- .dt-check-base
|
||||||
|
variables:
|
||||||
|
SCRIPT_NAME: "dtbs-check.sh"
|
||||||
|
ARTIFACT_FILE: "dtbs-check.log"
|
||||||
|
|
||||||
|
dt-binding-check:
|
||||||
|
extends:
|
||||||
|
- .build
|
||||||
|
- .use-debian/x86_64_build
|
||||||
|
- .dt-check-base
|
||||||
|
variables:
|
||||||
|
SCRIPT_NAME: "dt-binding-check.sh"
|
||||||
|
ARTIFACT_FILE: "dt-binding-check.log"
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
VENV_PATH="${VENV_PATH:-/tmp/dtschema-venv}"
|
||||||
|
source "${VENV_PATH}/bin/activate"
|
||||||
|
|
||||||
|
if ! make -j"${FDO_CI_CONCURRENT:-4}" dt_binding_check \
|
||||||
|
DT_SCHEMA_FILES="${SCHEMA:-}" 2>dt-binding-check.log; then
|
||||||
|
echo "ERROR: 'make dt_binding_check' failed. Please check dt-binding-check.log for details."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -s dt-binding-check.log ]]; then
|
||||||
|
echo "WARNING: dt_binding_check reported warnings. Please check dt-binding-check.log" \
|
||||||
|
"for details."
|
||||||
|
exit 102
|
||||||
|
fi
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
: "${KERNEL_ARCH:?ERROR: KERNEL_ARCH must be set}"
|
||||||
|
: "${LLVM_VERSION:?ERROR: LLVM_VERSION must be set}"
|
||||||
|
|
||||||
|
./drivers/gpu/drm/ci/setup-llvm-links.sh
|
||||||
|
|
||||||
|
make LLVM=1 ARCH="${KERNEL_ARCH}" defconfig
|
||||||
|
|
||||||
|
if ! make -j"${FDO_CI_CONCURRENT:-4}" ARCH="${KERNEL_ARCH}" LLVM=1 dtbs_check \
|
||||||
|
DT_SCHEMA_FILES="${SCHEMA:-}" 2>dtbs-check.log; then
|
||||||
|
echo "ERROR: 'make dtbs_check' failed. Please check dtbs-check.log for details."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -s dtbs-check.log ]]; then
|
||||||
|
echo "WARNING: dtbs_check reported warnings. Please check dtbs-check.log for details."
|
||||||
|
exit 102
|
||||||
|
fi
|
||||||
|
|
@ -110,6 +110,8 @@ include:
|
||||||
- drivers/gpu/drm/ci/static-checks.yml
|
- drivers/gpu/drm/ci/static-checks.yml
|
||||||
- drivers/gpu/drm/ci/build.yml
|
- drivers/gpu/drm/ci/build.yml
|
||||||
- drivers/gpu/drm/ci/test.yml
|
- drivers/gpu/drm/ci/test.yml
|
||||||
|
- drivers/gpu/drm/ci/check-devicetrees.yml
|
||||||
|
- drivers/gpu/drm/ci/kunit.yml
|
||||||
- 'https://gitlab.freedesktop.org/gfx-ci/lab-status/-/raw/main/lab-status.yml'
|
- 'https://gitlab.freedesktop.org/gfx-ci/lab-status/-/raw/main/lab-status.yml'
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -119,6 +121,8 @@ stages:
|
||||||
- git-archive
|
- git-archive
|
||||||
- build-for-tests
|
- build-for-tests
|
||||||
- build-only
|
- build-only
|
||||||
|
- static-checks
|
||||||
|
- kunit
|
||||||
- code-validation
|
- code-validation
|
||||||
- amdgpu
|
- amdgpu
|
||||||
- i915
|
- i915
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
: "${KERNEL_ARCH:?ERROR: KERNEL_ARCH must be set}"
|
||||||
|
: "${LLVM_VERSION:?ERROR: LLVM_VERSION must be set}"
|
||||||
|
|
||||||
|
./drivers/gpu/drm/ci/setup-llvm-links.sh
|
||||||
|
|
||||||
|
export PATH="/usr/bin:$PATH"
|
||||||
|
|
||||||
|
./tools/testing/kunit/kunit.py run \
|
||||||
|
--arch "${KERNEL_ARCH}" \
|
||||||
|
--make_options LLVM=1 \
|
||||||
|
--kunitconfig=drivers/gpu/drm/tests
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
.kunit-packages: &kunit-packages
|
||||||
|
- apt-get update -qq
|
||||||
|
# Minimum supported version of LLVM for building x86 kernels is 15.0.0.
|
||||||
|
# In mesa-ci containers, LLVM_VERSION is defined as a container-level property and is currently set to 19.
|
||||||
|
- apt-get install -y --no-install-recommends clang-${LLVM_VERSION} lld-${LLVM_VERSION} llvm-${LLVM_VERSION}
|
||||||
|
|
||||||
|
.kunit-base:
|
||||||
|
stage: kunit
|
||||||
|
timeout: "30m"
|
||||||
|
variables:
|
||||||
|
GIT_DEPTH: 1
|
||||||
|
script:
|
||||||
|
- drivers/gpu/drm/ci/kunit.sh
|
||||||
|
|
||||||
|
kunit:arm32:
|
||||||
|
extends:
|
||||||
|
- .build:arm32
|
||||||
|
- .kunit-base
|
||||||
|
before_script:
|
||||||
|
- *kunit-packages
|
||||||
|
- apt-get install -y --no-install-recommends qemu-system-arm
|
||||||
|
|
||||||
|
kunit:arm64:
|
||||||
|
extends:
|
||||||
|
- .build:arm64
|
||||||
|
- .kunit-base
|
||||||
|
before_script:
|
||||||
|
- *kunit-packages
|
||||||
|
- apt-get install -y --no-install-recommends qemu-system-aarch64
|
||||||
|
|
||||||
|
kunit:x86_64:
|
||||||
|
extends:
|
||||||
|
- .build:x86_64
|
||||||
|
- .kunit-base
|
||||||
|
before_script:
|
||||||
|
- *kunit-packages
|
||||||
|
- apt-get install -y --no-install-recommends qemu-system-x86
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ln -svf "$(which clang++-${LLVM_VERSION})" /usr/bin/clang++
|
||||||
|
ln -svf "$(which clang-${LLVM_VERSION})" /usr/bin/clang
|
||||||
|
ln -svf "$(which ld.lld-${LLVM_VERSION})" /usr/bin/ld.lld
|
||||||
|
ln -svf "$(which lld-${LLVM_VERSION})" /usr/bin/lld
|
||||||
|
ln -svf "$(which llvm-ar-${LLVM_VERSION})" /usr/bin/llvm-ar
|
||||||
|
ln -svf "$(which llvm-nm-${LLVM_VERSION})" /usr/bin/llvm-nm
|
||||||
|
ln -svf "$(which llvm-objcopy-${LLVM_VERSION})" /usr/bin/llvm-objcopy
|
||||||
|
ln -svf "$(which llvm-readelf-${LLVM_VERSION})" /usr/bin/llvm-readelf
|
||||||
|
ln -svf "$(which llvm-strip-${LLVM_VERSION})" /usr/bin/llvm-strip
|
||||||
|
|
@ -45,7 +45,7 @@ int drm_hdmi_infoframe_set_hdr_metadata(struct hdmi_drm_infoframe *frame,
|
||||||
|
|
||||||
/* Sink EOTF is Bit map while infoframe is absolute values */
|
/* Sink EOTF is Bit map while infoframe is absolute values */
|
||||||
if (!is_eotf_supported(hdr_metadata->hdmi_metadata_type1.eotf,
|
if (!is_eotf_supported(hdr_metadata->hdmi_metadata_type1.eotf,
|
||||||
connector->hdr_sink_metadata.hdmi_type1.eotf))
|
connector->display_info.hdr_sink_metadata.hdmi_type1.eotf))
|
||||||
DRM_DEBUG_KMS("Unknown EOTF %d\n", hdr_metadata->hdmi_metadata_type1.eotf);
|
DRM_DEBUG_KMS("Unknown EOTF %d\n", hdr_metadata->hdmi_metadata_type1.eotf);
|
||||||
|
|
||||||
err = hdmi_drm_infoframe_init(frame);
|
err = hdmi_drm_infoframe_init(frame);
|
||||||
|
|
|
||||||
|
|
@ -1687,7 +1687,7 @@ EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
|
||||||
* structure from userspace. This is received as blob and stored in
|
* structure from userspace. This is received as blob and stored in
|
||||||
* &drm_connector_state.hdr_output_metadata. It parses EDID and saves the
|
* &drm_connector_state.hdr_output_metadata. It parses EDID and saves the
|
||||||
* sink metadata in &struct hdr_sink_metadata, as
|
* sink metadata in &struct hdr_sink_metadata, as
|
||||||
* &drm_connector.hdr_sink_metadata. Driver uses
|
* &drm_connector.display_info.hdr_sink_metadata. Driver uses
|
||||||
* drm_hdmi_infoframe_set_hdr_metadata() helper to set the HDR metadata,
|
* drm_hdmi_infoframe_set_hdr_metadata() helper to set the HDR metadata,
|
||||||
* hdmi_drm_infoframe_pack() to pack the infoframe as per spec, in case of
|
* hdmi_drm_infoframe_pack() to pack the infoframe as per spec, in case of
|
||||||
* HDMI encoder.
|
* HDMI encoder.
|
||||||
|
|
|
||||||
|
|
@ -5394,7 +5394,8 @@ static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,
|
||||||
|
|
||||||
static void drm_calculate_luminance_range(struct drm_connector *connector)
|
static void drm_calculate_luminance_range(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct hdr_static_metadata *hdr_metadata = &connector->hdr_sink_metadata.hdmi_type1;
|
const struct hdr_static_metadata *hdr_metadata =
|
||||||
|
&connector->display_info.hdr_sink_metadata.hdmi_type1;
|
||||||
struct drm_luminance_range_info *luminance_range =
|
struct drm_luminance_range_info *luminance_range =
|
||||||
&connector->display_info.luminance_range;
|
&connector->display_info.luminance_range;
|
||||||
static const u8 pre_computed_values[] = {
|
static const u8 pre_computed_values[] = {
|
||||||
|
|
@ -5455,21 +5456,21 @@ static uint8_t hdr_metadata_type(const u8 *edid_ext)
|
||||||
static void
|
static void
|
||||||
drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db)
|
drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db)
|
||||||
{
|
{
|
||||||
|
struct hdr_static_metadata *hdr_metadata =
|
||||||
|
&connector->display_info.hdr_sink_metadata.hdmi_type1;
|
||||||
u16 len;
|
u16 len;
|
||||||
|
|
||||||
len = cea_db_payload_len(db);
|
len = cea_db_payload_len(db);
|
||||||
|
|
||||||
connector->hdr_sink_metadata.hdmi_type1.eotf =
|
hdr_metadata->eotf = eotf_supported(db);
|
||||||
eotf_supported(db);
|
hdr_metadata->metadata_type = hdr_metadata_type(db);
|
||||||
connector->hdr_sink_metadata.hdmi_type1.metadata_type =
|
|
||||||
hdr_metadata_type(db);
|
|
||||||
|
|
||||||
if (len >= 4)
|
if (len >= 4)
|
||||||
connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4];
|
hdr_metadata->max_cll = db[4];
|
||||||
if (len >= 5)
|
if (len >= 5)
|
||||||
connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5];
|
hdr_metadata->max_fall = db[5];
|
||||||
if (len >= 6) {
|
if (len >= 6) {
|
||||||
connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6];
|
hdr_metadata->min_cll = db[6];
|
||||||
|
|
||||||
/* Calculate only when all values are available */
|
/* Calculate only when all values are available */
|
||||||
drm_calculate_luminance_range(connector);
|
drm_calculate_luminance_range(connector);
|
||||||
|
|
@ -6617,7 +6618,7 @@ static void drm_reset_display_info(struct drm_connector *connector)
|
||||||
info->has_hdmi_infoframe = false;
|
info->has_hdmi_infoframe = false;
|
||||||
info->rgb_quant_range_selectable = false;
|
info->rgb_quant_range_selectable = false;
|
||||||
memset(&info->hdmi, 0, sizeof(info->hdmi));
|
memset(&info->hdmi, 0, sizeof(info->hdmi));
|
||||||
memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata));
|
memset(&info->hdr_sink_metadata, 0, sizeof(info->hdr_sink_metadata));
|
||||||
|
|
||||||
info->edid_hdmi_rgb444_dc_modes = 0;
|
info->edid_hdmi_rgb444_dc_modes = 0;
|
||||||
info->edid_hdmi_ycbcr444_dc_modes = 0;
|
info->edid_hdmi_ycbcr444_dc_modes = 0;
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,7 @@ intel_dp_aux_supports_hdr_backlight(struct intel_connector *connector)
|
||||||
* ranges for such panels.
|
* ranges for such panels.
|
||||||
*/
|
*/
|
||||||
if (display->params.enable_dpcd_backlight != INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL &&
|
if (display->params.enable_dpcd_backlight != INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL &&
|
||||||
!(connector->base.hdr_sink_metadata.hdmi_type1.metadata_type &
|
!(connector->base.display_info.hdr_sink_metadata.hdmi_type1.metadata_type &
|
||||||
BIT(HDMI_STATIC_METADATA_TYPE1))) {
|
BIT(HDMI_STATIC_METADATA_TYPE1))) {
|
||||||
drm_info(display->drm,
|
drm_info(display->drm,
|
||||||
"[CONNECTOR:%d:%s] Panel is missing HDR static metadata. Possible support for Intel HDR backlight interface is not used. If your backlight controls don't work try booting with i915.enable_dpcd_backlight=%d.\n",
|
"[CONNECTOR:%d:%s] Panel is missing HDR static metadata. Possible support for Intel HDR backlight interface is not used. If your backlight controls don't work try booting with i915.enable_dpcd_backlight=%d.\n",
|
||||||
|
|
|
||||||
|
|
@ -495,7 +495,7 @@ nouveau_display_hpd_work(struct work_struct *work)
|
||||||
if (first_changed_connector)
|
if (first_changed_connector)
|
||||||
drm_connector_put(first_changed_connector);
|
drm_connector_put(first_changed_connector);
|
||||||
|
|
||||||
pm_runtime_mark_last_busy(drm->dev->dev);
|
pm_runtime_mark_last_busy(dev->dev);
|
||||||
noop:
|
noop:
|
||||||
pm_runtime_put_autosuspend(dev->dev);
|
pm_runtime_put_autosuspend(dev->dev);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -866,6 +866,8 @@ static const struct panfrost_compatible amlogic_data = {
|
||||||
.vendor_quirk = panfrost_gpu_amlogic_quirk,
|
.vendor_quirk = panfrost_gpu_amlogic_quirk,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char * const mediatek_pm_domains[] = { "core0", "core1", "core2",
|
||||||
|
"core3", "core4" };
|
||||||
/*
|
/*
|
||||||
* The old data with two power supplies for MT8183 is here only to
|
* The old data with two power supplies for MT8183 is here only to
|
||||||
* keep retro-compatibility with older devicetrees, as DVFS will
|
* keep retro-compatibility with older devicetrees, as DVFS will
|
||||||
|
|
@ -874,51 +876,53 @@ static const struct panfrost_compatible amlogic_data = {
|
||||||
* On new devicetrees please use the _b variant with a single and
|
* On new devicetrees please use the _b variant with a single and
|
||||||
* coupled regulators instead.
|
* coupled regulators instead.
|
||||||
*/
|
*/
|
||||||
static const char * const mediatek_mt8183_supplies[] = { "mali", "sram", NULL };
|
static const char * const legacy_supplies[] = { "mali", "sram", NULL };
|
||||||
static const char * const mediatek_mt8183_pm_domains[] = { "core0", "core1", "core2" };
|
|
||||||
static const struct panfrost_compatible mediatek_mt8183_data = {
|
static const struct panfrost_compatible mediatek_mt8183_data = {
|
||||||
.num_supplies = ARRAY_SIZE(mediatek_mt8183_supplies) - 1,
|
.num_supplies = ARRAY_SIZE(legacy_supplies) - 1,
|
||||||
.supply_names = mediatek_mt8183_supplies,
|
.supply_names = legacy_supplies,
|
||||||
.num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
|
.num_pm_domains = 3,
|
||||||
.pm_domain_names = mediatek_mt8183_pm_domains,
|
.pm_domain_names = mediatek_pm_domains,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const mediatek_mt8183_b_supplies[] = { "mali", NULL };
|
|
||||||
static const struct panfrost_compatible mediatek_mt8183_b_data = {
|
static const struct panfrost_compatible mediatek_mt8183_b_data = {
|
||||||
.num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
|
.num_supplies = ARRAY_SIZE(default_supplies) - 1,
|
||||||
.supply_names = mediatek_mt8183_b_supplies,
|
.supply_names = default_supplies,
|
||||||
.num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
|
.num_pm_domains = 3,
|
||||||
.pm_domain_names = mediatek_mt8183_pm_domains,
|
.pm_domain_names = mediatek_pm_domains,
|
||||||
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const mediatek_mt8186_pm_domains[] = { "core0", "core1" };
|
|
||||||
static const struct panfrost_compatible mediatek_mt8186_data = {
|
static const struct panfrost_compatible mediatek_mt8186_data = {
|
||||||
.num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
|
.num_supplies = ARRAY_SIZE(default_supplies) - 1,
|
||||||
.supply_names = mediatek_mt8183_b_supplies,
|
.supply_names = default_supplies,
|
||||||
.num_pm_domains = ARRAY_SIZE(mediatek_mt8186_pm_domains),
|
.num_pm_domains = 2,
|
||||||
.pm_domain_names = mediatek_mt8186_pm_domains,
|
.pm_domain_names = mediatek_pm_domains,
|
||||||
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* MT8188 uses the same power domains and power supplies as MT8183 */
|
|
||||||
static const struct panfrost_compatible mediatek_mt8188_data = {
|
static const struct panfrost_compatible mediatek_mt8188_data = {
|
||||||
.num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
|
.num_supplies = ARRAY_SIZE(default_supplies) - 1,
|
||||||
.supply_names = mediatek_mt8183_b_supplies,
|
.supply_names = default_supplies,
|
||||||
.num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
|
.num_pm_domains = 3,
|
||||||
.pm_domain_names = mediatek_mt8183_pm_domains,
|
.pm_domain_names = mediatek_pm_domains,
|
||||||
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
||||||
.gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
|
.gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const mediatek_mt8192_supplies[] = { "mali", NULL };
|
|
||||||
static const char * const mediatek_mt8192_pm_domains[] = { "core0", "core1", "core2",
|
|
||||||
"core3", "core4" };
|
|
||||||
static const struct panfrost_compatible mediatek_mt8192_data = {
|
static const struct panfrost_compatible mediatek_mt8192_data = {
|
||||||
.num_supplies = ARRAY_SIZE(mediatek_mt8192_supplies) - 1,
|
.num_supplies = ARRAY_SIZE(default_supplies) - 1,
|
||||||
.supply_names = mediatek_mt8192_supplies,
|
.supply_names = default_supplies,
|
||||||
.num_pm_domains = ARRAY_SIZE(mediatek_mt8192_pm_domains),
|
.num_pm_domains = 5,
|
||||||
.pm_domain_names = mediatek_mt8192_pm_domains,
|
.pm_domain_names = mediatek_pm_domains,
|
||||||
|
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
||||||
|
.gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct panfrost_compatible mediatek_mt8370_data = {
|
||||||
|
.num_supplies = ARRAY_SIZE(default_supplies) - 1,
|
||||||
|
.supply_names = default_supplies,
|
||||||
|
.num_pm_domains = 2,
|
||||||
|
.pm_domain_names = mediatek_pm_domains,
|
||||||
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
.pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
|
||||||
.gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
|
.gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
|
||||||
};
|
};
|
||||||
|
|
@ -945,6 +949,7 @@ static const struct of_device_id dt_match[] = {
|
||||||
{ .compatible = "mediatek,mt8186-mali", .data = &mediatek_mt8186_data },
|
{ .compatible = "mediatek,mt8186-mali", .data = &mediatek_mt8186_data },
|
||||||
{ .compatible = "mediatek,mt8188-mali", .data = &mediatek_mt8188_data },
|
{ .compatible = "mediatek,mt8188-mali", .data = &mediatek_mt8188_data },
|
||||||
{ .compatible = "mediatek,mt8192-mali", .data = &mediatek_mt8192_data },
|
{ .compatible = "mediatek,mt8192-mali", .data = &mediatek_mt8192_data },
|
||||||
|
{ .compatible = "mediatek,mt8370-mali", .data = &mediatek_mt8370_data },
|
||||||
{ .compatible = "allwinner,sun50i-h616-mali", .data = &allwinner_h616_data },
|
{ .compatible = "allwinner,sun50i-h616-mali", .data = &allwinner_h616_data },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
#include <drm/drm_gem_shmem_helper.h>
|
#include <drm/drm_gem_shmem_helper.h>
|
||||||
#include <drm/drm_managed.h>
|
#include <drm/drm_managed.h>
|
||||||
#include <drm/drm_module.h>
|
#include <drm/drm_module.h>
|
||||||
|
#include <drm/drm_panic.h>
|
||||||
#include <drm/drm_plane_helper.h>
|
#include <drm/drm_plane_helper.h>
|
||||||
#include <drm/drm_probe_helper.h>
|
#include <drm/drm_probe_helper.h>
|
||||||
|
|
||||||
|
|
@ -469,10 +470,28 @@ static void bochs_primary_plane_helper_atomic_update(struct drm_plane *plane,
|
||||||
bochs_hw_setformat(bochs, fb->format);
|
bochs_hw_setformat(bochs, fb->format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int bochs_primary_plane_helper_get_scanout_buffer(struct drm_plane *plane,
|
||||||
|
struct drm_scanout_buffer *sb)
|
||||||
|
{
|
||||||
|
struct bochs_device *bochs = to_bochs_device(plane->dev);
|
||||||
|
struct iosys_map map = IOSYS_MAP_INIT_VADDR_IOMEM(bochs->fb_map);
|
||||||
|
|
||||||
|
if (plane->state && plane->state->fb) {
|
||||||
|
sb->format = plane->state->fb->format;
|
||||||
|
sb->width = plane->state->fb->width;
|
||||||
|
sb->height = plane->state->fb->height;
|
||||||
|
sb->pitch[0] = plane->state->fb->pitches[0];
|
||||||
|
sb->map[0] = map;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct drm_plane_helper_funcs bochs_primary_plane_helper_funcs = {
|
static const struct drm_plane_helper_funcs bochs_primary_plane_helper_funcs = {
|
||||||
DRM_GEM_SHADOW_PLANE_HELPER_FUNCS,
|
DRM_GEM_SHADOW_PLANE_HELPER_FUNCS,
|
||||||
.atomic_check = bochs_primary_plane_helper_atomic_check,
|
.atomic_check = bochs_primary_plane_helper_atomic_check,
|
||||||
.atomic_update = bochs_primary_plane_helper_atomic_update,
|
.atomic_update = bochs_primary_plane_helper_atomic_update,
|
||||||
|
.get_scanout_buffer = bochs_primary_plane_helper_get_scanout_buffer,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_plane_funcs bochs_primary_plane_funcs = {
|
static const struct drm_plane_funcs bochs_primary_plane_funcs = {
|
||||||
|
|
|
||||||
|
|
@ -799,6 +799,11 @@ struct drm_display_info {
|
||||||
*/
|
*/
|
||||||
struct drm_hdmi_info hdmi;
|
struct drm_hdmi_info hdmi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hdr_sink_metadata: HDR Metadata Information read from sink
|
||||||
|
*/
|
||||||
|
struct hdr_sink_metadata hdr_sink_metadata;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @non_desktop: Non desktop display (HMD).
|
* @non_desktop: Non desktop display (HMD).
|
||||||
*/
|
*/
|
||||||
|
|
@ -2286,9 +2291,6 @@ struct drm_connector {
|
||||||
*/
|
*/
|
||||||
struct llist_node free_node;
|
struct llist_node free_node;
|
||||||
|
|
||||||
/** @hdr_sink_metadata: HDR Metadata Information read from sink */
|
|
||||||
struct hdr_sink_metadata hdr_sink_metadata;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hdmi: HDMI-related variable and properties.
|
* @hdmi: HDMI-related variable and properties.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue