drm/amdkfd: Add xcp reference to kfd node
authorLijo Lazar <lijo.lazar@amd.com>
Thu, 9 Feb 2023 09:14:13 +0000 (14:44 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:57:18 +0000 (09:57 -0400)
Fetch xcp information from xcp_mgr and also add xcc_mask to kfd node.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Le Ma <le.ma@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h

index 4293cbf9ceb0424f8f029debbf918cad5823b0bd..647c3313c27e7005c57d16d6dc727d5982601176 100644 (file)
@@ -594,6 +594,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
        uint32_t first_vmid_kfd, last_vmid_kfd, vmid_num_kfd;
        unsigned int max_proc_per_quantum;
        int num_xcd, partition_mode;
+       int xcp_idx;
 
        kfd->mec_fw_version = amdgpu_amdkfd_get_fw_version(kfd->adev,
                        KGD_ENGINE_MEC1);
@@ -603,11 +604,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
                        KGD_ENGINE_SDMA1);
        kfd->shared_resources = *gpu_resources;
 
-       num_xcd = NUM_XCC(kfd->adev->gfx.xcc_mask);
-       if (num_xcd == 0 || num_xcd == 1 || kfd->adev->gfx.num_xcc_per_xcp == 0)
-               kfd->num_nodes = 1;
-       else
-               kfd->num_nodes = num_xcd / kfd->adev->gfx.num_xcc_per_xcp;
+       kfd->num_nodes = amdgpu_xcp_get_num_xcp(kfd->adev->xcp_mgr);
+
        if (kfd->num_nodes == 0) {
                dev_err(kfd_device,
                        "KFD num nodes cannot be 0, GC inst: %d, num_xcc_in_node: %d\n",
@@ -735,7 +733,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
                                kfd->num_nodes);
 
        /* Allocate the KFD nodes */
-       for (i = 0; i < kfd->num_nodes; i++) {
+       for (i = 0, xcp_idx = 0; i < kfd->num_nodes; i++) {
                node = kzalloc(sizeof(struct kfd_node), GFP_KERNEL);
                if (!node)
                        goto node_alloc_error;
@@ -745,6 +743,15 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
                node->kfd = kfd;
                node->kfd2kgd = kfd->kfd2kgd;
                node->vm_info.vmid_num_kfd = vmid_num_kfd;
+               node->xcp = amdgpu_get_next_xcp(kfd->adev->xcp_mgr, &xcp_idx);
+               /* TODO : Check if error handling is needed */
+               if (node->xcp)
+                       amdgpu_xcp_get_inst_details(node->xcp, AMDGPU_XCP_GFX,
+                                                   &node->xcc_mask);
+               else
+                       node->xcc_mask =
+                               (1U << NUM_XCC(kfd->adev->gfx.xcc_mask)) - 1;
+
                node->num_xcc_per_node = max(1U, kfd->adev->gfx.num_xcc_per_xcp);
                node->start_xcc_id = node->num_xcc_per_node * i;
 
index 6e1c15682c28574ec14f4751b96ab1128e1b4933..559ac5efdc26030e1dbae5e1f07d5991220f30f5 100644 (file)
@@ -278,6 +278,9 @@ struct kfd_node {
        unsigned int start_xcc_id;      /* Starting XCC instance
                                         * number for the node
                                         */
+       uint32_t xcc_mask; /* Instance mask of XCCs present */
+       struct amdgpu_xcp *xcp;
+
        /* Interrupts */
        struct kfifo ih_fifo;
        struct workqueue_struct *ih_wq;