diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2024-03-28 05:38:37 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2024-03-28 05:38:37 +0000 |
commit | a864dfb0da906691200503a95d81c1113f829269 (patch) | |
tree | 4416900614ff20dd50e3a5c1a1363a486baaab9a /sys | |
parent | cabe45020c2e3c9553bb154515e2731bce3db72b (diff) |
add more iosys_map interfaces used by inteldrm guc code
based in part on FreeBSD changes
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/pci/drm/include/linux/iosys-map.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/sys/dev/pci/drm/include/linux/iosys-map.h b/sys/dev/pci/drm/include/linux/iosys-map.h index 4639769b850..1c07f18dca1 100644 --- a/sys/dev/pci/drm/include/linux/iosys-map.h +++ b/sys/dev/pci/drm/include/linux/iosys-map.h @@ -35,6 +35,15 @@ iosys_map_memcpy_to(struct iosys_map *ism, size_t off, const void *src, memcpy(ism->vaddr + off, src, len); } +static inline void +iosys_map_memset(struct iosys_map *ism, size_t off, int c, size_t len) +{ + if (ism->is_iomem) + memset_io(ism->vaddr_iomem + off, c, len); + else + memset(ism->vaddr + off, c, len); +} + static inline bool iosys_map_is_null(const struct iosys_map *ism) { @@ -78,4 +87,53 @@ iosys_map_set_vaddr(struct iosys_map *ism, void *addr) ism->is_iomem = false; } +static inline struct iosys_map +IOSYS_MAP_INIT_OFFSET(struct iosys_map *ism, size_t off) +{ + struct iosys_map nism = *ism; + iosys_map_incr(&nism, off); + return nism; +} + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 + +#define iosys_map_rd(_ism, _o, _t) ({ \ + _t v; \ + if ((_ism)->is_iomem) { \ + void *addr = (_ism)->vaddr_iomem + (_o); \ + v = _Generic(v, \ + uint8_t : ioread8(addr), \ + uint16_t: ioread16(addr), \ + uint32_t: ioread32(addr), \ + uint64_t: ioread64(addr)); \ + } else \ + v = READ_ONCE(*(_t *)((_ism)->vaddr + (_o))); \ + v; \ +}) + +#define iosys_map_wr(_ism, _o, _t, _v) ({ \ + _t v = (_v); \ + if ((_ism)->is_iomem) { \ + void *addr = (_ism)->vaddr_iomem + (_o); \ + _Generic(v, \ + uint8_t : iowrite8(v, addr), \ + uint16_t: iowrite16(v, addr), \ + uint32_t: iowrite32(v, addr), \ + uint64_t: iowrite64(v, addr)); \ + } else \ + WRITE_ONCE(*(_t *)((_ism)->vaddr + (_o)), v); \ +}) + +#define iosys_map_rd_field(_ism, _o, _t, _f) ({ \ + _t *t; \ + iosys_map_rd(_ism, _o + offsetof(_t, _f), __typeof(t->_f)); \ +}) + +#define iosys_map_wr_field(_ism, _o, _t, _f, _v) ({ \ + _t *t; \ + iosys_map_wr(_ism, _o + offsetof(_t, _f), __typeof(t->_f), _v); \ +}) + +#endif /* C11 */ + #endif |