@@ -2325,14 +2325,48 @@ void dcn32_patch_dpm_table(struct clk_bw_params *bw_params)
2325
2325
bw_params -> clk_table .entries [0 ].memclk_mhz = dcn3_2_soc .clock_limits [0 ].dram_speed_mts / 16 ;
2326
2326
}
2327
2327
2328
- static int build_synthetic_soc_states (struct clk_bw_params * bw_params ,
2328
+ /*
2329
+ * override_max_clk_values - Overwrite the max clock frequencies with the max DC mode timings
2330
+ * Input:
2331
+ * max_clk_limit - struct containing the desired clock timings
2332
+ * Output:
2333
+ * curr_clk_limit - struct containing the timings that need to be overwritten
2334
+ * Return: 0 upon success, non-zero for failure
2335
+ */
2336
+ static int override_max_clk_values (struct clk_limit_table_entry * max_clk_limit ,
2337
+ struct clk_limit_table_entry * curr_clk_limit )
2338
+ {
2339
+ if (NULL == max_clk_limit || NULL == curr_clk_limit )
2340
+ return -1 ; //invalid parameters
2341
+
2342
+ //only overwrite if desired max clock frequency is initialized
2343
+ if (max_clk_limit -> dcfclk_mhz != 0 )
2344
+ curr_clk_limit -> dcfclk_mhz = max_clk_limit -> dcfclk_mhz ;
2345
+
2346
+ if (max_clk_limit -> fclk_mhz != 0 )
2347
+ curr_clk_limit -> fclk_mhz = max_clk_limit -> fclk_mhz ;
2348
+
2349
+ if (max_clk_limit -> memclk_mhz != 0 )
2350
+ curr_clk_limit -> memclk_mhz = max_clk_limit -> memclk_mhz ;
2351
+
2352
+ if (max_clk_limit -> socclk_mhz != 0 )
2353
+ curr_clk_limit -> socclk_mhz = max_clk_limit -> socclk_mhz ;
2354
+
2355
+ if (max_clk_limit -> dtbclk_mhz != 0 )
2356
+ curr_clk_limit -> dtbclk_mhz = max_clk_limit -> dtbclk_mhz ;
2357
+
2358
+ if (max_clk_limit -> dispclk_mhz != 0 )
2359
+ curr_clk_limit -> dispclk_mhz = max_clk_limit -> dispclk_mhz ;
2360
+
2361
+ return 0 ;
2362
+ }
2363
+
2364
+ static int build_synthetic_soc_states (bool disable_dc_mode_overwrite , struct clk_bw_params * bw_params ,
2329
2365
struct _vcs_dpi_voltage_scaling_st * table , unsigned int * num_entries )
2330
2366
{
2331
2367
int i , j ;
2332
2368
struct _vcs_dpi_voltage_scaling_st entry = {0 };
2333
-
2334
- unsigned int max_dcfclk_mhz = 0 , max_dispclk_mhz = 0 , max_dppclk_mhz = 0 ,
2335
- max_phyclk_mhz = 0 , max_dtbclk_mhz = 0 , max_fclk_mhz = 0 , max_uclk_mhz = 0 ;
2369
+ struct clk_limit_table_entry max_clk_data = {0 };
2336
2370
2337
2371
unsigned int min_dcfclk_mhz = 199 , min_fclk_mhz = 299 ;
2338
2372
@@ -2343,51 +2377,76 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
2343
2377
unsigned int num_fclk_dpms = 0 ;
2344
2378
unsigned int num_dcfclk_dpms = 0 ;
2345
2379
2346
- for (i = 0 ; i < MAX_NUM_DPM_LVL ; i ++ ) {
2347
- if (bw_params -> clk_table .entries [i ].dcfclk_mhz > max_dcfclk_mhz )
2348
- max_dcfclk_mhz = bw_params -> clk_table .entries [i ].dcfclk_mhz ;
2349
- if (bw_params -> clk_table .entries [i ].fclk_mhz > max_fclk_mhz )
2350
- max_fclk_mhz = bw_params -> clk_table .entries [i ].fclk_mhz ;
2351
- if (bw_params -> clk_table .entries [i ].memclk_mhz > max_uclk_mhz )
2352
- max_uclk_mhz = bw_params -> clk_table .entries [i ].memclk_mhz ;
2353
- if (bw_params -> clk_table .entries [i ].dispclk_mhz > max_dispclk_mhz )
2354
- max_dispclk_mhz = bw_params -> clk_table .entries [i ].dispclk_mhz ;
2355
- if (bw_params -> clk_table .entries [i ].dppclk_mhz > max_dppclk_mhz )
2356
- max_dppclk_mhz = bw_params -> clk_table .entries [i ].dppclk_mhz ;
2357
- if (bw_params -> clk_table .entries [i ].phyclk_mhz > max_phyclk_mhz )
2358
- max_phyclk_mhz = bw_params -> clk_table .entries [i ].phyclk_mhz ;
2359
- if (bw_params -> clk_table .entries [i ].dtbclk_mhz > max_dtbclk_mhz )
2360
- max_dtbclk_mhz = bw_params -> clk_table .entries [i ].dtbclk_mhz ;
2380
+ unsigned int num_dc_uclk_dpms = 0 ;
2381
+ unsigned int num_dc_fclk_dpms = 0 ;
2382
+ unsigned int num_dc_dcfclk_dpms = 0 ;
2361
2383
2362
- if (bw_params -> clk_table .entries [i ].memclk_mhz > 0 )
2384
+ for (i = 0 ; i < MAX_NUM_DPM_LVL ; i ++ ) {
2385
+ if (bw_params -> clk_table .entries [i ].dcfclk_mhz > max_clk_data .dcfclk_mhz )
2386
+ max_clk_data .dcfclk_mhz = bw_params -> clk_table .entries [i ].dcfclk_mhz ;
2387
+ if (bw_params -> clk_table .entries [i ].fclk_mhz > max_clk_data .fclk_mhz )
2388
+ max_clk_data .fclk_mhz = bw_params -> clk_table .entries [i ].fclk_mhz ;
2389
+ if (bw_params -> clk_table .entries [i ].memclk_mhz > max_clk_data .memclk_mhz )
2390
+ max_clk_data .memclk_mhz = bw_params -> clk_table .entries [i ].memclk_mhz ;
2391
+ if (bw_params -> clk_table .entries [i ].dispclk_mhz > max_clk_data .dispclk_mhz )
2392
+ max_clk_data .dispclk_mhz = bw_params -> clk_table .entries [i ].dispclk_mhz ;
2393
+ if (bw_params -> clk_table .entries [i ].dppclk_mhz > max_clk_data .dppclk_mhz )
2394
+ max_clk_data .dppclk_mhz = bw_params -> clk_table .entries [i ].dppclk_mhz ;
2395
+ if (bw_params -> clk_table .entries [i ].phyclk_mhz > max_clk_data .phyclk_mhz )
2396
+ max_clk_data .phyclk_mhz = bw_params -> clk_table .entries [i ].phyclk_mhz ;
2397
+ if (bw_params -> clk_table .entries [i ].dtbclk_mhz > max_clk_data .dtbclk_mhz )
2398
+ max_clk_data .dtbclk_mhz = bw_params -> clk_table .entries [i ].dtbclk_mhz ;
2399
+
2400
+ if (bw_params -> clk_table .entries [i ].memclk_mhz > 0 ) {
2363
2401
num_uclk_dpms ++ ;
2364
- if (bw_params -> clk_table .entries [i ].fclk_mhz > 0 )
2402
+ if (bw_params -> clk_table .entries [i ].memclk_mhz <= bw_params -> dc_mode_limit .memclk_mhz )
2403
+ num_dc_uclk_dpms ++ ;
2404
+ }
2405
+ if (bw_params -> clk_table .entries [i ].fclk_mhz > 0 ) {
2365
2406
num_fclk_dpms ++ ;
2366
- if (bw_params -> clk_table .entries [i ].dcfclk_mhz > 0 )
2407
+ if (bw_params -> clk_table .entries [i ].fclk_mhz <= bw_params -> dc_mode_limit .fclk_mhz )
2408
+ num_dc_fclk_dpms ++ ;
2409
+ }
2410
+ if (bw_params -> clk_table .entries [i ].dcfclk_mhz > 0 ) {
2367
2411
num_dcfclk_dpms ++ ;
2412
+ if (bw_params -> clk_table .entries [i ].dcfclk_mhz <= bw_params -> dc_mode_limit .dcfclk_mhz )
2413
+ num_dc_dcfclk_dpms ++ ;
2414
+ }
2415
+ }
2416
+
2417
+ if (!disable_dc_mode_overwrite ) {
2418
+ //Overwrite max frequencies with max DC mode frequencies for DC mode systems
2419
+ override_max_clk_values (& bw_params -> dc_mode_limit , & max_clk_data );
2420
+ num_uclk_dpms = num_dc_uclk_dpms ;
2421
+ num_fclk_dpms = num_dc_fclk_dpms ;
2422
+ num_dcfclk_dpms = num_dc_dcfclk_dpms ;
2423
+ bw_params -> clk_table .num_entries_per_clk .num_memclk_levels = num_uclk_dpms ;
2424
+ bw_params -> clk_table .num_entries_per_clk .num_fclk_levels = num_fclk_dpms ;
2368
2425
}
2369
2426
2370
2427
if (num_dcfclk_dpms > 0 && bw_params -> clk_table .entries [0 ].fclk_mhz > min_fclk_mhz )
2371
2428
min_fclk_mhz = bw_params -> clk_table .entries [0 ].fclk_mhz ;
2372
2429
2373
- if (!max_dcfclk_mhz || !max_dispclk_mhz || !max_dtbclk_mhz )
2430
+ if (!max_clk_data . dcfclk_mhz || !max_clk_data . dispclk_mhz || !max_clk_data . dtbclk_mhz )
2374
2431
return -1 ;
2375
2432
2376
- if (max_dppclk_mhz == 0 )
2377
- max_dppclk_mhz = max_dispclk_mhz ;
2433
+ if (max_clk_data . dppclk_mhz == 0 )
2434
+ max_clk_data . dppclk_mhz = max_clk_data . dispclk_mhz ;
2378
2435
2379
- if (max_fclk_mhz == 0 )
2380
- max_fclk_mhz = max_dcfclk_mhz * dcn3_2_soc .pct_ideal_sdp_bw_after_urgent / dcn3_2_soc .pct_ideal_fabric_bw_after_urgent ;
2436
+ if (max_clk_data .fclk_mhz == 0 )
2437
+ max_clk_data .fclk_mhz = max_clk_data .dcfclk_mhz *
2438
+ dcn3_2_soc .pct_ideal_sdp_bw_after_urgent /
2439
+ dcn3_2_soc .pct_ideal_fabric_bw_after_urgent ;
2381
2440
2382
- if (max_phyclk_mhz == 0 )
2383
- max_phyclk_mhz = dcn3_2_soc .clock_limits [0 ].phyclk_mhz ;
2441
+ if (max_clk_data . phyclk_mhz == 0 )
2442
+ max_clk_data . phyclk_mhz = dcn3_2_soc .clock_limits [0 ].phyclk_mhz ;
2384
2443
2385
2444
* num_entries = 0 ;
2386
- entry .dispclk_mhz = max_dispclk_mhz ;
2387
- entry .dscclk_mhz = max_dispclk_mhz / 3 ;
2388
- entry .dppclk_mhz = max_dppclk_mhz ;
2389
- entry .dtbclk_mhz = max_dtbclk_mhz ;
2390
- entry .phyclk_mhz = max_phyclk_mhz ;
2445
+ entry .dispclk_mhz = max_clk_data . dispclk_mhz ;
2446
+ entry .dscclk_mhz = max_clk_data . dispclk_mhz / 3 ;
2447
+ entry .dppclk_mhz = max_clk_data . dppclk_mhz ;
2448
+ entry .dtbclk_mhz = max_clk_data . dtbclk_mhz ;
2449
+ entry .phyclk_mhz = max_clk_data . phyclk_mhz ;
2391
2450
entry .phyclk_d18_mhz = dcn3_2_soc .clock_limits [0 ].phyclk_d18_mhz ;
2392
2451
entry .phyclk_d32_mhz = dcn3_2_soc .clock_limits [0 ].phyclk_d32_mhz ;
2393
2452
@@ -2401,7 +2460,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
2401
2460
}
2402
2461
2403
2462
// Insert the max DCFCLK
2404
- entry .dcfclk_mhz = max_dcfclk_mhz ;
2463
+ entry .dcfclk_mhz = max_clk_data . dcfclk_mhz ;
2405
2464
entry .fabricclk_mhz = 0 ;
2406
2465
entry .dram_speed_mts = 0 ;
2407
2466
@@ -2429,7 +2488,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
2429
2488
// If FCLK fine grained, only insert max
2430
2489
else {
2431
2490
entry .dcfclk_mhz = 0 ;
2432
- entry .fabricclk_mhz = max_fclk_mhz ;
2491
+ entry .fabricclk_mhz = max_clk_data . fclk_mhz ;
2433
2492
entry .dram_speed_mts = 0 ;
2434
2493
2435
2494
insert_entry_into_table_sorted (table , num_entries , & entry );
@@ -2441,9 +2500,9 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,
2441
2500
2442
2501
// Remove states that require higher clocks than are supported
2443
2502
for (i = * num_entries - 1 ; i >= 0 ; i -- ) {
2444
- if (table [i ].dcfclk_mhz > max_dcfclk_mhz ||
2445
- table [i ].fabricclk_mhz > max_fclk_mhz ||
2446
- table [i ].dram_speed_mts > max_uclk_mhz * 16 )
2503
+ if (table [i ].dcfclk_mhz > max_clk_data . dcfclk_mhz ||
2504
+ table [i ].fabricclk_mhz > max_clk_data . fclk_mhz ||
2505
+ table [i ].dram_speed_mts > max_clk_data . memclk_mhz * 16 )
2447
2506
remove_entry_from_table_at_index (table , num_entries , i );
2448
2507
}
2449
2508
@@ -2756,7 +2815,8 @@ void dcn32_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_pa
2756
2815
dcn3_2_soc .clock_limits [i ].phyclk_d32_mhz = dcn3_2_soc .clock_limits [0 ].phyclk_d32_mhz ;
2757
2816
}
2758
2817
} else {
2759
- build_synthetic_soc_states (bw_params , dcn3_2_soc .clock_limits , & dcn3_2_soc .num_states );
2818
+ build_synthetic_soc_states (dc -> debug .disable_dc_mode_overwrite , bw_params ,
2819
+ dcn3_2_soc .clock_limits , & dcn3_2_soc .num_states );
2760
2820
}
2761
2821
2762
2822
/* Re-init DML with updated bb */
0 commit comments