14a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh/*
24a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Copyright (c) 2017, The Linux Foundation. All rights reserved.
34a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
44a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Redistribution and use in source and binary forms, with or without
54a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* modification, are permitted provided that the following conditions are
64a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* met:
74a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*   * Redistributions of source code must retain the above copyright
84a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     notice, this list of conditions and the following disclaimer.
94a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*   * Redistributions in binary form must reproduce the above
104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     copyright notice, this list of conditions and the following
114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     disclaimer in the documentation and/or other materials provided
124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     with the distribution.
134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*   * Neither the name of The Linux Foundation nor the names of its
144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     contributors may be used to endorse or promote products derived
154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     from this software without specific prior written permission.
164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*/
294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#ifndef __DRM_MASTER_H__
314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define __DRM_MASTER_H__
324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <mutex>
344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "drm_logger.h"
364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhnamespace drm_utils {
384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhstruct DRMBuffer {
404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int fd = -1;
414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t width = 0;
424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t height = 0;
434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t drm_format = 0;
444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint64_t drm_format_modifier = 0;
454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t stride[4] = {};
464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t offset[4] = {};
474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t num_planes = 1;
484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh};
494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhclass DRMMaster {
514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh public:
524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  ~DRMMaster();
534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  /* Converts from ION fd --> Prime Handle --> FB_ID.
544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Input:
554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   drm_buffer: A DRMBuffer obj that packages description of buffer
564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Output:
574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   fb_id: Pointer to store DRM framebuffer id into
584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Returns:
594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   ioctl error code
604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   */
614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int CreateFbId(const DRMBuffer &drm_buffer, uint32_t *fb_id);
624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  /* Removes the fb_id from DRM
634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Input:
644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   fb_id: DRM FB to be removed
654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Returns:
664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   ioctl error code
674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   */
684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int RemoveFbId(uint32_t fb_id);
694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  /* Poplulates master DRM fd
704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Input:
714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   fd: Pointer to store master fd into
724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   */
734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  void GetHandle(int *fd) { *fd = dev_fd_; }
744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  /* Creates an instance of DRMMaster if it doesn't exist and initializes it. Threadsafe.
764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Input:
774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   master: Pointer to store a pointer to the instance
784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   * Returns:
794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   *   -ENODEV if device cannot be opened or initilization fails
804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh   */
814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static int GetInstance(DRMMaster **master);
824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static void DestroyInstance();
834a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
844a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh private:
854a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  DRMMaster() {}
864a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int Init();
874a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
884a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int dev_fd_ = -1;              // Master fd for DRM
894a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static DRMMaster *s_instance;  // Singleton instance
904a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static std::mutex s_lock;
914a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh};
924a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
934a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}  // namespace drm_utils
944a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
954a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#endif  // __DRM_MASTER_H__
96