@@ -573,7 +573,9 @@ static void vc4_write_tpz(struct vc4_plane_state *vc4_state, u32 src, u32 dst)
573573/* phase magnitude bits */
574574#define PHASE_BITS 6
575575
576- static void vc4_write_ppf (struct vc4_plane_state * vc4_state , u32 src , u32 dst , u32 xy , int channel , int chroma_offset )
576+ static void vc4_write_ppf (struct vc4_plane_state * vc4_state , u32 src , u32 dst ,
577+ u32 xy , int channel , int chroma_offset ,
578+ bool no_interpolate )
577579{
578580 struct vc4_dev * vc4 = to_vc4_dev (vc4_state -> base .plane -> dev );
579581 u32 scale = src / dst ;
@@ -612,6 +614,7 @@ static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst, u
612614 phase &= SCALER_PPF_IPHASE_MASK ;
613615
614616 vc4_dlist_write (vc4_state ,
617+ no_interpolate ? SCALER_PPF_NOINTERP : 0 |
615618 SCALER_PPF_AGC |
616619 VC4_SET_FIELD (scale , SCALER_PPF_SCALE ) |
617620 /*
@@ -806,15 +809,17 @@ static void vc4_write_scaling_parameters(struct drm_plane_state *state,
806809 /* Ch0 H-PPF Word 0: Scaling Parameters */
807810 if (vc4_state -> x_scaling [channel ] == VC4_SCALING_PPF ) {
808811 vc4_write_ppf (vc4_state ,
809- vc4_state -> src_w [channel ], vc4_state -> crtc_w , vc4_state -> src_x , channel ,
810- state -> chroma_siting_h );
812+ vc4_state -> src_w [channel ], vc4_state -> crtc_w , vc4_state -> src_x ,
813+ channel , state -> chroma_siting_h ,
814+ state -> scaling_filter == DRM_SCALING_FILTER_NEAREST_NEIGHBOR );
811815 }
812816
813817 /* Ch0 V-PPF Words 0-1: Scaling Parameters, Context */
814818 if (vc4_state -> y_scaling [channel ] == VC4_SCALING_PPF ) {
815819 vc4_write_ppf (vc4_state ,
816- vc4_state -> src_h [channel ], vc4_state -> crtc_h , vc4_state -> src_y , channel ,
817- state -> chroma_siting_v );
820+ vc4_state -> src_h [channel ], vc4_state -> crtc_h , vc4_state -> src_y ,
821+ channel , state -> chroma_siting_v ,
822+ state -> scaling_filter == DRM_SCALING_FILTER_NEAREST_NEIGHBOR );
818823 vc4_dlist_write (vc4_state , 0xc0c0c0c0 );
819824 }
820825
@@ -1547,7 +1552,18 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
15471552 vc4_state -> y_scaling [0 ] == VC4_SCALING_PPF ||
15481553 vc4_state -> x_scaling [1 ] == VC4_SCALING_PPF ||
15491554 vc4_state -> y_scaling [1 ] == VC4_SCALING_PPF ) {
1550- u32 kernel = VC4_SET_FIELD (vc4 -> hvs -> mitchell_netravali_filter .start ,
1555+ struct drm_mm_node * filter ;
1556+
1557+ switch (state -> scaling_filter ) {
1558+ case DRM_SCALING_FILTER_DEFAULT :
1559+ default :
1560+ filter = & vc4 -> hvs -> mitchell_netravali_filter ;
1561+ break ;
1562+ case DRM_SCALING_FILTER_NEAREST_NEIGHBOR :
1563+ filter = & vc4 -> hvs -> nearest_neighbour_filter ;
1564+ break ;
1565+ }
1566+ u32 kernel = VC4_SET_FIELD (filter -> start ,
15511567 SCALER_PPF_KERNEL_OFFSET );
15521568
15531569 /* HPPF plane 0 */
@@ -1958,9 +1974,19 @@ static int vc6_plane_mode_set(struct drm_plane *plane,
19581974 vc4_state -> y_scaling [0 ] == VC4_SCALING_PPF ||
19591975 vc4_state -> x_scaling [1 ] == VC4_SCALING_PPF ||
19601976 vc4_state -> y_scaling [1 ] == VC4_SCALING_PPF ) {
1961- u32 kernel =
1962- VC4_SET_FIELD (vc4 -> hvs -> mitchell_netravali_filter .start ,
1963- SCALER_PPF_KERNEL_OFFSET );
1977+ struct drm_mm_node * filter ;
1978+
1979+ switch (state -> scaling_filter ) {
1980+ case DRM_SCALING_FILTER_DEFAULT :
1981+ default :
1982+ filter = & vc4 -> hvs -> mitchell_netravali_filter ;
1983+ break ;
1984+ case DRM_SCALING_FILTER_NEAREST_NEIGHBOR :
1985+ filter = & vc4 -> hvs -> nearest_neighbour_filter ;
1986+ break ;
1987+ }
1988+ u32 kernel = VC4_SET_FIELD (filter -> start ,
1989+ SCALER_PPF_KERNEL_OFFSET );
19641990
19651991 /* HPPF plane 0 */
19661992 vc4_dlist_write (vc4_state , kernel );
@@ -2442,6 +2468,10 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
24422468 DRM_COLOR_YCBCR_BT709 ,
24432469 DRM_COLOR_YCBCR_LIMITED_RANGE );
24442470
2471+ drm_plane_create_scaling_filter_property (plane ,
2472+ BIT (DRM_SCALING_FILTER_DEFAULT ) |
2473+ BIT (DRM_SCALING_FILTER_NEAREST_NEIGHBOR ));
2474+
24452475 drm_plane_create_chroma_siting_properties (plane , 0 , 0 );
24462476
24472477 if (type == DRM_PLANE_TYPE_PRIMARY )
0 commit comments