openwrt/target/linux/bcm27xx/patches-4.19/950-0517-gpu-vc4-fkms-Switch-to-the-newer-mailbox-frame-buffe.patch
Adrian Schmutzler 7d7aa2fd92 brcm2708: rename target to bcm27xx
This change makes the names of Broadcom targets consistent by using
the common notation based on SoC/CPU ID (which is used internally
anyway), bcmXXXX instead of brcmXXXX.
This is even used for target TITLE in make menuconfig already,
only the short target name used brcm so far.

Despite, since subtargets range from bcm2708 to bcm2711, it seems
appropriate to use bcm27xx instead of bcm2708 (again, as already done
for BOARDNAME).

This also renames the packages brcm2708-userland and brcm2708-gpu-fw.

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
2020-02-14 14:10:51 +01:00

217 lines
8.4 KiB
Diff

From 3819888738de087ba726ceaa2ab20503f164f1ed Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
Date: Tue, 26 Mar 2019 14:43:06 +0000
Subject: [PATCH] gpu: vc4-fkms: Switch to the newer mailbox frame
buffer API.
The old mailbox FB API was ideally deprecated but still used by
the FKMS driver.
Update to the newer API.
NB This needs current firmware that accepts ARM allocated buffers
through the newer API.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
---
drivers/gpu/drm/vc4/vc4_firmware_kms.c | 109 +++++++++++----------
include/soc/bcm2835/raspberrypi-firmware.h | 10 ++
2 files changed, 67 insertions(+), 52 deletions(-)
--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c
@@ -28,6 +28,25 @@
#include "vc4_regs.h"
#include <soc/bcm2835/raspberrypi-firmware.h>
+struct fb_alloc_tags {
+ struct rpi_firmware_property_tag_header tag1;
+ u32 xres, yres;
+ struct rpi_firmware_property_tag_header tag2;
+ u32 xres_virtual, yres_virtual;
+ struct rpi_firmware_property_tag_header tag3;
+ u32 bpp;
+ struct rpi_firmware_property_tag_header tag4;
+ u32 xoffset, yoffset;
+ struct rpi_firmware_property_tag_header tag5;
+ u32 base, screen_size;
+ struct rpi_firmware_property_tag_header tag6;
+ u32 pitch;
+ struct rpi_firmware_property_tag_header tag7;
+ u32 alpha_mode;
+ struct rpi_firmware_property_tag_header tag8;
+ u32 layer;
+};
+
/* The firmware delivers a vblank interrupt to us through the SMI
* hardware, which has only this one register.
*/
@@ -121,45 +140,39 @@ static void vc4_primary_plane_atomic_upd
struct drm_plane_state *old_state)
{
struct vc4_dev *vc4 = to_vc4_dev(plane->dev);
- struct vc4_fkms_plane *vc4_plane = to_vc4_fkms_plane(plane);
struct drm_plane_state *state = plane->state;
struct drm_framebuffer *fb = state->fb;
struct drm_gem_cma_object *bo = drm_fb_cma_get_gem_obj(fb, 0);
- volatile struct fbinfo_s *fbinfo = vc4_plane->fbinfo;
+ u32 format = fb->format->format;
+ struct fb_alloc_tags fbinfo = {
+ .tag1 = { RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT,
+ 8, 0, },
+ .xres = state->crtc_w,
+ .yres = state->crtc_h,
+ .tag2 = { RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT,
+ 8, 0, },
+ .xres_virtual = state->crtc_w,
+ .yres_virtual = state->crtc_h,
+ .tag3 = { RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH, 4, 0 },
+ .bpp = 32,
+ .tag4 = { RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET, 8, 0 },
+ .xoffset = 0,
+ .yoffset = 0,
+ .tag5 = { RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE, 8, 0 },
+ .base = bo->paddr + fb->offsets[0],
+ .screen_size = state->crtc_w * state->crtc_h * 4,
+ .tag6 = { RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH, 4, 0 },
+ .pitch = fb->pitches[0],
+ .tag7 = { RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE, 4, 0 },
+ .alpha_mode = format == DRM_FORMAT_ARGB8888 ? 0 : 2,
+ .tag8 = { RPI_FIRMWARE_FRAMEBUFFER_SET_LAYER, 4, 0 },
+ .layer = -127,
+ };
u32 bpp = 32;
int ret;
- fbinfo->xres = state->crtc_w;
- fbinfo->yres = state->crtc_h;
- fbinfo->xres_virtual = state->crtc_w;
- fbinfo->yres_virtual = state->crtc_h;
- fbinfo->bpp = bpp;
- fbinfo->xoffset = state->crtc_x;
- fbinfo->yoffset = state->crtc_y;
- fbinfo->base = bo->paddr + fb->offsets[0];
- fbinfo->pitch = fb->pitches[0];
-
if (fb->modifier == DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED)
- fbinfo->bpp |= BIT(31);
-
- /* A bug in the firmware makes it so that if the fb->base is
- * set to nonzero, the configured pitch gets overwritten with
- * the previous pitch. So, to get the configured pitch
- * recomputed, we have to make it allocate itself a new buffer
- * in VC memory, first.
- */
- if (vc4_plane->pitch != fb->pitches[0]) {
- u32 saved_base = fbinfo->base;
- fbinfo->base = 0;
-
- ret = rpi_firmware_transaction(vc4->firmware,
- RPI_FIRMWARE_CHAN_FB,
- vc4_plane->fbinfo_bus_addr);
- fbinfo->base = saved_base;
-
- vc4_plane->pitch = fbinfo->pitch;
- WARN_ON_ONCE(vc4_plane->pitch != fb->pitches[0]);
- }
+ fbinfo.bpp |= BIT(31);
DRM_DEBUG_ATOMIC("[PLANE:%d:%s] primary update %dx%d@%d +%d,%d 0x%pad/%d\n",
plane->base.id, plane->name,
@@ -168,14 +181,13 @@ static void vc4_primary_plane_atomic_upd
bpp,
state->crtc_x,
state->crtc_y,
- &fbinfo->base,
+ &fbinfo.base,
fb->pitches[0]);
- ret = rpi_firmware_transaction(vc4->firmware,
- RPI_FIRMWARE_CHAN_FB,
- vc4_plane->fbinfo_bus_addr);
- WARN_ON_ONCE(fbinfo->pitch != fb->pitches[0]);
- WARN_ON_ONCE(fbinfo->base != bo->paddr + fb->offsets[0]);
+ ret = rpi_firmware_property_list(vc4->firmware, &fbinfo,
+ sizeof(fbinfo));
+ WARN_ON_ONCE(fbinfo.pitch != fb->pitches[0]);
+ WARN_ON_ONCE(fbinfo.base != bo->paddr + fb->offsets[0]);
/* If the CRTC is on (or going to be on) and we're enabled,
* then unblank. Otherwise, stay blank until CRTC enable.
@@ -332,10 +344,10 @@ static const struct drm_plane_helper_fun
static struct drm_plane *vc4_fkms_plane_init(struct drm_device *dev,
enum drm_plane_type type)
{
+ /* Primary and cursor planes only */
struct drm_plane *plane = NULL;
struct vc4_fkms_plane *vc4_plane;
- u32 xrgb8888 = DRM_FORMAT_XRGB8888;
- u32 argb8888 = DRM_FORMAT_ARGB8888;
+ u32 formats[] = {DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888};
int ret = 0;
bool primary = (type == DRM_PLANE_TYPE_PRIMARY);
static const uint64_t modifiers[] = {
@@ -357,22 +369,15 @@ static struct drm_plane *vc4_fkms_plane_
plane = &vc4_plane->base;
ret = drm_universal_plane_init(dev, plane, 0xff,
&vc4_plane_funcs,
- primary ? &xrgb8888 : &argb8888, 1,
- modifiers,
+ formats, primary ? 2 : 1, modifiers,
type, primary ? "primary" : "cursor");
- if (type == DRM_PLANE_TYPE_PRIMARY) {
- vc4_plane->fbinfo =
- dma_alloc_coherent(dev->dev,
- sizeof(*vc4_plane->fbinfo),
- &vc4_plane->fbinfo_bus_addr,
- GFP_KERNEL);
- memset(vc4_plane->fbinfo, 0, sizeof(*vc4_plane->fbinfo));
-
+ if (type == DRM_PLANE_TYPE_PRIMARY)
drm_plane_helper_add(plane, &vc4_primary_plane_helper_funcs);
- } else {
+ else
drm_plane_helper_add(plane, &vc4_cursor_plane_helper_funcs);
- }
+
+ drm_plane_create_alpha_property(plane);
return plane;
fail:
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -111,9 +111,15 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 0x00040009,
RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 0x0004000a,
RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 0x0004000b,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_LAYER = 0x0004000c,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_TRANSFORM = 0x0004000d,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_VSYNC = 0x0004000e,
RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 0x0004000f,
RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 0x00040010,
RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 0x00048001,
+ RPI_FIRMWARE_FRAMEBUFFER_SET_DISPLAY_NUM = 0x00048013,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS = 0x00040013,
+ RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_SETTINGS = 0x00040014,
RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003,
RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 0x00044004,
RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH = 0x00044005,
@@ -122,6 +128,8 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 0x00044009,
RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 0x0004400a,
RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 0x0004400b,
+ RPI_FIRMWARE_FRAMEBUFFER_TEST_LAYER = 0x0004400c,
+ RPI_FIRMWARE_FRAMEBUFFER_TEST_TRANSFORM = 0x0004400d,
RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 0x0004400e,
RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 0x00048003,
RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 0x00048004,
@@ -134,6 +142,8 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 0x0004801f,
RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF = 0x00048020,
RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 0x0004800e,
+ RPI_FIRMWARE_FRAMEBUFFER_SET_LAYER = 0x0004800c,
+ RPI_FIRMWARE_FRAMEBUFFER_SET_TRANSFORM = 0x0004800d,
RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 0x0004800f,
RPI_FIRMWARE_VCHIQ_INIT = 0x00048010,