linux/arch/arm/mach-iop13xx/include/mach/memory.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __ASM_ARCH_MEMORY_H
   3#define __ASM_ARCH_MEMORY_H
   4
   5#include <mach/hardware.h>
   6
   7#ifndef __ASSEMBLY__
   8
   9#if defined(CONFIG_ARCH_IOP13XX)
  10#define IOP13XX_PMMR_V_START (IOP13XX_PMMR_VIRT_MEM_BASE)
  11#define IOP13XX_PMMR_V_END   (IOP13XX_PMMR_VIRT_MEM_BASE + IOP13XX_PMMR_SIZE)
  12#define IOP13XX_PMMR_P_START (IOP13XX_PMMR_PHYS_MEM_BASE)
  13#define IOP13XX_PMMR_P_END   (IOP13XX_PMMR_PHYS_MEM_BASE + IOP13XX_PMMR_SIZE)
  14
  15static inline dma_addr_t __virt_to_lbus(void __iomem *x)
  16{
  17        return x + IOP13XX_PMMR_PHYS_MEM_BASE - IOP13XX_PMMR_VIRT_MEM_BASE;
  18}
  19
  20static inline void __iomem *__lbus_to_virt(dma_addr_t x)
  21{
  22        return x + IOP13XX_PMMR_VIRT_MEM_BASE - IOP13XX_PMMR_PHYS_MEM_BASE;
  23}
  24
  25#define __is_lbus_dma(a)                                \
  26        ((a) >= IOP13XX_PMMR_P_START && (a) < IOP13XX_PMMR_P_END)
  27
  28#define __is_lbus_virt(a)                               \
  29        ((a) >= IOP13XX_PMMR_V_START && (a) < IOP13XX_PMMR_V_END)
  30
  31/* Device is an lbus device if it is on the platform bus of the IOP13XX */
  32#define is_lbus_device(dev)                             \
  33        (dev && strncmp(dev->bus->name, "platform", 8) == 0)
  34
  35#define __arch_dma_to_virt(dev, addr)                                   \
  36        ({                                                              \
  37                void * __virt;                                          \
  38                dma_addr_t __dma = addr;                                \
  39                if (is_lbus_device(dev) && __is_lbus_dma(__dma))        \
  40                        __virt = __lbus_to_virt(__dma);                 \
  41                else                                                    \
  42                        __virt = (void *)__phys_to_virt(__dma);         \
  43                __virt;                                                 \
  44        })
  45
  46#define __arch_virt_to_dma(dev, addr)                                   \
  47        ({                                                              \
  48                void * __virt = addr;                                   \
  49                dma_addr_t __dma;                                       \
  50                if (is_lbus_device(dev) && __is_lbus_virt(__virt))      \
  51                        __dma = __virt_to_lbus(__virt);                 \
  52                else                                                    \
  53                        __dma = __virt_to_phys((unsigned long)__virt);  \
  54                __dma;                                                  \
  55        })
  56
  57#define __arch_pfn_to_dma(dev, pfn)                                     \
  58        ({                                                              \
  59                /* __is_lbus_virt() can never be true for RAM pages */  \
  60                (dma_addr_t)__pfn_to_phys(pfn);                         \
  61        })
  62
  63#define __arch_dma_to_pfn(dev, addr)    __phys_to_pfn(addr)
  64
  65#endif /* CONFIG_ARCH_IOP13XX */
  66#endif /* !ASSEMBLY */
  67
  68#endif
  69