linux/arch/mips/include/asm/mach-cavium-octeon/mangle-port.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2003, 2004 Ralf Baechle
   7 */
   8#ifndef __ASM_MACH_GENERIC_MANGLE_PORT_H
   9#define __ASM_MACH_GENERIC_MANGLE_PORT_H
  10
  11#include <asm/byteorder.h>
  12
  13#ifdef __BIG_ENDIAN
  14
  15# define __swizzle_addr_b(port) (port)
  16# define __swizzle_addr_w(port) (port)
  17# define __swizzle_addr_l(port) (port)
  18# define __swizzle_addr_q(port) (port)
  19
  20#else /* __LITTLE_ENDIAN */
  21
  22static inline bool __should_swizzle_addr(unsigned long p)
  23{
  24        /* boot bus? */
  25        return ((p >> 40) & 0xff) == 0;
  26}
  27
  28# define __swizzle_addr_b(port) \
  29        (__should_swizzle_addr(port) ? (port) ^ 7 : (port))
  30# define __swizzle_addr_w(port) \
  31        (__should_swizzle_addr(port) ? (port) ^ 6 : (port))
  32# define __swizzle_addr_l(port) \
  33        (__should_swizzle_addr(port) ? (port) ^ 4 : (port))
  34# define __swizzle_addr_q(port) (port)
  35
  36#endif /* __BIG_ENDIAN */
  37
  38/*
  39 * Sane hardware offers swapping of PCI/ISA I/O space accesses in hardware;
  40 * less sane hardware forces software to fiddle with this...
  41 *
  42 * Regardless, if the host bus endianness mismatches that of PCI/ISA, then
  43 * you can't have the numerical value of data and byte addresses within
  44 * multibyte quantities both preserved at the same time.  Hence two
  45 * variations of functions: non-prefixed ones that preserve the value
  46 * and prefixed ones that preserve byte addresses.  The latters are
  47 * typically used for moving raw data between a peripheral and memory (cf.
  48 * string I/O functions), hence the "__mem_" prefix.
  49 */
  50#if defined(CONFIG_SWAP_IO_SPACE)
  51
  52# define ioswabb(a, x)          (x)
  53# define __mem_ioswabb(a, x)    (x)
  54# define ioswabw(a, x)          le16_to_cpu(x)
  55# define __mem_ioswabw(a, x)    (x)
  56# define ioswabl(a, x)          le32_to_cpu(x)
  57# define __mem_ioswabl(a, x)    (x)
  58# define ioswabq(a, x)          le64_to_cpu(x)
  59# define __mem_ioswabq(a, x)    (x)
  60
  61#else
  62
  63# define ioswabb(a, x)          (x)
  64# define __mem_ioswabb(a, x)    (x)
  65# define ioswabw(a, x)          (x)
  66# define __mem_ioswabw(a, x)    cpu_to_le16(x)
  67# define ioswabl(a, x)          (x)
  68# define __mem_ioswabl(a, x)    cpu_to_le32(x)
  69# define ioswabq(a, x)          (x)
  70# define __mem_ioswabq(a, x)    cpu_to_le32(x)
  71
  72#endif
  73
  74#endif /* __ASM_MACH_GENERIC_MANGLE_PORT_H */
  75