Merge tag 'drm-fixes-2025-04-26' of https://gitlab.freedesktop.org/drm/kernel

Pull drm fixes from Dave Airlie:
"Weekly drm fixes, mostly amdgpu, with some exynos cleanups and a
couple of minor fixes, seems a bit quiet, but probably some lag from
Easter holidays.

amdgpu:
- P2P DMA fixes
- Display reset fixes
- DCN 3.5 fixes
- ACPI EDID fix
- LTTPR fix
- mode_valid() fix

exynos:
- fix spelling error
- remove redundant error handling in exynos_drm_vidi.c module
- marks struct decon_data as const in the exynos7_drm_decon driver
since it is only read
- Remove unnecessary checking in exynos_drm_drv.c module

meson:
- Fix VCLK calculation

panel:
- jd9365a: Fix reset polarity"

* tag 'drm-fixes-2025-04-26' of https://gitlab.freedesktop.org/drm/kernel:
drm/exynos: Fix spelling mistake "enqueu" -> "enqueue"
drm/exynos: exynos7_drm_decon: Consstify struct decon_data
drm/exynos: fixed a spelling error
drm/exynos/vidi: Remove redundant error handling in vidi_get_modes()
drm/exynos: Remove unnecessary checking
drm/amd/display: do not copy invalid CRTC timing info
drm/amd/display: Default IPS to RCG_IN_ACTIVE_IPS2_IN_OFF
drm/amd/display: Use 16ms AUX read interval for LTTPR with old sinks
drm/amd/display: Fix ACPI edid parsing on some Lenovo systems
drm/amdgpu: Allow P2P access through XGMI
drm/amd/display: Enable urgent latency adjustment on DCN35
drm/amd/display: Force full update in gpu reset
drm/amd/display: Fix gpu reset in multidisplay config
drm/amdgpu: Don't pin VRAM without DMABUF_MOVE_NOTIFY
drm/amdgpu: Use allowed_domains for pinning dmabufs
drm: panel: jd9365da: fix reset signal polarity in unprepare
drm/meson: use unsigned long long / Hz for frequency types
Revert "drm/meson: vclk: fix calculation of 59.94 fractional rates"

