linux/drivers/scsi/lpfc/lpfc_compat.h
<<
>>
Prefs
   1/*******************************************************************
   2 * This file is part of the Emulex Linux Device Driver for         *
   3 * Fibre Channel Host Bus Adapters.                                *
   4 * Copyright (C) 2017-2018 Broadcom. All Rights Reserved. The term *
   5 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.     *
   6 * Copyright (C) 2004-2011 Emulex.  All rights reserved.           *
   7 * EMULEX and SLI are trademarks of Emulex.                        *
   8 * www.broadcom.com                                                *
   9 *                                                                 *
  10 * This program is free software; you can redistribute it and/or   *
  11 * modify it under the terms of version 2 of the GNU General       *
  12 * Public License as published by the Free Software Foundation.    *
  13 * This program is distributed in the hope that it will be useful. *
  14 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
  15 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
  16 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
  17 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
  18 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
  19 * more details, a copy of which can be found in the file COPYING  *
  20 * included with this package.                                     *
  21 *******************************************************************/
  22
  23/*
  24 * This file provides macros to aid compilation in the Linux 2.4 kernel
  25 * over various platform architectures.
  26 */
  27
  28/*******************************************************************
  29Note: HBA's SLI memory contains little-endian LW.
  30Thus to access it from a little-endian host,
  31memcpy_toio() and memcpy_fromio() can be used.
  32However on a big-endian host, copy 4 bytes at a time,
  33using writel() and readl().
  34 *******************************************************************/
  35#include <asm/byteorder.h>
  36
  37#ifdef __BIG_ENDIAN
  38
  39static inline void
  40lpfc_memcpy_to_slim(void __iomem *dest, void *src, unsigned int bytes)
  41{
  42        uint32_t __iomem *dest32;
  43        uint32_t *src32;
  44        unsigned int four_bytes;
  45
  46
  47        dest32  = (uint32_t __iomem *) dest;
  48        src32  = (uint32_t *) src;
  49
  50        /* write input bytes, 4 bytes at a time */
  51        for (four_bytes = bytes /4; four_bytes > 0; four_bytes--) {
  52                writel( *src32, dest32);
  53                readl(dest32); /* flush */
  54                dest32++;
  55                src32++;
  56        }
  57
  58        return;
  59}
  60
  61static inline void
  62lpfc_memcpy_from_slim( void *dest, void __iomem *src, unsigned int bytes)
  63{
  64        uint32_t *dest32;
  65        uint32_t __iomem *src32;
  66        unsigned int four_bytes;
  67
  68
  69        dest32  = (uint32_t *) dest;
  70        src32  = (uint32_t __iomem *) src;
  71
  72        /* read input bytes, 4 bytes at a time */
  73        for (four_bytes = bytes /4; four_bytes > 0; four_bytes--) {
  74                *dest32 = readl( src32);
  75                dest32++;
  76                src32++;
  77        }
  78
  79        return;
  80}
  81
  82#else
  83
  84static inline void
  85lpfc_memcpy_to_slim( void __iomem *dest, void *src, unsigned int bytes)
  86{
  87        /* convert bytes in argument list to word count for copy function */
  88        __iowrite32_copy(dest, src, bytes / sizeof(uint32_t));
  89}
  90
  91static inline void
  92lpfc_memcpy_from_slim( void *dest, void __iomem *src, unsigned int bytes)
  93{
  94        /* actually returns 1 byte past dest */
  95        memcpy_fromio( dest, src, bytes);
  96}
  97
  98#endif  /* __BIG_ENDIAN */
  99