Пример #1
0
static void tegra_overlay_put_locked(struct overlay_client *client, int idx)
{
	struct tegra_overlay_flip_args flip_args;
	struct tegra_overlay_info *dev = client->dev;

	if (idx < 0 || idx > dev->dc->n_windows)
		return;

	if (dev->overlays[idx].owner != client)
		return;

	dev_dbg(&client->dev->ndev->dev,
		"%s(): idx=%d pid=%d comm=%s\n",
		__func__, idx, client->task->pid, client->task->comm);

	dev->overlays[idx].owner = NULL;

	flip_args.win[0].index = idx;
	flip_args.win[0].buff_id = 0;
	flip_args.win[1].index = -1;
	flip_args.win[2].index = -1;
	flip_args.flags = 0;

	tegra_overlay_flip(dev, &flip_args, NULL);
	if (dev->dc->mode.pclk != 0)
		tegra_overlay_set_emc_freq(dev);
}
Пример #2
0
static int tegra_overlay_ioctl_flip(struct overlay_client *client,
				    void __user *arg)
{
	int i = 0;
	int idx = 0;
	int err;
	bool found_one = false;
	struct tegra_overlay_flip_args flip_args;

	mutex_lock(&client->dev->dc->lock);
	if (!client->dev->dc->enabled) {
		mutex_unlock(&client->dev->dc->lock);
		return -EPIPE;
	}
	mutex_unlock(&client->dev->dc->lock);

	if (copy_from_user(&flip_args, arg, sizeof(flip_args)))
		return -EFAULT;

	for (i = 0; i < TEGRA_FB_FLIP_N_WINDOWS; i++) {
		idx = flip_args.win[i].index;
		if (idx == -1) {
			flip_args.win[i].buff_id = 0;
			continue;
		}

		if (idx < 0 || idx > client->dev->dc->n_windows) {
			dev_err(&client->dev->ndev->dev,
				"Flipping an invalid overlay! %d\n", idx);
			flip_args.win[i].index = -1;
			flip_args.win[i].buff_id = 0;
			continue;
		}

		if (client->dev->overlays[idx].owner != client) {
			dev_err(&client->dev->ndev->dev,
				"Flipping a non-owned overlay! %d\n", idx);
			flip_args.win[i].index = -1;
			flip_args.win[i].buff_id = 0;
			continue;
		}

		found_one = true;
	}

	if (!found_one)
		return -EFAULT;

	err = tegra_overlay_flip(client->dev, &flip_args, client->user_nvmap);

	if (err)
		return err;

	if (copy_to_user(arg, &flip_args, sizeof(flip_args)))
		return -EFAULT;

	return 0;
}
Пример #3
0
static void tegra_overlay_put_locked(struct overlay_client *client, int idx)
{
	struct tegra_overlay_flip_args flip_args;
	struct tegra_overlay_info *dev = client->dev;

	if (idx < 0 || idx > dev->dc->n_windows)
		return;

	if (dev->overlays[idx].owner != client)
		return;

	dev->overlays[idx].owner = NULL;

	flip_args.win[0].index = idx;
	flip_args.win[0].buff_id = 0;
	flip_args.win[1].index = -1;
	flip_args.win[2].index = -1;

	tegra_overlay_flip(dev, &flip_args, NULL);
}