mirror of https://github.com/torvalds/linux.git
Merge tag 'drm-misc-fixes-2025-06-12' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
drm-misc-fixes for v6.16-rc2: - Fix infinite EPROBE_DEFER loop in vc4 probing. - Fix amdxdna firmware size. - mode fixes for meson. - Kconfig fix for st7171-i2c. - Fix -EBUSY WARN_ON_ONCE in dma-buf - Use dma_sync_sgtable_for_cpu in udmabuf. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://lore.kernel.org/r/62c06195-8bc1-4dae-8777-e86d94e4d9d9@linux.intel.com
This commit is contained in:
commit
1364af9cb2
|
|
@ -126,8 +126,8 @@ struct psp_device *aie2m_psp_create(struct drm_device *ddev, struct psp_config *
|
||||||
psp->ddev = ddev;
|
psp->ddev = ddev;
|
||||||
memcpy(psp->psp_regs, conf->psp_regs, sizeof(psp->psp_regs));
|
memcpy(psp->psp_regs, conf->psp_regs, sizeof(psp->psp_regs));
|
||||||
|
|
||||||
psp->fw_buf_sz = ALIGN(conf->fw_size, PSP_FW_ALIGN) + PSP_FW_ALIGN;
|
psp->fw_buf_sz = ALIGN(conf->fw_size, PSP_FW_ALIGN);
|
||||||
psp->fw_buffer = drmm_kmalloc(ddev, psp->fw_buf_sz, GFP_KERNEL);
|
psp->fw_buffer = drmm_kmalloc(ddev, psp->fw_buf_sz + PSP_FW_ALIGN, GFP_KERNEL);
|
||||||
if (!psp->fw_buffer) {
|
if (!psp->fw_buffer) {
|
||||||
drm_err(ddev, "no memory for fw buffer");
|
drm_err(ddev, "no memory for fw buffer");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -1118,7 +1118,7 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
|
||||||
* Catch exporters making buffers inaccessible even when
|
* Catch exporters making buffers inaccessible even when
|
||||||
* attachments preventing that exist.
|
* attachments preventing that exist.
|
||||||
*/
|
*/
|
||||||
WARN_ON_ONCE(ret == EBUSY);
|
WARN_ON_ONCE(ret == -EBUSY);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -264,8 +264,7 @@ static int begin_cpu_udmabuf(struct dma_buf *buf,
|
||||||
ubuf->sg = NULL;
|
ubuf->sg = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dma_sync_sg_for_cpu(dev, ubuf->sg->sgl, ubuf->sg->nents,
|
dma_sync_sgtable_for_cpu(dev, ubuf->sg, direction);
|
||||||
direction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -280,7 +279,7 @@ static int end_cpu_udmabuf(struct dma_buf *buf,
|
||||||
if (!ubuf->sg)
|
if (!ubuf->sg)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
dma_sync_sg_for_device(dev, ubuf->sg->sgl, ubuf->sg->nents, direction);
|
dma_sync_sgtable_for_device(dev, ubuf->sg, direction);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi,
|
||||||
venc_freq /= 2;
|
venc_freq /= 2;
|
||||||
|
|
||||||
dev_dbg(priv->dev,
|
dev_dbg(priv->dev,
|
||||||
"vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n",
|
"phy:%lluHz vclk=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n",
|
||||||
phy_freq, vclk_freq, venc_freq, hdmi_freq,
|
phy_freq, vclk_freq, venc_freq, hdmi_freq,
|
||||||
priv->venc.hdmi_use_enci);
|
priv->venc.hdmi_use_enci);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -110,10 +110,7 @@
|
||||||
#define HDMI_PLL_LOCK BIT(31)
|
#define HDMI_PLL_LOCK BIT(31)
|
||||||
#define HDMI_PLL_LOCK_G12A (3 << 30)
|
#define HDMI_PLL_LOCK_G12A (3 << 30)
|
||||||
|
|
||||||
#define PIXEL_FREQ_1000_1001(_freq) \
|
#define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL)
|
||||||
DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL)
|
|
||||||
#define PHY_FREQ_1000_1001(_freq) \
|
|
||||||
(PIXEL_FREQ_1000_1001(DIV_ROUND_DOWN_ULL(_freq, 10ULL)) * 10)
|
|
||||||
|
|
||||||
/* VID PLL Dividers */
|
/* VID PLL Dividers */
|
||||||
enum {
|
enum {
|
||||||
|
|
@ -772,6 +769,36 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv,
|
||||||
pll_freq);
|
pll_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool meson_vclk_freqs_are_matching_param(unsigned int idx,
|
||||||
|
unsigned long long phy_freq,
|
||||||
|
unsigned long long vclk_freq)
|
||||||
|
{
|
||||||
|
DRM_DEBUG_DRIVER("i = %d vclk_freq = %lluHz alt = %lluHz\n",
|
||||||
|
idx, params[idx].vclk_freq,
|
||||||
|
FREQ_1000_1001(params[idx].vclk_freq));
|
||||||
|
DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n",
|
||||||
|
idx, params[idx].phy_freq,
|
||||||
|
FREQ_1000_1001(params[idx].phy_freq));
|
||||||
|
|
||||||
|
/* Match strict frequency */
|
||||||
|
if (phy_freq == params[idx].phy_freq &&
|
||||||
|
vclk_freq == params[idx].vclk_freq)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Match 1000/1001 variant: vclk deviation has to be less than 1kHz
|
||||||
|
* (drm EDID is defined in 1kHz steps, so everything smaller must be
|
||||||
|
* rounding error) and the PHY freq deviation has to be less than
|
||||||
|
* 10kHz (as the TMDS clock is 10 times the pixel clock, so anything
|
||||||
|
* smaller must be rounding error as well).
|
||||||
|
*/
|
||||||
|
if (abs(vclk_freq - FREQ_1000_1001(params[idx].vclk_freq)) < 1000 &&
|
||||||
|
abs(phy_freq - FREQ_1000_1001(params[idx].phy_freq)) < 10000)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* no match */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
enum drm_mode_status
|
enum drm_mode_status
|
||||||
meson_vclk_vic_supported_freq(struct meson_drm *priv,
|
meson_vclk_vic_supported_freq(struct meson_drm *priv,
|
||||||
unsigned long long phy_freq,
|
unsigned long long phy_freq,
|
||||||
|
|
@ -790,19 +817,7 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0 ; params[i].pixel_freq ; ++i) {
|
for (i = 0 ; params[i].pixel_freq ; ++i) {
|
||||||
DRM_DEBUG_DRIVER("i = %d pixel_freq = %lluHz alt = %lluHz\n",
|
if (meson_vclk_freqs_are_matching_param(i, phy_freq, vclk_freq))
|
||||||
i, params[i].pixel_freq,
|
|
||||||
PIXEL_FREQ_1000_1001(params[i].pixel_freq));
|
|
||||||
DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n",
|
|
||||||
i, params[i].phy_freq,
|
|
||||||
PHY_FREQ_1000_1001(params[i].phy_freq));
|
|
||||||
/* Match strict frequency */
|
|
||||||
if (phy_freq == params[i].phy_freq &&
|
|
||||||
vclk_freq == params[i].vclk_freq)
|
|
||||||
return MODE_OK;
|
|
||||||
/* Match 1000/1001 variant */
|
|
||||||
if (phy_freq == PHY_FREQ_1000_1001(params[i].phy_freq) &&
|
|
||||||
vclk_freq == PIXEL_FREQ_1000_1001(params[i].vclk_freq))
|
|
||||||
return MODE_OK;
|
return MODE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1075,10 +1090,8 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (freq = 0 ; params[freq].pixel_freq ; ++freq) {
|
for (freq = 0 ; params[freq].pixel_freq ; ++freq) {
|
||||||
if ((phy_freq == params[freq].phy_freq ||
|
if (meson_vclk_freqs_are_matching_param(freq, phy_freq,
|
||||||
phy_freq == PHY_FREQ_1000_1001(params[freq].phy_freq)) &&
|
vclk_freq)) {
|
||||||
(vclk_freq == params[freq].vclk_freq ||
|
|
||||||
vclk_freq == PIXEL_FREQ_1000_1001(params[freq].vclk_freq))) {
|
|
||||||
if (vclk_freq != params[freq].vclk_freq)
|
if (vclk_freq != params[freq].vclk_freq)
|
||||||
vic_alternate_clock = true;
|
vic_alternate_clock = true;
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ config DRM_ST7571_I2C
|
||||||
select DRM_GEM_SHMEM_HELPER
|
select DRM_GEM_SHMEM_HELPER
|
||||||
select DRM_KMS_HELPER
|
select DRM_KMS_HELPER
|
||||||
select REGMAP_I2C
|
select REGMAP_I2C
|
||||||
|
select VIDEOMODE_HELPERS
|
||||||
help
|
help
|
||||||
DRM driver for Sitronix ST7571 panels controlled over I2C.
|
DRM driver for Sitronix ST7571 panels controlled over I2C.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -560,12 +560,6 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = drm_connector_hdmi_audio_init(connector, dev->dev,
|
|
||||||
&vc4_hdmi_audio_funcs,
|
|
||||||
8, false, -1);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs);
|
drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -2291,6 +2285,12 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = drm_connector_hdmi_audio_init(&vc4_hdmi->connector, dev,
|
||||||
|
&vc4_hdmi_audio_funcs, 8, false,
|
||||||
|
-1);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
dai_link->cpus = &vc4_hdmi->audio.cpu;
|
dai_link->cpus = &vc4_hdmi->audio.cpu;
|
||||||
dai_link->codecs = &vc4_hdmi->audio.codec;
|
dai_link->codecs = &vc4_hdmi->audio.codec;
|
||||||
dai_link->platforms = &vc4_hdmi->audio.platform;
|
dai_link->platforms = &vc4_hdmi->audio.platform;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue