]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/vc4: txp: Handle 40-bits DMA Addresses
authorMaxime Ripard <mripard@kernel.org>
Fri, 25 Oct 2024 17:15:48 +0000 (18:15 +0100)
committerDave Stevenson <dave.stevenson@raspberrypi.com>
Wed, 27 Nov 2024 14:37:20 +0000 (14:37 +0000)
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 <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20241025-drm-vc4-2712-support-v2-17-35efa83c8fc0@raspberrypi.com
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_txp.c

index 984fddae00485d29d4d03e51cdbeab43d24d82d1..34e72e711a17a0fc5d54387f7aeccf21a7270c74 100644 (file)
@@ -538,8 +538,10 @@ struct vc4_crtc_data {
 
 struct vc4_txp_data {
        struct vc4_crtc_data    base;
+       unsigned int high_addr_ptr_reg;
        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;
index d2ee872e9c0bc1a50fbeac3b1a22ee60ee462bbd..c2726ccde1cf8a9979b7a50387b49d44b2de28c8 100644 (file)
 /* Number of lines received and committed to memory. */
 #define TXP_PROGRESS           0x10
 
+#define TXP_DST_PTR_HIGH_MOPLET        0x1c
+#define TXP_DST_PTR_HIGH_MOP   0x24
+
 #define TXP_READ(offset)                                                               \
        ({                                                                              \
                kunit_fail_current_test("Accessing a register in a unit test!\n");      \
@@ -293,6 +296,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
        struct drm_framebuffer *fb;
        unsigned int hdisplay;
        unsigned int vdisplay;
+       dma_addr_t addr;
        u32 ctrl;
        int idx;
        int i;
@@ -330,7 +334,13 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
                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_data->high_addr_ptr_reg, upper_32_bits(addr) & 0xff);
+
        TXP_WRITE(TXP_DST_PITCH, fb->pitches[0]);
 
        hdisplay = mode->hdisplay ?: 1;