mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
staging: vc04_services: Get of even more suspend/resume states
After the first states cleanup pass some set_suspend/resume_state() calls disappeared which opened up even more opportunities for deletions. Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Link: https://lore.kernel.org/r/20200131103836.14312-17-nsaenzjulienne@suse.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6547980973
commit
bd8aa2850f
@ -48,15 +48,8 @@
|
||||
int vchiq_arm_log_level = VCHIQ_LOG_DEFAULT;
|
||||
int vchiq_susp_log_level = VCHIQ_LOG_ERROR;
|
||||
|
||||
#define VC_SUSPEND_NUM_OFFSET 3 /* number of values before idle which are -ve */
|
||||
static const char *const suspend_state_names[] = {
|
||||
"VC_SUSPEND_IDLE",
|
||||
"VC_SUSPEND_IN_PROGRESS",
|
||||
};
|
||||
#define VC_RESUME_NUM_OFFSET 1 /* number of values before idle which are -ve */
|
||||
static const char *const resume_state_names[] = {
|
||||
"VC_RESUME_IDLE",
|
||||
"VC_RESUME_REQUESTED",
|
||||
"VC_RESUME_RESUMED"
|
||||
};
|
||||
/* The number of times we allow force suspend to timeout before actually
|
||||
@ -2361,63 +2354,6 @@ vchiq_arm_init_state(struct vchiq_state *state,
|
||||
return VCHIQ_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
** Functions to modify the state variables;
|
||||
** set_suspend_state
|
||||
** set_resume_state
|
||||
**
|
||||
** There are more state variables than we might like, so ensure they remain in
|
||||
** step. Suspend and resume state are maintained separately, since most of
|
||||
** these state machines can operate independently. However, there are a few
|
||||
** states where state transitions in one state machine cause a reset to the
|
||||
** other state machine. In addition, there are some completion events which
|
||||
** need to occur on state machine reset and end-state(s), so these are also
|
||||
** dealt with in these functions.
|
||||
**
|
||||
** In all states we set the state variable according to the input, but in some
|
||||
** cases we perform additional steps outlined below;
|
||||
**
|
||||
** VC_SUSPEND_IDLE - Initialise the suspend completion at the same time.
|
||||
** The suspend completion is completed after any suspend
|
||||
** attempt. When we reset the state machine we also reset
|
||||
** the completion. This reset occurs when videocore is
|
||||
** resumed, and also if we initiate suspend after a suspend
|
||||
** failure.
|
||||
**
|
||||
** VC_SUSPEND_IN_PROGRESS - This state is considered the point of no return for
|
||||
** suspend - ie from this point on we must try to suspend
|
||||
** before resuming can occur. We therefore also reset the
|
||||
** resume state machine to VC_RESUME_IDLE in this state.
|
||||
**
|
||||
** VC_RESUME_IDLE - Initialise the resume completion at the same time. The
|
||||
** resume completion is in it's 'done' state whenever
|
||||
** videcore is running. Therefore, the VC_RESUME_IDLE
|
||||
** state implies that videocore is suspended.
|
||||
** Hence, any thread which needs to wait until videocore is
|
||||
** running can wait on this completion - it will only block
|
||||
** if videocore is suspended.
|
||||
*/
|
||||
|
||||
void
|
||||
set_suspend_state(struct vchiq_arm_state *arm_state,
|
||||
enum vc_suspend_status new_state)
|
||||
{
|
||||
/* set the state in all cases */
|
||||
arm_state->vc_suspend_state = new_state;
|
||||
|
||||
/* state specific additional actions */
|
||||
switch (new_state) {
|
||||
case VC_SUSPEND_IDLE:
|
||||
break;
|
||||
case VC_SUSPEND_IN_PROGRESS:
|
||||
set_resume_state(arm_state, VC_RESUME_IDLE);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
set_resume_state(struct vchiq_arm_state *arm_state,
|
||||
enum vc_resume_status new_state)
|
||||
@ -2427,14 +2363,8 @@ set_resume_state(struct vchiq_arm_state *arm_state,
|
||||
|
||||
/* state specific additional actions */
|
||||
switch (new_state) {
|
||||
case VC_RESUME_IDLE:
|
||||
reinit_completion(&arm_state->vc_resume_complete);
|
||||
break;
|
||||
case VC_RESUME_REQUESTED:
|
||||
break;
|
||||
case VC_RESUME_RESUMED:
|
||||
complete_all(&arm_state->vc_resume_complete);
|
||||
set_suspend_state(arm_state, VC_SUSPEND_IDLE);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
@ -2442,15 +2372,6 @@ set_resume_state(struct vchiq_arm_state *arm_state,
|
||||
}
|
||||
}
|
||||
|
||||
static inline int
|
||||
need_resume(struct vchiq_state *state)
|
||||
{
|
||||
struct vchiq_arm_state *arm_state = vchiq_platform_get_arm_state(state);
|
||||
|
||||
return (arm_state->vc_suspend_state > VC_SUSPEND_IDLE) &&
|
||||
(arm_state->vc_resume_state < VC_RESUME_REQUESTED);
|
||||
}
|
||||
|
||||
void
|
||||
vchiq_platform_check_suspend(struct vchiq_state *state)
|
||||
{
|
||||
@ -2500,16 +2421,9 @@ vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service,
|
||||
local_uc = ++arm_state->videocore_use_count;
|
||||
local_entity_uc = ++(*entity_uc);
|
||||
|
||||
if ((use_type != USE_TYPE_SERVICE_NO_RESUME) && need_resume(state)) {
|
||||
set_resume_state(arm_state, VC_RESUME_REQUESTED);
|
||||
vchiq_log_info(vchiq_susp_log_level,
|
||||
"%s %s count %d, state count %d",
|
||||
__func__, entity, local_entity_uc, local_uc);
|
||||
request_poll(state, NULL, 0);
|
||||
} else
|
||||
vchiq_log_trace(vchiq_susp_log_level,
|
||||
"%s %s count %d, state count %d",
|
||||
__func__, entity, *entity_uc, local_uc);
|
||||
vchiq_log_trace(vchiq_susp_log_level,
|
||||
"%s %s count %d, state count %d",
|
||||
__func__, entity, *entity_uc, local_uc);
|
||||
|
||||
write_unlock_bh(&arm_state->susp_res_lock);
|
||||
|
||||
@ -2720,7 +2634,6 @@ vchiq_dump_service_use_state(struct vchiq_state *state)
|
||||
int only_nonzero = 0;
|
||||
static const char *nz = "<-- preventing suspend";
|
||||
|
||||
enum vc_suspend_status vc_suspend_state;
|
||||
enum vc_resume_status vc_resume_state;
|
||||
int peer_count;
|
||||
int vc_use_count;
|
||||
@ -2735,7 +2648,6 @@ vchiq_dump_service_use_state(struct vchiq_state *state)
|
||||
return;
|
||||
|
||||
read_lock_bh(&arm_state->susp_res_lock);
|
||||
vc_suspend_state = arm_state->vc_suspend_state;
|
||||
vc_resume_state = arm_state->vc_resume_state;
|
||||
peer_count = arm_state->peer_use_count;
|
||||
vc_use_count = arm_state->videocore_use_count;
|
||||
@ -2814,12 +2726,10 @@ vchiq_check_service(struct vchiq_service *service)
|
||||
if (ret == VCHIQ_ERROR) {
|
||||
vchiq_log_error(vchiq_susp_log_level,
|
||||
"%s ERROR - %c%c%c%c:%d service count %d, "
|
||||
"state count %d, videocore suspend state %s", __func__,
|
||||
"state count %d", __func__,
|
||||
VCHIQ_FOURCC_AS_4CHARS(service->base.fourcc),
|
||||
service->client_id, service->service_use_count,
|
||||
arm_state->videocore_use_count,
|
||||
suspend_state_names[arm_state->vc_suspend_state +
|
||||
VC_SUSPEND_NUM_OFFSET]);
|
||||
arm_state->videocore_use_count);
|
||||
vchiq_dump_service_use_state(service->state);
|
||||
}
|
||||
out:
|
||||
|
@ -14,14 +14,7 @@
|
||||
#include "vchiq_core.h"
|
||||
#include "vchiq_debugfs.h"
|
||||
|
||||
enum vc_suspend_status {
|
||||
VC_SUSPEND_IDLE = 0, /* VC active, no suspend actions */
|
||||
VC_SUSPEND_IN_PROGRESS, /* Slot handler has recvd suspend request */
|
||||
};
|
||||
|
||||
enum vc_resume_status {
|
||||
VC_RESUME_IDLE = 0, /* VC suspended, no resume actions */
|
||||
VC_RESUME_REQUESTED, /* User has requested resume */
|
||||
VC_RESUME_RESUMED /* Videocore resumed successfully (active) */
|
||||
};
|
||||
|
||||
@ -42,7 +35,6 @@ struct vchiq_arm_state {
|
||||
struct completion vc_resume_complete;
|
||||
|
||||
rwlock_t susp_res_lock;
|
||||
enum vc_suspend_status vc_suspend_state;
|
||||
enum vc_resume_status vc_resume_state;
|
||||
|
||||
struct vchiq_state *state;
|
||||
@ -130,10 +122,6 @@ vchiq_instance_get_trace(struct vchiq_instance *instance);
|
||||
extern void
|
||||
vchiq_instance_set_trace(struct vchiq_instance *instance, int trace);
|
||||
|
||||
extern void
|
||||
set_suspend_state(struct vchiq_arm_state *arm_state,
|
||||
enum vc_suspend_status new_state);
|
||||
|
||||
extern void
|
||||
set_resume_state(struct vchiq_arm_state *arm_state,
|
||||
enum vc_resume_status new_state);
|
||||
|
Loading…
Reference in New Issue
Block a user