static int wait_hydra_output(gpointer data) {
  static int stdout_ok = TRUE, stderr_ok = TRUE;
  fd_set rset;
  struct timeval tv;
  int result, max;
  int *fd = data;
  int status;

  g_assert((stdout_ok == TRUE) || (stderr_ok == TRUE));

  tv.tv_sec = 0;
  tv.tv_usec = 0;

  FD_ZERO(&rset);
  max = -1;

  if (stdout_ok) {
    FD_SET(fd[0], &rset);
    max = fd[0];
  }
  if (stderr_ok) {
    FD_SET(fd[1], &rset);
    if (-1 == max)
      max = fd[1];
    else
      max = fd[0] > fd[1] ? fd[0] : fd[1];
  }

  result = select(max + 1, &rset, NULL, NULL, &tv);

  if (result < 0)
    g_error("wait_hydra_output: select returned negative!");
  else if (result == 0)
    return TRUE;

  if (stdout_ok && FD_ISSET(fd[0], &rset))
    stdout_ok = read_into(fd[0]);
  if (stderr_ok && FD_ISSET(fd[1], &rset))
    stderr_ok = read_into(fd[1]);

  if (!(stdout_ok || stderr_ok)) {
    waitpid(hydra_pid, &status, 0);
    hydra_pid = 0;
    stdout_ok = stderr_ok = TRUE;
    return FALSE;
  } else
    return TRUE;
}
int read_into(int fd) {
  char in_buf[BUF_S];
  char *passline;
  char *start, *end;
  int result;
  GtkWidget *output;
  GtkTextBuffer *outputbuf;
  GtkTextIter outputiter;

  if ((result = read(fd, in_buf, BUF_S - 1)) < 0) {
    g_warning("%s::%i: read returned negative!", __FILE__, __LINE__);
    return FALSE;
  } else if (result == 0) {
    return FALSE;
  } else {
    in_buf[result] = 0;
  }

  output = lookup_widget(GTK_WIDGET(wndMain), "txtOutput");
  outputbuf = gtk_text_view_get_buffer((GtkTextView *) output);

  gtk_text_buffer_get_iter_at_offset(outputbuf, &outputiter, -1);


  if ((passline = strstr(in_buf, "password: "******"bold", NULL);

    if (end - in_buf - result > 0) {
      gtk_text_buffer_insert(outputbuf, &outputiter, end + 1, -1);
    }

  }


  if (strstr(in_buf, " finished at ") != NULL) {
    gtk_text_buffer_insert_with_tags_by_name(outputbuf, &outputiter, "<finished>\n\n", -1, "bold", NULL);
  }

  if (result == BUF_S - 1)      /* there might be more available, recurse baby! */
    return read_into(fd);
  else
    return TRUE;
}
static ssize_t set_volt_table(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	struct exynos_context *platform = (struct exynos_context *)pkbdev->platform_context;
	int max = gpu_dvfs_get_level(platform->gpu_max_clock);
	int min = gpu_dvfs_get_level(platform->gpu_min_clock);
	int i, tokens, rest, target;
	int t[min - max];
	unsigned long flags;

	if ((tokens = read_into((int*)&t, min-max, buf, count)) < 0)
		return -EINVAL;

	target = -1;
	if (tokens == 2) {
		for (i = max; i <= min; i++) {
			if (t[0] == platform->table[i].clock) {
				target = i;
				break;
			}
		}
	}

	spin_lock_irqsave(&platform->gpu_dvfs_spinlock, flags);

	if (tokens == 2 && target > -1) {
		if ((rest = t[1] % GPU_VOLT_STEP) != 0) 
			t[1] += GPU_VOLT_STEP - rest;
		
		sanitize_min_max(t[1], GPU_MIN_VOLT, GPU_MAX_VOLT);
		platform->table[target].voltage = t[1];
	} else {
		for (i = 0; i < tokens; i++) {
			if ((rest = t[i] % GPU_VOLT_STEP) != 0) 
				t[i] += GPU_VOLT_STEP - rest;
			
			sanitize_min_max(t[i], GPU_MIN_VOLT, GPU_MAX_VOLT);
			platform->table[i + max].voltage = t[i];
		}
	}

	ipa_update();
	spin_unlock_irqrestore(&platform->gpu_dvfs_spinlock, flags);

	return count;
}
static ssize_t set_volt_table(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	struct kbase_device *kbdev;
	struct exynos_context *platform;
	int max = 0; /* max DVFS level (100MHz) */
	int min = 7; /* min DVFS level (677MHz) */
	int i, tokens, rest, target;
	int t[min - max];
	unsigned long flags;

	kbdev = dev_get_drvdata(dev);
	platform = (struct exynos_context *)kbdev->platform_context;

	if ((tokens = read_into((int*)&t, min-max, buf, count)) < 0)
		return -EINVAL;

	target = -1;
	if (tokens == 2) {
		for (i = max; i <= min; i++) {
			if (t[0] == platform->table[i].clock) {
				target = i;
				break;
			}
		}
	}

	spin_lock_irqsave(&platform->gpu_dvfs_spinlock, flags);

	if (tokens == 2 && target > -1) {
		sanitize_min_max(t[1], 600000, 1150000);
		if ((rest = t[1] % 6250) != 0) t[1] += 6250-rest;
		platform->table[target].voltage = t[1];
	} else {
		for (i = 0; i < tokens; i++) {
			if ((rest = t[1] % 6250) != 0) t[1] += 6250-rest;
			sanitize_min_max(t[i], 600000, 1150000);
			platform->table[i + max].voltage = t[i];
		}
	}

	ipa_update();
	spin_unlock_irqrestore(&platform->gpu_dvfs_spinlock, flags);

	return count;
}
Exemple #5
0
static ssize_t volt_table_store(struct device *d, struct device_attribute *a, const char *buf, size_t count)
{
	int i, t;
	int u[GPU_DVFS_MAX_LEVEL];

	if ((t = read_into((int*)&u, GPU_DVFS_MAX_LEVEL, buf, count)) < 0)
		return -EINVAL;

	if ((t == 2) && (GPU_DVFS_MAX_LEVEL != 2)) {
		if ((i = sec_gpu_dvfs_level_from_clk_get(u[0])) < 0)
			return -EINVAL;
		
		gdata[i].voltage = sanitize_voltage(u[1]);
	} else if (t == GPU_DVFS_MAX_LEVEL) {
		for(i = 0; i < GPU_DVFS_MAX_LEVEL; i++)
			gdata[i].voltage = sanitize_voltage(u[i]);
	} else
		return -EINVAL;

	return count;	
}