1*ba470a99SVille Syrjälä // SPDX-License-Identifier: MIT 2*ba470a99SVille Syrjälä /* 3*ba470a99SVille Syrjälä * Copyright © 2025 Intel Corporation 4*ba470a99SVille Syrjälä */ 5*ba470a99SVille Syrjälä 6*ba470a99SVille Syrjälä #include <linux/debugfs.h> 7*ba470a99SVille Syrjälä 8*ba470a99SVille Syrjälä #include <drm/drm_print.h> 9*ba470a99SVille Syrjälä 10*ba470a99SVille Syrjälä #include "intel_cdclk.h" 11*ba470a99SVille Syrjälä #include "intel_display_core.h" 12*ba470a99SVille Syrjälä #include "intel_display_types.h" 13*ba470a99SVille Syrjälä #include "intel_vblank.h" 14*ba470a99SVille Syrjälä #include "intel_vdsc.h" 15*ba470a99SVille Syrjälä #include "skl_prefill.h" 16*ba470a99SVille Syrjälä #include "skl_scaler.h" 17*ba470a99SVille Syrjälä #include "skl_watermark.h" 18*ba470a99SVille Syrjälä 19*ba470a99SVille Syrjälä static unsigned int prefill_usecs_to_lines(const struct intel_crtc_state *crtc_state, 20*ba470a99SVille Syrjälä unsigned int usecs) 21*ba470a99SVille Syrjälä { 22*ba470a99SVille Syrjälä const struct drm_display_mode *pipe_mode = &crtc_state->hw.pipe_mode; 23*ba470a99SVille Syrjälä 24*ba470a99SVille Syrjälä return DIV_ROUND_UP_ULL(mul_u32_u32(pipe_mode->crtc_clock, usecs << 16), 25*ba470a99SVille Syrjälä pipe_mode->crtc_htotal * 1000); 26*ba470a99SVille Syrjälä } 27*ba470a99SVille Syrjälä 28*ba470a99SVille Syrjälä static void prefill_init(struct skl_prefill_ctx *ctx, 29*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state) 30*ba470a99SVille Syrjälä { 31*ba470a99SVille Syrjälä memset(ctx, 0, sizeof(*ctx)); 32*ba470a99SVille Syrjälä 33*ba470a99SVille Syrjälä ctx->prefill.fixed = crtc_state->framestart_delay << 16; 34*ba470a99SVille Syrjälä 35*ba470a99SVille Syrjälä /* 20 usec for translation walks/etc. */ 36*ba470a99SVille Syrjälä ctx->prefill.fixed += prefill_usecs_to_lines(crtc_state, 20); 37*ba470a99SVille Syrjälä 38*ba470a99SVille Syrjälä ctx->prefill.dsc = intel_vdsc_prefill_lines(crtc_state); 39*ba470a99SVille Syrjälä } 40*ba470a99SVille Syrjälä 41*ba470a99SVille Syrjälä static void prefill_init_nocdclk_worst(struct skl_prefill_ctx *ctx, 42*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state) 43*ba470a99SVille Syrjälä { 44*ba470a99SVille Syrjälä prefill_init(ctx, crtc_state); 45*ba470a99SVille Syrjälä 46*ba470a99SVille Syrjälä ctx->prefill.wm0 = skl_wm0_prefill_lines_worst(crtc_state); 47*ba470a99SVille Syrjälä ctx->prefill.scaler_1st = skl_scaler_1st_prefill_lines_worst(crtc_state); 48*ba470a99SVille Syrjälä ctx->prefill.scaler_2nd = skl_scaler_2nd_prefill_lines_worst(crtc_state); 49*ba470a99SVille Syrjälä 50*ba470a99SVille Syrjälä ctx->adj.scaler_1st = skl_scaler_1st_prefill_adjustment_worst(crtc_state); 51*ba470a99SVille Syrjälä ctx->adj.scaler_2nd = skl_scaler_2nd_prefill_adjustment_worst(crtc_state); 52*ba470a99SVille Syrjälä } 53*ba470a99SVille Syrjälä 54*ba470a99SVille Syrjälä static void prefill_init_nocdclk(struct skl_prefill_ctx *ctx, 55*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state) 56*ba470a99SVille Syrjälä { 57*ba470a99SVille Syrjälä prefill_init(ctx, crtc_state); 58*ba470a99SVille Syrjälä 59*ba470a99SVille Syrjälä ctx->prefill.wm0 = skl_wm0_prefill_lines(crtc_state); 60*ba470a99SVille Syrjälä ctx->prefill.scaler_1st = skl_scaler_1st_prefill_lines(crtc_state); 61*ba470a99SVille Syrjälä ctx->prefill.scaler_2nd = skl_scaler_2nd_prefill_lines(crtc_state); 62*ba470a99SVille Syrjälä 63*ba470a99SVille Syrjälä ctx->adj.scaler_1st = skl_scaler_1st_prefill_adjustment(crtc_state); 64*ba470a99SVille Syrjälä ctx->adj.scaler_2nd = skl_scaler_2nd_prefill_adjustment(crtc_state); 65*ba470a99SVille Syrjälä } 66*ba470a99SVille Syrjälä 67*ba470a99SVille Syrjälä static unsigned int prefill_adjust(unsigned int value, unsigned int factor) 68*ba470a99SVille Syrjälä { 69*ba470a99SVille Syrjälä return DIV_ROUND_UP_ULL(mul_u32_u32(value, factor), 0x10000); 70*ba470a99SVille Syrjälä } 71*ba470a99SVille Syrjälä 72*ba470a99SVille Syrjälä static unsigned int prefill_lines_nocdclk(const struct skl_prefill_ctx *ctx) 73*ba470a99SVille Syrjälä { 74*ba470a99SVille Syrjälä unsigned int prefill = 0; 75*ba470a99SVille Syrjälä 76*ba470a99SVille Syrjälä prefill += ctx->prefill.dsc; 77*ba470a99SVille Syrjälä prefill = prefill_adjust(prefill, ctx->adj.scaler_2nd); 78*ba470a99SVille Syrjälä 79*ba470a99SVille Syrjälä prefill += ctx->prefill.scaler_2nd; 80*ba470a99SVille Syrjälä prefill = prefill_adjust(prefill, ctx->adj.scaler_1st); 81*ba470a99SVille Syrjälä 82*ba470a99SVille Syrjälä prefill += ctx->prefill.scaler_1st; 83*ba470a99SVille Syrjälä prefill += ctx->prefill.wm0; 84*ba470a99SVille Syrjälä 85*ba470a99SVille Syrjälä return prefill; 86*ba470a99SVille Syrjälä } 87*ba470a99SVille Syrjälä 88*ba470a99SVille Syrjälä static unsigned int prefill_lines_cdclk(const struct skl_prefill_ctx *ctx) 89*ba470a99SVille Syrjälä { 90*ba470a99SVille Syrjälä return prefill_adjust(prefill_lines_nocdclk(ctx), ctx->adj.cdclk); 91*ba470a99SVille Syrjälä } 92*ba470a99SVille Syrjälä 93*ba470a99SVille Syrjälä static unsigned int prefill_lines_full(const struct skl_prefill_ctx *ctx) 94*ba470a99SVille Syrjälä { 95*ba470a99SVille Syrjälä return ctx->prefill.fixed + prefill_lines_cdclk(ctx); 96*ba470a99SVille Syrjälä } 97*ba470a99SVille Syrjälä 98*ba470a99SVille Syrjälä void skl_prefill_init_worst(struct skl_prefill_ctx *ctx, 99*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state) 100*ba470a99SVille Syrjälä { 101*ba470a99SVille Syrjälä prefill_init_nocdclk_worst(ctx, crtc_state); 102*ba470a99SVille Syrjälä 103*ba470a99SVille Syrjälä ctx->adj.cdclk = intel_cdclk_prefill_adjustment_worst(crtc_state); 104*ba470a99SVille Syrjälä 105*ba470a99SVille Syrjälä ctx->prefill.full = prefill_lines_full(ctx); 106*ba470a99SVille Syrjälä } 107*ba470a99SVille Syrjälä 108*ba470a99SVille Syrjälä void skl_prefill_init(struct skl_prefill_ctx *ctx, 109*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state) 110*ba470a99SVille Syrjälä { 111*ba470a99SVille Syrjälä prefill_init_nocdclk(ctx, crtc_state); 112*ba470a99SVille Syrjälä 113*ba470a99SVille Syrjälä ctx->adj.cdclk = intel_cdclk_prefill_adjustment(crtc_state); 114*ba470a99SVille Syrjälä 115*ba470a99SVille Syrjälä ctx->prefill.full = prefill_lines_full(ctx); 116*ba470a99SVille Syrjälä } 117*ba470a99SVille Syrjälä 118*ba470a99SVille Syrjälä static unsigned int prefill_lines_with_latency(const struct skl_prefill_ctx *ctx, 119*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state, 120*ba470a99SVille Syrjälä unsigned int latency_us) 121*ba470a99SVille Syrjälä { 122*ba470a99SVille Syrjälä return ctx->prefill.full + prefill_usecs_to_lines(crtc_state, latency_us); 123*ba470a99SVille Syrjälä } 124*ba470a99SVille Syrjälä 125*ba470a99SVille Syrjälä int skl_prefill_min_guardband(const struct skl_prefill_ctx *ctx, 126*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state, 127*ba470a99SVille Syrjälä unsigned int latency_us) 128*ba470a99SVille Syrjälä { 129*ba470a99SVille Syrjälä unsigned int prefill = prefill_lines_with_latency(ctx, crtc_state, latency_us); 130*ba470a99SVille Syrjälä 131*ba470a99SVille Syrjälä return DIV_ROUND_UP(prefill, 0x10000); 132*ba470a99SVille Syrjälä } 133*ba470a99SVille Syrjälä 134*ba470a99SVille Syrjälä static unsigned int prefill_guardband(const struct intel_crtc_state *crtc_state) 135*ba470a99SVille Syrjälä { 136*ba470a99SVille Syrjälä return intel_crtc_vblank_length(crtc_state) << 16; 137*ba470a99SVille Syrjälä } 138*ba470a99SVille Syrjälä 139*ba470a99SVille Syrjälä bool skl_prefill_vblank_too_short(const struct skl_prefill_ctx *ctx, 140*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state, 141*ba470a99SVille Syrjälä unsigned int latency_us) 142*ba470a99SVille Syrjälä { 143*ba470a99SVille Syrjälä unsigned int guardband = prefill_guardband(crtc_state); 144*ba470a99SVille Syrjälä unsigned int prefill = prefill_lines_with_latency(ctx, crtc_state, latency_us); 145*ba470a99SVille Syrjälä 146*ba470a99SVille Syrjälä return guardband < prefill; 147*ba470a99SVille Syrjälä } 148*ba470a99SVille Syrjälä 149*ba470a99SVille Syrjälä int skl_prefill_min_cdclk(const struct skl_prefill_ctx *ctx, 150*ba470a99SVille Syrjälä const struct intel_crtc_state *crtc_state) 151*ba470a99SVille Syrjälä { 152*ba470a99SVille Syrjälä unsigned int prefill_unadjusted = prefill_lines_nocdclk(ctx); 153*ba470a99SVille Syrjälä unsigned int prefill_available = prefill_guardband(crtc_state) - ctx->prefill.fixed; 154*ba470a99SVille Syrjälä 155*ba470a99SVille Syrjälä return intel_cdclk_min_cdclk_for_prefill(crtc_state, prefill_unadjusted, 156*ba470a99SVille Syrjälä prefill_available); 157*ba470a99SVille Syrjälä } 158