brintos

brintos / linux-shallow public Read only

0
0
Text · 4.6 KiB · 85242a5 Raw
150 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (C) 2010 Google, Inc.4 * Author: Erik Gilling <konkers@android.com>5 *6 * Copyright (C) 2011-2013 NVIDIA Corporation7 */8 9#include "../dev.h"10#include "../debug.h"11#include "../cdma.h"12#include "../channel.h"13 14static void host1x_debug_show_channel_cdma(struct host1x *host,15					   struct host1x_channel *ch,16					   struct output *o)17{18	struct host1x_cdma *cdma = &ch->cdma;19	dma_addr_t dmastart, dmaend;20	u32 dmaput, dmaget, dmactrl;21	u32 cbstat, cbread;22	u32 val, base, baseval;23 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));31 32	host1x_debug_output(o, "%u-%s: ", ch->id, dev_name(ch->dev));33 34	if (HOST1X_CHANNEL_DMACTRL_DMASTOP_V(dmactrl) ||35	    !ch->cdma.push_buffer.mapped) {36		host1x_debug_output(o, "inactive\n\n");37		return;38	}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	} else57		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 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);66 67	show_channel_gathers(o, cdma);68	host1x_debug_output(o, "\n");69}70 71static void host1x_debug_show_channel_fifo(struct host1x *host,72					   struct host1x_channel *ch,73					   struct output *o)74{75	u32 val, rd_ptr, wr_ptr, start, end;76	unsigned int data_count = 0;77 78	host1x_debug_output(o, "%u: fifo:\n", ch->id);79 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");84		return;85	}86 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);91 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);95 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);99 100	do {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);107 108		if (!data_count) {109			host1x_debug_output(o, "%08x: ", val);110			data_count = show_channel_command(o, val, NULL);111		} else {112			host1x_debug_cont(o, "%08x%s", val,113					  data_count > 1 ? ", " : "])\n");114			data_count--;115		}116 117		if (rd_ptr == end)118			rd_ptr = start;119		else120			rd_ptr++;121	} while (rd_ptr != wr_ptr);122 123	if (data_count)124		host1x_debug_cont(o, ", ...])\n");125	host1x_debug_output(o, "\n");126 127	host1x_sync_writel(host, 0x0, HOST1X_SYNC_CFPEEK_CTRL);128}129 130static void host1x_debug_show_mlocks(struct host1x *host, struct output *o)131{132	unsigned int i;133 134	host1x_debug_output(o, "---- mlocks ----\n");135 136	for (i = 0; i < host1x_syncpt_nb_mlocks(host); i++) {137		u32 owner =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);144		else145			host1x_debug_output(o, "%u: unlocked\n", i);146	}147 148	host1x_debug_output(o, "\n");149}150