2019-05-27 08:55:05 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-16 15:20:36 -07:00
/*
2007-10-15 09:50:19 +02:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-16 15:20:36 -07:00
*
2005-10-10 11:59:52 +02:00
* Misc memory accessors
2005-04-16 15:20:36 -07:00
*/
2011-09-22 09:34:58 -04:00
# include <linux/export.h>
2015-01-28 16:49:33 +01:00
# include <linux/io.h>
2015-01-28 17:24:43 +01:00
# include <linux/uaccess.h>
2008-01-08 18:13:27 +01:00
# include <sound/core.h>
2023-08-15 21:01:14 +02:00
# include <sound/pcm.h>
2005-04-16 15:20:36 -07:00
/**
* copy_to_user_fromio - copy data from mmio - space to user - space
* @ dst : the destination pointer on user - space
* @ src : the source pointer on mmio
* @ count : the data size to copy in bytes
*
* Copies the data from mmio - space to user - space .
*
2013-03-11 22:05:14 +01:00
* Return : Zero if successful , or non - zero on failure .
2005-04-16 15:20:36 -07:00
*/
int copy_to_user_fromio ( void __user * dst , const volatile void __iomem * src , size_t count )
2023-08-15 21:01:14 +02:00
{
struct iov_iter iter ;
if ( import_ubuf ( ITER_DEST , dst , count , & iter ) )
return - EFAULT ;
return copy_to_iter_fromio ( & iter , ( const void __iomem * ) src , count ) ;
}
EXPORT_SYMBOL ( copy_to_user_fromio ) ;
/**
* copy_to_iter_fromio - copy data from mmio - space to iov_iter
* @ dst : the destination iov_iter
* @ src : the source pointer on mmio
* @ count : the data size to copy in bytes
*
* Copies the data from mmio - space to iov_iter .
*
* Return : Zero if successful , or non - zero on failure .
*/
int copy_to_iter_fromio ( struct iov_iter * dst , const void __iomem * src ,
size_t count )
2005-04-16 15:20:36 -07:00
{
# if defined(__i386__) || defined(CONFIG_SPARC32)
2023-08-15 21:01:14 +02:00
return copy_to_iter ( ( const void __force * ) src , count , dst ) = = count ? 0 : - EFAULT ;
2005-04-16 15:20:36 -07:00
# else
char buf [ 256 ] ;
while ( count ) {
size_t c = count ;
if ( c > sizeof ( buf ) )
c = sizeof ( buf ) ;
memcpy_fromio ( buf , ( void __iomem * ) src , c ) ;
2023-08-15 21:01:14 +02:00
if ( copy_to_iter ( buf , c , dst ) ! = c )
2005-04-16 15:20:36 -07:00
return - EFAULT ;
count - = c ;
src + = c ;
}
return 0 ;
# endif
}
2023-08-15 21:01:14 +02:00
EXPORT_SYMBOL ( copy_to_iter_fromio ) ;
2006-04-28 15:13:39 +02:00
2005-04-16 15:20:36 -07:00
/**
* copy_from_user_toio - copy data from user - space to mmio - space
* @ dst : the destination pointer on mmio - space
* @ src : the source pointer on user - space
* @ count : the data size to copy in bytes
*
* Copies the data from user - space to mmio - space .
*
2013-03-11 22:05:14 +01:00
* Return : Zero if successful , or non - zero on failure .
2005-04-16 15:20:36 -07:00
*/
int copy_from_user_toio ( volatile void __iomem * dst , const void __user * src , size_t count )
2023-08-15 21:01:14 +02:00
{
struct iov_iter iter ;
if ( import_ubuf ( ITER_SOURCE , ( void __user * ) src , count , & iter ) )
return - EFAULT ;
return copy_from_iter_toio ( ( void __iomem * ) dst , & iter , count ) ;
}
EXPORT_SYMBOL ( copy_from_user_toio ) ;
/**
* copy_from_iter_toio - copy data from iov_iter to mmio - space
* @ dst : the destination pointer on mmio - space
* @ src : the source iov_iter
* @ count : the data size to copy in bytes
*
* Copies the data from iov_iter to mmio - space .
*
* Return : Zero if successful , or non - zero on failure .
*/
int copy_from_iter_toio ( void __iomem * dst , struct iov_iter * src , size_t count )
2005-04-16 15:20:36 -07:00
{
# if defined(__i386__) || defined(CONFIG_SPARC32)
2023-08-15 21:01:14 +02:00
return copy_from_iter ( ( void __force * ) dst , count , src ) = = count ? 0 : - EFAULT ;
2005-04-16 15:20:36 -07:00
# else
char buf [ 256 ] ;
while ( count ) {
size_t c = count ;
if ( c > sizeof ( buf ) )
c = sizeof ( buf ) ;
2023-08-15 21:01:14 +02:00
if ( copy_from_iter ( buf , c , src ) ! = c )
2005-04-16 15:20:36 -07:00
return - EFAULT ;
memcpy_toio ( dst , buf , c ) ;
count - = c ;
dst + = c ;
}
return 0 ;
# endif
}
2023-08-15 21:01:14 +02:00
EXPORT_SYMBOL ( copy_from_iter_toio ) ;