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

Commit 9d5d6752 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-amdkfd-next-2016-02-27' of git://people.freedesktop.org/~gabbayo/linux into drm-next

Here are a few amdkfd patches for 4.6.
These patches defer radeon/amdgpu loading in case amdkfd is not yet loaded,
by returning -EPROBE_DEFER during their probing stage.

* tag 'drm-amdkfd-next-2016-02-27' of git://people.freedesktop.org/~gabbayo/linux:
  drm/amdgpu: Return -EPROBE_DEFER when amdkfd not loaded
  drm/radeon: Return -EPROBE_DEFER when amdkfd not loaded
  drm/amdkfd: Track when module's init is complete
parents 44ab4042 efb1c658
Loading
Loading
Loading
Loading
+21 −36
Original line number Diff line number Diff line
@@ -30,25 +30,38 @@ const struct kfd2kgd_calls *kfd2kgd;
const struct kgd2kfd_calls *kgd2kfd;
bool (*kgd2kfd_init_p)(unsigned, const struct kgd2kfd_calls**);

bool amdgpu_amdkfd_init(void)
int amdgpu_amdkfd_init(void)
{
	int ret;

#if defined(CONFIG_HSA_AMD_MODULE)
	bool (*kgd2kfd_init_p)(unsigned, const struct kgd2kfd_calls**);
	int (*kgd2kfd_init_p)(unsigned, const struct kgd2kfd_calls**);

	kgd2kfd_init_p = symbol_request(kgd2kfd_init);

	if (kgd2kfd_init_p == NULL)
		return false;
		return -ENOENT;

	ret = kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd);
	if (ret) {
		symbol_put(kgd2kfd_init);
		kgd2kfd = NULL;
	}

#elif defined(CONFIG_HSA_AMD)
	ret = kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd);
	if (ret)
		kgd2kfd = NULL;

#else
	ret = -ENOENT;
#endif
	return true;

	return ret;
}

bool amdgpu_amdkfd_load_interface(struct amdgpu_device *rdev)
{
#if defined(CONFIG_HSA_AMD_MODULE)
	bool (*kgd2kfd_init_p)(unsigned, const struct kgd2kfd_calls**);
#endif

	switch (rdev->asic_type) {
#ifdef CONFIG_DRM_AMDGPU_CIK
	case CHIP_KAVERI:
@@ -62,35 +75,7 @@ bool amdgpu_amdkfd_load_interface(struct amdgpu_device *rdev)
		return false;
	}

#if defined(CONFIG_HSA_AMD_MODULE)
	kgd2kfd_init_p = symbol_request(kgd2kfd_init);

	if (kgd2kfd_init_p == NULL) {
		kfd2kgd = NULL;
		return false;
	}

	if (!kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
		symbol_put(kgd2kfd_init);
		kfd2kgd = NULL;
		kgd2kfd = NULL;

		return false;
	}

	return true;
#elif defined(CONFIG_HSA_AMD)
	if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
		kfd2kgd = NULL;
		kgd2kfd = NULL;
		return false;
	}

	return true;
#else
	kfd2kgd = NULL;
	return false;
#endif
}

void amdgpu_amdkfd_fini(void)
+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ struct kgd_mem {
	void *cpu_ptr;
};

bool amdgpu_amdkfd_init(void);
int amdgpu_amdkfd_init(void);
void amdgpu_amdkfd_fini(void);

bool amdgpu_amdkfd_load_interface(struct amdgpu_device *rdev);
+8 −2
Original line number Diff line number Diff line
@@ -310,6 +310,14 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
		return -ENODEV;
	}

	/*
	 * Initialize amdkfd before starting radeon. If it was not loaded yet,
	 * defer radeon probing
	 */
	ret = amdgpu_amdkfd_init();
	if (ret == -EPROBE_DEFER)
		return ret;

	/* Get rid of things like offb */
	ret = amdgpu_kick_out_firmware_fb(pdev);
	if (ret)
@@ -552,8 +560,6 @@ static int __init amdgpu_init(void)
	driver->num_ioctls = amdgpu_max_kms_ioctl;
	amdgpu_register_atpx_handler();

	amdgpu_amdkfd_init();

	/* let modprobe override vga console setting */
	return drm_pci_init(driver, pdriver);
}
+12 −3
Original line number Diff line number Diff line
@@ -59,18 +59,23 @@ module_param(send_sigterm, int, 0444);
MODULE_PARM_DESC(send_sigterm,
	"Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)");

bool kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f)
static int amdkfd_init_completed;

int kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f)
{
	if (!amdkfd_init_completed)
		return -EPROBE_DEFER;

	/*
	 * Only one interface version is supported,
	 * no kfd/kgd version skew allowed.
	 */
	if (interface_version != KFD_INTERFACE_VERSION)
		return false;
		return -EINVAL;

	*g2f = &kgd2kfd;

	return true;
	return 0;
}
EXPORT_SYMBOL(kgd2kfd_init);

@@ -111,6 +116,8 @@ static int __init kfd_module_init(void)

	kfd_process_create_wq();

	amdkfd_init_completed = 1;

	dev_info(kfd_device, "Initialized module\n");

	return 0;
@@ -125,6 +132,8 @@ static int __init kfd_module_init(void)

static void __exit kfd_module_exit(void)
{
	amdkfd_init_completed = 0;

	kfd_process_destroy_wq();
	kfd_topology_shutdown();
	kfd_chardev_exit();
+1 −1
Original line number Diff line number Diff line
@@ -221,7 +221,7 @@ struct kgd2kfd_calls {
	int (*resume)(struct kfd_dev *kfd);
};

bool kgd2kfd_init(unsigned interface_version,
int kgd2kfd_init(unsigned interface_version,
		const struct kgd2kfd_calls **g2f);

#endif	/* KGD_KFD_INTERFACE_H_INCLUDED */
Loading