Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32db091b authored by Archana Sathyakumar's avatar Archana Sathyakumar
Browse files

msm-pm: Print spm registers status on hotplug failure



In the event that the cpu fails to collapse within 2ms,
dump the spm registers to understand the state and
whether or not it is enabled.

CRs-fixed: 675717
Change-Id: I75c66b71532555981b6fae12c8a6466acc039721
Signed-off-by: default avatarArchana Sathyakumar <asathyak@codeaurora.org>
parent 4712ce04
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -437,7 +437,7 @@ bool msm_cpu_pm_enter_sleep(enum msm_pm_sleep_mode mode, bool from_idle)
 */
int msm_pm_wait_cpu_shutdown(unsigned int cpu)
{
	int timeout = 10;
	int timeout = 0;

	if (!msm_pm_slp_sts)
		return 0;
@@ -455,7 +455,14 @@ int msm_pm_wait_cpu_shutdown(unsigned int cpu)
			return 0;

		udelay(100);
		WARN(++timeout == 20, "CPU%u didn't collapse in 2ms\n", cpu);
		/*
		 * Dump spm registers for debugging
		 */
		if (++timeout == 20) {
			msm_spm_dump_regs(cpu);
			__WARN_printf("CPU%u didn't collapse in 2ms, sleep status: 0x%x\n",
					cpu, acc_sts);
		}
	}

	return -EBUSY;
+12 −0
Original line number Diff line number Diff line
@@ -252,6 +252,18 @@ void msm_spm_drv_flush_seq_entry(struct msm_spm_driver_data *dev)
	mb();
}

void dump_regs(struct msm_spm_driver_data *dev, int cpu)
{
	msm_spm_drv_load_shadow(dev, MSM_SPM_REG_SAW2_SPM_STS);
	mb();
	pr_err("CPU%d: spm register MSM_SPM_REG_SAW2_SPM_STS: 0x%x\n", cpu,
			dev->reg_shadow[MSM_SPM_REG_SAW2_SPM_STS]);
	msm_spm_drv_load_shadow(dev, MSM_SPM_REG_SAW2_SPM_CTL);
	mb();
	pr_err("CPU%d: spm register MSM_SPM_REG_SAW2_SPM_CTL: 0x%x\n", cpu,
			dev->reg_shadow[MSM_SPM_REG_SAW2_SPM_CTL]);
}

int msm_spm_drv_write_seq_data(struct msm_spm_driver_data *dev,
		uint8_t *cmd, uint32_t *offset)
{
+5 −0
Original line number Diff line number Diff line
@@ -90,6 +90,11 @@ int msm_spm_probe_done(void)
}
EXPORT_SYMBOL(msm_spm_probe_done);

void msm_spm_dump_regs(unsigned int cpu)
{
	dump_regs(&per_cpu(msm_cpu_spm_device, cpu).reg_data, cpu);
}

/**
 * msm_spm_set_vdd(): Set core voltage
 * @cpu: core id
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ int msm_spm_drv_set_low_power_mode(struct msm_spm_driver_data *dev,
		uint32_t addr, bool pc_mode);
int msm_spm_drv_set_vdd(struct msm_spm_driver_data *dev,
		unsigned int vlevel);
void dump_regs(struct msm_spm_driver_data *dev, int cpu);
uint32_t msm_spm_drv_get_sts_curr_pmic_data(
		struct msm_spm_driver_data *dev);
int msm_spm_drv_write_seq_data(struct msm_spm_driver_data *dev,
+7 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ int msm_spm_config_low_power_mode(struct msm_spm_device *dev,
		unsigned int mode, bool notify_rpm);
int msm_spm_device_init(void);
bool msm_spm_is_mode_avail(unsigned int mode);

void msm_spm_dump_regs(unsigned int cpu);
#if defined(CONFIG_MSM_L2_SPM)

/* Public functions */
@@ -87,6 +87,12 @@ static inline int msm_spm_device_init(void)
{
	return -ENOSYS;
}

static void msm_spm_dump_regs(unsigned int cpu)
{
	return;
}

int msm_spm_config_low_power_mode(struct msm_spm_device *dev,
		unsigned int mode, bool notify_rpm)
{