Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e05247d authored by Harish Kasiviswanathan's avatar Harish Kasiviswanathan Committed by Oded Gabbay
Browse files

drm/amdkfd: Reorganize CRAT fetching from ACPI



Reorganize and rename kfd_topology_get_crat_acpi function. In this way
acpi_get_table(..) needs to be called only once. This will also aid in
dGPU topology implementation.

Signed-off-by: default avatarHarish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Signed-off-by: default avatarKent Russell <kent.russell@amd.com>
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent 174de876
Loading
Loading
Loading
Loading
+34 −7
Original line number Diff line number Diff line
@@ -319,17 +319,29 @@ int kfd_parse_crat_table(void *crat_image)
	return 0;
}

int kfd_topology_get_crat_acpi(void *crat_image, size_t *size)
/*
 * kfd_create_crat_image_acpi - Allocates memory for CRAT image and
 * copies CRAT from ACPI (if available).
 * NOTE: Call kfd_destroy_crat_image to free CRAT image memory
 *
 *	@crat_image: CRAT read from ACPI. If no CRAT in ACPI then
 *		     crat_image will be NULL
 *	@size: [OUT] size of crat_image
 *
 *	Return 0 if successful else return error code
 */
int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
{
	struct acpi_table_header *crat_table;
	acpi_status status;
	void *pcrat_image;

	if (!size)
	if (!crat_image)
		return -EINVAL;

	/*
	 * Fetch the CRAT table from ACPI
	 */
	*crat_image = NULL;

	/* Fetch the CRAT table from ACPI */
	status = acpi_get_table(CRAT_SIGNATURE, 0, &crat_table);
	if (status == AE_NOT_FOUND) {
		pr_warn("CRAT table not found\n");
@@ -341,10 +353,25 @@ int kfd_topology_get_crat_acpi(void *crat_image, size_t *size)
		return -EINVAL;
	}

	if (*size >= crat_table->length && crat_image != NULL)
		memcpy(crat_image, crat_table, crat_table->length);
	pcrat_image = kmalloc(crat_table->length, GFP_KERNEL);
	if (!pcrat_image)
		return -ENOMEM;

	memcpy(pcrat_image, crat_table, crat_table->length);

	*crat_image = pcrat_image;
	*size = crat_table->length;

	return 0;
}

/*
 * kfd_destroy_crat_image
 *
 *	@crat_image: [IN] - crat_image from kfd_create_crat_image_xxx(..)
 *
 */
void kfd_destroy_crat_image(void *crat_image)
{
	kfree(crat_image);
}
+2 −1
Original line number Diff line number Diff line
@@ -291,7 +291,8 @@ struct cdit_header {

#pragma pack()

int kfd_topology_get_crat_acpi(void *crat_image, size_t *size);
int kfd_create_crat_image_acpi(void **crat_image, size_t *size);
void kfd_destroy_crat_image(void *crat_image);
int kfd_parse_crat_table(void *crat_image);

#endif /* KFD_CRAT_H_INCLUDED */
+18 −22
Original line number Diff line number Diff line
@@ -699,35 +699,31 @@ int kfd_topology_init(void)
	/*
	 * Get the CRAT image from the ACPI
	 */
	ret = kfd_topology_get_crat_acpi(crat_image, &image_size);
	if (ret == 0 && image_size > 0) {
		pr_info("Found CRAT image with size=%zd\n", image_size);
		crat_image = kmalloc(image_size, GFP_KERNEL);
		if (!crat_image) {
			ret = -ENOMEM;
			pr_err("No memory for allocating CRAT image\n");
			goto err;
		}
		ret = kfd_topology_get_crat_acpi(crat_image, &image_size);

		if (ret == 0) {
			down_write(&topology_lock);
	ret = kfd_create_crat_image_acpi(&crat_image, &image_size);
	if (!ret) {
		ret = kfd_parse_crat_table(crat_image);
			if (ret == 0)
				ret = kfd_topology_update_sysfs();
			up_write(&topology_lock);
		} else {
			pr_err("Couldn't get CRAT table size from ACPI\n");
		}
		kfree(crat_image);
		if (ret)
			goto err;
	} else if (ret == -ENODATA) {
		/* TODO: Create fake CRAT table */
		ret = 0;
		goto err;
	} else {
		pr_err("Couldn't get CRAT table size from ACPI\n");
		goto err;
	}

	down_write(&topology_lock);
	ret = kfd_topology_update_sysfs();
	up_write(&topology_lock);

	if (!ret)
		pr_info("Finished initializing topology\n");
	else
		pr_err("Failed to update topology in sysfs ret=%d\n", ret);

err:
	pr_info("Finished initializing topology ret=%d\n", ret);
	kfd_destroy_crat_image(crat_image);
	return ret;
}

@@ -747,7 +743,7 @@ static void kfd_debug_print_topology(void)
		pr_info("Node: %d\n", i);
		pr_info("\tGPU assigned: %s\n", (dev->gpu ? "yes" : "no"));
		pr_info("\tCPU count: %d\n", dev->node_props.cpu_cores_count);
		pr_info("\tSIMD count: %d", dev->node_props.simd_count);
		pr_info("\tSIMD count: %d\n", dev->node_props.simd_count);
		i++;
	}
}