Unverified Commit cb56cd61 authored by Sarah Walker's avatar Sarah Walker Committed by Maxime Ripard
Browse files

drm/imagination: Add firmware trace to debugfs



Firmware trace is exposed at /sys/debug/dri/<dev_nr>/pvr_fw/trace_0.
Trace is enabled via the group mask at
/sys/debug/dri/<dev_nr>/pvr_params/fw_trace_mask.

Changes since v8:
- Corrected license identifiers

Changes since v3:
- Use drm_dev_{enter,exit}

Co-developed-by: default avatarMatt Coster <matt.coster@imgtec.com>
Signed-off-by: default avatarMatt Coster <matt.coster@imgtec.com>
Signed-off-by: default avatarSarah Walker <sarah.walker@imgtec.com>
Signed-off-by: default avatarDonald Robson <donald.robson@imgtec.com>
Link: https://lore.kernel.org/r/009cf9fee347fa96c8a665dc368fc54a5ffceff0.1700668843.git.donald.robson@imgtec.com


Signed-off-by: default avatarMaxime Ripard <mripard@kernel.org>
parent 6b17baab
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ powervr-y := \
	pvr_hwrt.o \
	pvr_job.o \
	pvr_mmu.o \
	pvr_params.o \
	pvr_power.o \
	pvr_queue.o \
	pvr_stream.o \
@@ -28,4 +29,7 @@ powervr-y := \
	pvr_vm.o \
	pvr_vm_mips.o

powervr-$(CONFIG_DEBUG_FS) += \
	pvr_debugfs.o

obj-$(CONFIG_DRM_POWERVR) += powervr.o
+53 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only OR MIT
/* Copyright (c) 2023 Imagination Technologies Ltd. */

#include "pvr_debugfs.h"

#include "pvr_device.h"
#include "pvr_fw_trace.h"
#include "pvr_params.h"

#include <linux/dcache.h>
#include <linux/debugfs.h>
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/types.h>

#include <drm/drm_device.h>
#include <drm/drm_file.h>
#include <drm/drm_print.h>

static const struct pvr_debugfs_entry pvr_debugfs_entries[] = {
	{"pvr_params", pvr_params_debugfs_init},
	{"pvr_fw", pvr_fw_trace_debugfs_init},
};

void
pvr_debugfs_init(struct drm_minor *minor)
{
	struct drm_device *drm_dev = minor->dev;
	struct pvr_device *pvr_dev = to_pvr_device(drm_dev);
	struct dentry *root = minor->debugfs_root;
	size_t i;

	for (i = 0; i < ARRAY_SIZE(pvr_debugfs_entries); ++i) {
		const struct pvr_debugfs_entry *entry = &pvr_debugfs_entries[i];
		struct dentry *dir;

		dir = debugfs_create_dir(entry->name, root);
		if (IS_ERR(dir)) {
			drm_warn(drm_dev,
				 "failed to create debugfs dir '%s' (err=%d)",
				 entry->name, (int)PTR_ERR(dir));
			continue;
		}

		entry->init(pvr_dev, dir);
	}
}

/*
 * Since all entries are created under &drm_minor->debugfs_root, there's no
 * need for a pvr_debugfs_fini() as DRM will clean up everything under its root
 * automatically.
 */
+29 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
/* Copyright (c) 2023 Imagination Technologies Ltd. */

#ifndef PVR_DEBUGFS_H
#define PVR_DEBUGFS_H

/* Forward declaration from <drm/drm_drv.h>. */
struct drm_minor;

#if defined(CONFIG_DEBUG_FS)
/* Forward declaration from "pvr_device.h". */
struct pvr_device;

/* Forward declaration from <linux/dcache.h>. */
struct dentry;

struct pvr_debugfs_entry {
	const char *name;
	void (*init)(struct pvr_device *pvr_dev, struct dentry *dir);
};

void pvr_debugfs_init(struct drm_minor *minor);
#else /* defined(CONFIG_DEBUG_FS) */
#include <linux/compiler_attributes.h>

static __always_inline void pvr_debugfs_init(struct drm_minor *minor) {}
#endif /* defined(CONFIG_DEBUG_FS) */

#endif /* PVR_DEBUGFS_H */
+9 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include "pvr_device_info.h"

#include "pvr_fw.h"
#include "pvr_params.h"
#include "pvr_power.h"
#include "pvr_queue.h"
#include "pvr_rogue_cr_defs.h"
@@ -495,6 +496,14 @@ pvr_device_init(struct pvr_device *pvr_dev)
	struct device *dev = drm_dev->dev;
	int err;

	/*
	 * Setup device parameters. We do this first in case other steps
	 * depend on them.
	 */
	err = pvr_device_params_init(&pvr_dev->params);
	if (err)
		return err;

	/* Enable and initialize clocks required for the device to operate. */
	err = pvr_device_clk_init(pvr_dev);
	if (err)
+10 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include "pvr_ccb.h"
#include "pvr_device_info.h"
#include "pvr_fw.h"
#include "pvr_params.h"
#include "pvr_rogue_fwif_stream.h"
#include "pvr_stream.h"

@@ -148,6 +149,15 @@ struct pvr_device {
	/** @fw_dev: Firmware related data. */
	struct pvr_fw_device fw_dev;

	/**
	 * @params: Device-specific parameters.
	 *
	 *          The values of these parameters are initialized from the
	 *          defaults specified as module parameters. They may be
	 *          modified at runtime via debugfs (if enabled).
	 */
	struct pvr_device_params params;

	/** @stream_musthave_quirks: Bit array of "must-have" quirks for stream commands. */
	u32 stream_musthave_quirks[PVR_STREAM_TYPE_MAX][PVR_STREAM_EXTHDR_TYPE_MAX];

Loading