@@ -696,7 +696,7 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
696696 uint32_t stride ;
697697
698698 uint8_t shift ;
699- uint16_t sw , byte_num ;
699+ uint32_t sw , byte_num ;
700700
701701 shift = 3 - (req -> palette_mode & 3 );
702702 sw = req -> src .vir_w * req -> src .vir_h ;
@@ -710,6 +710,14 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
710710
711711 do {
712712 if (req -> mmu_info .src0_mmu_flag ) {
713+ if (req -> mmu_info .els_mmu_flag & 1 ) {
714+ req -> mmu_info .src0_mmu_flag = 0 ;
715+ req -> mmu_info .src1_mmu_flag = 0 ;
716+ } else {
717+ req -> mmu_info .els_mmu_flag = req -> mmu_info .src0_mmu_flag ;
718+ req -> mmu_info .src0_mmu_flag = 0 ;
719+ }
720+
713721 SrcMemSize = rga2_mem_size_cal (req -> src .yrgb_addr , stride , & SrcStart );
714722 if (SrcMemSize == 0 ) {
715723 return - EINVAL ;
@@ -748,28 +756,49 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
748756 mutex_unlock (& rga2_service .lock );
749757
750758 if (SrcMemSize ) {
751- ret = rga2_MapUserMemory (& pages [0 ], & MMU_Base [0 ],
752- SrcStart , SrcMemSize , 0 );
759+ if (req -> sg_src0 ) {
760+ ret = rga2_MapION (req -> sg_src0 ,
761+ & MMU_Base [0 ], SrcMemSize );
762+ } else {
763+ ret = rga2_MapUserMemory (& pages [0 ], & MMU_Base [0 ],
764+ SrcStart , SrcMemSize , 0 );
765+ #if RGA2_DEBUGFS
766+ if (RGA2_CHECK_MODE )
767+ rga2_UserMemory_cheeck (& pages [0 ], req -> src .vir_w ,
768+ req -> src .vir_h , req -> src .format ,
769+ 1 );
770+ #endif
771+ }
753772 if (ret < 0 ) {
754773 pr_err ("rga2 map src0 memory failed\n" );
755774 status = ret ;
756775 break ;
757776 }
758777
759778 /* change the buf address in req struct */
760- req -> mmu_info .src0_base_addr = (((unsigned long )MMU_Base_phys ));
779+ req -> mmu_info .els_base_addr = (((unsigned long )MMU_Base_phys ));
761780 req -> src .yrgb_addr = (req -> src .yrgb_addr & (~PAGE_MASK ));
762781 }
763782
764783 if (DstMemSize ) {
765- ret = rga2_MapUserMemory (& pages [0 ], MMU_Base + SrcMemSize ,
766- DstStart , DstMemSize , 1 );
784+ if (req -> sg_dst ) {
785+ ret = rga2_MapION (req -> sg_dst ,
786+ MMU_Base + SrcMemSize , DstMemSize );
787+ } else {
788+ ret = rga2_MapUserMemory (& pages [0 ], MMU_Base + SrcMemSize ,
789+ DstStart , DstMemSize , 1 );
790+ #if RGA2_DEBUGFS
791+ if (RGA2_CHECK_MODE )
792+ rga2_UserMemory_cheeck (& pages [0 ], req -> dst .vir_w ,
793+ req -> dst .vir_h , req -> dst .format ,
794+ 1 );
795+ #endif
796+ }
767797 if (ret < 0 ) {
768798 pr_err ("rga2 map dst memory failed\n" );
769799 status = ret ;
770800 break ;
771801 }
772-
773802 /* change the buf address in req struct */
774803 req -> mmu_info .dst_base_addr = ((unsigned long )(MMU_Base_phys + SrcMemSize ));
775804 req -> dst .yrgb_addr = (req -> dst .yrgb_addr & (~PAGE_MASK ));
@@ -859,49 +888,69 @@ static int rga2_mmu_info_color_fill_mode(struct rga2_reg *reg, struct rga2_req *
859888
860889static int rga2_mmu_info_update_palette_table_mode (struct rga2_reg * reg , struct rga2_req * req )
861890{
862- int SrcMemSize ;
863- unsigned long SrcStart ;
891+ int LutMemSize ;
892+ unsigned long LutStart ;
864893 struct page * * pages = NULL ;
865894 uint32_t AllSize ;
866895 uint32_t * MMU_Base , * MMU_Base_phys ;
867896 int ret , status ;
868897
869898 MMU_Base = NULL ;
899+ LutMemSize = 0 ;
900+ LutStart = 0 ;
870901
871902 do {
872- /* cal src buf mmu info */
873- SrcMemSize = rga2_mem_size_cal (req -> pat .yrgb_addr , req -> pat .vir_w * req -> pat .vir_h , & SrcStart );
874- if (SrcMemSize == 0 ) {
875- return - EINVAL ;
903+ /* cal lut buf mmu info */
904+ if (req -> mmu_info .els_mmu_flag & 1 ) {
905+ req -> mmu_info .src0_mmu_flag = req -> mmu_info .src0_mmu_flag == 1 ? 0 : req -> mmu_info .src0_mmu_flag ;
906+ req -> mmu_info .src1_mmu_flag = req -> mmu_info .src1_mmu_flag == 1 ? 0 : req -> mmu_info .src1_mmu_flag ;
907+ req -> mmu_info .dst_mmu_flag = req -> mmu_info .dst_mmu_flag == 1 ? 0 : req -> mmu_info .dst_mmu_flag ;
908+
909+ LutMemSize = rga2_buf_size_cal (req -> pat .yrgb_addr , req -> pat .uv_addr , req -> pat .v_addr ,
910+ req -> pat .format , req -> pat .vir_w , req -> pat .vir_h ,
911+ & LutStart );
912+ if (LutMemSize == 0 ) {
913+ return - EINVAL ;
914+ }
876915 }
877916
878- SrcMemSize = (SrcMemSize + 15 ) & (~15 );
879- AllSize = SrcMemSize ;
917+ LutMemSize = (LutMemSize + 15 ) & (~15 );
918+ AllSize = LutMemSize ;
880919
881920 if (rga2_mmu_buf_get_try (& rga2_mmu_buf , AllSize )) {
882921 pr_err ("RGA2 Get MMU mem failed\n" );
883922 status = RGA2_MALLOC_ERROR ;
884923 break ;
885924 }
886925
926+ pages = rga2_mmu_buf .pages ;
927+ if (pages == NULL ) {
928+ pr_err ("RGA MMU malloc pages mem failed\n" );
929+ return - EINVAL ;
930+ }
931+
887932 mutex_lock (& rga2_service .lock );
888933 MMU_Base = rga2_mmu_buf .buf_virtual + (rga2_mmu_buf .front & (rga2_mmu_buf .size - 1 ));
889934 MMU_Base_phys = rga2_mmu_buf .buf + (rga2_mmu_buf .front & (rga2_mmu_buf .size - 1 ));
890935 mutex_unlock (& rga2_service .lock );
891936
892- pages = kzalloc (AllSize * sizeof (struct page * ), GFP_KERNEL );
893-
894- if (SrcMemSize ) {
895- ret = rga2_MapUserMemory (& pages [0 ], & MMU_Base [0 ],
896- SrcStart , SrcMemSize , 0 );
937+ if (LutMemSize ) {
938+ if (req -> sg_els ) {
939+ ret = rga2_MapION (req -> sg_els ,
940+ & MMU_Base [0 ], LutMemSize );
941+ } else {
942+ ret = rga2_MapUserMemory (& pages [0 ], & MMU_Base [0 ],
943+ LutStart , LutMemSize , 0 );
944+ }
897945 if (ret < 0 ) {
898946 pr_err ("rga2 map palette memory failed\n" );
899947 status = ret ;
900948 break ;
901949 }
902950
903951 /* change the buf address in req struct */
904- req -> mmu_info .src0_base_addr = (((unsigned long )MMU_Base_phys ));
952+ req -> mmu_info .els_base_addr = (((unsigned long )MMU_Base_phys ));
953+
905954 req -> pat .yrgb_addr = (req -> pat .yrgb_addr & (~PAGE_MASK ));
906955 }
907956
0 commit comments