@@ -573,7 +573,9 @@ static void vc4_write_tpz(struct vc4_plane_state *vc4_state, u32 src, u32 dst)
573
573
/* phase magnitude bits */
574
574
#define PHASE_BITS 6
575
575
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 )
577
579
{
578
580
struct vc4_dev * vc4 = to_vc4_dev (vc4_state -> base .plane -> dev );
579
581
u32 scale = src / dst ;
@@ -612,6 +614,7 @@ static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst, u
612
614
phase &= SCALER_PPF_IPHASE_MASK ;
613
615
614
616
vc4_dlist_write (vc4_state ,
617
+ no_interpolate ? SCALER_PPF_NOINTERP : 0 |
615
618
SCALER_PPF_AGC |
616
619
VC4_SET_FIELD (scale , SCALER_PPF_SCALE ) |
617
620
/*
@@ -806,15 +809,17 @@ static void vc4_write_scaling_parameters(struct drm_plane_state *state,
806
809
/* Ch0 H-PPF Word 0: Scaling Parameters */
807
810
if (vc4_state -> x_scaling [channel ] == VC4_SCALING_PPF ) {
808
811
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 );
811
815
}
812
816
813
817
/* Ch0 V-PPF Words 0-1: Scaling Parameters, Context */
814
818
if (vc4_state -> y_scaling [channel ] == VC4_SCALING_PPF ) {
815
819
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 );
818
823
vc4_dlist_write (vc4_state , 0xc0c0c0c0 );
819
824
}
820
825
@@ -1547,7 +1552,18 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
1547
1552
vc4_state -> y_scaling [0 ] == VC4_SCALING_PPF ||
1548
1553
vc4_state -> x_scaling [1 ] == VC4_SCALING_PPF ||
1549
1554
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 ,
1551
1567
SCALER_PPF_KERNEL_OFFSET );
1552
1568
1553
1569
/* HPPF plane 0 */
@@ -1958,9 +1974,19 @@ static int vc6_plane_mode_set(struct drm_plane *plane,
1958
1974
vc4_state -> y_scaling [0 ] == VC4_SCALING_PPF ||
1959
1975
vc4_state -> x_scaling [1 ] == VC4_SCALING_PPF ||
1960
1976
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 );
1964
1990
1965
1991
/* HPPF plane 0 */
1966
1992
vc4_dlist_write (vc4_state , kernel );
@@ -2442,6 +2468,10 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
2442
2468
DRM_COLOR_YCBCR_BT709 ,
2443
2469
DRM_COLOR_YCBCR_LIMITED_RANGE );
2444
2470
2471
+ drm_plane_create_scaling_filter_property (plane ,
2472
+ BIT (DRM_SCALING_FILTER_DEFAULT ) |
2473
+ BIT (DRM_SCALING_FILTER_NEAREST_NEIGHBOR ));
2474
+
2445
2475
drm_plane_create_chroma_siting_properties (plane , 0 , 0 );
2446
2476
2447
2477
if (type == DRM_PLANE_TYPE_PRIMARY )
0 commit comments