sde_hw_qdss.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2019, The Linux Foundation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
  6. #include <linux/mutex.h>
  7. #include <linux/platform_device.h>
  8. #include "sde_kms.h"
  9. #include "sde_dbg.h"
  10. #include "sde_hw_qdss.h"
  11. #define QDSS_CONFIG 0x0
  12. static struct sde_qdss_cfg *_qdss_offset(enum sde_qdss qdss,
  13. struct sde_mdss_cfg *m,
  14. void __iomem *addr,
  15. struct sde_hw_blk_reg_map *b)
  16. {
  17. int i;
  18. for (i = 0; i < m->qdss_count; i++) {
  19. if (qdss == m->qdss[i].id) {
  20. b->base_off = addr;
  21. b->blk_off = m->qdss[i].base;
  22. b->length = m->qdss[i].len;
  23. b->hwversion = m->hwversion;
  24. b->log_mask = SDE_DBG_MASK_QDSS;
  25. return &m->qdss[i];
  26. }
  27. }
  28. return ERR_PTR(-EINVAL);
  29. }
  30. static void sde_hw_qdss_enable_qdss_events(struct sde_hw_qdss *hw_qdss,
  31. bool enable)
  32. {
  33. struct sde_hw_blk_reg_map *c = &hw_qdss->hw;
  34. u32 val;
  35. val = enable ? 0x100 : 0;
  36. if (c)
  37. SDE_REG_WRITE(c, QDSS_CONFIG, val);
  38. }
  39. static void _setup_qdss_ops(struct sde_hw_qdss_ops *ops)
  40. {
  41. ops->enable_qdss_events = sde_hw_qdss_enable_qdss_events;
  42. }
  43. static struct sde_hw_blk_ops sde_hw_ops = {
  44. .start = NULL,
  45. .stop = NULL,
  46. };
  47. struct sde_hw_qdss *sde_hw_qdss_init(enum sde_qdss idx,
  48. void __iomem *addr,
  49. struct sde_mdss_cfg *m)
  50. {
  51. struct sde_hw_qdss *c;
  52. struct sde_qdss_cfg *cfg;
  53. int rc;
  54. c = kzalloc(sizeof(*c), GFP_KERNEL);
  55. if (!c)
  56. return ERR_PTR(-ENOMEM);
  57. cfg = _qdss_offset(idx, m, addr, &c->hw);
  58. if (IS_ERR_OR_NULL(cfg)) {
  59. kfree(c);
  60. return ERR_PTR(-EINVAL);
  61. }
  62. c->idx = idx;
  63. c->caps = cfg;
  64. _setup_qdss_ops(&c->ops);
  65. rc = sde_hw_blk_init(&c->base, SDE_HW_BLK_QDSS, idx, &sde_hw_ops);
  66. if (rc) {
  67. SDE_ERROR("failed to init hw blk %d\n", rc);
  68. kzfree(c);
  69. return ERR_PTR(rc);
  70. }
  71. sde_dbg_reg_register_dump_range(SDE_DBG_NAME, cfg->name, c->hw.blk_off,
  72. c->hw.blk_off + c->hw.length, c->hw.xin_id);
  73. return c;
  74. }
  75. void sde_hw_qdss_destroy(struct sde_hw_qdss *qdss)
  76. {
  77. if (qdss)
  78. sde_hw_blk_destroy(&qdss->base);
  79. kfree(qdss);
  80. }