+229 -183
+45 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
··· 43 43 #include <linux/dma-fence-array.h> 44 44 #include <linux/pci-p2pdma.h> 45 45 46 + static const struct dma_buf_attach_ops amdgpu_dma_buf_attach_ops; 47 + 48 + /** 49 + * dma_buf_attach_adev - Helper to get adev of an attachment 50 + * 51 + * @attach: attachment 52 + * 53 + * Returns: 54 + * A struct amdgpu_device * if the attaching device is an amdgpu device or 55 + * partition, NULL otherwise. 56 + */ 57 + static struct amdgpu_device *dma_buf_attach_adev(struct dma_buf_attachment *attach) 58 + { 59 + if (attach->importer_ops == &amdgpu_dma_buf_attach_ops) { 60 + struct drm_gem_object *obj = attach->importer_priv; 61 + struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 62 + 63 + return amdgpu_ttm_adev(bo->tbo.bdev); 64 + } 65 + 66 + return NULL; 67 + } 68 + 46 69 /** 47 70 * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation 48 71 * ··· 77 54 static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, 78 55 struct dma_buf_attachment *attach) 79 56 { 57 + struct amdgpu_device *attach_adev = dma_buf_attach_adev(attach); 80 58 struct drm_gem_object *obj = dmabuf->priv; 81 59 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 82 60 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 83 61 84 - if (pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) 62 + if (!amdgpu_dmabuf_is_xgmi_accessible(attach_adev, bo) && 63 + pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0) 85 64 attach->peer2peer = false; 86 65 87 66 amdgpu_vm_bo_update_shared(bo); ··· 102 77 { 103 78 struct dma_buf *dmabuf = attach->dmabuf; 104 79 struct amdgpu_bo *bo = gem_to_amdgpu_bo(dmabuf->priv); 105 - u32 domains = bo->preferred_domains; 80 + u32 domains = bo->allowed_domains; 106 81 107 82 dma_resv_assert_held(dmabuf->resv); 108 83 109 - /* 110 - * Try pinning into VRAM to allow P2P with RDMA NICs without ODP 84 + /* Try pinning into VRAM to allow P2P with RDMA NICs without ODP 111 85 * support if all attachments can do P2P. If any attachment can't do 112 86 * P2P just pin into GTT instead. 87 + * 88 + * To avoid with conflicting pinnings between GPUs and RDMA when move 89 + * notifiers are disabled, only allow pinning in VRAM when move 90 + * notiers are enabled. 113 91 */ 114 - list_for_each_entry(attach, &dmabuf->attachments, node) 115 - if (!attach->peer2peer) 116 - domains &= ~AMDGPU_GEM_DOMAIN_VRAM; 92 + if (!IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY)) { 93 + domains &= ~AMDGPU_GEM_DOMAIN_VRAM; 94 + } else { 95 + list_for_each_entry(attach, &dmabuf->attachments, node) 96 + if (!attach->peer2peer) 97 + domains &= ~AMDGPU_GEM_DOMAIN_VRAM; 98 + } 117 99 118 100 if (domains & AMDGPU_GEM_DOMAIN_VRAM) 119 101 bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; 102 + 103 + if (WARN_ON(!domains)) 104 + return -EINVAL; 120 105 121 106 return amdgpu_bo_pin(bo, domains); 122 107 } ··· 504 469 { 505 470 struct drm_gem_object *obj = &bo->tbo.base; 506 471 struct drm_gem_object *gobj; 472 + 473 + if (!adev) 474 + return false; 507 475 508 476 if (obj->import_attach) { 509 477 struct dma_buf *dma_buf = obj->import_attach->dmabuf;
+12 -29
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 1920 1920 switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) { 1921 1921 case IP_VERSION(3, 5, 0): 1922 1922 case IP_VERSION(3, 6, 0): 1923 - /* 1924 - * On DCN35 systems with Z8 enabled, it's possible for IPS2 + Z8 to 1925 - * cause a hard hang. A fix exists for newer PMFW. 1926 - * 1927 - * As a workaround, for non-fixed PMFW, force IPS1+RCG as the deepest 1928 - * IPS state in all cases, except for s0ix and all displays off (DPMS), 1929 - * where IPS2 is allowed. 1930 - * 1931 - * When checking pmfw version, use the major and minor only. 1932 - */ 1933 - if ((adev->pm.fw_version & 0x00FFFF00) < 0x005D6300) 1934 - ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1935 - else if (amdgpu_ip_version(adev, GC_HWIP, 0) > IP_VERSION(11, 5, 0)) 1936 - /* 1937 - * Other ASICs with DCN35 that have residency issues with 1938 - * IPS2 in idle. 1939 - * We want them to use IPS2 only in display off cases. 1940 - */ 1941 - ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1942 - break; 1943 1923 case IP_VERSION(3, 5, 1): 1944 1924 ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF; 1945 1925 break; ··· 3335 3355 for (k = 0; k < dc_state->stream_count; k++) { 3336 3356 bundle->stream_update.stream = dc_state->streams[k]; 3337 3357 3338 - for (m = 0; m < dc_state->stream_status->plane_count; m++) { 3358 + for (m = 0; m < dc_state->stream_status[k].plane_count; m++) { 3339 3359 bundle->surface_updates[m].surface = 3340 - dc_state->stream_status->plane_states[m]; 3360 + dc_state->stream_status[k].plane_states[m]; 3341 3361 bundle->surface_updates[m].surface->force_full_update = 3342 3362 true; 3343 3363 } 3344 3364 3345 3365 update_planes_and_stream_adapter(dm->dc, 3346 3366 UPDATE_TYPE_FULL, 3347 - dc_state->stream_status->plane_count, 3367 + dc_state->stream_status[k].plane_count, 3348 3368 dc_state->streams[k], 3349 3369 &bundle->stream_update, 3350 3370 bundle->surface_updates); ··· 6501 6521 const struct drm_display_mode *native_mode, 6502 6522 bool scale_enabled) 6503 6523 { 6504 - if (scale_enabled) { 6505 - copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode); 6506 - } else if (native_mode->clock == drm_mode->clock && 6507 - native_mode->htotal == drm_mode->htotal && 6508 - native_mode->vtotal == drm_mode->vtotal) { 6509 - copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode); 6524 + if (scale_enabled || ( 6525 + native_mode->clock == drm_mode->clock && 6526 + native_mode->htotal == drm_mode->htotal && 6527 + native_mode->vtotal == drm_mode->vtotal)) { 6528 + if (native_mode->crtc_clock) 6529 + copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode); 6510 6530 } else { 6511 6531 /* no scaling nor amdgpu inserted, no need to patch */ 6512 6532 } ··· 11021 11041 */ 11022 11042 if (amdgpu_ip_version(adev, DCE_HWIP, 0) < IP_VERSION(3, 2, 0) && 11023 11043 state->allow_modeset) 11044 + return true; 11045 + 11046 + if (amdgpu_in_reset(adev) && state->allow_modeset) 11024 11047 return true; 11025 11048 11026 11049 /* Exit early if we know that we're adding or removing the plane. */
+1 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
··· 918 918 { 919 919 struct drm_connector *connector = data; 920 920 struct acpi_device *acpidev = ACPI_COMPANION(connector->dev->dev); 921 - unsigned char start = block * EDID_LENGTH; 921 + unsigned short start = block * EDID_LENGTH; 922 922 struct edid *edid; 923 923 int r; 924 924
+2 -2
drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c
··· 195 195 .dcn_downspread_percent = 0.5, 196 196 .gpuvm_min_page_size_bytes = 4096, 197 197 .hostvm_min_page_size_bytes = 4096, 198 - .do_urgent_latency_adjustment = 0, 198 + .do_urgent_latency_adjustment = 1, 199 199 .urgent_latency_adjustment_fabric_clock_component_us = 0, 200 - .urgent_latency_adjustment_fabric_clock_reference_mhz = 0, 200 + .urgent_latency_adjustment_fabric_clock_reference_mhz = 3000, 201 201 }; 202 202 203 203 void dcn35_build_wm_range_table_fpu(struct clk_mgr *clk_mgr)
+2 -2
drivers/gpu/drm/exynos/exynos7_drm_decon.c
··· 43 43 unsigned int wincon_burstlen_shift; 44 44 }; 45 45 46 - static struct decon_data exynos7_decon_data = { 46 + static const struct decon_data exynos7_decon_data = { 47 47 .vidw_buf_start_base = 0x80, 48 48 .shadowcon_win_protect_shift = 10, 49 49 .wincon_burstlen_shift = 11, 50 50 }; 51 51 52 - static struct decon_data exynos7870_decon_data = { 52 + static const struct decon_data exynos7870_decon_data = { 53 53 .vidw_buf_start_base = 0x880, 54 54 .shadowcon_win_protect_shift = 8, 55 55 .wincon_burstlen_shift = 10,
+1 -2
drivers/gpu/drm/exynos/exynos_drm_drv.c
··· 355 355 { 356 356 struct drm_device *drm = platform_get_drvdata(pdev); 357 357 358 - if (drm) 359 - drm_atomic_helper_shutdown(drm); 358 + drm_atomic_helper_shutdown(drm); 360 359 } 361 360 362 361 static struct platform_driver exynos_drm_platform_driver = {
+1 -1
drivers/gpu/drm/exynos/exynos_drm_fimc.c
··· 908 908 u32 buf_num; 909 909 u32 cfg; 910 910 911 - DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]enqueu[%d]\n", buf_id, enqueue); 911 + DRM_DEV_DEBUG_KMS(ctx->dev, "buf_id[%d]enqueue[%d]\n", buf_id, enqueue); 912 912 913 913 spin_lock_irqsave(&ctx->lock, flags); 914 914
+1 -1
drivers/gpu/drm/exynos/exynos_drm_fimd.c
··· 731 731 /* 732 732 * Setting dma-burst to 16Word causes permanent tearing for very small 733 733 * buffers, e.g. cursor buffer. Burst Mode switching which based on 734 - * plane size is not recommended as plane size varies alot towards the 734 + * plane size is not recommended as plane size varies a lot towards the 735 735 * end of the screen and rapid movement causes unstable DMA, but it is 736 736 * still better to change dma-burst than displaying garbage. 737 737 */
-3
drivers/gpu/drm/exynos/exynos_drm_vidi.c
··· 312 312 else 313 313 drm_edid = drm_edid_alloc(fake_edid_info, sizeof(fake_edid_info)); 314 314 315 - if (!drm_edid) 316 - return 0; 317 - 318 315 drm_edid_connector_update(connector, drm_edid); 319 316 320 317 count = drm_edid_connector_add_modes(connector);
+1 -1
drivers/gpu/drm/meson/meson_drv.c
··· 169 169 /* S805X/S805Y HDMI PLL won't lock for HDMI PHY freq > 1,65GHz */ 170 170 { 171 171 .limits = { 172 - .max_hdmi_phy_freq = 1650000, 172 + .max_hdmi_phy_freq = 1650000000, 173 173 }, 174 174 .attrs = (const struct soc_device_attribute []) { 175 175 { .soc_id = "GXL (S805*)", },
+1 -1
drivers/gpu/drm/meson/meson_drv.h
··· 37 37 }; 38 38 39 39 struct meson_drm_soc_limits { 40 - unsigned int max_hdmi_phy_freq; 40 + unsigned long long max_hdmi_phy_freq; 41 41 }; 42 42 43 43 struct meson_drm {
+16 -13
drivers/gpu/drm/meson/meson_encoder_hdmi.c
··· 70 70 { 71 71 struct meson_drm *priv = encoder_hdmi->priv; 72 72 int vic = drm_match_cea_mode(mode); 73 - unsigned int phy_freq; 74 - unsigned int vclk_freq; 75 - unsigned int venc_freq; 76 - unsigned int hdmi_freq; 73 + unsigned long long phy_freq; 74 + unsigned long long vclk_freq; 75 + unsigned long long venc_freq; 76 + unsigned long long hdmi_freq; 77 77 78 - vclk_freq = mode->clock; 78 + vclk_freq = mode->clock * 1000; 79 79 80 80 /* For 420, pixel clock is half unlike venc clock */ 81 81 if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) ··· 107 107 if (mode->flags & DRM_MODE_FLAG_DBLCLK) 108 108 venc_freq /= 2; 109 109 110 - dev_dbg(priv->dev, "vclk:%d phy=%d venc=%d hdmi=%d enci=%d\n", 110 + dev_dbg(priv->dev, 111 + "vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz enci=%d\n", 111 112 phy_freq, vclk_freq, venc_freq, hdmi_freq, 112 113 priv->venc.hdmi_use_enci); 113 114 ··· 123 122 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); 124 123 struct meson_drm *priv = encoder_hdmi->priv; 125 124 bool is_hdmi2_sink = display_info->hdmi.scdc.supported; 126 - unsigned int phy_freq; 127 - unsigned int vclk_freq; 128 - unsigned int venc_freq; 129 - unsigned int hdmi_freq; 125 + unsigned long long clock = mode->clock * 1000; 126 + unsigned long long phy_freq; 127 + unsigned long long vclk_freq; 128 + unsigned long long venc_freq; 129 + unsigned long long hdmi_freq; 130 130 int vic = drm_match_cea_mode(mode); 131 131 enum drm_mode_status status; 132 132 ··· 146 144 if (status != MODE_OK) 147 145 return status; 148 146 149 - return meson_vclk_dmt_supported_freq(priv, mode->clock); 147 + return meson_vclk_dmt_supported_freq(priv, clock); 150 148 /* Check against supported VIC modes */ 151 149 } else if (!meson_venc_hdmi_supported_vic(vic)) 152 150 return MODE_BAD; 153 151 154 - vclk_freq = mode->clock; 152 + vclk_freq = clock; 155 153 156 154 /* For 420, pixel clock is half unlike venc clock */ 157 155 if (drm_mode_is_420_only(display_info, mode) || ··· 181 179 if (mode->flags & DRM_MODE_FLAG_DBLCLK) 182 180 venc_freq /= 2; 183 181 184 - dev_dbg(priv->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n", 182 + dev_dbg(priv->dev, 183 + "%s: vclk:%lluHz phy=%lluHz venc=%lluHz hdmi=%lluHz\n", 185 184 __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq); 186 185 187 186 return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq);
+101 -94
drivers/gpu/drm/meson/meson_vclk.c
··· 110 110 #define HDMI_PLL_LOCK BIT(31) 111 111 #define HDMI_PLL_LOCK_G12A (3 << 30) 112 112 113 - #define FREQ_1000_1001(_freq) DIV_ROUND_CLOSEST(_freq * 1000, 1001) 113 + #define PIXEL_FREQ_1000_1001(_freq) \ 114 + DIV_ROUND_CLOSEST_ULL((_freq) * 1000ULL, 1001ULL) 115 + #define PHY_FREQ_1000_1001(_freq) \ 116 + (PIXEL_FREQ_1000_1001(DIV_ROUND_DOWN_ULL(_freq, 10ULL)) * 10) 114 117 115 118 /* VID PLL Dividers */ 116 119 enum { ··· 363 360 }; 364 361 365 362 struct meson_vclk_params { 366 - unsigned int pll_freq; 367 - unsigned int phy_freq; 368 - unsigned int vclk_freq; 369 - unsigned int venc_freq; 370 - unsigned int pixel_freq; 363 + unsigned long long pll_freq; 364 + unsigned long long phy_freq; 365 + unsigned long long vclk_freq; 366 + unsigned long long venc_freq; 367 + unsigned long long pixel_freq; 371 368 unsigned int pll_od1; 372 369 unsigned int pll_od2; 373 370 unsigned int pll_od3; ··· 375 372 unsigned int vclk_div; 376 373 } params[] = { 377 374 [MESON_VCLK_HDMI_ENCI_54000] = { 378 - .pll_freq = 4320000, 379 - .phy_freq = 270000, 380 - .vclk_freq = 54000, 381 - .venc_freq = 54000, 382 - .pixel_freq = 54000, 375 + .pll_freq = 4320000000, 376 + .phy_freq = 270000000, 377 + .vclk_freq = 54000000, 378 + .venc_freq = 54000000, 379 + .pixel_freq = 54000000, 383 380 .pll_od1 = 4, 384 381 .pll_od2 = 4, 385 382 .pll_od3 = 1, ··· 387 384 .vclk_div = 1, 388 385 }, 389 386 [MESON_VCLK_HDMI_DDR_54000] = { 390 - .pll_freq = 4320000, 391 - .phy_freq = 270000, 392 - .vclk_freq = 54000, 393 - .venc_freq = 54000, 394 - .pixel_freq = 27000, 387 + .pll_freq = 4320000000, 388 + .phy_freq = 270000000, 389 + .vclk_freq = 54000000, 390 + .venc_freq = 54000000, 391 + .pixel_freq = 27000000, 395 392 .pll_od1 = 4, 396 393 .pll_od2 = 4, 397 394 .pll_od3 = 1, ··· 399 396 .vclk_div = 1, 400 397 }, 401 398 [MESON_VCLK_HDMI_DDR_148500] = { 402 - .pll_freq = 2970000, 403 - .phy_freq = 742500, 404 - .vclk_freq = 148500, 405 - .venc_freq = 148500, 406 - .pixel_freq = 74250, 399 + .pll_freq = 2970000000, 400 + .phy_freq = 742500000, 401 + .vclk_freq = 148500000, 402 + .venc_freq = 148500000, 403 + .pixel_freq = 74250000, 407 404 .pll_od1 = 4, 408 405 .pll_od2 = 1, 409 406 .pll_od3 = 1, ··· 411 408 .vclk_div = 1, 412 409 }, 413 410 [MESON_VCLK_HDMI_74250] = { 414 - .pll_freq = 2970000, 415 - .phy_freq = 742500, 416 - .vclk_freq = 74250, 417 - .venc_freq = 74250, 418 - .pixel_freq = 74250, 411 + .pll_freq = 2970000000, 412 + .phy_freq = 742500000, 413 + .vclk_freq = 74250000, 414 + .venc_freq = 74250000, 415 + .pixel_freq = 74250000, 419 416 .pll_od1 = 2, 420 417 .pll_od2 = 2, 421 418 .pll_od3 = 2, ··· 423 420 .vclk_div = 1, 424 421 }, 425 422 [MESON_VCLK_HDMI_148500] = { 426 - .pll_freq = 2970000, 427 - .phy_freq = 1485000, 428 - .vclk_freq = 148500, 429 - .venc_freq = 148500, 430 - .pixel_freq = 148500, 423 + .pll_freq = 2970000000, 424 + .phy_freq = 1485000000, 425 + .vclk_freq = 148500000, 426 + .venc_freq = 148500000, 427 + .pixel_freq = 148500000, 431 428 .pll_od1 = 1, 432 429 .pll_od2 = 2, 433 430 .pll_od3 = 2, ··· 435 432 .vclk_div = 1, 436 433 }, 437 434 [MESON_VCLK_HDMI_297000] = { 438 - .pll_freq = 5940000, 439 - .phy_freq = 2970000, 440 - .venc_freq = 297000, 441 - .vclk_freq = 297000, 442 - .pixel_freq = 297000, 435 + .pll_freq = 5940000000, 436 + .phy_freq = 2970000000, 437 + .venc_freq = 297000000, 438 + .vclk_freq = 297000000, 439 + .pixel_freq = 297000000, 443 440 .pll_od1 = 2, 444 441 .pll_od2 = 1, 445 442 .pll_od3 = 1, ··· 447 444 .vclk_div = 2, 448 445 }, 449 446 [MESON_VCLK_HDMI_594000] = { 450 - .pll_freq = 5940000, 451 - .phy_freq = 5940000, 452 - .venc_freq = 594000, 453 - .vclk_freq = 594000, 454 - .pixel_freq = 594000, 447 + .pll_freq = 5940000000, 448 + .phy_freq = 5940000000, 449 + .venc_freq = 594000000, 450 + .vclk_freq = 594000000, 451 + .pixel_freq = 594000000, 455 452 .pll_od1 = 1, 456 453 .pll_od2 = 1, 457 454 .pll_od3 = 2, ··· 459 456 .vclk_div = 1, 460 457 }, 461 458 [MESON_VCLK_HDMI_594000_YUV420] = { 462 - .pll_freq = 5940000, 463 - .phy_freq = 2970000, 464 - .venc_freq = 594000, 465 - .vclk_freq = 594000, 466 - .pixel_freq = 297000, 459 + .pll_freq = 5940000000, 460 + .phy_freq = 2970000000, 461 + .venc_freq = 594000000, 462 + .vclk_freq = 594000000, 463 + .pixel_freq = 297000000, 467 464 .pll_od1 = 2, 468 465 .pll_od2 = 1, 469 466 .pll_od3 = 1, ··· 620 617 3 << 20, pll_od_to_reg(od3) << 20); 621 618 } 622 619 623 - #define XTAL_FREQ 24000 620 + #define XTAL_FREQ (24 * 1000 * 1000) 624 621 625 622 static unsigned int meson_hdmi_pll_get_m(struct meson_drm *priv, 626 - unsigned int pll_freq) 623 + unsigned long long pll_freq) 627 624 { 628 625 /* The GXBB PLL has a /2 pre-multiplier */ 629 626 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) 630 - pll_freq /= 2; 627 + pll_freq = DIV_ROUND_DOWN_ULL(pll_freq, 2); 631 628 632 - return pll_freq / XTAL_FREQ; 629 + return DIV_ROUND_DOWN_ULL(pll_freq, XTAL_FREQ); 633 630 } 634 631 635 632 #define HDMI_FRAC_MAX_GXBB 4096 ··· 638 635 639 636 static unsigned int meson_hdmi_pll_get_frac(struct meson_drm *priv, 640 637 unsigned int m, 641 - unsigned int pll_freq) 638 + unsigned long long pll_freq) 642 639 { 643 - unsigned int parent_freq = XTAL_FREQ; 640 + unsigned long long parent_freq = XTAL_FREQ; 644 641 unsigned int frac_max = HDMI_FRAC_MAX_GXL; 645 642 unsigned int frac_m; 646 643 unsigned int frac; 644 + u32 remainder; 647 645 648 646 /* The GXBB PLL has a /2 pre-multiplier and a larger FRAC width */ 649 647 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { ··· 656 652 frac_max = HDMI_FRAC_MAX_G12A; 657 653 658 654 /* We can have a perfect match !*/ 659 - if (pll_freq / m == parent_freq && 660 - pll_freq % m == 0) 655 + if (div_u64_rem(pll_freq, m, &remainder) == parent_freq && 656 + remainder == 0) 661 657 return 0; 662 658 663 - frac = div_u64((u64)pll_freq * (u64)frac_max, parent_freq); 659 + frac = mul_u64_u64_div_u64(pll_freq, frac_max, parent_freq); 664 660 frac_m = m * frac_max; 665 661 if (frac_m > frac) 666 662 return frac_max; ··· 670 666 } 671 667 672 668 static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, 673 - unsigned int m, 669 + unsigned long long m, 674 670 unsigned int frac) 675 671 { 676 672 if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { ··· 698 694 } 699 695 700 696 static bool meson_hdmi_pll_find_params(struct meson_drm *priv, 701 - unsigned int freq, 697 + unsigned long long freq, 702 698 unsigned int *m, 703 699 unsigned int *frac, 704 700 unsigned int *od) ··· 710 706 continue; 711 707 *frac = meson_hdmi_pll_get_frac(priv, *m, freq * *od); 712 708 713 - DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d\n", 709 + DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d\n", 714 710 freq, *m, *frac, *od); 715 711 716 712 if (meson_hdmi_pll_validate_params(priv, *m, *frac)) ··· 722 718 723 719 /* pll_freq is the frequency after the OD dividers */ 724 720 enum drm_mode_status 725 - meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq) 721 + meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq) 726 722 { 727 723 unsigned int od, m, frac; 728 724 ··· 745 741 746 742 /* pll_freq is the frequency after the OD dividers */ 747 743 static void meson_hdmi_pll_generic_set(struct meson_drm *priv, 748 - unsigned int pll_freq) 744 + unsigned long long pll_freq) 749 745 { 750 746 unsigned int od, m, frac, od1, od2, od3; 751 747 ··· 760 756 od1 = od / od2; 761 757 } 762 758 763 - DRM_DEBUG_DRIVER("PLL params for %dkHz: m=%x frac=%x od=%d/%d/%d\n", 759 + DRM_DEBUG_DRIVER("PLL params for %lluHz: m=%x frac=%x od=%d/%d/%d\n", 764 760 pll_freq, m, frac, od1, od2, od3); 765 761 766 762 meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); ··· 768 764 return; 769 765 } 770 766 771 - DRM_ERROR("Fatal, unable to find parameters for PLL freq %d\n", 767 + DRM_ERROR("Fatal, unable to find parameters for PLL freq %lluHz\n", 772 768 pll_freq); 773 769 } 774 770 775 771 enum drm_mode_status 776 - meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, 777 - unsigned int vclk_freq) 772 + meson_vclk_vic_supported_freq(struct meson_drm *priv, 773 + unsigned long long phy_freq, 774 + unsigned long long vclk_freq) 778 775 { 779 776 int i; 780 777 781 - DRM_DEBUG_DRIVER("phy_freq = %d vclk_freq = %d\n", 778 + DRM_DEBUG_DRIVER("phy_freq = %lluHz vclk_freq = %lluHz\n", 782 779 phy_freq, vclk_freq); 783 780 784 781 /* Check against soc revision/package limits */ ··· 790 785 } 791 786 792 787 for (i = 0 ; params[i].pixel_freq ; ++i) { 793 - DRM_DEBUG_DRIVER("i = %d pixel_freq = %d alt = %d\n", 788 + DRM_DEBUG_DRIVER("i = %d pixel_freq = %lluHz alt = %lluHz\n", 794 789 i, params[i].pixel_freq, 795 - FREQ_1000_1001(params[i].pixel_freq)); 796 - DRM_DEBUG_DRIVER("i = %d phy_freq = %d alt = %d\n", 790 + PIXEL_FREQ_1000_1001(params[i].pixel_freq)); 791 + DRM_DEBUG_DRIVER("i = %d phy_freq = %lluHz alt = %lluHz\n", 797 792 i, params[i].phy_freq, 798 - FREQ_1000_1001(params[i].phy_freq/1000)*1000); 793 + PHY_FREQ_1000_1001(params[i].phy_freq)); 799 794 /* Match strict frequency */ 800 795 if (phy_freq == params[i].phy_freq && 801 796 vclk_freq == params[i].vclk_freq) 802 797 return MODE_OK; 803 798 /* Match 1000/1001 variant */ 804 - if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/1000)*1000) && 805 - vclk_freq == FREQ_1000_1001(params[i].vclk_freq)) 799 + if (phy_freq == PHY_FREQ_1000_1001(params[i].phy_freq) && 800 + vclk_freq == PIXEL_FREQ_1000_1001(params[i].vclk_freq)) 806 801 return MODE_OK; 807 802 } 808 803 ··· 810 805 } 811 806 EXPORT_SYMBOL_GPL(meson_vclk_vic_supported_freq); 812 807 813 - static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq, 814 - unsigned int od1, unsigned int od2, unsigned int od3, 808 + static void meson_vclk_set(struct meson_drm *priv, 809 + unsigned long long pll_base_freq, unsigned int od1, 810 + unsigned int od2, unsigned int od3, 815 811 unsigned int vid_pll_div, unsigned int vclk_div, 816 812 unsigned int hdmi_tx_div, unsigned int venc_div, 817 813 bool hdmi_use_enci, bool vic_alternate_clock) ··· 832 826 meson_hdmi_pll_generic_set(priv, pll_base_freq); 833 827 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXBB)) { 834 828 switch (pll_base_freq) { 835 - case 2970000: 829 + case 2970000000: 836 830 m = 0x3d; 837 831 frac = vic_alternate_clock ? 0xd02 : 0xe00; 838 832 break; 839 - case 4320000: 833 + case 4320000000: 840 834 m = vic_alternate_clock ? 0x59 : 0x5a; 841 835 frac = vic_alternate_clock ? 0xe8f : 0; 842 836 break; 843 - case 5940000: 837 + case 5940000000: 844 838 m = 0x7b; 845 839 frac = vic_alternate_clock ? 0xa05 : 0xc00; 846 840 break; ··· 850 844 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXM) || 851 845 meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL)) { 852 846 switch (pll_base_freq) { 853 - case 2970000: 847 + case 2970000000: 854 848 m = 0x7b; 855 849 frac = vic_alternate_clock ? 0x281 : 0x300; 856 850 break; 857 - case 4320000: 851 + case 4320000000: 858 852 m = vic_alternate_clock ? 0xb3 : 0xb4; 859 853 frac = vic_alternate_clock ? 0x347 : 0; 860 854 break; 861 - case 5940000: 855 + case 5940000000: 862 856 m = 0xf7; 863 857 frac = vic_alternate_clock ? 0x102 : 0x200; 864 858 break; ··· 867 861 meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3); 868 862 } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { 869 863 switch (pll_base_freq) { 870 - case 2970000: 864 + case 2970000000: 871 865 m = 0x7b; 872 866 frac = vic_alternate_clock ? 0x140b4 : 0x18000; 873 867 break; 874 - case 4320000: 868 + case 4320000000: 875 869 m = vic_alternate_clock ? 0xb3 : 0xb4; 876 870 frac = vic_alternate_clock ? 0x1a3ee : 0; 877 871 break; 878 - case 5940000: 872 + case 5940000000: 879 873 m = 0xf7; 880 874 frac = vic_alternate_clock ? 0x8148 : 0x10000; 881 875 break; ··· 1031 1025 } 1032 1026 1033 1027 void meson_vclk_setup(struct meson_drm *priv, unsigned int target, 1034 - unsigned int phy_freq, unsigned int vclk_freq, 1035 - unsigned int venc_freq, unsigned int dac_freq, 1028 + unsigned long long phy_freq, unsigned long long vclk_freq, 1029 + unsigned long long venc_freq, unsigned long long dac_freq, 1036 1030 bool hdmi_use_enci) 1037 1031 { 1038 1032 bool vic_alternate_clock = false; 1039 - unsigned int freq; 1040 - unsigned int hdmi_tx_div; 1041 - unsigned int venc_div; 1033 + unsigned long long freq; 1034 + unsigned long long hdmi_tx_div; 1035 + unsigned long long venc_div; 1042 1036 1043 1037 if (target == MESON_VCLK_TARGET_CVBS) { 1044 1038 meson_venci_cvbs_clock_config(priv); ··· 1058 1052 return; 1059 1053 } 1060 1054 1061 - hdmi_tx_div = vclk_freq / dac_freq; 1055 + hdmi_tx_div = DIV_ROUND_DOWN_ULL(vclk_freq, dac_freq); 1062 1056 1063 1057 if (hdmi_tx_div == 0) { 1064 - pr_err("Fatal Error, invalid HDMI-TX freq %d\n", 1058 + pr_err("Fatal Error, invalid HDMI-TX freq %lluHz\n", 1065 1059 dac_freq); 1066 1060 return; 1067 1061 } 1068 1062 1069 - venc_div = vclk_freq / venc_freq; 1063 + venc_div = DIV_ROUND_DOWN_ULL(vclk_freq, venc_freq); 1070 1064 1071 1065 if (venc_div == 0) { 1072 - pr_err("Fatal Error, invalid HDMI venc freq %d\n", 1066 + pr_err("Fatal Error, invalid HDMI venc freq %lluHz\n", 1073 1067 venc_freq); 1074 1068 return; 1075 1069 } 1076 1070 1077 1071 for (freq = 0 ; params[freq].pixel_freq ; ++freq) { 1078 1072 if ((phy_freq == params[freq].phy_freq || 1079 - phy_freq == FREQ_1000_1001(params[freq].phy_freq/1000)*1000) && 1073 + phy_freq == PHY_FREQ_1000_1001(params[freq].phy_freq)) && 1080 1074 (vclk_freq == params[freq].vclk_freq || 1081 - vclk_freq == FREQ_1000_1001(params[freq].vclk_freq))) { 1075 + vclk_freq == PIXEL_FREQ_1000_1001(params[freq].vclk_freq))) { 1082 1076 if (vclk_freq != params[freq].vclk_freq) 1083 1077 vic_alternate_clock = true; 1084 1078 else ··· 1104 1098 } 1105 1099 1106 1100 if (!params[freq].pixel_freq) { 1107 - pr_err("Fatal Error, invalid HDMI vclk freq %d\n", vclk_freq); 1101 + pr_err("Fatal Error, invalid HDMI vclk freq %lluHz\n", 1102 + vclk_freq); 1108 1103 return; 1109 1104 } 1110 1105
+7 -6
drivers/gpu/drm/meson/meson_vclk.h
··· 20 20 }; 21 21 22 22 /* 27MHz is the CVBS Pixel Clock */ 23 - #define MESON_VCLK_CVBS 27000 23 + #define MESON_VCLK_CVBS (27 * 1000 * 1000) 24 24 25 25 enum drm_mode_status 26 - meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned int freq); 26 + meson_vclk_dmt_supported_freq(struct meson_drm *priv, unsigned long long freq); 27 27 enum drm_mode_status 28 - meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq, 29 - unsigned int vclk_freq); 28 + meson_vclk_vic_supported_freq(struct meson_drm *priv, 29 + unsigned long long phy_freq, 30 + unsigned long long vclk_freq); 30 31 31 32 void meson_vclk_setup(struct meson_drm *priv, unsigned int target, 32 - unsigned int phy_freq, unsigned int vclk_freq, 33 - unsigned int venc_freq, unsigned int dac_freq, 33 + unsigned long long phy_freq, unsigned long long vclk_freq, 34 + unsigned long long venc_freq, unsigned long long dac_freq, 34 35 bool hdmi_use_enci); 35 36 36 37 #endif /* __MESON_VCLK_H */
+2 -2
drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
··· 129 129 { 130 130 struct jadard *jadard = panel_to_jadard(panel); 131 131 132 - gpiod_set_value(jadard->reset, 1); 132 + gpiod_set_value(jadard->reset, 0); 133 133 msleep(120); 134 134 135 135 if (jadard->desc->reset_before_power_off_vcioo) { 136 - gpiod_set_value(jadard->reset, 0); 136 + gpiod_set_value(jadard->reset, 1); 137 137 138 138 usleep_range(1000, 2000); 139 139 }