1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2010 Google, Inc.
4 * Author: Erik Gilling <konkers@android.com>
6 * Copyright (C) 2011-2013 NVIDIA Corporation
12 #include "../channel.h"
14 static void host1x_debug_show_channel_cdma(struct host1x
*host
,
15 struct host1x_channel
*ch
,
18 struct host1x_cdma
*cdma
= &ch
->cdma
;
19 dma_addr_t dmastart
, dmaend
;
20 u32 dmaput
, dmaget
, dmactrl
;
22 u32 val
, base
, baseval
;
24 dmastart
= host1x_ch_readl(ch
, HOST1X_CHANNEL_DMASTART
);
25 dmaend
= host1x_ch_readl(ch
, HOST1X_CHANNEL_DMAEND
);
26 dmaput
= host1x_ch_readl(ch
, HOST1X_CHANNEL_DMAPUT
);
27 dmaget
= host1x_ch_readl(ch
, HOST1X_CHANNEL_DMAGET
);
28 dmactrl
= host1x_ch_readl(ch
, HOST1X_CHANNEL_DMACTRL
);
29 cbread
= host1x_sync_readl(host
, HOST1X_SYNC_CBREAD(ch
->id
));
30 cbstat
= host1x_sync_readl(host
, HOST1X_SYNC_CBSTAT(ch
->id
));
32 host1x_debug_output(o
, "%u-%s: ", ch
->id
, dev_name(ch
->dev
));
34 if (HOST1X_CHANNEL_DMACTRL_DMASTOP_V(dmactrl
) ||
35 !ch
->cdma
.push_buffer
.mapped
) {
36 host1x_debug_output(o
, "inactive\n\n");
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;
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
,
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
),
62 host1x_debug_output(o
, "DMASTART %pad, DMAEND %pad\n", &dmastart
, &dmaend
);
63 host1x_debug_output(o
, "DMAPUT %08x DMAGET %08x DMACTL %08x\n",
64 dmaput
, dmaget
, dmactrl
);
65 host1x_debug_output(o
, "CBREAD %08x CBSTAT %08x\n", cbread
, cbstat
);
67 show_channel_gathers(o
, cdma
);
68 host1x_debug_output(o
, "\n");
71 static void host1x_debug_show_channel_fifo(struct host1x
*host
,
72 struct host1x_channel
*ch
,
75 u32 val
, rd_ptr
, wr_ptr
, start
, end
;
76 unsigned int data_count
= 0;
78 host1x_debug_output(o
, "%u: fifo:\n", ch
->id
);
80 val
= host1x_ch_readl(ch
, HOST1X_CHANNEL_FIFOSTAT
);
81 host1x_debug_output(o
, "FIFOSTAT %08x\n", val
);
82 if (HOST1X_CHANNEL_FIFOSTAT_CFEMPTY_V(val
)) {
83 host1x_debug_output(o
, "[empty]\n");
87 host1x_sync_writel(host
, 0x0, HOST1X_SYNC_CFPEEK_CTRL
);
88 host1x_sync_writel(host
, HOST1X_SYNC_CFPEEK_CTRL_ENA_F(1) |
89 HOST1X_SYNC_CFPEEK_CTRL_CHANNR_F(ch
->id
),
90 HOST1X_SYNC_CFPEEK_CTRL
);
92 val
= host1x_sync_readl(host
, HOST1X_SYNC_CFPEEK_PTRS
);
93 rd_ptr
= HOST1X_SYNC_CFPEEK_PTRS_CF_RD_PTR_V(val
);
94 wr_ptr
= HOST1X_SYNC_CFPEEK_PTRS_CF_WR_PTR_V(val
);
96 val
= host1x_sync_readl(host
, HOST1X_SYNC_CF_SETUP(ch
->id
));
97 start
= HOST1X_SYNC_CF_SETUP_BASE_V(val
);
98 end
= HOST1X_SYNC_CF_SETUP_LIMIT_V(val
);
101 host1x_sync_writel(host
, 0x0, HOST1X_SYNC_CFPEEK_CTRL
);
102 host1x_sync_writel(host
, HOST1X_SYNC_CFPEEK_CTRL_ENA_F(1) |
103 HOST1X_SYNC_CFPEEK_CTRL_CHANNR_F(ch
->id
) |
104 HOST1X_SYNC_CFPEEK_CTRL_ADDR_F(rd_ptr
),
105 HOST1X_SYNC_CFPEEK_CTRL
);
106 val
= host1x_sync_readl(host
, HOST1X_SYNC_CFPEEK_READ
);
109 host1x_debug_output(o
, "%08x: ", val
);
110 data_count
= show_channel_command(o
, val
, NULL
);
112 host1x_debug_cont(o
, "%08x%s", val
,
113 data_count
> 1 ? ", " : "])\n");
121 } while (rd_ptr
!= wr_ptr
);
124 host1x_debug_cont(o
, ", ...])\n");
125 host1x_debug_output(o
, "\n");
127 host1x_sync_writel(host
, 0x0, HOST1X_SYNC_CFPEEK_CTRL
);
130 static void host1x_debug_show_mlocks(struct host1x
*host
, struct output
*o
)
134 host1x_debug_output(o
, "---- mlocks ----\n");
136 for (i
= 0; i
< host1x_syncpt_nb_mlocks(host
); i
++) {
138 host1x_sync_readl(host
, HOST1X_SYNC_MLOCK_OWNER(i
));
139 if (HOST1X_SYNC_MLOCK_OWNER_CH_OWNS_V(owner
))
140 host1x_debug_output(o
, "%u: locked by channel %u\n",
141 i
, HOST1X_SYNC_MLOCK_OWNER_CHID_V(owner
));
142 else if (HOST1X_SYNC_MLOCK_OWNER_CPU_OWNS_V(owner
))
143 host1x_debug_output(o
, "%u: locked by cpu\n", i
);
145 host1x_debug_output(o
, "%u: unlocked\n", i
);
148 host1x_debug_output(o
, "\n");