mali_scheduler.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * This confidential and proprietary software may be used only as
  3. * authorised by a licensing agreement from ARM Limited
  4. * (C) COPYRIGHT 2012-2013 ARM Limited
  5. * ALL RIGHTS RESERVED
  6. * The entire notice above must be reproduced on all authorised
  7. * copies and copies may only be made to the extent permitted
  8. * by a licensing agreement from ARM Limited.
  9. */
  10. #include "mali_scheduler.h"
  11. #include "mali_kernel_common.h"
  12. #include "mali_osk.h"
  13. mali_bool mali_scheduler_hints[MALI_SCHEDULER_HINT_MAX];
  14. static _mali_osk_atomic_t mali_job_id_autonumber;
  15. static _mali_osk_atomic_t mali_job_cache_order_autonumber;
  16. static _mali_osk_wq_work_t *pp_scheduler_wq_high_pri = NULL;
  17. static _mali_osk_wq_work_t *gp_scheduler_wq_high_pri = NULL;
  18. static void mali_scheduler_wq_schedule_pp(void *arg)
  19. {
  20. MALI_IGNORE(arg);
  21. mali_pp_scheduler_schedule();
  22. }
  23. static void mali_scheduler_wq_schedule_gp(void *arg)
  24. {
  25. MALI_IGNORE(arg);
  26. mali_gp_scheduler_schedule();
  27. }
  28. _mali_osk_errcode_t mali_scheduler_initialize(void)
  29. {
  30. if ( _MALI_OSK_ERR_OK != _mali_osk_atomic_init(&mali_job_id_autonumber, 0)) {
  31. MALI_DEBUG_PRINT(1, ("Initialization of atomic job id counter failed.\n"));
  32. return _MALI_OSK_ERR_FAULT;
  33. }
  34. if ( _MALI_OSK_ERR_OK != _mali_osk_atomic_init(&mali_job_cache_order_autonumber, 0)) {
  35. MALI_DEBUG_PRINT(1, ("Initialization of atomic job cache order counter failed.\n"));
  36. _mali_osk_atomic_term(&mali_job_id_autonumber);
  37. return _MALI_OSK_ERR_FAULT;
  38. }
  39. pp_scheduler_wq_high_pri = _mali_osk_wq_create_work_high_pri(mali_scheduler_wq_schedule_pp, NULL);
  40. if (NULL == pp_scheduler_wq_high_pri) {
  41. _mali_osk_atomic_term(&mali_job_cache_order_autonumber);
  42. _mali_osk_atomic_term(&mali_job_id_autonumber);
  43. return _MALI_OSK_ERR_NOMEM;
  44. }
  45. gp_scheduler_wq_high_pri = _mali_osk_wq_create_work_high_pri(mali_scheduler_wq_schedule_gp, NULL);
  46. if (NULL == gp_scheduler_wq_high_pri) {
  47. _mali_osk_wq_delete_work(pp_scheduler_wq_high_pri);
  48. _mali_osk_atomic_term(&mali_job_cache_order_autonumber);
  49. _mali_osk_atomic_term(&mali_job_id_autonumber);
  50. return _MALI_OSK_ERR_NOMEM;
  51. }
  52. return _MALI_OSK_ERR_OK;
  53. }
  54. void mali_scheduler_terminate(void)
  55. {
  56. _mali_osk_wq_delete_work(gp_scheduler_wq_high_pri);
  57. _mali_osk_wq_delete_work(pp_scheduler_wq_high_pri);
  58. _mali_osk_atomic_term(&mali_job_cache_order_autonumber);
  59. _mali_osk_atomic_term(&mali_job_id_autonumber);
  60. }
  61. u32 mali_scheduler_get_new_id(void)
  62. {
  63. u32 job_id = _mali_osk_atomic_inc_return(&mali_job_id_autonumber);
  64. return job_id;
  65. }
  66. u32 mali_scheduler_get_new_cache_order(void)
  67. {
  68. u32 job_cache_order = _mali_osk_atomic_inc_return(&mali_job_cache_order_autonumber);
  69. return job_cache_order;
  70. }
  71. void mali_scheduler_schedule_from_mask(mali_scheduler_mask mask, mali_bool deferred_schedule)
  72. {
  73. if (MALI_SCHEDULER_MASK_GP & mask) {
  74. /* GP needs scheduling. */
  75. if (deferred_schedule) {
  76. /* Schedule GP deferred. */
  77. _mali_osk_wq_schedule_work_high_pri(gp_scheduler_wq_high_pri);
  78. } else {
  79. /* Schedule GP now. */
  80. mali_gp_scheduler_schedule();
  81. }
  82. }
  83. if (MALI_SCHEDULER_MASK_PP & mask) {
  84. /* PP needs scheduling. */
  85. if (deferred_schedule) {
  86. /* Schedule PP deferred. */
  87. _mali_osk_wq_schedule_work_high_pri(pp_scheduler_wq_high_pri);
  88. } else {
  89. /* Schedule PP now. */
  90. mali_pp_scheduler_schedule();
  91. }
  92. }
  93. }