|
8 | 8 | #include "ivpu_hw.h"
|
9 | 9 | #include "ivpu_hw_37xx_reg.h"
|
10 | 10 | #include "ivpu_hw_40xx_reg.h"
|
| 11 | +#include "ivpu_hw_btrs.h" |
11 | 12 | #include "ivpu_hw_ip.h"
|
12 | 13 | #include "ivpu_hw_reg_io.h"
|
13 | 14 | #include "ivpu_mmu.h"
|
14 | 15 | #include "ivpu_pm.h"
|
15 | 16 |
|
16 |
| -#define PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT 0 |
17 |
| -#define PWR_ISLAND_EN_POST_DLY_FREQ_HIGH 18 |
18 |
| -#define PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT 3 |
19 |
| -#define PWR_ISLAND_STATUS_DLY_FREQ_HIGH 46 |
20 | 17 | #define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC)
|
21 | 18 |
|
22 | 19 | #define TIM_SAFE_ENABLE 0xf1d0dead
|
@@ -268,20 +265,15 @@ void ivpu_hw_ip_idle_gen_disable(struct ivpu_device *vdev)
|
268 | 265 | idle_gen_drive_40xx(vdev, false);
|
269 | 266 | }
|
270 | 267 |
|
271 |
| -static void pwr_island_delay_set_50xx(struct ivpu_device *vdev) |
| 268 | +static void |
| 269 | +pwr_island_delay_set_50xx(struct ivpu_device *vdev, u32 post, u32 post1, u32 post2, u32 status) |
272 | 270 | {
|
273 |
| - u32 val, post, status; |
274 |
| - |
275 |
| - if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) { |
276 |
| - post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT; |
277 |
| - status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT; |
278 |
| - } else { |
279 |
| - post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH; |
280 |
| - status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH; |
281 |
| - } |
| 271 | + u32 val; |
282 | 272 |
|
283 | 273 | val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY);
|
284 | 274 | val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST_DLY, post, val);
|
| 275 | + val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST1_DLY, post1, val); |
| 276 | + val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST2_DLY, post2, val); |
285 | 277 | REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val);
|
286 | 278 |
|
287 | 279 | val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY);
|
@@ -686,13 +678,36 @@ static void dpu_active_drive_37xx(struct ivpu_device *vdev, bool enable)
|
686 | 678 | REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val);
|
687 | 679 | }
|
688 | 680 |
|
| 681 | +static void pwr_island_delay_set(struct ivpu_device *vdev) |
| 682 | +{ |
| 683 | + bool high = vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_HIGH; |
| 684 | + u32 post, post1, post2, status; |
| 685 | + |
| 686 | + if (ivpu_hw_ip_gen(vdev) < IVPU_HW_IP_50XX) |
| 687 | + return; |
| 688 | + |
| 689 | + switch (ivpu_device_id(vdev)) { |
| 690 | + case PCI_DEVICE_ID_PTL_P: |
| 691 | + post = high ? 18 : 0; |
| 692 | + post1 = 0; |
| 693 | + post2 = 0; |
| 694 | + status = high ? 46 : 3; |
| 695 | + break; |
| 696 | + |
| 697 | + default: |
| 698 | + dump_stack(); |
| 699 | + ivpu_err(vdev, "Unknown device ID\n"); |
| 700 | + return; |
| 701 | + } |
| 702 | + |
| 703 | + pwr_island_delay_set_50xx(vdev, post, post1, post2, status); |
| 704 | +} |
| 705 | + |
689 | 706 | int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev)
|
690 | 707 | {
|
691 | 708 | int ret;
|
692 | 709 |
|
693 |
| - if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX) |
694 |
| - pwr_island_delay_set_50xx(vdev); |
695 |
| - |
| 710 | + pwr_island_delay_set(vdev); |
696 | 711 | pwr_island_enable(vdev);
|
697 | 712 |
|
698 | 713 | ret = wait_for_pwr_island_status(vdev, 0x1);
|
|
0 commit comments