Loading drivers/platform/msm/ipa/ipa_rm.c +4 −2 Original line number Diff line number Diff line Loading @@ -281,7 +281,8 @@ void delayed_release_work_func(struct work_struct *work) } ipa_rm_resource_consumer_release( (struct ipa_rm_resource_cons *)resource, rwork->needed_bw); (struct ipa_rm_resource_cons *)resource, rwork->needed_bw, rwork->dec_usage_count); bail: spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags); Loading Loading @@ -317,7 +318,7 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) goto bail; } result = ipa_rm_resource_consumer_request( (struct ipa_rm_resource_cons *)resource, 0); (struct ipa_rm_resource_cons *)resource, 0, false); if (result != 0 && result != -EINPROGRESS) { IPA_RM_ERR("consumer request returned error %d\n", result); result = -EPERM; Loading @@ -331,6 +332,7 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) } release_work->resource_name = resource->name; release_work->needed_bw = 0; release_work->dec_usage_count = false; INIT_DELAYED_WORK(&release_work->work, delayed_release_work_func); schedule_delayed_work(&release_work->work, msecs_to_jiffies(IPA_RM_RELEASE_DELAY_IN_MSEC)); Loading drivers/platform/msm/ipa/ipa_rm_i.h +2 −0 Original line number Diff line number Diff line Loading @@ -42,11 +42,13 @@ int ipa_rm_cons_index(enum ipa_rm_resource_name resource_name); * @delayed_work: work struct * @ipa_rm_resource_name: name of the resource on which this work should be done * @needed_bw: bandwidth required for resource in Mbps * @dec_usage_count: decrease usage count on release ? */ struct ipa_rm_delayed_release_work_type { struct delayed_work work; enum ipa_rm_resource_name resource_name; u32 needed_bw; bool dec_usage_count; }; Loading drivers/platform/msm/ipa/ipa_rm_resource.c +17 −14 Original line number Diff line number Diff line Loading @@ -139,7 +139,8 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer, int ipa_rm_resource_consumer_request( struct ipa_rm_resource_cons *consumer, u32 prod_needed_bw) u32 prod_needed_bw, bool inc_usage_count) { int result = 0; enum ipa_rm_resource_state prev_state; Loading Loading @@ -180,6 +181,7 @@ int ipa_rm_resource_consumer_request( result = -EPERM; goto bail; } if (inc_usage_count) consumer->usage_count++; bail: IPA_RM_DBG("%s new state: %d\n", Loading @@ -192,7 +194,8 @@ bail: int ipa_rm_resource_consumer_release( struct ipa_rm_resource_cons *consumer, u32 prod_needed_bw) u32 prod_needed_bw, bool dec_usage_count) { int result = 0; enum ipa_rm_resource_state save_state; Loading @@ -207,11 +210,7 @@ int ipa_rm_resource_consumer_release( break; case IPA_RM_GRANTED: case IPA_RM_REQUEST_IN_PROGRESS: if (consumer->usage_count == 0) { IPA_RM_ERR("consumer not used\n"); result = -EPERM; break; } if (dec_usage_count && consumer->usage_count > 0) consumer->usage_count--; if (consumer->usage_count == 0) { consumer->resource.state = IPA_RM_RELEASE_IN_PROGRESS; Loading @@ -233,7 +232,7 @@ int ipa_rm_resource_consumer_release( } break; case IPA_RM_RELEASE_IN_PROGRESS: if (consumer->usage_count > 0) if (dec_usage_count && consumer->usage_count > 0) consumer->usage_count--; result = -EINPROGRESS; break; Loading Loading @@ -623,7 +622,8 @@ int ipa_rm_resource_add_dependency(struct ipa_rm_resource *resource, resource)->pending_request++; consumer_result = ipa_rm_resource_consumer_request( (struct ipa_rm_resource_cons *)depends_on, resource->max_bw); resource->max_bw, true); if (consumer_result != -EINPROGRESS) { resource->state = prev_state; ((struct ipa_rm_resource_prod *) Loading Loading @@ -737,7 +737,8 @@ int ipa_rm_resource_delete_dependency(struct ipa_rm_resource *resource, if (release_consumer) (void) ipa_rm_resource_consumer_release( (struct ipa_rm_resource_cons *)depends_on, resource->max_bw); resource->max_bw, true); bail: IPA_RM_DBG("EXIT with %d\n", result); Loading Loading @@ -785,7 +786,8 @@ int ipa_rm_resource_producer_request(struct ipa_rm_resource_prod *producer) producer->pending_request++; consumer_result = ipa_rm_resource_consumer_request( (struct ipa_rm_resource_cons *)consumer, producer->resource.max_bw); producer->resource.max_bw, true); if (consumer_result == -EINPROGRESS) { result = -EINPROGRESS; } else { Loading Loading @@ -859,7 +861,8 @@ int ipa_rm_resource_producer_release(struct ipa_rm_resource_prod *producer) producer->pending_release++; consumer_result = ipa_rm_resource_consumer_release( (struct ipa_rm_resource_cons *)consumer, producer->resource.max_bw); producer->resource.max_bw, true); producer->pending_release--; } } Loading drivers/platform/msm/ipa/ipa_rm_resource.h +4 −2 Original line number Diff line number Diff line Loading @@ -123,10 +123,12 @@ int ipa_rm_resource_producer_request(struct ipa_rm_resource_prod *producer); int ipa_rm_resource_producer_release(struct ipa_rm_resource_prod *producer); int ipa_rm_resource_consumer_request(struct ipa_rm_resource_cons *consumer, u32 needed_bw); u32 needed_bw, bool inc_usage_count); int ipa_rm_resource_consumer_release(struct ipa_rm_resource_cons *consumer, u32 needed_bw); u32 needed_bw, bool dec_usage_count); int ipa_rm_resource_set_perf_profile(struct ipa_rm_resource *resource, struct ipa_rm_perf_profile *profile); Loading Loading
drivers/platform/msm/ipa/ipa_rm.c +4 −2 Original line number Diff line number Diff line Loading @@ -281,7 +281,8 @@ void delayed_release_work_func(struct work_struct *work) } ipa_rm_resource_consumer_release( (struct ipa_rm_resource_cons *)resource, rwork->needed_bw); (struct ipa_rm_resource_cons *)resource, rwork->needed_bw, rwork->dec_usage_count); bail: spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags); Loading Loading @@ -317,7 +318,7 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) goto bail; } result = ipa_rm_resource_consumer_request( (struct ipa_rm_resource_cons *)resource, 0); (struct ipa_rm_resource_cons *)resource, 0, false); if (result != 0 && result != -EINPROGRESS) { IPA_RM_ERR("consumer request returned error %d\n", result); result = -EPERM; Loading @@ -331,6 +332,7 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) } release_work->resource_name = resource->name; release_work->needed_bw = 0; release_work->dec_usage_count = false; INIT_DELAYED_WORK(&release_work->work, delayed_release_work_func); schedule_delayed_work(&release_work->work, msecs_to_jiffies(IPA_RM_RELEASE_DELAY_IN_MSEC)); Loading
drivers/platform/msm/ipa/ipa_rm_i.h +2 −0 Original line number Diff line number Diff line Loading @@ -42,11 +42,13 @@ int ipa_rm_cons_index(enum ipa_rm_resource_name resource_name); * @delayed_work: work struct * @ipa_rm_resource_name: name of the resource on which this work should be done * @needed_bw: bandwidth required for resource in Mbps * @dec_usage_count: decrease usage count on release ? */ struct ipa_rm_delayed_release_work_type { struct delayed_work work; enum ipa_rm_resource_name resource_name; u32 needed_bw; bool dec_usage_count; }; Loading
drivers/platform/msm/ipa/ipa_rm_resource.c +17 −14 Original line number Diff line number Diff line Loading @@ -139,7 +139,8 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer, int ipa_rm_resource_consumer_request( struct ipa_rm_resource_cons *consumer, u32 prod_needed_bw) u32 prod_needed_bw, bool inc_usage_count) { int result = 0; enum ipa_rm_resource_state prev_state; Loading Loading @@ -180,6 +181,7 @@ int ipa_rm_resource_consumer_request( result = -EPERM; goto bail; } if (inc_usage_count) consumer->usage_count++; bail: IPA_RM_DBG("%s new state: %d\n", Loading @@ -192,7 +194,8 @@ bail: int ipa_rm_resource_consumer_release( struct ipa_rm_resource_cons *consumer, u32 prod_needed_bw) u32 prod_needed_bw, bool dec_usage_count) { int result = 0; enum ipa_rm_resource_state save_state; Loading @@ -207,11 +210,7 @@ int ipa_rm_resource_consumer_release( break; case IPA_RM_GRANTED: case IPA_RM_REQUEST_IN_PROGRESS: if (consumer->usage_count == 0) { IPA_RM_ERR("consumer not used\n"); result = -EPERM; break; } if (dec_usage_count && consumer->usage_count > 0) consumer->usage_count--; if (consumer->usage_count == 0) { consumer->resource.state = IPA_RM_RELEASE_IN_PROGRESS; Loading @@ -233,7 +232,7 @@ int ipa_rm_resource_consumer_release( } break; case IPA_RM_RELEASE_IN_PROGRESS: if (consumer->usage_count > 0) if (dec_usage_count && consumer->usage_count > 0) consumer->usage_count--; result = -EINPROGRESS; break; Loading Loading @@ -623,7 +622,8 @@ int ipa_rm_resource_add_dependency(struct ipa_rm_resource *resource, resource)->pending_request++; consumer_result = ipa_rm_resource_consumer_request( (struct ipa_rm_resource_cons *)depends_on, resource->max_bw); resource->max_bw, true); if (consumer_result != -EINPROGRESS) { resource->state = prev_state; ((struct ipa_rm_resource_prod *) Loading Loading @@ -737,7 +737,8 @@ int ipa_rm_resource_delete_dependency(struct ipa_rm_resource *resource, if (release_consumer) (void) ipa_rm_resource_consumer_release( (struct ipa_rm_resource_cons *)depends_on, resource->max_bw); resource->max_bw, true); bail: IPA_RM_DBG("EXIT with %d\n", result); Loading Loading @@ -785,7 +786,8 @@ int ipa_rm_resource_producer_request(struct ipa_rm_resource_prod *producer) producer->pending_request++; consumer_result = ipa_rm_resource_consumer_request( (struct ipa_rm_resource_cons *)consumer, producer->resource.max_bw); producer->resource.max_bw, true); if (consumer_result == -EINPROGRESS) { result = -EINPROGRESS; } else { Loading Loading @@ -859,7 +861,8 @@ int ipa_rm_resource_producer_release(struct ipa_rm_resource_prod *producer) producer->pending_release++; consumer_result = ipa_rm_resource_consumer_release( (struct ipa_rm_resource_cons *)consumer, producer->resource.max_bw); producer->resource.max_bw, true); producer->pending_release--; } } Loading
drivers/platform/msm/ipa/ipa_rm_resource.h +4 −2 Original line number Diff line number Diff line Loading @@ -123,10 +123,12 @@ int ipa_rm_resource_producer_request(struct ipa_rm_resource_prod *producer); int ipa_rm_resource_producer_release(struct ipa_rm_resource_prod *producer); int ipa_rm_resource_consumer_request(struct ipa_rm_resource_cons *consumer, u32 needed_bw); u32 needed_bw, bool inc_usage_count); int ipa_rm_resource_consumer_release(struct ipa_rm_resource_cons *consumer, u32 needed_bw); u32 needed_bw, bool dec_usage_count); int ipa_rm_resource_set_perf_profile(struct ipa_rm_resource *resource, struct ipa_rm_perf_profile *profile); Loading