123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
- * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
- */
- #ifndef _SDE_RSC_PRIV_H_
- #define _SDE_RSC_PRIV_H_
- #include <linux/kernel.h>
- #include <linux/sde_io_util.h>
- #include <linux/sde_rsc.h>
- #include <soc/qcom/tcs.h>
- #include "sde_power_handle.h"
- #define SDE_RSC_COMPATIBLE "disp_rscc"
- #define MAX_RSC_COUNT 5
- #define ALL_MODES_DISABLED 0x0
- #define ONLY_MODE_0_ENABLED 0x1
- #define ONLY_MODE_0_1_ENABLED 0x3
- #define ALL_MODES_ENABLED 0x7
- #define MAX_COUNT_SIZE_SUPPORTED 128
- #define SDE_RSC_REV_1 0x1
- #define SDE_RSC_REV_2 0x2
- #define SDE_RSC_REV_3 0x3
- #define SDE_RSC_REV_4 0x4
- #define SDE_RSC_REV_5 0x5
- #define SDE_RSC_HW_MAJOR_MINOR_STEP(major, minor, step) \
- (((major & 0xff) << 16) |\
- ((minor & 0xff) << 8) | \
- (step & 0xff))
- struct sde_rsc_priv;
- /**
- * rsc_mode_req: sde rsc mode request information
- * MODE_READ: read vsync status
- * MODE_UPDATE: mode timeslot update
- * 0x0: all modes are disabled.
- * 0x1: Mode-0 is enabled and other two modes are disabled.
- * 0x3: Mode-0 & Mode-1 are enabled and mode-2 is disabled.
- * 0x7: all modes are enabled.
- */
- enum rsc_mode_req {
- MODE_READ,
- MODE_UPDATE = 0x1,
- };
- /**
- * rsc_vsync_req: sde rsc vsync request information
- * VSYNC_READ: read vsync status
- * VSYNC_READ_VSYNC0: read value vsync0 timestamp (cast to int from u32)
- * VSYNC_ENABLE: enable rsc wrapper vsync status
- * VSYNC_DISABLE: disable rsc wrapper vsync status
- */
- enum rsc_vsync_req {
- VSYNC_READ,
- VSYNC_READ_VSYNC0,
- VSYNC_ENABLE,
- VSYNC_DISABLE,
- };
- /**
- * struct sde_rsc_hw_ops - sde resource state coordinator hardware ops
- * @init: Initialize the sequencer, solver, qtimer,
- etc. hardware blocks on RSC.
- * @timer_update: update the static wrapper time and pdc/rsc
- backoff time.
- * @tcs_wait: Waits for TCS block OK to allow sending a
- * TCS command.
- * @hw_vsync: Enables the vsync on RSC block.
- * @tcs_use_ok: set TCS set to high to allow RSC to use it.
- * @bwi_status: It updates the BW increase/decrease status.
- * @debug_dump: dump debug bus registers or enable debug bus
- * @state_update: Enable/override the solver based on rsc state
- * status (command/video)
- * @debug_show: Show current debug status.
- * @mode_ctrl: shows current mode status, mode0/1/2
- * @setup_counters: Enable/disable RSC profiling counters
- * @get_counters: Get current status of profiling counters
- */
- struct sde_rsc_hw_ops {
- int (*init)(struct sde_rsc_priv *rsc);
- int (*timer_update)(struct sde_rsc_priv *rsc);
- int (*tcs_wait)(struct sde_rsc_priv *rsc);
- int (*hw_vsync)(struct sde_rsc_priv *rsc, enum rsc_vsync_req request,
- char *buffer, int buffer_size, u32 mode);
- int (*tcs_use_ok)(struct sde_rsc_priv *rsc);
- int (*bwi_status)(struct sde_rsc_priv *rsc);
- void (*debug_dump)(struct sde_rsc_priv *rsc, u32 mux_sel);
- int (*state_update)(struct sde_rsc_priv *rsc, enum sde_rsc_state state);
- int (*debug_show)(struct seq_file *s, struct sde_rsc_priv *rsc);
- int (*mode_ctrl)(struct sde_rsc_priv *rsc, enum rsc_mode_req request,
- char *buffer, int buffer_size, u32 mode);
- int (*setup_counters)(struct sde_rsc_priv *rsc, bool enable);
- int (*get_counters)(struct sde_rsc_priv *rsc, u32 *counters);
- };
- /**
- * struct sde_rsc_timer_config: this is internal configuration between
- * rsc and rsc_hw API.
- *
- * @static_wakeup_time_ns: wrapper backoff time in nano seconds
- * @rsc_backoff_time_ns: rsc backoff time in nano seconds
- * @pdc_backoff_time_ns: pdc backoff time in nano seconds
- * @rsc_mode_threshold_time_ns: rsc mode threshold time in nano seconds
- * @rsc_time_slot_0_ns: mode-0 time slot threshold in nano seconds
- * @rsc_time_slot_1_ns: mode-1 time slot threshold in nano seconds
- * @rsc_time_slot_2_ns: mode-2 time slot threshold in nano seconds
- *
- * @min_threshold_time_ns: minimum time required to enter & exit mode0
- * @bwi_threshold_time_ns: worst case time to increase the BW vote
- */
- struct sde_rsc_timer_config {
- u32 static_wakeup_time_ns;
- u32 rsc_backoff_time_ns;
- u32 pdc_backoff_time_ns;
- u32 rsc_mode_threshold_time_ns;
- u32 rsc_time_slot_0_ns;
- u32 rsc_time_slot_1_ns;
- u32 rsc_time_slot_2_ns;
- u32 min_threshold_time_ns;
- u32 bwi_threshold_time_ns;
- };
- /**
- * struct sde_rsc_bw_config: bandwidth configuration
- *
- * @ab_vote: Stored ab_vote for SDE_POWER_HANDLE_DBUS_ID_MAX
- * @ib_vote: Stored ib_vote for SDE_POWER_HANDLE_DBUS_ID_MAX
- * @new_ab_vote: ab_vote for incoming frame.
- * @new_ib_vote: ib_vote for incoming frame.
- */
- struct sde_rsc_bw_config {
- u64 ab_vote[SDE_POWER_HANDLE_DBUS_ID_MAX];
- u64 ib_vote[SDE_POWER_HANDLE_DBUS_ID_MAX];
- u64 new_ab_vote[SDE_POWER_HANDLE_DBUS_ID_MAX];
- u64 new_ib_vote[SDE_POWER_HANDLE_DBUS_ID_MAX];
- };
- /**
- * enum sde_rsc_bw_delta bandwidth change
- *
- * @BW_HIGH_TO_LOW: Bandwidth vote from high to low
- * @BW_LOW_TO_HIGH: Bandwidth vote from low to high
- * @BW_NO_CHANGE: No change in Bandwidth vote
- * @BW_DELTA_MAX: Maximum value
- */
- enum sde_rsc_bw_delta {
- BW_HIGH_TO_LOW,
- BW_LOW_TO_HIGH,
- BW_NO_CHANGE,
- BW_DELTA_MAX,
- };
- /**
- * struct sde_rsc_priv: sde resource state coordinator(rsc) private handle
- * @version: rsc sequence version
- * @hw_drv_ver: rscc hw version
- * @phandle: module power handle for clocks
- * @fs: "MDSS GDSC" handle
- * @sw_fs_enabled: track "MDSS GDSC" sw vote during probe
- *
- * @rpmh_dev: rpmh device node
- * @drv_io: sde drv io data mapping
- * @wrapper_io: wrapper io data mapping
- *
- * @client_list: current rsc client list handle
- * @event_list: current rsc event list handle
- * @client_lock: current rsc client synchronization lock
- *
- * timer_config: current rsc timer configuration
- * cmd_config: current panel config
- * current_state: current rsc state (video/command), solver
- * override/enabled.
- * vsync_source: Interface index to provide the vsync ticks
- * update_tcs_content: WAKE & SLEEP / AMC TCS content needs update with same BW
- * vote if RSC state updates.
- * debug_mode: enables the logging for each register read/write
- * debugfs_root: debugfs file system root node
- *
- * hw_ops: sde rsc hardware operations
- * power_collapse: if all clients are in IDLE state then it enters in
- * mode2 state and enable the power collapse state
- * power_collapse_block:By default, rsc move to mode-2 if all clients are in
- * invalid state. It can be blocked by this boolean entry.
- * primary_client: A client which is allowed to make command state request
- * and ab/ib vote on display rsc
- * single_tcs_execution_time: worst case time to execute one tcs vote
- * (sleep/wake), in ns
- * backoff_time_ns: time to only wake tcs in any mode
- * mode_threshold_time_ns: time to wake TCS in mode-0, must be greater than
- * backoff time
- * time_slot_0_ns: time for sleep & wake TCS in mode-1
- * rsc_vsync_wait: Refcount to indicate if we have to wait for the vsync.
- * rsc_vsync_waitq: Queue to wait for the vsync.
- * bw_config: check sde_rsc_bw_config structure description.
- * dev: rsc device node
- * resource_refcount: Track rsc resource refcount
- * profiling_supp: Indicates if HW has support for profiling counters
- * profiling_en: Flag for rsc lpm profiling counters, true=enabled
- * post_poms: bool if a panel mode change occurred
- * bwi_update: enum to indidate a bandwitdh vote change
- */
- struct sde_rsc_priv {
- u32 version;
- u32 hw_drv_ver;
- struct sde_power_handle phandle;
- struct regulator *fs;
- bool sw_fs_enabled;
- struct device *rpmh_dev;
- struct dss_io_data drv_io;
- struct dss_io_data wrapper_io;
- struct list_head client_list;
- struct list_head event_list;
- struct mutex client_lock;
- struct sde_rsc_timer_config timer_config;
- struct sde_rsc_cmd_config cmd_config;
- u32 current_state;
- u32 vsync_source;
- bool update_tcs_content;
- u32 debug_mode;
- struct dentry *debugfs_root;
- struct sde_rsc_hw_ops hw_ops;
- bool power_collapse;
- bool power_collapse_block;
- struct sde_rsc_client *primary_client;
- u32 single_tcs_execution_time;
- u32 backoff_time_ns;
- u32 mode_threshold_time_ns;
- u32 time_slot_0_ns;
- atomic_t rsc_vsync_wait;
- wait_queue_head_t rsc_vsync_waitq;
- struct sde_rsc_bw_config bw_config;
- struct device *dev;
- atomic_t resource_refcount;
- bool profiling_supp;
- bool profiling_en;
- bool post_poms;
- enum sde_rsc_bw_delta bwi_update;
- };
- /**
- * sde_rsc_hw_register() - register hardware API. It manages V1 and V2 support.
- *
- * @client: Client pointer provided by sde_rsc_client_create().
- *
- * Return: error code.
- */
- int sde_rsc_hw_register(struct sde_rsc_priv *rsc);
- /**
- * sde_rsc_hw_register_v3() - register hardware API. It manages V3 support.
- *
- * @client: Client pointer provided by sde_rsc_client_create().
- *
- * Return: error code.
- */
- int sde_rsc_hw_register_v3(struct sde_rsc_priv *rsc);
- #endif /* _SDE_RSC_PRIV_H_ */
|