197fb5e8dSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 225fdd593SJeykumar Sankaran /* 325fdd593SJeykumar Sankaran * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. 425fdd593SJeykumar Sankaran */ 525fdd593SJeykumar Sankaran 625fdd593SJeykumar Sankaran #ifndef __DPU_RM_H__ 725fdd593SJeykumar Sankaran #define __DPU_RM_H__ 825fdd593SJeykumar Sankaran 925fdd593SJeykumar Sankaran #include <linux/list.h> 1025fdd593SJeykumar Sankaran 1125fdd593SJeykumar Sankaran #include "msm_kms.h" 1225fdd593SJeykumar Sankaran #include "dpu_hw_top.h" 1325fdd593SJeykumar Sankaran 1425fdd593SJeykumar Sankaran /** 1525fdd593SJeykumar Sankaran * struct dpu_rm - DPU dynamic hardware resource manager 1625fdd593SJeykumar Sankaran * @hw_blks: array of lists of hardware resources present in the system, one 1725fdd593SJeykumar Sankaran * list per type of hardware block 1825fdd593SJeykumar Sankaran * @lm_max_width: cached layer mixer maximum width 1925fdd593SJeykumar Sankaran * @rm_lock: resource manager mutex 2025fdd593SJeykumar Sankaran */ 2125fdd593SJeykumar Sankaran struct dpu_rm { 2225fdd593SJeykumar Sankaran struct list_head hw_blks[DPU_HW_BLK_MAX]; 2325fdd593SJeykumar Sankaran uint32_t lm_max_width; 2425fdd593SJeykumar Sankaran struct mutex rm_lock; 2525fdd593SJeykumar Sankaran }; 2625fdd593SJeykumar Sankaran 2725fdd593SJeykumar Sankaran /** 2825fdd593SJeykumar Sankaran * struct dpu_rm_hw_blk - resource manager internal structure 2925fdd593SJeykumar Sankaran * forward declaration for single iterator definition without void pointer 3025fdd593SJeykumar Sankaran */ 3125fdd593SJeykumar Sankaran struct dpu_rm_hw_blk; 3225fdd593SJeykumar Sankaran 3325fdd593SJeykumar Sankaran /** 3425fdd593SJeykumar Sankaran * struct dpu_rm_hw_iter - iterator for use with dpu_rm 3525fdd593SJeykumar Sankaran * @hw: dpu_hw object requested, or NULL on failure 3625fdd593SJeykumar Sankaran * @blk: dpu_rm internal block representation. Clients ignore. Used as iterator. 3725fdd593SJeykumar Sankaran * @enc_id: DRM ID of Encoder client wishes to search for, or 0 for Any Encoder 3825fdd593SJeykumar Sankaran * @type: Hardware Block Type client wishes to search for. 3925fdd593SJeykumar Sankaran */ 4025fdd593SJeykumar Sankaran struct dpu_rm_hw_iter { 4125fdd593SJeykumar Sankaran void *hw; 4225fdd593SJeykumar Sankaran struct dpu_rm_hw_blk *blk; 4325fdd593SJeykumar Sankaran uint32_t enc_id; 4425fdd593SJeykumar Sankaran enum dpu_hw_blk_type type; 4525fdd593SJeykumar Sankaran }; 4625fdd593SJeykumar Sankaran 4725fdd593SJeykumar Sankaran /** 4825fdd593SJeykumar Sankaran * dpu_rm_init - Read hardware catalog and create reservation tracking objects 4925fdd593SJeykumar Sankaran * for all HW blocks. 5025fdd593SJeykumar Sankaran * @rm: DPU Resource Manager handle 5125fdd593SJeykumar Sankaran * @cat: Pointer to hardware catalog 5225fdd593SJeykumar Sankaran * @mmio: mapped register io address of MDP 5325fdd593SJeykumar Sankaran * @Return: 0 on Success otherwise -ERROR 5425fdd593SJeykumar Sankaran */ 5525fdd593SJeykumar Sankaran int dpu_rm_init(struct dpu_rm *rm, 5625fdd593SJeykumar Sankaran struct dpu_mdss_cfg *cat, 573763f1a5SJeykumar Sankaran void __iomem *mmio); 5825fdd593SJeykumar Sankaran 5925fdd593SJeykumar Sankaran /** 6025fdd593SJeykumar Sankaran * dpu_rm_destroy - Free all memory allocated by dpu_rm_init 6125fdd593SJeykumar Sankaran * @rm: DPU Resource Manager handle 6225fdd593SJeykumar Sankaran * @Return: 0 on Success otherwise -ERROR 6325fdd593SJeykumar Sankaran */ 6425fdd593SJeykumar Sankaran int dpu_rm_destroy(struct dpu_rm *rm); 6525fdd593SJeykumar Sankaran 6625fdd593SJeykumar Sankaran /** 6725fdd593SJeykumar Sankaran * dpu_rm_reserve - Given a CRTC->Encoder->Connector display chain, analyze 6825fdd593SJeykumar Sankaran * the use connections and user requirements, specified through related 6925fdd593SJeykumar Sankaran * topology control properties, and reserve hardware blocks to that 7025fdd593SJeykumar Sankaran * display chain. 7125fdd593SJeykumar Sankaran * HW blocks can then be accessed through dpu_rm_get_* functions. 7225fdd593SJeykumar Sankaran * HW Reservations should be released via dpu_rm_release_hw. 7325fdd593SJeykumar Sankaran * @rm: DPU Resource Manager handle 7425fdd593SJeykumar Sankaran * @drm_enc: DRM Encoder handle 7525fdd593SJeykumar Sankaran * @crtc_state: Proposed Atomic DRM CRTC State handle 7625fdd593SJeykumar Sankaran * @topology: Pointer to topology info for the display 7725fdd593SJeykumar Sankaran * @test_only: Atomic-Test phase, discard results (unless property overrides) 7825fdd593SJeykumar Sankaran * @Return: 0 on Success otherwise -ERROR 7925fdd593SJeykumar Sankaran */ 8025fdd593SJeykumar Sankaran int dpu_rm_reserve(struct dpu_rm *rm, 8125fdd593SJeykumar Sankaran struct drm_encoder *drm_enc, 8225fdd593SJeykumar Sankaran struct drm_crtc_state *crtc_state, 8325fdd593SJeykumar Sankaran struct msm_display_topology topology, 8425fdd593SJeykumar Sankaran bool test_only); 8525fdd593SJeykumar Sankaran 8625fdd593SJeykumar Sankaran /** 8725fdd593SJeykumar Sankaran * dpu_rm_reserve - Given the encoder for the display chain, release any 8825fdd593SJeykumar Sankaran * HW blocks previously reserved for that use case. 8925fdd593SJeykumar Sankaran * @rm: DPU Resource Manager handle 9025fdd593SJeykumar Sankaran * @enc: DRM Encoder handle 9125fdd593SJeykumar Sankaran * @Return: 0 on Success otherwise -ERROR 9225fdd593SJeykumar Sankaran */ 9325fdd593SJeykumar Sankaran void dpu_rm_release(struct dpu_rm *rm, struct drm_encoder *enc); 9425fdd593SJeykumar Sankaran 9525fdd593SJeykumar Sankaran /** 9625fdd593SJeykumar Sankaran * dpu_rm_init_hw_iter - setup given iterator for new iteration over hw list 9725fdd593SJeykumar Sankaran * using dpu_rm_get_hw 9825fdd593SJeykumar Sankaran * @iter: iter object to initialize 9925fdd593SJeykumar Sankaran * @enc_id: DRM ID of Encoder client wishes to search for, or 0 for Any Encoder 10025fdd593SJeykumar Sankaran * @type: Hardware Block Type client wishes to search for. 10125fdd593SJeykumar Sankaran */ 10225fdd593SJeykumar Sankaran void dpu_rm_init_hw_iter( 10325fdd593SJeykumar Sankaran struct dpu_rm_hw_iter *iter, 10425fdd593SJeykumar Sankaran uint32_t enc_id, 10525fdd593SJeykumar Sankaran enum dpu_hw_blk_type type); 10625fdd593SJeykumar Sankaran /** 10725fdd593SJeykumar Sankaran * dpu_rm_get_hw - retrieve reserved hw object given encoder and hw type 10825fdd593SJeykumar Sankaran * Meant to do a single pass through the hardware list to iteratively 10925fdd593SJeykumar Sankaran * retrieve hardware blocks of a given type for a given encoder. 11025fdd593SJeykumar Sankaran * Initialize an iterator object. 11125fdd593SJeykumar Sankaran * Set hw block type of interest. Set encoder id of interest, 0 for any. 11225fdd593SJeykumar Sankaran * Function returns first hw of type for that encoder. 11325fdd593SJeykumar Sankaran * Subsequent calls will return the next reserved hw of that type in-order. 11425fdd593SJeykumar Sankaran * Iterator HW pointer will be null on failure to find hw. 11525fdd593SJeykumar Sankaran * @rm: DPU Resource Manager handle 11625fdd593SJeykumar Sankaran * @iter: iterator object 11725fdd593SJeykumar Sankaran * @Return: true on match found, false on no match found 11825fdd593SJeykumar Sankaran */ 11925fdd593SJeykumar Sankaran bool dpu_rm_get_hw(struct dpu_rm *rm, struct dpu_rm_hw_iter *iter); 12025fdd593SJeykumar Sankaran #endif /* __DPU_RM_H__ */ 121