Example #1
0
//[*]--------------------------------------------------------------------------------------------------[*]
//[*]--------------------------------------------------------------------------------------------------[*]
static	ssize_t store_fw_status	(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	struct touch 	*ts = dev_get_drvdata(dev);
	int 			err;
	unsigned long 	val;

	if ((err = strict_strtoul(buf, 10, &val)))		return err;

	switch(val)	{
		case	STATUS_BOOT_MODE:
			ts->fw_status |= (touch_set_mode(ts, TOUCH_BOOT_MODE) == 0) ? STATUS_BOOT_MODE : err_status(STATUS_BOOT_MODE);
			if(!err_mask(ts->fw_status))	{
				ts->fw_size = 0;
				if(ts->fw_buf != NULL)	memset(ts->fw_buf, 0x00, MAX_FW_SIZE);	
				else					ts->fw_buf = (unsigned char *)kzalloc(MAX_FW_SIZE, GFP_KERNEL);
				
				if(ts->fw_buf == NULL)	ts->fw_status |= err_status(STATUS_NO_MEMORY);
			}
			break;
		case	STATUS_FW_CHECK:
			if(ts->fw_status & STATUS_BOOT_MODE)	{
				ts->fw_status &= (~STATUS_FW_CHECK);
				ts->fw_status |= (ts->fw_size <= MAX_FW_SIZE) ? STATUS_FW_CHECK : err_status(STATUS_FW_CHECK);
			}
			break;
		case	STATUS_FW_ERASE:
			if(ts->fw_status & STATUS_BOOT_MODE)	{
				ts->fw_status &= (~STATUS_FW_ERASE);
				ts->fw_status |= (touch_flash_erase(ts, ts->fw_size) == 0) ? STATUS_FW_ERASE : err_status(STATUS_FW_ERASE);
			}
			break;
		case	STATUS_FW_WRITE:
			if(ts->fw_status & STATUS_BOOT_MODE)	{
				ts->fw_status &= (~STATUS_FW_WRITE);
				ts->fw_status |= (touch_flash_write(ts, ts->fw_size, ts->fw_buf) == 0) ? STATUS_FW_WRITE : err_status(STATUS_FW_WRITE);
			}
			break;
		case	STATUS_FW_VERIFY:
			if(ts->fw_status & STATUS_BOOT_MODE)	{
				ts->fw_status &= (~STATUS_FW_VERIFY);
				ts->fw_status |= (touch_flash_verify(ts, ts->fw_size, ts->fw_buf) == 0) ? STATUS_FW_VERIFY : err_status(STATUS_FW_VERIFY);
			}
			break;
		case	STATUS_USER_MODE:
			if(ts->fw_buf != NULL)	{
				kfree(ts->fw_buf);	ts->fw_buf = NULL;	ts->fw_size = 0;
			}
			ts->fw_status = 
				(touch_set_mode(ts, TOUCH_USER_MODE) == 0) ? STATUS_USER_MODE : (err_status(STATUS_USER_MODE) | STATUS_BOOT_MODE);
			break;
		default	:
			ts->fw_status |= err_status(STATUS_NO_COMMAND);
			break;
	}
	return count;
}
Example #2
0
int main(int argc, char *argv[])
{
    int myid, numprocs, i, j;
    int size, align_size;

// host buffer
    char *s_buf, *r_buf, *s_buf1, *r_buf1;
    double t_start = 0.0, t_end = 0.0, t = 0.0;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);

    align_size = getpagesize();
    assert(align_size <= MAX_ALIGNMENT);

