drivers/soc/tegra/cbb/tegra-cbb.c

Source file repositories/reference/linux-study-clean/drivers/soc/tegra/cbb/tegra-cbb.c

File Facts

System
Linux kernel
Corpus path
drivers/soc/tegra/cbb/tegra-cbb.c
Extension
.c
Size
3494 bytes
Lines
159
Domain
Driver Families
Bucket
drivers/soc
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved
 */

#include <linux/clk.h>
#include <linux/cpufeature.h>
#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <soc/tegra/fuse.h>
#include <soc/tegra/tegra-cbb.h>

void tegra_cbb_print_err(struct seq_file *file, const char *fmt, ...)
{
	struct va_format vaf;
	va_list args;

	va_start(args, fmt);

	if (file) {
		seq_vprintf(file, fmt, args);
	} else {
		vaf.fmt = fmt;
		vaf.va = &args;
		pr_crit("%pV", &vaf);
	}

	va_end(args);
}

void tegra_cbb_print_cache(struct seq_file *file, u32 cache)
{
	const char *buff_str, *mod_str, *rd_str, *wr_str;

	buff_str = (cache & BIT(0)) ? "Bufferable " : "";
	mod_str = (cache & BIT(1)) ? "Modifiable " : "";
	rd_str = (cache & BIT(2)) ? "Read-Allocate " : "";
	wr_str = (cache & BIT(3)) ? "Write-Allocate" : "";

	if (cache == 0x0)
		buff_str = "Device Non-Bufferable";

	tegra_cbb_print_err(file, "\t  Cache\t\t\t: 0x%x -- %s%s%s%s\n",
			    cache, buff_str, mod_str, rd_str, wr_str);
}

void tegra_cbb_print_prot(struct seq_file *file, u32 prot)
{
	const char *data_str, *secure_str, *priv_str;

	data_str = (prot & 0x4) ? "Instruction" : "Data";
	secure_str = (prot & 0x2) ? "Non-Secure" : "Secure";
	priv_str = (prot & 0x1) ? "Privileged" : "Unprivileged";

	tegra_cbb_print_err(file, "\t  Protection\t\t: 0x%x -- %s, %s, %s Access\n",
			    prot, priv_str, secure_str, data_str);
}

static int tegra_cbb_err_show(struct seq_file *file, void *data)
{
	struct tegra_cbb *cbb = file->private;

	return cbb->ops->debugfs_show(cbb, file, data);
}
DEFINE_SHOW_ATTRIBUTE(tegra_cbb_err);

static void tegra_cbb_err_debugfs_init(struct tegra_cbb *cbb)
{
	static struct dentry *root;

	if (!root)
		root = debugfs_create_file("tegra_cbb_err", 0444, NULL, cbb, &tegra_cbb_err_fops);
}

void tegra_cbb_stall_enable(struct tegra_cbb *cbb)
{
	if (cbb->ops->stall_enable)
		cbb->ops->stall_enable(cbb);
}

void tegra_cbb_fault_enable(struct tegra_cbb *cbb)
{
	if (cbb->ops->fault_enable)
		cbb->ops->fault_enable(cbb);
}

Annotation

Implementation Notes