From: Maxime Ripard <mrip...@kernel.org>

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 <mrip...@kernel.org>
Signed-off-by: Dave Stevenson <dave.steven...@raspberrypi.com>
---
 drivers/gpu/drm/vc4/vc4_drv.h |  2 ++
 drivers/gpu/drm/vc4/vc4_txp.c | 12 +++++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 984fddae0048..34e72e711a17 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -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;
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index d2ee872e9c0b..c2726ccde1cf 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -145,6 +145,9 @@
 /* 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;

-- 
2.34.1

Reply via email to