Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save lategoodbye/bbd8165be409b62aec28f9f43f20b5ec to your computer and use it in GitHub Desktop.
Save lategoodbye/bbd8165be409b62aec28f9f43f20b5ec to your computer and use it in GitHub Desktop.
Add more debug to BCM2835 power drivers
From 1be26a8b6e87266f50751f1cfed3fe54b71d75db Mon Sep 17 00:00:00 2001
From: Stefan Wahren <wahrenst@gmx.net>
Date: Fri, 14 Jun 2019 10:36:23 +0200
Subject: [PATCH] soc: bcm: Add more debug to power drivers
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
---
drivers/soc/bcm/bcm2835-power.c | 14 ++++++++++++++
drivers/soc/bcm/raspberrypi-power.c | 4 ++++
2 files changed, 18 insertions(+)
diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 1e0041e..555092a 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -148,6 +148,17 @@ struct bcm2835_power {
struct reset_controller_dev reset;
};
+static void bcm2835_dump_register(struct bcm2835_power *power, const char *prefix)
+{
+ struct device *dev = power->dev;
+
+ dev_info(dev, "%s: GRAFX %08x V3D_S_CTRL %08x V3D_M_CTRL %08x\n",
+ prefix,
+ PM_READ(PM_GRAFX),
+ ASB_READ(ASB_V3D_S_CTRL),
+ ASB_READ(ASB_V3D_M_CTRL));
+}
+
static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
{
u64 start;
@@ -362,8 +373,11 @@ static int bcm2835_power_pd_power_on(struct generic_pm_domain *domain)
container_of(domain, struct bcm2835_power_domain, base);
struct bcm2835_power *power = pd->power;
+ dev_info(power->dev, "%s: %u\n", __func__, pd->domain);
+
switch (pd->domain) {
case BCM2835_POWER_DOMAIN_GRAFX:
+ bcm2835_dump_register(power, "Before");
return bcm2835_power_power_on(pd, PM_GRAFX);
case BCM2835_POWER_DOMAIN_GRAFX_V3D:
diff --git a/drivers/soc/bcm/raspberrypi-power.c b/drivers/soc/bcm/raspberrypi-power.c
index 5d1aacd..05c341b 100644
--- a/drivers/soc/bcm/raspberrypi-power.c
+++ b/drivers/soc/bcm/raspberrypi-power.c
@@ -74,6 +74,8 @@ static int rpi_domain_on(struct generic_pm_domain *domain)
struct rpi_power_domain *rpi_domain =
container_of(domain, struct rpi_power_domain, base);
+ pr_info("%s: %u\n", __func__, rpi_domain->domain);
+
return rpi_firmware_set_power(rpi_domain, true);
}
@@ -148,6 +150,8 @@ rpi_has_new_domain_support(struct rpi_power_domains *rpi_domains)
RPI_FIRMWARE_GET_DOMAIN_STATE,
&packet, sizeof(packet));
+ pr_info("%s: ret %d, on %08x\n", __func__, ret, packet.on);
+
return ret == 0 && packet.on != ~0;
}
--
2.7.4
From bcf168668a78f229cfc6a3a04707a096b642205d Mon Sep 17 00:00:00 2001
From: Stefan Wahren <wahrenst@gmx.net>
Date: Fri, 14 Jun 2019 13:07:26 +0200
Subject: [PATCH 2/2] soc: bcm2835-power: Make timeout handling in ramp-up more
verbose
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
---
drivers/soc/bcm/bcm2835-power.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 555092a..4a63623 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -242,13 +242,25 @@ static int bcm2835_power_power_on(struct bcm2835_power_domain *pd, u32 pm_reg)
start = ktime_get_ns();
while (!(powok = !!(PM_READ(pm_reg) & PM_POWOK))) {
cpu_relax();
- if (ktime_get_ns() - start >= 3000)
+ if (ktime_get_ns() - start >= 3000) {
+ dev_err(dev, "Timeout #1 waiting for %s inrush %d\n",
+ pd->base.name, inrush);
break;
+ }
+ }
+ if (powok)
+ dev_info(dev, "For %s inrush %d finished after %llu ns\n",
+ pd->base.name, inrush, ktime_get_ns() - start);
+ while (!(powok = !!(PM_READ(pm_reg) & PM_POWOK))) {
+ cpu_relax();
+ if (ktime_get_ns() - start >= 20000) {
+ dev_err(dev, "Timeout #2 waiting for %s inrush %d\n",
+ pd->base.name, inrush);
+ break;
+ }
}
}
if (!powok) {
- dev_err(dev, "Timeout waiting for %s power OK\n",
- pd->base.name);
ret = -ETIMEDOUT;
goto err_disable_powup;
}
--
2.7.4
From cc38d8a2ea388e275b0c9a16e83317a09b83adf5 Mon Sep 17 00:00:00 2001
From: Stefan Wahren <wahrenst@gmx.net>
Date: Wed, 19 Jun 2019 18:49:04 +0200
Subject: [PATCH 3/3] soc: bcm2835-power: Try to dump all relevant registers
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
---
drivers/soc/bcm/bcm2835-power.c | 46 +++++++++++++++++++++++++++++++++++------
1 file changed, 40 insertions(+), 6 deletions(-)
diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 4a63623..577c32c 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -151,12 +151,46 @@ struct bcm2835_power {
static void bcm2835_dump_register(struct bcm2835_power *power, const char *prefix)
{
struct device *dev = power->dev;
-
- dev_info(dev, "%s: GRAFX %08x V3D_S_CTRL %08x V3D_M_CTRL %08x\n",
- prefix,
- PM_READ(PM_GRAFX),
- ASB_READ(ASB_V3D_S_CTRL),
- ASB_READ(ASB_V3D_M_CTRL));
+ static bool once = false;
+
+ if (once)
+ return;
+
+ once = true;
+
+ dev_info(dev, "%s: PM_GNRIC %08x\n", prefix, PM_READ(PM_GNRIC));
+ dev_info(dev, "%s: PM_AUDIO %08x\n", prefix, PM_READ(PM_AUDIO));
+ dev_info(dev, "%s: PM_STATUS %08x\n", prefix, PM_READ(PM_STATUS));
+ dev_info(dev, "%s: PM_RSTC %08x\n", prefix, PM_READ(PM_RSTC));
+ dev_info(dev, "%s: PM_RSTS %08x\n", prefix, PM_READ(PM_RSTS));
+ dev_info(dev, "%s: PM_PADS0 %08x\n", prefix, PM_READ(PM_PADS0));
+ dev_info(dev, "%s: PM_PADS2 %08x\n", prefix, PM_READ(PM_PADS2));
+ dev_info(dev, "%s: PM_PADS3 %08x\n", prefix, PM_READ(PM_PADS3));
+ dev_info(dev, "%s: PM_PADS4 %08x\n", prefix, PM_READ(PM_PADS4));
+ dev_info(dev, "%s: PM_PADS5 %08x\n", prefix, PM_READ(PM_PADS5));
+ dev_info(dev, "%s: PM_PADS6 %08x\n", prefix, PM_READ(PM_PADS6));
+ dev_info(dev, "%s: PM_CAM0 %08x\n", prefix, PM_READ(PM_CAM0));
+ dev_info(dev, "%s: PM_CAM1 %08x\n", prefix, PM_READ(PM_CAM1));
+ dev_info(dev, "%s: PM_CCP2TX %08x\n", prefix, PM_READ(PM_CCP2TX));
+ dev_info(dev, "%s: PM_DSI0 %08x\n", prefix, PM_READ(PM_DSI0));
+ dev_info(dev, "%s: PM_DSI1 %08x\n", prefix, PM_READ(PM_DSI1));
+ dev_info(dev, "%s: PM_HDMI %08x\n", prefix, PM_READ(PM_HDMI));
+ dev_info(dev, "%s: PM_USB %08x\n", prefix, PM_READ(PM_USB));
+ dev_info(dev, "%s: PM_PXLDO %08x\n", prefix, PM_READ(PM_PXLDO));
+ dev_info(dev, "%s: PM_PXBG %08x\n", prefix, PM_READ(PM_PXBG));
+ dev_info(dev, "%s: PM_DFT %08x\n", prefix, PM_READ(PM_DFT));
+ dev_info(dev, "%s: PM_SMPS %08x\n", prefix, PM_READ(PM_SMPS));
+ dev_info(dev, "%s: PM_XOSC %08x\n", prefix, PM_READ(PM_XOSC));
+ dev_info(dev, "%s: PM_SPAREW %08x\n", prefix, PM_READ(PM_SPAREW));
+ dev_info(dev, "%s: PM_SPARER %08x\n", prefix, PM_READ(PM_SPARER));
+ dev_info(dev, "%s: PM_AVS_RSTDR %08x\n", prefix, PM_READ(PM_AVS_RSTDR));
+ dev_info(dev, "%s: PM_AVS_STAT %08x\n", prefix, PM_READ(PM_AVS_STAT));
+ dev_info(dev, "%s: PM_AVS_EVENT %08x\n", prefix, PM_READ(PM_AVS_EVENT));
+ dev_info(dev, "%s: PM_AVS_INTEN %08x\n", prefix, PM_READ(PM_AVS_INTEN));
+ dev_info(dev, "%s: PM_DUMMY %08x\n", prefix, PM_READ(PM_DUMMY));
+ dev_info(dev, "%s: PM_IMAGE %08x\n", prefix, PM_READ(PM_IMAGE));
+ dev_info(dev, "%s: PM_GRAFX %08x\n", prefix, PM_READ(PM_GRAFX));
+ dev_info(dev, "%s: PM_PROC %08x\n", prefix, PM_READ(PM_PROC));
}
static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
--
2.7.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment