Merge "disp: msm: sde: fix tracking of pending rsvps"

Este commit está contenido en:
qctecmdr
2021-03-24 09:41:12 -07:00
cometido por Gerrit - the friendly Code Review server

Ver fichero

@@ -126,13 +126,15 @@ struct sde_rm_requirements {
* @enc_id: Reservations are tracked by Encoder DRM object ID. * @enc_id: Reservations are tracked by Encoder DRM object ID.
* CRTCs may be connected to multiple Encoders. * CRTCs may be connected to multiple Encoders.
* An encoder or connector id identifies the display path. * An encoder or connector id identifies the display path.
* @topology DRM<->HW topology use case * @topology: DRM<->HW topology use case
* @pending: True for pending rsvp-nxt, cleared when the rsvp is committed
*/ */
struct sde_rm_rsvp { struct sde_rm_rsvp {
struct list_head list; struct list_head list;
uint32_t seq; uint32_t seq;
uint32_t enc_id; uint32_t enc_id;
enum sde_rm_topology_name topology; enum sde_rm_topology_name topology;
bool pending;
}; };
/** /**
@@ -275,9 +277,9 @@ static void _sde_rm_print_rsvps(
SDE_DEBUG("%d\n", stage); SDE_DEBUG("%d\n", stage);
list_for_each_entry(rsvp, &rm->rsvps, list) { list_for_each_entry(rsvp, &rm->rsvps, list) {
SDE_DEBUG("%d rsvp[s%ue%u] topology %d\n", stage, rsvp->seq, SDE_DEBUG("%d rsvp%s[s%ue%u] topology %d\n", stage, rsvp->pending ? "_nxt" : "",
rsvp->enc_id, rsvp->topology); rsvp->seq, rsvp->enc_id, rsvp->topology);
SDE_EVT32(stage, rsvp->seq, rsvp->enc_id, rsvp->topology); SDE_EVT32(stage, rsvp->seq, rsvp->enc_id, rsvp->topology, rsvp->pending);
} }
for (type = 0; type < SDE_HW_BLK_MAX; type++) { for (type = 0; type < SDE_HW_BLK_MAX; type++) {
@@ -1822,6 +1824,7 @@ static int _sde_rm_make_next_rsvp(struct sde_rm *rm, struct drm_encoder *enc,
rsvp->seq = ++rm->rsvp_next_seq; rsvp->seq = ++rm->rsvp_next_seq;
rsvp->enc_id = enc->base.id; rsvp->enc_id = enc->base.id;
rsvp->topology = reqs->topology->top_name; rsvp->topology = reqs->topology->top_name;
rsvp->pending = true;
list_add_tail(&rsvp->list, &rm->rsvps); list_add_tail(&rsvp->list, &rm->rsvps);
ret = _sde_rm_make_lm_rsvp(rm, rsvp, reqs, splash_display); ret = _sde_rm_make_lm_rsvp(rm, rsvp, reqs, splash_display);
@@ -2151,9 +2154,7 @@ static int _sde_rm_populate_requirements(
return 0; return 0;
} }
static struct sde_rm_rsvp *_sde_rm_get_rsvp( static struct sde_rm_rsvp *_sde_rm_get_rsvp(struct sde_rm *rm, struct drm_encoder *enc, bool nxt)
struct sde_rm *rm,
struct drm_encoder *enc)
{ {
struct sde_rm_rsvp *i; struct sde_rm_rsvp *i;
@@ -2166,30 +2167,20 @@ static struct sde_rm_rsvp *_sde_rm_get_rsvp(
return NULL; return NULL;
list_for_each_entry(i, &rm->rsvps, list) list_for_each_entry(i, &rm->rsvps, list)
if (i->enc_id == enc->base.id) if (i->pending == nxt && i->enc_id == enc->base.id)
return i; return i;
return NULL; return NULL;
} }
static struct sde_rm_rsvp *_sde_rm_get_rsvp_nxt( static struct sde_rm_rsvp *_sde_rm_get_rsvp_nxt(struct sde_rm *rm, struct drm_encoder *enc)
struct sde_rm *rm,
struct drm_encoder *enc)
{ {
struct sde_rm_rsvp *i; return _sde_rm_get_rsvp(rm, enc, true);
}
if (list_empty(&rm->rsvps)) static struct sde_rm_rsvp *_sde_rm_get_rsvp_cur(struct sde_rm *rm, struct drm_encoder *enc)
return NULL; {
return _sde_rm_get_rsvp(rm, enc, false);
list_for_each_entry(i, &rm->rsvps, list)
if (i->enc_id == enc->base.id)
break;
list_for_each_entry_continue(i, &rm->rsvps, list)
if (i->enc_id == enc->base.id)
return i;
return NULL;
} }
static struct drm_connector *_sde_rm_get_connector( static struct drm_connector *_sde_rm_get_connector(
@@ -2387,10 +2378,7 @@ void sde_rm_release(struct sde_rm *rm, struct drm_encoder *enc, bool nxt)
mutex_lock(&rm->rm_lock); mutex_lock(&rm->rm_lock);
if (nxt) rsvp = _sde_rm_get_rsvp(rm, enc, nxt);
rsvp = _sde_rm_get_rsvp_nxt(rm, enc);
else
rsvp = _sde_rm_get_rsvp(rm, enc);
if (!rsvp) { if (!rsvp) {
SDE_DEBUG("failed to find rsvp for enc %d, nxt %d", SDE_DEBUG("failed to find rsvp for enc %d, nxt %d",
enc->base.id, nxt); enc->base.id, nxt);
@@ -2428,14 +2416,11 @@ end:
mutex_unlock(&rm->rm_lock); mutex_unlock(&rm->rm_lock);
} }
static int _sde_rm_commit_rsvp( static void _sde_rm_commit_rsvp(struct sde_rm *rm, struct sde_rm_rsvp *rsvp,
struct sde_rm *rm,
struct sde_rm_rsvp *rsvp,
struct drm_connector_state *conn_state) struct drm_connector_state *conn_state)
{ {
struct sde_rm_hw_blk *blk; struct sde_rm_hw_blk *blk;
enum sde_hw_blk_type type; enum sde_hw_blk_type type;
int ret = 0;
/* Swap next rsvp to be the active */ /* Swap next rsvp to be the active */
for (type = 0; type < SDE_HW_BLK_MAX; type++) { for (type = 0; type < SDE_HW_BLK_MAX; type++) {
@@ -2450,13 +2435,9 @@ static int _sde_rm_commit_rsvp(
} }
} }
if (!ret) { rsvp->pending = false;
SDE_DEBUG("rsrv enc %d topology %d\n", rsvp->enc_id, SDE_DEBUG("rsrv enc %d topology %d\n", rsvp->enc_id, rsvp->topology);
rsvp->topology); SDE_EVT32(rsvp->enc_id, rsvp->topology);
SDE_EVT32(rsvp->enc_id, rsvp->topology);
}
return ret;
} }
/* call this only after rm_mutex held */ /* call this only after rm_mutex held */
@@ -2495,7 +2476,7 @@ int sde_rm_reserve(
struct msm_drm_private *priv; struct msm_drm_private *priv;
struct sde_kms *sde_kms; struct sde_kms *sde_kms;
struct msm_compression_info *comp_info; struct msm_compression_info *comp_info;
int ret; int ret = 0;
if (!rm || !enc || !crtc_state || !conn_state) { if (!rm || !enc || !crtc_state || !conn_state) {
SDE_ERROR("invalid arguments\n"); SDE_ERROR("invalid arguments\n");
@@ -2531,7 +2512,7 @@ int sde_rm_reserve(
_sde_rm_print_rsvps(rm, SDE_RM_STAGE_BEGIN); _sde_rm_print_rsvps(rm, SDE_RM_STAGE_BEGIN);
rsvp_cur = _sde_rm_get_rsvp(rm, enc); rsvp_cur = _sde_rm_get_rsvp_cur(rm, enc);
rsvp_nxt = _sde_rm_get_rsvp_nxt(rm, enc); rsvp_nxt = _sde_rm_get_rsvp_nxt(rm, enc);
/* /*
@@ -2620,7 +2601,7 @@ int sde_rm_reserve(
commit_rsvp: commit_rsvp:
_sde_rm_release_rsvp(rm, rsvp_cur, conn_state->connector); _sde_rm_release_rsvp(rm, rsvp_cur, conn_state->connector);
ret = _sde_rm_commit_rsvp(rm, rsvp_nxt, conn_state); _sde_rm_commit_rsvp(rm, rsvp_nxt, conn_state);
end: end:
kfree(comp_info); kfree(comp_info);
@@ -2649,7 +2630,7 @@ int sde_rm_ext_blk_create_reserve(struct sde_rm *rm,
mutex_lock(&rm->rm_lock); mutex_lock(&rm->rm_lock);
rsvp = _sde_rm_get_rsvp(rm, enc); rsvp = _sde_rm_get_rsvp_cur(rm, enc);
if (!rsvp) { if (!rsvp) {
rsvp = kzalloc(sizeof(*rsvp), GFP_KERNEL); rsvp = kzalloc(sizeof(*rsvp), GFP_KERNEL);
if (!rsvp) { if (!rsvp) {
@@ -2700,7 +2681,7 @@ int sde_rm_ext_blk_destroy(struct sde_rm *rm,
mutex_lock(&rm->rm_lock); mutex_lock(&rm->rm_lock);
rsvp = _sde_rm_get_rsvp(rm, enc); rsvp = _sde_rm_get_rsvp_cur(rm, enc);
if (!rsvp) { if (!rsvp) {
ret = -ENOENT; ret = -ENOENT;
SDE_ERROR("failed to find rsvp for enc %d\n", enc->base.id); SDE_ERROR("failed to find rsvp for enc %d\n", enc->base.id);