intel_pxp_debugfs.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // SPDX-License-Identifier: MIT
  2. /*
  3. * Copyright © 2021 Intel Corporation
  4. */
  5. #include <linux/debugfs.h>
  6. #include <linux/string_helpers.h>
  7. #include <drm/drm_print.h>
  8. #include "gt/intel_gt_debugfs.h"
  9. #include "i915_drv.h"
  10. #include "intel_pxp.h"
  11. #include "intel_pxp_debugfs.h"
  12. #include "intel_pxp_gsccs.h"
  13. #include "intel_pxp_irq.h"
  14. #include "intel_pxp_types.h"
  15. static int pxp_info_show(struct seq_file *m, void *data)
  16. {
  17. struct intel_pxp *pxp = m->private;
  18. struct drm_printer p = drm_seq_file_printer(m);
  19. if (!intel_pxp_is_enabled(pxp)) {
  20. drm_printf(&p, "pxp disabled\n");
  21. return 0;
  22. }
  23. drm_printf(&p, "active: %s\n", str_yes_no(intel_pxp_is_active(pxp)));
  24. drm_printf(&p, "instance counter: %u\n", pxp->key_instance);
  25. return 0;
  26. }
  27. DEFINE_SHOW_ATTRIBUTE(pxp_info);
  28. static int pxp_terminate_get(void *data, u64 *val)
  29. {
  30. /* nothing to read */
  31. return -EPERM;
  32. }
  33. static int pxp_terminate_set(void *data, u64 val)
  34. {
  35. struct intel_pxp *pxp = data;
  36. struct intel_gt *gt = pxp->ctrl_gt;
  37. int timeout_ms;
  38. if (!intel_pxp_is_active(pxp))
  39. return -ENODEV;
  40. /* simulate a termination interrupt */
  41. spin_lock_irq(gt->irq_lock);
  42. intel_pxp_irq_handler(pxp, GEN12_DISPLAY_PXP_STATE_TERMINATED_INTERRUPT);
  43. spin_unlock_irq(gt->irq_lock);
  44. timeout_ms = intel_pxp_get_backend_timeout_ms(pxp);
  45. if (!wait_for_completion_timeout(&pxp->termination,
  46. msecs_to_jiffies(timeout_ms)))
  47. return -ETIMEDOUT;
  48. return 0;
  49. }
  50. DEFINE_SIMPLE_ATTRIBUTE(pxp_terminate_fops, pxp_terminate_get, pxp_terminate_set, "%llx\n");
  51. void intel_pxp_debugfs_register(struct intel_pxp *pxp)
  52. {
  53. struct drm_minor *minor;
  54. struct dentry *pxproot;
  55. if (!intel_pxp_is_supported(pxp))
  56. return;
  57. minor = pxp->ctrl_gt->i915->drm.primary;
  58. if (!minor->debugfs_root)
  59. return;
  60. pxproot = debugfs_create_dir("pxp", minor->debugfs_root);
  61. if (IS_ERR(pxproot))
  62. return;
  63. debugfs_create_file("info", 0444, pxproot,
  64. pxp, &pxp_info_fops);
  65. debugfs_create_file("terminate_state", 0644, pxproot,
  66. pxp, &pxp_terminate_fops);
  67. }