2018-01-22 09:27:00 +00:00
// SPDX-License-Identifier: GPL-2.0
2019-04-18 16:38:45 +03:00
/* Copyright (C) 2012-2019 ARM Limited or its affiliates. */
2018-01-22 09:27:00 +00:00
# include <linux/kernel.h>
# include <linux/debugfs.h>
# include <linux/stringify.h>
# include "cc_driver.h"
# include "cc_crypto_ctx.h"
# include "cc_debugfs.h"
# define CC_DEBUG_REG(_X) { \
. name = __stringify ( _X ) , \
. offset = CC_REG ( _X ) \
}
/*
* This is a global var for the dentry of the
* debugfs ccree / dir . It is not tied down to
* a specific instance of ccree , hence it is
* global .
*/
static struct dentry * cc_debugfs_dir ;
2019-04-18 16:38:45 +03:00
static struct debugfs_reg32 ver_sig_regs [ ] = {
2018-05-24 15:19:06 +01:00
{ . name = " SIGNATURE " } , /* Must be 0th */
{ . name = " VERSION " } , /* Must be 1st */
2019-04-18 16:38:45 +03:00
} ;
2020-05-09 00:34:59 +02:00
static const struct debugfs_reg32 pid_cid_regs [ ] = {
2019-04-18 16:38:45 +03:00
CC_DEBUG_REG ( PERIPHERAL_ID_0 ) ,
CC_DEBUG_REG ( PERIPHERAL_ID_1 ) ,
CC_DEBUG_REG ( PERIPHERAL_ID_2 ) ,
CC_DEBUG_REG ( PERIPHERAL_ID_3 ) ,
CC_DEBUG_REG ( PERIPHERAL_ID_4 ) ,
CC_DEBUG_REG ( COMPONENT_ID_0 ) ,
CC_DEBUG_REG ( COMPONENT_ID_1 ) ,
CC_DEBUG_REG ( COMPONENT_ID_2 ) ,
CC_DEBUG_REG ( COMPONENT_ID_3 ) ,
} ;
2020-05-09 00:34:59 +02:00
static const struct debugfs_reg32 debug_regs [ ] = {
2018-01-22 09:27:00 +00:00
CC_DEBUG_REG ( HOST_IRR ) ,
CC_DEBUG_REG ( HOST_POWER_DOWN_EN ) ,
CC_DEBUG_REG ( AXIM_MON_ERR ) ,
CC_DEBUG_REG ( DSCRPTR_QUEUE_CONTENT ) ,
CC_DEBUG_REG ( HOST_IMR ) ,
CC_DEBUG_REG ( AXIM_CFG ) ,
CC_DEBUG_REG ( AXIM_CACHE_PARAMS ) ,
CC_DEBUG_REG ( GPR_HOST ) ,
CC_DEBUG_REG ( AXIM_MON_COMP ) ,
} ;
2019-01-22 16:14:17 +01:00
void __init cc_debugfs_global_init ( void )
2018-01-22 09:27:00 +00:00
{
cc_debugfs_dir = debugfs_create_dir ( " ccree " , NULL ) ;
}
void __exit cc_debugfs_global_fini ( void )
{
debugfs_remove ( cc_debugfs_dir ) ;
}
int cc_debugfs_init ( struct cc_drvdata * drvdata )
{
struct device * dev = drvdata_to_dev ( drvdata ) ;
2019-04-18 16:38:45 +03:00
struct debugfs_regset32 * regset , * verset ;
2018-05-24 15:19:06 +01:00
2018-01-22 09:27:00 +00:00
regset = devm_kzalloc ( dev , sizeof ( * regset ) , GFP_KERNEL ) ;
if ( ! regset )
return - ENOMEM ;
regset - > regs = debug_regs ;
regset - > nregs = ARRAY_SIZE ( debug_regs ) ;
regset - > base = drvdata - > cc_base ;
2020-02-11 19:18:56 +01:00
regset - > dev = dev ;
2018-01-22 09:27:00 +00:00
2020-02-11 19:19:13 +01:00
drvdata - > dir = debugfs_create_dir ( drvdata - > plat_dev - > name ,
cc_debugfs_dir ) ;
2018-01-22 09:27:00 +00:00
2020-02-11 19:19:13 +01:00
debugfs_create_regset32 ( " regs " , 0400 , drvdata - > dir , regset ) ;
debugfs_create_bool ( " coherent " , 0400 , drvdata - > dir , & drvdata - > coherent ) ;
2018-01-22 09:27:00 +00:00
2019-04-18 16:38:45 +03:00
verset = devm_kzalloc ( dev , sizeof ( * verset ) , GFP_KERNEL ) ;
/* Failing here is not important enough to fail the module load */
2019-04-18 16:38:49 +03:00
if ( ! verset )
2020-02-11 19:19:13 +01:00
return 0 ;
2019-04-18 16:38:45 +03:00
if ( drvdata - > hw_rev < = CC_HW_REV_712 ) {
ver_sig_regs [ 0 ] . offset = drvdata - > sig_offset ;
ver_sig_regs [ 1 ] . offset = drvdata - > ver_offset ;
verset - > regs = ver_sig_regs ;
verset - > nregs = ARRAY_SIZE ( ver_sig_regs ) ;
} else {
verset - > regs = pid_cid_regs ;
verset - > nregs = ARRAY_SIZE ( pid_cid_regs ) ;
}
verset - > base = drvdata - > cc_base ;
2020-02-11 19:18:56 +01:00
verset - > dev = dev ;
2019-04-18 16:38:45 +03:00
2020-02-11 19:19:13 +01:00
debugfs_create_regset32 ( " version " , 0400 , drvdata - > dir , verset ) ;
2018-01-22 09:27:00 +00:00
return 0 ;
}
void cc_debugfs_fini ( struct cc_drvdata * drvdata )
{
2020-02-11 19:19:13 +01:00
debugfs_remove_recursive ( drvdata - > dir ) ;
2018-01-22 09:27:00 +00:00
}