debug_hw_1x01.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Copyright (C) 2010 Google, Inc.
  3. * Author: Erik Gilling <konkers@android.com>
  4. *
  5. * Copyright (C) 2011-2013 NVIDIA Corporation
  6. *
  7. * This software is licensed under the terms of the GNU General Public
  8. * License version 2, as published by the Free Software Foundation, and
  9. * may be copied, distributed, and modified under those terms.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. */
  17. #include "../dev.h"
  18. #include "../debug.h"
  19. #include "../cdma.h"
  20. #include "../channel.h"
  21. static void host1x_debug_show_channel_cdma(struct host1x *host,
  22. struct host1x_channel *ch,
  23. struct output *o)
  24. {
  25. struct host1x_cdma *cdma = &ch->cdma;
  26. u32 dmaput, dmaget, dmactrl;
  27. u32 cbstat, cbread;
  28. u32 val, base, baseval;
  29. dmaput = host1x_ch_readl(ch, HOST1X_CHANNEL_DMAPUT);
  30. dmaget = host1x_ch_readl(ch, HOST1X_CHANNEL_DMAGET);
  31. dmactrl = host1x_ch_readl(ch, HOST1X_CHANNEL_DMACTRL);
  32. cbread = host1x_sync_readl(host, HOST1X_SYNC_CBREAD(ch->id));
  33. cbstat = host1x_sync_readl(host, HOST1X_SYNC_CBSTAT(ch->id));
  34. host1x_debug_output(o, "%u-%s: ", ch->id, dev_name(ch->dev));
  35. if (HOST1X_CHANNEL_DMACTRL_DMASTOP_V(dmactrl) ||
  36. !ch->cdma.push_buffer.mapped) {
  37. host1x_debug_output(o, "inactive\n\n");
  38. return;
  39. }
  40. if (HOST1X_SYNC_CBSTAT_CBCLASS_V(cbstat) == HOST1X_CLASS_HOST1X &&
  41. HOST1X_SYNC_CBSTAT_CBOFFSET_V(cbstat) ==
  42. HOST1X_UCLASS_WAIT_SYNCPT)
  43. host1x_debug_output(o, "waiting on syncpt %d val %d\n",
  44. cbread >> 24, cbread & 0xffffff);
  45. else if (HOST1X_SYNC_CBSTAT_CBCLASS_V(cbstat) ==
  46. HOST1X_CLASS_HOST1X &&
  47. HOST1X_SYNC_CBSTAT_CBOFFSET_V(cbstat) ==
  48. HOST1X_UCLASS_WAIT_SYNCPT_BASE) {
  49. base = (cbread >> 16) & 0xff;
  50. baseval =
  51. host1x_sync_readl(host, HOST1X_SYNC_SYNCPT_BASE(base));
  52. val = cbread & 0xffff;
  53. host1x_debug_output(o, "waiting on syncpt %d val %d (base %d = %d; offset = %d)\n",
  54. cbread >> 24, baseval + val, base,
  55. baseval, val);
  56. } else
  57. host1x_debug_output(o, "active class %02x, offset %04x, val %08x\n",
  58. HOST1X_SYNC_CBSTAT_CBCLASS_V(cbstat),
  59. HOST1X_SYNC_CBSTAT_CBOFFSET_V(cbstat),
  60. cbread);
  61. host1x_debug_output(o, "DMAPUT %08x, DMAGET %08x, DMACTL %08x\n",
  62. dmaput, dmaget, dmactrl);
  63. host1x_debug_output(o, "CBREAD %08x, CBSTAT %08x\n", cbread, cbstat);
  64. show_channel_gathers(o, cdma);
  65. host1x_debug_output(o, "\n");
  66. }
  67. static void host1x_debug_show_channel_fifo(struct host1x *host,
  68. struct host1x_channel *ch,
  69. struct output *o)
  70. {
  71. u32 val, rd_ptr, wr_ptr, start, end;
  72. unsigned int data_count = 0;
  73. host1x_debug_output(o, "%u: fifo:\n", ch->id);
  74. val = host1x_ch_readl(ch, HOST1X_CHANNEL_FIFOSTAT);
  75. host1x_debug_output(o, "FIFOSTAT %08x\n", val);
  76. if (HOST1X_CHANNEL_FIFOSTAT_CFEMPTY_V(val)) {
  77. host1x_debug_output(o, "[empty]\n");
  78. return;
  79. }
  80. host1x_sync_writel(host, 0x0, HOST1X_SYNC_CFPEEK_CTRL);
  81. host1x_sync_writel(host, HOST1X_SYNC_CFPEEK_CTRL_ENA_F(1) |
  82. HOST1X_SYNC_CFPEEK_CTRL_CHANNR_F(ch->id),
  83. HOST1X_SYNC_CFPEEK_CTRL);
  84. val = host1x_sync_readl(host, HOST1X_SYNC_CFPEEK_PTRS);
  85. rd_ptr = HOST1X_SYNC_CFPEEK_PTRS_CF_RD_PTR_V(val);
  86. wr_ptr = HOST1X_SYNC_CFPEEK_PTRS_CF_WR_PTR_V(val);
  87. val = host1x_sync_readl(host, HOST1X_SYNC_CF_SETUP(ch->id));
  88. start = HOST1X_SYNC_CF_SETUP_BASE_V(val);
  89. end = HOST1X_SYNC_CF_SETUP_LIMIT_V(val);
  90. do {
  91. host1x_sync_writel(host, 0x0, HOST1X_SYNC_CFPEEK_CTRL);
  92. host1x_sync_writel(host, HOST1X_SYNC_CFPEEK_CTRL_ENA_F(1) |
  93. HOST1X_SYNC_CFPEEK_CTRL_CHANNR_F(ch->id) |
  94. HOST1X_SYNC_CFPEEK_CTRL_ADDR_F(rd_ptr),
  95. HOST1X_SYNC_CFPEEK_CTRL);
  96. val = host1x_sync_readl(host, HOST1X_SYNC_CFPEEK_READ);
  97. if (!data_count) {
  98. host1x_debug_output(o, "%08x: ", val);
  99. data_count = show_channel_command(o, val);
  100. } else {
  101. host1x_debug_cont(o, "%08x%s", val,
  102. data_count > 1 ? ", " : "])\n");
  103. data_count--;
  104. }
  105. if (rd_ptr == end)
  106. rd_ptr = start;
  107. else
  108. rd_ptr++;
  109. } while (rd_ptr != wr_ptr);
  110. if (data_count)
  111. host1x_debug_cont(o, ", ...])\n");
  112. host1x_debug_output(o, "\n");
  113. host1x_sync_writel(host, 0x0, HOST1X_SYNC_CFPEEK_CTRL);
  114. }
  115. static void host1x_debug_show_mlocks(struct host1x *host, struct output *o)
  116. {
  117. unsigned int i;
  118. host1x_debug_output(o, "---- mlocks ----\n");
  119. for (i = 0; i < host1x_syncpt_nb_mlocks(host); i++) {
  120. u32 owner =
  121. host1x_sync_readl(host, HOST1X_SYNC_MLOCK_OWNER(i));
  122. if (HOST1X_SYNC_MLOCK_OWNER_CH_OWNS_V(owner))
  123. host1x_debug_output(o, "%u: locked by channel %u\n",
  124. i, HOST1X_SYNC_MLOCK_OWNER_CHID_V(owner));
  125. else if (HOST1X_SYNC_MLOCK_OWNER_CPU_OWNS_V(owner))
  126. host1x_debug_output(o, "%u: locked by cpu\n", i);
  127. else
  128. host1x_debug_output(o, "%u: unlocked\n", i);
  129. }
  130. host1x_debug_output(o, "\n");
  131. }