Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/dp: Add drm_dp_dsc_sink_slice_count_mask()

A DSC sink supporting DSC slice count N, not necessarily supports slice
counts less than N. Hence the driver should check the sink's support for
a particular slice count before using that slice count. Add the helper
functions required for this.

Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Luca Coelho <luciano.coelho@intel.com>
Acked-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20251215192357.172201-3-imre.deak@intel.com

Imre Deak 92a73fec cc1b7534

+69 -32
+66 -32
drivers/gpu/drm/display/drm_dp_helper.c
··· 2705 2705 EXPORT_SYMBOL(drm_dp_dsc_sink_bpp_incr); 2706 2706 2707 2707 /** 2708 + * drm_dp_dsc_slice_count_to_mask() - Convert a slice count to a slice count mask 2709 + * @slice_count: slice count 2710 + * 2711 + * Convert @slice_count to a slice count mask. 2712 + * 2713 + * Returns the slice count mask. 2714 + */ 2715 + u32 drm_dp_dsc_slice_count_to_mask(int slice_count) 2716 + { 2717 + return BIT(slice_count - 1); 2718 + } 2719 + EXPORT_SYMBOL(drm_dp_dsc_slice_count_to_mask); 2720 + 2721 + /** 2722 + * drm_dp_dsc_sink_slice_count_mask() - Get the mask of valid DSC sink slice counts 2723 + * @dsc_dpcd: the sink's DSC DPCD capabilities 2724 + * @is_edp: %true for an eDP sink 2725 + * 2726 + * Get the mask of supported slice counts from the sink's DSC DPCD register. 2727 + * 2728 + * Returns: 2729 + * Mask of slice counts supported by the DSC sink: 2730 + * - > 0: bit#0,1,3,5..,23 set if the sink supports 1,2,4,6..,24 slices 2731 + * - 0: if the sink doesn't support any slices 2732 + */ 2733 + u32 drm_dp_dsc_sink_slice_count_mask(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], 2734 + bool is_edp) 2735 + { 2736 + u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT]; 2737 + u32 mask = 0; 2738 + 2739 + if (!is_edp) { 2740 + /* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */ 2741 + u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT]; 2742 + 2743 + if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK) 2744 + mask |= drm_dp_dsc_slice_count_to_mask(24); 2745 + if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK) 2746 + mask |= drm_dp_dsc_slice_count_to_mask(20); 2747 + if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK) 2748 + mask |= drm_dp_dsc_slice_count_to_mask(16); 2749 + } 2750 + 2751 + /* DP, eDP v1.5+ */ 2752 + if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK) 2753 + mask |= drm_dp_dsc_slice_count_to_mask(12); 2754 + if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK) 2755 + mask |= drm_dp_dsc_slice_count_to_mask(10); 2756 + if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK) 2757 + mask |= drm_dp_dsc_slice_count_to_mask(8); 2758 + if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK) 2759 + mask |= drm_dp_dsc_slice_count_to_mask(6); 2760 + /* DP, eDP v1.4+ */ 2761 + if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK) 2762 + mask |= drm_dp_dsc_slice_count_to_mask(4); 2763 + if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK) 2764 + mask |= drm_dp_dsc_slice_count_to_mask(2); 2765 + if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK) 2766 + mask |= drm_dp_dsc_slice_count_to_mask(1); 2767 + 2768 + return mask; 2769 + } 2770 + EXPORT_SYMBOL(drm_dp_dsc_sink_slice_count_mask); 2771 + 2772 + /** 2708 2773 * drm_dp_dsc_sink_max_slice_count() - Get the max slice count 2709 2774 * supported by the DSC sink. 2710 2775 * @dsc_dpcd: DSC capabilities from DPCD ··· 2788 2723 u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], 2789 2724 bool is_edp) 2790 2725 { 2791 - u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT]; 2792 - 2793 - if (!is_edp) { 2794 - /* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */ 2795 - u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT]; 2796 - 2797 - if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK) 2798 - return 24; 2799 - if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK) 2800 - return 20; 2801 - if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK) 2802 - return 16; 2803 - } 2804 - 2805 - /* DP, eDP v1.5+ */ 2806 - if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK) 2807 - return 12; 2808 - if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK) 2809 - return 10; 2810 - if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK) 2811 - return 8; 2812 - if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK) 2813 - return 6; 2814 - /* DP, eDP v1.4+ */ 2815 - if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK) 2816 - return 4; 2817 - if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK) 2818 - return 2; 2819 - if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK) 2820 - return 1; 2821 - 2822 - return 0; 2726 + return fls(drm_dp_dsc_sink_slice_count_mask(dsc_dpcd, is_edp)); 2823 2727 } 2824 2728 EXPORT_SYMBOL(drm_dp_dsc_sink_max_slice_count); 2825 2729
+3
include/drm/display/drm_dp_helper.h
··· 206 206 207 207 /* DP/eDP DSC support */ 208 208 u8 drm_dp_dsc_sink_bpp_incr(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE]); 209 + u32 drm_dp_dsc_slice_count_to_mask(int slice_count); 210 + u32 drm_dp_dsc_sink_slice_count_mask(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], 211 + bool is_edp); 209 212 u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE], 210 213 bool is_edp); 211 214 u8 drm_dp_dsc_sink_line_buf_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE]);