mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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 <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>
This commit is contained in:
committed by
Dave Stevenson
parent
d60205bb6a
commit
cf1c8f63f3
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user