summaryrefslogtreecommitdiff
path: root/drivers/misc/habanalabs/common/decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/habanalabs/common/decoder.c')
-rw-r--r--drivers/misc/habanalabs/common/decoder.c133
1 files changed, 0 insertions, 133 deletions
diff --git a/drivers/misc/habanalabs/common/decoder.c b/drivers/misc/habanalabs/common/decoder.c
deleted file mode 100644
index 2aab14d74b53..000000000000
--- a/drivers/misc/habanalabs/common/decoder.c
+++ /dev/null
@@ -1,133 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-
-/*
- * Copyright 2022 HabanaLabs, Ltd.
- * All Rights Reserved.
- */
-
-#include "habanalabs.h"
-
-#define VCMD_CONTROL_OFFSET 0x40 /* SWREG16 */
-#define VCMD_IRQ_STATUS_OFFSET 0x44 /* SWREG17 */
-
-#define VCMD_IRQ_STATUS_ENDCMD_MASK 0x1
-#define VCMD_IRQ_STATUS_BUSERR_MASK 0x2
-#define VCMD_IRQ_STATUS_TIMEOUT_MASK 0x4
-#define VCMD_IRQ_STATUS_CMDERR_MASK 0x8
-#define VCMD_IRQ_STATUS_ABORT_MASK 0x10
-#define VCMD_IRQ_STATUS_RESET_MASK 0x20
-
-static void dec_print_abnrm_intr_source(struct hl_device *hdev, u32 irq_status)
-{
- const char *format = "abnormal interrupt source:%s%s%s%s%s%s\n";
- char *intr_source[6] = {"Unknown", "", "", "", "", ""};
- int i = 0;
-
- if (!irq_status)
- return;
-
- if (irq_status & VCMD_IRQ_STATUS_ENDCMD_MASK)
- intr_source[i++] = " ENDCMD";
- if (irq_status & VCMD_IRQ_STATUS_BUSERR_MASK)
- intr_source[i++] = " BUSERR";
- if (irq_status & VCMD_IRQ_STATUS_TIMEOUT_MASK)
- intr_source[i++] = " TIMEOUT";
- if (irq_status & VCMD_IRQ_STATUS_CMDERR_MASK)
- intr_source[i++] = " CMDERR";
- if (irq_status & VCMD_IRQ_STATUS_ABORT_MASK)
- intr_source[i++] = " ABORT";
- if (irq_status & VCMD_IRQ_STATUS_RESET_MASK)
- intr_source[i++] = " RESET";
-
- dev_err(hdev->dev, format, intr_source[0], intr_source[1],
- intr_source[2], intr_source[3], intr_source[4], intr_source[5]);
-}
-
-static void dec_error_intr_work(struct hl_device *hdev, u32 base_addr, u32 core_id)
-{
- bool reset_required = false;
- u32 irq_status;
-
- irq_status = RREG32(base_addr + VCMD_IRQ_STATUS_OFFSET);
-
- dev_err(hdev->dev, "Decoder abnormal interrupt %#x, core %d\n", irq_status, core_id);
-
- dec_print_abnrm_intr_source(hdev, irq_status);
-
- if (irq_status & VCMD_IRQ_STATUS_TIMEOUT_MASK)
- reset_required = true;
-
- /* Clear the interrupt */
- WREG32(base_addr + VCMD_IRQ_STATUS_OFFSET, irq_status);
-
- /* Flush the interrupt clear */
- RREG32(base_addr + VCMD_IRQ_STATUS_OFFSET);
-
- if (reset_required)
- hl_device_reset(hdev, HL_DRV_RESET_HARD);
-}
-
-static void dec_completion_abnrm(struct work_struct *work)
-{
- struct hl_dec *dec = container_of(work, struct hl_dec, completion_abnrm_work);
- struct hl_device *hdev = dec->hdev;
-
- dec_error_intr_work(hdev, dec->base_addr, dec->core_id);
-}
-
-void hl_dec_fini(struct hl_device *hdev)
-{
- kfree(hdev->dec);
-}
-
-int hl_dec_init(struct hl_device *hdev)
-{
- struct asic_fixed_properties *prop = &hdev->asic_prop;
- struct hl_dec *dec;
- int rc, j;
-
- /* if max core is 0, nothing to do*/
- if (!prop->max_dec)
- return 0;
-
- hdev->dec = kcalloc(prop->max_dec, sizeof(struct hl_dec), GFP_KERNEL);
- if (!hdev->dec)
- return -ENOMEM;
-
- for (j = 0 ; j < prop->max_dec ; j++) {
- dec = hdev->dec + j;
-
- dec->hdev = hdev;
- INIT_WORK(&dec->completion_abnrm_work, dec_completion_abnrm);
- dec->core_id = j;
- dec->base_addr = hdev->asic_funcs->get_dec_base_addr(hdev, j);
- if (!dec->base_addr) {
- dev_err(hdev->dev, "Invalid base address of decoder %d\n", j);
- rc = -EINVAL;
- goto err_dec_fini;
- }
- }
-
- return 0;
-
-err_dec_fini:
- hl_dec_fini(hdev);
-
- return rc;
-}
-
-void hl_dec_ctx_fini(struct hl_ctx *ctx)
-{
- struct hl_device *hdev = ctx->hdev;
- struct asic_fixed_properties *prop = &hdev->asic_prop;
- struct hl_dec *dec;
- int j;
-
- for (j = 0 ; j < prop->max_dec ; j++) {
- if (!!(prop->decoder_enabled_mask & BIT(j))) {
- dec = hdev->dec + j;
- /* Stop the decoder */
- WREG32(dec->base_addr + VCMD_CONTROL_OFFSET, 0);
- }
- }
-}