5566 */
77
8+ #include <linux/bitfield.h>
9+ #include <linux/bits.h>
810#include <linux/clk.h>
911#include <linux/interrupt.h>
1012#include <linux/irq.h>
@@ -279,23 +281,43 @@ static void mtk_jpeg_dec_set_brz_factor(void __iomem *base, u8 yscale_w,
279281 writel (val , base + JPGDEC_REG_BRZ_FACTOR );
280282}
281283
282- static void mtk_jpeg_dec_set_dst_bank0 (void __iomem * base , u32 addr_y ,
283- u32 addr_u , u32 addr_v )
284+ static void mtk_jpeg_dec_set_dst_bank0 (void __iomem * base , bool support_34bit ,
285+ dma_addr_t addr_y , dma_addr_t addr_u , dma_addr_t addr_v )
284286{
287+ u32 val ;
288+
285289 mtk_jpeg_verify_align (addr_y , 16 , JPGDEC_REG_DEST_ADDR0_Y );
286- writel (addr_y , base + JPGDEC_REG_DEST_ADDR0_Y );
290+ writel (lower_32_bits ( addr_y ) , base + JPGDEC_REG_DEST_ADDR0_Y );
287291 mtk_jpeg_verify_align (addr_u , 16 , JPGDEC_REG_DEST_ADDR0_U );
288- writel (addr_u , base + JPGDEC_REG_DEST_ADDR0_U );
292+ writel (lower_32_bits ( addr_u ) , base + JPGDEC_REG_DEST_ADDR0_U );
289293 mtk_jpeg_verify_align (addr_v , 16 , JPGDEC_REG_DEST_ADDR0_V );
290- writel (addr_v , base + JPGDEC_REG_DEST_ADDR0_V );
294+ writel (lower_32_bits (addr_v ), base + JPGDEC_REG_DEST_ADDR0_V );
295+ if (support_34bit ) {
296+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr_y ));
297+ writel (val , base + JPGDEC_REG_DEST_ADDR0_Y_EXT );
298+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr_u ));
299+ writel (val , base + JPGDEC_REG_DEST_ADDR0_U_EXT );
300+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr_v ));
301+ writel (val , base + JPGDEC_REG_DEST_ADDR0_V_EXT );
302+ }
291303}
292304
293- static void mtk_jpeg_dec_set_dst_bank1 (void __iomem * base , u32 addr_y ,
294- u32 addr_u , u32 addr_v )
305+ static void mtk_jpeg_dec_set_dst_bank1 (void __iomem * base , bool support_34bit ,
306+ dma_addr_t addr_y , dma_addr_t addr_u , dma_addr_t addr_v )
295307{
296- writel (addr_y , base + JPGDEC_REG_DEST_ADDR1_Y );
297- writel (addr_u , base + JPGDEC_REG_DEST_ADDR1_U );
298- writel (addr_v , base + JPGDEC_REG_DEST_ADDR1_V );
308+ u32 val ;
309+
310+ writel (lower_32_bits (addr_y ), base + JPGDEC_REG_DEST_ADDR1_Y );
311+ writel (lower_32_bits (addr_u ), base + JPGDEC_REG_DEST_ADDR1_U );
312+ writel (lower_32_bits (addr_v ), base + JPGDEC_REG_DEST_ADDR1_V );
313+ if (support_34bit ) {
314+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr_y ));
315+ writel (val , base + JPGDEC_REG_DEST_ADDR1_Y_EXT );
316+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr_u ));
317+ writel (val , base + JPGDEC_REG_DEST_ADDR1_U_EXT );
318+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr_v ));
319+ writel (val , base + JPGDEC_REG_DEST_ADDR1_V_EXT );
320+ }
299321}
300322
301323static void mtk_jpeg_dec_set_mem_stride (void __iomem * base , u32 stride_y ,
@@ -322,18 +344,30 @@ static void mtk_jpeg_dec_set_dec_mode(void __iomem *base, u32 mode)
322344 writel (mode & 0x03 , base + JPGDEC_REG_OPERATION_MODE );
323345}
324346
325- static void mtk_jpeg_dec_set_bs_write_ptr (void __iomem * base , u32 ptr )
347+ static void mtk_jpeg_dec_set_bs_write_ptr (void __iomem * base , bool support_34bit , dma_addr_t ptr )
326348{
349+ u32 val ;
350+
327351 mtk_jpeg_verify_align (ptr , 16 , JPGDEC_REG_FILE_BRP );
328- writel (ptr , base + JPGDEC_REG_FILE_BRP );
352+ writel (lower_32_bits (ptr ), base + JPGDEC_REG_FILE_BRP );
353+ if (support_34bit ) {
354+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (ptr ));
355+ writel (val , base + JPGDEC_REG_FILE_BRP_EXT );
356+ }
329357}
330358
331- static void mtk_jpeg_dec_set_bs_info (void __iomem * base , u32 addr , u32 size ,
332- u32 bitstream_size )
359+ static void mtk_jpeg_dec_set_bs_info (void __iomem * base , bool support_34bit ,
360+ dma_addr_t addr , u32 size , u32 bitstream_size )
333361{
362+ u32 val ;
363+
334364 mtk_jpeg_verify_align (addr , 16 , JPGDEC_REG_FILE_ADDR );
335365 mtk_jpeg_verify_align (size , 128 , JPGDEC_REG_FILE_TOTAL_SIZE );
336- writel (addr , base + JPGDEC_REG_FILE_ADDR );
366+ writel (lower_32_bits (addr ), base + JPGDEC_REG_FILE_ADDR );
367+ if (support_34bit ) {
368+ val = FIELD_PREP (MTK_JPEG_ADDR_MASK , upper_32_bits (addr ));
369+ writel (val , base + JPGDEC_REG_FILE_ADDR_EXT );
370+ }
337371 writel (size , base + JPGDEC_REG_FILE_TOTAL_SIZE );
338372 writel (bitstream_size , base + JPGDEC_REG_BIT_STREAM_SIZE );
339373}
@@ -404,6 +438,7 @@ static void mtk_jpeg_dec_set_sampling_factor(void __iomem *base, u32 comp_num,
404438}
405439
406440void mtk_jpeg_dec_set_config (void __iomem * base ,
441+ bool support_34bits ,
407442 struct mtk_jpeg_dec_param * cfg ,
408443 u32 bitstream_size ,
409444 struct mtk_jpeg_bs * bs ,
@@ -413,8 +448,8 @@ void mtk_jpeg_dec_set_config(void __iomem *base,
413448 mtk_jpeg_dec_set_dec_mode (base , 0 );
414449 mtk_jpeg_dec_set_comp0_du (base , cfg -> unit_num );
415450 mtk_jpeg_dec_set_total_mcu (base , cfg -> total_mcu );
416- mtk_jpeg_dec_set_bs_info (base , bs -> str_addr , bs -> size , bitstream_size );
417- mtk_jpeg_dec_set_bs_write_ptr (base , bs -> end_addr );
451+ mtk_jpeg_dec_set_bs_info (base , support_34bits , bs -> str_addr , bs -> size , bitstream_size );
452+ mtk_jpeg_dec_set_bs_write_ptr (base , support_34bits , bs -> end_addr );
418453 mtk_jpeg_dec_set_du_membership (base , cfg -> membership , 1 ,
419454 (cfg -> comp_num == 1 ) ? 1 : 0 );
420455 mtk_jpeg_dec_set_comp_id (base , cfg -> comp_id [0 ], cfg -> comp_id [1 ],
@@ -432,9 +467,9 @@ void mtk_jpeg_dec_set_config(void __iomem *base,
432467 cfg -> mem_stride [1 ]);
433468 mtk_jpeg_dec_set_img_stride (base , cfg -> img_stride [0 ],
434469 cfg -> img_stride [1 ]);
435- mtk_jpeg_dec_set_dst_bank0 (base , fb -> plane_addr [0 ],
470+ mtk_jpeg_dec_set_dst_bank0 (base , support_34bits , fb -> plane_addr [0 ],
436471 fb -> plane_addr [1 ], fb -> plane_addr [2 ]);
437- mtk_jpeg_dec_set_dst_bank1 (base , 0 , 0 , 0 );
472+ mtk_jpeg_dec_set_dst_bank1 (base , support_34bits , 0 , 0 , 0 );
438473 mtk_jpeg_dec_set_dma_group (base , cfg -> dma_mcu , cfg -> dma_group ,
439474 cfg -> dma_last_mcu );
440475 mtk_jpeg_dec_set_pause_mcu_idx (base , cfg -> total_mcu );
0 commit comments