1/* SPDX-License-Identifier: MIT */ 2/* 3 * Copyright �� 2022 Intel Corporation 4 */ 5 6#ifndef _XE_MAP_H_ 7#define _XE_MAP_H_ 8 9#include <linux/iosys-map.h> 10 11#include <xe_device.h> 12 13/** 14 * DOC: Map layer 15 * 16 * All access to any memory shared with a device (both sysmem and vram) in the 17 * XE driver should go through this layer (xe_map). This layer is built on top 18 * of :ref:`driver-api/device-io:Generalizing Access to System and I/O Memory` 19 * and with extra hooks into the XE driver that allows adding asserts to memory 20 * accesses (e.g. for blocking runtime_pm D3Cold on Discrete Graphics). 21 */ 22 23static inline void xe_map_memcpy_to(struct xe_device *xe, struct iosys_map *dst, 24 size_t dst_offset, const void *src, 25 size_t len) 26{ 27 xe_device_assert_mem_access(xe); 28 iosys_map_memcpy_to(dst, dst_offset, src, len); 29} 30 31static inline void xe_map_memcpy_from(struct xe_device *xe, void *dst, 32 const struct iosys_map *src, 33 size_t src_offset, size_t len) 34{ 35 xe_device_assert_mem_access(xe); 36 iosys_map_memcpy_from(dst, src, src_offset, len); 37} 38 39static inline void xe_map_memset(struct xe_device *xe, 40 struct iosys_map *dst, size_t offset, 41 int value, size_t len) 42{ 43 xe_device_assert_mem_access(xe); 44 iosys_map_memset(dst, offset, value, len); 45} 46 47/* FIXME: We likely should kill these two functions sooner or later */ 48static inline u32 xe_map_read32(struct xe_device *xe, struct iosys_map *map) 49{ 50 xe_device_assert_mem_access(xe); 51 52 if (map->is_iomem) 53 return readl(map->vaddr_iomem); 54 else 55 return READ_ONCE(*(u32 *)map->vaddr); 56} 57 58static inline void xe_map_write32(struct xe_device *xe, struct iosys_map *map, 59 u32 val) 60{ 61 xe_device_assert_mem_access(xe); 62 63 if (map->is_iomem) 64 writel(val, map->vaddr_iomem); 65 else 66 *(u32 *)map->vaddr = val; 67} 68 69#define xe_map_rd(xe__, map__, offset__, type__) ({ \ 70 struct xe_device *__xe = xe__; \ 71 xe_device_assert_mem_access(__xe); \ 72 iosys_map_rd(map__, offset__, type__); \ 73}) 74 75#define xe_map_wr(xe__, map__, offset__, type__, val__) ({ \ 76 struct xe_device *__xe = xe__; \ 77 xe_device_assert_mem_access(__xe); \ 78 iosys_map_wr(map__, offset__, type__, val__); \ 79}) 80 81#define xe_map_rd_field(xe__, map__, struct_offset__, struct_type__, field__) ({ \ 82 struct xe_device *__xe = xe__; \ 83 xe_device_assert_mem_access(__xe); \ 84 iosys_map_rd_field(map__, struct_offset__, struct_type__, field__); \ 85}) 86 87#define xe_map_wr_field(xe__, map__, struct_offset__, struct_type__, field__, val__) ({ \ 88 struct xe_device *__xe = xe__; \ 89 xe_device_assert_mem_access(__xe); \ 90 iosys_map_wr_field(map__, struct_offset__, struct_type__, field__, val__); \ 91}) 92 93#endif 94