Home | History | Annotate | Download | only in drm
      1 /*
      2 * Copyright (c) 2017, 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 <sys/poll.h>
     34 #include <map>
     35 #include <string>
     36 #include <utility>
     37 #include <vector>
     38 
     39 #include "hw_events_interface.h"
     40 #include "hw_interface.h"
     41 
     42 namespace sdm {
     43 
     44 using std::vector;
     45 
     46 class HWEventsDRM : public HWEventsInterface {
     47  public:
     48   virtual DisplayError Init(int display_type, HWEventHandler *event_handler,
     49                             const vector<HWEvent> &event_list);
     50   virtual DisplayError Deinit();
     51 
     52  private:
     53   static const int kMaxStringLength = 1024;
     54 
     55   typedef void (HWEventsDRM::*EventParser)(char *);
     56 
     57   struct HWEventData {
     58     HWEvent event_type {};
     59     EventParser event_parser {};
     60   };
     61 
     62   static void *DisplayEventThread(void *context);
     63   static void VSyncHandlerCallback(int fd, unsigned int sequence, unsigned int tv_sec,
     64                                    unsigned int tv_usec, void *data);
     65 
     66   void *DisplayEventHandler();
     67   void HandleVSync(char *data);
     68   void HandleIdleTimeout(char *data);
     69   void HandleThreadExit(char *data) {}
     70   void HandleThermal(char *data) {}
     71   void HandleBlank(char *data) {}
     72   void HandleIdlePowerCollapse(char *data);
     73   void PopulateHWEventData(const vector<HWEvent> &event_list);
     74   DisplayError SetEventParser();
     75   DisplayError InitializePollFd();
     76   DisplayError CloseFds();
     77   DisplayError RegisterVSync();
     78 
     79   HWEventHandler *event_handler_{};
     80   vector<HWEventData> event_data_list_{};
     81   vector<pollfd> poll_fds_{};
     82   pthread_t event_thread_{};
     83   std::string event_thread_name_ = "SDM_EventThread";
     84   bool exit_threads_ = false;
     85   uint32_t vsync_index_ = 0;
     86 };
     87 
     88 }  // namespace sdm
     89 
     90 #endif  // __HW_EVENTS_DRM_H__
     91