1 /*
2 * Copyright (c) 2019, 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 __DRM_MANAGER_H__
31 #define __DRM_MANAGER_H__
32 
33 #include <drm_interface.h>
34 #include <mutex>
35 #include "drm_dpps_mgr_intf.h"
36 
37 namespace sde_drm {
38 
39 class DRMAtomicReqInterface;
40 class DRMPlaneManager;
41 class DRMPlane;
42 class DRMConnectorManager;
43 class DRMEncoderManager;
44 class DRMConnnector;
45 class DRMCrtcManager;
46 class DRMCrtc;
47 
48 class DRMManager : public DRMManagerInterface {
49  public:
50   virtual ~DRMManager();
51   virtual int RegisterDisplay(DRMDisplayType disp_type, DRMDisplayToken *token);
52   virtual int RegisterDisplay(int32_t display_id, DRMDisplayToken *token);
53   virtual void UnregisterDisplay(DRMDisplayToken *token);
54   virtual void GetPlanesInfo(DRMPlanesInfo *info);
55   virtual int GetCrtcInfo(uint32_t crtc_id, DRMCrtcInfo *info);
56   virtual int GetConnectorInfo(uint32_t conn_id, DRMConnectorInfo *info);
57   virtual int GetConnectorsInfo(DRMConnectorsInfo *infos);
58   virtual int GetEncoderInfo(uint32_t encoder_id, DRMEncoderInfo *info);
59   virtual int GetEncodersInfo(DRMEncodersInfo *infos);
60   virtual void GetCrtcPPInfo(uint32_t crtc_id, DRMPPFeatureInfo *info);
61   virtual int CreateAtomicReq(const DRMDisplayToken &token, DRMAtomicReqInterface **intf);
62   virtual int DestroyAtomicReq(DRMAtomicReqInterface *intf);
63   virtual int SetScalerLUT(const DRMScalerLUTInfo &lut_info);
64   virtual int UnsetScalerLUT();
65   virtual void GetDppsFeatureInfo(DRMDppsFeatureInfo *info);
66 
67   DRMPlaneManager *GetPlaneMgr();
68   DRMConnectorManager *GetConnectorMgr();
69   DRMEncoderManager *GetEncoderMgr();
70   DRMCrtcManager *GetCrtcMgr();
71   DRMDppsManagerIntf *GetDppsMgrIntf();
72 
73   static DRMManager *GetInstance(int fd);
74   static void Destroy();
75 
76  private:
77   int Init(int drm_fd);
78 
79   int fd_ = -1;
80   DRMPlaneManager *plane_mgr_ = {};
81   DRMConnectorManager *conn_mgr_ = {};
82   DRMEncoderManager *encoder_mgr_ = {};
83   DRMCrtcManager *crtc_mgr_ = {};
84   DRMDppsManagerIntf *dpps_mgr_intf_ = {};
85 
86   static DRMManager *s_drm_instance;
87   static std::mutex s_lock;
88 };
89 
90 }  // namespace sde_drm
91 #endif  // __DRM_MANAGER_H__
92