@@ -2328,65 +2328,78 @@ static int sdw_cdns_prepare_read_pd0_buffer(u8 *header, unsigned int header_size
23282328
23292329#define CDNS_BPT_ROLLING_COUNTER_START 1
23302330
2331- int sdw_cdns_prepare_write_dma_buffer (u8 dev_num , u32 start_register , u8 * data , int data_size ,
2332- int data_per_frame , u8 * dma_buffer , int dma_buffer_size ,
2333- int * dma_buffer_total_bytes )
2331+ int sdw_cdns_prepare_write_dma_buffer (u8 dev_num , struct sdw_bpt_section * sec , int num_sec ,
2332+ int data_per_frame , u8 * dma_buffer ,
2333+ int dma_buffer_size , int * dma_buffer_total_bytes )
23342334{
23352335 int total_dma_data_written = 0 ;
23362336 u8 * p_dma_buffer = dma_buffer ;
23372337 u8 header [SDW_CDNS_BRA_HDR ];
2338+ unsigned int start_register ;
2339+ unsigned int section_size ;
23382340 int dma_data_written ;
2339- u8 * p_data = data ;
2341+ u8 * p_data ;
23402342 u8 counter ;
23412343 int ret ;
2344+ int i ;
23422345
23432346 counter = CDNS_BPT_ROLLING_COUNTER_START ;
23442347
23452348 header [0 ] = BIT (1 ); /* write command: BIT(1) set */
23462349 header [0 ] |= GENMASK (7 , 6 ); /* header is active */
23472350 header [0 ] |= (dev_num << 2 );
23482351
2349- while (data_size >= data_per_frame ) {
2350- header [1 ] = data_per_frame ;
2351- header [2 ] = start_register >> 24 & 0xFF ;
2352- header [3 ] = start_register >> 16 & 0xFF ;
2353- header [4 ] = start_register >> 8 & 0xFF ;
2354- header [5 ] = start_register >> 0 & 0xFF ;
2355-
2356- ret = sdw_cdns_prepare_write_pd0_buffer (header , SDW_CDNS_BRA_HDR ,
2357- p_data , data_per_frame ,
2358- p_dma_buffer , dma_buffer_size ,
2359- & dma_data_written , counter );
2360- if (ret < 0 )
2361- return ret ;
2352+ for (i = 0 ; i < num_sec ; i ++ ) {
2353+ start_register = sec [i ].addr ;
2354+ section_size = sec [i ].len ;
2355+ p_data = sec [i ].buf ;
23622356
2363- counter ++ ;
2357+ while (section_size >= data_per_frame ) {
2358+ header [1 ] = data_per_frame ;
2359+ header [2 ] = start_register >> 24 & 0xFF ;
2360+ header [3 ] = start_register >> 16 & 0xFF ;
2361+ header [4 ] = start_register >> 8 & 0xFF ;
2362+ header [5 ] = start_register >> 0 & 0xFF ;
23642363
2365- p_data += data_per_frame ;
2366- data_size -= data_per_frame ;
2364+ ret = sdw_cdns_prepare_write_pd0_buffer (header , SDW_CDNS_BRA_HDR ,
2365+ p_data , data_per_frame ,
2366+ p_dma_buffer , dma_buffer_size ,
2367+ & dma_data_written , counter );
2368+ if (ret < 0 )
2369+ return ret ;
23672370
2368- p_dma_buffer += dma_data_written ;
2369- dma_buffer_size -= dma_data_written ;
2370- total_dma_data_written += dma_data_written ;
2371+ counter ++ ;
23712372
2372- start_register += data_per_frame ;
2373- }
2373+ p_data += data_per_frame ;
2374+ section_size -= data_per_frame ;
23742375
2375- if (data_size ) {
2376- header [1 ] = data_size ;
2377- header [2 ] = start_register >> 24 & 0xFF ;
2378- header [3 ] = start_register >> 16 & 0xFF ;
2379- header [4 ] = start_register >> 8 & 0xFF ;
2380- header [5 ] = start_register >> 0 & 0xFF ;
2376+ p_dma_buffer += dma_data_written ;
2377+ dma_buffer_size -= dma_data_written ;
2378+ total_dma_data_written += dma_data_written ;
23812379
2382- ret = sdw_cdns_prepare_write_pd0_buffer (header , SDW_CDNS_BRA_HDR ,
2383- p_data , data_size ,
2384- p_dma_buffer , dma_buffer_size ,
2385- & dma_data_written , counter );
2386- if (ret < 0 )
2387- return ret ;
2380+ start_register += data_per_frame ;
2381+ }
23882382
2389- total_dma_data_written += dma_data_written ;
2383+ if (section_size ) {
2384+ header [1 ] = section_size ;
2385+ header [2 ] = start_register >> 24 & 0xFF ;
2386+ header [3 ] = start_register >> 16 & 0xFF ;
2387+ header [4 ] = start_register >> 8 & 0xFF ;
2388+ header [5 ] = start_register >> 0 & 0xFF ;
2389+
2390+ ret = sdw_cdns_prepare_write_pd0_buffer (header , SDW_CDNS_BRA_HDR ,
2391+ p_data , section_size ,
2392+ p_dma_buffer , dma_buffer_size ,
2393+ & dma_data_written , counter );
2394+ if (ret < 0 )
2395+ return ret ;
2396+
2397+ counter ++ ;
2398+
2399+ p_dma_buffer += dma_data_written ;
2400+ dma_buffer_size -= dma_data_written ;
2401+ total_dma_data_written += dma_data_written ;
2402+ }
23902403 }
23912404
23922405 * dma_buffer_total_bytes = total_dma_data_written ;
@@ -2395,65 +2408,72 @@ int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data,
23952408}
23962409EXPORT_SYMBOL (sdw_cdns_prepare_write_dma_buffer );
23972410
2398- int sdw_cdns_prepare_read_dma_buffer (u8 dev_num , u32 start_register , int data_size ,
2411+ int sdw_cdns_prepare_read_dma_buffer (u8 dev_num , struct sdw_bpt_section * sec , int num_sec ,
23992412 int data_per_frame , u8 * dma_buffer , int dma_buffer_size ,
24002413 int * dma_buffer_total_bytes , unsigned int fake_size )
24012414{
24022415 int total_dma_data_written = 0 ;
24032416 u8 * p_dma_buffer = dma_buffer ;
24042417 u8 header [SDW_CDNS_BRA_HDR ];
2418+ unsigned int start_register ;
2419+ unsigned int data_size ;
24052420 int dma_data_written ;
24062421 u8 counter ;
24072422 int ret ;
2423+ int i ;
24082424
24092425 counter = CDNS_BPT_ROLLING_COUNTER_START ;
24102426
24112427 header [0 ] = 0 ; /* read command: BIT(1) cleared */
24122428 header [0 ] |= GENMASK (7 , 6 ); /* header is active */
24132429 header [0 ] |= (dev_num << 2 );
24142430
2415- while (data_size >= data_per_frame ) {
2416- header [1 ] = data_per_frame ;
2417- header [2 ] = start_register >> 24 & 0xFF ;
2418- header [3 ] = start_register >> 16 & 0xFF ;
2419- header [4 ] = start_register >> 8 & 0xFF ;
2420- header [5 ] = start_register >> 0 & 0xFF ;
2431+ for (i = 0 ; i < num_sec ; i ++ ) {
2432+ start_register = sec [i ].addr ;
2433+ data_size = sec [i ].len ;
2434+ while (data_size >= data_per_frame ) {
2435+ header [1 ] = data_per_frame ;
2436+ header [2 ] = start_register >> 24 & 0xFF ;
2437+ header [3 ] = start_register >> 16 & 0xFF ;
2438+ header [4 ] = start_register >> 8 & 0xFF ;
2439+ header [5 ] = start_register >> 0 & 0xFF ;
24212440
2422- ret = sdw_cdns_prepare_read_pd0_buffer (header , SDW_CDNS_BRA_HDR , p_dma_buffer ,
2423- dma_buffer_size , & dma_data_written ,
2424- counter );
2425- if (ret < 0 )
2426- return ret ;
2441+ ret = sdw_cdns_prepare_read_pd0_buffer (header , SDW_CDNS_BRA_HDR ,
2442+ p_dma_buffer , dma_buffer_size ,
2443+ & dma_data_written , counter );
2444+ if (ret < 0 )
2445+ return ret ;
24272446
2428- counter ++ ;
2447+ counter ++ ;
24292448
2430- data_size -= data_per_frame ;
2449+ data_size -= data_per_frame ;
24312450
2432- p_dma_buffer += dma_data_written ;
2433- dma_buffer_size -= dma_data_written ;
2434- total_dma_data_written += dma_data_written ;
2451+ p_dma_buffer += dma_data_written ;
2452+ dma_buffer_size -= dma_data_written ;
2453+ total_dma_data_written += dma_data_written ;
24352454
2436- start_register += data_per_frame ;
2437- }
2455+ start_register += data_per_frame ;
2456+ }
24382457
2439- if (data_size ) {
2440- header [1 ] = data_size ;
2441- header [2 ] = start_register >> 24 & 0xFF ;
2442- header [3 ] = start_register >> 16 & 0xFF ;
2443- header [4 ] = start_register >> 8 & 0xFF ;
2444- header [5 ] = start_register >> 0 & 0xFF ;
2458+ if (data_size ) {
2459+ header [1 ] = data_size ;
2460+ header [2 ] = start_register >> 24 & 0xFF ;
2461+ header [3 ] = start_register >> 16 & 0xFF ;
2462+ header [4 ] = start_register >> 8 & 0xFF ;
2463+ header [5 ] = start_register >> 0 & 0xFF ;
24452464
2446- ret = sdw_cdns_prepare_read_pd0_buffer (header , SDW_CDNS_BRA_HDR , p_dma_buffer ,
2447- dma_buffer_size , & dma_data_written ,
2448- counter );
2449- if (ret < 0 )
2450- return ret ;
2465+ ret = sdw_cdns_prepare_read_pd0_buffer (header , SDW_CDNS_BRA_HDR ,
2466+ p_dma_buffer , dma_buffer_size ,
2467+ & dma_data_written , counter );
2468+ if (ret < 0 )
2469+ return ret ;
24512470
2452- counter ++ ;
2471+ counter ++ ;
24532472
2454- p_dma_buffer += dma_data_written ;
2455- dma_buffer_size -= dma_data_written ;
2456- total_dma_data_written += dma_data_written ;
2473+ p_dma_buffer += dma_data_written ;
2474+ dma_buffer_size -= dma_data_written ;
2475+ total_dma_data_written += dma_data_written ;
2476+ }
24572477 }
24582478
24592479 /* Add fake frame */
@@ -2620,9 +2640,12 @@ static u8 extract_read_data(u32 *data, int num_bytes, u8 *buffer)
26202640}
26212641
26222642int sdw_cdns_check_read_response (struct device * dev , u8 * dma_buffer , int dma_buffer_size ,
2623- u8 * buffer , int buffer_size , int num_frames , int data_per_frame )
2643+ struct sdw_bpt_section * sec , int num_sec , int num_frames ,
2644+ int data_per_frame )
26242645{
26252646 int total_num_bytes = 0 ;
2647+ int buffer_size = 0 ;
2648+ int sec_index ;
26262649 u32 * p_data ;
26272650 u8 * p_buf ;
26282651 int counter ;
@@ -2636,7 +2659,10 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
26362659
26372660 counter = CDNS_BPT_ROLLING_COUNTER_START ;
26382661 p_data = (u32 * )dma_buffer ;
2639- p_buf = buffer ;
2662+
2663+ sec_index = 0 ;
2664+ p_buf = sec [sec_index ].buf ;
2665+ buffer_size = sec [sec_index ].len ;
26402666
26412667 for (i = 0 ; i < num_frames ; i ++ ) {
26422668 header = * p_data ++ ;
@@ -2676,6 +2702,18 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
26762702
26772703 counter ++ ;
26782704 counter &= GENMASK (3 , 0 );
2705+
2706+ if (buffer_size == total_num_bytes && (i + 1 ) < num_frames ) {
2707+ sec_index ++ ;
2708+ if (sec_index >= num_sec ) {
2709+ dev_err (dev , "%s: incorrect section index %d i %d\n" ,
2710+ __func__ , sec_index , i );
2711+ return - EINVAL ;
2712+ }
2713+ p_buf = sec [sec_index ].buf ;
2714+ buffer_size = sec [sec_index ].len ;
2715+ total_num_bytes = 0 ;
2716+ }
26792717 }
26802718 return 0 ;
26812719}
0 commit comments