drivers/gpu/drm/loongson/lsdc_ttm.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/loongson/lsdc_ttm.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/loongson/lsdc_ttm.c
Extension
.c
Size
12671 bytes
Lines
590
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

// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2023 Loongson Technology Corporation Limited
 */

#include <drm/drm_drv.h>
#include <drm/drm_file.h>
#include <drm/drm_gem.h>
#include <drm/drm_managed.h>
#include <drm/drm_prime.h>
#include <drm/drm_print.h>

#include "lsdc_drv.h"
#include "lsdc_ttm.h"

const char *lsdc_mem_type_to_str(uint32_t mem_type)
{
	switch (mem_type) {
	case TTM_PL_VRAM:
		return "VRAM";
	case TTM_PL_TT:
		return "GTT";
	case TTM_PL_SYSTEM:
		return "SYSTEM";
	default:
		break;
	}

	return "Unknown";
}

const char *lsdc_domain_to_str(u32 domain)
{
	switch (domain) {
	case LSDC_GEM_DOMAIN_VRAM:
		return "VRAM";
	case LSDC_GEM_DOMAIN_GTT:
		return "GTT";
	case LSDC_GEM_DOMAIN_SYSTEM:
		return "SYSTEM";
	default:
		break;
	}

	return "Unknown";
}

static void lsdc_bo_set_placement(struct lsdc_bo *lbo, u32 domain)
{
	u32 c = 0;
	u32 pflags = 0;
	u32 i;

	if (lbo->tbo.base.size <= PAGE_SIZE)
		pflags |= TTM_PL_FLAG_TOPDOWN;

	lbo->placement.placement = lbo->placements;

	if (domain & LSDC_GEM_DOMAIN_VRAM) {
		lbo->placements[c].mem_type = TTM_PL_VRAM;
		lbo->placements[c++].flags = pflags;
	}

	if (domain & LSDC_GEM_DOMAIN_GTT) {
		lbo->placements[c].mem_type = TTM_PL_TT;
		lbo->placements[c++].flags = pflags;
	}

	if (domain & LSDC_GEM_DOMAIN_SYSTEM) {
		lbo->placements[c].mem_type = TTM_PL_SYSTEM;
		lbo->placements[c++].flags = 0;
	}

	if (!c) {
		lbo->placements[c].mem_type = TTM_PL_SYSTEM;
		lbo->placements[c++].flags = 0;
	}

	lbo->placement.num_placement = c;

	for (i = 0; i < c; ++i) {
		lbo->placements[i].fpfn = 0;
		lbo->placements[i].lpfn = 0;
	}
}

static void lsdc_ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *tt)
{
	ttm_tt_fini(tt);
	kfree(tt);

Annotation

Implementation Notes