Lines Matching refs:ctx

173     const struct mod_dvfs_domain_ctx *ctx,  in get_opp_for_level()  argument
179 for (opp_idx = 0; opp_idx < ctx->opp_count; opp_idx++) { in get_opp_for_level()
180 opp = &ctx->config->opps[opp_idx]; in get_opp_for_level()
193 const struct mod_dvfs_domain_ctx *ctx, in get_opp_for_voltage() argument
199 for (opp_idx = 0; opp_idx < ctx->opp_count; opp_idx++) { in get_opp_for_voltage()
200 opp = &ctx->config->opps[opp_idx]; in get_opp_for_voltage()
216 struct mod_dvfs_domain_ctx *ctx, in put_event_request() argument
223 .target_id = ctx->domain_id, in put_event_request()
225 .response_requested = ctx->request.response_required, in put_event_request()
228 if (ctx->request.set_source_id) { in put_event_request()
229 req.source_id = ctx->domain_id; in put_event_request()
232 ctx->state = state; in put_event_request()
237 static void dvfs_cleanup_request(struct mod_dvfs_domain_ctx *ctx) in dvfs_cleanup_request() argument
239 ctx->pending_request = (struct mod_dvfs_request){ 0 }; in dvfs_cleanup_request()
240 ctx->request = (struct mod_dvfs_request){ 0 }; in dvfs_cleanup_request()
241 ctx->state = DVFS_DOMAIN_STATE_IDLE; in dvfs_cleanup_request()
245 struct mod_dvfs_domain_ctx *ctx, in dvfs_set_level_start() argument
253 if ((new_opp->frequency == ctx->request.new_opp.frequency) && in dvfs_set_level_start()
254 (new_opp->voltage == ctx->request.new_opp.voltage)) { in dvfs_set_level_start()
259 dvfs_cleanup_request(ctx); in dvfs_set_level_start()
264 ctx->request.cookie = cookie, ctx->request.new_opp = *new_opp; in dvfs_set_level_start()
265 ctx->request.retry_request = retry_request; in dvfs_set_level_start()
266 ctx->request.response_required = false; in dvfs_set_level_start()
267 ctx->request.num_retries = num_retries; in dvfs_set_level_start()
269 ctx->state = DVFS_DOMAIN_SET_OPP; in dvfs_set_level_start()
271 status = put_event_request(ctx, mod_dvfs_event_id_set, DVFS_DOMAIN_SET_OPP); in dvfs_set_level_start()
279 static void dvfs_flush_pending_request(struct mod_dvfs_domain_ctx *ctx) in dvfs_flush_pending_request() argument
283 if (ctx->request_pending) { in dvfs_flush_pending_request()
284 ctx->request_pending = false; in dvfs_flush_pending_request()
286 ctx, in dvfs_flush_pending_request()
287 ctx->pending_request.cookie, in dvfs_flush_pending_request()
288 &ctx->pending_request.new_opp, in dvfs_flush_pending_request()
289 ctx->pending_request.retry_request, in dvfs_flush_pending_request()
290 ctx->pending_request.num_retries); in dvfs_flush_pending_request()
295 ctx->pending_request = (struct mod_dvfs_request){ 0 }; in dvfs_flush_pending_request()
300 struct mod_dvfs_domain_ctx *ctx = (struct mod_dvfs_domain_ctx *)param; in alarm_callback() local
305 .target_id = ctx->domain_id, in alarm_callback()
306 .source_id = ctx->domain_id, in alarm_callback()
308 .response_requested = ctx->pending_request.response_required, in alarm_callback()
317 static int dvfs_handle_pending_request(struct mod_dvfs_domain_ctx *ctx) in dvfs_handle_pending_request() argument
321 if (ctx->state == DVFS_DOMAIN_STATE_RETRY) { in dvfs_handle_pending_request()
325 if (ctx->config->retry_ms > 0) { in dvfs_handle_pending_request()
326 status = ctx->apis.alarm_api->start( in dvfs_handle_pending_request()
327 ctx->config->alarm_id, in dvfs_handle_pending_request()
328 ctx->config->retry_ms, in dvfs_handle_pending_request()
331 (uintptr_t)ctx); in dvfs_handle_pending_request()
333 ctx->state = DVFS_DOMAIN_STATE_RETRY; in dvfs_handle_pending_request()
340 dvfs_flush_pending_request(ctx); in dvfs_handle_pending_request()
346 struct mod_dvfs_domain_ctx *ctx, in dvfs_create_pending_level_request() argument
351 if (ctx->request_pending) { in dvfs_create_pending_level_request()
352 if ((new_opp->frequency == ctx->pending_request.new_opp.frequency) && in dvfs_create_pending_level_request()
353 (new_opp->voltage == ctx->pending_request.new_opp.voltage)) { in dvfs_create_pending_level_request()
357 if ((new_opp->frequency == ctx->current_opp.frequency) && in dvfs_create_pending_level_request()
358 (new_opp->voltage == ctx->current_opp.voltage)) { in dvfs_create_pending_level_request()
362 ctx->pending_request.num_retries = 0; in dvfs_create_pending_level_request()
363 ctx->pending_request.set_source_id = false; in dvfs_create_pending_level_request()
364 ctx->pending_request.response_required = false; in dvfs_create_pending_level_request()
365 ctx->request_pending = true; in dvfs_create_pending_level_request()
368 ctx->pending_request.new_opp = *new_opp; in dvfs_create_pending_level_request()
375 ctx->pending_request.retry_request = retry_request; in dvfs_create_pending_level_request()
378 ctx->pending_request.cookie = cookie; in dvfs_create_pending_level_request()
386 const struct mod_dvfs_domain_ctx *ctx; in dvfs_get_sustained_opp() local
388 ctx = get_domain_ctx(domain_id); in dvfs_get_sustained_opp()
389 if (ctx == NULL) { in dvfs_get_sustained_opp()
393 if (ctx->config->sustained_idx >= ctx->opp_count) { in dvfs_get_sustained_opp()
397 *opp = ctx->config->opps[ctx->config->sustained_idx]; in dvfs_get_sustained_opp()
407 const struct mod_dvfs_domain_ctx *ctx; in dvfs_get_nth_opp() local
413 ctx = get_domain_ctx(domain_id); in dvfs_get_nth_opp()
414 if (ctx == NULL) { in dvfs_get_nth_opp()
418 if (n >= ctx->opp_count) { in dvfs_get_nth_opp()
422 *opp = ctx->config->opps[n]; in dvfs_get_nth_opp()
432 const struct mod_dvfs_domain_ctx *ctx; in dvfs_get_level_id() local
435 ctx = get_domain_ctx(domain_id); in dvfs_get_level_id()
436 if (ctx == NULL) { in dvfs_get_level_id()
445 for (idx = 0; idx < ctx->opp_count; idx++) { in dvfs_get_level_id()
446 const struct mod_dvfs_opp *opp = &ctx->config->opps[idx]; in dvfs_get_level_id()
458 const struct mod_dvfs_domain_ctx *ctx; in dvfs_get_opp_count() local
464 ctx = get_domain_ctx(domain_id); in dvfs_get_opp_count()
465 if (ctx == NULL) { in dvfs_get_opp_count()
469 *opp_count = ctx->opp_count; in dvfs_get_opp_count()
476 const struct mod_dvfs_domain_ctx *ctx; in dvfs_get_latency() local
482 ctx = get_domain_ctx(domain_id); in dvfs_get_latency()
483 if (ctx == NULL) { in dvfs_get_latency()
487 *latency = ctx->config->latency; in dvfs_get_latency()
498 struct mod_dvfs_domain_ctx *ctx; in dvfs_get_current_opp() local
504 ctx = get_domain_ctx(domain_id); in dvfs_get_current_opp()
505 if (ctx == NULL) { in dvfs_get_current_opp()
509 if (ctx->current_opp.level != 0) { in dvfs_get_current_opp()
510 opp->level = ctx->current_opp.level; in dvfs_get_current_opp()
511 opp->frequency = ctx->current_opp.frequency; in dvfs_get_current_opp()
512 opp->voltage = ctx->current_opp.voltage; in dvfs_get_current_opp()
516 if (ctx->state != DVFS_DOMAIN_STATE_IDLE) { in dvfs_get_current_opp()
520 ctx->request.response_required = true; in dvfs_get_current_opp()
522 put_event_request(ctx, mod_dvfs_event_id_get_opp, DVFS_DOMAIN_GET_OPP); in dvfs_get_current_opp()
540 struct mod_dvfs_domain_ctx *ctx; in dvfs_set_level() local
543 ctx = get_domain_ctx(domain_id); in dvfs_set_level()
544 if (ctx == NULL) { in dvfs_set_level()
549 new_opp = get_opp_for_level(ctx, level); in dvfs_set_level()
554 if (ctx->state != DVFS_DOMAIN_STATE_IDLE) { in dvfs_set_level()
555 dvfs_create_pending_level_request(ctx, cookie, new_opp, false); in dvfs_set_level()
560 if (level == ctx->current_opp.level) { in dvfs_set_level()
565 ctx->request.set_source_id = true; in dvfs_set_level()
567 ctx->request.set_source_id = false; in dvfs_set_level()
569 return dvfs_set_level_start(ctx, cookie, new_opp, false, 0); in dvfs_set_level()
590 struct mod_dvfs_domain_ctx *ctx, in dvfs_complete_respond() argument
599 if ((ctx->state == DVFS_DOMAIN_GET_OPP) && (req_status == FWK_SUCCESS)) { in dvfs_complete_respond()
603 if (ctx->cookie != 0) { in dvfs_complete_respond()
611 ctx->domain_id, ctx->cookie, &read_req_event); in dvfs_complete_respond()
616 resp_params->performance_level = ctx->current_opp.level; in dvfs_complete_respond()
623 ctx->cookie = 0; in dvfs_complete_respond()
632 resp_params->performance_level = ctx->current_opp.level; in dvfs_complete_respond()
638 struct mod_dvfs_domain_ctx *ctx, in dvfs_complete() argument
644 if (ctx->request.response_required) { in dvfs_complete()
649 dvfs_complete_respond(ctx, resp_event, req_status); in dvfs_complete()
651 } else if ((req_status != FWK_SUCCESS) && ctx->request.retry_request) { in dvfs_complete()
655 if (ctx->request.num_retries++ < DVFS_MAX_RETRIES) { in dvfs_complete()
656 ctx->pending_request.retry_request = ctx->request.retry_request; in dvfs_complete()
657 ctx->pending_request.num_retries = ctx->request.num_retries; in dvfs_complete()
658 if (!ctx->request_pending) { in dvfs_complete()
659 ctx->pending_request.cookie = ctx->request.cookie; in dvfs_complete()
660 ctx->pending_request.new_opp = ctx->request.new_opp; in dvfs_complete()
661 ctx->request_pending = true; in dvfs_complete()
667 if ((req_status == FWK_SUCCESS) && (ctx->state != DVFS_DOMAIN_GET_OPP)) { in dvfs_complete()
669 ctx->domain_id, ctx->request.cookie, ctx->current_opp.level); in dvfs_complete()
677 if (ctx->request_pending) { in dvfs_complete()
678 status = dvfs_handle_pending_request(ctx); in dvfs_complete()
687 dvfs_cleanup_request(ctx); in dvfs_complete()
698 struct mod_dvfs_domain_ctx *ctx, in dvfs_handle_set_opp() argument
703 if (ctx->request.new_opp.voltage > voltage) { in dvfs_handle_set_opp()
707 status = ctx->apis.psu->set_voltage( in dvfs_handle_set_opp()
708 ctx->config->psu_id, ctx->request.new_opp.voltage); in dvfs_handle_set_opp()
711 ctx->state = DVFS_DOMAIN_SET_FREQUENCY; in dvfs_handle_set_opp()
716 return dvfs_complete(ctx, NULL, status); in dvfs_handle_set_opp()
722 status = ctx->apis.clock->set_rate( in dvfs_handle_set_opp()
723 ctx->config->clock_id, in dvfs_handle_set_opp()
724 (uint64_t)ctx->request.new_opp.frequency * FWK_KHZ, in dvfs_handle_set_opp()
728 ctx->state = DVFS_DOMAIN_SET_OPP_DONE; in dvfs_handle_set_opp()
731 } else if (ctx->request.new_opp.voltage < voltage) { in dvfs_handle_set_opp()
735 status = ctx->apis.clock->set_rate( in dvfs_handle_set_opp()
736 ctx->config->clock_id, in dvfs_handle_set_opp()
737 (uint64_t)ctx->request.new_opp.frequency * FWK_KHZ, in dvfs_handle_set_opp()
741 ctx->state = DVFS_DOMAIN_SET_VOLTAGE; in dvfs_handle_set_opp()
746 return dvfs_complete(ctx, NULL, status); in dvfs_handle_set_opp()
752 status = ctx->apis.psu->set_voltage( in dvfs_handle_set_opp()
753 ctx->config->psu_id, ctx->request.new_opp.voltage); in dvfs_handle_set_opp()
756 ctx->state = DVFS_DOMAIN_SET_OPP_DONE; in dvfs_handle_set_opp()
759 } else if (ctx->current_opp.frequency == 0) { in dvfs_handle_set_opp()
765 status = ctx->apis.clock->set_rate( in dvfs_handle_set_opp()
766 ctx->config->clock_id, in dvfs_handle_set_opp()
767 (uint64_t)ctx->request.new_opp.frequency * FWK_KHZ, in dvfs_handle_set_opp()
771 ctx->state = DVFS_DOMAIN_SET_OPP_DONE; in dvfs_handle_set_opp()
780 ctx->current_opp = ctx->request.new_opp; in dvfs_handle_set_opp()
783 return dvfs_complete(ctx, NULL, status); in dvfs_handle_set_opp()
793 struct mod_dvfs_domain_ctx *ctx, in dvfs_handle_psu_get_voltage_resp() argument
801 return dvfs_complete(ctx, resp_event, req_status); in dvfs_handle_psu_get_voltage_resp()
804 if (ctx->state == DVFS_DOMAIN_SET_OPP) { in dvfs_handle_psu_get_voltage_resp()
805 return dvfs_handle_set_opp(ctx, voltage); in dvfs_handle_psu_get_voltage_resp()
812 opp = get_opp_for_voltage(ctx, voltage); in dvfs_handle_psu_get_voltage_resp()
814 return dvfs_complete(ctx, resp_event, FWK_E_DEVICE); in dvfs_handle_psu_get_voltage_resp()
820 ctx->current_opp.voltage = voltage; in dvfs_handle_psu_get_voltage_resp()
821 ctx->current_opp.frequency = opp->frequency; in dvfs_handle_psu_get_voltage_resp()
822 ctx->current_opp.level = opp->level; in dvfs_handle_psu_get_voltage_resp()
827 return dvfs_complete(ctx, resp_event, FWK_SUCCESS); in dvfs_handle_psu_get_voltage_resp()
835 struct mod_dvfs_domain_ctx *ctx, in dvfs_handle_psu_set_voltage_resp() argument
843 return dvfs_complete(ctx, NULL, psu_response->status); in dvfs_handle_psu_set_voltage_resp()
846 if (ctx->state == DVFS_DOMAIN_SET_FREQUENCY) { in dvfs_handle_psu_set_voltage_resp()
847 status = ctx->apis.clock->set_rate( in dvfs_handle_psu_set_voltage_resp()
848 ctx->config->clock_id, in dvfs_handle_psu_set_voltage_resp()
849 (uint64_t)ctx->request.new_opp.frequency * FWK_KHZ, in dvfs_handle_psu_set_voltage_resp()
852 ctx->state = DVFS_DOMAIN_SET_OPP_DONE; in dvfs_handle_psu_set_voltage_resp()
855 } else if (ctx->state == DVFS_DOMAIN_SET_OPP_DONE) { in dvfs_handle_psu_set_voltage_resp()
865 ctx->current_opp = ctx->request.new_opp; in dvfs_handle_psu_set_voltage_resp()
868 return dvfs_complete(ctx, NULL, status); in dvfs_handle_psu_set_voltage_resp()
876 struct mod_dvfs_domain_ctx *ctx, in dvfs_handle_clk_set_freq_resp() argument
884 return dvfs_complete(ctx, NULL, clock_response->status); in dvfs_handle_clk_set_freq_resp()
887 if (ctx->state == DVFS_DOMAIN_SET_VOLTAGE) { in dvfs_handle_clk_set_freq_resp()
891 status = ctx->apis.psu->set_voltage( in dvfs_handle_clk_set_freq_resp()
892 ctx->config->psu_id, ctx->request.new_opp.voltage); in dvfs_handle_clk_set_freq_resp()
894 ctx->state = DVFS_DOMAIN_SET_OPP_DONE; in dvfs_handle_clk_set_freq_resp()
898 } else if (ctx->state == DVFS_DOMAIN_SET_OPP_DONE) { in dvfs_handle_clk_set_freq_resp()
908 ctx->current_opp = ctx->request.new_opp; in dvfs_handle_clk_set_freq_resp()
911 return dvfs_complete(ctx, NULL, status); in dvfs_handle_clk_set_freq_resp()
923 struct mod_dvfs_domain_ctx *ctx; in mod_dvfs_process_event() local
927 ctx = get_domain_ctx(event->target_id); in mod_dvfs_process_event()
928 if (ctx == NULL) { in mod_dvfs_process_event()
936 status = ctx->apis.psu->get_voltage( in mod_dvfs_process_event()
937 ctx->config->psu_id, &ctx->request.new_opp.voltage); in mod_dvfs_process_event()
939 ctx->cookie = event->cookie; in mod_dvfs_process_event()
948 ctx, resp_event, status, ctx->request.new_opp.voltage); in mod_dvfs_process_event()
959 if (ctx->current_opp.voltage != 0) { in mod_dvfs_process_event()
960 voltage = ctx->current_opp.voltage; in mod_dvfs_process_event()
963 status = ctx->apis.psu->get_voltage(ctx->config->psu_id, &voltage); in mod_dvfs_process_event()
972 status = dvfs_handle_psu_get_voltage_resp(ctx, NULL, status, voltage); in mod_dvfs_process_event()
984 ctx->request.set_source_id = false; in mod_dvfs_process_event()
985 ctx->request_pending = false; in mod_dvfs_process_event()
987 ctx, in mod_dvfs_process_event()
988 ctx->pending_request.cookie, in mod_dvfs_process_event()
989 &ctx->pending_request.new_opp, in mod_dvfs_process_event()
990 ctx->pending_request.retry_request, in mod_dvfs_process_event()
991 ctx->pending_request.num_retries); in mod_dvfs_process_event()
992 ctx->pending_request = (struct mod_dvfs_request){ 0 }; in mod_dvfs_process_event()
1006 ctx, NULL, psu_response->status, psu_response->voltage); in mod_dvfs_process_event()
1021 status = dvfs_handle_psu_set_voltage_resp(ctx, event); in mod_dvfs_process_event()
1036 status = dvfs_handle_clk_set_freq_resp(ctx, event); in mod_dvfs_process_event()
1054 struct mod_dvfs_domain_ctx *ctx; in dvfs_start() local
1062 ctx = get_domain_ctx(id); in dvfs_start()
1063 ctx->request.set_source_id = true; in dvfs_start()
1064 status = dvfs_set_level_start(ctx, 0, &sustained_opp, true, 0); in dvfs_start()
1089 struct mod_dvfs_domain_ctx *ctx = get_domain_ctx(domain_id); in dvfs_element_init() local
1093 ctx->domain_id = domain_id; in dvfs_element_init()
1096 ctx->config = data; in dvfs_element_init()
1097 fwk_assert(ctx->config->opps != NULL); in dvfs_element_init()
1100 ctx->opp_count = count_opps(ctx->config->opps); in dvfs_element_init()
1101 fwk_assert(ctx->opp_count > 0); in dvfs_element_init()
1109 const struct mod_dvfs_domain_ctx *ctx = get_domain_ctx(domain_id); in dvfs_bind_element() local
1113 ctx->config->psu_id, mod_psu_api_id_device, &ctx->apis.psu); in dvfs_bind_element()
1120 ctx->config->clock_id, in dvfs_bind_element()
1122 &ctx->apis.clock); in dvfs_bind_element()
1128 if (ctx->config->retry_ms > 0) { in dvfs_bind_element()
1131 ctx->config->alarm_id, in dvfs_bind_element()
1133 &ctx->apis.alarm_api); in dvfs_bind_element()