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