示例#1
0
HSAKMT_STATUS
HSAKMTAPI
hsaKmtOpenKFD(void)
{
	HSAKMT_STATUS result;

	pthread_mutex_lock(&hsakmt_mutex);

	if (kfd_open_count == 0)
	{
		int fd = open(kfd_device_name, O_RDWR | O_CLOEXEC);

		if (fd != -1)
		{
			kfd_fd = fd;
			kfd_open_count = 1;

			result = fmm_init_process_apertures();
			if (result != HSAKMT_STATUS_SUCCESS)
				close(fd);
		}
		else
		{
			result = HSAKMT_STATUS_KERNEL_IO_CHANNEL_NOT_OPENED;
		}

		amd_hsa_thunk_lock_fd = open(tmp_file,
				O_CREAT | //create the file if it's not present.
				O_RDWR, //only need write access for the internal locking semantics.
				S_IRUSR | S_IWUSR); //permissions on the file, 600 here.
	}
	else
	{
		kfd_open_count++;
		result = HSAKMT_STATUS_SUCCESS;
	}

	pthread_mutex_unlock(&hsakmt_mutex);

	return result;
}
HSAKMT_STATUS
HSAKMTAPI
hsaKmtOpenKFD(void)
{
	HSAKMT_STATUS result;
	int fd;
	HsaSystemProperties sys_props;

	pthread_mutex_lock(&hsakmt_mutex);

	if (kfd_open_count == 0)
	{
		fd = open(kfd_device_name, O_RDWR | O_CLOEXEC);

		if (fd != -1) {
			kfd_fd = fd;
			kfd_open_count = 1;
		} else {
			result = HSAKMT_STATUS_KERNEL_IO_CHANNEL_NOT_OPENED;
			goto open_failed;
		}

		result = topology_sysfs_get_system_props(&sys_props);
		if (result != HSAKMT_STATUS_SUCCESS)
			goto topology_sysfs_failed;

		result = fmm_init_process_apertures(sys_props.NumNodes);
		if (result != HSAKMT_STATUS_SUCCESS)
			goto init_process_aperture_failed;

		result = init_process_doorbells(sys_props.NumNodes);
		if (result != HSAKMT_STATUS_SUCCESS)
			goto init_doorbell_failed;

		if (init_device_debugging_memory(sys_props.NumNodes) != HSAKMT_STATUS_SUCCESS)
			printf("Insufficient Memory. Debugging unavailable\n");

		if (init_counter_props(sys_props.NumNodes) != HSAKMT_STATUS_SUCCESS)
			printf("Insufficient Memory. Performance Counter information unavailable\n");

		amd_hsa_thunk_lock_fd = open(tmp_file,
				O_CREAT | //create the file if it's not present.
				O_RDWR, //only need write access for the internal locking semantics.
				S_IRUSR | S_IWUSR); //permissions on the file, 600 here.
	}
	else
	{
		kfd_open_count++;
		result = HSAKMT_STATUS_SUCCESS;
	}

	pthread_mutex_unlock(&hsakmt_mutex);
	return result;

init_doorbell_failed:
	fmm_destroy_process_apertures();
init_process_aperture_failed:
topology_sysfs_failed:
	close(fd);
open_failed:
	pthread_mutex_unlock(&hsakmt_mutex);

	return result;
}