drivers/gpu/drm/msm/adreno/adreno_device.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/msm/adreno/adreno_device.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/msm/adreno/adreno_device.c
Extension
.c
Size
10207 bytes
Lines
434
Domain
Driver Families
Bucket
drivers/gpu
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

sscanf(compat, "amd,imageon-%u.%u", &r, &patch) == 2) {
			uint32_t core, major, minor;

			core = r / 100;
			r %= 100;
			major = r / 10;
			r %= 10;
			minor = r;

			*chipid = (core << 24) |
				(major << 16) |
				(minor << 8) |
				patch;

			return 0;
		}

		if (sscanf(compat, "qcom,adreno-%08x", chipid) == 1)
			return 0;
	}

	/* and if that fails, fall back to legacy "qcom,chipid" property: */
	ret = of_property_read_u32(node, "qcom,chipid", chipid);
	if (ret) {
		DRM_ERROR("%pOF: could not parse qcom,chipid: %d\n",
			  node, ret);
		return ret;
	}

	pr_warn("%pOF: Using legacy qcom,chipid binding!\n", node);

	return 0;
}

bool adreno_has_gpu(struct device_node *node)
{
	const struct adreno_info *info;
	uint32_t chip_id;
	int ret;

	if (skip_gpu)
		return false;

	ret = find_chipid(node, &chip_id);
	if (ret)
		return false;

	info = adreno_info(chip_id);
	if (!info) {
		pr_warn("%pOF: Unknown GPU revision: %"ADRENO_CHIPID_FMT"\n",
			node, ADRENO_CHIPID_ARGS(chip_id));
		return false;
	}

	return true;
}

static int adreno_bind(struct device *dev, struct device *master, void *data)
{
	static struct adreno_platform_config config = {};
	const struct adreno_info *info;
	struct msm_drm_private *priv = dev_get_drvdata(master);
	struct drm_device *drm = priv->dev;
	struct msm_gpu *gpu;
	int ret;

	ret = find_chipid(dev->of_node, &config.chip_id);
	/* We shouldn't have gotten this far if we can't parse the chip_id */
	if (WARN_ON(ret))
		return ret;

	dev->platform_data = &config;
	priv->gpu_pdev = to_platform_device(dev);

	info = adreno_info(config.chip_id);
	/* We shouldn't have gotten this far if we don't recognize the GPU: */
	if (WARN_ON(!info))
		return -ENXIO;

	config.info = info;

	DBG("Found GPU: %"ADRENO_CHIPID_FMT, ADRENO_CHIPID_ARGS(config.chip_id));

	priv->is_a2xx = info->family < ADRENO_3XX;
	priv->has_cached_coherent =
		!!(info->quirks & ADRENO_QUIRK_HAS_CACHED_COHERENT);

	gpu = info->funcs->init(drm);
	if (IS_ERR(gpu)) {
		dev_warn(drm->dev, "failed to load adreno gpu\n");

Annotation

Implementation Notes