@@ -2094,6 +2094,36 @@ static unsigned int sdw_cdns_read_pdi1_buffer_size(unsigned int actual_data_size
20942094 return total * 2 ;
20952095}
20962096
2097+ int sdw_cdns_bpt_find_bandwidth (int command , /* 0: write, 1: read */
2098+ int row , int col , int frame_rate ,
2099+ unsigned int * tx_dma_bandwidth ,
2100+ unsigned int * rx_dma_bandwidth )
2101+ {
2102+ unsigned int bpt_bits = row * (col - 1 );
2103+ unsigned int bpt_bytes = bpt_bits >> 3 ;
2104+ unsigned int pdi0_buffer_size ;
2105+ unsigned int pdi1_buffer_size ;
2106+ unsigned int data_per_frame ;
2107+
2108+ data_per_frame = sdw_cdns_bra_actual_data_size (bpt_bytes );
2109+ if (!data_per_frame )
2110+ return - EINVAL ;
2111+
2112+ if (command == 0 ) {
2113+ pdi0_buffer_size = sdw_cdns_write_pdi0_buffer_size (data_per_frame );
2114+ pdi1_buffer_size = SDW_CDNS_WRITE_PDI1_BUFFER_SIZE ;
2115+ } else {
2116+ pdi0_buffer_size = SDW_CDNS_READ_PDI0_BUFFER_SIZE ;
2117+ pdi1_buffer_size = sdw_cdns_read_pdi1_buffer_size (data_per_frame );
2118+ }
2119+
2120+ * tx_dma_bandwidth = pdi0_buffer_size * 8 * frame_rate ;
2121+ * rx_dma_bandwidth = pdi1_buffer_size * 8 * frame_rate ;
2122+
2123+ return 0 ;
2124+ }
2125+ EXPORT_SYMBOL (sdw_cdns_bpt_find_bandwidth );
2126+
20972127int sdw_cdns_bpt_find_buffer_sizes (int command , /* 0: write, 1: read */
20982128 int row , int col , unsigned int data_bytes ,
20992129 unsigned int requested_bytes_per_frame ,
@@ -2114,9 +2144,6 @@ int sdw_cdns_bpt_find_buffer_sizes(int command, /* 0: write, 1: read */
21142144 if (!actual_bpt_bytes )
21152145 return - EINVAL ;
21162146
2117- if (data_bytes < actual_bpt_bytes )
2118- actual_bpt_bytes = data_bytes ;
2119-
21202147 /*
21212148 * the caller may want to set the number of bytes per frame,
21222149 * allow when possible
@@ -2126,6 +2153,9 @@ int sdw_cdns_bpt_find_buffer_sizes(int command, /* 0: write, 1: read */
21262153
21272154 * data_per_frame = actual_bpt_bytes ;
21282155
2156+ if (data_bytes < actual_bpt_bytes )
2157+ actual_bpt_bytes = data_bytes ;
2158+
21292159 if (command == 0 ) {
21302160 /*
21312161 * for writes we need to send all the data_bytes per frame,
@@ -2363,7 +2393,7 @@ EXPORT_SYMBOL(sdw_cdns_prepare_write_dma_buffer);
23632393
23642394int sdw_cdns_prepare_read_dma_buffer (u8 dev_num , u32 start_register , int data_size ,
23652395 int data_per_frame , u8 * dma_buffer , int dma_buffer_size ,
2366- int * dma_buffer_total_bytes )
2396+ int * dma_buffer_total_bytes , unsigned int fake_size )
23672397{
23682398 int total_dma_data_written = 0 ;
23692399 u8 * p_dma_buffer = dma_buffer ;
@@ -2415,6 +2445,43 @@ int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, u32 start_register, int data_si
24152445 if (ret < 0 )
24162446 return ret ;
24172447
2448+ counter ++ ;
2449+
2450+ p_dma_buffer += dma_data_written ;
2451+ dma_buffer_size -= dma_data_written ;
2452+ total_dma_data_written += dma_data_written ;
2453+ }
2454+
2455+ /* Add fake frame */
2456+ header [0 ] &= ~GENMASK (7 , 6 ); /* Set inactive flag in BPT/BRA frame heade */
2457+ while (fake_size >= data_per_frame ) {
2458+ header [1 ] = data_per_frame ;
2459+ ret = sdw_cdns_prepare_read_pd0_buffer (header , SDW_CDNS_BRA_HDR , p_dma_buffer ,
2460+ dma_buffer_size , & dma_data_written ,
2461+ counter );
2462+ if (ret < 0 )
2463+ return ret ;
2464+
2465+ counter ++ ;
2466+
2467+ fake_size -= data_per_frame ;
2468+ p_dma_buffer += dma_data_written ;
2469+ dma_buffer_size -= dma_data_written ;
2470+ total_dma_data_written += dma_data_written ;
2471+ }
2472+
2473+ if (fake_size ) {
2474+ header [1 ] = fake_size ;
2475+ ret = sdw_cdns_prepare_read_pd0_buffer (header , SDW_CDNS_BRA_HDR , p_dma_buffer ,
2476+ dma_buffer_size , & dma_data_written ,
2477+ counter );
2478+ if (ret < 0 )
2479+ return ret ;
2480+
2481+ counter ++ ;
2482+
2483+ p_dma_buffer += dma_data_written ;
2484+ dma_buffer_size -= dma_data_written ;
24182485 total_dma_data_written += dma_data_written ;
24192486 }
24202487
@@ -2495,14 +2562,14 @@ int sdw_cdns_check_write_response(struct device *dev, u8 *dma_buffer,
24952562 ret = check_frame_start (header , counter );
24962563 if (ret < 0 ) {
24972564 dev_err (dev , "%s: bad frame %d/%d start header %x\n" ,
2498- __func__ , i , num_frames , header );
2565+ __func__ , i + 1 , num_frames , header );
24992566 return ret ;
25002567 }
25012568
25022569 ret = check_frame_end (footer );
25032570 if (ret < 0 ) {
25042571 dev_err (dev , "%s: bad frame %d/%d end footer %x\n" ,
2505- __func__ , i , num_frames , footer );
2572+ __func__ , i + 1 , num_frames , footer );
25062573 return ret ;
25072574 }
25082575
@@ -2573,7 +2640,7 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
25732640 ret = check_frame_start (header , counter );
25742641 if (ret < 0 ) {
25752642 dev_err (dev , "%s: bad frame %d/%d start header %x\n" ,
2576- __func__ , i , num_frames , header );
2643+ __func__ , i + 1 , num_frames , header );
25772644 return ret ;
25782645 }
25792646
@@ -2588,7 +2655,7 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
25882655
25892656 if (crc != expected_crc ) {
25902657 dev_err (dev , "%s: bad frame %d/%d crc %#x expected %#x\n" ,
2591- __func__ , i , num_frames , crc , expected_crc );
2658+ __func__ , i + 1 , num_frames , crc , expected_crc );
25922659 return - EIO ;
25932660 }
25942661
@@ -2599,7 +2666,7 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
25992666 ret = check_frame_end (footer );
26002667 if (ret < 0 ) {
26012668 dev_err (dev , "%s: bad frame %d/%d end footer %x\n" ,
2602- __func__ , i , num_frames , footer );
2669+ __func__ , i + 1 , num_frames , footer );
26032670 return ret ;
26042671 }
26052672
0 commit comments