Path: blob/master/drivers/gpu/host1x/hw/debug_hw_1x06.c
26494 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Copyright (C) 2010 Google, Inc.3* Author: Erik Gilling <[email protected]>4*5* Copyright (C) 2011-2017 NVIDIA Corporation6*/78#include "../dev.h"9#include "../debug.h"10#include "../cdma.h"11#include "../channel.h"1213static void host1x_debug_show_channel_cdma(struct host1x *host,14struct host1x_channel *ch,15struct output *o)16{17struct host1x_cdma *cdma = &ch->cdma;18dma_addr_t dmastart = 0, dmaend = 0;19u32 dmaput, dmaget, dmactrl;20u32 offset, class;21u32 ch_stat;2223#if defined(CONFIG_ARCH_DMA_ADDR_T_64BIT) && HOST1X_HW >= 624dmastart = host1x_ch_readl(ch, HOST1X_CHANNEL_DMASTART_HI);25dmastart <<= 32;26#endif27dmastart |= host1x_ch_readl(ch, HOST1X_CHANNEL_DMASTART);2829#if defined(CONFIG_ARCH_DMA_ADDR_T_64BIT) && HOST1X_HW >= 630dmaend = host1x_ch_readl(ch, HOST1X_CHANNEL_DMAEND_HI);31dmaend <<= 32;32#endif33dmaend |= host1x_ch_readl(ch, HOST1X_CHANNEL_DMAEND);3435dmaput = host1x_ch_readl(ch, HOST1X_CHANNEL_DMAPUT);36dmaget = host1x_ch_readl(ch, HOST1X_CHANNEL_DMAGET);37dmactrl = host1x_ch_readl(ch, HOST1X_CHANNEL_DMACTRL);38offset = host1x_ch_readl(ch, HOST1X_CHANNEL_CMDP_OFFSET);39class = host1x_ch_readl(ch, HOST1X_CHANNEL_CMDP_CLASS);40ch_stat = host1x_ch_readl(ch, HOST1X_CHANNEL_CHANNELSTAT);4142host1x_debug_output(o, "%u-%s: ", ch->id, dev_name(ch->dev));4344if (dmactrl & HOST1X_CHANNEL_DMACTRL_DMASTOP ||45!ch->cdma.push_buffer.mapped) {46host1x_debug_output(o, "inactive\n\n");47return;48}4950if (class == HOST1X_CLASS_HOST1X && offset == HOST1X_UCLASS_WAIT_SYNCPT)51host1x_debug_output(o, "waiting on syncpt\n");52else53host1x_debug_output(o, "active class %02x, offset %04x\n",54class, offset);5556host1x_debug_output(o, "DMASTART %pad, DMAEND %pad\n", &dmastart, &dmaend);57host1x_debug_output(o, "DMAPUT %08x DMAGET %08x DMACTL %08x\n",58dmaput, dmaget, dmactrl);59host1x_debug_output(o, "CHANNELSTAT %02x\n", ch_stat);6061show_channel_gathers(o, cdma);62host1x_debug_output(o, "\n");63}6465static void host1x_debug_show_channel_fifo(struct host1x *host,66struct host1x_channel *ch,67struct output *o)68{69#if HOST1X_HW <= 670u32 rd_ptr, wr_ptr, start, end;71u32 payload = INVALID_PAYLOAD;72unsigned int data_count = 0;73#endif74u32 val;7576host1x_debug_output(o, "%u: fifo:\n", ch->id);7778val = host1x_ch_readl(ch, HOST1X_CHANNEL_CMDFIFO_STAT);79host1x_debug_output(o, "CMDFIFO_STAT %08x\n", val);80if (val & HOST1X_CHANNEL_CMDFIFO_STAT_EMPTY) {81host1x_debug_output(o, "[empty]\n");82return;83}8485val = host1x_ch_readl(ch, HOST1X_CHANNEL_CMDFIFO_RDATA);86host1x_debug_output(o, "CMDFIFO_RDATA %08x\n", val);8788#if HOST1X_HW <= 689/* Peek pointer values are invalid during SLCG, so disable it */90host1x_hypervisor_writel(host, 0x1, HOST1X_HV_ICG_EN_OVERRIDE);9192val = 0;93val |= HOST1X_HV_CMDFIFO_PEEK_CTRL_ENABLE;94val |= HOST1X_HV_CMDFIFO_PEEK_CTRL_CHANNEL(ch->id);95host1x_hypervisor_writel(host, val, HOST1X_HV_CMDFIFO_PEEK_CTRL);9697val = host1x_hypervisor_readl(host, HOST1X_HV_CMDFIFO_PEEK_PTRS);98rd_ptr = HOST1X_HV_CMDFIFO_PEEK_PTRS_RD_PTR_V(val);99wr_ptr = HOST1X_HV_CMDFIFO_PEEK_PTRS_WR_PTR_V(val);100101val = host1x_hypervisor_readl(host, HOST1X_HV_CMDFIFO_SETUP(ch->id));102start = HOST1X_HV_CMDFIFO_SETUP_BASE_V(val);103end = HOST1X_HV_CMDFIFO_SETUP_LIMIT_V(val);104105do {106val = 0;107val |= HOST1X_HV_CMDFIFO_PEEK_CTRL_ENABLE;108val |= HOST1X_HV_CMDFIFO_PEEK_CTRL_CHANNEL(ch->id);109val |= HOST1X_HV_CMDFIFO_PEEK_CTRL_ADDR(rd_ptr);110host1x_hypervisor_writel(host, val,111HOST1X_HV_CMDFIFO_PEEK_CTRL);112113val = host1x_hypervisor_readl(host,114HOST1X_HV_CMDFIFO_PEEK_READ);115116if (!data_count) {117host1x_debug_output(o, "%03x 0x%08x: ",118rd_ptr - start, val);119data_count = show_channel_command(o, val, &payload);120} else {121host1x_debug_cont(o, "%08x%s", val,122data_count > 1 ? ", " : "])\n");123data_count--;124}125126if (rd_ptr == end)127rd_ptr = start;128else129rd_ptr++;130} while (rd_ptr != wr_ptr);131132if (data_count)133host1x_debug_cont(o, ", ...])\n");134host1x_debug_output(o, "\n");135136host1x_hypervisor_writel(host, 0x0, HOST1X_HV_CMDFIFO_PEEK_CTRL);137host1x_hypervisor_writel(host, 0x0, HOST1X_HV_ICG_EN_OVERRIDE);138#endif139}140141static void host1x_debug_show_mlocks(struct host1x *host, struct output *o)142{143/* TODO */144}145146147