ceb4e628fe
During video encoder use case we found power spikes going up. Which is not expected from power side. After analyzing further, we found that load is going above 35% which is leading to clock scale up and increase in power consumption. After using threshold as 75 the clock will only scaleup if the load is more than 75. And hence reduce in power spikes. And not leading to any performance degradation. Introduce new device tree property to configure threshold as 75 for slower eMMC parts to avoid power spikes. Change-Id: Ia3f18e2c83492e580e678bccdf244730a2de91b2 Signed-off-by: Sachin Gupta <quic_sachgupt@quicinc.com> Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
74 lines
3.3 KiB
C
74 lines
3.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _DRIVERS_MMC_SDHCI_MSM_SCALING_H
|
|
#define _DRIVERS_MMC_SDHCI_MSM_SCALING_H
|
|
|
|
#include <linux/devfreq.h>
|
|
#include "sdhci-msm.h"
|
|
|
|
#include "../core/queue.h"
|
|
#include "../core/host.h"
|
|
#include "../core/mmc_ops.h"
|
|
#include "../core/core.h"
|
|
|
|
struct sdhci_msm_host;
|
|
|
|
#define MMC_READ_SINGLE_BLOCK 17 /* adtc [31:0] data addr R1 */
|
|
#define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */
|
|
#define MMC_WRITE_BLOCK 24 /* adtc [31:0] data addr R1 */
|
|
#define MMC_WRITE_MULTIPLE_BLOCK 25 /* adtc R1 */
|
|
#define MMC_DEVFRQ_DEFAULT_UP_THRESHOLD 35
|
|
/* For targets with slower eMMC */
|
|
#define MMC_DEVFRQ_SPECIAL_UP_THRESHOLD 75
|
|
#define MMC_DEVFRQ_DEFAULT_DOWN_THRESHOLD 5
|
|
#define MMC_DEVFRQ_DEFAULT_POLLING_MSEC 100
|
|
#define MMC_SCALE_LOW_FREQ 50000000
|
|
#define MMC_SCALE_HIGH_FREQ 200000000
|
|
|
|
extern int mmc_select_bus_width(struct mmc_card *card);
|
|
extern int mmc_select_hs(struct mmc_card *card);
|
|
extern int mmc_select_hs_ddr(struct mmc_card *card);
|
|
extern int mmc_select_hs400(struct mmc_card *card);
|
|
extern int mmc_hs200_tuning(struct mmc_card *card);
|
|
extern void mmc_set_bus_speed(struct mmc_card *card);
|
|
extern int mmc_select_hs200(struct mmc_card *card);
|
|
|
|
void sdhci_msm_scale_parse_dt(struct device *dev, struct sdhci_msm_host *msm_host);
|
|
void sdhci_msm_mmc_deferred_scaling(struct sdhci_msm_host *host);
|
|
void _sdhci_msm_mmc_cqe_clk_scaling_start_busy(struct mmc_queue *mq,
|
|
struct sdhci_msm_host *host, bool lock_needed);
|
|
void _sdhci_msm_mmc_cqe_clk_scaling_stop_busy(struct sdhci_msm_host *host,
|
|
bool lock_needed, int is_cqe_dcmd);
|
|
int _sdhci_msm_mmc_exit_clk_scaling(struct sdhci_msm_host *host);
|
|
int _sdhci_msm_mmc_suspend_clk_scaling(struct sdhci_msm_host *host);
|
|
int _sdhci_msm_mmc_resume_clk_scaling(struct sdhci_msm_host *host);
|
|
int _sdhci_msm_mmc_init_clk_scaling(struct sdhci_msm_host *host);
|
|
bool sdhci_msm_mmc_is_data_request(u32 opcode);
|
|
void _sdhci_msm_mmc_clk_scaling_start_busy(struct sdhci_msm_host *host, bool lock_needed);
|
|
void _sdhci_msm_mmc_clk_scaling_stop_busy(struct sdhci_msm_host *host, bool lock_needed);
|
|
|
|
struct mmc_card;
|
|
struct mmc_queue;
|
|
|
|
void sdhci_msm_update_curr_part(struct mmc_host *host, unsigned int part_type);
|
|
void sdhci_msm_dec_active_req(struct mmc_host *host);
|
|
void sdhci_msm_inc_active_req(struct mmc_host *host);
|
|
void sdhci_msm_is_dcmd(int data, int *err);
|
|
extern void sdhci_msm_mmc_cqe_clk_scaling_stop_busy(struct mmc_host *host, struct mmc_request *mrq);
|
|
extern void sdhci_msm_mmc_cqe_clk_scaling_start_busy(struct mmc_host *host,
|
|
struct mmc_request *mrq);
|
|
void sdhci_msm_mmc_clk_scaling_stop_busy(struct mmc_host *host, bool data);
|
|
void sdhci_msm_mmc_clk_scaling_start_busy(struct mmc_host *host, bool data, u32 opcode);
|
|
void sdhci_msm_set_active_reqs(struct mmc_host *host);
|
|
void sdhci_msm_set_factors(struct mmc_host *host);
|
|
void sdhci_msm_mmc_init_setup_scaling(struct mmc_card *card, struct mmc_host *host);
|
|
void sdhci_msm_mmc_exit_clk_scaling(struct mmc_host *host);
|
|
void sdhci_msm_mmc_suspend_clk_scaling(struct mmc_host *host);
|
|
void sdhci_msm_mmc_resume_clk_scaling(struct mmc_host *host);
|
|
void sdhci_msm_mmc_init_clk_scaling(struct mmc_host *host);
|
|
void sdhci_msm_cqe_scaling_resume(struct mmc_host *host);
|
|
#endif
|