etnaviv: support performance monitor requests
Add etna_cmd_stream_perf(..) to submit perform requests. Userspace can submit pmrs via submit ioctl to sample perfmon signals. v3: - mark perfmon bos as RW Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> Reviewed-by: Lucas Stach <l.stach@pengutronix.de>main
parent
305c1d113c
commit
6a6b7432bf
|
@ -41,6 +41,7 @@ etna_cmd_stream_timestamp
|
||||||
etna_cmd_stream_flush
|
etna_cmd_stream_flush
|
||||||
etna_cmd_stream_flush2
|
etna_cmd_stream_flush2
|
||||||
etna_cmd_stream_finish
|
etna_cmd_stream_finish
|
||||||
|
etna_cmd_stream_perf
|
||||||
etna_cmd_stream_reloc
|
etna_cmd_stream_reloc
|
||||||
etna_perfmon_create
|
etna_perfmon_create
|
||||||
etna_perfmon_del
|
etna_perfmon_del
|
||||||
|
|
|
@ -105,6 +105,7 @@ void etna_cmd_stream_del(struct etna_cmd_stream *stream)
|
||||||
|
|
||||||
free(stream->buffer);
|
free(stream->buffer);
|
||||||
free(priv->submit.relocs);
|
free(priv->submit.relocs);
|
||||||
|
free(priv->submit.pmrs);
|
||||||
free(priv);
|
free(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +116,7 @@ static void reset_buffer(struct etna_cmd_stream *stream)
|
||||||
stream->offset = 0;
|
stream->offset = 0;
|
||||||
priv->submit.nr_bos = 0;
|
priv->submit.nr_bos = 0;
|
||||||
priv->submit.nr_relocs = 0;
|
priv->submit.nr_relocs = 0;
|
||||||
|
priv->submit.nr_pmrs = 0;
|
||||||
priv->nr_bos = 0;
|
priv->nr_bos = 0;
|
||||||
|
|
||||||
if (priv->reset_notify)
|
if (priv->reset_notify)
|
||||||
|
@ -191,6 +193,8 @@ static void flush(struct etna_cmd_stream *stream, int in_fence_fd,
|
||||||
.nr_bos = priv->submit.nr_bos,
|
.nr_bos = priv->submit.nr_bos,
|
||||||
.relocs = VOID2U64(priv->submit.relocs),
|
.relocs = VOID2U64(priv->submit.relocs),
|
||||||
.nr_relocs = priv->submit.nr_relocs,
|
.nr_relocs = priv->submit.nr_relocs,
|
||||||
|
.pmrs = VOID2U64(priv->submit.pmrs),
|
||||||
|
.nr_pmrs = priv->submit.nr_pmrs,
|
||||||
.stream = VOID2U64(stream->buffer),
|
.stream = VOID2U64(stream->buffer),
|
||||||
.stream_size = stream->offset * 4, /* in bytes */
|
.stream_size = stream->offset * 4, /* in bytes */
|
||||||
};
|
};
|
||||||
|
@ -260,3 +264,19 @@ void etna_cmd_stream_reloc(struct etna_cmd_stream *stream, const struct etna_rel
|
||||||
|
|
||||||
etna_cmd_stream_emit(stream, addr);
|
etna_cmd_stream_emit(stream, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void etna_cmd_stream_perf(struct etna_cmd_stream *stream, const struct etna_perf *p)
|
||||||
|
{
|
||||||
|
struct etna_cmd_stream_priv *priv = etna_cmd_stream_priv(stream);
|
||||||
|
struct drm_etnaviv_gem_submit_pmr *pmr;
|
||||||
|
uint32_t idx = APPEND(&priv->submit, pmrs);
|
||||||
|
|
||||||
|
pmr = &priv->submit.pmrs[idx];
|
||||||
|
|
||||||
|
pmr->flags = p->flags;
|
||||||
|
pmr->sequence = p->sequence;
|
||||||
|
pmr->read_offset = p->offset;
|
||||||
|
pmr->read_idx = bo2idx(stream, p->bo, ETNA_SUBMIT_BO_READ | ETNA_SUBMIT_BO_WRITE);
|
||||||
|
pmr->domain = p->signal->domain->id;
|
||||||
|
pmr->signal = p->signal->signal;
|
||||||
|
}
|
||||||
|
|
|
@ -201,4 +201,16 @@ void etna_perfmon_del(struct etna_perfmon *perfmon);
|
||||||
struct etna_perfmon_domain *etna_perfmon_get_dom_by_name(struct etna_perfmon *pm, const char *name);
|
struct etna_perfmon_domain *etna_perfmon_get_dom_by_name(struct etna_perfmon *pm, const char *name);
|
||||||
struct etna_perfmon_signal *etna_perfmon_get_sig_by_name(struct etna_perfmon_domain *dom, const char *name);
|
struct etna_perfmon_signal *etna_perfmon_get_sig_by_name(struct etna_perfmon_domain *dom, const char *name);
|
||||||
|
|
||||||
|
struct etna_perf {
|
||||||
|
#define ETNA_PM_PROCESS_PRE 0x0001
|
||||||
|
#define ETNA_PM_PROCESS_POST 0x0002
|
||||||
|
uint32_t flags;
|
||||||
|
uint32_t sequence;
|
||||||
|
struct etna_perfmon_signal *signal;
|
||||||
|
struct etna_bo *bo;
|
||||||
|
uint32_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
void etna_cmd_stream_perf(struct etna_cmd_stream *stream, const struct etna_perf *p);
|
||||||
|
|
||||||
#endif /* ETNAVIV_DRMIF_H_ */
|
#endif /* ETNAVIV_DRMIF_H_ */
|
||||||
|
|
|
@ -140,6 +140,10 @@ struct etna_cmd_stream_priv {
|
||||||
/* reloc's table: */
|
/* reloc's table: */
|
||||||
struct drm_etnaviv_gem_submit_reloc *relocs;
|
struct drm_etnaviv_gem_submit_reloc *relocs;
|
||||||
uint32_t nr_relocs, max_relocs;
|
uint32_t nr_relocs, max_relocs;
|
||||||
|
|
||||||
|
/* perf's table: */
|
||||||
|
struct drm_etnaviv_gem_submit_pmr *pmrs;
|
||||||
|
uint32_t nr_pmrs, max_pmrs;
|
||||||
} submit;
|
} submit;
|
||||||
|
|
||||||
/* should have matching entries in submit.bos: */
|
/* should have matching entries in submit.bos: */
|
||||||
|
|
Loading…
Reference in New Issue