habanalabs/gaudi2: add PCI revision 2 support
authorOfir Bitton <obitton@habana.ai>
Wed, 26 Oct 2022 13:20:45 +0000 (16:20 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Wed, 23 Nov 2022 14:13:46 +0000 (16:13 +0200)
Add support for Gaudi2 Device with PCI revision 2.
Functionality is exactly the same as revision 1, the only difference
is device name exposed to user.

Signed-off-by: Ofir Bitton <obitton@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/habanalabs.h
drivers/misc/habanalabs/common/habanalabs_drv.c
drivers/misc/habanalabs/common/habanalabs_ioctl.c
drivers/misc/habanalabs/common/mmu/mmu.c
drivers/misc/habanalabs/common/sysfs.c
drivers/misc/habanalabs/gaudi2/gaudi2.c
drivers/misc/habanalabs/gaudi2/gaudi2P.h
drivers/misc/habanalabs/include/hw_ip/pci/pci_general.h
include/uapi/misc/habanalabs.h

index 3ea1ee1..35ed494 100644 (file)
@@ -748,6 +748,10 @@ static int device_early_init(struct hl_device *hdev)
                gaudi2_set_asic_funcs(hdev);
                strscpy(hdev->asic_name, "GAUDI2", sizeof(hdev->asic_name));
                break;
+       case ASIC_GAUDI2B:
+               gaudi2_set_asic_funcs(hdev);
+               strscpy(hdev->asic_name, "GAUDI2B", sizeof(hdev->asic_name));
+               break;
                break;
        default:
                dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
index 7d191f3..e391e79 100644 (file)
@@ -1192,6 +1192,7 @@ struct hl_dec {
  * @ASIC_GAUDI: Gaudi device (HL-2000).
  * @ASIC_GAUDI_SEC: Gaudi secured device (HL-2000).
  * @ASIC_GAUDI2: Gaudi2 device.
+ * @ASIC_GAUDI2B: Gaudi2B device.
  */
 enum hl_asic_type {
        ASIC_INVALID,
@@ -1199,6 +1200,7 @@ enum hl_asic_type {
        ASIC_GAUDI,
        ASIC_GAUDI_SEC,
        ASIC_GAUDI2,
+       ASIC_GAUDI2B,
 };
 
 struct hl_cs_parser;
index e82af89..7815c60 100644 (file)
@@ -9,6 +9,7 @@
 #define pr_fmt(fmt)            "habanalabs: " fmt
 
 #include "habanalabs.h"
+#include "../include/hw_ip/pci/pci_general.h"
 
 #include <linux/pci.h>
 #include <linux/aer.h>
@@ -74,16 +75,17 @@ MODULE_DEVICE_TABLE(pci, ids);
 /*
  * get_asic_type - translate device id to asic type
  *
- * @device: id of the PCI device
+ * @hdev: pointer to habanalabs device structure.
  *
- * Translate device id to asic type.
+ * Translate device id and revision id to asic type.
  * In case of unidentified device, return -1
  */
-static enum hl_asic_type get_asic_type(u16 device)
+static enum hl_asic_type get_asic_type(struct hl_device *hdev)
 {
-       enum hl_asic_type asic_type;
+       struct pci_dev *pdev = hdev->pdev;
+       enum hl_asic_type asic_type = ASIC_INVALID;
 
-       switch (device) {
+       switch (pdev->device) {
        case PCI_IDS_GOYA:
                asic_type = ASIC_GOYA;
                break;
@@ -94,10 +96,18 @@ static enum hl_asic_type get_asic_type(u16 device)
                asic_type = ASIC_GAUDI_SEC;
                break;
        case PCI_IDS_GAUDI2:
-               asic_type = ASIC_GAUDI2;
+               switch (pdev->revision) {
+               case REV_ID_A:
+                       asic_type = ASIC_GAUDI2;
+                       break;
+               case REV_ID_B:
+                       asic_type = ASIC_GAUDI2B;
+                       break;
+               default:
+                       break;
+               }
                break;
        default:
-               asic_type = ASIC_INVALID;
                break;
        }
 
@@ -416,7 +426,7 @@ static int create_hdev(struct hl_device **dev, struct pci_dev *pdev)
        /* First, we must find out which ASIC are we handling. This is needed
         * to configure the behavior of the driver (kernel parameters)
         */
-       hdev->asic_type = get_asic_type(pdev->device);
+       hdev->asic_type = get_asic_type(hdev);
        if (hdev->asic_type == ASIC_INVALID) {
                dev_err(&pdev->dev, "Unsupported ASIC\n");
                rc = -ENODEV;
index 5ce5c42..ee43017 100644 (file)
 #include <uapi/misc/habanalabs.h>
 #include "habanalabs.h"
 
-#include <linux/kernel.h>
 #include <linux/fs.h>
-#include <linux/uaccess.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/uaccess.h>
 #include <linux/vmalloc.h>
 
 static u32 hl_debug_struct_size[HL_DEBUG_OP_TIMESTAMP + 1] = {
@@ -105,6 +106,7 @@ static int hw_ip_info(struct hl_device *hdev, struct hl_info_args *args)
        hw_ip.edma_enabled_mask = prop->edma_enabled_mask;
        hw_ip.server_type = prop->server_type;
        hw_ip.security_enabled = prop->fw_security_enabled;
+       hw_ip.revision_id = hdev->pdev->revision;
 
        return copy_to_user(out, &hw_ip,
                min((size_t) size, sizeof(hw_ip))) ? -EFAULT : 0;
index 67d3e70..2c1005f 100644 (file)
@@ -635,6 +635,7 @@ int hl_mmu_if_set_funcs(struct hl_device *hdev)
                hl_mmu_v1_set_funcs(hdev, &hdev->mmu_func[MMU_DR_PGT]);
                break;
        case ASIC_GAUDI2:
+       case ASIC_GAUDI2B:
                /* MMUs in Gaudi2 are always host resident */
                hl_mmu_v2_hr_set_funcs(hdev, &hdev->mmu_func[MMU_HR_PGT]);
                break;
index c924fc9..735d8be 100644 (file)
@@ -248,6 +248,8 @@ static ssize_t device_type_show(struct device *dev,
        case ASIC_GAUDI2:
                str = "GAUDI2";
                break;
+       case ASIC_GAUDI2B:
+               str = "GAUDI2B";
                break;
        default:
                dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
index 03f8cf9..f21b68b 100644 (file)
@@ -3968,11 +3968,7 @@ static void gaudi2_init_firmware_loader(struct hl_device *hdev)
        fw_loader->skip_bmc = false;
        fw_loader->sram_bar_id = SRAM_CFG_BAR_ID;
        fw_loader->dram_bar_id = DRAM_BAR_ID;
-
-       if (hdev->asic_type == ASIC_GAUDI2)
-               fw_loader->cpu_timeout = GAUDI2_CPU_TIMEOUT_USEC;
-       else /* ASIC_GAUDI2_FPGA */
-               fw_loader->cpu_timeout = GAUDI2_FPGA_CPU_TIMEOUT;
+       fw_loader->cpu_timeout = GAUDI2_CPU_TIMEOUT_USEC;
 
        /* here we update initial values for few specific dynamic regs (as
         * before reading the first descriptor from FW those value has to be
index a99c348..b4383c1 100644 (file)
@@ -23,8 +23,6 @@
 
 #define GAUDI2_CPU_TIMEOUT_USEC                30000000        /* 30s */
 
-#define GAUDI2_FPGA_CPU_TIMEOUT                100000000       /* 100s */
-
 #define NUMBER_OF_PDMA_QUEUES          2
 #define NUMBER_OF_EDMA_QUEUES          8
 #define NUMBER_OF_MME_QUEUES           4
index d232081..f5d497d 100644 (file)
 #define PCI_CONFIG_ELBI_STS_MASK       (PCI_CONFIG_ELBI_STS_ERR | \
                                        PCI_CONFIG_ELBI_STS_DONE)
 
+enum hl_revision_id {
+       /* PCI revision ID 0 is not legal */
+       REV_ID_INVALID                          = 0x00,
+       REV_ID_A                                = 0x01,
+       REV_ID_B                                = 0x02,
+};
+
 #endif /* INCLUDE_PCI_GENERAL_H_ */
index a4ceee6..5834399 100644 (file)
@@ -868,6 +868,7 @@ enum hl_server_type {
  * @number_of_user_interrupts: The number of interrupts that are available to the userspace
  *                             application to use. Relevant for Gaudi2 and later.
  * @device_mem_alloc_default_page_size: default page size used in device memory allocation.
+ * @revision_id: PCI revision ID of the ASIC.
  */
 struct hl_info_hw_ip_info {
        __u64 sram_base_address;
@@ -898,6 +899,12 @@ struct hl_info_hw_ip_info {
        __u16 pad2;
        __u64 reserved4;
        __u64 device_mem_alloc_default_page_size;
+       __u64 reserved5;
+       __u64 reserved6;
+       __u32 reserved7;
+       __u8 reserved8;
+       __u8 revision_id;
+       __u8 pad[2];
 };
 
 struct hl_info_dram_usage {