root/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
 */

#ifndef _DPU_HW_VBIF_H
#define _DPU_HW_VBIF_H

#include "dpu_hw_catalog.h"
#include "dpu_hw_mdss.h"
#include "dpu_hw_util.h"

struct dpu_hw_vbif;

/**
 * struct dpu_hw_vbif_ops : Interface to the VBIF hardware driver functions
 *  Assumption is these functions will be called after clocks are enabled
 */
struct dpu_hw_vbif_ops {
        /**
         * @set_limit_conf: set transaction limit config
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         * @rd: true for read limit; false for write limit
         * @limit: outstanding transaction limit
         */
        void (*set_limit_conf)(struct dpu_hw_vbif *vbif,
                        u32 xin_id, bool rd, u32 limit);

        /**
         * @get_limit_conf: get transaction limit config
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         * @rd: true for read limit; false for write limit
         * @return: outstanding transaction limit
         */
        u32 (*get_limit_conf)(struct dpu_hw_vbif *vbif,
                        u32 xin_id, bool rd);

        /**
         * @set_halt_ctrl: set halt control
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         * @enable: halt control enable
         */
        void (*set_halt_ctrl)(struct dpu_hw_vbif *vbif,
                        u32 xin_id, bool enable);

        /**
         * @get_halt_ctrl: get halt control
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         * @return: halt control enable
         */
        bool (*get_halt_ctrl)(struct dpu_hw_vbif *vbif,
                        u32 xin_id);

        /**
         * @set_qos_remap: set QoS priority remap
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         * @level: priority level
         * @remap_level: remapped level
         */
        void (*set_qos_remap)(struct dpu_hw_vbif *vbif,
                        u32 xin_id, u32 level, u32 remap_level);

        /**
         * @set_mem_type: set memory type
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         * @value: memory type value
         */
        void (*set_mem_type)(struct dpu_hw_vbif *vbif,
                        u32 xin_id, u32 value);

        /**
         * @clear_errors: clear any vbif errors
         *      This function clears any detected pending/source errors
         *      on the VBIF interface, and optionally returns the detected
         *      error mask(s).
         * @vbif: vbif context driver
         * @pnd_errors: pointer to pending error reporting variable
         * @src_errors: pointer to source error reporting variable
         */
        void (*clear_errors)(struct dpu_hw_vbif *vbif,
                u32 *pnd_errors, u32 *src_errors);

        /**
         * @set_write_gather_en: set write_gather enable
         * @vbif: vbif context driver
         * @xin_id: client interface identifier
         */
        void (*set_write_gather_en)(struct dpu_hw_vbif *vbif, u32 xin_id);
};

struct dpu_hw_vbif {
        /* base */
        struct dpu_hw_blk_reg_map hw;

        /* vbif */
        enum dpu_vbif idx;
        const struct dpu_vbif_cfg *cap;

        /* ops */
        struct dpu_hw_vbif_ops ops;
};

struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
                                     const struct dpu_vbif_cfg *cfg,
                                     void __iomem *addr);

#endif /*_DPU_HW_VBIF_H */