16cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* 26cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* Copyright (c) 2017, The Linux Foundation. All rights reserved. 36cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* 46cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* Redistribution and use in source and binary forms, with or without 56cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* modification, are permitted provided that the following conditions are 66cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* met: 76cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* * Redistributions of source code must retain the above copyright 86cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* notice, this list of conditions and the following disclaimer. 96cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* * Redistributions in binary form must reproduce the above 106cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* copyright notice, this list of conditions and the following 116cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* disclaimer in the documentation and/or other materials provided 126cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* with the distribution. 136cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its 146cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* contributors may be used to endorse or promote products derived 156cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* from this software without specific prior written permission. 166cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* 176cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 186cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 196cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 206cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 216cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 226cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 236cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 246cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 256cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 266cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 276cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*/ 296cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 306cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#ifndef __DRM_MASTER_H__ 316cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#define __DRM_MASTER_H__ 326cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 336cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include <mutex> 346cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 356cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include "drm_logger.h" 366cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 376cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelnamespace drm_utils { 386cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 396cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMBuffer { 406cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel int fd = -1; 416cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint32_t width = 0; 426cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint32_t height = 0; 436cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint32_t drm_format = 0; 446cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint64_t drm_format_modifier = 0; 456cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint32_t stride[4] = {}; 466cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint32_t offset[4] = {}; 476cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel uint32_t num_planes = 1; 486cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel}; 496cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 506cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelclass DRMMaster { 516cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel public: 526cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel ~DRMMaster(); 536cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel /* Converts from ION fd --> Prime Handle --> FB_ID. 546cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Input: 556cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * drm_buffer: A DRMBuffer obj that packages description of buffer 566cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Output: 576cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * fb_id: Pointer to store DRM framebuffer id into 586cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Returns: 596cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * ioctl error code 606cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel */ 616cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel int CreateFbId(const DRMBuffer &drm_buffer, uint32_t *gem_handle, uint32_t *fb_id); 626cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel /* Removes the fb_id from DRM 636cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Input: 646cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * fb_id: DRM FB to be removed 656cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Returns: 666cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * ioctl error code 676cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel */ 686cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel int RemoveFbId(uint32_t gem_handle, uint32_t fb_id); 696cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel /* Poplulates master DRM fd 706cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Input: 716cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * fd: Pointer to store master fd into 726cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel */ 736cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel void GetHandle(int *fd) { *fd = dev_fd_; } 746cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 756cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel /* Creates an instance of DRMMaster if it doesn't exist and initializes it. Threadsafe. 766cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Input: 776cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * master: Pointer to store a pointer to the instance 786cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Returns: 796cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * -ENODEV if device cannot be opened or initilization fails 806cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel */ 816cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel static int GetInstance(DRMMaster **master); 82cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel static void DestroyInstance(); 836cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 846cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel private: 856cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel DRMMaster() {} 866cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel int Init(); 876cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 886cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel int dev_fd_ = -1; // Master fd for DRM 896cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel static DRMMaster *s_instance; // Singleton instance 906cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel static std::mutex s_lock; 916cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel}; 926cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 936cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel} // namespace drm_utils 946cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel 956cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#endif // __DRM_MASTER_H__ 96