6#ifndef ZEPHYR_INCLUDE_SYS_DEVICE_MMIO_H
7#define ZEPHYR_INCLUDE_SYS_DEVICE_MMIO_H
37#if defined(CONFIG_MMU) || defined(CONFIG_PCIE) || defined(CONFIG_EXTERNAL_ADDRESS_TRANSLATION)
38#define DEVICE_MMIO_IS_IN_RAM
41#if defined(CONFIG_EXTERNAL_ADDRESS_TRANSLATION)
51#ifdef DEVICE_MMIO_IS_IN_RAM
56struct z_device_mmio_rom {
64#define Z_DEVICE_MMIO_ROM_INITIALIZER(node_id) \
66 .phys_addr = DT_REG_ADDR(node_id), \
67 .size = DT_REG_SIZE(node_id) \
70#define Z_DEVICE_MMIO_NAMED_ROM_INITIALIZER(name, node_id) \
72 .phys_addr = DT_REG_ADDR_BY_NAME(node_id, name), \
73 .size = DT_REG_SIZE_BY_NAME(node_id, name) \
109#ifdef CONFIG_EXTERNAL_ADDRESS_TRANSLATION
112 *virt_addr = phys_addr;
120struct z_device_mmio_rom {
125#define Z_DEVICE_MMIO_ROM_INITIALIZER(node_id) \
127 .addr = (mm_reg_t)DT_REG_ADDR_U64(node_id) \
130#define Z_DEVICE_MMIO_NAMED_ROM_INITIALIZER(name, node_id) \
132 .addr = (mm_reg_t)DT_REG_ADDR_BY_NAME_U64(node_id, name) \
141 *virt_addr = phys_addr;
189#ifdef DEVICE_MMIO_IS_IN_RAM
190#define DEVICE_MMIO_RAM mm_reg_t _mmio
192#define DEVICE_MMIO_RAM
195#ifdef DEVICE_MMIO_IS_IN_RAM
206#define DEVICE_MMIO_RAM_PTR(device) (mm_reg_t *)((device)->data)
239#define DEVICE_MMIO_ROM struct z_device_mmio_rom _mmio
250#define DEVICE_MMIO_ROM_PTR(dev) \
251 ((struct z_device_mmio_rom *)((dev)->config))
275#define DEVICE_MMIO_ROM_INIT(node_id) \
276 ._mmio = Z_DEVICE_MMIO_ROM_INITIALIZER(node_id)
294#ifdef DEVICE_MMIO_IS_IN_RAM
295#define DEVICE_MMIO_MAP(dev, flags) \
296 device_map(DEVICE_MMIO_RAM_PTR(dev), \
297 DEVICE_MMIO_ROM_PTR(dev)->phys_addr, \
298 DEVICE_MMIO_ROM_PTR(dev)->size, \
301#define DEVICE_MMIO_MAP(dev, flags) do { } while (false)
323#ifdef DEVICE_MMIO_IS_IN_RAM
324#define DEVICE_MMIO_GET(dev) (*DEVICE_MMIO_RAM_PTR(dev))
326#define DEVICE_MMIO_GET(dev) (DEVICE_MMIO_ROM_PTR(dev)->addr)
374#ifdef DEVICE_MMIO_IS_IN_RAM
375#define DEVICE_MMIO_NAMED_RAM(name) mm_reg_t name
377#define DEVICE_MMIO_NAMED_RAM(name)
380#ifdef DEVICE_MMIO_IS_IN_RAM
391#define DEVICE_MMIO_NAMED_RAM_PTR(dev, name) \
392 (&(DEV_DATA(dev)->name))
430#define DEVICE_MMIO_NAMED_ROM(name) struct z_device_mmio_rom name
444#define DEVICE_MMIO_NAMED_ROM_PTR(dev, name) (&(DEV_CFG(dev)->name))
472#define DEVICE_MMIO_NAMED_ROM_INIT(name, node_id) \
473 .name = Z_DEVICE_MMIO_ROM_INITIALIZER(node_id)
513#define DEVICE_MMIO_NAMED_ROM_INIT_BY_NAME(name, node_id) \
514 .name = Z_DEVICE_MMIO_NAMED_ROM_INITIALIZER(name, node_id)
542#ifdef DEVICE_MMIO_IS_IN_RAM
543#define DEVICE_MMIO_NAMED_MAP(dev, name, flags) \
544 device_map(DEVICE_MMIO_NAMED_RAM_PTR((dev), name), \
545 (DEVICE_MMIO_NAMED_ROM_PTR((dev), name)->phys_addr), \
546 (DEVICE_MMIO_NAMED_ROM_PTR((dev), name)->size), \
549#define DEVICE_MMIO_NAMED_MAP(dev, name, flags) do { } while (false)
573#ifdef DEVICE_MMIO_IS_IN_RAM
574#define DEVICE_MMIO_NAMED_GET(dev, name) \
575 (*DEVICE_MMIO_NAMED_RAM_PTR((dev), name))
577#define DEVICE_MMIO_NAMED_GET(dev, name) \
578 ((DEVICE_MMIO_NAMED_ROM_PTR((dev), name))->addr)
600 #define Z_TOPLEVEL_ROM_NAME(name) _CONCAT(z_mmio_rom__, name)
601 #define Z_TOPLEVEL_RAM_NAME(name) _CONCAT(z_mmio_ram__, name)
618#ifdef DEVICE_MMIO_IS_IN_RAM
619#define DEVICE_MMIO_TOPLEVEL(name, node_id) \
621 mm_reg_t Z_TOPLEVEL_RAM_NAME(name); \
623 const struct z_device_mmio_rom Z_TOPLEVEL_ROM_NAME(name) = \
624 Z_DEVICE_MMIO_ROM_INITIALIZER(node_id)
626#define DEVICE_MMIO_TOPLEVEL(name, node_id) \
628 const struct z_device_mmio_rom Z_TOPLEVEL_ROM_NAME(name) = \
629 Z_DEVICE_MMIO_ROM_INITIALIZER(node_id)
646#ifdef DEVICE_MMIO_IS_IN_RAM
647#define DEVICE_MMIO_TOPLEVEL_DECLARE(name) \
648 extern mm_reg_t Z_TOPLEVEL_RAM_NAME(name); \
649 extern const struct z_device_mmio_rom Z_TOPLEVEL_ROM_NAME(name)
651#define DEVICE_MMIO_TOPLEVEL_DECLARE(name) \
652 extern const struct z_device_mmio_rom Z_TOPLEVEL_ROM_NAME(name)
669#ifdef DEVICE_MMIO_IS_IN_RAM
670#define DEVICE_MMIO_TOPLEVEL_STATIC(name, node_id) \
672 static mm_reg_t Z_TOPLEVEL_RAM_NAME(name); \
674 static const struct z_device_mmio_rom Z_TOPLEVEL_ROM_NAME(name) = \
675 Z_DEVICE_MMIO_ROM_INITIALIZER(node_id)
677#define DEVICE_MMIO_TOPLEVEL_STATIC(name, node_id) \
679 static const struct z_device_mmio_rom Z_TOPLEVEL_ROM_NAME(name) = \
680 Z_DEVICE_MMIO_ROM_INITIALIZER(node_id)
683#ifdef DEVICE_MMIO_IS_IN_RAM
691#define DEVICE_MMIO_TOPLEVEL_RAM_PTR(name) &Z_TOPLEVEL_RAM_NAME(name)
700#define DEVICE_MMIO_TOPLEVEL_ROM_PTR(name) &Z_TOPLEVEL_ROM_NAME(name)
723#ifdef DEVICE_MMIO_IS_IN_RAM
724#define DEVICE_MMIO_TOPLEVEL_MAP(name, flags) \
725 device_map(&Z_TOPLEVEL_RAM_NAME(name), \
726 Z_TOPLEVEL_ROM_NAME(name).phys_addr, \
727 Z_TOPLEVEL_ROM_NAME(name).size, (flags))
729#define DEVICE_MMIO_TOPLEVEL_MAP(name, flags) do { } while (false)
742#ifdef DEVICE_MMIO_IS_IN_RAM
743#define DEVICE_MMIO_TOPLEVEL_GET(name) \
744 ((mm_reg_t)Z_TOPLEVEL_RAM_NAME(name))
746#define DEVICE_MMIO_TOPLEVEL_GET(name) \
747 ((mm_reg_t)Z_TOPLEVEL_ROM_NAME(name).addr)
static __boot_func void device_map(mm_reg_t *virt_addr, uintptr_t phys_addr, size_t size, uint32_t flags)
Set linear address for device MMIO access.
Definition device_mmio.h:97
#define K_MEM_PERM_RW
Region will have read/write access (and not read-only).
Definition mm.h:63
void k_mem_map_phys_bare(uint8_t **virt_ptr, uintptr_t phys, size_t size, uint32_t flags)
Map a physical memory region into the kernel's virtual address space.
int sys_mm_drv_page_phys_get(void *virt, uintptr_t *phys)
Get the mapped physical memory address from virtual address.
flags
Definition parser.h:97
Definitions of various linker Sections.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
uintptr_t mm_reg_t
Definition sys_io.h:20
Memory Management Driver APIs.