• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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