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

Commit 617dd7cc authored by Thierry Reding's avatar Thierry Reding
Browse files

gpu: host1x: syncpt: Request syncpoints per client



Rather than request syncpoints for a struct device *, request them for a
struct host1x_client *. This is important because subsequent patches are
going to break the assumption that host1x will always be the parent for
devices requesting a syncpoint. It's also a more natural choice because
host1x clients are really the only ones that will know how to deal with
syncpoints.

Note that host1x clients are always guaranteed to be children of host1x,
regardless of their location in the device tree.

Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 6a341fdf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1756,7 +1756,7 @@ static int tegra_dc_init(struct host1x_client *client)
	struct drm_plane *cursor = NULL;
	int err;

	dc->syncpt = host1x_syncpt_request(dc->dev, flags);
	dc->syncpt = host1x_syncpt_request(client, flags);
	if (!dc->syncpt)
		dev_warn(dc->dev, "failed to allocate syncpoint\n");

+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ static int gr2d_init(struct host1x_client *client)
	if (!gr2d->channel)
		return -ENOMEM;

	client->syncpts[0] = host1x_syncpt_request(client->dev, flags);
	client->syncpts[0] = host1x_syncpt_request(client, flags);
	if (!client->syncpts[0]) {
		host1x_channel_put(gr2d->channel);
		return -ENOMEM;
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ static int gr3d_init(struct host1x_client *client)
	if (!gr3d->channel)
		return -ENOMEM;

	client->syncpts[0] = host1x_syncpt_request(client->dev, flags);
	client->syncpts[0] = host1x_syncpt_request(client, flags);
	if (!client->syncpts[0]) {
		host1x_channel_put(gr3d->channel);
		return -ENOMEM;
+1 −1
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ static int vic_init(struct host1x_client *client)
		goto detach_device;
	}

	client->syncpts[0] = host1x_syncpt_request(client->dev, 0);
	client->syncpts[0] = host1x_syncpt_request(client, 0);
	if (!client->syncpts[0]) {
		err = -ENOMEM;
		goto free_channel;
+8 −8
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ static void host1x_syncpt_base_free(struct host1x_syncpt_base *base)
}

static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host,
						 struct device *dev,
						 struct host1x_client *client,
						 unsigned long flags)
{
	int i;
@@ -76,11 +76,11 @@ static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host,
	}

	name = kasprintf(GFP_KERNEL, "%02u-%s", sp->id,
			dev ? dev_name(dev) : NULL);
			 client ? dev_name(client->dev) : NULL);
	if (!name)
		goto free_base;

	sp->dev = dev;
	sp->client = client;
	sp->name = name;

	if (flags & HOST1X_SYNCPT_CLIENT_MANAGED)
@@ -419,7 +419,7 @@ int host1x_syncpt_init(struct host1x *host)

/**
 * host1x_syncpt_request() - request a syncpoint
 * @dev: device requesting the syncpoint
 * @client: client requesting the syncpoint
 * @flags: flags
 *
 * host1x client drivers can use this function to allocate a syncpoint for
@@ -427,12 +427,12 @@ int host1x_syncpt_init(struct host1x *host)
 * use by the client exclusively. When no longer using a syncpoint, a host1x
 * client driver needs to release it using host1x_syncpt_free().
 */
struct host1x_syncpt *host1x_syncpt_request(struct device *dev,
struct host1x_syncpt *host1x_syncpt_request(struct host1x_client *client,
					    unsigned long flags)
{
	struct host1x *host = dev_get_drvdata(dev->parent);
	struct host1x *host = dev_get_drvdata(client->parent->parent);

	return host1x_syncpt_alloc(host, dev, flags);
	return host1x_syncpt_alloc(host, client, flags);
}
EXPORT_SYMBOL(host1x_syncpt_request);

@@ -456,7 +456,7 @@ void host1x_syncpt_free(struct host1x_syncpt *sp)
	host1x_syncpt_base_free(sp->base);
	kfree(sp->name);
	sp->base = NULL;
	sp->dev = NULL;
	sp->client = NULL;
	sp->name = NULL;
	sp->client_managed = false;

Loading