habanalabs: adding indication of boot fit loaded
authorOhad Sharabi <osharabi@habana.ai>
Thu, 21 Oct 2021 08:24:41 +0000 (11:24 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Sun, 26 Dec 2021 06:59:04 +0000 (08:59 +0200)
Up until now the driver stored indication if Linux was loaded on the
device CPU. This was needed in order to coordinate some tasks that are
performed by the Linux.

In future ASICs, many of those tasks will be performed by the boot
fit, so now we need the same indication of boot fit load status.

Signed-off-by: Ohad Sharabi <osharabi@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/misc/habanalabs/common/device.c
drivers/misc/habanalabs/common/firmware_if.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/goya/goya.c

index 2022e5d7b3ade9710cb107607e3e4b0a3c80f436..9674e25205325e84ef2556ff506b510933f14ee6 100644 (file)
@@ -1138,7 +1138,7 @@ kill_processes:
        hdev->asic_funcs->hw_fini(hdev, hard_reset, fw_reset);
 
        if (hard_reset) {
-               hdev->fw_loader.linux_loaded = false;
+               hdev->fw_loader.fw_comp_loaded = FW_TYPE_NONE;
 
                /* Release kernel context */
                if (hdev->kernel_ctx && hl_ctx_put(hdev->kernel_ctx) == 1)
@@ -1692,7 +1692,7 @@ void hl_device_fini(struct hl_device *hdev)
        /* Reset the H/W. It will be in idle state after this returns */
        hdev->asic_funcs->hw_fini(hdev, true, false);
 
-       hdev->fw_loader.linux_loaded = false;
+       hdev->fw_loader.fw_comp_loaded = FW_TYPE_NONE;
 
        /* Release kernel context */
        if ((hdev->kernel_ctx) && (hl_ctx_put(hdev->kernel_ctx) != 1))
index 482bed152c39c29d30ba366ae90ed66e8c6d7d66..8cbec10cddb1a24d9de5159e61fc749c8dbd96f5 100644 (file)
@@ -1919,6 +1919,8 @@ static void hl_fw_boot_fit_update_state(struct hl_device *hdev,
 {
        struct asic_fixed_properties *prop = &hdev->asic_prop;
 
+       hdev->fw_loader.fw_comp_loaded |= FW_TYPE_BOOT_CPU;
+
        /* Clear reset status since we need to read it again from boot CPU */
        prop->hard_reset_done_by_fw = false;
 
@@ -2127,7 +2129,7 @@ static void hl_fw_linux_update_state(struct hl_device *hdev,
 {
        struct asic_fixed_properties *prop = &hdev->asic_prop;
 
-       hdev->fw_loader.linux_loaded = true;
+       hdev->fw_loader.fw_comp_loaded |= FW_TYPE_LINUX;
 
        /* Clear reset status since we need to read again from app */
        prop->hard_reset_done_by_fw = false;
index aac73c8d2e1dadf19b89e241adfb71443e557bd3..b3c6b660c7aac7be58e0692cdb68cf64a47bcc27 100644 (file)
@@ -219,6 +219,7 @@ enum hl_fw_component {
 
 /**
  * enum hl_fw_types - F/W types present in the system
+ * @FW_TYPE_NONE: no FW component indication
  * @FW_TYPE_LINUX: Linux image for device CPU
  * @FW_TYPE_BOOT_CPU: Boot image for device CPU
  * @FW_TYPE_PREBOOT_CPU: Indicates pre-loaded CPUs are present in the system
@@ -226,6 +227,7 @@ enum hl_fw_component {
  * @FW_TYPE_ALL_TYPES: Mask for all types
  */
 enum hl_fw_types {
+       FW_TYPE_NONE = 0x0,
        FW_TYPE_LINUX = 0x1,
        FW_TYPE_BOOT_CPU = 0x2,
        FW_TYPE_PREBOOT_CPU = 0x4,
@@ -1059,7 +1061,8 @@ struct fw_image_props {
  * @skip_bmc: should BMC be skipped
  * @sram_bar_id: SRAM bar ID
  * @dram_bar_id: DRAM bar ID
- * @linux_loaded: true if linux was loaded so far
+ * @fw_comp_loaded: bitmask of loaded FW components. set bit meaning loaded
+ *                  component. values are set according to enum hl_fw_types.
  */
 struct fw_load_mgr {
        union {
@@ -1073,7 +1076,7 @@ struct fw_load_mgr {
        u8 skip_bmc;
        u8 sram_bar_id;
        u8 dram_bar_id;
-       u8 linux_loaded;
+       u8 fw_comp_loaded;
 };
 
 /**
index 2e39514ee102c51472cec396ad1ec35beeeaa87a..1dcce1bc976f58a338fcff2f16d37437702c2892 100644 (file)
@@ -4007,7 +4007,7 @@ static void gaudi_init_firmware_loader(struct hl_device *hdev)
        struct fw_load_mgr *fw_loader = &hdev->fw_loader;
 
        /* fill common fields */
-       fw_loader->linux_loaded = false;
+       fw_loader->fw_comp_loaded = FW_TYPE_NONE;
        fw_loader->boot_fit_img.image_name = GAUDI_BOOT_FIT_FILE;
        fw_loader->linux_img.image_name = GAUDI_LINUX_FW_FILE;
        fw_loader->cpu_timeout = GAUDI_CPU_TIMEOUT_USEC;
@@ -4290,7 +4290,7 @@ static void gaudi_hw_fini(struct hl_device *hdev, bool hard_reset, bool fw_reset
         * via the GIC. Otherwise, we need to use COMMS or the MSG_TO_CPU
         * registers in case of old F/Ws
         */
-       if (hdev->fw_loader.linux_loaded) {
+       if (hdev->fw_loader.fw_comp_loaded & FW_TYPE_LINUX) {
                irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ?
                                mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR :
                                le32_to_cpu(dyn_regs->gic_host_halt_irq);
index 6ee6d5b915a15c407762fb1f1e776131529f2559..ce06103292a0f1ea45b01f5fc1da2fdfb023f834 100644 (file)
@@ -2504,7 +2504,7 @@ static void goya_init_firmware_loader(struct hl_device *hdev)
        struct fw_load_mgr *fw_loader = &hdev->fw_loader;
 
        /* fill common fields */
-       fw_loader->linux_loaded = false;
+       fw_loader->fw_comp_loaded = FW_TYPE_NONE;
        fw_loader->boot_fit_img.image_name = GOYA_BOOT_FIT_FILE;
        fw_loader->linux_img.image_name = GOYA_LINUX_FW_FILE;
        fw_loader->cpu_timeout = GOYA_CPU_TIMEOUT_USEC;