mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-30 14:16:40 +00:00
linux (Rockchip): update patches for 5.13
This commit is contained in:
parent
36bf5aa381
commit
55fc867644
@ -1,318 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Wed, 21 Apr 2021 18:03:36 -0300
|
||||
Subject: [PATCH] dt-bindings: vendor-prefixes: Add Tang Cheng (TCS)
|
||||
|
||||
Shenzhen City Tang Cheng Technology (http://www.tctek.cn/)
|
||||
is a power management IC manufacturer.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
index 259faf1b382c..0ec33479df3c 100644
|
||||
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
@@ -1055,6 +1055,8 @@ patternProperties:
|
||||
description: Trusted Computing Group
|
||||
"^tcl,.*":
|
||||
description: Toby Churchill Ltd.
|
||||
+ "^tcs,.*":
|
||||
+ description: Shenzhen City Tang Cheng Technology Co., Ltd.
|
||||
"^technexion,.*":
|
||||
description: TechNexion
|
||||
"^technologic,.*":
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Wed, 21 Apr 2021 18:03:37 -0300
|
||||
Subject: [PATCH] dt-bindings: regulator: Add support for TCS4525
|
||||
|
||||
Add a compatible string to support TCS4525/TCS4526 devices,
|
||||
which are compatible with Fairchild FAN53555 regulators.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/regulator/fan53555.txt | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/regulator/fan53555.txt b/Documentation/devicetree/bindings/regulator/fan53555.txt
|
||||
index e7fc045281d1..013f096ac0aa 100644
|
||||
--- a/Documentation/devicetree/bindings/regulator/fan53555.txt
|
||||
+++ b/Documentation/devicetree/bindings/regulator/fan53555.txt
|
||||
@@ -1,8 +1,8 @@
|
||||
Binding for Fairchild FAN53555 regulators
|
||||
|
||||
Required properties:
|
||||
- - compatible: one of "fcs,fan53555", "fcs,fan53526", "silergy,syr827" or
|
||||
- "silergy,syr828"
|
||||
+ - compatible: one of "fcs,fan53555", "fcs,fan53526", "silergy,syr827",
|
||||
+ "silergy,syr828" or "tcs,tcs4525".
|
||||
- reg: I2C address
|
||||
|
||||
Optional properties:
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Joseph Chen <chenjh@rock-chips.com>
|
||||
Date: Wed, 21 Apr 2021 18:03:38 -0300
|
||||
Subject: [PATCH] regulator: fan53555: Add TCS4525 DCDC support
|
||||
|
||||
TCS4525 main features:
|
||||
|
||||
- 2.7V to 5.5V Input Voltage Range;
|
||||
- 3MHz Constant Switching Frequency;
|
||||
- 5A Available Load Current;
|
||||
- Programmable Output Voltage: 0.6V to 1.4V in 6.25mV Steps;
|
||||
- PFM/PWM Operation for Optimum Increased Efficiency;
|
||||
|
||||
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
|
||||
[Ezequiel: Forward port]
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
---
|
||||
drivers/regulator/fan53555.c | 136 +++++++++++++++++++++++++++++++----
|
||||
1 file changed, 122 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c
|
||||
index aa426183b6a1..f3918f03aaf3 100644
|
||||
--- a/drivers/regulator/fan53555.c
|
||||
+++ b/drivers/regulator/fan53555.c
|
||||
@@ -24,6 +24,12 @@
|
||||
/* Voltage setting */
|
||||
#define FAN53555_VSEL0 0x00
|
||||
#define FAN53555_VSEL1 0x01
|
||||
+
|
||||
+#define TCS4525_VSEL0 0x11
|
||||
+#define TCS4525_VSEL1 0x10
|
||||
+#define TCS4525_TIME 0x13
|
||||
+#define TCS4525_COMMAND 0x14
|
||||
+
|
||||
/* Control register */
|
||||
#define FAN53555_CONTROL 0x02
|
||||
/* IC Type */
|
||||
@@ -49,11 +55,20 @@
|
||||
|
||||
#define FAN53555_NVOLTAGES 64 /* Numbers of voltages */
|
||||
#define FAN53526_NVOLTAGES 128
|
||||
+#define TCS4525_NVOLTAGES 127 /* Numbers of voltages */
|
||||
+
|
||||
+#define TCS_VSEL_NSEL_MASK 0x7f
|
||||
+#define TCS_VSEL0_MODE (1 << 7)
|
||||
+#define TCS_VSEL1_MODE (1 << 6)
|
||||
+
|
||||
+#define TCS_SLEW_SHIFT 3
|
||||
+#define TCS_SLEW_MASK (0x3 < 3)
|
||||
|
||||
enum fan53555_vendor {
|
||||
FAN53526_VENDOR_FAIRCHILD = 0,
|
||||
FAN53555_VENDOR_FAIRCHILD,
|
||||
FAN53555_VENDOR_SILERGY,
|
||||
+ FAN53555_VENDOR_TCS,
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -106,6 +121,11 @@ struct fan53555_device_info {
|
||||
unsigned int mode_mask;
|
||||
/* Sleep voltage cache */
|
||||
unsigned int sleep_vol_cache;
|
||||
+ /* Slew rate */
|
||||
+ unsigned int slew_reg;
|
||||
+ unsigned int slew_mask;
|
||||
+ unsigned int slew_shift;
|
||||
+ unsigned int slew_rate;
|
||||
};
|
||||
|
||||
static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
||||
@@ -189,13 +209,37 @@ static const int slew_rates[] = {
|
||||
500,
|
||||
};
|
||||
|
||||
+static const int tcs_slew_rates[] = {
|
||||
+ 18700,
|
||||
+ 9300,
|
||||
+ 4600,
|
||||
+ 2300,
|
||||
+};
|
||||
+
|
||||
static int fan53555_set_ramp(struct regulator_dev *rdev, int ramp)
|
||||
{
|
||||
struct fan53555_device_info *di = rdev_get_drvdata(rdev);
|
||||
int regval = -1, i;
|
||||
+ const int *slew_rate_t;
|
||||
+ int slew_rate_n;
|
||||
|
||||
- for (i = 0; i < ARRAY_SIZE(slew_rates); i++) {
|
||||
- if (ramp <= slew_rates[i])
|
||||
+ switch (di->vendor) {
|
||||
+ case FAN53526_VENDOR_FAIRCHILD:
|
||||
+ case FAN53555_VENDOR_FAIRCHILD:
|
||||
+ case FAN53555_VENDOR_SILERGY:
|
||||
+ slew_rate_t = slew_rates;
|
||||
+ slew_rate_n = ARRAY_SIZE(slew_rates);
|
||||
+ break;
|
||||
+ case FAN53555_VENDOR_TCS:
|
||||
+ slew_rate_t = tcs_slew_rates;
|
||||
+ slew_rate_n = ARRAY_SIZE(tcs_slew_rates);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < slew_rate_n; i++) {
|
||||
+ if (ramp <= slew_rate_t[i])
|
||||
regval = i;
|
||||
else
|
||||
break;
|
||||
@@ -206,8 +250,8 @@ static int fan53555_set_ramp(struct regulator_dev *rdev, int ramp)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- return regmap_update_bits(rdev->regmap, FAN53555_CONTROL,
|
||||
- CTL_SLEW_MASK, regval << CTL_SLEW_SHIFT);
|
||||
+ return regmap_update_bits(rdev->regmap, di->slew_reg,
|
||||
+ di->slew_mask, regval << di->slew_shift);
|
||||
}
|
||||
|
||||
static const struct regulator_ops fan53555_regulator_ops = {
|
||||
@@ -292,7 +336,9 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
|
||||
"Chip ID %d not supported!\n", di->chip_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
-
|
||||
+ di->slew_reg = FAN53555_CONTROL;
|
||||
+ di->slew_mask = CTL_SLEW_MASK;
|
||||
+ di->slew_shift = CTL_SLEW_SHIFT;
|
||||
di->vsel_count = FAN53555_NVOLTAGES;
|
||||
|
||||
return 0;
|
||||
@@ -312,12 +358,29 @@ static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di)
|
||||
"Chip ID %d not supported!\n", di->chip_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
-
|
||||
+ di->slew_reg = FAN53555_CONTROL;
|
||||
+ di->slew_reg = FAN53555_CONTROL;
|
||||
+ di->slew_mask = CTL_SLEW_MASK;
|
||||
+ di->slew_shift = CTL_SLEW_SHIFT;
|
||||
di->vsel_count = FAN53555_NVOLTAGES;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int fan53555_voltages_setup_tcs(struct fan53555_device_info *di)
|
||||
+{
|
||||
+ di->slew_reg = TCS4525_TIME;
|
||||
+ di->slew_mask = TCS_SLEW_MASK;
|
||||
+ di->slew_shift = TCS_SLEW_MASK;
|
||||
+
|
||||
+ /* Init voltage range and step */
|
||||
+ di->vsel_min = 600000;
|
||||
+ di->vsel_step = 6250;
|
||||
+ di->vsel_count = TCS4525_NVOLTAGES;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* For 00,01,03,05 options:
|
||||
* VOUT = 0.60V + NSELx * 10mV, from 0.60 to 1.23V.
|
||||
* For 04 option:
|
||||
@@ -329,17 +392,41 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
|
||||
int ret = 0;
|
||||
|
||||
/* Setup voltage control register */
|
||||
- switch (pdata->sleep_vsel_id) {
|
||||
- case FAN53555_VSEL_ID_0:
|
||||
- di->sleep_reg = FAN53555_VSEL0;
|
||||
- di->vol_reg = FAN53555_VSEL1;
|
||||
+ switch (di->vendor) {
|
||||
+ case FAN53526_VENDOR_FAIRCHILD:
|
||||
+ case FAN53555_VENDOR_FAIRCHILD:
|
||||
+ case FAN53555_VENDOR_SILERGY:
|
||||
+ switch (pdata->sleep_vsel_id) {
|
||||
+ case FAN53555_VSEL_ID_0:
|
||||
+ di->sleep_reg = FAN53555_VSEL0;
|
||||
+ di->vol_reg = FAN53555_VSEL1;
|
||||
+ break;
|
||||
+ case FAN53555_VSEL_ID_1:
|
||||
+ di->sleep_reg = FAN53555_VSEL1;
|
||||
+ di->vol_reg = FAN53555_VSEL0;
|
||||
+ break;
|
||||
+ default:
|
||||
+ dev_err(di->dev, "Invalid VSEL ID!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
break;
|
||||
- case FAN53555_VSEL_ID_1:
|
||||
- di->sleep_reg = FAN53555_VSEL1;
|
||||
- di->vol_reg = FAN53555_VSEL0;
|
||||
+ case FAN53555_VENDOR_TCS:
|
||||
+ switch (pdata->sleep_vsel_id) {
|
||||
+ case FAN53555_VSEL_ID_0:
|
||||
+ di->sleep_reg = TCS4525_VSEL0;
|
||||
+ di->vol_reg = TCS4525_VSEL1;
|
||||
+ break;
|
||||
+ case FAN53555_VSEL_ID_1:
|
||||
+ di->sleep_reg = TCS4525_VSEL1;
|
||||
+ di->vol_reg = TCS4525_VSEL0;
|
||||
+ break;
|
||||
+ default:
|
||||
+ dev_err(di->dev, "Invalid VSEL ID!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
- dev_err(di->dev, "Invalid VSEL ID!\n");
|
||||
+ dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -362,6 +449,18 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
|
||||
di->mode_reg = di->vol_reg;
|
||||
di->mode_mask = VSEL_MODE;
|
||||
break;
|
||||
+ case FAN53555_VENDOR_TCS:
|
||||
+ di->mode_reg = TCS4525_COMMAND;
|
||||
+
|
||||
+ switch (pdata->sleep_vsel_id) {
|
||||
+ case FAN53555_VSEL_ID_0:
|
||||
+ di->mode_mask = TCS_VSEL1_MODE;
|
||||
+ break;
|
||||
+ case FAN53555_VSEL_ID_1:
|
||||
+ di->mode_mask = TCS_VSEL0_MODE;
|
||||
+ break;
|
||||
+ }
|
||||
+ break;
|
||||
default:
|
||||
dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
|
||||
return -EINVAL;
|
||||
@@ -378,6 +477,9 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
|
||||
case FAN53555_VENDOR_SILERGY:
|
||||
ret = fan53555_voltages_setup_silergy(di);
|
||||
break;
|
||||
+ case FAN53555_VENDOR_TCS:
|
||||
+ ret = fan53555_voltages_setup_tcs(di);
|
||||
+ break;
|
||||
default:
|
||||
dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
|
||||
return -EINVAL;
|
||||
@@ -449,6 +551,9 @@ static const struct of_device_id __maybe_unused fan53555_dt_ids[] = {
|
||||
}, {
|
||||
.compatible = "silergy,syr828",
|
||||
.data = (void *)FAN53555_VENDOR_SILERGY,
|
||||
+ }, {
|
||||
+ .compatible = "tcs,tcs4525",
|
||||
+ .data = (void *)FAN53555_VENDOR_TCS
|
||||
},
|
||||
{ }
|
||||
};
|
||||
@@ -554,6 +659,9 @@ static const struct i2c_device_id fan53555_id[] = {
|
||||
}, {
|
||||
.name = "syr828",
|
||||
.driver_data = FAN53555_VENDOR_SILERGY
|
||||
+ }, {
|
||||
+ .name = "tcs4525",
|
||||
+ .driver_data = FAN53555_VENDOR_TCS
|
||||
},
|
||||
{ },
|
||||
};
|
@ -1,45 +1,3 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Geis <pgwipeout@gmail.com>
|
||||
Date: Tue, 11 May 2021 17:13:33 -0400
|
||||
Subject: [PATCH] regulator: fan53555: fix TCS4525 voltage calulation
|
||||
|
||||
The TCS4525 has 128 voltage steps. With the calculation set to 127 the
|
||||
most significant bit is disregarded which leads to a miscalculation of
|
||||
the voltage by about 200mv.
|
||||
|
||||
Fix the calculation to end deadlock on the rk3566-quartz64 which uses
|
||||
this as the cpu regulator.
|
||||
|
||||
Fixes: 914df8faa7d6 ("regulator: fan53555: Add TCS4525 DCDC support")
|
||||
Signed-off-by: Peter Geis <pgwipeout@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20210511211335.2935163-2-pgwipeout@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/regulator/fan53555.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c
|
||||
index f3918f03aaf3..26f06f685b1b 100644
|
||||
--- a/drivers/regulator/fan53555.c
|
||||
+++ b/drivers/regulator/fan53555.c
|
||||
@@ -55,7 +55,6 @@
|
||||
|
||||
#define FAN53555_NVOLTAGES 64 /* Numbers of voltages */
|
||||
#define FAN53526_NVOLTAGES 128
|
||||
-#define TCS4525_NVOLTAGES 127 /* Numbers of voltages */
|
||||
|
||||
#define TCS_VSEL_NSEL_MASK 0x7f
|
||||
#define TCS_VSEL0_MODE (1 << 7)
|
||||
@@ -376,7 +375,7 @@ static int fan53555_voltages_setup_tcs(struct fan53555_device_info *di)
|
||||
/* Init voltage range and step */
|
||||
di->vsel_min = 600000;
|
||||
di->vsel_step = 6250;
|
||||
- di->vsel_count = TCS4525_NVOLTAGES;
|
||||
+ di->vsel_count = FAN53526_NVOLTAGES;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Geis <pgwipeout@gmail.com>
|
||||
Date: Tue, 11 May 2021 17:13:34 -0400
|
||||
|
@ -785,10 +785,10 @@ index ae86da0dc5bd..f5eb7de10128 100644
|
||||
--- a/drivers/usb/dwc3/Makefile
|
||||
+++ b/drivers/usb/dwc3/Makefile
|
||||
@@ -51,4 +51,5 @@ obj-$(CONFIG_USB_DWC3_MESON_G12A) += dwc3-meson-g12a.o
|
||||
obj-$(CONFIG_USB_DWC3_OF_SIMPLE) += dwc3-of-simple.o
|
||||
obj-$(CONFIG_USB_DWC3_ST) += dwc3-st.o
|
||||
obj-$(CONFIG_USB_DWC3_QCOM) += dwc3-qcom.o
|
||||
obj-$(CONFIG_USB_DWC3_IMX8MP) += dwc3-imx8mp.o
|
||||
obj-$(CONFIG_USB_DWC3_XILINX) += dwc3-xilinx.o
|
||||
+obj-$(CONFIG_USB_DWC3_ROCKCHIP_INNO) += dwc3-rockchip-inno.o
|
||||
diff --git a/drivers/usb/dwc3/dwc3-rockchip-inno.c b/drivers/usb/dwc3/dwc3-rockchip-inno.c
|
||||
new file mode 100644
|
||||
|
@ -782,7 +782,7 @@ index c81ca5c7e979..a11474214bde 100644
|
||||
+{
|
||||
+ struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl);
|
||||
+
|
||||
+ if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_SPS && !ctx->valid_fmt) {
|
||||
+ if (ctrl->id == V4L2_CID_STATELESS_H264_SPS && !ctx->valid_fmt) {
|
||||
+ ctx->valid_fmt = rkvdec_valid_fmt(ctx, ctrl);
|
||||
+ if (ctx->valid_fmt) {
|
||||
+ struct v4l2_pix_format_mplane *pix_mp;
|
||||
@ -949,7 +949,7 @@ index a11474214bde..b57a39ce4f48 100644
|
||||
DIV_ROUND_UP(pix_mp->width, 16) *
|
||||
DIV_ROUND_UP(pix_mp->height, 16);
|
||||
@@ -55,19 +55,15 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl)
|
||||
if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_SPS) {
|
||||
if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) {
|
||||
const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps;
|
||||
unsigned int width, height;
|
||||
- /*
|
||||
|
@ -362,211 +362,3 @@ index 41edd0a421b2..4d463d50a63a 100644
|
||||
DRM_DEV_ERROR(lvds->dev, "failed to get pm runtime: %d\n", ret);
|
||||
return ret;
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Date: Thu, 21 Jan 2021 17:04:45 +0000
|
||||
Subject: [PATCH] drm/panfrost: Add governor data with pre-defined thresholds
|
||||
|
||||
The simple_ondemand devfreq governor uses two thresholds to decide about
|
||||
the frequency change: upthreshold, downdifferential. These two tunable
|
||||
change the behavior of the governor decision, e.g. how fast to increase
|
||||
the frequency or how rapidly limit the frequency. This patch adds needed
|
||||
governor data with thresholds values gathered experimentally in different
|
||||
workloads.
|
||||
|
||||
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 10 +++++++++-
|
||||
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 2 ++
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
index 17d5fa6e0b83..53e0188ce8e8 100644
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
@@ -130,8 +130,16 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
|
||||
panfrost_devfreq_profile.initial_freq = cur_freq;
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
+ /*
|
||||
+ * Setup default thresholds for the simple_ondemand governor.
|
||||
+ * The values are chosen based on experiments.
|
||||
+ */
|
||||
+ pfdevfreq->gov_data.upthreshold = 45;
|
||||
+ pfdevfreq->gov_data.downdifferential = 5;
|
||||
+
|
||||
devfreq = devm_devfreq_add_device(dev, &panfrost_devfreq_profile,
|
||||
- DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
|
||||
+ DEVFREQ_GOV_SIMPLE_ONDEMAND,
|
||||
+ &pfdevfreq->gov_data);
|
||||
if (IS_ERR(devfreq)) {
|
||||
DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
|
||||
ret = PTR_ERR(devfreq);
|
||||
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
|
||||
index db6ea48e21f9..1e2a4de941aa 100644
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
|
||||
@@ -4,6 +4,7 @@
|
||||
#ifndef __PANFROST_DEVFREQ_H__
|
||||
#define __PANFROST_DEVFREQ_H__
|
||||
|
||||
+#include <linux/devfreq.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
@@ -17,6 +18,7 @@ struct panfrost_devfreq {
|
||||
struct devfreq *devfreq;
|
||||
struct opp_table *regulators_opp_table;
|
||||
struct thermal_cooling_device *cooling;
|
||||
+ struct devfreq_simple_ondemand_data gov_data;
|
||||
bool opp_of_table_added;
|
||||
|
||||
ktime_t busy_time;
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Boris Brezillon <boris.brezillon@collabora.com>
|
||||
Date: Fri, 5 Feb 2021 12:17:57 +0100
|
||||
Subject: [PATCH] drm/panfrost: Stay in the threaded MMU IRQ handler until
|
||||
we've handled all IRQs
|
||||
|
||||
Doing a hw-irq -> threaded-irq round-trip is counter-productive, stay
|
||||
in the threaded irq handler as long as we can.
|
||||
|
||||
v2:
|
||||
* Rework the loop to avoid a goto
|
||||
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
|
||||
Reviewed-by: Steven Price <steven.price@arm.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_mmu.c | 26 +++++++++++++------------
|
||||
1 file changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c
|
||||
index 198686216317..5a3d18c05802 100644
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
|
||||
@@ -585,22 +585,20 @@ static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
|
||||
{
|
||||
struct panfrost_device *pfdev = data;
|
||||
u32 status = mmu_read(pfdev, MMU_INT_RAWSTAT);
|
||||
- int i, ret;
|
||||
+ int ret;
|
||||
|
||||
- for (i = 0; status; i++) {
|
||||
- u32 mask = BIT(i) | BIT(i + 16);
|
||||
+ while (status) {
|
||||
+ u32 as = ffs(status | (status >> 16)) - 1;
|
||||
+ u32 mask = BIT(as) | BIT(as + 16);
|
||||
u64 addr;
|
||||
u32 fault_status;
|
||||
u32 exception_type;
|
||||
u32 access_type;
|
||||
u32 source_id;
|
||||
|
||||
- if (!(status & mask))
|
||||
- continue;
|
||||
-
|
||||
- fault_status = mmu_read(pfdev, AS_FAULTSTATUS(i));
|
||||
- addr = mmu_read(pfdev, AS_FAULTADDRESS_LO(i));
|
||||
- addr |= (u64)mmu_read(pfdev, AS_FAULTADDRESS_HI(i)) << 32;
|
||||
+ fault_status = mmu_read(pfdev, AS_FAULTSTATUS(as));
|
||||
+ addr = mmu_read(pfdev, AS_FAULTADDRESS_LO(as));
|
||||
+ addr |= (u64)mmu_read(pfdev, AS_FAULTADDRESS_HI(as)) << 32;
|
||||
|
||||
/* decode the fault status */
|
||||
exception_type = fault_status & 0xFF;
|
||||
@@ -611,8 +609,8 @@ static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
|
||||
|
||||
/* Page fault only */
|
||||
ret = -1;
|
||||
- if ((status & mask) == BIT(i) && (exception_type & 0xF8) == 0xC0)
|
||||
- ret = panfrost_mmu_map_fault_addr(pfdev, i, addr);
|
||||
+ if ((status & mask) == BIT(as) && (exception_type & 0xF8) == 0xC0)
|
||||
+ ret = panfrost_mmu_map_fault_addr(pfdev, as, addr);
|
||||
|
||||
if (ret)
|
||||
/* terminal fault, print info about the fault */
|
||||
@@ -624,7 +622,7 @@ static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
|
||||
"exception type 0x%X: %s\n"
|
||||
"access type 0x%X: %s\n"
|
||||
"source id 0x%X\n",
|
||||
- i, addr,
|
||||
+ as, addr,
|
||||
"TODO",
|
||||
fault_status,
|
||||
(fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"),
|
||||
@@ -633,6 +631,10 @@ static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
|
||||
source_id);
|
||||
|
||||
status &= ~mask;
|
||||
+
|
||||
+ /* If we received new MMU interrupts, process them before returning. */
|
||||
+ if (!status)
|
||||
+ status = mmu_read(pfdev, MMU_INT_RAWSTAT);
|
||||
}
|
||||
|
||||
mmu_write(pfdev, MMU_INT_MASK, ~0);
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 27 Jan 2021 19:40:47 +0000
|
||||
Subject: [PATCH] drm/lima: add governor data with pre-defined thresholds
|
||||
|
||||
This patch adapts the panfrost pre-defined thresholds change [0] to the
|
||||
lima driver to improve real-world performance. The upthreshold value has
|
||||
been set to ramp GPU frequency to max freq faster (compared to panfrost)
|
||||
to compensate for the lower overall performance of utgard devices.
|
||||
|
||||
[0] https://patchwork.kernel.org/project/dri-devel/patch/20210121170445.19761-1-lukasz.luba@arm.com/
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Reviewed-by: Qiang Yu <yuq825@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_devfreq.c | 10 +++++++++-
|
||||
drivers/gpu/drm/lima/lima_devfreq.h | 2 ++
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/lima/lima_devfreq.c b/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
index 5686ad4aaf7c..c9854315a0b5 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
@@ -163,8 +163,16 @@ int lima_devfreq_init(struct lima_device *ldev)
|
||||
lima_devfreq_profile.initial_freq = cur_freq;
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
+ /*
|
||||
+ * Setup default thresholds for the simple_ondemand governor.
|
||||
+ * The values are chosen based on experiments.
|
||||
+ */
|
||||
+ ldevfreq->gov_data.upthreshold = 30;
|
||||
+ ldevfreq->gov_data.downdifferential = 5;
|
||||
+
|
||||
devfreq = devm_devfreq_add_device(dev, &lima_devfreq_profile,
|
||||
- DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
|
||||
+ DEVFREQ_GOV_SIMPLE_ONDEMAND,
|
||||
+ &ldevfreq->gov_data);
|
||||
if (IS_ERR(devfreq)) {
|
||||
dev_err(dev, "Couldn't initialize GPU devfreq\n");
|
||||
ret = PTR_ERR(devfreq);
|
||||
diff --git a/drivers/gpu/drm/lima/lima_devfreq.h b/drivers/gpu/drm/lima/lima_devfreq.h
|
||||
index 2d9b3008ce77..b0c7c736e81a 100644
|
||||
--- a/drivers/gpu/drm/lima/lima_devfreq.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_devfreq.h
|
||||
@@ -4,6 +4,7 @@
|
||||
#ifndef __LIMA_DEVFREQ_H__
|
||||
#define __LIMA_DEVFREQ_H__
|
||||
|
||||
+#include <linux/devfreq.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
@@ -18,6 +19,7 @@ struct lima_devfreq {
|
||||
struct opp_table *clkname_opp_table;
|
||||
struct opp_table *regulators_opp_table;
|
||||
struct thermal_cooling_device *cooling;
|
||||
+ struct devfreq_simple_ondemand_data gov_data;
|
||||
|
||||
ktime_t busy_time;
|
||||
ktime_t idle_time;
|
||||
|
Loading…
x
Reference in New Issue
Block a user