1 /* 2 * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef __HW_EVENTS_DRM_H__ 31 #define __HW_EVENTS_DRM_H__ 32 33 #include <drm_interface.h> 34 #include <sys/poll.h> 35 #include <map> 36 #include <mutex> 37 #include <string> 38 #include <utility> 39 #include <vector> 40 41 #include "hw_events_interface.h" 42 #include "hw_interface.h" 43 #include "hw_device_drm.h" 44 45 namespace sdm { 46 47 using std::vector; 48 49 class HWEventsDRM : public HWEventsInterface { 50 public: 51 virtual DisplayError Init(int display_type, HWEventHandler *event_handler, 52 const vector<HWEvent> &event_list, 53 const HWInterface *hw_intf); 54 virtual DisplayError Deinit(); 55 virtual DisplayError SetEventState(HWEvent event, bool enable, void *aux = nullptr); 56 57 private: 58 static const int kMaxStringLength = 1024; 59 60 typedef void (HWEventsDRM::*EventParser)(char *); 61 62 struct HWEventData { 63 HWEvent event_type {}; 64 EventParser event_parser {}; 65 }; 66 67 static void *DisplayEventThread(void *context); 68 static void VSyncHandlerCallback(int fd, unsigned int sequence, unsigned int tv_sec, 69 unsigned int tv_usec, void *data); 70 71 void *DisplayEventHandler(); 72 void HandleVSync(char *data); 73 void HandleIdleTimeout(char *data); 74 void HandleCECMessage(char *data); HandleThreadExit(char * data)75 void HandleThreadExit(char *data) {} HandleThermal(char * data)76 void HandleThermal(char *data) {} HandleBlank(char * data)77 void HandleBlank(char *data) {} 78 void HandleIdlePowerCollapse(char *data); 79 void HandlePanelDead(char *data); 80 void PopulateHWEventData(const vector<HWEvent> &event_list); 81 void WakeUpEventThread(); 82 DisplayError SetEventParser(); 83 DisplayError InitializePollFd(); 84 DisplayError CloseFds(); 85 DisplayError RegisterVSync(); 86 DisplayError RegisterPanelDead(bool enable); 87 DisplayError RegisterIdleNotify(bool enable); 88 DisplayError RegisterIdlePowerCollapse(bool enable); 89 90 HWEventHandler *event_handler_{}; 91 vector<HWEventData> event_data_list_{}; 92 vector<pollfd> poll_fds_{}; 93 pthread_t event_thread_{}; 94 std::string event_thread_name_ = "SDM_EventThread"; 95 bool exit_threads_ = false; 96 uint32_t vsync_index_ = 0; 97 bool vsync_enabled_ = false; 98 bool vsync_registered_ = false; 99 std::mutex vsync_mutex_; // To protect vsync_enabled_ and vsync_registered_ 100 uint32_t idle_notify_index_ = 0; 101 sde_drm::DRMDisplayToken token_ = {}; 102 bool is_primary_ = false; 103 uint32_t panel_dead_index_ = 0; 104 uint32_t idle_pc_index_ = 0; 105 }; 106 107 } // namespace sdm 108 109 #endif // __HW_EVENTS_DRM_H__ 110