2017-12-06 12:29:47 +01:00
// SPDX-License-Identifier: GPL-2.0
2014-07-31 09:39:11 +02:00
/*
* Copyright ( C ) STMicroelectronics SA 2014
* Authors : Benjamin Gaignard < benjamin . gaignard @ st . com >
* Fabien Dessenne < fabien . dessenne @ st . com >
* for STMicroelectronics .
*/
2019-06-05 15:48:35 +02:00
# include <linux/types.h>
2015-07-31 11:32:13 +02:00
# include <drm/drm_fb_cma_helper.h>
2019-06-05 15:48:35 +02:00
# include <drm/drm_fourcc.h>
2015-08-03 14:22:16 +02:00
# include <drm/drm_gem_cma_helper.h>
2015-03-19 13:35:16 +01:00
2014-07-31 09:39:11 +02:00
# include "sti_compositor.h"
2015-07-31 11:32:34 +02:00
# include "sti_drv.h"
# include "sti_plane.h"
2014-07-31 09:39:11 +02:00
2015-07-31 11:32:13 +02:00
const char * sti_plane_to_str ( struct sti_plane * plane )
2014-07-31 09:39:11 +02:00
{
2015-07-31 11:32:13 +02:00
switch ( plane - > desc ) {
case STI_GDP_0 :
return " GDP0 " ;
case STI_GDP_1 :
return " GDP1 " ;
case STI_GDP_2 :
return " GDP2 " ;
case STI_GDP_3 :
return " GDP3 " ;
case STI_HQVDP_0 :
return " HQVDP0 " ;
case STI_CURSOR :
return " CURSOR " ;
default :
return " <UNKNOWN PLANE> " ;
}
}
2016-02-08 11:34:31 +01:00
# define STI_FPS_INTERVAL_MS 3000
void sti_plane_update_fps ( struct sti_plane * plane ,
bool new_frame ,
bool new_field )
{
2018-03-22 17:23:01 +02:00
struct drm_plane_state * state = plane - > drm_plane . state ;
2016-04-13 02:28:02 -07:00
ktime_t now ;
2016-02-08 11:34:31 +01:00
struct sti_fps_info * fps ;
int fpks , fipks , ms_since_last , num_frames , num_fields ;
2016-04-13 02:28:02 -07:00
now = ktime_get ( ) ;
2016-02-08 11:34:31 +01:00
/* Compute number of frame updates */
fps = & plane - > fps_info ;
if ( new_field )
fps - > curr_field_counter + + ;
/* do not perform fps calcul if new_frame is false */
if ( ! new_frame )
return ;
fps - > curr_frame_counter + + ;
2016-04-13 02:28:02 -07:00
ms_since_last = ktime_to_ms ( ktime_sub ( now , fps - > last_timestamp ) ) ;
2016-02-08 11:34:31 +01:00
num_frames = fps - > curr_frame_counter - fps - > last_frame_counter ;
if ( num_frames < = 0 | | ms_since_last < STI_FPS_INTERVAL_MS )
return ;
fps - > last_timestamp = now ;
fps - > last_frame_counter = fps - > curr_frame_counter ;
2016-11-15 15:33:34 +01:00
2018-03-22 17:23:01 +02:00
if ( state - > fb ) {
2016-11-15 15:33:34 +01:00
fpks = ( num_frames * 1000000 ) / ms_since_last ;
snprintf ( plane - > fps_info . fps_str , FPS_LENGTH ,
" %-8s %4dx%-4d %.4s @ %3d.%-3.3d fps (%s) " ,
plane - > drm_plane . name ,
2018-03-22 17:23:01 +02:00
state - > fb - > width ,
state - > fb - > height ,
( char * ) & state - > fb - > format - > format ,
2016-11-15 15:33:34 +01:00
fpks / 1000 , fpks % 1000 ,
sti_plane_to_str ( plane ) ) ;
}
2016-02-08 11:34:31 +01:00
if ( fps - > curr_field_counter ) {
/* Compute number of field updates */
num_fields = fps - > curr_field_counter - fps - > last_field_counter ;
fps - > last_field_counter = fps - > curr_field_counter ;
fipks = ( num_fields * 1000000 ) / ms_since_last ;
snprintf ( plane - > fps_info . fips_str ,
2016-11-15 15:33:34 +01:00
FPS_LENGTH , " - %3d.%-3.3d field/sec " ,
2016-02-08 11:34:31 +01:00
fipks / 1000 , fipks % 1000 ) ;
} else {
plane - > fps_info . fips_str [ 0 ] = ' \0 ' ;
}
if ( fps - > output )
DRM_INFO ( " %s%s \n " ,
plane - > fps_info . fps_str ,
plane - > fps_info . fips_str ) ;
}
2016-03-24 17:18:20 +01:00
static int sti_plane_get_default_zpos ( enum drm_plane_type type )
2014-07-31 09:39:11 +02:00
{
2016-03-24 17:18:20 +01:00
switch ( type ) {
case DRM_PLANE_TYPE_PRIMARY :
2014-07-31 09:39:11 +02:00
return 0 ;
2016-03-24 17:18:20 +01:00
case DRM_PLANE_TYPE_OVERLAY :
return 1 ;
case DRM_PLANE_TYPE_CURSOR :
return 7 ;
2014-07-31 09:39:11 +02:00
}
2016-03-24 17:18:20 +01:00
return 0 ;
}
2014-07-31 09:39:11 +02:00
2016-03-24 17:18:20 +01:00
void sti_plane_reset ( struct drm_plane * plane )
{
drm_atomic_helper_plane_reset ( plane ) ;
plane - > state - > zpos = sti_plane_get_default_zpos ( plane - > type ) ;
2014-07-31 09:39:11 +02:00
}
2016-03-24 17:18:20 +01:00
static void sti_plane_attach_zorder_property ( struct drm_plane * drm_plane ,
enum drm_plane_type type )
2014-07-31 09:39:11 +02:00
{
2016-03-24 17:18:20 +01:00
int zpos = sti_plane_get_default_zpos ( type ) ;
switch ( type ) {
case DRM_PLANE_TYPE_PRIMARY :
case DRM_PLANE_TYPE_OVERLAY :
drm_plane_create_zpos_property ( drm_plane , zpos , 0 , 6 ) ;
break ;
case DRM_PLANE_TYPE_CURSOR :
drm_plane_create_zpos_immutable_property ( drm_plane , zpos ) ;
break ;
2014-07-31 09:39:11 +02:00
}
}
2015-08-03 14:22:16 +02:00
void sti_plane_init_property ( struct sti_plane * plane ,
enum drm_plane_type type )
2014-07-31 09:39:11 +02:00
{
2016-03-24 17:18:20 +01:00
sti_plane_attach_zorder_property ( & plane - > drm_plane , type ) ;
2014-07-31 09:39:11 +02:00
2016-03-24 17:18:20 +01:00
DRM_DEBUG_DRIVER ( " drm plane:%d mapped to %s \n " ,
plane - > drm_plane . base . id , sti_plane_to_str ( plane ) ) ;
2014-07-31 09:39:11 +02:00
}