mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 390cf1b28b
			
		
	
	
		390cf1b28b
		
	
	
	
	
		
			
			2 debugfs files, one to query the current status of the pxp session and one
to trigger an invalidation for testing.
v2: rename debugfs, fix date (Alan)
v12: rebased to latest drm-tip (rename of files/structs from
     debugfs_gt to intel_debugfs_gt caused compiler errors).
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Reviewed-by : Alan Previn <alan.previn.teres.alexis@intel.com>
Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210924191452.1539378-16-alan.previn.teres.alexis@intel.com
		
	
			
		
			
				
	
	
		
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: MIT
 | |
| /*
 | |
|  * Copyright © 2021 Intel Corporation
 | |
|  */
 | |
| 
 | |
| #include <linux/debugfs.h>
 | |
| #include <drm/drm_print.h>
 | |
| 
 | |
| #include "gt/intel_gt_debugfs.h"
 | |
| #include "pxp/intel_pxp.h"
 | |
| #include "pxp/intel_pxp_irq.h"
 | |
| #include "i915_drv.h"
 | |
| 
 | |
| static int pxp_info_show(struct seq_file *m, void *data)
 | |
| {
 | |
| 	struct intel_pxp *pxp = m->private;
 | |
| 	struct drm_printer p = drm_seq_file_printer(m);
 | |
| 	bool enabled = intel_pxp_is_enabled(pxp);
 | |
| 
 | |
| 	if (!enabled) {
 | |
| 		drm_printf(&p, "pxp disabled\n");
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	drm_printf(&p, "active: %s\n", yesno(intel_pxp_is_active(pxp)));
 | |
| 	drm_printf(&p, "instance counter: %u\n", pxp->key_instance);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE(pxp_info);
 | |
| 
 | |
| static int pxp_terminate_get(void *data, u64 *val)
 | |
| {
 | |
| 	/* nothing to read */
 | |
| 	return -EPERM;
 | |
| }
 | |
| 
 | |
| static int pxp_terminate_set(void *data, u64 val)
 | |
| {
 | |
| 	struct intel_pxp *pxp = data;
 | |
| 	struct intel_gt *gt = pxp_to_gt(pxp);
 | |
| 
 | |
| 	if (!intel_pxp_is_active(pxp))
 | |
| 		return -ENODEV;
 | |
| 
 | |
| 	/* simulate a termination interrupt */
 | |
| 	spin_lock_irq(>->irq_lock);
 | |
| 	intel_pxp_irq_handler(pxp, GEN12_DISPLAY_PXP_STATE_TERMINATED_INTERRUPT);
 | |
| 	spin_unlock_irq(>->irq_lock);
 | |
| 
 | |
| 	if (!wait_for_completion_timeout(&pxp->termination,
 | |
| 					 msecs_to_jiffies(100)))
 | |
| 		return -ETIMEDOUT;
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| DEFINE_SIMPLE_ATTRIBUTE(pxp_terminate_fops, pxp_terminate_get, pxp_terminate_set, "%llx\n");
 | |
| void intel_pxp_debugfs_register(struct intel_pxp *pxp, struct dentry *gt_root)
 | |
| {
 | |
| 	static const struct intel_gt_debugfs_file files[] = {
 | |
| 		{ "info", &pxp_info_fops, NULL },
 | |
| 		{ "terminate_state", &pxp_terminate_fops, NULL },
 | |
| 	};
 | |
| 	struct dentry *root;
 | |
| 
 | |
| 	if (!gt_root)
 | |
| 		return;
 | |
| 
 | |
| 	if (!HAS_PXP((pxp_to_gt(pxp)->i915)))
 | |
| 		return;
 | |
| 
 | |
| 	root = debugfs_create_dir("pxp", gt_root);
 | |
| 	if (IS_ERR(root))
 | |
| 		return;
 | |
| 
 | |
| 	intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), pxp);
 | |
| }
 |