mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
drm-misc-next for v6.12:
Core Changes: ci: - Update dependencies docs: - Cleanups edid: - Improve debug logging - Clean up interface fbdev emulation: - Remove old fbdev hooks - Update documentation panic: - Cleanups Driver Changes: amdgpu: - Remove usage of old fbdev hooks - Use backlight constants ast: - Fix timeout loop for DP link training hisilicon: - hibmc: Cleanups mipi-dsi: - Improve error handling - startek-kd070fhfid015: Use new error handling nouveau: - Remove usage of old fbdev hooks panel: - Use backlight constants radeon: - Use backlight constants rockchip: - Improve DP sink-capability reporting - Cleanups - dw_hdmi: Support 4k@60Hz; Cleanups - vop: Support RGB display on Rockchip RK3066; Support 4096px width tilcdc: - Use backlight constants -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEchf7rIzpz2NEoWjlaA3BHVMLeiMFAma/EE4ACgkQaA3BHVML eiMp9gf9Ewn8AxNcMUJa8lcRXn8Uflwt5foJY3o3wTGL3+OuPp4G4U1Az/ymNe/r 9lC1lsFEzVAJI/d5UgEUIX3c4J7Bo8OKgVlkaZha5VzUC68KZqevxSzBgQWHJa+6 4+o9SlDNS6abdOojlAJSbNKZJ7BSs8RNwPylB17MTiQYzKn6mFq7u7hZ4iGaT0Cs sbQd6YLTOwU4Ez8JbJUI6J359CtNYnX7P6PUZvhB9Mj03RyBWmhPb1JwXelQoNo1 X3TbSofGCS9EtmS1odObKfr67jUKo7ndoxEbM3iDQBXw1YC74/NeL1/KZuPAHHkl 17dQSnWWZ9RQIutqI5K6COtDb0pl1A== =he6w -----END PGP SIGNATURE----- Merge tag 'drm-misc-next-2024-08-16' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next drm-misc-next for v6.12: Core Changes: ci: - Update dependencies docs: - Cleanups edid: - Improve debug logging - Clean up interface fbdev emulation: - Remove old fbdev hooks - Update documentation panic: - Cleanups Driver Changes: amdgpu: - Remove usage of old fbdev hooks - Use backlight constants ast: - Fix timeout loop for DP link training hisilicon: - hibmc: Cleanups mipi-dsi: - Improve error handling - startek-kd070fhfid015: Use new error handling nouveau: - Remove usage of old fbdev hooks panel: - Use backlight constants radeon: - Use backlight constants rockchip: - Improve DP sink-capability reporting - Cleanups - dw_hdmi: Support 4k@60Hz; Cleanups - vop: Support RGB display on Rockchip RK3066; Support 4096px width tilcdc: - Use backlight constants Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20240816084109.GA229316@localhost.localdomain
This commit is contained in:
commit
11df68c265
@ -1484,7 +1484,6 @@ extern const int amdgpu_max_kms_ioctl;
|
||||
|
||||
int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags);
|
||||
void amdgpu_driver_unload_kms(struct drm_device *dev);
|
||||
void amdgpu_driver_lastclose_kms(struct drm_device *dev);
|
||||
int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv);
|
||||
void amdgpu_driver_postclose_kms(struct drm_device *dev,
|
||||
struct drm_file *file_priv);
|
||||
|
@ -2953,7 +2953,6 @@ static const struct drm_driver amdgpu_kms_driver = {
|
||||
DRIVER_SYNCOBJ_TIMELINE,
|
||||
.open = amdgpu_driver_open_kms,
|
||||
.postclose = amdgpu_driver_postclose_kms,
|
||||
.lastclose = amdgpu_driver_lastclose_kms,
|
||||
.ioctls = amdgpu_ioctls_kms,
|
||||
.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
|
||||
.dumb_create = amdgpu_mode_dumb_create,
|
||||
@ -2980,7 +2979,6 @@ const struct drm_driver amdgpu_partition_driver = {
|
||||
DRIVER_SYNCOBJ_TIMELINE,
|
||||
.open = amdgpu_driver_open_kms,
|
||||
.postclose = amdgpu_driver_postclose_kms,
|
||||
.lastclose = amdgpu_driver_lastclose_kms,
|
||||
.ioctls = amdgpu_ioctls_kms,
|
||||
.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms),
|
||||
.dumb_create = amdgpu_mode_dumb_create,
|
||||
|
@ -1269,23 +1269,6 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Outdated mess for old drm with Xorg being in charge (void function now).
|
||||
*/
|
||||
/**
|
||||
* amdgpu_driver_lastclose_kms - drm callback for last close
|
||||
*
|
||||
* @dev: drm dev pointer
|
||||
*
|
||||
* Switch vga_switcheroo state after last close (all asics).
|
||||
*/
|
||||
void amdgpu_driver_lastclose_kms(struct drm_device *dev)
|
||||
{
|
||||
drm_fb_helper_lastclose(dev);
|
||||
vga_switcheroo_process_delayed_switch();
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_driver_open_kms - drm callback for open
|
||||
*
|
||||
|
@ -215,7 +215,7 @@ void amdgpu_atombios_encoder_init_backlight(struct amdgpu_encoder *amdgpu_encode
|
||||
dig->bl_dev = bd;
|
||||
|
||||
bd->props.brightness = amdgpu_atombios_encoder_get_backlight_brightness(bd);
|
||||
bd->props.power = FB_BLANK_UNBLANK;
|
||||
bd->props.power = BACKLIGHT_POWER_ON;
|
||||
backlight_update_status(bd);
|
||||
|
||||
DRM_INFO("amdgpu atom DIG backlight initialized\n");
|
||||
|
@ -146,18 +146,19 @@ void ast_dp_power_on_off(struct drm_device *dev, bool on)
|
||||
void ast_dp_link_training(struct ast_device *ast)
|
||||
{
|
||||
struct drm_device *dev = &ast->base;
|
||||
unsigned int i = 10;
|
||||
int i;
|
||||
|
||||
while (i--) {
|
||||
u8 vgacrdc = ast_get_index_reg(ast, AST_IO_VGACRI, 0xdc);
|
||||
for (i = 0; i < 10; i++) {
|
||||
u8 vgacrdc;
|
||||
|
||||
if (vgacrdc & AST_IO_VGACRDC_LINK_SUCCESS)
|
||||
break;
|
||||
if (i)
|
||||
msleep(100);
|
||||
|
||||
vgacrdc = ast_get_index_reg(ast, AST_IO_VGACRI, 0xdc);
|
||||
if (vgacrdc & AST_IO_VGACRDC_LINK_SUCCESS)
|
||||
return;
|
||||
}
|
||||
if (!i)
|
||||
drm_err(dev, "Link training failed\n");
|
||||
drm_err(dev, "Link training failed\n");
|
||||
}
|
||||
|
||||
void ast_dp_set_on_off(struct drm_device *dev, bool on)
|
||||
|
@ -28,6 +28,14 @@ debian/x86_64_test-vk:
|
||||
rules:
|
||||
- when: never
|
||||
|
||||
debian/arm64_test-vk:
|
||||
rules:
|
||||
- when: never
|
||||
|
||||
debian/arm64_test-gl:
|
||||
rules:
|
||||
- when: never
|
||||
|
||||
fedora/x86_64_build:
|
||||
rules:
|
||||
- when: never
|
||||
|
@ -1,13 +1,13 @@
|
||||
variables:
|
||||
DRM_CI_PROJECT_PATH: &drm-ci-project-path mesa/mesa
|
||||
DRM_CI_COMMIT_SHA: &drm-ci-commit-sha e2b9c5a9e3e4f9b532067af8022eaef8d6fc6c00
|
||||
DRM_CI_COMMIT_SHA: &drm-ci-commit-sha d9849ac46623797a9f56fb9d46dc52460ac477de
|
||||
|
||||
UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git
|
||||
TARGET_BRANCH: drm-next
|
||||
|
||||
IGT_VERSION: f13702b8e4e847c56da3ef6f0969065d686049c5
|
||||
|
||||
DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/anholt/deqp-runner.git
|
||||
DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git
|
||||
DEQP_RUNNER_GIT_TAG: v0.15.0
|
||||
|
||||
FDO_UPSTREAM_REPO: helen.fornazier/linux # The repo where the git-archive daily runs
|
||||
@ -85,22 +85,24 @@ include:
|
||||
- project: *drm-ci-project-path
|
||||
ref: *drm-ci-commit-sha
|
||||
file:
|
||||
- '/.gitlab-ci/farm-rules.yml'
|
||||
- '/.gitlab-ci/test-source-dep.yml'
|
||||
- '/.gitlab-ci/container/gitlab-ci.yml'
|
||||
- '/.gitlab-ci/test/gitlab-ci.yml'
|
||||
- '/.gitlab-ci/farm-rules.yml'
|
||||
- '/.gitlab-ci/lava/lava-gitlab-ci.yml'
|
||||
- '/src/microsoft/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/zink/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/crocus/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/softpipe/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/llvmpipe/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/virgl/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/nouveau/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/frontends/lavapipe/ci/gitlab-ci-inc.yml'
|
||||
- '/src/intel/ci/gitlab-ci-inc.yml'
|
||||
- '/src/freedreno/ci/gitlab-ci-inc.yml'
|
||||
- '/.gitlab-ci/test-source-dep.yml'
|
||||
- '/.gitlab-ci/test/gitlab-ci.yml'
|
||||
- '/src/amd/ci/gitlab-ci-inc.yml'
|
||||
- '/src/freedreno/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/crocus/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/llvmpipe/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/nouveau/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/softpipe/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/virgl/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/drivers/zink/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/frontends/lavapipe/ci/gitlab-ci-inc.yml'
|
||||
- '/src/gallium/frontends/rusticl/ci/gitlab-ci.yml'
|
||||
- '/src/intel/ci/gitlab-ci-inc.yml'
|
||||
- '/src/microsoft/ci/gitlab-ci-inc.yml'
|
||||
- '/src/nouveau/ci/gitlab-ci-inc.yml'
|
||||
- '/src/virtio/ci/gitlab-ci-inc.yml'
|
||||
- drivers/gpu/drm/ci/image-tags.yml
|
||||
- drivers/gpu/drm/ci/container.yml
|
||||
|
@ -1,15 +1,15 @@
|
||||
variables:
|
||||
CONTAINER_TAG: "2024-05-09-mesa-uprev"
|
||||
CONTAINER_TAG: "2024-08-07-mesa-uprev"
|
||||
DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base"
|
||||
DEBIAN_BASE_TAG: "${CONTAINER_TAG}"
|
||||
|
||||
DEBIAN_X86_64_BUILD_IMAGE_PATH: "debian/x86_64_build"
|
||||
DEBIAN_BUILD_TAG: "2024-06-10-vkms"
|
||||
DEBIAN_BUILD_TAG: "${CONTAINER_TAG}"
|
||||
|
||||
KERNEL_ROOTFS_TAG: "2023-10-06-amd"
|
||||
KERNEL_ROOTFS_TAG: "${CONTAINER_TAG}"
|
||||
|
||||
DEBIAN_X86_64_TEST_BASE_IMAGE: "debian/x86_64_test-base"
|
||||
DEBIAN_X86_64_TEST_IMAGE_GL_PATH: "debian/x86_64_test-gl"
|
||||
DEBIAN_X86_64_TEST_GL_TAG: "${CONTAINER_TAG}"
|
||||
DEBIAN_TEST_GL_TAG: "${CONTAINER_TAG}"
|
||||
|
||||
ALPINE_X86_64_LAVA_SSH_TAG: "${CONTAINER_TAG}"
|
@ -44,6 +44,7 @@ PYTHONPATH=artifacts/ artifacts/lava/lava_job_submitter.py \
|
||||
--first-stage-init artifacts/ci-common/init-stage1.sh \
|
||||
--ci-project-dir "${CI_PROJECT_DIR}" \
|
||||
--device-type "${DEVICE_TYPE}" \
|
||||
--farm "${FARM}" \
|
||||
--dtb-filename "${DTB}" \
|
||||
--jwt-file "${S3_JWT_FILE}" \
|
||||
--kernel-image-name "${KERNEL_IMAGE_NAME}" \
|
||||
|
@ -69,7 +69,7 @@
|
||||
.baremetal-igt-arm64:
|
||||
extends:
|
||||
- .baremetal-test-arm64
|
||||
- .use-debian/arm64_test
|
||||
- .use-debian/baremetal_arm64_test
|
||||
- .test-rules
|
||||
variables:
|
||||
FDO_CI_CONCURRENT: 10
|
||||
@ -79,7 +79,7 @@
|
||||
BM_CMDLINE: "ip=dhcp console=ttyMSM0,115200n8 $BM_KERNEL_EXTRA_ARGS root=/dev/nfs rw nfsrootdebug nfsroot=,tcp,nfsvers=4.2 init=/init $BM_KERNELARGS"
|
||||
FARM: google
|
||||
needs:
|
||||
- debian/arm64_test
|
||||
- debian/baremetal_arm64_test
|
||||
- job: testing:arm64
|
||||
artifacts: false
|
||||
- igt:arm64
|
||||
|
@ -11,7 +11,7 @@ requests==2.31.0
|
||||
requests-toolbelt==1.0.0
|
||||
ruamel.yaml==0.17.32
|
||||
ruamel.yaml.clib==0.2.7
|
||||
setuptools==68.0.0
|
||||
setuptools==70.0.0
|
||||
tenacity==8.2.3
|
||||
urllib3==2.0.7
|
||||
wheel==0.41.1
|
||||
|
@ -2342,7 +2342,9 @@ EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
|
||||
*
|
||||
* Default:
|
||||
* The behavior is driver-specific.
|
||||
*
|
||||
* BT2020_RGB:
|
||||
*
|
||||
* BT2020_YCC:
|
||||
* User space configures the pixel operation properties to produce
|
||||
* RGB content with Rec. ITU-R BT.2020 colorimetry, Rec.
|
||||
@ -2366,6 +2368,7 @@ EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
|
||||
* range.
|
||||
* The variants BT2020_RGB and BT2020_YCC are equivalent and the
|
||||
* driver chooses between RGB and YCbCr on its own.
|
||||
*
|
||||
* SMPTE_170M_YCC:
|
||||
* BT709_YCC:
|
||||
* XVYCC_601:
|
||||
@ -2378,6 +2381,7 @@ EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
|
||||
* DCI-P3_RGB_Theater:
|
||||
* RGB_WIDE_FIXED:
|
||||
* RGB_WIDE_FLOAT:
|
||||
*
|
||||
* BT601_YCC:
|
||||
* The behavior is undefined.
|
||||
*
|
||||
|
@ -318,8 +318,12 @@ drm_edid_load_firmware(struct drm_connector *connector)
|
||||
/* drm_panic.c */
|
||||
#ifdef CONFIG_DRM_PANIC
|
||||
bool drm_panic_is_enabled(struct drm_device *dev);
|
||||
void drm_panic_register(struct drm_device *dev);
|
||||
void drm_panic_unregister(struct drm_device *dev);
|
||||
#else
|
||||
static inline bool drm_panic_is_enabled(struct drm_device *dev) { return false; }
|
||||
static inline void drm_panic_register(struct drm_device *dev) {}
|
||||
static inline void drm_panic_unregister(struct drm_device *dev) {}
|
||||
#endif
|
||||
|
||||
#endif /* __DRM_CRTC_INTERNAL_H__ */
|
||||
|
@ -33,9 +33,6 @@ validate_displayid(const u8 *displayid, int length, int idx)
|
||||
if (IS_ERR(base))
|
||||
return base;
|
||||
|
||||
DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
|
||||
base->rev, base->bytes, base->prod_id, base->ext_count);
|
||||
|
||||
/* +1 for DispID checksum */
|
||||
dispid_length = sizeof(*base) + base->bytes + 1;
|
||||
if (dispid_length > length - idx)
|
||||
|
@ -1966,22 +1966,14 @@ static void edid_block_dump(const char *level, const void *block, int block_num)
|
||||
block, EDID_LENGTH, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_edid_block_valid - Sanity check the EDID block (base or extension)
|
||||
* @_block: pointer to raw EDID block
|
||||
* @block_num: type of block to validate (0 for base, extension otherwise)
|
||||
* @print_bad_edid: if true, dump bad EDID blocks to the console
|
||||
* @edid_corrupt: if true, the header or checksum is invalid
|
||||
*
|
||||
/*
|
||||
* Validate a base or extension EDID block and optionally dump bad blocks to
|
||||
* the console.
|
||||
*
|
||||
* Return: True if the block is valid, false otherwise.
|
||||
*/
|
||||
bool drm_edid_block_valid(u8 *_block, int block_num, bool print_bad_edid,
|
||||
bool *edid_corrupt)
|
||||
static bool drm_edid_block_valid(void *_block, int block_num, bool print_bad_edid,
|
||||
bool *edid_corrupt)
|
||||
{
|
||||
struct edid *block = (struct edid *)_block;
|
||||
struct edid *block = _block;
|
||||
enum edid_block_status status;
|
||||
bool is_base_block = block_num == 0;
|
||||
bool valid;
|
||||
@ -2024,7 +2016,6 @@ bool drm_edid_block_valid(u8 *_block, int block_num, bool print_bad_edid,
|
||||
|
||||
return valid;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_edid_block_valid);
|
||||
|
||||
/**
|
||||
* drm_edid_is_valid - sanity check EDID data
|
||||
@ -6629,6 +6620,11 @@ static void update_displayid_info(struct drm_connector *connector,
|
||||
|
||||
displayid_iter_edid_begin(drm_edid, &iter);
|
||||
displayid_iter_for_each(block, &iter) {
|
||||
drm_dbg_kms(connector->dev,
|
||||
"[CONNECTOR:%d:%s] DisplayID extension version 0x%02x, primary use 0x%02x\n",
|
||||
connector->base.id, connector->name,
|
||||
displayid_version(&iter),
|
||||
displayid_primary_use(&iter));
|
||||
if (displayid_version(&iter) == DISPLAY_ID_STRUCTURE_VER_20 &&
|
||||
(displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_VR ||
|
||||
displayid_primary_use(&iter) == PRIMARY_USE_HEAD_MOUNTED_AR))
|
||||
|
@ -89,14 +89,6 @@ static DEFINE_MUTEX(kernel_fb_helper_lock);
|
||||
* interfaces. Drivers that use one of the shared memory managers, TTM, SHMEM,
|
||||
* DMA, should instead use the corresponding fbdev emulation.
|
||||
*
|
||||
* Existing fbdev implementations should restore the fbdev console by using
|
||||
* drm_fb_helper_lastclose() as their &drm_driver.lastclose callback.
|
||||
* They should also notify the fb helper code from updates to the output
|
||||
* configuration by using drm_fb_helper_output_poll_changed() as their
|
||||
* &drm_mode_config_funcs.output_poll_changed callback. New implementations
|
||||
* of fbdev should be build on top of struct &drm_client_funcs, which handles
|
||||
* this automatically. Setting the old callbacks should be avoided.
|
||||
*
|
||||
* For suspend/resume consider using drm_mode_config_helper_suspend() and
|
||||
* drm_mode_config_helper_resume() which takes care of fbdev as well.
|
||||
*
|
||||
@ -260,12 +252,12 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
|
||||
* drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
|
||||
* @fb_helper: driver-allocated fbdev helper, can be NULL
|
||||
*
|
||||
* This should be called from driver's drm &drm_driver.lastclose callback
|
||||
* when implementing an fbcon on top of kms using this helper. This ensures that
|
||||
* the user isn't greeted with a black screen when e.g. X dies.
|
||||
* This helper should be called from fbdev emulation's &drm_client_funcs.restore
|
||||
* callback. It ensures that the user isn't greeted with a black screen when the
|
||||
* userspace compositor releases the display device.
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero if everything went ok, negative error code otherwise.
|
||||
* Returns:
|
||||
* 0 on success, or a negative errno code otherwise.
|
||||
*/
|
||||
int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
@ -2003,26 +1995,11 @@ EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
|
||||
* drm_fb_helper_lastclose - DRM driver lastclose helper for fbdev emulation
|
||||
* @dev: DRM device
|
||||
*
|
||||
* This function can be used as the &drm_driver->lastclose callback for drivers
|
||||
* that only need to call drm_fb_helper_restore_fbdev_mode_unlocked().
|
||||
* This function is obsolete. Call drm_fb_helper_restore_fbdev_mode_unlocked()
|
||||
* instead.
|
||||
*/
|
||||
void drm_fb_helper_lastclose(struct drm_device *dev)
|
||||
{
|
||||
drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_lastclose);
|
||||
|
||||
/**
|
||||
* drm_fb_helper_output_poll_changed - DRM mode config \.output_poll_changed
|
||||
* helper for fbdev emulation
|
||||
* @dev: DRM device
|
||||
*
|
||||
* This function can be used as the
|
||||
* &drm_mode_config_funcs.output_poll_changed callback for drivers that only
|
||||
* need to call drm_fbdev.hotplug_event().
|
||||
*/
|
||||
void drm_fb_helper_output_poll_changed(struct drm_device *dev)
|
||||
{
|
||||
drm_fb_helper_hotplug_event(dev->fb_helper);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_output_poll_changed);
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vga_switcheroo.h>
|
||||
|
||||
#include <drm/drm_client.h>
|
||||
#include <drm/drm_drv.h>
|
||||
@ -62,15 +63,6 @@ bool drm_dev_needs_global_mutex(struct drm_device *dev)
|
||||
if (dev->driver->load || dev->driver->unload)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Drivers with the lastclose callback assume that it's synchronized
|
||||
* against concurrent opens, which again needs the BKL. The proper fix
|
||||
* is to use the drm_client infrastructure with proper locking for each
|
||||
* client.
|
||||
*/
|
||||
if (dev->driver->lastclose)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -395,15 +387,12 @@ err_undo:
|
||||
}
|
||||
EXPORT_SYMBOL(drm_open);
|
||||
|
||||
void drm_lastclose(struct drm_device * dev)
|
||||
static void drm_lastclose(struct drm_device *dev)
|
||||
{
|
||||
drm_dbg_core(dev, "\n");
|
||||
|
||||
if (dev->driver->lastclose)
|
||||
dev->driver->lastclose(dev);
|
||||
drm_dbg_core(dev, "driver lastclose completed\n");
|
||||
|
||||
drm_client_dev_restore(dev);
|
||||
|
||||
if (dev_is_pci(dev->dev))
|
||||
vga_switcheroo_process_delayed_switch();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -412,9 +401,9 @@ void drm_lastclose(struct drm_device * dev)
|
||||
* @filp: file pointer.
|
||||
*
|
||||
* This function must be used by drivers as their &file_operations.release
|
||||
* method. It frees any resources associated with the open file, and calls the
|
||||
* &drm_driver.postclose driver callback. If this is the last open file for the
|
||||
* DRM device also proceeds to call the &drm_driver.lastclose driver callback.
|
||||
* method. It frees any resources associated with the open file. If this
|
||||
* is the last open file for the DRM device, it also restores the active
|
||||
* in-kernel DRM client.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
@ -484,9 +473,8 @@ void drm_file_update_pid(struct drm_file *filp)
|
||||
*
|
||||
* This function may be used by drivers as their &file_operations.release
|
||||
* method. It frees any resources associated with the open file prior to taking
|
||||
* the drm_global_mutex, which then calls the &drm_driver.postclose driver
|
||||
* callback. If this is the last open file for the DRM device also proceeds to
|
||||
* call the &drm_driver.lastclose driver callback.
|
||||
* the drm_global_mutex. If this is the last open file for the DRM device, it
|
||||
* then restores the active in-kernel DRM client.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
|
@ -53,7 +53,6 @@ extern struct mutex drm_global_mutex;
|
||||
bool drm_dev_needs_global_mutex(struct drm_device *dev);
|
||||
struct drm_file *drm_file_alloc(struct drm_minor *minor);
|
||||
void drm_file_free(struct drm_file *file);
|
||||
void drm_lastclose(struct drm_device *dev);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
|
||||
|
@ -603,6 +603,8 @@ EXPORT_SYMBOL(mipi_dsi_shutdown_peripheral);
|
||||
* mipi_dsi_turn_on_peripheral() - sends a Turn On Peripheral command
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_turn_on_peripheral_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi)
|
||||
@ -652,6 +654,7 @@ EXPORT_SYMBOL(mipi_dsi_set_maximum_return_packet_size);
|
||||
* @pps_selector: Select PPS from the table of pre-stored or uploaded PPS entries
|
||||
*
|
||||
* Enable or disable Display Stream Compression on the peripheral.
|
||||
* This function is deprecated. Use mipi_dsi_compression_mode_ext_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
@ -703,6 +706,7 @@ EXPORT_SYMBOL(mipi_dsi_compression_mode);
|
||||
* @pps: VESA DSC 1.1 Picture Parameter Set
|
||||
*
|
||||
* Transmit the VESA DSC 1.1 Picture Parameter Set to the peripheral.
|
||||
* This function is deprecated. Use mipi_dsi_picture_parameter_set_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
@ -1037,6 +1041,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_read);
|
||||
* mipi_dsi_dcs_nop() - send DCS nop packet
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_nop_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi)
|
||||
@ -1055,6 +1061,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_nop);
|
||||
* mipi_dsi_dcs_soft_reset() - perform a software reset of the display module
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_soft_reset_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi)
|
||||
@ -1124,6 +1132,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_get_pixel_format);
|
||||
* display module except interface communication
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_enter_sleep_mode_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device *dsi)
|
||||
@ -1143,6 +1153,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_enter_sleep_mode);
|
||||
* module
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_exit_sleep_mode_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi)
|
||||
@ -1162,6 +1174,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_exit_sleep_mode);
|
||||
* display device
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_display_off_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device *dsi)
|
||||
@ -1181,6 +1195,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_set_display_off);
|
||||
* display device
|
||||
* @dsi: DSI peripheral device
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_display_on_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure
|
||||
*/
|
||||
int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi)
|
||||
@ -1202,6 +1218,9 @@ EXPORT_SYMBOL(mipi_dsi_dcs_set_display_on);
|
||||
* @start: first column of frame memory
|
||||
* @end: last column of frame memory
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_column_address_multi()
|
||||
* instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start,
|
||||
@ -1226,6 +1245,9 @@ EXPORT_SYMBOL(mipi_dsi_dcs_set_column_address);
|
||||
* @start: first page of frame memory
|
||||
* @end: last page of frame memory
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_page_address_multi()
|
||||
* instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start,
|
||||
@ -1268,6 +1290,8 @@ EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_off);
|
||||
* @dsi: DSI peripheral device
|
||||
* @mode: the Tearing Effect Output Line mode
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_tear_on_multi() instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure
|
||||
*/
|
||||
int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
|
||||
@ -1291,6 +1315,9 @@ EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_on);
|
||||
* @dsi: DSI peripheral device
|
||||
* @format: pixel format
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_pixel_format_multi()
|
||||
* instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format)
|
||||
@ -1334,6 +1361,9 @@ EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_scanline);
|
||||
* @dsi: DSI peripheral device
|
||||
* @brightness: brightness value
|
||||
*
|
||||
* This function is deprecated. Use mipi_dsi_dcs_set_display_brightness_multi()
|
||||
* instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
|
||||
@ -1639,6 +1669,170 @@ void mipi_dsi_dcs_set_tear_on_multi(struct mipi_dsi_multi_context *ctx,
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_on_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_turn_on_peripheral_multi() - sends a Turn On Peripheral command
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
*
|
||||
* Like mipi_dsi_turn_on_peripheral() but deals with errors in a way that
|
||||
* makes it convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_turn_on_peripheral_multi(struct mipi_dsi_multi_context *ctx)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_turn_on_peripheral(dsi);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "Failed to turn on peripheral: %d\n",
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_turn_on_peripheral_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_soft_reset_multi() - perform a software reset of the display module
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
*
|
||||
* Like mipi_dsi_dcs_soft_reset() but deals with errors in a way that
|
||||
* makes it convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_dcs_soft_reset_multi(struct mipi_dsi_multi_context *ctx)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_dcs_soft_reset(dsi);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "Failed to mipi_dsi_dcs_soft_reset: %d\n",
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_soft_reset_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_set_display_brightness_multi() - sets the brightness value of
|
||||
* the display
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @brightness: brightness value
|
||||
*
|
||||
* Like mipi_dsi_dcs_set_display_brightness() but deals with errors in a way that
|
||||
* makes it convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_dcs_set_display_brightness_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u16 brightness)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_dcs_set_display_brightness(dsi, brightness);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "Failed to write display brightness: %d\n",
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_set_pixel_format_multi() - sets the pixel format for the RGB image
|
||||
* data used by the interface
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @format: pixel format
|
||||
*
|
||||
* Like mipi_dsi_dcs_set_pixel_format() but deals with errors in a way that
|
||||
* makes it convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_dcs_set_pixel_format_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u8 format)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_dcs_set_pixel_format(dsi, format);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "Failed to set pixel format: %d\n",
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_set_pixel_format_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_set_column_address_multi() - define the column extent of the
|
||||
* frame memory accessed by the host processor
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @start: first column of frame memory
|
||||
* @end: last column of frame memory
|
||||
*
|
||||
* Like mipi_dsi_dcs_set_column_address() but deals with errors in a way that
|
||||
* makes it convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_dcs_set_column_address_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u16 start, u16 end)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_dcs_set_column_address(dsi, start, end);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "Failed to set column address: %d\n",
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_set_column_address_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_set_page_address_multi() - define the page extent of the
|
||||
* frame memory accessed by the host processor
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @start: first page of frame memory
|
||||
* @end: last page of frame memory
|
||||
*
|
||||
* Like mipi_dsi_dcs_set_page_address() but deals with errors in a way that
|
||||
* makes it convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_dcs_set_page_address_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u16 start, u16 end)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_dcs_set_page_address(dsi, start, end);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "Failed to set page address: %d\n",
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_set_page_address_multi);
|
||||
|
||||
static int mipi_dsi_drv_probe(struct device *dev)
|
||||
{
|
||||
struct mipi_dsi_driver *drv = to_mipi_dsi_driver(dev->driver);
|
||||
|
@ -78,11 +78,15 @@ struct drm_panic_line {
|
||||
#define PANIC_LINE(s) {.len = sizeof(s) - 1, .txt = s}
|
||||
|
||||
static struct drm_panic_line panic_msg[] = {
|
||||
PANIC_LINE("KERNEL PANIC !"),
|
||||
PANIC_LINE("KERNEL PANIC!"),
|
||||
PANIC_LINE(""),
|
||||
PANIC_LINE("Please reboot your computer."),
|
||||
PANIC_LINE(""),
|
||||
PANIC_LINE(""), /* will be replaced by the panic description */
|
||||
};
|
||||
|
||||
#define PANIC_MSG_LINES ARRAY_SIZE(panic_msg)
|
||||
|
||||
static const struct drm_panic_line logo_ascii[] = {
|
||||
PANIC_LINE(" .--. _"),
|
||||
PANIC_LINE(" |o_o | | |"),
|
||||
@ -93,6 +97,8 @@ static const struct drm_panic_line logo_ascii[] = {
|
||||
PANIC_LINE(" \\___)=(___/"),
|
||||
};
|
||||
|
||||
#define PANIC_LOGO_LINES ARRAY_SIZE(logo_ascii)
|
||||
|
||||
#if defined(CONFIG_LOGO) && !defined(MODULE)
|
||||
static const struct linux_logo *logo_mono;
|
||||
|
||||
@ -487,13 +493,12 @@ static void draw_txt_rectangle(struct drm_scanout_buffer *sb,
|
||||
|
||||
static void draw_panic_static_user(struct drm_scanout_buffer *sb)
|
||||
{
|
||||
size_t msg_lines = ARRAY_SIZE(panic_msg);
|
||||
size_t logo_ascii_lines = ARRAY_SIZE(logo_ascii);
|
||||
u32 fg_color = convert_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND_COLOR, sb->format->format);
|
||||
u32 bg_color = convert_from_xrgb8888(CONFIG_DRM_PANIC_BACKGROUND_COLOR, sb->format->format);
|
||||
const struct font_desc *font = get_default_font(sb->width, sb->height, NULL, NULL);
|
||||
struct drm_rect r_screen, r_logo, r_msg;
|
||||
unsigned int logo_width, logo_height;
|
||||
unsigned int msg_width, msg_height;
|
||||
|
||||
if (!font)
|
||||
return;
|
||||
@ -504,14 +509,14 @@ static void draw_panic_static_user(struct drm_scanout_buffer *sb)
|
||||
logo_width = logo_mono->width;
|
||||
logo_height = logo_mono->height;
|
||||
} else {
|
||||
logo_width = get_max_line_len(logo_ascii, logo_ascii_lines) * font->width;
|
||||
logo_height = logo_ascii_lines * font->height;
|
||||
logo_width = get_max_line_len(logo_ascii, PANIC_LOGO_LINES) * font->width;
|
||||
logo_height = PANIC_LOGO_LINES * font->height;
|
||||
}
|
||||
|
||||
r_logo = DRM_RECT_INIT(0, 0, logo_width, logo_height);
|
||||
r_msg = DRM_RECT_INIT(0, 0,
|
||||
min(get_max_line_len(panic_msg, msg_lines) * font->width, sb->width),
|
||||
min(msg_lines * font->height, sb->height));
|
||||
|
||||
msg_width = min(get_max_line_len(panic_msg, PANIC_MSG_LINES) * font->width, sb->width);
|
||||
msg_height = min(PANIC_MSG_LINES * font->height, sb->height);
|
||||
r_msg = DRM_RECT_INIT(0, 0, msg_width, msg_height);
|
||||
|
||||
/* Center the panic message */
|
||||
drm_rect_translate(&r_msg, (sb->width - r_msg.x2) / 2, (sb->height - r_msg.y2) / 2);
|
||||
@ -525,10 +530,10 @@ static void draw_panic_static_user(struct drm_scanout_buffer *sb)
|
||||
drm_panic_blit(sb, &r_logo, logo_mono->data, DIV_ROUND_UP(logo_width, 8),
|
||||
fg_color);
|
||||
else
|
||||
draw_txt_rectangle(sb, font, logo_ascii, logo_ascii_lines, false, &r_logo,
|
||||
draw_txt_rectangle(sb, font, logo_ascii, PANIC_LOGO_LINES, false, &r_logo,
|
||||
fg_color);
|
||||
}
|
||||
draw_txt_rectangle(sb, font, panic_msg, msg_lines, true, &r_msg, fg_color);
|
||||
draw_txt_rectangle(sb, font, panic_msg, PANIC_MSG_LINES, true, &r_msg, fg_color);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -633,7 +638,31 @@ static void draw_panic_dispatch(struct drm_scanout_buffer *sb)
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_panic_plane(struct drm_plane *plane)
|
||||
static void drm_panic_set_description(const char *description)
|
||||
{
|
||||
u32 len;
|
||||
|
||||
if (description) {
|
||||
struct drm_panic_line *desc_line = &panic_msg[PANIC_MSG_LINES - 1];
|
||||
|
||||
desc_line->txt = description;
|
||||
len = strlen(description);
|
||||
/* ignore the last newline character */
|
||||
if (len && description[len - 1] == '\n')
|
||||
len -= 1;
|
||||
desc_line->len = len;
|
||||
}
|
||||
}
|
||||
|
||||
static void drm_panic_clear_description(void)
|
||||
{
|
||||
struct drm_panic_line *desc_line = &panic_msg[PANIC_MSG_LINES - 1];
|
||||
|
||||
desc_line->len = 0;
|
||||
desc_line->txt = NULL;
|
||||
}
|
||||
|
||||
static void draw_panic_plane(struct drm_plane *plane, const char *description)
|
||||
{
|
||||
struct drm_scanout_buffer sb = { };
|
||||
int ret;
|
||||
@ -642,6 +671,8 @@ static void draw_panic_plane(struct drm_plane *plane)
|
||||
if (!drm_panic_trylock(plane->dev, flags))
|
||||
return;
|
||||
|
||||
drm_panic_set_description(description);
|
||||
|
||||
ret = plane->helper_private->get_scanout_buffer(plane, &sb);
|
||||
|
||||
if (!ret && drm_panic_is_format_supported(sb.format)) {
|
||||
@ -649,6 +680,7 @@ static void draw_panic_plane(struct drm_plane *plane)
|
||||
if (plane->helper_private->panic_flush)
|
||||
plane->helper_private->panic_flush(plane);
|
||||
}
|
||||
drm_panic_clear_description();
|
||||
drm_panic_unlock(plane->dev, flags);
|
||||
}
|
||||
|
||||
@ -662,7 +694,7 @@ static void drm_panic(struct kmsg_dumper *dumper, struct kmsg_dump_detail *detai
|
||||
struct drm_plane *plane = to_drm_plane(dumper);
|
||||
|
||||
if (detail->reason == KMSG_DUMP_PANIC)
|
||||
draw_panic_plane(plane);
|
||||
draw_panic_plane(plane, detail->description);
|
||||
}
|
||||
|
||||
|
||||
@ -682,7 +714,7 @@ static ssize_t debugfs_trigger_write(struct file *file, const char __user *user_
|
||||
if (kstrtobool_from_user(user_buf, count, &run) == 0 && run) {
|
||||
struct drm_plane *plane = file->private_data;
|
||||
|
||||
draw_panic_plane(plane);
|
||||
draw_panic_plane(plane, "Test from debugfs");
|
||||
}
|
||||
return count;
|
||||
}
|
||||
@ -752,7 +784,6 @@ void drm_panic_register(struct drm_device *dev)
|
||||
if (registered_plane)
|
||||
drm_info(dev, "Registered %d planes with drm panic\n", registered_plane);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_panic_register);
|
||||
|
||||
/**
|
||||
* drm_panic_unregister()
|
||||
@ -771,4 +802,3 @@ void drm_panic_unregister(struct drm_device *dev)
|
||||
kmsg_dump_unregister(&plane->kmsg_panic);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(drm_panic_unregister);
|
||||
|
@ -714,7 +714,7 @@ EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
|
||||
* @dev: drm_device whose connector state changed
|
||||
*
|
||||
* This function fires off the uevent for userspace and also calls the
|
||||
* output_poll_changed function, which is most commonly used to inform the fbdev
|
||||
* client hotplug function, which is most commonly used to inform the fbdev
|
||||
* emulation code and allow it to update the fbcon output configuration.
|
||||
*
|
||||
* Drivers should call this from their hotplug handling code when a change is
|
||||
@ -730,11 +730,7 @@ EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
|
||||
*/
|
||||
void drm_kms_helper_hotplug_event(struct drm_device *dev)
|
||||
{
|
||||
/* send a uevent + call fbdev */
|
||||
drm_sysfs_hotplug_event(dev);
|
||||
if (dev->mode_config.funcs->output_poll_changed)
|
||||
dev->mode_config.funcs->output_poll_changed(dev);
|
||||
|
||||
drm_client_dev_hotplug(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_kms_helper_hotplug_event);
|
||||
@ -750,11 +746,7 @@ void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
|
||||
/* send a uevent + call fbdev */
|
||||
drm_sysfs_connector_hotplug_event(connector);
|
||||
if (dev->mode_config.funcs->output_poll_changed)
|
||||
dev->mode_config.funcs->output_poll_changed(dev);
|
||||
|
||||
drm_client_dev_hotplug(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_kms_helper_connector_hotplug_event);
|
||||
|
@ -57,7 +57,6 @@ void hibmc_set_current_gate(struct hibmc_drm_private *priv,
|
||||
int hibmc_de_init(struct hibmc_drm_private *priv);
|
||||
int hibmc_vdac_init(struct hibmc_drm_private *priv);
|
||||
|
||||
int hibmc_mm_init(struct hibmc_drm_private *hibmc);
|
||||
int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_connector *connector);
|
||||
|
||||
#endif
|
||||
|
@ -425,6 +425,18 @@ static const struct intel_vgpu_regops intel_vgpu_regops_opregion = {
|
||||
.release = intel_vgpu_reg_release_opregion,
|
||||
};
|
||||
|
||||
static bool edid_valid(const void *edid, size_t size)
|
||||
{
|
||||
const struct drm_edid *drm_edid;
|
||||
bool is_valid;
|
||||
|
||||
drm_edid = drm_edid_alloc(edid, size);
|
||||
is_valid = drm_edid_valid(drm_edid);
|
||||
drm_edid_free(drm_edid);
|
||||
|
||||
return is_valid;
|
||||
}
|
||||
|
||||
static int handle_edid_regs(struct intel_vgpu *vgpu,
|
||||
struct vfio_edid_region *region, char *buf,
|
||||
size_t count, u16 offset, bool is_write)
|
||||
@ -443,11 +455,7 @@ static int handle_edid_regs(struct intel_vgpu *vgpu,
|
||||
switch (offset) {
|
||||
case offsetof(struct vfio_region_gfx_edid, link_state):
|
||||
if (data == VFIO_DEVICE_GFX_LINK_STATE_UP) {
|
||||
if (!drm_edid_block_valid(
|
||||
(u8 *)region->edid_blob,
|
||||
0,
|
||||
true,
|
||||
NULL)) {
|
||||
if (!edid_valid(region->edid_blob, EDID_SIZE)) {
|
||||
gvt_vgpu_err("invalid EDID blob\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -2648,7 +2648,6 @@ nv50_disp_atomic_state_alloc(struct drm_device *dev)
|
||||
static const struct drm_mode_config_funcs
|
||||
nv50_disp_func = {
|
||||
.fb_create = nouveau_user_framebuffer_create,
|
||||
.output_poll_changed = drm_fb_helper_output_poll_changed,
|
||||
.atomic_check = nv50_disp_atomic_check,
|
||||
.atomic_commit = nv50_disp_atomic_commit,
|
||||
.atomic_state_alloc = nv50_disp_atomic_state_alloc,
|
||||
|
@ -391,7 +391,6 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
|
||||
|
||||
static const struct drm_mode_config_funcs nouveau_mode_config_funcs = {
|
||||
.fb_create = nouveau_user_framebuffer_create,
|
||||
.output_poll_changed = drm_fb_helper_output_poll_changed,
|
||||
};
|
||||
|
||||
|
||||
|
@ -1303,7 +1303,6 @@ driver_stub = {
|
||||
DRIVER_RENDER,
|
||||
.open = nouveau_drm_open,
|
||||
.postclose = nouveau_drm_postclose,
|
||||
.lastclose = nouveau_vga_lastclose,
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
.debugfs_init = nouveau_drm_debugfs_init,
|
||||
|
@ -58,8 +58,9 @@ static void
|
||||
nouveau_switcheroo_reprobe(struct pci_dev *pdev)
|
||||
{
|
||||
struct nouveau_drm *drm = pci_get_drvdata(pdev);
|
||||
struct drm_device *dev = drm->dev;
|
||||
|
||||
drm_fb_helper_output_poll_changed(drm->dev);
|
||||
drm_client_dev_hotplug(dev);
|
||||
}
|
||||
|
||||
static bool
|
||||
@ -127,10 +128,3 @@ nouveau_vga_fini(struct nouveau_drm *drm)
|
||||
if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus())
|
||||
vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nouveau_vga_lastclose(struct drm_device *dev)
|
||||
{
|
||||
vga_switcheroo_process_delayed_switch();
|
||||
}
|
||||
|
@ -4,6 +4,5 @@
|
||||
|
||||
void nouveau_vga_init(struct nouveau_drm *);
|
||||
void nouveau_vga_fini(struct nouveau_drm *);
|
||||
void nouveau_vga_lastclose(struct drm_device *dev);
|
||||
|
||||
#endif
|
||||
|
@ -1166,7 +1166,7 @@ static int nt35510_probe(struct mipi_dsi_device *dsi)
|
||||
bl->props.brightness = nt->conf->wrdisbv;
|
||||
else
|
||||
bl->props.brightness = 255;
|
||||
bl->props.power = FB_BLANK_POWERDOWN;
|
||||
bl->props.power = BACKLIGHT_POWER_OFF;
|
||||
nt->panel.backlight = bl;
|
||||
}
|
||||
|
||||
|
@ -389,7 +389,7 @@ static int otm8009a_backlight_update_status(struct backlight_device *bd)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
if (bd->props.power <= FB_BLANK_NORMAL) {
|
||||
if (bd->props.power <= BACKLIGHT_POWER_REDUCED) {
|
||||
/* Power on the backlight with the requested brightness
|
||||
* Note We can not use mipi_dsi_dcs_set_display_brightness()
|
||||
* as otm8009a driver support only 8-bit brightness (1 param).
|
||||
@ -465,7 +465,7 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi)
|
||||
|
||||
ctx->bl_dev->props.max_brightness = OTM8009A_BACKLIGHT_MAX;
|
||||
ctx->bl_dev->props.brightness = OTM8009A_BACKLIGHT_DEFAULT;
|
||||
ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_OFF;
|
||||
ctx->bl_dev->props.type = BACKLIGHT_RAW;
|
||||
|
||||
drm_panel_add(&ctx->panel);
|
||||
|
@ -458,7 +458,7 @@ static int s6e3ha2_set_brightness(struct backlight_device *bl_dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (bl_dev->props.power > FB_BLANK_NORMAL)
|
||||
if (bl_dev->props.power > BACKLIGHT_POWER_REDUCED)
|
||||
return -EPERM;
|
||||
|
||||
s6e3ha2_call_write_func(ret, s6e3ha2_test_key_on_f0(ctx));
|
||||
@ -508,7 +508,7 @@ static int s6e3ha2_disable(struct drm_panel *panel)
|
||||
s6e3ha2_call_write_func(ret, mipi_dsi_dcs_set_display_off(dsi));
|
||||
|
||||
msleep(40);
|
||||
ctx->bl_dev->props.power = FB_BLANK_NORMAL;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_REDUCED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -554,7 +554,7 @@ static int s6e3ha2_prepare(struct drm_panel *panel)
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ctx->bl_dev->props.power = FB_BLANK_NORMAL;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_REDUCED;
|
||||
|
||||
return 0;
|
||||
|
||||
@ -601,7 +601,7 @@ static int s6e3ha2_enable(struct drm_panel *panel)
|
||||
s6e3ha2_call_write_func(ret, s6e3ha2_test_key_off_f0(ctx));
|
||||
|
||||
s6e3ha2_call_write_func(ret, mipi_dsi_dcs_set_display_on(dsi));
|
||||
ctx->bl_dev->props.power = FB_BLANK_UNBLANK;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_ON;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -729,7 +729,7 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi)
|
||||
|
||||
ctx->bl_dev->props.max_brightness = S6E3HA2_MAX_BRIGHTNESS;
|
||||
ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS;
|
||||
ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_OFF;
|
||||
|
||||
drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
@ -225,7 +225,7 @@ static int s6e63j0x03_disable(struct drm_panel *panel)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ctx->bl_dev->props.power = FB_BLANK_NORMAL;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_REDUCED;
|
||||
|
||||
ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
|
||||
if (ret < 0)
|
||||
@ -245,7 +245,7 @@ static int s6e63j0x03_unprepare(struct drm_panel *panel)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_OFF;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -332,7 +332,7 @@ static int s6e63j0x03_prepare(struct drm_panel *panel)
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ctx->bl_dev->props.power = FB_BLANK_NORMAL;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_REDUCED;
|
||||
|
||||
return 0;
|
||||
|
||||
@ -393,7 +393,7 @@ static int s6e63j0x03_enable(struct drm_panel *panel)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ctx->bl_dev->props.power = FB_BLANK_UNBLANK;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_ON;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -473,7 +473,7 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi)
|
||||
|
||||
ctx->bl_dev->props.max_brightness = MAX_BRIGHTNESS;
|
||||
ctx->bl_dev->props.brightness = DEFAULT_BRIGHTNESS;
|
||||
ctx->bl_dev->props.power = FB_BLANK_POWERDOWN;
|
||||
ctx->bl_dev->props.power = BACKLIGHT_POWER_OFF;
|
||||
|
||||
drm_panel_add(&ctx->panel);
|
||||
|
||||
|
@ -342,7 +342,7 @@ static const struct backlight_ops acx565akm_bl_ops = {
|
||||
static int acx565akm_backlight_init(struct acx565akm_panel *lcd)
|
||||
{
|
||||
struct backlight_properties props = {
|
||||
.power = FB_BLANK_UNBLANK,
|
||||
.power = BACKLIGHT_POWER_ON,
|
||||
.type = BACKLIGHT_RAW,
|
||||
};
|
||||
int ret;
|
||||
|
@ -24,10 +24,10 @@
|
||||
#include <drm/drm_modes.h>
|
||||
#include <drm/drm_panel.h>
|
||||
|
||||
#define DSI_REG_MCAP 0xB0
|
||||
#define DSI_REG_IS 0xB3 /* Interface Setting */
|
||||
#define DSI_REG_IIS 0xB4 /* Interface ID Setting */
|
||||
#define DSI_REG_CTRL 0xB6
|
||||
#define DSI_REG_MCAP 0xb0
|
||||
#define DSI_REG_IS 0xb3 /* Interface Setting */
|
||||
#define DSI_REG_IIS 0xb4 /* Interface ID Setting */
|
||||
#define DSI_REG_CTRL 0xb6
|
||||
|
||||
enum {
|
||||
IOVCC = 0,
|
||||
@ -52,92 +52,55 @@ static inline struct stk_panel *to_stk_panel(struct drm_panel *panel)
|
||||
static int stk_panel_init(struct stk_panel *stk)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = stk->dsi;
|
||||
struct device *dev = &stk->dsi->dev;
|
||||
int ret;
|
||||
struct mipi_dsi_multi_context dsi_ctx = {.dsi = dsi};
|
||||
|
||||
ret = mipi_dsi_dcs_soft_reset(dsi);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to mipi_dsi_dcs_soft_reset: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
mdelay(5);
|
||||
mipi_dsi_dcs_soft_reset_multi(&dsi_ctx);
|
||||
mipi_dsi_msleep(&dsi_ctx, 5);
|
||||
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
|
||||
mipi_dsi_msleep(&dsi_ctx, 120);
|
||||
|
||||
ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set exit sleep mode: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
msleep(120);
|
||||
|
||||
mipi_dsi_generic_write_seq(dsi, DSI_REG_MCAP, 0x04);
|
||||
mipi_dsi_generic_write_seq_multi(&dsi_ctx, DSI_REG_MCAP, 0x04);
|
||||
|
||||
/* Interface setting, video mode */
|
||||
mipi_dsi_generic_write_seq(dsi, DSI_REG_IS, 0x14, 0x08, 0x00, 0x22, 0x00);
|
||||
mipi_dsi_generic_write_seq(dsi, DSI_REG_IIS, 0x0C, 0x00);
|
||||
mipi_dsi_generic_write_seq(dsi, DSI_REG_CTRL, 0x3A, 0xD3);
|
||||
mipi_dsi_generic_write_seq_multi(&dsi_ctx, DSI_REG_IS, 0x14, 0x08, 0x00, 0x22, 0x00);
|
||||
mipi_dsi_generic_write_seq_multi(&dsi_ctx, DSI_REG_IIS, 0x0c, 0x00);
|
||||
mipi_dsi_generic_write_seq_multi(&dsi_ctx, DSI_REG_CTRL, 0x3a, 0xd3);
|
||||
|
||||
ret = mipi_dsi_dcs_set_display_brightness(dsi, 0x77);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to write display brightness: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x77);
|
||||
|
||||
mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY,
|
||||
MIPI_DCS_WRITE_MEMORY_START);
|
||||
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY,
|
||||
MIPI_DCS_WRITE_MEMORY_START);
|
||||
|
||||
ret = mipi_dsi_dcs_set_pixel_format(dsi, 0x77);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set pixel format: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x77);
|
||||
mipi_dsi_dcs_set_column_address_multi(&dsi_ctx, 0, stk->mode->hdisplay - 1);
|
||||
mipi_dsi_dcs_set_page_address_multi(&dsi_ctx, 0, stk->mode->vdisplay - 1);
|
||||
|
||||
ret = mipi_dsi_dcs_set_column_address(dsi, 0, stk->mode->hdisplay - 1);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set column address: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = mipi_dsi_dcs_set_page_address(dsi, 0, stk->mode->vdisplay - 1);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set page address: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return dsi_ctx.accum_err;
|
||||
}
|
||||
|
||||
static int stk_panel_on(struct stk_panel *stk)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = stk->dsi;
|
||||
struct device *dev = &stk->dsi->dev;
|
||||
int ret;
|
||||
struct mipi_dsi_multi_context dsi_ctx = {.dsi = dsi};
|
||||
|
||||
ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
if (ret < 0)
|
||||
dev_err(dev, "failed to set display on: %d\n", ret);
|
||||
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
|
||||
|
||||
mdelay(20);
|
||||
mipi_dsi_msleep(&dsi_ctx, 20);
|
||||
|
||||
return ret;
|
||||
return dsi_ctx.accum_err;
|
||||
}
|
||||
|
||||
static void stk_panel_off(struct stk_panel *stk)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = stk->dsi;
|
||||
struct device *dev = &stk->dsi->dev;
|
||||
int ret;
|
||||
struct mipi_dsi_multi_context dsi_ctx = {.dsi = dsi};
|
||||
|
||||
dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
|
||||
|
||||
ret = mipi_dsi_dcs_set_display_off(dsi);
|
||||
if (ret < 0)
|
||||
dev_err(dev, "failed to set display off: %d\n", ret);
|
||||
mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
|
||||
mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
|
||||
|
||||
ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
|
||||
if (ret < 0)
|
||||
dev_err(dev, "failed to enter sleep mode: %d\n", ret);
|
||||
|
||||
msleep(100);
|
||||
mipi_dsi_msleep(&dsi_ctx, 100);
|
||||
}
|
||||
|
||||
static int stk_panel_unprepare(struct drm_panel *panel)
|
||||
@ -155,7 +118,6 @@ static int stk_panel_unprepare(struct drm_panel *panel)
|
||||
static int stk_panel_prepare(struct drm_panel *panel)
|
||||
{
|
||||
struct stk_panel *stk = to_stk_panel(panel);
|
||||
struct device *dev = &stk->dsi->dev;
|
||||
int ret;
|
||||
|
||||
gpiod_set_value(stk->reset_gpio, 0);
|
||||
@ -175,16 +137,12 @@ static int stk_panel_prepare(struct drm_panel *panel)
|
||||
gpiod_set_value(stk->reset_gpio, 1);
|
||||
mdelay(10);
|
||||
ret = stk_panel_init(stk);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to init panel: %d\n", ret);
|
||||
if (ret < 0)
|
||||
goto poweroff;
|
||||
}
|
||||
|
||||
ret = stk_panel_on(stk);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set panel on: %d\n", ret);
|
||||
if (ret < 0)
|
||||
goto poweroff;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@ -250,18 +208,15 @@ static int dsi_dcs_bl_get_brightness(struct backlight_device *bl)
|
||||
static int dsi_dcs_bl_update_status(struct backlight_device *bl)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = bl_get_data(bl);
|
||||
struct device *dev = &dsi->dev;
|
||||
int ret;
|
||||
struct mipi_dsi_multi_context dsi_ctx = {.dsi = dsi};
|
||||
|
||||
dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
|
||||
ret = mipi_dsi_dcs_set_display_brightness(dsi, bl->props.brightness);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set DSI control: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, bl->props.brightness);
|
||||
if (dsi_ctx.accum_err)
|
||||
return dsi_ctx.accum_err;
|
||||
|
||||
dsi->mode_flags |= MIPI_DSI_MODE_LPM;
|
||||
return 0;
|
||||
return dsi_ctx.accum_err;
|
||||
}
|
||||
|
||||
static const struct backlight_ops dsi_bl_ops = {
|
||||
|
@ -249,7 +249,7 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
|
||||
*/
|
||||
if (bd->props.brightness == 0)
|
||||
bd->props.brightness = RADEON_MAX_BL_LEVEL;
|
||||
bd->props.power = FB_BLANK_UNBLANK;
|
||||
bd->props.power = BACKLIGHT_POWER_ON;
|
||||
backlight_update_status(bd);
|
||||
|
||||
DRM_INFO("radeon atom DIG backlight initialized\n");
|
||||
|
@ -450,7 +450,7 @@ void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
|
||||
}
|
||||
|
||||
bd->props.brightness = radeon_legacy_backlight_get_brightness(bd);
|
||||
bd->props.power = FB_BLANK_UNBLANK;
|
||||
bd->props.power = BACKLIGHT_POWER_ON;
|
||||
backlight_update_status(bd);
|
||||
|
||||
DRM_INFO("radeon legacy LVDS backlight initialized\n");
|
||||
|
@ -262,7 +262,7 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = {
|
||||
static const struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = {
|
||||
.mode_fixup = rockchip_dp_drm_encoder_mode_fixup,
|
||||
.mode_set = rockchip_dp_drm_encoder_mode_set,
|
||||
.atomic_enable = rockchip_dp_drm_encoder_enable,
|
||||
|
@ -266,15 +266,6 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector)
|
||||
|
||||
mutex_lock(&dp->lock);
|
||||
|
||||
if (dp->drm_edid) {
|
||||
/* FIXME: get rid of drm_edid_raw() */
|
||||
const struct edid *edid = drm_edid_raw(dp->drm_edid);
|
||||
|
||||
DRM_DEV_DEBUG_KMS(dp->dev, "got edid: width[%d] x height[%d]\n",
|
||||
edid->width_cm, edid->height_cm);
|
||||
|
||||
}
|
||||
|
||||
ret = drm_edid_connector_add_modes(connector);
|
||||
|
||||
mutex_unlock(&dp->lock);
|
||||
@ -369,6 +360,7 @@ static int cdn_dp_firmware_init(struct cdn_dp_device *dp)
|
||||
|
||||
static int cdn_dp_get_sink_capability(struct cdn_dp_device *dp)
|
||||
{
|
||||
const struct drm_display_info *info = &dp->connector.display_info;
|
||||
int ret;
|
||||
|
||||
if (!cdn_dp_check_sink_connection(dp))
|
||||
@ -386,7 +378,11 @@ static int cdn_dp_get_sink_capability(struct cdn_dp_device *dp)
|
||||
cdn_dp_get_edid_block, dp);
|
||||
drm_edid_connector_update(&dp->connector, dp->drm_edid);
|
||||
|
||||
dp->sink_has_audio = dp->connector.display_info.has_audio;
|
||||
dp->sink_has_audio = info->has_audio;
|
||||
|
||||
if (dp->drm_edid)
|
||||
DRM_DEV_DEBUG_KMS(dp->dev, "got edid: width[%d] x height[%d]\n",
|
||||
info->width_mm / 10, info->height_mm / 10);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -969,21 +965,21 @@ static void cdn_dp_pd_event_work(struct work_struct *work)
|
||||
|
||||
/* Not connected, notify userspace to disable the block */
|
||||
if (!cdn_dp_connected_port(dp)) {
|
||||
DRM_DEV_INFO(dp->dev, "Not connected. Disabling cdn\n");
|
||||
DRM_DEV_INFO(dp->dev, "Not connected; disabling cdn\n");
|
||||
dp->connected = false;
|
||||
|
||||
/* Connected but not enabled, enable the block */
|
||||
} else if (!dp->active) {
|
||||
DRM_DEV_INFO(dp->dev, "Connected, not enabled. Enabling cdn\n");
|
||||
DRM_DEV_INFO(dp->dev, "Connected, not enabled; enabling cdn\n");
|
||||
ret = cdn_dp_enable(dp);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dp->dev, "Enable dp failed %d\n", ret);
|
||||
DRM_DEV_ERROR(dp->dev, "Enabling dp failed: %d\n", ret);
|
||||
dp->connected = false;
|
||||
}
|
||||
|
||||
/* Enabled and connected to a dongle without a sink, notify userspace */
|
||||
} else if (!cdn_dp_check_sink_connection(dp)) {
|
||||
DRM_DEV_INFO(dp->dev, "Connected without sink. Assert hpd\n");
|
||||
DRM_DEV_INFO(dp->dev, "Connected without sink; assert hpd\n");
|
||||
dp->connected = false;
|
||||
|
||||
/* Enabled and connected with a sink, re-train if requested */
|
||||
@ -992,11 +988,11 @@ static void cdn_dp_pd_event_work(struct work_struct *work)
|
||||
unsigned int lanes = dp->max_lanes;
|
||||
struct drm_display_mode *mode = &dp->mode;
|
||||
|
||||
DRM_DEV_INFO(dp->dev, "Connected with sink. Re-train link\n");
|
||||
DRM_DEV_INFO(dp->dev, "Connected with sink; re-train link\n");
|
||||
ret = cdn_dp_train_link(dp);
|
||||
if (ret) {
|
||||
dp->connected = false;
|
||||
DRM_DEV_ERROR(dp->dev, "Train link failed %d\n", ret);
|
||||
DRM_DEV_ERROR(dp->dev, "Training link failed: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1006,9 +1002,7 @@ static void cdn_dp_pd_event_work(struct work_struct *work)
|
||||
ret = cdn_dp_config_video(dp);
|
||||
if (ret) {
|
||||
dp->connected = false;
|
||||
DRM_DEV_ERROR(dp->dev,
|
||||
"Failed to config video %d\n",
|
||||
ret);
|
||||
DRM_DEV_ERROR(dp->dev, "Failed to configure video: %d\n", ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,11 +61,13 @@
|
||||
* @lcdsel_grf_reg: grf register offset of lcdc select
|
||||
* @lcdsel_big: reg value of selecting vop big for HDMI
|
||||
* @lcdsel_lit: reg value of selecting vop little for HDMI
|
||||
* @max_tmds_clock: maximum TMDS clock rate supported
|
||||
*/
|
||||
struct rockchip_hdmi_chip_data {
|
||||
int lcdsel_grf_reg;
|
||||
u32 lcdsel_big;
|
||||
u32 lcdsel_lit;
|
||||
int max_tmds_clock;
|
||||
};
|
||||
|
||||
struct rockchip_hdmi {
|
||||
@ -77,8 +79,6 @@ struct rockchip_hdmi {
|
||||
struct clk *ref_clk;
|
||||
struct clk *grf_clk;
|
||||
struct dw_hdmi *hdmi;
|
||||
struct regulator *avdd_0v9;
|
||||
struct regulator *avdd_1v8;
|
||||
struct phy *phy;
|
||||
};
|
||||
|
||||
@ -209,43 +209,40 @@ static const struct dw_hdmi_phy_config rockchip_phy_config[] = {
|
||||
static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
|
||||
{
|
||||
struct device_node *np = hdmi->dev->of_node;
|
||||
int ret;
|
||||
|
||||
hdmi->regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
|
||||
if (IS_ERR(hdmi->regmap)) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "Unable to get rockchip,grf\n");
|
||||
drm_err(hdmi, "Unable to get rockchip,grf\n");
|
||||
return PTR_ERR(hdmi->regmap);
|
||||
}
|
||||
|
||||
hdmi->ref_clk = devm_clk_get_optional(hdmi->dev, "ref");
|
||||
hdmi->ref_clk = devm_clk_get_optional_enabled(hdmi->dev, "ref");
|
||||
if (!hdmi->ref_clk)
|
||||
hdmi->ref_clk = devm_clk_get_optional(hdmi->dev, "vpll");
|
||||
hdmi->ref_clk = devm_clk_get_optional_enabled(hdmi->dev, "vpll");
|
||||
|
||||
if (PTR_ERR(hdmi->ref_clk) == -EPROBE_DEFER) {
|
||||
return -EPROBE_DEFER;
|
||||
} else if (IS_ERR(hdmi->ref_clk)) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "failed to get reference clock\n");
|
||||
return PTR_ERR(hdmi->ref_clk);
|
||||
if (IS_ERR(hdmi->ref_clk)) {
|
||||
ret = PTR_ERR(hdmi->ref_clk);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
drm_err(hdmi, "failed to get reference clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
hdmi->grf_clk = devm_clk_get(hdmi->dev, "grf");
|
||||
if (PTR_ERR(hdmi->grf_clk) == -ENOENT) {
|
||||
hdmi->grf_clk = NULL;
|
||||
} else if (PTR_ERR(hdmi->grf_clk) == -EPROBE_DEFER) {
|
||||
return -EPROBE_DEFER;
|
||||
} else if (IS_ERR(hdmi->grf_clk)) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "failed to get grf clock\n");
|
||||
return PTR_ERR(hdmi->grf_clk);
|
||||
hdmi->grf_clk = devm_clk_get_optional(hdmi->dev, "grf");
|
||||
if (IS_ERR(hdmi->grf_clk)) {
|
||||
ret = PTR_ERR(hdmi->grf_clk);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
drm_err(hdmi, "failed to get grf clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
hdmi->avdd_0v9 = devm_regulator_get(hdmi->dev, "avdd-0v9");
|
||||
if (IS_ERR(hdmi->avdd_0v9))
|
||||
return PTR_ERR(hdmi->avdd_0v9);
|
||||
ret = devm_regulator_get_enable(hdmi->dev, "avdd-0v9");
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
hdmi->avdd_1v8 = devm_regulator_get(hdmi->dev, "avdd-1v8");
|
||||
if (IS_ERR(hdmi->avdd_1v8))
|
||||
return PTR_ERR(hdmi->avdd_1v8);
|
||||
ret = devm_regulator_get_enable(hdmi->dev, "avdd-1v8");
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum drm_mode_status
|
||||
@ -259,6 +256,10 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *dw_hdmi, void *data,
|
||||
bool exact_match = hdmi->plat_data->phy_force_vendor;
|
||||
int i;
|
||||
|
||||
if (hdmi->chip_data->max_tmds_clock &&
|
||||
mode->clock > hdmi->chip_data->max_tmds_clock)
|
||||
return MODE_CLOCK_HIGH;
|
||||
|
||||
if (hdmi->ref_clk) {
|
||||
int rpclk = clk_round_rate(hdmi->ref_clk, pclk);
|
||||
|
||||
@ -322,17 +323,16 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder)
|
||||
|
||||
ret = clk_prepare_enable(hdmi->grf_clk);
|
||||
if (ret < 0) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "failed to enable grfclk %d\n", ret);
|
||||
drm_err(hdmi, "failed to enable grfclk %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = regmap_write(hdmi->regmap, hdmi->chip_data->lcdsel_grf_reg, val);
|
||||
if (ret != 0)
|
||||
DRM_DEV_ERROR(hdmi->dev, "Could not write to GRF: %d\n", ret);
|
||||
drm_err(hdmi, "Could not write to GRF: %d\n", ret);
|
||||
|
||||
clk_disable_unprepare(hdmi->grf_clk);
|
||||
DRM_DEV_DEBUG(hdmi->dev, "vop %s output to hdmi\n",
|
||||
ret ? "LIT" : "BIG");
|
||||
drm_dbg(hdmi, "vop %s output to hdmi\n", ret ? "LIT" : "BIG");
|
||||
}
|
||||
|
||||
static int
|
||||
@ -362,6 +362,8 @@ static int dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data,
|
||||
{
|
||||
struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
|
||||
|
||||
dw_hdmi_set_high_tmds_clock_ratio(dw_hdmi, display);
|
||||
|
||||
return phy_power_on(hdmi->phy);
|
||||
}
|
||||
|
||||
@ -434,6 +436,8 @@ static void dw_hdmi_rk3328_setup_hpd(struct dw_hdmi *dw_hdmi, void *data)
|
||||
HIWORD_UPDATE(RK3328_HDMI_SDAIN_MSK | RK3328_HDMI_SCLIN_MSK,
|
||||
RK3328_HDMI_SDAIN_MSK | RK3328_HDMI_SCLIN_MSK |
|
||||
RK3328_HDMI_HPD_IOE));
|
||||
|
||||
dw_hdmi_rk3328_read_hpd(dw_hdmi, data);
|
||||
}
|
||||
|
||||
static const struct dw_hdmi_phy_ops rk3228_hdmi_phy_ops = {
|
||||
@ -446,13 +450,11 @@ static const struct dw_hdmi_phy_ops rk3228_hdmi_phy_ops = {
|
||||
|
||||
static struct rockchip_hdmi_chip_data rk3228_chip_data = {
|
||||
.lcdsel_grf_reg = -1,
|
||||
.max_tmds_clock = 594000,
|
||||
};
|
||||
|
||||
static const struct dw_hdmi_plat_data rk3228_hdmi_drv_data = {
|
||||
.mode_valid = dw_hdmi_rockchip_mode_valid,
|
||||
.mpll_cfg = rockchip_mpll_cfg,
|
||||
.cur_ctr = rockchip_cur_ctr,
|
||||
.phy_config = rockchip_phy_config,
|
||||
.phy_data = &rk3228_chip_data,
|
||||
.phy_ops = &rk3228_hdmi_phy_ops,
|
||||
.phy_name = "inno_dw_hdmi_phy2",
|
||||
@ -463,6 +465,7 @@ static struct rockchip_hdmi_chip_data rk3288_chip_data = {
|
||||
.lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
|
||||
.lcdsel_big = HIWORD_UPDATE(0, RK3288_HDMI_LCDC_SEL),
|
||||
.lcdsel_lit = HIWORD_UPDATE(RK3288_HDMI_LCDC_SEL, RK3288_HDMI_LCDC_SEL),
|
||||
.max_tmds_clock = 340000,
|
||||
};
|
||||
|
||||
static const struct dw_hdmi_plat_data rk3288_hdmi_drv_data = {
|
||||
@ -483,13 +486,11 @@ static const struct dw_hdmi_phy_ops rk3328_hdmi_phy_ops = {
|
||||
|
||||
static struct rockchip_hdmi_chip_data rk3328_chip_data = {
|
||||
.lcdsel_grf_reg = -1,
|
||||
.max_tmds_clock = 594000,
|
||||
};
|
||||
|
||||
static const struct dw_hdmi_plat_data rk3328_hdmi_drv_data = {
|
||||
.mode_valid = dw_hdmi_rockchip_mode_valid,
|
||||
.mpll_cfg = rockchip_mpll_cfg,
|
||||
.cur_ctr = rockchip_cur_ctr,
|
||||
.phy_config = rockchip_phy_config,
|
||||
.phy_data = &rk3328_chip_data,
|
||||
.phy_ops = &rk3328_hdmi_phy_ops,
|
||||
.phy_name = "inno_dw_hdmi_phy2",
|
||||
@ -501,6 +502,7 @@ static struct rockchip_hdmi_chip_data rk3399_chip_data = {
|
||||
.lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
|
||||
.lcdsel_big = HIWORD_UPDATE(0, RK3399_HDMI_LCDC_SEL),
|
||||
.lcdsel_lit = HIWORD_UPDATE(RK3399_HDMI_LCDC_SEL, RK3399_HDMI_LCDC_SEL),
|
||||
.max_tmds_clock = 340000,
|
||||
};
|
||||
|
||||
static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = {
|
||||
@ -514,6 +516,7 @@ static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = {
|
||||
|
||||
static struct rockchip_hdmi_chip_data rk3568_chip_data = {
|
||||
.lcdsel_grf_reg = -1,
|
||||
.max_tmds_clock = 340000,
|
||||
};
|
||||
|
||||
static const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = {
|
||||
@ -592,7 +595,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
|
||||
ret = rockchip_hdmi_parse_dt(hdmi);
|
||||
if (ret) {
|
||||
if (ret != -EPROBE_DEFER)
|
||||
DRM_DEV_ERROR(hdmi->dev, "Unable to parse OF data\n");
|
||||
drm_err(hdmi, "Unable to parse OF data\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -600,29 +603,10 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
|
||||
if (IS_ERR(hdmi->phy)) {
|
||||
ret = PTR_ERR(hdmi->phy);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
DRM_DEV_ERROR(hdmi->dev, "failed to get phy\n");
|
||||
drm_err(hdmi, "failed to get phy\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regulator_enable(hdmi->avdd_0v9);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "failed to enable avdd0v9: %d\n", ret);
|
||||
goto err_avdd_0v9;
|
||||
}
|
||||
|
||||
ret = regulator_enable(hdmi->avdd_1v8);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "failed to enable avdd1v8: %d\n", ret);
|
||||
goto err_avdd_1v8;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(hdmi->ref_clk);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(hdmi->dev, "Failed to enable HDMI reference clock: %d\n",
|
||||
ret);
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
if (hdmi->chip_data == &rk3568_chip_data) {
|
||||
regmap_write(hdmi->regmap, RK3568_GRF_VO_CON1,
|
||||
HIWORD_UPDATE(RK3568_HDMI_SDAIN_MSK |
|
||||
@ -651,12 +635,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
|
||||
|
||||
err_bind:
|
||||
drm_encoder_cleanup(encoder);
|
||||
clk_disable_unprepare(hdmi->ref_clk);
|
||||
err_clk:
|
||||
regulator_disable(hdmi->avdd_1v8);
|
||||
err_avdd_1v8:
|
||||
regulator_disable(hdmi->avdd_0v9);
|
||||
err_avdd_0v9:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -667,10 +646,6 @@ static void dw_hdmi_rockchip_unbind(struct device *dev, struct device *master,
|
||||
|
||||
dw_hdmi_unbind(hdmi->hdmi);
|
||||
drm_encoder_cleanup(&hdmi->encoder.encoder);
|
||||
clk_disable_unprepare(hdmi->ref_clk);
|
||||
|
||||
regulator_disable(hdmi->avdd_1v8);
|
||||
regulator_disable(hdmi->avdd_0v9);
|
||||
}
|
||||
|
||||
static const struct component_ops dw_hdmi_rockchip_ops = {
|
||||
|
@ -545,7 +545,7 @@ inno_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct drm_encoder_helper_funcs inno_hdmi_encoder_helper_funcs = {
|
||||
static const struct drm_encoder_helper_funcs inno_hdmi_encoder_helper_funcs = {
|
||||
.atomic_check = inno_hdmi_encoder_atomic_check,
|
||||
.atomic_enable = inno_hdmi_encoder_enable,
|
||||
.atomic_disable = inno_hdmi_encoder_disable,
|
||||
|
@ -12,9 +12,10 @@
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_gem.h>
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/component.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/component.h>
|
||||
|
||||
#define ROCKCHIP_MAX_FB_BUFFER 3
|
||||
#define ROCKCHIP_MAX_CONNECTOR 2
|
||||
|
@ -396,8 +396,8 @@ static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win,
|
||||
if (info->is_yuv)
|
||||
is_yuv = true;
|
||||
|
||||
if (dst_w > 3840) {
|
||||
DRM_DEV_ERROR(vop->dev, "Maximum dst width (3840) exceeded\n");
|
||||
if (dst_w > 4096) {
|
||||
DRM_DEV_ERROR(vop->dev, "Maximum dst width (4096) exceeded\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1583,6 +1583,10 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
VOP_AFBC_SET(vop, enable, s->enable_afbc);
|
||||
vop_cfg_done(vop);
|
||||
|
||||
/* Ack the DMA transfer of the previous frame (RK3066). */
|
||||
if (VOP_HAS_REG(vop, common, dma_stop))
|
||||
VOP_REG_SET(vop, common, dma_stop, 0);
|
||||
|
||||
spin_unlock(&vop->reg_lock);
|
||||
|
||||
/*
|
||||
|
@ -122,6 +122,7 @@ struct vop_common {
|
||||
struct vop_reg lut_buffer_index;
|
||||
struct vop_reg gate_en;
|
||||
struct vop_reg mmu_en;
|
||||
struct vop_reg dma_stop;
|
||||
struct vop_reg out_mode;
|
||||
struct vop_reg standby;
|
||||
};
|
||||
|
@ -466,6 +466,7 @@ static const struct vop_output rk3066_output = {
|
||||
};
|
||||
|
||||
static const struct vop_common rk3066_common = {
|
||||
.dma_stop = VOP_REG(RK3066_SYS_CTRL0, 0x1, 0),
|
||||
.standby = VOP_REG(RK3066_SYS_CTRL0, 0x1, 1),
|
||||
.out_mode = VOP_REG(RK3066_DSP_CTRL0, 0xf, 0),
|
||||
.cfg_done = VOP_REG(RK3066_REG_CFG_DONE, 0x1, 0),
|
||||
@ -514,6 +515,7 @@ static const struct vop_data rk3066_vop = {
|
||||
.output = &rk3066_output,
|
||||
.win = rk3066_vop_win_data,
|
||||
.win_size = ARRAY_SIZE(rk3066_vop_win_data),
|
||||
.feature = VOP_FEATURE_INTERNAL_RGB,
|
||||
.max_output = { 1920, 1080 },
|
||||
};
|
||||
|
||||
|
@ -49,7 +49,7 @@ static void panel_encoder_dpms(struct drm_encoder *encoder, int mode)
|
||||
|
||||
if (backlight) {
|
||||
backlight->props.power = mode == DRM_MODE_DPMS_ON ?
|
||||
FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
|
||||
BACKLIGHT_POWER_ON : BACKLIGHT_POWER_OFF;
|
||||
backlight_update_status(backlight);
|
||||
}
|
||||
|
||||
|
@ -164,9 +164,11 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev)
|
||||
dev->mode_config.max_height = YRES_MAX;
|
||||
dev->mode_config.cursor_width = 512;
|
||||
dev->mode_config.cursor_height = 512;
|
||||
/* FIXME: There's a confusion between bpp and depth between this and
|
||||
/*
|
||||
* FIXME: There's a confusion between bpp and depth between this and
|
||||
* fbdev helpers. We have to go with 0, meaning "pick the default",
|
||||
* which ix XRGB8888 in all cases. */
|
||||
* which is XRGB8888 in all cases.
|
||||
*/
|
||||
dev->mode_config.preferred_depth = 0;
|
||||
dev->mode_config.helper_private = &vkms_mode_config_helpers;
|
||||
|
||||
|
@ -926,8 +926,7 @@ static void vga_switcheroo_debugfs_init(struct vgasr_priv *priv)
|
||||
/**
|
||||
* vga_switcheroo_process_delayed_switch() - helper for delayed switching
|
||||
*
|
||||
* Process a delayed switch if one is pending. DRM drivers should call this
|
||||
* from their ->lastclose callback.
|
||||
* Process a delayed switch if one is pending.
|
||||
*
|
||||
* Return: 0 on success. -EINVAL if no delayed switch is pending, if the client
|
||||
* has unregistered in the meantime or if there are other clients blocking the
|
||||
|
@ -228,34 +228,6 @@ struct drm_driver {
|
||||
*/
|
||||
void (*postclose) (struct drm_device *, struct drm_file *);
|
||||
|
||||
/**
|
||||
* @lastclose:
|
||||
*
|
||||
* Called when the last &struct drm_file has been closed and there's
|
||||
* currently no userspace client for the &struct drm_device.
|
||||
*
|
||||
* Modern drivers should only use this to force-restore the fbdev
|
||||
* framebuffer using drm_fb_helper_restore_fbdev_mode_unlocked().
|
||||
* Anything else would indicate there's something seriously wrong.
|
||||
* Modern drivers can also use this to execute delayed power switching
|
||||
* state changes, e.g. in conjunction with the :ref:`vga_switcheroo`
|
||||
* infrastructure.
|
||||
*
|
||||
* This is called after @postclose hook has been called.
|
||||
*
|
||||
* NOTE:
|
||||
*
|
||||
* All legacy drivers use this callback to de-initialize the hardware.
|
||||
* This is purely because of the shadow-attach model, where the DRM
|
||||
* kernel driver does not really own the hardware. Instead ownershipe is
|
||||
* handled with the help of userspace through an inheritedly racy dance
|
||||
* to set/unset the VT into raw mode.
|
||||
*
|
||||
* Legacy drivers initialize the hardware in the @firstopen callback,
|
||||
* which isn't even called for modern drivers.
|
||||
*/
|
||||
void (*lastclose) (struct drm_device *);
|
||||
|
||||
/**
|
||||
* @unload:
|
||||
*
|
||||
|
@ -440,8 +440,6 @@ int drm_add_modes_noedid(struct drm_connector *connector,
|
||||
int hdisplay, int vdisplay);
|
||||
|
||||
int drm_edid_header_is_valid(const void *edid);
|
||||
bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
|
||||
bool *edid_corrupt);
|
||||
bool drm_edid_is_valid(struct edid *edid);
|
||||
void drm_edid_get_monitor_name(const struct edid *edid, char *name,
|
||||
int buflen);
|
||||
|
@ -271,9 +271,7 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
|
||||
int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper);
|
||||
int drm_fb_helper_debug_enter(struct fb_info *info);
|
||||
int drm_fb_helper_debug_leave(struct fb_info *info);
|
||||
|
||||
void drm_fb_helper_lastclose(struct drm_device *dev);
|
||||
void drm_fb_helper_output_poll_changed(struct drm_device *dev);
|
||||
#else
|
||||
static inline void drm_fb_helper_prepare(struct drm_device *dev,
|
||||
struct drm_fb_helper *helper,
|
||||
@ -401,10 +399,6 @@ static inline int drm_fb_helper_debug_leave(struct fb_info *info)
|
||||
static inline void drm_fb_helper_lastclose(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -25,8 +25,9 @@
|
||||
#ifndef DRM_FIXED_H
|
||||
#define DRM_FIXED_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/wordpart.h>
|
||||
|
||||
typedef union dfixed {
|
||||
u32 full;
|
||||
|
@ -365,6 +365,16 @@ void mipi_dsi_dcs_set_display_off_multi(struct mipi_dsi_multi_context *ctx);
|
||||
void mipi_dsi_dcs_set_display_on_multi(struct mipi_dsi_multi_context *ctx);
|
||||
void mipi_dsi_dcs_set_tear_on_multi(struct mipi_dsi_multi_context *ctx,
|
||||
enum mipi_dsi_dcs_tear_mode mode);
|
||||
void mipi_dsi_turn_on_peripheral_multi(struct mipi_dsi_multi_context *ctx);
|
||||
void mipi_dsi_dcs_soft_reset_multi(struct mipi_dsi_multi_context *ctx);
|
||||
void mipi_dsi_dcs_set_display_brightness_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u16 brightness);
|
||||
void mipi_dsi_dcs_set_pixel_format_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u8 format);
|
||||
void mipi_dsi_dcs_set_column_address_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u16 start, u16 end);
|
||||
void mipi_dsi_dcs_set_page_address_multi(struct mipi_dsi_multi_context *ctx,
|
||||
u16 start, u16 end);
|
||||
|
||||
/**
|
||||
* mipi_dsi_generic_write_seq - transmit data using a generic write packet
|
||||
|
@ -97,22 +97,6 @@ struct drm_mode_config_funcs {
|
||||
*/
|
||||
const struct drm_format_info *(*get_format_info)(const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
/**
|
||||
* @output_poll_changed:
|
||||
*
|
||||
* Callback used by helpers to inform the driver of output configuration
|
||||
* changes.
|
||||
*
|
||||
* Drivers implementing fbdev emulation use drm_kms_helper_hotplug_event()
|
||||
* to call this hook to inform the fbdev helper of output changes.
|
||||
*
|
||||
* This hook is deprecated, drivers should instead implement fbdev
|
||||
* support with struct drm_client, which takes care of any necessary
|
||||
* hotplug event forwarding already without further involvement by
|
||||
* the driver.
|
||||
*/
|
||||
void (*output_poll_changed)(struct drm_device *dev);
|
||||
|
||||
/**
|
||||
* @mode_valid:
|
||||
*
|
||||
|
@ -1,4 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 or MIT */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2024 Intel
|
||||
* Copyright (c) 2024 Red Hat
|
||||
*/
|
||||
|
||||
#ifndef __DRM_PANIC_H__
|
||||
#define __DRM_PANIC_H__
|
||||
|
||||
@ -8,9 +14,6 @@
|
||||
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/drm_fourcc.h>
|
||||
/*
|
||||
* Copyright (c) 2024 Intel
|
||||
*/
|
||||
|
||||
/**
|
||||
* struct drm_scanout_buffer - DRM scanout buffer
|
||||
@ -146,16 +149,4 @@ struct drm_scanout_buffer {
|
||||
#define drm_panic_unlock(dev, flags) \
|
||||
raw_spin_unlock_irqrestore(&(dev)->mode_config.panic_lock, flags)
|
||||
|
||||
#ifdef CONFIG_DRM_PANIC
|
||||
|
||||
void drm_panic_register(struct drm_device *dev);
|
||||
void drm_panic_unregister(struct drm_device *dev);
|
||||
|
||||
#else
|
||||
|
||||
static inline void drm_panic_register(struct drm_device *dev) {}
|
||||
static inline void drm_panic_unregister(struct drm_device *dev) {}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __DRM_PANIC_H__ */
|
||||
|
@ -859,6 +859,8 @@ struct drm_color_lut {
|
||||
|
||||
/**
|
||||
* struct drm_plane_size_hint - Plane size hints
|
||||
* @width: The width of the plane in pixel
|
||||
* @height: The height of the plane in pixel
|
||||
*
|
||||
* The plane SIZE_HINTS property blob contains an
|
||||
* array of struct drm_plane_size_hint.
|
||||
|
Loading…
Reference in New Issue
Block a user