#ifdef PINNED
   // Get platform and device information
    cl_platform_id platform_id = NULL;
    cl_device_id device_id = NULL;
    cl_uint ret_num_devices;
    cl_uint ret_num_platforms;
    cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
    err_status(ret);
    ret = clGetDeviceIDs( platform_id, CL_DEVICE_TYPE_GPU, 1,
            &device_id, &ret_num_devices);
    err_status(ret);

    printf("%d device(s) in %d platform(s)\n",ret_num_devices, ret_num_platforms);
    char cBuffer[1024];
    ret = clGetDeviceInfo(device_id, CL_DEVICE_NAME, sizeof(cBuffer), &cBuffer,
NULL);
    err_status(ret);
    printf("CL_DEVICE_NAME:       %s\n", cBuffer);

    // Create an OpenCL context
    cl_context context = clCreateContext (NULL,
                                          1, 
                                          &device_id, 
                                          NULL, 
                                          NULL,
                                          &ret);
    err_status(ret);

    // Create a command queue
    cl_command_queue command_queue = clCreateCommandQueue (context, 
                                                           device_id, 
                                                           0,
                                                           &ret);
    err_status(ret);

    // Create memory buffers on the device
    cl_mem s_mem = clCreateBuffer(context, 
                                  CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR,
                                  // CL_MEM_COPY_HOST_PTR is only valid with non-NULL pointer
                                  MYBUFSIZE, 
                                  NULL, 
                                  &ret);
    err_status(ret);
    cl_mem r_mem = clCreateBuffer(context,
                                  CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, 
                                  // CL_MEM_COPY_HOST_PTR is only valid with non-NULL pointer
                                  MYBUFSIZE, 
                                  NULL, 
                                  &ret);
    err_status(ret);

   // pinned memory (blocked call)
   s_buf1 = (char *) clEnqueueMapBuffer(command_queue,
                                        s_mem, 
                                        CL_TRUE,
                                        CL_MAP_WRITE,
                                        0, 
                                        MYBUFSIZE, 
                                        0,
                                        NULL,
                                        NULL,
                                        &ret);
   err_status(ret);
   r_buf1 = (char *) clEnqueueMapBuffer(command_queue,
                                        r_mem, 
                                        CL_TRUE,
                                        CL_MAP_WRITE, 
                                        0, 
                                        MYBUFSIZE, 
                                        0,
                                        NULL, 
                                        NULL, 
                                        &ret);
   err_status(ret);

#else
    if (myid == 0) printf("# Using PAGEABLE host memory!\n");
    s_buf1 = (char*) malloc(MYBUFSIZE);
    r_buf1 = (char*) malloc(MYBUFSIZE);
#endif

    s_buf =
        (char *) (((unsigned long) s_buf1 + (align_size - 1)) /
                  align_size * align_size);
    r_buf =
        (char *) (((unsigned long) r_buf1 + (align_size - 1)) /
                  align_size * align_size);

    if(numprocs != 2) {
        if(myid == 0) {
            fprintf(stderr, "This test requires exactly two processes\n");
        }

        MPI_Finalize();

        return EXIT_FAILURE;
    }

    if(myid == 0) {
        fprintf(stdout, "# %s\n", BENCHMARK);
        fprintf(stdout, "%-*s%*s\n", 10, "# Size", FIELD_WIDTH,
                "Bandwidth (MB/s)");
        fflush(stdout);
    }

    /* Bandwidth test */
    for(size = 1; size <= MAX_MSG_SIZE; size *= 2) {
        /* touch the data */
        for(i = 0; i < size; i++) {
            s_buf[i] = 'a';
            r_buf[i] = 'b';
        }
        //   puts("2");
        if(size > large_message_size) {
            loop = loop_large;
            skip = skip_large;
            window_size = window_size_large;
        }

        if(myid == 0) {
            for(i = 0; i < loop + skip; i++) {
                if(i == skip) {
                    t_start = MPI_Wtime();
                }

                for(j = 0; j < window_size; j++) {
                    MPI_Isend(s_buf, size, MPI_CHAR, 1, 100, MPI_COMM_WORLD,
                            request + j);
                }

                MPI_Waitall(window_size, request, reqstat);
                MPI_Recv(r_buf, 4, MPI_CHAR, 1, 101, MPI_COMM_WORLD,
                        &reqstat[0]);
            }

            t_end = MPI_Wtime();
            // printf("%d %d\n",myid,size);
            t = t_end - t_start;
        }

        else if(myid == 1) {
            for(i = 0; i < loop + skip; i++) {
                for(j = 0; j < window_size; j++) {
                    MPI_Irecv(r_buf, size, MPI_CHAR, 0, 100, MPI_COMM_WORLD,
                            request + j);
                }

                MPI_Waitall(window_size, request, reqstat);
                MPI_Send(s_buf, 4, MPI_CHAR, 0, 101, MPI_COMM_WORLD);
            }
            // printf("%d %d\n",myid,size);
        }

        if(myid == 0) {
            double tmp = size / 1e6 * loop * window_size;

            fprintf(stdout, "%-*d%*.*f\n", 10, size, FIELD_WIDTH,
                    FLOAT_PRECISION, tmp / t);
            fflush(stdout);
        }
    }

#ifdef PINNED
//    cudaFree(s_buf1);
//    cudaFree(r_buf1);
//   clReleaseMemObject(s_mem);
//   clReleaseMemObject(r_mem);

#else
    free(s_buf1);
    free(r_buf1);
#endif

    MPI_Finalize();

    return EXIT_SUCCESS;
}