Vengineerの妄想

人生を妄想しています。

Intel NPU の linux device driver に、VPU_50XX_HOST_XXXマクロがある!

はじめに

Intel の次のCPU (2025年)の Panther lake に搭載されるであろう、NPU v5 の linux の device driver がアップされていました。

NPU v5

このファイルで、

#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY           0x00030068u
#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST_DLY_MASK   GENMASK(7, 0)

#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY          0x0003006cu
#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK  GENMASK(7, 0)

#define VPU_40XX_HOST_SS_AON_IDLE_GEN                   0x00030200u
#define VPU_40XX_HOST_SS_AON_IDLE_GEN_EN_MASK               BIT_MASK(0)
#define VPU_40XX_HOST_SS_AON_IDLE_GEN_HW_PG_EN_MASK         BIT_MASK(1)

#define VPU_40XX_HOST_SS_AON_DPU_ACTIVE                 0x00030204u
#define VPU_40XX_HOST_SS_AON_DPU_ACTIVE_DPU_ACTIVE_MASK         BIT_MASK(0)

#define VPU_50XX_HOST_SS_AON_FABRIC_REQ_OVERRIDE            0x00030210u
#define VPU_50XX_HOST_SS_AON_FABRIC_REQ_OVERRIDE_REQ_OVERRIDE_MASK      BIT_MASK(0)

にマクロ定義があって、

ここで、使われています。

static void pwr_island_delay_set_50xx(struct ivpu_device *vdev)
{
    u32 val, post, status;

    if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) {
        post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT;
        status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT;
    } else {
        post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH;
        status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH;
    }

    val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY);
    val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST_DLY, post, val);
    REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val);

    val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY);
    val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY, STATUS_DLY, status, val);
    REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY, val);
}

ここに、

int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev)
{
    int ret;

    if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX)
        pwr_island_delay_set_50xx(vdev);

とありますね。

ここに、マクロ定義があるのですが、

#define IVPU_HW_IP_37XX 37
#define IVPU_HW_IP_40XX 40
#define IVPU_HW_IP_50XX 50
#define IVPU_HW_IP_60XX 60
  • IVPU_HW_IP_60XX

もありますね。こちらは、どこにも使われていませんね。

おわりに、

VPU_50XX を見つけたと思ったら、VPU_60XX もありました。

- accel/ivpu: Split IP and buttress code

にて、追加されたようです。

下記のように、

  • 37xx : Metero Lake / Arrow Lake
  • 40xx : Lunar Lake

のようです。