mirror of
https://github.com/archr-linux/Arch-R.git
synced 2026-03-31 14:41:55 -07:00
Merge pull request #1725 from loki666/sm8550-6.16
sm8550/linux: bump kernel to 6.16
This commit is contained in:
@@ -50,7 +50,7 @@ new file mode 100644
|
||||
index 000000000000..cbda976df1db
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpu/drm/panel/panel-chipone-icna3512.c
|
||||
@@ -0,0 +1,473 @@
|
||||
@@ -0,0 +1,459 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Chipone ICNA3512 Driver IC panels driver
|
||||
@@ -84,7 +84,7 @@ index 000000000000..cbda976df1db
|
||||
+ enum drm_panel_orientation orientation;
|
||||
+
|
||||
+ struct gpio_desc *reset_gpio;
|
||||
+ struct regulator_bulk_data supplies[3];
|
||||
+ struct regulator_bulk_data *supplies;
|
||||
+};
|
||||
+
|
||||
+struct panel_desc {
|
||||
@@ -103,6 +103,14 @@ index 000000000000..cbda976df1db
|
||||
+ struct drm_dsc_config dsc;
|
||||
+};
|
||||
+
|
||||
+static const struct regulator_bulk_data panel_supplies[] = {
|
||||
+ { .supply = "vdd" },
|
||||
+ { .supply = "vddio" },
|
||||
+ { .supply = "vci" },
|
||||
+ { .supply = "disp" },
|
||||
+ { .supply = "blvdd" },
|
||||
+};
|
||||
+
|
||||
+static inline struct panel_info *to_panel_info(struct drm_panel *panel)
|
||||
+{
|
||||
+ return container_of(panel, struct panel_info, panel);
|
||||
@@ -132,73 +140,61 @@ index 000000000000..cbda976df1db
|
||||
+
|
||||
+static int icna3512_init_sequence(struct panel_info *pinfo)
|
||||
+{
|
||||
+ struct mipi_dsi_device *dsi = pinfo->dsi;
|
||||
+ struct device *dev = &dsi->dev;
|
||||
+ int ret;
|
||||
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = pinfo->dsi };
|
||||
+
|
||||
+ int cur_mode = icna3512_get_current_mode(pinfo);
|
||||
+ int cur_vrefresh = drm_mode_vrefresh(&pinfo->desc->modes[cur_mode]);
|
||||
+
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x9F, 0x01);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9F, 0x01);
|
||||
+ if (cur_vrefresh == 120) {
|
||||
+
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xB3,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xB3,
|
||||
+ 0x00, 0xE0, 0xA0, 0x10, 0xC8, 0x00, 0x02, 0x83,
|
||||
+ 0x00, 0x10, 0x14, 0x00, 0x00, 0xC3, 0x00, 0x10,
|
||||
+ 0x14, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x9C, 0x00,
|
||||
+ 0x00, 0xE0, 0xA0, 0x10, 0xC8, 0x22, 0x18, 0x18,
|
||||
+ 0x18, 0x18, 0x18);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x9F, 0x07);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xB5,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9F, 0x07);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xB5,
|
||||
+ 0x04, 0x0C, 0x08, 0x0C, 0x04, 0x00, 0xC4);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xD9,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xD9,
|
||||
+ 0x88, 0x40, 0x40, 0x88, 0x40, 0x40, 0x00, 0xEB,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xCE,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xCE,
|
||||
+ 0x01, 0x01, 0x01, 0x01, 0x04, 0x09, 0x2C);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x48, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x48, 0x30);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x30);
|
||||
+ }
|
||||
+ else {
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xB3,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xB3,
|
||||
+ 0x00, 0xE0, 0xA0, 0x10, 0xC8, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x9F, 0x07);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xB2,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9F, 0x07);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xB2,
|
||||
+ 0x04, 0x18, 0x08, 0x0C, 0x02, 0x00, 0xC4);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xD3,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xD3,
|
||||
+ 0x88, 0x4A, 0x4A, 0x88, 0x4A, 0x4A, 0x00, 0xEB,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xCB,
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xCB,
|
||||
+ 0x01, 0x01, 0x01, 0x01, 0x04, 0x09, 0x2C);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x48, 0x30);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x48, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x30);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x00);
|
||||
+ }
|
||||
+
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x9C, 0xA5, 0xA5);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xFD, 0x5A, 0x5A);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x48, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x53, 0xE0);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x35, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9C, 0xA5, 0xA5);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xFD, 0x5A, 0x5A);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x00);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x53, 0xE0);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x00);
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "failed to exit sleep mode: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
|
||||
+
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x51, 0x0D, 0xBB);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0x9F, 0x0F);
|
||||
+ mipi_dsi_dcs_write_seq(dsi, 0xCE, 0x22);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x0D, 0xBB);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x9F, 0x0F);
|
||||
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xCE, 0x22);
|
||||
+
|
||||
+ msleep(120);
|
||||
+ mipi_dsi_msleep(&dsi_ctx, 120);
|
||||
+ mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "failed to set display on: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+ return dsi_ctx.accum_err;
|
||||
+}
|
||||
+
|
||||
+static const struct drm_display_mode icna3512_modes[] = {
|
||||
@@ -266,7 +262,7 @@ index 000000000000..cbda976df1db
|
||||
+ struct drm_dsc_picture_parameter_set pps;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = regulator_bulk_enable(ARRAY_SIZE(pinfo->supplies), pinfo->supplies);
|
||||
+ ret = regulator_bulk_enable(ARRAY_SIZE(panel_supplies), pinfo->supplies);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(panel->dev, "failed to enable regulators: %d\n", ret);
|
||||
+ return ret;
|
||||
@@ -276,7 +272,7 @@ index 000000000000..cbda976df1db
|
||||
+
|
||||
+ ret = pinfo->desc->init_sequence(pinfo);
|
||||
+ if (ret < 0) {
|
||||
+ regulator_bulk_disable(ARRAY_SIZE(pinfo->supplies), pinfo->supplies);
|
||||
+ regulator_bulk_disable(ARRAY_SIZE(panel_supplies), pinfo->supplies);
|
||||
+ dev_err(panel->dev, "failed to initialize panel: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
@@ -302,21 +298,14 @@ index 000000000000..cbda976df1db
|
||||
+static int icna3512_disable(struct drm_panel *panel)
|
||||
+{
|
||||
+ struct panel_info *pinfo = to_panel_info(panel);
|
||||
+ int ret;
|
||||
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = pinfo->dsi };
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_set_display_off(pinfo->dsi);
|
||||
+ if (ret < 0)
|
||||
+ dev_err(&pinfo->dsi->dev, "failed to set display off: %d\n", ret);
|
||||
+ mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
|
||||
+ mipi_dsi_msleep(&dsi_ctx, 50);
|
||||
+ mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
|
||||
+ mipi_dsi_msleep(&dsi_ctx, 120);
|
||||
+
|
||||
+ msleep(50);
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_enter_sleep_mode(pinfo->dsi);
|
||||
+ if (ret < 0)
|
||||
+ dev_err(&pinfo->dsi->dev, "failed to enter sleep mode: %d\n", ret);
|
||||
+
|
||||
+ msleep(120);
|
||||
+
|
||||
+ return 0;
|
||||
+ return dsi_ctx.accum_err;
|
||||
+}
|
||||
+
|
||||
+static int icna3512_unprepare(struct drm_panel *panel)
|
||||
@@ -324,7 +313,7 @@ index 000000000000..cbda976df1db
|
||||
+ struct panel_info *pinfo = to_panel_info(panel);
|
||||
+
|
||||
+ gpiod_set_value_cansleep(pinfo->reset_gpio, 1);
|
||||
+ regulator_bulk_disable(ARRAY_SIZE(pinfo->supplies), pinfo->supplies);
|
||||
+ regulator_bulk_disable(ARRAY_SIZE(panel_supplies), pinfo->supplies);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
@@ -451,14 +440,11 @@ index 000000000000..cbda976df1db
|
||||
+ if (!pinfo)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ pinfo->supplies[0].supply = "blvdd";
|
||||
+ pinfo->supplies[1].supply = "iovdd";
|
||||
+ pinfo->supplies[2].supply = "vdd";
|
||||
+
|
||||
+ ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(pinfo->supplies),
|
||||
+ pinfo->supplies);
|
||||
+ if (ret < 0)
|
||||
+ return dev_err_probe(dev, ret, "failed to get regulators\n");
|
||||
+ ret = devm_regulator_bulk_get_const(dev, ARRAY_SIZE(panel_supplies),
|
||||
+ panel_supplies, &pinfo->supplies);
|
||||
+ if (ret < 0){
|
||||
+ return dev_err_probe(dev, ret, "Failed to get regulators\n");
|
||||
+ }
|
||||
+
|
||||
+ pinfo->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
|
||||
+ if (IS_ERR(pinfo->reset_gpio))
|
||||
@@ -480,24 +466,24 @@ index 000000000000..cbda976df1db
|
||||
+
|
||||
+ pinfo->panel.prepare_prev_first = true;
|
||||
+
|
||||
+ pinfo->panel.backlight = icna3512_create_backlight(dsi);
|
||||
+ pinfo->panel.backlight = icna3512_create_backlight(dsi);
|
||||
+ if (IS_ERR(pinfo->panel.backlight))
|
||||
+ return dev_err_probe(dev, PTR_ERR(pinfo->panel.backlight),
|
||||
+ "Failed to create backlight\n");
|
||||
+
|
||||
+ drm_panel_add(&pinfo->panel);
|
||||
+
|
||||
+ pinfo->dsi->lanes = pinfo->desc->lanes;
|
||||
+ pinfo->dsi->format = pinfo->desc->format;
|
||||
+ pinfo->dsi->mode_flags = pinfo->desc->mode_flags;
|
||||
+ pinfo->dsi->dsc = &pinfo->desc->dsc;
|
||||
+ pinfo->dsi->lanes = pinfo->desc->lanes;
|
||||
+ pinfo->dsi->format = pinfo->desc->format;
|
||||
+ pinfo->dsi->mode_flags = pinfo->desc->mode_flags;
|
||||
+ pinfo->dsi->dsc = &pinfo->desc->dsc;
|
||||
+
|
||||
+ ret = mipi_dsi_attach(pinfo->dsi);
|
||||
+ if (ret < 0){
|
||||
+ ret = mipi_dsi_attach(pinfo->dsi);
|
||||
+ if (ret < 0){
|
||||
+ dev_err_probe(dev, ret, "Failed to attach to DSI host\n");
|
||||
+ drm_panel_remove(&pinfo->panel);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
From 39e8716585accb8c07fbaffa078d2e5d47ee3e04 Mon Sep 17 00:00:00 2001
|
||||
From: Johan Hovold <johan+linaro@kernel.org>
|
||||
Date: Fri, 21 Mar 2025 10:52:19 +0100
|
||||
Subject: [PATCH] wifi: ath12k: fix ring-buffer corruption
|
||||
|
||||
Users of the Lenovo ThinkPad X13s have reported that Wi-Fi sometimes
|
||||
breaks and the log fills up with errors like:
|
||||
|
||||
ath11k_pci 0006:01:00.0: HTC Rx: insufficient length, got 1484, expected 1492
|
||||
ath11k_pci 0006:01:00.0: HTC Rx: insufficient length, got 1460, expected 1484
|
||||
|
||||
which based on a quick look at the ath11k driver seemed to indicate some
|
||||
kind of ring-buffer corruption.
|
||||
|
||||
Miaoqing Pan tracked it down to the host seeing the updated destination
|
||||
ring head pointer before the updated descriptor, and the error handling
|
||||
for that in turn leaves the ring buffer in an inconsistent state.
|
||||
|
||||
While this has not yet been observed with ath12k, the ring-buffer
|
||||
implementation is very similar to the ath11k one and it suffers from the
|
||||
same bugs.
|
||||
|
||||
Add the missing memory barrier to make sure that the descriptor is read
|
||||
after the head pointer to address the root cause of the corruption while
|
||||
fixing up the error handling in case there are ever any (ordering) bugs
|
||||
on the device side.
|
||||
|
||||
Note that the READ_ONCE() are only needed to avoid compiler mischief in
|
||||
case the ring-buffer helpers are ever inlined.
|
||||
|
||||
Tested-on: WCN7850 hw2.0 WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
|
||||
|
||||
Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
|
||||
Cc: stable@vger.kernel.org # 6.3
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=218623
|
||||
Link: https://lore.kernel.org/20250310010217.3845141-3-quic_miaoqing@quicinc.com
|
||||
Cc: Miaoqing Pan <quic_miaoqing@quicinc.com>
|
||||
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
|
||||
Signed-off-by: map220v <map220v300@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/ce.c | 11 +++++------
|
||||
drivers/net/wireless/ath/ath12k/hal.c | 4 ++--
|
||||
2 files changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/ath/ath12k/ce.c b/drivers/net/wireless/ath/ath12k/ce.c
|
||||
index be0d669d31fc..740586fe49d1 100644
|
||||
--- a/drivers/net/wireless/ath/ath12k/ce.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/ce.c
|
||||
@@ -343,11 +343,10 @@ static int ath12k_ce_completed_recv_next(struct ath12k_ce_pipe *pipe,
|
||||
goto err;
|
||||
}
|
||||
|
||||
+ /* Make sure descriptor is read after the head pointer. */
|
||||
+ dma_rmb();
|
||||
+
|
||||
*nbytes = ath12k_hal_ce_dst_status_get_length(desc);
|
||||
- if (*nbytes == 0) {
|
||||
- ret = -EIO;
|
||||
- goto err;
|
||||
- }
|
||||
|
||||
*skb = pipe->dest_ring->skb[sw_index];
|
||||
pipe->dest_ring->skb[sw_index] = NULL;
|
||||
@@ -380,8 +379,8 @@ static void ath12k_ce_recv_process_cb(struct ath12k_ce_pipe *pipe)
|
||||
dma_unmap_single(ab->dev, ATH12K_SKB_RXCB(skb)->paddr,
|
||||
max_nbytes, DMA_FROM_DEVICE);
|
||||
|
||||
- if (unlikely(max_nbytes < nbytes)) {
|
||||
- ath12k_warn(ab, "rxed more than expected (nbytes %d, max %d)",
|
||||
+ if (unlikely(max_nbytes < nbytes || nbytes == 0)) {
|
||||
+ ath12k_warn(ab, "unexpected rx length (nbytes %d, max %d)",
|
||||
nbytes, max_nbytes);
|
||||
dev_kfree_skb_any(skb);
|
||||
continue;
|
||||
diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c
|
||||
index cd59ff8e6c7b..91d5126ca149 100644
|
||||
--- a/drivers/net/wireless/ath/ath12k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/hal.c
|
||||
@@ -1962,7 +1962,7 @@ u32 ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc
|
||||
{
|
||||
u32 len;
|
||||
|
||||
- len = le32_get_bits(desc->flags, HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
|
||||
+ len = le32_get_bits(READ_ONCE(desc->flags), HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
|
||||
desc->flags &= ~cpu_to_le32(HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
|
||||
|
||||
return len;
|
||||
@@ -2132,7 +2132,7 @@ void ath12k_hal_srng_access_begin(struct ath12k_base *ab, struct hal_srng *srng)
|
||||
srng->u.src_ring.cached_tp =
|
||||
*(volatile u32 *)srng->u.src_ring.tp_addr;
|
||||
else
|
||||
- srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr;
|
||||
+ srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr);
|
||||
}
|
||||
|
||||
/* Update cached ring head/tail pointers to HW. ath12k_hal_srng_access_begin()
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
From 67794516240e8d25a5878fc56e37b0a95be62a67 Mon Sep 17 00:00:00 2001
|
||||
From: Teguh Sobirin <teguh@sobir.in>
|
||||
Date: Fri, 28 Feb 2025 16:12:24 +0800
|
||||
Subject: [PATCH] drm/panel/panel-chipone-icna3512:
|
||||
devm_regulator_bulk_get_const
|
||||
|
||||
Signed-off-by: Teguh Sobirin <teguh@sobir.in>
|
||||
---
|
||||
.../gpu/drm/panel/panel-chipone-icna3512.c | 29 +++++++++++--------
|
||||
1 file changed, 17 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-chipone-icna3512.c b/drivers/gpu/drm/panel/panel-chipone-icna3512.c
|
||||
index cbda976df1dbca..9fd37f9a17062e 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-chipone-icna3512.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-chipone-icna3512.c
|
||||
@@ -31,7 +31,7 @@ struct panel_info {
|
||||
enum drm_panel_orientation orientation;
|
||||
|
||||
struct gpio_desc *reset_gpio;
|
||||
- struct regulator_bulk_data supplies[3];
|
||||
+ struct regulator_bulk_data *supplies;
|
||||
};
|
||||
|
||||
struct panel_desc {
|
||||
@@ -50,6 +50,14 @@ struct panel_desc {
|
||||
struct drm_dsc_config dsc;
|
||||
};
|
||||
|
||||
+static const struct regulator_bulk_data panel_supplies[] = {
|
||||
+ { .supply = "vdd" },
|
||||
+ { .supply = "vddio" },
|
||||
+ { .supply = "vci" },
|
||||
+ { .supply = "disp" },
|
||||
+ { .supply = "blvdd" },
|
||||
+};
|
||||
+
|
||||
static inline struct panel_info *to_panel_info(struct drm_panel *panel)
|
||||
{
|
||||
return container_of(panel, struct panel_info, panel);
|
||||
@@ -213,7 +221,7 @@ static int icna3512_prepare(struct drm_panel *panel)
|
||||
struct drm_dsc_picture_parameter_set pps;
|
||||
int ret;
|
||||
|
||||
- ret = regulator_bulk_enable(ARRAY_SIZE(pinfo->supplies), pinfo->supplies);
|
||||
+ ret = regulator_bulk_enable(ARRAY_SIZE(panel_supplies), pinfo->supplies);
|
||||
if (ret < 0) {
|
||||
dev_err(panel->dev, "failed to enable regulators: %d\n", ret);
|
||||
return ret;
|
||||
@@ -223,7 +231,7 @@ static int icna3512_prepare(struct drm_panel *panel)
|
||||
|
||||
ret = pinfo->desc->init_sequence(pinfo);
|
||||
if (ret < 0) {
|
||||
- regulator_bulk_disable(ARRAY_SIZE(pinfo->supplies), pinfo->supplies);
|
||||
+ regulator_bulk_disable(ARRAY_SIZE(panel_supplies), pinfo->supplies);
|
||||
dev_err(panel->dev, "failed to initialize panel: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -271,7 +279,7 @@ static int icna3512_unprepare(struct drm_panel *panel)
|
||||
struct panel_info *pinfo = to_panel_info(panel);
|
||||
|
||||
gpiod_set_value_cansleep(pinfo->reset_gpio, 1);
|
||||
- regulator_bulk_disable(ARRAY_SIZE(pinfo->supplies), pinfo->supplies);
|
||||
+ regulator_bulk_disable(ARRAY_SIZE(panel_supplies), pinfo->supplies);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -398,14 +406,11 @@ static int icna3512_probe(struct mipi_dsi_device *dsi)
|
||||
if (!pinfo)
|
||||
return -ENOMEM;
|
||||
|
||||
- pinfo->supplies[0].supply = "blvdd";
|
||||
- pinfo->supplies[1].supply = "iovdd";
|
||||
- pinfo->supplies[2].supply = "vdd";
|
||||
-
|
||||
- ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(pinfo->supplies),
|
||||
- pinfo->supplies);
|
||||
- if (ret < 0)
|
||||
- return dev_err_probe(dev, ret, "failed to get regulators\n");
|
||||
+ ret = devm_regulator_bulk_get_const(dev, ARRAY_SIZE(panel_supplies),
|
||||
+ panel_supplies, &pinfo->supplies);
|
||||
+ if (ret < 0){
|
||||
+ return dev_err_probe(dev, ret, "Failed to get regulators\n");
|
||||
+ }
|
||||
|
||||
pinfo->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(pinfo->reset_gpio))
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,85 +0,0 @@
|
||||
From git@z Thu Jan 1 00:00:00 1970
|
||||
Subject: [PATCH v5 1/2] arm64: dts: qcom: sm8550: add missing cpu-cfg
|
||||
interconnect path in the mdss node
|
||||
From: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
Date: Thu, 27 Feb 2025 10:00:32 +0100
|
||||
Message-Id: <20250227-topic-sm8x50-mdss-interconnect-bindings-fix-v5-1-bf6233c6ebe5@linaro.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
The bindings requires the mdp0-mem and the cpu-cfg interconnect path,
|
||||
add the missing cpu-cfg path to fix the dtbs check error and also to ensure
|
||||
that MDSS has enough bandwidth to let HLOS write config registers.
|
||||
|
||||
Fixes: b8591df49cde ("arm64: dts: qcom: sm8550: correct MDSS interconnects")
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/sm8550.dtsi | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
index d02d80d731b9a8746655af6da236307760a8f662..18bcb4ac6bd8433a0f10f4826f4c6958444c080f 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
@@ -3355,8 +3355,10 @@ mdss: display-subsystem@ae00000 {
|
||||
power-domains = <&dispcc MDSS_GDSC>;
|
||||
|
||||
interconnects = <&mmss_noc MASTER_MDP QCOM_ICC_TAG_ALWAYS
|
||||
- &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
|
||||
- interconnect-names = "mdp0-mem";
|
||||
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>,
|
||||
+ <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ACTIVE_ONLY
|
||||
+ &config_noc SLAVE_DISPLAY_CFG QCOM_ICC_TAG_ACTIVE_ONLY>;
|
||||
+ interconnect-names = "mdp0-mem", "cpu-cfg";
|
||||
|
||||
iommus = <&apps_smmu 0x1c00 0x2>;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
From git@z Thu Jan 1 00:00:00 1970
|
||||
Subject: [PATCH v5 2/2] arm64: dts: qcom: sm8650: add missing cpu-cfg
|
||||
interconnect path in the mdss node
|
||||
From: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
Date: Thu, 27 Feb 2025 10:00:33 +0100
|
||||
Message-Id: <20250227-topic-sm8x50-mdss-interconnect-bindings-fix-v5-2-bf6233c6ebe5@linaro.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
The bindings requires the mdp0-mem and the cpu-cfg interconnect path,
|
||||
add the missing cpu-cfg path to fix the dtbs check error and also to ensure
|
||||
that MDSS has enough bandwidth to let HLOS write config registers.
|
||||
|
||||
Fixes: 9fa33cbca3d2 ("arm64: dts: qcom: sm8650: correct MDSS interconnects")
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/sm8650.dtsi | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8650.dtsi b/arch/arm64/boot/dts/qcom/sm8650.dtsi
|
||||
index de960bcaf3ccf6e2be47bf63a02effbfb75241bf..719ad437756a499cee4170abccc83f2047f0f747 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8650.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8650.dtsi
|
||||
@@ -4930,8 +4930,11 @@ mdss: display-subsystem@ae00000 {
|
||||
resets = <&dispcc DISP_CC_MDSS_CORE_BCR>;
|
||||
|
||||
interconnects = <&mmss_noc MASTER_MDP QCOM_ICC_TAG_ALWAYS
|
||||
- &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
|
||||
- interconnect-names = "mdp0-mem";
|
||||
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>,
|
||||
+ <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ACTIVE_ONLY
|
||||
+ &config_noc SLAVE_DISPLAY_CFG QCOM_ICC_TAG_ACTIVE_ONLY>;
|
||||
+ interconnect-names = "mdp0-mem",
|
||||
+ "cpu-cfg";
|
||||
|
||||
power-domains = <&dispcc MDSS_GDSC>;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -1,172 +0,0 @@
|
||||
From git@z Thu Jan 1 00:00:00 1970
|
||||
Subject: [PATCH v2] arm64: dts: qcom: sm8550: add iris DT node
|
||||
From: Dikshita Agarwal <quic_dikshita@quicinc.com>
|
||||
Date: Fri, 18 Apr 2025 14:45:22 +0200
|
||||
Message-Id: <20250418-topic-sm8x50-upstream-iris-8550-dt-v2-1-9218636acbdd@linaro.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
Add DT entries for the sm8550 iris decoder.
|
||||
|
||||
Since the firmware is required to be signed, only enable
|
||||
on Qualcomm development boards where the firmware is
|
||||
publicly distributed.
|
||||
|
||||
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
|
||||
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
---
|
||||
Changes in v2:
|
||||
- Only enable on qcom dev boards
|
||||
- Link to v1: https://lore.kernel.org/r/20250407-topic-sm8x50-upstream-iris-8550-dt-v1-1-1f7ab3083f49@linaro.org
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/sm8550-hdk.dts | 5 +++
|
||||
arch/arm64/boot/dts/qcom/sm8550-mtp.dts | 5 +++
|
||||
arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 5 +++
|
||||
arch/arm64/boot/dts/qcom/sm8550.dtsi | 76 +++++++++++++++++++++++++++++++++
|
||||
4 files changed, 91 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8550-hdk.dts b/arch/arm64/boot/dts/qcom/sm8550-hdk.dts
|
||||
index 29bc1ddfc7b25f203c9f3b530610e45c44ae4fb2..866f4235ddb58a5e0776e34b9bb0277ef73236e5 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8550-hdk.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8550-hdk.dts
|
||||
@@ -945,6 +945,11 @@ &ipa {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&iris {
|
||||
+ firmware-name = "qcom/vpu/vpu30_p4.mbn";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&gpi_dma1 {
|
||||
status = "okay";
|
||||
};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8550-mtp.dts b/arch/arm64/boot/dts/qcom/sm8550-mtp.dts
|
||||
index 5648ab60ba4c4bfaf5baa289969898277ee57cef..2362937729e8c5340d565b6199f6a6f9e29d2120 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8550-mtp.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8550-mtp.dts
|
||||
@@ -672,6 +672,11 @@ fsa4480_sbu_mux: endpoint {
|
||||
};
|
||||
};
|
||||
|
||||
+&iris {
|
||||
+ firmware-name = "qcom/vpu/vpu30_p4.mbn";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&lpass_tlmm {
|
||||
spkr_1_sd_n_active: spkr-1-sd-n-active-state {
|
||||
pins = "gpio17";
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8550-qrd.dts b/arch/arm64/boot/dts/qcom/sm8550-qrd.dts
|
||||
index 3a6cb279130489168f8d20a6e27808647debdb41..4f713127310be54361e29ddb97e7f209493109be 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8550-qrd.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8550-qrd.dts
|
||||
@@ -779,6 +779,11 @@ &ipa {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&iris {
|
||||
+ firmware-name = "qcom/vpu/vpu30_p4.mbn";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&gpi_dma1 {
|
||||
status = "okay";
|
||||
};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
index f78d5292c5dd5ec88c8deb0ca6e5078511ac52b7..dbe01392b436d03ef58733a59f60c3021bac3e6b 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
@@ -3220,6 +3220,82 @@ opp-202000000 {
|
||||
};
|
||||
};
|
||||
|
||||
+ iris: video-codec@aa00000 {
|
||||
+ compatible = "qcom,sm8550-iris";
|
||||
+
|
||||
+ reg = <0 0x0aa00000 0 0xf0000>;
|
||||
+ interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ power-domains = <&videocc VIDEO_CC_MVS0C_GDSC>,
|
||||
+ <&videocc VIDEO_CC_MVS0_GDSC>,
|
||||
+ <&rpmhpd RPMHPD_MXC>,
|
||||
+ <&rpmhpd RPMHPD_MMCX>;
|
||||
+ power-domain-names = "venus", "vcodec0", "mxc", "mmcx";
|
||||
+ operating-points-v2 = <&iris_opp_table>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_VIDEO_AXI0_CLK>,
|
||||
+ <&videocc VIDEO_CC_MVS0C_CLK>,
|
||||
+ <&videocc VIDEO_CC_MVS0_CLK>;
|
||||
+ clock-names = "iface", "core", "vcodec0_core";
|
||||
+
|
||||
+ interconnects = <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ACTIVE_ONLY
|
||||
+ &config_noc SLAVE_VENUS_CFG QCOM_ICC_TAG_ACTIVE_ONLY>,
|
||||
+ <&mmss_noc MASTER_VIDEO QCOM_ICC_TAG_ALWAYS
|
||||
+ &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
|
||||
+ interconnect-names = "cpu-cfg", "video-mem";
|
||||
+
|
||||
+ /* FW load region */
|
||||
+ memory-region = <&video_mem>;
|
||||
+
|
||||
+ resets = <&gcc GCC_VIDEO_AXI0_CLK_ARES>;
|
||||
+ reset-names = "bus";
|
||||
+
|
||||
+ iommus = <&apps_smmu 0x1940 0x0000>,
|
||||
+ <&apps_smmu 0x1947 0x0000>;
|
||||
+ dma-coherent;
|
||||
+
|
||||
+ /*
|
||||
+ * IRIS firmware is signed by vendors, only
|
||||
+ * enable in boards where the proper signed firmware
|
||||
+ * is available.
|
||||
+ */
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ iris_opp_table: opp-table {
|
||||
+ compatible = "operating-points-v2";
|
||||
+
|
||||
+ opp-240000000 {
|
||||
+ opp-hz = /bits/ 64 <240000000>;
|
||||
+ required-opps = <&rpmhpd_opp_svs>,
|
||||
+ <&rpmhpd_opp_low_svs>;
|
||||
+ };
|
||||
+
|
||||
+ opp-338000000 {
|
||||
+ opp-hz = /bits/ 64 <338000000>;
|
||||
+ required-opps = <&rpmhpd_opp_svs>,
|
||||
+ <&rpmhpd_opp_svs>;
|
||||
+ };
|
||||
+
|
||||
+ opp-366000000 {
|
||||
+ opp-hz = /bits/ 64 <366000000>;
|
||||
+ required-opps = <&rpmhpd_opp_svs_l1>,
|
||||
+ <&rpmhpd_opp_svs_l1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-444000000 {
|
||||
+ opp-hz = /bits/ 64 <444000000>;
|
||||
+ required-opps = <&rpmhpd_opp_turbo>,
|
||||
+ <&rpmhpd_opp_turbo>;
|
||||
+ };
|
||||
+
|
||||
+ opp-533333334 {
|
||||
+ opp-hz = /bits/ 64 <533333334>;
|
||||
+ required-opps = <&rpmhpd_opp_turbo_l1>,
|
||||
+ <&rpmhpd_opp_turbo_l1>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
videocc: clock-controller@aaf0000 {
|
||||
compatible = "qcom,sm8550-videocc";
|
||||
reg = <0 0x0aaf0000 0 0x10000>;
|
||||
|
||||
---
|
||||
base-commit: 2bdde620f7f2bff2ff1cb7dc166859eaa0c78a7c
|
||||
change-id: 20250407-topic-sm8x50-upstream-iris-8550-dt-2846b493e652
|
||||
|
||||
Best regards,
|
||||
--
|
||||
Neil Armstrong <neil.armstrong@linaro.org>
|
||||
|
||||
@@ -1,305 +0,0 @@
|
||||
From patchwork Mon Apr 21 17:21:43 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2] drm/msm/adreno: Drop fictional address_space_size
|
||||
From: Rob Clark <robdclark@gmail.com>
|
||||
X-Patchwork-Id: 649467
|
||||
Message-Id: <20250421172144.168273-1-robdclark@gmail.com>
|
||||
To: dri-devel@lists.freedesktop.org
|
||||
Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org,
|
||||
Rob Clark <robdclark@chromium.org>,
|
||||
Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>,
|
||||
Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>,
|
||||
Konrad Dybcio <konradybcio@kernel.org>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <lumag@kernel.org>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>,
|
||||
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
|
||||
linux-kernel@vger.kernel.org (open list)
|
||||
Date: Mon, 21 Apr 2025 10:21:43 -0700
|
||||
|
||||
From: Rob Clark <robdclark@chromium.org>
|
||||
|
||||
Really the only purpose of this was to limit the address space size to
|
||||
4GB to avoid 32b rollover problems in 64b pointer math in older sqe fw.
|
||||
So replace the address_space_size with a quirk limiting the address
|
||||
space to 4GB. In all other cases, use the SMMU input address size (IAS)
|
||||
to determine the address space size.
|
||||
|
||||
v2: Properly account for vm_start
|
||||
|
||||
Signed-off-by: Rob Clark <robdclark@chromium.org>
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
|
||||
---
|
||||
drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 33 +++++++++++------------
|
||||
drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 2 +-
|
||||
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 19 ++++++++++---
|
||||
drivers/gpu/drm/msm/adreno/adreno_gpu.h | 4 ++-
|
||||
4 files changed, 36 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
|
||||
index 53e2ff4406d8..f85b7e89bafb 100644
|
||||
--- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
|
||||
+++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c
|
||||
@@ -681,6 +681,7 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_SQE] = "a630_sqe.fw",
|
||||
},
|
||||
.gmem = (SZ_128K + SZ_4K),
|
||||
+ .quirks = ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a610_zap.mdt",
|
||||
@@ -713,6 +714,7 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a630_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_512K,
|
||||
+ .quirks = ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a615_zap.mdt",
|
||||
@@ -743,7 +745,8 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
},
|
||||
.gmem = SZ_512K,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
- .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT,
|
||||
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
|
||||
+ ADRENO_QUIRK_4GB_VA,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a615_zap.mbn",
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
@@ -769,7 +772,8 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
},
|
||||
.gmem = SZ_512K,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
- .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT,
|
||||
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
|
||||
+ ADRENO_QUIRK_4GB_VA,
|
||||
.init = a6xx_gpu_init,
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
.protect = &a630_protect,
|
||||
@@ -791,6 +795,7 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a619_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_512K,
|
||||
+ .quirks = ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a615_zap.mdt",
|
||||
@@ -815,6 +820,7 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a619_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_512K,
|
||||
+ .quirks = ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a615_zap.mdt",
|
||||
@@ -838,8 +844,9 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a619_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_512K,
|
||||
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
|
||||
+ ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
- .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a615_zap.mdt",
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
@@ -874,7 +881,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
.gmu_cgc_mode = 0x00020200,
|
||||
.prim_fifo_threshold = 0x00010000,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
.speedbins = ADRENO_SPEEDBINS(
|
||||
{ 0, 0 },
|
||||
{ 137, 1 },
|
||||
@@ -907,7 +913,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
{ /* sentinel */ },
|
||||
},
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
}, {
|
||||
.chip_ids = ADRENO_CHIP_IDS(
|
||||
0x06030001,
|
||||
@@ -920,8 +925,9 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a630_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_1M,
|
||||
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
|
||||
+ ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
- .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a630_zap.mdt",
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
@@ -939,8 +945,9 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a640_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_1M,
|
||||
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
|
||||
+ ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
- .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a640_zap.mdt",
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
@@ -973,7 +980,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
.gmu_cgc_mode = 0x00020202,
|
||||
.prim_fifo_threshold = 0x00300200,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
.speedbins = ADRENO_SPEEDBINS(
|
||||
{ 0, 0 },
|
||||
{ 1, 1 },
|
||||
@@ -1000,7 +1006,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
.gmu_cgc_mode = 0x00020000,
|
||||
.prim_fifo_threshold = 0x00300200,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
}, {
|
||||
.chip_ids = ADRENO_CHIP_IDS(0x06060300),
|
||||
.family = ADRENO_6XX_GEN4,
|
||||
@@ -1019,7 +1024,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
.gmu_cgc_mode = 0x00020200,
|
||||
.prim_fifo_threshold = 0x00300200,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
}, {
|
||||
.chip_ids = ADRENO_CHIP_IDS(0x06030500),
|
||||
.family = ADRENO_6XX_GEN4,
|
||||
@@ -1039,7 +1043,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
.gmu_cgc_mode = 0x00020202,
|
||||
.prim_fifo_threshold = 0x00200200,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
.speedbins = ADRENO_SPEEDBINS(
|
||||
{ 0, 0 },
|
||||
{ 117, 0 },
|
||||
@@ -1056,8 +1059,9 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
[ADRENO_FW_GMU] = "a640_gmu.bin",
|
||||
},
|
||||
.gmem = SZ_2M,
|
||||
+ .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
|
||||
+ ADRENO_QUIRK_4GB_VA,
|
||||
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
|
||||
- .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT,
|
||||
.init = a6xx_gpu_init,
|
||||
.zapfw = "a640_zap.mdt",
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
@@ -1085,7 +1089,6 @@ static const struct adreno_info a6xx_gpus[] = {
|
||||
.gmu_cgc_mode = 0x00020200,
|
||||
.prim_fifo_threshold = 0x00800200,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
}
|
||||
};
|
||||
DECLARE_ADRENO_GPULIST(a6xx);
|
||||
@@ -1395,7 +1398,6 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.pwrup_reglist = &a7xx_pwrup_reglist,
|
||||
.gmu_cgc_mode = 0x00020000,
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
.preempt_record_size = 2860 * SZ_1K,
|
||||
}, {
|
||||
.chip_ids = ADRENO_CHIP_IDS(0x43050a01), /* "C510v2" */
|
||||
@@ -1429,7 +1431,6 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
{ /* sentinel */ },
|
||||
},
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
.preempt_record_size = 4192 * SZ_1K,
|
||||
}, {
|
||||
.chip_ids = ADRENO_CHIP_IDS(0x43050c01), /* "C512v2" */
|
||||
@@ -1451,7 +1452,6 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.gmu_chipid = 0x7050001,
|
||||
.gmu_cgc_mode = 0x00020202,
|
||||
},
|
||||
- .address_space_size = SZ_256G,
|
||||
.preempt_record_size = 4192 * SZ_1K,
|
||||
}, {
|
||||
.chip_ids = ADRENO_CHIP_IDS(0x43051401), /* "C520v2" */
|
||||
@@ -1484,7 +1484,6 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
{ /* sentinel */ },
|
||||
},
|
||||
},
|
||||
- .address_space_size = SZ_16G,
|
||||
.preempt_record_size = 3572 * SZ_1K,
|
||||
}
|
||||
};
|
||||
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
|
||||
index eeb8b5e582d5..129c33f0b027 100644
|
||||
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
|
||||
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
|
||||
@@ -2272,7 +2272,7 @@ a6xx_create_private_address_space(struct msm_gpu *gpu)
|
||||
return ERR_CAST(mmu);
|
||||
|
||||
return msm_gem_address_space_create(mmu,
|
||||
- "gpu", 0x100000000ULL,
|
||||
+ "gpu", ADRENO_VM_START,
|
||||
adreno_private_address_space_size(gpu));
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
|
||||
index 59cfed5acace..e80db01a01c0 100644
|
||||
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
|
||||
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
|
||||
@@ -236,14 +236,27 @@ adreno_iommu_create_address_space(struct msm_gpu *gpu,
|
||||
u64 adreno_private_address_space_size(struct msm_gpu *gpu)
|
||||
{
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
+ struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(&gpu->pdev->dev);
|
||||
+ const struct io_pgtable_cfg *ttbr1_cfg;
|
||||
|
||||
if (address_space_size)
|
||||
return address_space_size;
|
||||
|
||||
- if (adreno_gpu->info->address_space_size)
|
||||
- return adreno_gpu->info->address_space_size;
|
||||
+ if (adreno_gpu->info->quirks & ADRENO_QUIRK_4GB_VA)
|
||||
+ return SZ_4G;
|
||||
|
||||
- return SZ_4G;
|
||||
+ if (!adreno_smmu || !adreno_smmu->get_ttbr1_cfg)
|
||||
+ return SZ_4G;
|
||||
+
|
||||
+ ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie);
|
||||
+
|
||||
+ /*
|
||||
+ * Userspace VM is actually using TTBR0, but both are the same size,
|
||||
+ * with b48 (sign bit) selecting which TTBRn to use. So if IAS is
|
||||
+ * 48, the total (kernel+user) address space size is effectively
|
||||
+ * 49 bits. But what userspace is control of is the lower 48.
|
||||
+ */
|
||||
+ return BIT(ttbr1_cfg->ias) - ADRENO_VM_START;
|
||||
}
|
||||
|
||||
void adreno_check_and_reenable_stall(struct adreno_gpu *adreno_gpu)
|
||||
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
|
||||
index a1e2d9e87b75..2366a57b280f 100644
|
||||
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
|
||||
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
|
||||
@@ -57,6 +57,7 @@ enum adreno_family {
|
||||
#define ADRENO_QUIRK_HAS_HW_APRIV BIT(3)
|
||||
#define ADRENO_QUIRK_HAS_CACHED_COHERENT BIT(4)
|
||||
#define ADRENO_QUIRK_PREEMPTION BIT(5)
|
||||
+#define ADRENO_QUIRK_4GB_VA BIT(6)
|
||||
|
||||
/* Helper for formating the chip_id in the way that userspace tools like
|
||||
* crashdec expect.
|
||||
@@ -104,7 +105,6 @@ struct adreno_info {
|
||||
union {
|
||||
const struct a6xx_info *a6xx;
|
||||
};
|
||||
- u64 address_space_size;
|
||||
/**
|
||||
* @speedbins: Optional table of fuse to speedbin mappings
|
||||
*
|
||||
@@ -600,6 +600,8 @@ static inline int adreno_is_a7xx(struct adreno_gpu *gpu)
|
||||
adreno_is_a740_family(gpu);
|
||||
}
|
||||
|
||||
+/* Put vm_start above 32b to catch issues with not setting xyz_BASE_HI */
|
||||
+#define ADRENO_VM_START 0x100000000ULL
|
||||
u64 adreno_private_address_space_size(struct msm_gpu *gpu);
|
||||
int adreno_get_param(struct msm_gpu *gpu, struct msm_file_private *ctx,
|
||||
uint32_t param, uint64_t *value, uint32_t *len);
|
||||
@@ -1,113 +0,0 @@
|
||||
From patchwork Thu Apr 24 13:30:17 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2] drm/msm: Be more robust when HFI response times out
|
||||
From: Connor Abbott <cwabbott0@gmail.com>
|
||||
X-Patchwork-Id: 650013
|
||||
Message-Id: <20250424-msm-hfi-resp-fix-v2-1-3ce6adc86ebb@gmail.com>
|
||||
To: Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>,
|
||||
Konrad Dybcio <konradybcio@kernel.org>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>
|
||||
Cc: freedreno@lists.freedesktop.org, Connor Abbott <cwabbott0@gmail.com>
|
||||
Date: Thu, 24 Apr 2025 09:30:17 -0400
|
||||
|
||||
If the GMU takes too long to respond to an HFI message, we may return
|
||||
early. If the GMU does eventually respond, and then we send a second
|
||||
message, we will see the response for the first, throw another error,
|
||||
and keep going. But we don't currently wait for the interrupt from the
|
||||
GMU again, so if the second response isn't there immediately we may
|
||||
prematurely return. This can cause a continuous cycle of missed HFI
|
||||
messages, and for reasons I don't quite understand the GMU does not shut
|
||||
down properly when this happens.
|
||||
|
||||
Fix this by waiting for the GMU interrupt when we see an empty queue. If
|
||||
the GMU never responds then the queue really is empty and we quit. We
|
||||
can't wait for the interrupt when we see a wrong response seqnum because
|
||||
the GMU might have already queued both responses by the time we clear
|
||||
the interrupt the first time so we do need to check the queue before
|
||||
waiting on the interrupt again.
|
||||
|
||||
Signed-off-by: Connor Abbott <cwabbott0@gmail.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
---
|
||||
Changes in v2:
|
||||
- Add back error print about the queue being empty if we timeout while
|
||||
waiting for a message when the queue is empty.
|
||||
- Link to v1: https://lore.kernel.org/r/20250422-msm-hfi-resp-fix-v1-1-b0ba02b93b91@gmail.com
|
||||
---
|
||||
drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 35 ++++++++++++++++++++++++++---------
|
||||
1 file changed, 26 insertions(+), 9 deletions(-)
|
||||
|
||||
|
||||
---
|
||||
base-commit: 866e43b945bf98f8e807dfa45eca92f931f3a032
|
||||
change-id: 20250422-msm-hfi-resp-fix-58ab3a19554f
|
||||
|
||||
Best regards,
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c
|
||||
index 0989aee3dd2cf9bc3405c3b25a595c22e6f06387..1bc40d667281a22a34e4f510b2a1333f9c5675c6 100644
|
||||
--- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c
|
||||
+++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c
|
||||
@@ -100,12 +100,10 @@ static int a6xx_hfi_queue_write(struct a6xx_gmu *gmu,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int a6xx_hfi_wait_for_ack(struct a6xx_gmu *gmu, u32 id, u32 seqnum,
|
||||
- u32 *payload, u32 payload_size)
|
||||
+static int a6xx_hfi_wait_for_msg_interrupt(struct a6xx_gmu *gmu, u32 id, u32 seqnum)
|
||||
{
|
||||
- struct a6xx_hfi_queue *queue = &gmu->queues[HFI_RESPONSE_QUEUE];
|
||||
- u32 val;
|
||||
int ret;
|
||||
+ u32 val;
|
||||
|
||||
/* Wait for a response */
|
||||
ret = gmu_poll_timeout(gmu, REG_A6XX_GMU_GMU2HOST_INTR_INFO, val,
|
||||
@@ -122,6 +120,19 @@ static int a6xx_hfi_wait_for_ack(struct a6xx_gmu *gmu, u32 id, u32 seqnum,
|
||||
gmu_write(gmu, REG_A6XX_GMU_GMU2HOST_INTR_CLR,
|
||||
A6XX_GMU_GMU2HOST_INTR_INFO_MSGQ);
|
||||
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int a6xx_hfi_wait_for_ack(struct a6xx_gmu *gmu, u32 id, u32 seqnum,
|
||||
+ u32 *payload, u32 payload_size)
|
||||
+{
|
||||
+ struct a6xx_hfi_queue *queue = &gmu->queues[HFI_RESPONSE_QUEUE];
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = a6xx_hfi_wait_for_msg_interrupt(gmu, id, seqnum);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
for (;;) {
|
||||
struct a6xx_hfi_msg_response resp;
|
||||
|
||||
@@ -129,12 +140,18 @@ static int a6xx_hfi_wait_for_ack(struct a6xx_gmu *gmu, u32 id, u32 seqnum,
|
||||
ret = a6xx_hfi_queue_read(gmu, queue, (u32 *) &resp,
|
||||
sizeof(resp) >> 2);
|
||||
|
||||
- /* If the queue is empty our response never made it */
|
||||
+ /* If the queue is empty, there may have been previous missed
|
||||
+ * responses that preceded the response to our packet. Wait
|
||||
+ * further before we give up.
|
||||
+ */
|
||||
if (!ret) {
|
||||
- DRM_DEV_ERROR(gmu->dev,
|
||||
- "The HFI response queue is unexpectedly empty\n");
|
||||
-
|
||||
- return -ENOENT;
|
||||
+ ret = a6xx_hfi_wait_for_msg_interrupt(gmu, id, seqnum);
|
||||
+ if (ret) {
|
||||
+ DRM_DEV_ERROR(gmu->dev,
|
||||
+ "The HFI response queue is unexpectedly empty\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ continue;
|
||||
}
|
||||
|
||||
if (HFI_HEADER_ID(resp.header) == HFI_F2H_MSG_ERROR) {
|
||||
@@ -1,93 +0,0 @@
|
||||
From patchwork Tue Apr 29 08:33:56 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: drm/msm/gpu: Fix crash when throttling GPU immediately during boot
|
||||
From: Stephan Gerhold <stephan.gerhold@linaro.org>
|
||||
X-Patchwork-Id: 650772
|
||||
Message-Id:
|
||||
<20250429-drm-msm-gpu-hot-devfreq-boot-v1-1-8aa9c5f266b4@linaro.org>
|
||||
To: Rob Clark <robdclark@gmail.com>
|
||||
Cc: Sean Paul <sean@poorly.run>, Konrad Dybcio <konradybcio@kernel.org>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <lumag@kernel.org>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>,
|
||||
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
|
||||
Douglas Anderson <dianders@chromium.org>, linux-arm-msm@vger.kernel.org,
|
||||
dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
|
||||
linux-kernel@vger.kernel.org, Johan Hovold <johan@kernel.org>
|
||||
Date: Tue, 29 Apr 2025 10:33:56 +0200
|
||||
|
||||
There is a small chance that the GPU is already hot during boot. In that
|
||||
case, the call to of_devfreq_cooling_register() will immediately try to
|
||||
apply devfreq cooling, as seen in the following crash:
|
||||
|
||||
Unable to handle kernel paging request at virtual address 0000000000014110
|
||||
pc : a6xx_gpu_busy+0x1c/0x58 [msm]
|
||||
lr : msm_devfreq_get_dev_status+0xbc/0x140 [msm]
|
||||
Call trace:
|
||||
a6xx_gpu_busy+0x1c/0x58 [msm] (P)
|
||||
devfreq_simple_ondemand_func+0x3c/0x150
|
||||
devfreq_update_target+0x44/0xd8
|
||||
qos_max_notifier_call+0x30/0x84
|
||||
blocking_notifier_call_chain+0x6c/0xa0
|
||||
pm_qos_update_target+0xd0/0x110
|
||||
freq_qos_apply+0x3c/0x74
|
||||
apply_constraint+0x88/0x148
|
||||
__dev_pm_qos_update_request+0x7c/0xcc
|
||||
dev_pm_qos_update_request+0x38/0x5c
|
||||
devfreq_cooling_set_cur_state+0x98/0xf0
|
||||
__thermal_cdev_update+0x64/0xb4
|
||||
thermal_cdev_update+0x4c/0x58
|
||||
step_wise_manage+0x1f0/0x318
|
||||
__thermal_zone_device_update+0x278/0x424
|
||||
__thermal_cooling_device_register+0x2bc/0x308
|
||||
thermal_of_cooling_device_register+0x10/0x1c
|
||||
of_devfreq_cooling_register_power+0x240/0x2bc
|
||||
of_devfreq_cooling_register+0x14/0x20
|
||||
msm_devfreq_init+0xc4/0x1a0 [msm]
|
||||
msm_gpu_init+0x304/0x574 [msm]
|
||||
adreno_gpu_init+0x1c4/0x2e0 [msm]
|
||||
a6xx_gpu_init+0x5c8/0x9c8 [msm]
|
||||
adreno_bind+0x2a8/0x33c [msm]
|
||||
...
|
||||
|
||||
At this point we haven't initialized the GMU at all yet, so we cannot read
|
||||
the GMU registers inside a6xx_gpu_busy(). A similar issue was fixed before
|
||||
in commit 6694482a70e9 ("drm/msm: Avoid unclocked GMU register access in
|
||||
6xx gpu_busy"): msm_devfreq_init() does call devfreq_suspend_device(), but
|
||||
unlike msm_devfreq_suspend(), it doesn't set the df->suspended flag
|
||||
accordingly. This means the df->suspended flag does not match the actual
|
||||
devfreq state after initialization and msm_devfreq_get_dev_status() will
|
||||
end up accessing GMU registers, causing the crash.
|
||||
|
||||
Fix this by setting df->suspended correctly during initialization.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 6694482a70e9 ("drm/msm: Avoid unclocked GMU register access in 6xx gpu_busy")
|
||||
Signed-off-by: Stephan Gerhold <stephan.gerhold@linaro.org>
|
||||
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
---
|
||||
drivers/gpu/drm/msm/msm_gpu_devfreq.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
|
||||
---
|
||||
base-commit: 33035b665157558254b3c21c3f049fd728e72368
|
||||
change-id: 20250428-drm-msm-gpu-hot-devfreq-boot-36184dbc7075
|
||||
|
||||
Best regards,
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c
|
||||
index 6970b0f7f457c8535ecfeaa705db871594ae5fc4..2e1d5c3432728cde15d91f69da22bb915588fe86 100644
|
||||
--- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c
|
||||
+++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c
|
||||
@@ -156,6 +156,7 @@ void msm_devfreq_init(struct msm_gpu *gpu)
|
||||
priv->gpu_devfreq_config.downdifferential = 10;
|
||||
|
||||
mutex_init(&df->lock);
|
||||
+ df->suspended = true;
|
||||
|
||||
ret = dev_pm_qos_add_request(&gpu->pdev->dev, &df->boost_freq,
|
||||
DEV_PM_QOS_MIN_FREQUENCY, 0);
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,24 @@
|
||||
From 7fc99b626100ab4a156832d34b1cb03113301ef3 Mon Sep 17 00:00:00 2001
|
||||
From 337f73a668d262757f0c39fa73e78329f46c7361 Mon Sep 17 00:00:00 2001
|
||||
From: Philippe Simons <simons.philippe@gmail.com>
|
||||
Date: Wed, 18 Jun 2025 23:26:47 +0200
|
||||
Date: Sat, 2 Aug 2025 23:11:08 +0200
|
||||
Subject: [PATCH] dts: qcom: sm8550: add opp-acd-level
|
||||
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/sm8550.dtsi | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
arch/arm64/boot/dts/qcom/sm8550.dtsi | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
index b418c9f62df7..4e61a233aac0 100644
|
||||
index 71a7e3b57ece..70f11d23d42b 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi
|
||||
@@ -2904,48 +2904,56 @@ opp-680000000 {
|
||||
@@ -2462,54 +2462,62 @@ zap-shader {
|
||||
|
||||
/* Speedbin needs more work on A740+, keep only lower freqs */
|
||||
gpu_opp_table: opp-table {
|
||||
- compatible = "operating-points-v2";
|
||||
+ compatible = "operating-points-v2-adreno", "operating-points-v2";
|
||||
|
||||
opp-680000000 {
|
||||
opp-hz = /bits/ 64 <680000000>;
|
||||
opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
|
||||
opp-peak-kBps = <16500000>;
|
||||
@@ -69,5 +76,5 @@ index b418c9f62df7..4e61a233aac0 100644
|
||||
};
|
||||
};
|
||||
--
|
||||
2.49.0
|
||||
2.50.1
|
||||
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
From patchwork Tue May 20 22:28:05 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [1/2] drm/msm: Fix CP_RESET_CONTEXT_STATE bitfield names
|
||||
From: Connor Abbott <cwabbott0@gmail.com>
|
||||
X-Patchwork-Id: 654922
|
||||
Message-Id: <20250520-msm-reset-context-state-v1-1-b738c8b7d0b8@gmail.com>
|
||||
To: Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>,
|
||||
Konrad Dybcio <konradybcio@kernel.org>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <lumag@kernel.org>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>
|
||||
Cc: dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
|
||||
Connor Abbott <cwabbott0@gmail.com>
|
||||
Date: Tue, 20 May 2025 18:28:05 -0400
|
||||
|
||||
Based on kgsl.
|
||||
|
||||
Fixes: af66706accdf ("drm/msm/a6xx: Add skeleton A7xx support")
|
||||
Signed-off-by: Connor Abbott <cwabbott0@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml b/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml
|
||||
index 55a35182858ccac3292849faaf12727257e053c7..2134731a86ba819215476d89c1e054328f901dd1 100644
|
||||
--- a/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml
|
||||
+++ b/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml
|
||||
@@ -2255,7 +2255,8 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords)
|
||||
<reg32 offset="0" name="0">
|
||||
<bitfield name="CLEAR_ON_CHIP_TS" pos="0" type="boolean"/>
|
||||
<bitfield name="CLEAR_RESOURCE_TABLE" pos="1" type="boolean"/>
|
||||
- <bitfield name="CLEAR_GLOBAL_LOCAL_TS" pos="2" type="boolean"/>
|
||||
+ <bitfield name="CLEAR_BV_BR_COUNTER" pos="2" type="boolean"/>
|
||||
+ <bitfield name="RESET_GLOBAL_LOCAL_TS" pos="3" type="boolean"/>
|
||||
</reg32>
|
||||
</domain>
|
||||
|
||||
|
||||
From patchwork Tue May 20 22:28:06 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [2/2] drm/msm/a7xx: Call CP_RESET_CONTEXT_STATE
|
||||
From: Connor Abbott <cwabbott0@gmail.com>
|
||||
X-Patchwork-Id: 654924
|
||||
Message-Id: <20250520-msm-reset-context-state-v1-2-b738c8b7d0b8@gmail.com>
|
||||
To: Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>,
|
||||
Konrad Dybcio <konradybcio@kernel.org>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <lumag@kernel.org>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>
|
||||
Cc: dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org,
|
||||
Connor Abbott <cwabbott0@gmail.com>
|
||||
Date: Tue, 20 May 2025 18:28:06 -0400
|
||||
|
||||
Calling this packet is necessary when we switch contexts because there
|
||||
are various pieces of state used by userspace to synchronize between BR
|
||||
and BV that are persistent across submits and we need to make sure that
|
||||
they are in a "safe" state when switching contexts. Otherwise a
|
||||
userspace submission in one context could cause another context to
|
||||
function incorrectly and hang, effectively a denial of service (although
|
||||
without leaking data). This was missed during initial a7xx bringup.
|
||||
|
||||
Fixes: af66706accdf ("drm/msm/a6xx: Add skeleton A7xx support")
|
||||
Signed-off-by: Connor Abbott <cwabbott0@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
|
||||
index 06465bc2d0b4b128cddfcfcaf1fe4252632b6777..f776e9ce43a7cdbb4ef769606ec851909b0c4cdd 100644
|
||||
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
|
||||
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
|
||||
@@ -130,6 +130,20 @@ static void a6xx_set_pagetable(struct a6xx_gpu *a6xx_gpu,
|
||||
OUT_RING(ring, lower_32_bits(rbmemptr(ring, fence)));
|
||||
OUT_RING(ring, upper_32_bits(rbmemptr(ring, fence)));
|
||||
OUT_RING(ring, submit->seqno - 1);
|
||||
+
|
||||
+ OUT_PKT7(ring, CP_THREAD_CONTROL, 1);
|
||||
+ OUT_RING(ring, CP_SET_THREAD_BOTH);
|
||||
+
|
||||
+ /* Reset state used to synchronize BR and BV */
|
||||
+ OUT_PKT7(ring, CP_RESET_CONTEXT_STATE, 1);
|
||||
+ OUT_RING(ring,
|
||||
+ CP_RESET_CONTEXT_STATE_0_CLEAR_ON_CHIP_TS |
|
||||
+ CP_RESET_CONTEXT_STATE_0_CLEAR_RESOURCE_TABLE |
|
||||
+ CP_RESET_CONTEXT_STATE_0_CLEAR_BV_BR_COUNTER |
|
||||
+ CP_RESET_CONTEXT_STATE_0_RESET_GLOBAL_LOCAL_TS);
|
||||
+
|
||||
+ OUT_PKT7(ring, CP_THREAD_CONTROL, 1);
|
||||
+ OUT_RING(ring, CP_SET_THREAD_BR);
|
||||
}
|
||||
|
||||
if (!sysprof) {
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,113 +0,0 @@
|
||||
From patchwork Wed May 14 16:33:32 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [1/2] drm/msm: Fix a fence leak in submit error path
|
||||
From: Rob Clark <robdclark@gmail.com>
|
||||
X-Patchwork-Id: 653584
|
||||
Message-Id: <20250514163334.23544-2-robdclark@gmail.com>
|
||||
To: dri-devel@lists.freedesktop.org
|
||||
Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org,
|
||||
Rob Clark <robdclark@chromium.org>, Rob Clark <robdclark@gmail.com>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <lumag@kernel.org>, Sean Paul <sean@poorly.run>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>,
|
||||
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
|
||||
linux-kernel@vger.kernel.org (open list)
|
||||
Date: Wed, 14 May 2025 09:33:32 -0700
|
||||
|
||||
From: Rob Clark <robdclark@chromium.org>
|
||||
|
||||
In error paths, we could unref the submit without calling
|
||||
drm_sched_entity_push_job(), so msm_job_free() will never get
|
||||
called. Since drm_sched_job_cleanup() will NULL out the
|
||||
s_fence, we can use that to detect this case.
|
||||
|
||||
Signed-off-by: Rob Clark <robdclark@chromium.org>
|
||||
---
|
||||
drivers/gpu/drm/msm/msm_gem_submit.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
|
||||
index 3e9aa2cc38ef..b2aeaecaa39b 100644
|
||||
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
|
||||
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
|
||||
@@ -85,6 +85,15 @@ void __msm_gem_submit_destroy(struct kref *kref)
|
||||
container_of(kref, struct msm_gem_submit, ref);
|
||||
unsigned i;
|
||||
|
||||
+ /*
|
||||
+ * In error paths, we could unref the submit without calling
|
||||
+ * drm_sched_entity_push_job(), so msm_job_free() will never
|
||||
+ * get called. Since drm_sched_job_cleanup() will NULL out
|
||||
+ * s_fence, we can use that to detect this case.
|
||||
+ */
|
||||
+ if (submit->base.s_fence)
|
||||
+ drm_sched_job_cleanup(&submit->base);
|
||||
+
|
||||
if (submit->fence_id) {
|
||||
spin_lock(&submit->queue->idr_lock);
|
||||
idr_remove(&submit->queue->fence_idr, submit->fence_id);
|
||||
|
||||
From patchwork Wed May 14 16:33:33 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [2/2] drm/msm: Fix another leak in the submit error path
|
||||
From: Rob Clark <robdclark@gmail.com>
|
||||
X-Patchwork-Id: 653583
|
||||
Message-Id: <20250514163334.23544-3-robdclark@gmail.com>
|
||||
To: dri-devel@lists.freedesktop.org
|
||||
Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org,
|
||||
Rob Clark <robdclark@chromium.org>, Rob Clark <robdclark@gmail.com>,
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com>,
|
||||
Dmitry Baryshkov <lumag@kernel.org>, Sean Paul <sean@poorly.run>,
|
||||
Marijn Suijten <marijn.suijten@somainline.org>,
|
||||
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
|
||||
linux-kernel@vger.kernel.org (open list)
|
||||
Date: Wed, 14 May 2025 09:33:33 -0700
|
||||
|
||||
From: Rob Clark <robdclark@chromium.org>
|
||||
|
||||
put_unused_fd() doesn't free the installed file, if we've already done
|
||||
fd_install(). So we need to also free the sync_file.
|
||||
|
||||
Signed-off-by: Rob Clark <robdclark@chromium.org>
|
||||
---
|
||||
drivers/gpu/drm/msm/msm_gem_submit.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
|
||||
index b2aeaecaa39b..d4f71bb54e84 100644
|
||||
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
|
||||
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
|
||||
@@ -658,6 +658,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
struct msm_ringbuffer *ring;
|
||||
struct msm_submit_post_dep *post_deps = NULL;
|
||||
struct drm_syncobj **syncobjs_to_reset = NULL;
|
||||
+ struct sync_file *sync_file = NULL;
|
||||
int out_fence_fd = -1;
|
||||
unsigned i;
|
||||
int ret;
|
||||
@@ -867,7 +868,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
}
|
||||
|
||||
if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
|
||||
- struct sync_file *sync_file = sync_file_create(submit->user_fence);
|
||||
+ sync_file = sync_file_create(submit->user_fence);
|
||||
if (!sync_file) {
|
||||
ret = -ENOMEM;
|
||||
} else {
|
||||
@@ -901,8 +902,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
out_unlock:
|
||||
mutex_unlock(&queue->lock);
|
||||
out_post_unlock:
|
||||
- if (ret && (out_fence_fd >= 0))
|
||||
+ if (ret && (out_fence_fd >= 0)) {
|
||||
put_unused_fd(out_fence_fd);
|
||||
+ if (sync_file)
|
||||
+ fput(sync_file->file);
|
||||
+ }
|
||||
|
||||
if (!IS_ERR_OR_NULL(submit)) {
|
||||
msm_gem_submit_put(submit);
|
||||
@@ -31,10 +31,10 @@ case ${DEVICE} in
|
||||
;;
|
||||
*)
|
||||
case ${DEVICE} in
|
||||
H700|SM8550)
|
||||
H700)
|
||||
PKG_VERSION="6.15.2"
|
||||
;;
|
||||
SM8250)
|
||||
SM8250|SM8550)
|
||||
PKG_VERSION="6.16"
|
||||
;;
|
||||
*)
|
||||
|
||||
Reference in New Issue
Block a user