From: Oded Gabbay <ogabbay@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: Koby Elbaz <kelbaz@habana.ai>
Subject: [PATCH 5/5] habanalabs/gaudi: refactor hard-reset related code
Date: Mon, 21 Jun 2021 10:24:06 +0300 [thread overview]
Message-ID: <20210621072406.5421-5-ogabbay@kernel.org> (raw)
In-Reply-To: <20210621072406.5421-1-ogabbay@kernel.org>
From: Koby Elbaz <kelbaz@habana.ai>
There is code related to hard-reset, which is done in gaudi specific
code. However, this code can be used by future ASICs and therefore it
is better to move it to the common code section.
Signed-off-by: Koby Elbaz <kelbaz@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
---
drivers/misc/habanalabs/common/firmware_if.c | 41 +++++++++++++++++
drivers/misc/habanalabs/common/habanalabs.h | 9 ++++
drivers/misc/habanalabs/gaudi/gaudi.c | 48 +++-----------------
drivers/misc/habanalabs/gaudi/gaudiP.h | 5 --
4 files changed, 56 insertions(+), 47 deletions(-)
diff --git a/drivers/misc/habanalabs/common/firmware_if.c b/drivers/misc/habanalabs/common/firmware_if.c
index ce87053d4fde..2e4d04ec6b53 100644
--- a/drivers/misc/habanalabs/common/firmware_if.c
+++ b/drivers/misc/habanalabs/common/firmware_if.c
@@ -972,6 +972,47 @@ int hl_fw_cpucp_power_get(struct hl_device *hdev, u64 *power)
return rc;
}
+void hl_fw_ask_hard_reset_without_linux(struct hl_device *hdev)
+{
+ struct static_fw_load_mgr *static_loader =
+ &hdev->fw_loader.static_loader;
+ int rc;
+
+ if (hdev->asic_prop.dynamic_fw_load) {
+ rc = hl_fw_dynamic_send_protocol_cmd(hdev, &hdev->fw_loader,
+ COMMS_RST_DEV, 0, false,
+ hdev->fw_loader.cpu_timeout);
+ if (rc)
+ dev_warn(hdev->dev, "Failed sending COMMS_RST_DEV\n");
+ } else {
+ WREG32(static_loader->kmd_msg_to_cpu_reg, KMD_MSG_RST_DEV);
+ }
+}
+
+void hl_fw_ask_halt_machine_without_linux(struct hl_device *hdev)
+{
+ struct static_fw_load_mgr *static_loader =
+ &hdev->fw_loader.static_loader;
+ int rc;
+
+ if (hdev->device_cpu_is_halted)
+ return;
+
+ /* Stop device CPU to make sure nothing bad happens */
+ if (hdev->asic_prop.dynamic_fw_load) {
+ rc = hl_fw_dynamic_send_protocol_cmd(hdev, &hdev->fw_loader,
+ COMMS_GOTO_WFE, 0, true,
+ hdev->fw_loader.cpu_timeout);
+ if (rc)
+ dev_warn(hdev->dev, "Failed sending COMMS_GOTO_WFE\n");
+ } else {
+ WREG32(static_loader->kmd_msg_to_cpu_reg, KMD_MSG_GOTO_WFE);
+ msleep(static_loader->cpu_reset_wait_msec);
+ }
+
+ hdev->device_cpu_is_halted = true;
+}
+
static void detect_cpu_boot_status(struct hl_device *hdev, u32 status)
{
/* Some of the status codes below are deprecated in newer f/w
diff --git a/drivers/misc/habanalabs/common/habanalabs.h b/drivers/misc/habanalabs/common/habanalabs.h
index 98aa8524a6a6..6b3cdd7e068a 100644
--- a/drivers/misc/habanalabs/common/habanalabs.h
+++ b/drivers/misc/habanalabs/common/habanalabs.h
@@ -894,6 +894,7 @@ struct pci_mem_region {
* @preboot_version_offset_reg: SRAM offset to preboot version register
* @boot_fit_version_offset_reg: SRAM offset to boot fit version register
* @sram_offset_mask: mask for getting offset into the SRAM
+ * @cpu_reset_wait_msec: used when setting WFE via kmd_msg_to_cpu_reg
*/
struct static_fw_load_mgr {
u64 preboot_version_max_off;
@@ -908,6 +909,7 @@ struct static_fw_load_mgr {
u32 preboot_version_offset_reg;
u32 boot_fit_version_offset_reg;
u32 sram_offset_mask;
+ u32 cpu_reset_wait_msec;
};
/**
@@ -2199,6 +2201,10 @@ struct hl_mmu_funcs {
* triggered, and cleared after it is shared with preboot.
* @skip_reset_on_timeout: Skip device reset if CS has timed out, wait for it to
* complete instead.
+ * @device_cpu_is_halted: Flag to indicate whether the device CPU was already
+ * halted. We can't halt it again because the COMMS
+ * protocol will throw an error. Relevant only for
+ * cases where Linux was not loaded to device CPU
*/
struct hl_device {
struct pci_dev *pdev;
@@ -2315,6 +2321,7 @@ struct hl_device {
u8 supports_staged_submission;
u8 curr_reset_cause;
u8 skip_reset_on_timeout;
+ u8 device_cpu_is_halted;
/* Parameters for bring-up */
u64 nic_ports_mask;
@@ -2596,6 +2603,8 @@ int get_used_pll_index(struct hl_device *hdev, u32 input_pll_index,
int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, u32 pll_index,
u16 *pll_freq_arr);
int hl_fw_cpucp_power_get(struct hl_device *hdev, u64 *power);
+void hl_fw_ask_hard_reset_without_linux(struct hl_device *hdev);
+void hl_fw_ask_halt_machine_without_linux(struct hl_device *hdev);
int hl_fw_init_cpu(struct hl_device *hdev);
int hl_fw_read_preboot_status(struct hl_device *hdev, u32 cpu_boot_status_reg,
u32 sts_boot_dev_sts0_reg,
diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c
index 82d5613f291b..aa8a0ca5aca2 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi.c
@@ -1934,45 +1934,6 @@ static void gaudi_disable_msi(struct hl_device *hdev)
gaudi->hw_cap_initialized &= ~HW_CAP_MSI;
}
-static void gaudi_ask_hard_reset_without_linux(struct hl_device *hdev)
-{
- int rc;
-
- if (hdev->asic_prop.dynamic_fw_load) {
- rc = hl_fw_dynamic_send_protocol_cmd(hdev, &hdev->fw_loader,
- COMMS_RST_DEV, 0, false,
- hdev->fw_loader.cpu_timeout);
- if (rc)
- dev_warn(hdev->dev, "Failed sending COMMS_RST_DEV\n");
- } else {
- WREG32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU, KMD_MSG_RST_DEV);
- }
-}
-
-static void gaudi_ask_halt_machine_without_linux(struct hl_device *hdev)
-{
- struct gaudi_device *gaudi = hdev->asic_specific;
- int rc;
-
- if (gaudi && gaudi->device_cpu_is_halted)
- return;
-
- /* Stop device CPU to make sure nothing bad happens */
- if (hdev->asic_prop.dynamic_fw_load) {
- rc = hl_fw_dynamic_send_protocol_cmd(hdev, &hdev->fw_loader,
- COMMS_GOTO_WFE, 0, true,
- hdev->fw_loader.cpu_timeout);
- if (rc)
- dev_warn(hdev->dev, "Failed sending COMMS_GOTO_WFE\n");
- } else {
- WREG32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU, KMD_MSG_GOTO_WFE);
- msleep(GAUDI_CPU_RESET_WAIT_MSEC);
- }
-
- if (gaudi)
- gaudi->device_cpu_is_halted = true;
-}
-
static void gaudi_init_scrambler_sram(struct hl_device *hdev)
{
struct gaudi_device *gaudi = hdev->asic_specific;
@@ -3859,6 +3820,9 @@ static void gaudi_init_static_firmware_loader(struct hl_device *hdev)
static_loader->preboot_version_offset_reg = mmPREBOOT_VER_OFFSET;
static_loader->boot_fit_version_offset_reg = mmUBOOT_VER_OFFSET;
static_loader->sram_offset_mask = ~(lower_32_bits(SRAM_BASE_ADDR));
+ static_loader->cpu_reset_wait_msec = hdev->pldm ?
+ GAUDI_PLDM_RESET_WAIT_MSEC :
+ GAUDI_CPU_RESET_WAIT_MSEC;
}
static void gaudi_init_firmware_loader(struct hl_device *hdev)
@@ -4151,9 +4115,9 @@ static void gaudi_hw_fini(struct hl_device *hdev, bool hard_reset)
gaudi_irq_map_table[GAUDI_EVENT_HALT_MACHINE].cpu_id);
} else {
if (hdev->asic_prop.hard_reset_done_by_fw)
- gaudi_ask_hard_reset_without_linux(hdev);
+ hl_fw_ask_hard_reset_without_linux(hdev);
else
- gaudi_ask_halt_machine_without_linux(hdev);
+ hl_fw_ask_halt_machine_without_linux(hdev);
}
if (driver_performs_reset) {
@@ -4228,7 +4192,7 @@ static void gaudi_hw_fini(struct hl_device *hdev, bool hard_reset)
memset(gaudi->events_stat, 0, sizeof(gaudi->events_stat));
- gaudi->device_cpu_is_halted = false;
+ hdev->device_cpu_is_halted = false;
}
}
diff --git a/drivers/misc/habanalabs/gaudi/gaudiP.h b/drivers/misc/habanalabs/gaudi/gaudiP.h
index b23336af191e..957bf3720f70 100644
--- a/drivers/misc/habanalabs/gaudi/gaudiP.h
+++ b/drivers/misc/habanalabs/gaudi/gaudiP.h
@@ -315,10 +315,6 @@ struct gaudi_internal_qman_info {
* Multi MSI is possible only with IOMMU enabled.
* @mmu_cache_inv_pi: PI for MMU cache invalidation flow. The H/W expects an
* 8-bit value so use u8.
- * @device_cpu_is_halted: Flag to indicate whether the device CPU was already
- * halted. We can't halt it again because the COMMS
- * protocol will throw an error. Relevant only for
- * cases where Linux was not loaded to device CPU
*/
struct gaudi_device {
int (*cpucp_info_get)(struct hl_device *hdev);
@@ -340,7 +336,6 @@ struct gaudi_device {
u32 hw_cap_initialized;
u8 multi_msi_mode;
u8 mmu_cache_inv_pi;
- u8 device_cpu_is_halted;
};
void gaudi_init_security(struct hl_device *hdev);
--
2.25.1
prev parent reply other threads:[~2021-06-21 7:24 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-21 7:24 [PATCH 1/5] habanalabs: allow reset upon device release Oded Gabbay
2021-06-21 7:24 ` [PATCH 2/5] habanalabs: get lower/upper 32 bits via masking Oded Gabbay
2021-06-21 7:24 ` [PATCH 3/5] habanalabs: add validity check for signal cs Oded Gabbay
2021-06-21 7:24 ` [PATCH 4/5] habanalabs/gaudi: add support for NIC DERR Oded Gabbay
2021-06-21 7:24 ` Oded Gabbay [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210621072406.5421-5-ogabbay@kernel.org \
--to=ogabbay@kernel.org \
--cc=kelbaz@habana.ai \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.