linux/sound/core/memory.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   4 * 
   5 *  Misc memory accessors
   6 */
   7
   8#include <linux/export.h>
   9#include <linux/io.h>
  10#include <linux/uaccess.h>
  11#include <sound/core.h>
  12
  13/**
  14 * copy_to_user_fromio - copy data from mmio-space to user-space
  15 * @dst: the destination pointer on user-space
  16 * @src: the source pointer on mmio
  17 * @count: the data size to copy in bytes
  18 *
  19 * Copies the data from mmio-space to user-space.
  20 *
  21 * Return: Zero if successful, or non-zero on failure.
  22 */
  23int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size_t count)
  24{
  25#if defined(__i386__) || defined(CONFIG_SPARC32)
  26        return copy_to_user(dst, (const void __force*)src, count) ? -EFAULT : 0;
  27#else
  28        char buf[256];
  29        while (count) {
  30                size_t c = count;
  31                if (c > sizeof(buf))
  32                        c = sizeof(buf);
  33                memcpy_fromio(buf, (void __iomem *)src, c);
  34                if (copy_to_user(dst, buf, c))
  35                        return -EFAULT;
  36                count -= c;
  37                dst += c;
  38                src += c;
  39        }
  40        return 0;
  41#endif
  42}
  43EXPORT_SYMBOL(copy_to_user_fromio);
  44
  45/**
  46 * copy_from_user_toio - copy data from user-space to mmio-space
  47 * @dst: the destination pointer on mmio-space
  48 * @src: the source pointer on user-space
  49 * @count: the data size to copy in bytes
  50 *
  51 * Copies the data from user-space to mmio-space.
  52 *
  53 * Return: Zero if successful, or non-zero on failure.
  54 */
  55int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size_t count)
  56{
  57#if defined(__i386__) || defined(CONFIG_SPARC32)
  58        return copy_from_user((void __force *)dst, src, count) ? -EFAULT : 0;
  59#else
  60        char buf[256];
  61        while (count) {
  62                size_t c = count;
  63                if (c > sizeof(buf))
  64                        c = sizeof(buf);
  65                if (copy_from_user(buf, src, c))
  66                        return -EFAULT;
  67                memcpy_toio(dst, buf, c);
  68                count -= c;
  69                dst += c;
  70                src += c;
  71        }
  72        return 0;
  73#endif
  74}
  75EXPORT_SYMBOL(copy_from_user_toio);
  76