@@ -706,95 +706,6 @@ void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagerefli
706706}
707707EXPORT_SYMBOL (drm_fb_helper_deferred_io );
708708
709- typedef ssize_t (* drm_fb_helper_read_screen )(struct fb_info * info , char __user * buf ,
710- size_t count , loff_t pos );
711-
712- static ssize_t __drm_fb_helper_read (struct fb_info * info , char __user * buf , size_t count ,
713- loff_t * ppos , drm_fb_helper_read_screen read_screen )
714- {
715- loff_t pos = * ppos ;
716- size_t total_size ;
717- ssize_t ret ;
718-
719- if (info -> screen_size )
720- total_size = info -> screen_size ;
721- else
722- total_size = info -> fix .smem_len ;
723-
724- if (pos >= total_size )
725- return 0 ;
726- if (count >= total_size )
727- count = total_size ;
728- if (total_size - count < pos )
729- count = total_size - pos ;
730-
731- if (info -> fbops -> fb_sync )
732- info -> fbops -> fb_sync (info );
733-
734- ret = read_screen (info , buf , count , pos );
735- if (ret > 0 )
736- * ppos += ret ;
737-
738- return ret ;
739- }
740-
741- typedef ssize_t (* drm_fb_helper_write_screen )(struct fb_info * info , const char __user * buf ,
742- size_t count , loff_t pos );
743-
744- static ssize_t __drm_fb_helper_write (struct fb_info * info , const char __user * buf , size_t count ,
745- loff_t * ppos , drm_fb_helper_write_screen write_screen )
746- {
747- loff_t pos = * ppos ;
748- size_t total_size ;
749- ssize_t ret ;
750- int err = 0 ;
751-
752- if (info -> screen_size )
753- total_size = info -> screen_size ;
754- else
755- total_size = info -> fix .smem_len ;
756-
757- if (pos > total_size )
758- return - EFBIG ;
759- if (count > total_size ) {
760- err = - EFBIG ;
761- count = total_size ;
762- }
763- if (total_size - count < pos ) {
764- if (!err )
765- err = - ENOSPC ;
766- count = total_size - pos ;
767- }
768-
769- if (info -> fbops -> fb_sync )
770- info -> fbops -> fb_sync (info );
771-
772- /*
773- * Copy to framebuffer even if we already logged an error. Emulates
774- * the behavior of the original fbdev implementation.
775- */
776- ret = write_screen (info , buf , count , pos );
777- if (ret < 0 )
778- return ret ; /* return last error, if any */
779- else if (!ret )
780- return err ; /* return previous error, if any */
781-
782- * ppos += ret ;
783-
784- return ret ;
785- }
786-
787- static ssize_t drm_fb_helper_read_screen_buffer (struct fb_info * info , char __user * buf ,
788- size_t count , loff_t pos )
789- {
790- const char * src = info -> screen_buffer + pos ;
791-
792- if (copy_to_user (buf , src , count ))
793- return - EFAULT ;
794-
795- return count ;
796- }
797-
798709/**
799710 * drm_fb_helper_sys_read - Implements struct &fb_ops.fb_read for system memory
800711 * @info: fb_info struct pointer
@@ -808,21 +719,10 @@ static ssize_t drm_fb_helper_read_screen_buffer(struct fb_info *info, char __use
808719ssize_t drm_fb_helper_sys_read (struct fb_info * info , char __user * buf ,
809720 size_t count , loff_t * ppos )
810721{
811- return __drm_fb_helper_read (info , buf , count , ppos , drm_fb_helper_read_screen_buffer );
722+ return fb_sys_read (info , buf , count , ppos );
812723}
813724EXPORT_SYMBOL (drm_fb_helper_sys_read );
814725
815- static ssize_t drm_fb_helper_write_screen_buffer (struct fb_info * info , const char __user * buf ,
816- size_t count , loff_t pos )
817- {
818- char * dst = info -> screen_buffer + pos ;
819-
820- if (copy_from_user (dst , buf , count ))
821- return - EFAULT ;
822-
823- return count ;
824- }
825-
826726/**
827727 * drm_fb_helper_sys_write - Implements struct &fb_ops.fb_write for system memory
828728 * @info: fb_info struct pointer
@@ -841,7 +741,7 @@ ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
841741 ssize_t ret ;
842742 struct drm_rect damage_area ;
843743
844- ret = __drm_fb_helper_write (info , buf , count , ppos , drm_fb_helper_write_screen_buffer );
744+ ret = fb_sys_write (info , buf , count , ppos );
845745 if (ret <= 0 )
846746 return ret ;
847747
@@ -913,39 +813,6 @@ void drm_fb_helper_sys_imageblit(struct fb_info *info,
913813}
914814EXPORT_SYMBOL (drm_fb_helper_sys_imageblit );
915815
916- static ssize_t fb_read_screen_base (struct fb_info * info , char __user * buf , size_t count ,
917- loff_t pos )
918- {
919- const char __iomem * src = info -> screen_base + pos ;
920- size_t alloc_size = min_t (size_t , count , PAGE_SIZE );
921- ssize_t ret = 0 ;
922- int err = 0 ;
923- char * tmp ;
924-
925- tmp = kmalloc (alloc_size , GFP_KERNEL );
926- if (!tmp )
927- return - ENOMEM ;
928-
929- while (count ) {
930- size_t c = min_t (size_t , count , alloc_size );
931-
932- memcpy_fromio (tmp , src , c );
933- if (copy_to_user (buf , tmp , c )) {
934- err = - EFAULT ;
935- break ;
936- }
937-
938- src += c ;
939- buf += c ;
940- ret += c ;
941- count -= c ;
942- }
943-
944- kfree (tmp );
945-
946- return ret ? ret : err ;
947- }
948-
949816/**
950817 * drm_fb_helper_cfb_read - Implements struct &fb_ops.fb_read for I/O memory
951818 * @info: fb_info struct pointer
@@ -959,43 +826,10 @@ static ssize_t fb_read_screen_base(struct fb_info *info, char __user *buf, size_
959826ssize_t drm_fb_helper_cfb_read (struct fb_info * info , char __user * buf ,
960827 size_t count , loff_t * ppos )
961828{
962- return __drm_fb_helper_read (info , buf , count , ppos , fb_read_screen_base );
829+ return fb_io_read (info , buf , count , ppos );
963830}
964831EXPORT_SYMBOL (drm_fb_helper_cfb_read );
965832
966- static ssize_t fb_write_screen_base (struct fb_info * info , const char __user * buf , size_t count ,
967- loff_t pos )
968- {
969- char __iomem * dst = info -> screen_base + pos ;
970- size_t alloc_size = min_t (size_t , count , PAGE_SIZE );
971- ssize_t ret = 0 ;
972- int err = 0 ;
973- u8 * tmp ;
974-
975- tmp = kmalloc (alloc_size , GFP_KERNEL );
976- if (!tmp )
977- return - ENOMEM ;
978-
979- while (count ) {
980- size_t c = min_t (size_t , count , alloc_size );
981-
982- if (copy_from_user (tmp , buf , c )) {
983- err = - EFAULT ;
984- break ;
985- }
986- memcpy_toio (dst , tmp , c );
987-
988- dst += c ;
989- buf += c ;
990- ret += c ;
991- count -= c ;
992- }
993-
994- kfree (tmp );
995-
996- return ret ? ret : err ;
997- }
998-
999833/**
1000834 * drm_fb_helper_cfb_write - Implements struct &fb_ops.fb_write for I/O memory
1001835 * @info: fb_info struct pointer
@@ -1014,7 +848,7 @@ ssize_t drm_fb_helper_cfb_write(struct fb_info *info, const char __user *buf,
1014848 ssize_t ret ;
1015849 struct drm_rect damage_area ;
1016850
1017- ret = __drm_fb_helper_write (info , buf , count , ppos , fb_write_screen_base );
851+ ret = fb_io_write (info , buf , count , ppos );
1018852 if (ret <= 0 )
1019853 return ret ;
1020854
0 commit comments