summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-6.1/950-0970-drm-vc4-txp-Handle-40-bits-DMA-Addresses.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-0970-drm-vc4-txp-Handle-40-bits-DMA-Addresses.patch')
-rw-r--r--target/linux/bcm27xx/patches-6.1/950-0970-drm-vc4-txp-Handle-40-bits-DMA-Addresses.patch59
1 files changed, 59 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-0970-drm-vc4-txp-Handle-40-bits-DMA-Addresses.patch b/target/linux/bcm27xx/patches-6.1/950-0970-drm-vc4-txp-Handle-40-bits-DMA-Addresses.patch
new file mode 100644
index 0000000000..5d1fbcb119
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-0970-drm-vc4-txp-Handle-40-bits-DMA-Addresses.patch
@@ -0,0 +1,59 @@
+From ddb9aa80692ed5d35e4ee4688c36789620f78c5c Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Fri, 14 Apr 2023 17:47:11 +0200
+Subject: [PATCH] drm/vc4: txp: Handle 40-bits DMA Addresses
+
+The BCM2712 MOP and MOPLET can handle addresses larger than 32bits
+through an extra register. We can easily support it and make it
+conditional based on the compatible through a boolean in our variant
+structure.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_drv.h | 1 +
+ drivers/gpu/drm/vc4/vc4_txp.c | 10 +++++++++-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -565,6 +565,7 @@ struct vc4_txp_data {
+ struct vc4_crtc_data base;
+ unsigned int has_byte_enable:1;
+ unsigned int size_minus_one:1;
++ unsigned int supports_40bit_addresses:1;
+ };
+
+ extern const struct vc4_txp_data bcm2835_txp_data;
+--- a/drivers/gpu/drm/vc4/vc4_txp.c
++++ b/drivers/gpu/drm/vc4/vc4_txp.c
+@@ -145,6 +145,8 @@
+ /* Number of lines received and committed to memory. */
+ #define TXP_PROGRESS 0x10
+
++#define TXP_DST_PTR_HIGH 0x1c
++
+ #define TXP_READ(offset) \
+ ({ \
+ kunit_fail_current_test("Accessing a register in a unit test!\n"); \
+@@ -297,6 +299,7 @@ static void vc4_txp_connector_atomic_com
+ struct drm_framebuffer *fb;
+ unsigned int hdisplay;
+ unsigned int vdisplay;
++ dma_addr_t addr;
+ u32 ctrl;
+ int idx;
+ int i;
+@@ -334,7 +337,12 @@ static void vc4_txp_connector_atomic_com
+ return;
+
+ gem = drm_fb_dma_get_gem_obj(fb, 0);
+- TXP_WRITE(TXP_DST_PTR, gem->dma_addr + fb->offsets[0]);
++ addr = gem->dma_addr + fb->offsets[0];
++ TXP_WRITE(TXP_DST_PTR, lower_32_bits(addr));
++
++ if (txp_data->supports_40bit_addresses)
++ TXP_WRITE(TXP_DST_PTR_HIGH, upper_32_bits(addr) & 0xff);
++
+ TXP_WRITE(TXP_DST_PITCH, fb->pitches[0]);
+
+ hdisplay = mode->hdisplay ?: 1;