Commit 1364af9c authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-misc-fixes-2025-06-12' of...

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: default avatarDave 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
parents a24823d1 afe38284
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -126,8 +126,8 @@ struct psp_device *aie2m_psp_create(struct drm_device *ddev, struct psp_config *
	psp->ddev = ddev;
	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_buffer = drmm_kmalloc(ddev, psp->fw_buf_sz, GFP_KERNEL);
	psp->fw_buf_sz = ALIGN(conf->fw_size, PSP_FW_ALIGN);
	psp->fw_buffer = drmm_kmalloc(ddev, psp->fw_buf_sz + PSP_FW_ALIGN, GFP_KERNEL);
	if (!psp->fw_buffer) {
		drm_err(ddev, "no memory for fw buffer");
		return NULL;
+1 −1
Original line number Diff line number Diff line
@@ -1118,7 +1118,7 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
		 * Catch exporters making buffers inaccessible even when
		 * attachments preventing that exist.
		 */
		WARN_ON_ONCE(ret == EBUSY);
		WARN_ON_ONCE(ret == -EBUSY);
		if (ret)
			return ERR_PTR(ret);
	}
+2 −3
Original line number Diff line number Diff line
@@ -264,8 +264,7 @@ static int begin_cpu_udmabuf(struct dma_buf *buf,
			ubuf->sg = NULL;
		}
	} else {
		dma_sync_sg_for_cpu(dev, ubuf->sg->sgl, ubuf->sg->nents,
				    direction);
		dma_sync_sgtable_for_cpu(dev, ubuf->sg, direction);
	}

	return ret;
@@ -280,7 +279,7 @@ static int end_cpu_udmabuf(struct dma_buf *buf,
	if (!ubuf->sg)
		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;
}

+1 −1
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ static void meson_encoder_hdmi_set_vclk(struct meson_encoder_hdmi *encoder_hdmi,
		venc_freq /= 2;

	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,
		priv->venc.hdmi_use_enci);

+34 −21
Original line number Diff line number Diff line
@@ -110,10 +110,7 @@
#define HDMI_PLL_LOCK		BIT(31)
#define HDMI_PLL_LOCK_G12A	(3 << 30)

#define PIXEL_FREQ_1000_1001(_freq)	\
	DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL)
#define PHY_FREQ_1000_1001(_freq)	\
	(PIXEL_FREQ_1000_1001(DIV_ROUND_DOWN_ULL(_freq, 10ULL)) * 10)
#define FREQ_1000_1001(_freq)	DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL)

/* VID PLL Dividers */
enum {
@@ -772,6 +769,36 @@ static void meson_hdmi_pll_generic_set(struct meson_drm *priv,
		  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
meson_vclk_vic_supported_freq(struct meson_drm *priv,
			      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) {
		DRM_DEBUG_DRIVER("i = %d pixel_freq = %lluHz alt = %lluHz\n",
				 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))
		if (meson_vclk_freqs_are_matching_param(i, phy_freq, vclk_freq))
			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) {
		if ((phy_freq == params[freq].phy_freq ||
		     phy_freq == PHY_FREQ_1000_1001(params[freq].phy_freq)) &&
		    (vclk_freq == params[freq].vclk_freq ||
		     vclk_freq == PIXEL_FREQ_1000_1001(params[freq].vclk_freq))) {
		if (meson_vclk_freqs_are_matching_param(freq, phy_freq,
							vclk_freq)) {
			if (vclk_freq != params[freq].vclk_freq)
				vic_alternate_clock = true;
			else
Loading