Commit 86cec7ec authored by Mikko Perttunen's avatar Mikko Perttunen Committed by Thierry Reding

gpu: host1x: Allow syncpoints without associated client

Syncpoints don't need to be associated with any client,
so remove the property, and expose host1x_syncpt_alloc.
This will allow allocating syncpoints without prior knowledge
of the engine that it will be used with.
Signed-off-by: default avatarMikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 01990be3
...@@ -42,13 +42,28 @@ static void host1x_syncpt_base_free(struct host1x_syncpt_base *base) ...@@ -42,13 +42,28 @@ static void host1x_syncpt_base_free(struct host1x_syncpt_base *base)
base->requested = false; base->requested = false;
} }
static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host, /**
struct host1x_client *client, * host1x_syncpt_alloc() - allocate a syncpoint
unsigned long flags) * @host: host1x device data
* @flags: bitfield of HOST1X_SYNCPT_* flags
* @name: name for the syncpoint for use in debug prints
*
* Allocates a hardware syncpoint for the caller's use. The caller then has
* the sole authority to mutate the syncpoint's value until it is freed again.
*
* If no free syncpoints are available, or a NULL name was specified, returns
* NULL.
*/
struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host,
unsigned long flags,
const char *name)
{ {
struct host1x_syncpt *sp = host->syncpt; struct host1x_syncpt *sp = host->syncpt;
char *full_name;
unsigned int i; unsigned int i;
char *name;
if (!name)
return NULL;
mutex_lock(&host->syncpt_mutex); mutex_lock(&host->syncpt_mutex);
...@@ -64,13 +79,11 @@ static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host, ...@@ -64,13 +79,11 @@ static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host,
goto unlock; goto unlock;
} }
name = kasprintf(GFP_KERNEL, "%02u-%s", sp->id, full_name = kasprintf(GFP_KERNEL, "%u-%s", sp->id, name);
client ? dev_name(client->dev) : NULL); if (!full_name)
if (!name)
goto free_base; goto free_base;
sp->client = client; sp->name = full_name;
sp->name = name;
if (flags & HOST1X_SYNCPT_CLIENT_MANAGED) if (flags & HOST1X_SYNCPT_CLIENT_MANAGED)
sp->client_managed = true; sp->client_managed = true;
...@@ -87,6 +100,7 @@ static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host, ...@@ -87,6 +100,7 @@ static struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host,
mutex_unlock(&host->syncpt_mutex); mutex_unlock(&host->syncpt_mutex);
return NULL; return NULL;
} }
EXPORT_SYMBOL(host1x_syncpt_alloc);
/** /**
* host1x_syncpt_id() - retrieve syncpoint ID * host1x_syncpt_id() - retrieve syncpoint ID
...@@ -401,7 +415,7 @@ int host1x_syncpt_init(struct host1x *host) ...@@ -401,7 +415,7 @@ int host1x_syncpt_init(struct host1x *host)
host1x_hw_syncpt_enable_protection(host); host1x_hw_syncpt_enable_protection(host);
/* Allocate sync point to use for clearing waits for expired fences */ /* Allocate sync point to use for clearing waits for expired fences */
host->nop_sp = host1x_syncpt_alloc(host, NULL, 0); host->nop_sp = host1x_syncpt_alloc(host, 0, "reserved-nop");
if (!host->nop_sp) if (!host->nop_sp)
return -ENOMEM; return -ENOMEM;
...@@ -423,7 +437,7 @@ struct host1x_syncpt *host1x_syncpt_request(struct host1x_client *client, ...@@ -423,7 +437,7 @@ struct host1x_syncpt *host1x_syncpt_request(struct host1x_client *client,
{ {
struct host1x *host = dev_get_drvdata(client->host->parent); struct host1x *host = dev_get_drvdata(client->host->parent);
return host1x_syncpt_alloc(host, client, flags); return host1x_syncpt_alloc(host, flags, dev_name(client->dev));
} }
EXPORT_SYMBOL(host1x_syncpt_request); EXPORT_SYMBOL(host1x_syncpt_request);
...@@ -447,7 +461,6 @@ void host1x_syncpt_free(struct host1x_syncpt *sp) ...@@ -447,7 +461,6 @@ void host1x_syncpt_free(struct host1x_syncpt *sp)
host1x_syncpt_base_free(sp->base); host1x_syncpt_base_free(sp->base);
kfree(sp->name); kfree(sp->name);
sp->base = NULL; sp->base = NULL;
sp->client = NULL;
sp->name = NULL; sp->name = NULL;
sp->client_managed = false; sp->client_managed = false;
......
...@@ -33,7 +33,6 @@ struct host1x_syncpt { ...@@ -33,7 +33,6 @@ struct host1x_syncpt {
const char *name; const char *name;
bool client_managed; bool client_managed;
struct host1x *host; struct host1x *host;
struct host1x_client *client;
struct host1x_syncpt_base *base; struct host1x_syncpt_base *base;
/* interrupt data */ /* interrupt data */
......
...@@ -154,6 +154,9 @@ int host1x_syncpt_wait(struct host1x_syncpt *sp, u32 thresh, long timeout, ...@@ -154,6 +154,9 @@ int host1x_syncpt_wait(struct host1x_syncpt *sp, u32 thresh, long timeout,
struct host1x_syncpt *host1x_syncpt_request(struct host1x_client *client, struct host1x_syncpt *host1x_syncpt_request(struct host1x_client *client,
unsigned long flags); unsigned long flags);
void host1x_syncpt_free(struct host1x_syncpt *sp); void host1x_syncpt_free(struct host1x_syncpt *sp);
struct host1x_syncpt *host1x_syncpt_alloc(struct host1x *host,
unsigned long flags,
const char *name);
struct host1x_syncpt_base *host1x_syncpt_get_base(struct host1x_syncpt *sp); struct host1x_syncpt_base *host1x_syncpt_get_base(struct host1x_syncpt *sp);
u32 host1x_syncpt_base_id(struct host1x_syncpt_base *base); u32 host1x_syncpt_base_id(struct host1x_syncpt_base *base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment