Commit 22a795b4 authored by Ohad Sharabi's avatar Ohad Sharabi Committed by Oded Gabbay

habanalabs: dynamic fw load reset protocol

First stage of the dynamic FW load protocol is to reset the protocol to
avoid residues from former load cycles.
Signed-off-by: default avatarOhad Sharabi <osharabi@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent 50f036df
...@@ -819,37 +819,58 @@ enum div_select_defs { ...@@ -819,37 +819,58 @@ enum div_select_defs {
}; };
/** /**
* struct fw_load_mgr - manager FW loading process * struct static_fw_load_mgr - static FW load manager
* @preboot_version_max_off: max offset to preboot version * @preboot_version_max_off: max offset to preboot version
* @boot_fit_version_max_off: max offset to boot fit version * @boot_fit_version_max_off: max offset to boot fit version
* @kmd_msg_to_cpu_reg: register address for KDM->CPU messages
* @cpu_cmd_status_to_host_reg: register address for CPU command status response
* @cpu_boot_status_reg: boot status register * @cpu_boot_status_reg: boot status register
* @cpu_boot_dev_status_reg: boot device status register * @cpu_boot_dev_status_reg: boot device status register
* @boot_err0_reg: boot error register * @boot_err0_reg: boot error register
* @preboot_version_offset_reg: SRAM offset to preboot version register * @preboot_version_offset_reg: SRAM offset to preboot version register
* @boot_fit_version_offset_reg: SRAM offset to boot fit version register * @boot_fit_version_offset_reg: SRAM offset to boot fit version register
* @sram_offset_mask: mask for getting offset into the SRAM * @sram_offset_mask: mask for getting offset into the SRAM
* @cpu_timeout: CPU response timeout in usec
* @boot_fit_timeout: Boot fit load timeout in usec
* @skip_bmc: should BMC be skipped
* @sram_bar_id: SRAM bar ID
*/ */
struct fw_load_mgr { struct static_fw_load_mgr {
u64 preboot_version_max_off; u64 preboot_version_max_off;
u64 boot_fit_version_max_off; u64 boot_fit_version_max_off;
u32 kmd_msg_to_cpu_reg;
u32 cpu_cmd_status_to_host_reg;
u32 cpu_boot_status_reg; u32 cpu_boot_status_reg;
u32 cpu_boot_dev_status_reg; u32 cpu_boot_dev_status_reg;
u32 boot_err0_reg; u32 boot_err0_reg;
u32 preboot_version_offset_reg; u32 preboot_version_offset_reg;
u32 boot_fit_version_offset_reg; u32 boot_fit_version_offset_reg;
u32 sram_offset_mask; u32 sram_offset_mask;
};
/**
* struct dynamic_fw_load_mgr - dynamic FW load manager
* TODO: currently empty, will be filled once boot stages implementation will
* progress.
*/
struct dynamic_fw_load_mgr {
};
/**
* struct fw_load_mgr - manager FW loading process
* @kmd_msg_to_cpu_reg: register address for KDM->CPU messages
* @cpu_cmd_status_to_host_reg: register address for CPU command status response
* @cpu_timeout: CPU response timeout in usec
* @boot_fit_timeout: Boot fit load timeout in usec
* @skip_bmc: should BMC be skipped
* @sram_bar_id: SRAM bar ID
* @static_loader: specific structure for static load
* @dynamic_loader: specific structure for dynamic load
*/
struct fw_load_mgr {
u32 kmd_msg_to_cpu_reg;
u32 cpu_cmd_status_to_host_reg;
u32 cpu_timeout; u32 cpu_timeout;
u32 boot_fit_timeout; u32 boot_fit_timeout;
u8 skip_bmc; u8 skip_bmc;
u8 sram_bar_id; u8 sram_bar_id;
union {
struct static_fw_load_mgr static_loader;
struct dynamic_fw_load_mgr dynamic_loader;
};
}; };
/** /**
......
...@@ -3691,24 +3691,44 @@ static int gaudi_load_boot_fit_to_device(struct hl_device *hdev) ...@@ -3691,24 +3691,44 @@ static int gaudi_load_boot_fit_to_device(struct hl_device *hdev)
return hl_fw_load_fw_to_device(hdev, GAUDI_BOOT_FIT_FILE, dst, 0, 0); return hl_fw_load_fw_to_device(hdev, GAUDI_BOOT_FIT_FILE, dst, 0, 0);
} }
static void gaudi_init_dynamic_firmware_loader(struct hl_device *hdev)
{
}
static void gaudi_init_static_firmware_loader(struct hl_device *hdev)
{
struct static_fw_load_mgr *static_loader;
static_loader = &hdev->fw_loader.static_loader;
static_loader->preboot_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
static_loader->boot_fit_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
static_loader->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
static_loader->cpu_boot_dev_status_reg = mmCPU_BOOT_DEV_STS0;
static_loader->boot_err0_reg = mmCPU_BOOT_ERR0;
static_loader->preboot_version_offset_reg = mmPREBOOT_VER_OFFSET;
static_loader->boot_fit_version_offset_reg = mmUBOOT_VER_OFFSET;
static_loader->sram_offset_mask = ~((u32)SRAM_BASE_ADDR);
}
static void gaudi_init_firmware_loader(struct hl_device *hdev) static void gaudi_init_firmware_loader(struct hl_device *hdev)
{ {
struct asic_fixed_properties *prop = &hdev->asic_prop;
struct fw_load_mgr *fw_loader = &hdev->fw_loader; struct fw_load_mgr *fw_loader = &hdev->fw_loader;
fw_loader->preboot_version_max_off = SRAM_SIZE - VERSION_MAX_LEN; /* fill common fields */
fw_loader->boot_fit_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
fw_loader->kmd_msg_to_cpu_reg = mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU; fw_loader->kmd_msg_to_cpu_reg = mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU;
fw_loader->cpu_cmd_status_to_host_reg = mmCPU_CMD_STATUS_TO_HOST; fw_loader->cpu_cmd_status_to_host_reg = mmCPU_CMD_STATUS_TO_HOST;
fw_loader->preboot_version_offset_reg = mmPREBOOT_VER_OFFSET;
fw_loader->boot_fit_version_offset_reg = mmUBOOT_VER_OFFSET;
fw_loader->sram_offset_mask = ~((u32)SRAM_BASE_ADDR);
fw_loader->cpu_timeout = GAUDI_CPU_TIMEOUT_USEC; fw_loader->cpu_timeout = GAUDI_CPU_TIMEOUT_USEC;
fw_loader->boot_fit_timeout = GAUDI_BOOT_FIT_REQ_TIMEOUT_USEC; fw_loader->boot_fit_timeout = GAUDI_BOOT_FIT_REQ_TIMEOUT_USEC;
fw_loader->skip_bmc = !hdev->bmc_enable; fw_loader->skip_bmc = !hdev->bmc_enable;
fw_loader->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
fw_loader->cpu_boot_dev_status_reg = mmCPU_BOOT_DEV_STS0;
fw_loader->boot_err0_reg = mmCPU_BOOT_ERR0;
fw_loader->sram_bar_id = SRAM_BAR_ID; fw_loader->sram_bar_id = SRAM_BAR_ID;
if (prop->dynamic_fw_load)
gaudi_init_dynamic_firmware_loader(hdev);
else
gaudi_init_static_firmware_loader(hdev);
} }
static int gaudi_init_cpu(struct hl_device *hdev) static int gaudi_init_cpu(struct hl_device *hdev)
......
...@@ -2402,24 +2402,44 @@ static int goya_load_boot_fit_to_device(struct hl_device *hdev) ...@@ -2402,24 +2402,44 @@ static int goya_load_boot_fit_to_device(struct hl_device *hdev)
return hl_fw_load_fw_to_device(hdev, GOYA_BOOT_FIT_FILE, dst, 0, 0); return hl_fw_load_fw_to_device(hdev, GOYA_BOOT_FIT_FILE, dst, 0, 0);
} }
static void goya_init_dynamic_firmware_loader(struct hl_device *hdev)
{
}
static void goya_init_static_firmware_loader(struct hl_device *hdev)
{
struct static_fw_load_mgr *static_loader;
static_loader = &hdev->fw_loader.static_loader;
static_loader->preboot_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
static_loader->boot_fit_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
static_loader->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
static_loader->cpu_boot_dev_status_reg = mmCPU_BOOT_DEV_STS0;
static_loader->boot_err0_reg = mmCPU_BOOT_ERR0;
static_loader->preboot_version_offset_reg = mmPREBOOT_VER_OFFSET;
static_loader->boot_fit_version_offset_reg = mmUBOOT_VER_OFFSET;
static_loader->sram_offset_mask = ~((u32)SRAM_BASE_ADDR);
}
static void goya_init_firmware_loader(struct hl_device *hdev) static void goya_init_firmware_loader(struct hl_device *hdev)
{ {
struct asic_fixed_properties *prop = &hdev->asic_prop;
struct fw_load_mgr *fw_loader = &hdev->fw_loader; struct fw_load_mgr *fw_loader = &hdev->fw_loader;
fw_loader->preboot_version_max_off = SRAM_SIZE - VERSION_MAX_LEN; /* fill common fields */
fw_loader->boot_fit_version_max_off = SRAM_SIZE - VERSION_MAX_LEN;
fw_loader->kmd_msg_to_cpu_reg = mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU; fw_loader->kmd_msg_to_cpu_reg = mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU;
fw_loader->cpu_cmd_status_to_host_reg = mmCPU_CMD_STATUS_TO_HOST; fw_loader->cpu_cmd_status_to_host_reg = mmCPU_CMD_STATUS_TO_HOST;
fw_loader->preboot_version_offset_reg = mmPREBOOT_VER_OFFSET;
fw_loader->boot_fit_version_offset_reg = mmUBOOT_VER_OFFSET;
fw_loader->sram_offset_mask = ~((u32)SRAM_BASE_ADDR);
fw_loader->cpu_timeout = GOYA_CPU_TIMEOUT_USEC; fw_loader->cpu_timeout = GOYA_CPU_TIMEOUT_USEC;
fw_loader->boot_fit_timeout = GOYA_BOOT_FIT_REQ_TIMEOUT_USEC; fw_loader->boot_fit_timeout = GOYA_BOOT_FIT_REQ_TIMEOUT_USEC;
fw_loader->skip_bmc = false; fw_loader->skip_bmc = false;
fw_loader->cpu_boot_status_reg = mmPSOC_GLOBAL_CONF_CPU_BOOT_STATUS;
fw_loader->cpu_boot_dev_status_reg = mmCPU_BOOT_DEV_STS0;
fw_loader->boot_err0_reg = mmCPU_BOOT_ERR0;
fw_loader->sram_bar_id = SRAM_CFG_BAR_ID; fw_loader->sram_bar_id = SRAM_CFG_BAR_ID;
if (prop->dynamic_fw_load)
goya_init_dynamic_firmware_loader(hdev);
else
goya_init_static_firmware_loader(hdev);
} }
static int goya_init_cpu(struct hl_device *hdev) static int goya_init_cpu(struct hl_device *hdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment