mirror of
https://github.com/torvalds/linux
synced 2024-09-30 00:10:51 +00:00
drm fixes for 6.10-rc6
core: - fix refcounting race on pid handover fbdev: - Fix fb_info when vmalloc is used, regression from CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM. amdgpu: - SMU 14.x fix - vram info parsing fix - mode1 reset fix - LTTPR fix - Virtual display fix - Avoid spurious error in PSP init i915: - Fix potential UAF due to race on fence register revocation nouveau - nouveau tv mode fixes. panel: - Add KOE TX26D202VM0BWA timings. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmZ9+dUACgkQDHTzWXnE hr4wKQ/+Irl7gSP6pjQaxX8+vQEztbOAMcugQPilJwOE2VOShkA9BBJsdRGOYtcP 5yCEXIC/iYQj3kIg0b4SbJDbn9BZBjJeGMChQpmb5YEKi5nxoOri30UvH8PWb3xP 9MpO9xACQz5i9iA6FPmSDkRx76Dy5o8GF5GASsuZrXF/Hd5YFRFxw9NtYwomcZ2b ghn0v7MCIzeC2Z+snqjkh9TTSMzPGMQJdn8uZ5lHiqS3SGIh9cnrmysxqL+f4OVa xJX0pElE0pEA2O08trghasog4g/VnE5TOwYsNEqQVfX4fW69vas0ZL3S63IX/UUG 05kSd75iy+rZsDQHWblaTsVtOuaBhyqDNt/KOgMDg0fWICN8Y7y37dF4fPn5zJjt RE+axCz1mlVZ7rwPv0I43cEt0dbKe82Qfgcc9aoiJ8imT+ElI/bRkjmjs662Ihfc hlIHdYTbLlUMb1MyM6c9gt8uprd643LcI9hOvJqoYQDUsbR0nZewu9/ElYSb2thl R2YH7Ytc8y6zAXC1TjO6TBifQbtELzrVJkqFtECreiDOI3DlH1M1x10iCxJT9y2L p7MD1VahIdnViLtXm9i6AwEGQAaPGbcJZhsC5QhQ/ev022uMAo8OVbu/3BknDjaO MFKV26POWmmy7RFRU2xNZkEX3YZjUpDiN+DGqLA1JzKBoTUaJSU= =0isZ -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2024-06-28' of https://gitlab.freedesktop.org/drm/kernel Pull drm fixes from Dave Airlie: "Regular fixes, mostly amdgpu with some minor fixes in other places, along with a fix for a very narrow UAF race in the pid handover code. core: - fix refcounting race on pid handover fbdev: - Fix fb_info when vmalloc is used, regression from CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM. amdgpu: - SMU 14.x fix - vram info parsing fix - mode1 reset fix - LTTPR fix - Virtual display fix - Avoid spurious error in PSP init i915: - Fix potential UAF due to race on fence register revocation nouveau - nouveau tv mode fixes panel: - Add KOE TX26D202VM0BWA timings" * tag 'drm-fixes-2024-06-28' of https://gitlab.freedesktop.org/drm/kernel: drm/drm_file: Fix pid refcounting race drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_ld_modes drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_hd_modes drm/amdgpu: Don't show false warning for reg list drm/amdgpu: avoid using null object of framebuffer drm/amd/display: Send DP_TOTAL_LTTPR_CNT during detection if LTTPR is present drm/amdgpu: Fix pci state save during mode-1 reset drm/amdgpu/atomfirmware: fix parsing of vram_info drm/amd/swsmu: add MALL init support workaround for smu_v14_0_1 drm/i915/gt: Fix potential UAF by revoke of fence registers drm/panel: simple: Add missing display timing flags for KOE TX26D202VM0BWA drm/fbdev-dma: Only set smem_start is enable per module option
This commit is contained in:
commit
1c52cf5e79
|
@ -400,7 +400,7 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
|
|||
mem_channel_number = vram_info->v30.channel_num;
|
||||
mem_channel_width = vram_info->v30.channel_width;
|
||||
if (vram_width)
|
||||
*vram_width = mem_channel_number * (1 << mem_channel_width);
|
||||
*vram_width = mem_channel_number * 16;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
|
|
@ -5220,11 +5220,14 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
|
|||
|
||||
dev_info(adev->dev, "GPU mode1 reset\n");
|
||||
|
||||
/* Cache the state before bus master disable. The saved config space
|
||||
* values are used in other cases like restore after mode-2 reset.
|
||||
*/
|
||||
amdgpu_device_cache_pci_state(adev->pdev);
|
||||
|
||||
/* disable BM */
|
||||
pci_clear_master(adev->pdev);
|
||||
|
||||
amdgpu_device_cache_pci_state(adev->pdev);
|
||||
|
||||
if (amdgpu_dpm_is_mode1_reset_supported(adev)) {
|
||||
dev_info(adev->dev, "GPU smu mode1 reset\n");
|
||||
ret = amdgpu_dpm_mode1_reset(adev);
|
||||
|
|
|
@ -640,6 +640,20 @@ static const char *psp_gfx_cmd_name(enum psp_gfx_cmd_id cmd_id)
|
|||
}
|
||||
}
|
||||
|
||||
static bool psp_err_warn(struct psp_context *psp)
|
||||
{
|
||||
struct psp_gfx_cmd_resp *cmd = psp->cmd_buf_mem;
|
||||
|
||||
/* This response indicates reg list is already loaded */
|
||||
if (amdgpu_ip_version(psp->adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 2) &&
|
||||
cmd->cmd_id == GFX_CMD_ID_LOAD_IP_FW &&
|
||||
cmd->cmd.cmd_load_ip_fw.fw_type == GFX_FW_TYPE_REG_LIST &&
|
||||
cmd->resp.status == TEE_ERROR_CANCEL)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int
|
||||
psp_cmd_submit_buf(struct psp_context *psp,
|
||||
struct amdgpu_firmware_info *ucode,
|
||||
|
@ -699,10 +713,13 @@ psp_cmd_submit_buf(struct psp_context *psp,
|
|||
dev_warn(psp->adev->dev,
|
||||
"failed to load ucode %s(0x%X) ",
|
||||
amdgpu_ucode_name(ucode->ucode_id), ucode->ucode_id);
|
||||
dev_warn(psp->adev->dev,
|
||||
"psp gfx command %s(0x%X) failed and response status is (0x%X)\n",
|
||||
psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), psp->cmd_buf_mem->cmd_id,
|
||||
psp->cmd_buf_mem->resp.status);
|
||||
if (psp_err_warn(psp))
|
||||
dev_warn(
|
||||
psp->adev->dev,
|
||||
"psp gfx command %s(0x%X) failed and response status is (0x%X)\n",
|
||||
psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id),
|
||||
psp->cmd_buf_mem->cmd_id,
|
||||
psp->cmd_buf_mem->resp.status);
|
||||
/* If any firmware (including CAP) load fails under SRIOV, it should
|
||||
* return failure to stop the VF from initializing.
|
||||
* Also return failure in case of timeout
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_edid.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_vblank.h>
|
||||
|
||||
#include "amdgpu.h"
|
||||
|
@ -314,7 +315,13 @@ static int amdgpu_vkms_prepare_fb(struct drm_plane *plane,
|
|||
return 0;
|
||||
}
|
||||
afb = to_amdgpu_framebuffer(new_state->fb);
|
||||
obj = new_state->fb->obj[0];
|
||||
|
||||
obj = drm_gem_fb_get_obj(new_state->fb, 0);
|
||||
if (!obj) {
|
||||
DRM_ERROR("Failed to get obj from framebuffer\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rbo = gem_to_amdgpu_bo(obj);
|
||||
adev = amdgpu_ttm_adev(rbo->tbo.bdev);
|
||||
|
||||
|
@ -368,12 +375,19 @@ static void amdgpu_vkms_cleanup_fb(struct drm_plane *plane,
|
|||
struct drm_plane_state *old_state)
|
||||
{
|
||||
struct amdgpu_bo *rbo;
|
||||
struct drm_gem_object *obj;
|
||||
int r;
|
||||
|
||||
if (!old_state->fb)
|
||||
return;
|
||||
|
||||
rbo = gem_to_amdgpu_bo(old_state->fb->obj[0]);
|
||||
obj = drm_gem_fb_get_obj(old_state->fb, 0);
|
||||
if (!obj) {
|
||||
DRM_ERROR("Failed to get obj from framebuffer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
rbo = gem_to_amdgpu_bo(obj);
|
||||
r = amdgpu_bo_reserve(rbo, false);
|
||||
if (unlikely(r)) {
|
||||
DRM_ERROR("failed to reserve rbo before unpin\n");
|
||||
|
|
|
@ -464,8 +464,9 @@ struct psp_gfx_rb_frame
|
|||
#define PSP_ERR_UNKNOWN_COMMAND 0x00000100
|
||||
|
||||
enum tee_error_code {
|
||||
TEE_SUCCESS = 0x00000000,
|
||||
TEE_ERROR_NOT_SUPPORTED = 0xFFFF000A,
|
||||
TEE_SUCCESS = 0x00000000,
|
||||
TEE_ERROR_CANCEL = 0xFFFF0002,
|
||||
TEE_ERROR_NOT_SUPPORTED = 0xFFFF000A,
|
||||
};
|
||||
|
||||
#endif /* _PSP_TEE_GFX_IF_H_ */
|
||||
|
|
|
@ -1590,9 +1590,17 @@ static bool retrieve_link_cap(struct dc_link *link)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (dp_is_lttpr_present(link))
|
||||
if (dp_is_lttpr_present(link)) {
|
||||
configure_lttpr_mode_transparent(link);
|
||||
|
||||
// Echo TOTAL_LTTPR_CNT back downstream
|
||||
core_link_write_dpcd(
|
||||
link,
|
||||
DP_TOTAL_LTTPR_CNT,
|
||||
&link->dpcd_caps.lttpr_caps.phy_repeater_cnt,
|
||||
sizeof(link->dpcd_caps.lttpr_caps.phy_repeater_cnt));
|
||||
}
|
||||
|
||||
/* Read DP tunneling information. */
|
||||
status = dpcd_get_tunneling_device_data(link);
|
||||
|
||||
|
|
|
@ -177,4 +177,9 @@ enum dpcd_psr_sink_states {
|
|||
#define DP_SINK_PR_PIXEL_DEVIATION_PER_LINE 0x379
|
||||
#define DP_SINK_PR_MAX_NUMBER_OF_DEVIATION_LINE 0x37A
|
||||
|
||||
/* Remove once drm_dp_helper.h is updated upstream */
|
||||
#ifndef DP_TOTAL_LTTPR_CNT
|
||||
#define DP_TOTAL_LTTPR_CNT 0xF000A /* 2.1 */
|
||||
#endif
|
||||
|
||||
#endif /* __DAL_DPCD_DEFS_H__ */
|
||||
|
|
|
@ -324,6 +324,18 @@ static int smu_dpm_set_umsch_mm_enable(struct smu_context *smu,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int smu_set_mall_enable(struct smu_context *smu)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!smu->ppt_funcs->set_mall_enable)
|
||||
return 0;
|
||||
|
||||
ret = smu->ppt_funcs->set_mall_enable(smu);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* smu_dpm_set_power_gate - power gate/ungate the specific IP block
|
||||
*
|
||||
|
@ -1791,6 +1803,7 @@ static int smu_hw_init(void *handle)
|
|||
smu_dpm_set_jpeg_enable(smu, true);
|
||||
smu_dpm_set_vpe_enable(smu, true);
|
||||
smu_dpm_set_umsch_mm_enable(smu, true);
|
||||
smu_set_mall_enable(smu);
|
||||
smu_set_gfx_cgpg(smu, true);
|
||||
}
|
||||
|
||||
|
|
|
@ -1394,6 +1394,11 @@ struct pptable_funcs {
|
|||
*/
|
||||
int (*dpm_set_umsch_mm_enable)(struct smu_context *smu, bool enable);
|
||||
|
||||
/**
|
||||
* @set_mall_enable: Init MALL power gating control.
|
||||
*/
|
||||
int (*set_mall_enable)(struct smu_context *smu);
|
||||
|
||||
/**
|
||||
* @notify_rlc_state: Notify RLC power state to SMU.
|
||||
*/
|
||||
|
|
|
@ -106,8 +106,8 @@
|
|||
#define PPSMC_MSG_DisableLSdma 0x35 ///< Disable LSDMA
|
||||
#define PPSMC_MSG_SetSoftMaxVpe 0x36 ///<
|
||||
#define PPSMC_MSG_SetSoftMinVpe 0x37 ///<
|
||||
#define PPSMC_MSG_AllocMALLCache 0x38 ///< Allocating MALL Cache
|
||||
#define PPSMC_MSG_ReleaseMALLCache 0x39 ///< Releasing MALL Cache
|
||||
#define PPSMC_MSG_MALLPowerController 0x38 ///< Set MALL control
|
||||
#define PPSMC_MSG_MALLPowerState 0x39 ///< Enter/Exit MALL PG
|
||||
#define PPSMC_Message_Count 0x3A ///< Total number of PPSMC messages
|
||||
/** @}*/
|
||||
|
||||
|
|
|
@ -272,7 +272,9 @@
|
|||
__SMU_DUMMY_MAP(SetSoftMinVpe), \
|
||||
__SMU_DUMMY_MAP(GetMetricsVersion), \
|
||||
__SMU_DUMMY_MAP(EnableUCLKShadow), \
|
||||
__SMU_DUMMY_MAP(RmaDueToBadPageThreshold),
|
||||
__SMU_DUMMY_MAP(RmaDueToBadPageThreshold), \
|
||||
__SMU_DUMMY_MAP(MALLPowerController), \
|
||||
__SMU_DUMMY_MAP(MALLPowerState),
|
||||
|
||||
#undef __SMU_DUMMY_MAP
|
||||
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type
|
||||
|
|
|
@ -52,6 +52,19 @@
|
|||
#define mmMP1_SMN_C2PMSG_90 0x029a
|
||||
#define mmMP1_SMN_C2PMSG_90_BASE_IDX 0
|
||||
|
||||
/* MALLPowerController message arguments (Defines for the Cache mode control) */
|
||||
#define SMU_MALL_PMFW_CONTROL 0
|
||||
#define SMU_MALL_DRIVER_CONTROL 1
|
||||
|
||||
/*
|
||||
* MALLPowerState message arguments
|
||||
* (Defines for the Allocate/Release Cache mode if in driver mode)
|
||||
*/
|
||||
#define SMU_MALL_EXIT_PG 0
|
||||
#define SMU_MALL_ENTER_PG 1
|
||||
|
||||
#define SMU_MALL_PG_CONFIG_DEFAULT SMU_MALL_PG_CONFIG_DRIVER_CONTROL_ALWAYS_ON
|
||||
|
||||
#define FEATURE_MASK(feature) (1ULL << feature)
|
||||
#define SMC_DPM_FEATURE ( \
|
||||
FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \
|
||||
|
@ -66,6 +79,12 @@
|
|||
FEATURE_MASK(FEATURE_GFX_DPM_BIT) | \
|
||||
FEATURE_MASK(FEATURE_VPE_DPM_BIT))
|
||||
|
||||
enum smu_mall_pg_config {
|
||||
SMU_MALL_PG_CONFIG_PMFW_CONTROL = 0,
|
||||
SMU_MALL_PG_CONFIG_DRIVER_CONTROL_ALWAYS_ON = 1,
|
||||
SMU_MALL_PG_CONFIG_DRIVER_CONTROL_ALWAYS_OFF = 2,
|
||||
};
|
||||
|
||||
static struct cmn2asic_msg_mapping smu_v14_0_0_message_map[SMU_MSG_MAX_COUNT] = {
|
||||
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1),
|
||||
MSG_MAP(GetSmuVersion, PPSMC_MSG_GetPmfwVersion, 1),
|
||||
|
@ -113,6 +132,8 @@ static struct cmn2asic_msg_mapping smu_v14_0_0_message_map[SMU_MSG_MAX_COUNT] =
|
|||
MSG_MAP(PowerDownUmsch, PPSMC_MSG_PowerDownUmsch, 1),
|
||||
MSG_MAP(SetSoftMaxVpe, PPSMC_MSG_SetSoftMaxVpe, 1),
|
||||
MSG_MAP(SetSoftMinVpe, PPSMC_MSG_SetSoftMinVpe, 1),
|
||||
MSG_MAP(MALLPowerController, PPSMC_MSG_MALLPowerController, 1),
|
||||
MSG_MAP(MALLPowerState, PPSMC_MSG_MALLPowerState, 1),
|
||||
};
|
||||
|
||||
static struct cmn2asic_mapping smu_v14_0_0_feature_mask_map[SMU_FEATURE_COUNT] = {
|
||||
|
@ -1423,6 +1444,57 @@ static int smu_v14_0_common_get_dpm_table(struct smu_context *smu, struct dpm_cl
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int smu_v14_0_1_init_mall_power_gating(struct smu_context *smu, enum smu_mall_pg_config pg_config)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
int ret = 0;
|
||||
|
||||
if (pg_config == SMU_MALL_PG_CONFIG_PMFW_CONTROL) {
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_MALLPowerController,
|
||||
SMU_MALL_PMFW_CONTROL, NULL);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Init MALL PMFW CONTROL Failure\n");
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_MALLPowerController,
|
||||
SMU_MALL_DRIVER_CONTROL, NULL);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Init MALL Driver CONTROL Failure\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (pg_config == SMU_MALL_PG_CONFIG_DRIVER_CONTROL_ALWAYS_ON) {
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_MALLPowerState,
|
||||
SMU_MALL_EXIT_PG, NULL);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "EXIT MALL PG Failure\n");
|
||||
return ret;
|
||||
}
|
||||
} else if (pg_config == SMU_MALL_PG_CONFIG_DRIVER_CONTROL_ALWAYS_OFF) {
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_MALLPowerState,
|
||||
SMU_MALL_ENTER_PG, NULL);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Enter MALL PG Failure\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int smu_v14_0_common_set_mall_enable(struct smu_context *smu)
|
||||
{
|
||||
enum smu_mall_pg_config pg_config = SMU_MALL_PG_CONFIG_DEFAULT;
|
||||
int ret = 0;
|
||||
|
||||
if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 1))
|
||||
ret = smu_v14_0_1_init_mall_power_gating(smu, pg_config);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct pptable_funcs smu_v14_0_0_ppt_funcs = {
|
||||
.check_fw_status = smu_v14_0_check_fw_status,
|
||||
.check_fw_version = smu_v14_0_check_fw_version,
|
||||
|
@ -1454,6 +1526,7 @@ static const struct pptable_funcs smu_v14_0_0_ppt_funcs = {
|
|||
.dpm_set_vpe_enable = smu_v14_0_0_set_vpe_enable,
|
||||
.dpm_set_umsch_mm_enable = smu_v14_0_0_set_umsch_mm_enable,
|
||||
.get_dpm_clock_table = smu_v14_0_common_get_dpm_table,
|
||||
.set_mall_enable = smu_v14_0_common_set_mall_enable,
|
||||
};
|
||||
|
||||
static void smu_v14_0_0_set_smu_mailbox_registers(struct smu_context *smu)
|
||||
|
|
|
@ -524,6 +524,9 @@ struct fb_info *drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper)
|
|||
if (!info)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (!drm_leak_fbdev_smem)
|
||||
info->flags |= FBINFO_HIDE_SMEM_START;
|
||||
|
||||
ret = fb_alloc_cmap(&info->cmap, 256, 0);
|
||||
if (ret)
|
||||
goto err_release;
|
||||
|
@ -1860,9 +1863,6 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper)
|
|||
info = fb_helper->info;
|
||||
info->var.pixclock = 0;
|
||||
|
||||
if (!drm_leak_fbdev_smem)
|
||||
info->flags |= FBINFO_HIDE_SMEM_START;
|
||||
|
||||
/* Need to drop locks to avoid recursive deadlock in
|
||||
* register_framebuffer. This is ok because the only thing left to do is
|
||||
* register the fbdev emulation instance in kernel_fb_helper_list. */
|
||||
|
|
|
@ -130,7 +130,10 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
|
|||
info->flags |= FBINFO_READS_FAST; /* signal caching */
|
||||
info->screen_size = sizes->surface_height * fb->pitches[0];
|
||||
info->screen_buffer = map.vaddr;
|
||||
info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer));
|
||||
if (!(info->flags & FBINFO_HIDE_SMEM_START)) {
|
||||
if (!drm_WARN_ON(dev, is_vmalloc_addr(info->screen_buffer)))
|
||||
info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer));
|
||||
}
|
||||
info->fix.smem_len = info->screen_size;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -469,14 +469,12 @@ void drm_file_update_pid(struct drm_file *filp)
|
|||
|
||||
dev = filp->minor->dev;
|
||||
mutex_lock(&dev->filelist_mutex);
|
||||
get_pid(pid);
|
||||
old = rcu_replace_pointer(filp->pid, pid, 1);
|
||||
mutex_unlock(&dev->filelist_mutex);
|
||||
|
||||
if (pid != old) {
|
||||
get_pid(pid);
|
||||
synchronize_rcu();
|
||||
put_pid(old);
|
||||
}
|
||||
synchronize_rcu();
|
||||
put_pid(old);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -298,6 +298,7 @@ void i915_vma_revoke_fence(struct i915_vma *vma)
|
|||
return;
|
||||
|
||||
GEM_BUG_ON(fence->vma != vma);
|
||||
i915_active_wait(&fence->active);
|
||||
GEM_BUG_ON(!i915_active_is_idle(&fence->active));
|
||||
GEM_BUG_ON(atomic_read(&fence->pin_count));
|
||||
|
||||
|
|
|
@ -209,6 +209,8 @@ static int nv17_tv_get_ld_modes(struct drm_encoder *encoder,
|
|||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_mode_duplicate(encoder->dev, tv_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
mode->clock = tv_norm->tv_enc_mode.vrefresh *
|
||||
mode->htotal / 1000 *
|
||||
|
@ -258,6 +260,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
|||
if (modes[i].hdisplay == output_mode->hdisplay &&
|
||||
modes[i].vdisplay == output_mode->vdisplay) {
|
||||
mode = drm_mode_duplicate(encoder->dev, output_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
|
||||
} else {
|
||||
|
@ -265,6 +269,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
|||
modes[i].vdisplay, 60, false,
|
||||
(output_mode->flags &
|
||||
DRM_MODE_FLAG_INTERLACE), false);
|
||||
if (!mode)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* CVT modes are sometimes unsuitable... */
|
||||
|
|
|
@ -2752,6 +2752,7 @@ static const struct display_timing koe_tx26d202vm0bwa_timing = {
|
|||
.vfront_porch = { 3, 5, 10 },
|
||||
.vback_porch = { 2, 5, 10 },
|
||||
.vsync_len = { 5, 5, 5 },
|
||||
.flags = DISPLAY_FLAGS_DE_HIGH,
|
||||
};
|
||||
|
||||
static const struct panel_desc koe_tx26d202vm0bwa = {
|
||||
|
|
Loading…
Reference in a new issue