drivers/gpu/drm/xe/xe_map.h

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/xe_map.h

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/xe/xe_map.h
Extension
.h
Size
2662 bytes
Lines
94
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

#ifndef _XE_MAP_H_
#define _XE_MAP_H_

#include <linux/iosys-map.h>

#include <xe_device.h>

/**
 * DOC: Map layer
 *
 * All access to any memory shared with a device (both sysmem and vram) in the
 * Xe driver should go through this layer (xe_map). This layer is built on top
 * of :ref:`driver-api/device-io:Generalizing Access to System and I/O Memory`
 * and with extra hooks into the Xe driver that allows adding asserts to memory
 * accesses (e.g. for blocking runtime_pm D3Cold on Discrete Graphics).
 */

static inline void xe_map_memcpy_to(struct xe_device *xe, struct iosys_map *dst,
				    size_t dst_offset, const void *src,
				    size_t len)
{
	xe_device_assert_mem_access(xe);
	iosys_map_memcpy_to(dst, dst_offset, src, len);
}

static inline void xe_map_memcpy_from(struct xe_device *xe, void *dst,
				      const struct iosys_map *src,
				      size_t src_offset, size_t len)
{
	xe_device_assert_mem_access(xe);
	iosys_map_memcpy_from(dst, src, src_offset, len);
}

static inline void xe_map_memset(struct xe_device *xe,
				 struct iosys_map *dst, size_t offset,
				 int value, size_t len)
{
	xe_device_assert_mem_access(xe);
	iosys_map_memset(dst, offset, value, len);
}

/* FIXME: We likely should kill these two functions sooner or later */
static inline u32 xe_map_read32(struct xe_device *xe, struct iosys_map *map)
{
	xe_device_assert_mem_access(xe);

	if (map->is_iomem)
		return readl(map->vaddr_iomem);
	else
		return READ_ONCE(*(u32 *)map->vaddr);
}

static inline void xe_map_write32(struct xe_device *xe, struct iosys_map *map,
				  u32 val)
{
	xe_device_assert_mem_access(xe);

	if (map->is_iomem)
		writel(val, map->vaddr_iomem);
	else
		*(u32 *)map->vaddr = val;
}

#define xe_map_rd(xe__, map__, offset__, type__) ({			\
	struct xe_device *__xe = xe__;					\
	xe_device_assert_mem_access(__xe);				\
	iosys_map_rd(map__, offset__, type__);				\
})

#define xe_map_wr(xe__, map__, offset__, type__, val__) ({		\
	struct xe_device *__xe = xe__;					\
	xe_device_assert_mem_access(__xe);				\
	iosys_map_wr(map__, offset__, type__, val__);			\
})

#define xe_map_rd_field(xe__, map__, struct_offset__, struct_type__, field__) ({	\
	struct xe_device *__xe = xe__;					\
	xe_device_assert_mem_access(__xe);				\
	iosys_map_rd_field(map__, struct_offset__, struct_type__, field__);		\
})

#define xe_map_wr_field(xe__, map__, struct_offset__, struct_type__, field__, val__) ({	\
	struct xe_device *__xe = xe__;					\
	xe_device_assert_mem_access(__xe);				\
	iosys_map_wr_field(map__, struct_offset__, struct_type__, field__, val__);	\
})

#endif

Annotation

Implementation Notes