@@ -401,6 +401,85 @@ static int vc4_hvs_debugfs_lbm_allocs(struct seq_file *m, void *data)
401401 return 0 ;
402402}
403403
404+ static int vc6_hvs_debugfs_gamma (struct seq_file * m , void * data )
405+ {
406+ struct drm_debugfs_entry * entry = m -> private ;
407+ struct drm_device * dev = entry -> dev ;
408+ struct vc4_dev * vc4 = to_vc4_dev (dev );
409+ struct vc4_hvs * hvs = vc4 -> hvs ;
410+ struct drm_printer p = drm_seq_file_printer (m );
411+ unsigned int i , chan ;
412+ u32 dispstat , dither_gamma ;
413+
414+ for (chan = 0 ; chan < SCALER_CHANNELS_COUNT ; chan ++ ) {
415+ u32 x_c , grad ;
416+ u32 offset = SCALER6D_DSPGAMMA_START +
417+ chan * SCALER6D_DSPGAMMA_CHAN_OFFSET ;
418+
419+ dispstat = VC4_GET_FIELD (HVS_READ (SCALER6_DISPX_STATUS (chan )),
420+ SCALER6_DISPX_STATUS_MODE );
421+ if (dispstat == SCALER6_DISPX_STATUS_MODE_DISABLED ||
422+ dispstat == SCALER6_DISPX_STATUS_MODE_EOF ) {
423+ drm_printf (& p , "HVS channel %u: disabled\n" , chan );
424+ continue ;
425+ }
426+
427+ dither_gamma = HVS_READ (SCALER6D_DITHERGAMMA );
428+ if (!(dither_gamma & SCALER6D_DITHERGAMMA_GAMMA (chan ))) {
429+ drm_printf (& p , "HVS channel %u: Gamma disabled\n" , chan );
430+ continue ;
431+ }
432+
433+ drm_printf (& p , "HVS channel %u:\n" , chan );
434+ drm_printf (& p , " blue:\n" );
435+ for (i = 0 ; i < SCALER6D_DSPGAMMA_NUM_POINTS ; i ++ , offset += 8 ) {
436+ x_c = HVS_READ (offset );
437+ grad = HVS_READ (offset + 4 );
438+ drm_printf (& p , " %08x %08x - x %u, c %u, grad %u\n" ,
439+ x_c , grad ,
440+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_X ),
441+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_C ),
442+ grad );
443+ }
444+ drm_printf (& p , " green:\n" );
445+ for (i = 0 ; i < SCALER6D_DSPGAMMA_NUM_POINTS ; i ++ , offset += 8 ) {
446+ x_c = HVS_READ (offset );
447+ grad = HVS_READ (offset + 4 );
448+ drm_printf (& p , " %08x %08x - x %u, c %u, grad %u\n" ,
449+ x_c , grad ,
450+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_X ),
451+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_C ),
452+ grad );
453+ }
454+ drm_printf (& p , " red:\n" );
455+ for (i = 0 ; i < SCALER6D_DSPGAMMA_NUM_POINTS ; i ++ , offset += 8 ) {
456+ x_c = HVS_READ (offset );
457+ grad = HVS_READ (offset + 4 );
458+ drm_printf (& p , " %08x %08x - x %u, c %u, grad %u\n" ,
459+ x_c , grad ,
460+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_X ),
461+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_C ),
462+ grad );
463+ }
464+
465+ /* Alpha only valid on channel 2 */
466+ if (chan != 2 )
467+ continue ;
468+
469+ drm_printf (& p , " alpha:\n" );
470+ for (i = 0 ; i < SCALER6D_DSPGAMMA_NUM_POINTS ; i ++ , offset += 8 ) {
471+ x_c = HVS_READ (offset );
472+ grad = HVS_READ (offset + 4 );
473+ drm_printf (& p , " %08x %08x - x %u, c %u, grad %u\n" ,
474+ x_c , grad ,
475+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_X ),
476+ VC4_GET_FIELD (x_c , SCALER6D_DSPGAMMA_OFF_C ),
477+ grad );
478+ }
479+ }
480+ return 0 ;
481+ }
482+
404483/* The filter kernel is composed of dwords each containing 3 9-bit
405484 * signed integers packed next to each other.
406485 */
@@ -1623,6 +1702,8 @@ int vc4_hvs_debugfs_init(struct drm_minor *minor)
16231702 if (vc4 -> gen >= VC4_GEN_6_C ) {
16241703 drm_debugfs_add_file (drm , "hvs_dlists" , vc6_hvs_debugfs_dlist , NULL );
16251704 drm_debugfs_add_file (drm , "hvs_upm" , vc6_hvs_debugfs_upm_allocs , NULL );
1705+ if (vc4 -> gen >= VC4_GEN_6_D )
1706+ drm_debugfs_add_file (drm , "gamma" , vc6_hvs_debugfs_gamma , NULL );
16261707 } else {
16271708 drm_debugfs_add_file (drm , "hvs_dlists" , vc4_hvs_debugfs_dlist , NULL );
16281709 }
0 commit comments