1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-02-15 04:42:02 +00:00
openmptcprouter/6.1/target/linux/bcm27xx/patches-6.1/950-0978-Revert-vc4-fkms-Remove-use-of-SMI-peripheral.patch
Ycarus (Yannick Chabanois) 3743692973 Fix RPI5 support
2023-11-17 17:31:36 +01:00

77 lines
2.6 KiB
Diff

From c6065bf78ed0803dfea16a0b5061ab88dd8ee18e Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date: Fri, 20 Oct 2023 15:21:34 +0100
Subject: [PATCH] Revert "vc4/fkms: Remove use of SMI peripheral"
This reverts commit 3fb20da9f3bff93f20b1a1fe2c950c6c8f4d1e1e.
---
drivers/gpu/drm/vc4/vc4_firmware_kms.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c
@@ -255,6 +255,13 @@ static const struct vc_image_format *vc4
/* The firmware delivers a vblank interrupt to us through the SMI
* hardware, which has only this one register.
*/
+#define SMICS 0x0
+#define SMIDSW0 0x14
+#define SMIDSW1 0x1C
+#define SMICS_INTERRUPTS (BIT(9) | BIT(10) | BIT(11))
+
+/* Flag to denote that the firmware is giving multiple display callbacks */
+#define SMI_NEW 0xabcd0000
#define vc4_crtc vc4_kms_crtc
#define to_vc4_crtc to_vc4_kms_crtc
@@ -1214,13 +1221,16 @@ static irqreturn_t vc4_crtc_irq_handler(
{
struct vc4_crtc **crtc_list = data;
int i;
+ u32 stat = readl(crtc_list[0]->regs + SMICS);
irqreturn_t ret = IRQ_NONE;
u32 chan;
- if (1) {
- chan = 0;
+ if (stat & SMICS_INTERRUPTS) {
+ writel(0, crtc_list[0]->regs + SMICS);
+
+ chan = readl(crtc_list[0]->regs + SMIDSW0);
- if (1) {
+ if ((chan & 0xFFFF0000) != SMI_NEW) {
/* Older firmware. Treat the one interrupt as vblank/
* complete for all crtcs.
*/
@@ -1231,7 +1241,7 @@ static irqreturn_t vc4_crtc_irq_handler(
}
} else {
if (chan & 1) {
- //writel(SMI_NEW, crtc_list[0]->regs + SMIDSW0);
+ writel(SMI_NEW, crtc_list[0]->regs + SMIDSW0);
if (crtc_list[0]->vblank_enabled)
drm_crtc_handle_vblank(&crtc_list[0]->base);
vc4_crtc_handle_page_flip(crtc_list[0]);
@@ -1239,10 +1249,10 @@ static irqreturn_t vc4_crtc_irq_handler(
if (crtc_list[1]) {
/* Check for the secondary display too */
- //chan = readl(crtc_list[0]->regs + SMIDSW1);
+ chan = readl(crtc_list[0]->regs + SMIDSW1);
if (chan & 1) {
- //writel(SMI_NEW, crtc_list[0]->regs + SMIDSW1);
+ writel(SMI_NEW, crtc_list[0]->regs + SMIDSW1);
if (crtc_list[1]->vblank_enabled)
drm_crtc_handle_vblank(&crtc_list[1]->base);
@@ -1982,7 +1992,7 @@ static int vc4_fkms_bind(struct device *
if (IS_ERR(crtc_list[0]->regs))
DRM_ERROR("Oh dear, failed to map registers\n");
- //writel(0, crtc_list[0]->regs + SMICS);
+ writel(0, crtc_list[0]->regs + SMICS);
ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
vc4_crtc_irq_handler, 0,
"vc4 firmware kms", crtc_list);