linuxOS_AP06/buildroot/package/frecon/0004-HACK-Simplify-for-Rockchip-Platform.patch
2025-06-03 12:28:32 +08:00

370 lines
8.8 KiB
Diff

From c059da177bf549cc212c08bc4d1c526320ff9175 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Fri, 10 Jun 2022 12:16:21 +0800
Subject: [PATCH 04/11] HACK: Simplify for Rockchip Platform
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
drm.c | 177 +++++++++++++++------------------------------------------
drm.h | 3 -
main.c | 27 ---------
main.h | 1 -
term.c | 12 +---
5 files changed, 47 insertions(+), 173 deletions(-)
diff --git a/drm.c b/drm.c
index 4748415..471210e 100644
--- a/drm.c
+++ b/drm.c
@@ -248,7 +248,6 @@ static bool find_main_monitor(drm_t* drm)
return false;
drm->console_connector_id = main_monitor_connector->connector_id;
- drm->console_connector_internal = drm_is_internal(main_monitor_connector->connector_type);
for (modes = 0; modes < main_monitor_connector->count_modes; modes++) {
if (main_monitor_connector->modes[modes].type &
@@ -321,130 +320,72 @@ static bool drm_equal(drm_t* l, drm_t* r)
return true;
}
-static int drm_score(drm_t* drm)
-{
- drmVersionPtr version;
- int score = 0;
-
- if (!drm)
- return -1000000000;
-
- if (!drm->console_connector_id)
- return -1000000000;
-
- if (drm->console_connector_internal)
- score++;
-
- version = drmGetVersion(drm->fd);
- if (version) {
- /* We would rather use any driver besides UDL. */
- if (strcmp("udl", version->name) == 0)
- score--;
- if (strcmp("evdi", version->name) == 0)
- score--;
- /* VGEM should be ignored because it has no displays, but lets make sure. */
- if (strcmp("vgem", version->name) == 0)
- score -= 1000000;
- drmFreeVersion(version);
- }
- return score;
-}
-
/*
- * Scan and find best DRM object to display frecon on.
- * This object should be created with DRM master, and we will keep master till
- * first mode set or explicit drop master.
+ * Find DRM object to display frecon on.
*/
drm_t* drm_scan(void)
{
- unsigned i;
- char* dev_name;
int ret;
- drm_t *best_drm = NULL;
-
- for (i = 0; i < DRM_MAX_MINOR; i++) {
- uint64_t atomic = 0;
- drm_t* drm = calloc(1, sizeof(drm_t));
+ uint64_t atomic = 0;
+ drmVersionPtr version;
+ drm_t* drm = calloc(1, sizeof(drm_t));
- if (!drm)
- return NULL;
+ if (!drm)
+ return NULL;
-try_open_again:
- ret = asprintf(&dev_name, DRM_DEV_NAME, DRM_DIR_NAME, i);
- if (ret < 0) {
- drm_fini(drm);
- continue;
- }
- drm->fd = open(dev_name, O_RDWR, 0);
- free(dev_name);
+ drm->fd = drmOpen("rockchip", NULL);
+ if (drm->fd < 0) {
+ drm->fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC, 0);
if (drm->fd < 0) {
drm_fini(drm);
- continue;
- }
- /* if we have master this should succeed */
- ret = drmSetMaster(drm->fd);
- if (ret != 0) {
- drmClose(drm->fd);
- drm->fd = -1;
- usleep(100*1000);
- goto try_open_again;
- }
-
- /* Set universal planes cap if possible. Ignore any errors. */
- drmSetClientCap(drm->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
-
- ret = drmGetCap(drm->fd, DRM_CLIENT_CAP_ATOMIC, &atomic);
- if (!ret && atomic) {
- ret = drmSetClientCap(drm->fd, DRM_CLIENT_CAP_ATOMIC, 1);
- if (ret < 0)
- LOG(ERROR, "Failed to set atomic cap.");
+ return NULL;
}
+ }
- drm->resources = drmModeGetResources(drm->fd);
- if (!drm->resources) {
- drm_fini(drm);
- continue;
- }
+ /* Set universal planes cap if possible. Ignore any errors. */
+ drmSetClientCap(drm->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
- /* Expect at least one crtc so we do not try to run on VGEM. */
- if (drm->resources->count_crtcs == 0 || drm->resources->count_connectors == 0) {
- drm_fini(drm);
- continue;
- }
+ ret = drmGetCap(drm->fd, DRM_CLIENT_CAP_ATOMIC, &atomic);
+ if (!ret && atomic) {
+ ret = drmSetClientCap(drm->fd, DRM_CLIENT_CAP_ATOMIC, 1);
+ if (ret < 0)
+ LOG(ERROR, "Failed to set atomic cap.");
+ }
- drm->plane_resources = drmModeGetPlaneResources(drm->fd);
+ drm->resources = drmModeGetResources(drm->fd);
+ if (!drm->resources) {
+ drm_fini(drm);
+ return NULL;
+ }
- if (!find_main_monitor(drm)) {
- drm_fini(drm);
- continue;
- }
+ /* Expect at least one crtc so we do not try to run on VGEM. */
+ if (drm->resources->count_crtcs == 0 || drm->resources->count_connectors == 0) {
+ drm_fini(drm);
+ return NULL;
+ }
- drm->refcount = 1;
+ drm->plane_resources = drmModeGetPlaneResources(drm->fd);
- if (drm_score(drm) > drm_score(best_drm)) {
- drm_fini(best_drm);
- best_drm = drm;
- } else {
- drm_fini(drm);
- }
+ if (!find_main_monitor(drm)) {
+ drm_fini(drm);
+ return NULL;
}
- if (best_drm) {
- drmVersionPtr version;
- version = drmGetVersion(best_drm->fd);
- if (version) {
- LOG(INFO,
- "Frecon using drm driver %s, version %d.%d, date(%s), desc(%s)",
- version->name,
- version->version_major,
- version->version_minor,
- version->date,
- version->desc);
- drmFreeVersion(version);
- }
+ drm->refcount = 1;
+
+ version = drmGetVersion(drm->fd);
+ if (version) {
+ LOG(INFO,
+ "Frecon using drm driver %s, version %d.%d, date(%s), desc(%s)",
+ version->name,
+ version->version_major,
+ version->version_minor,
+ version->date,
+ version->desc);
+ drmFreeVersion(version);
}
- return best_drm;
+ return drm;
}
void drm_set(drm_t* drm_)
@@ -490,28 +431,6 @@ drm_t* drm_addref(void)
return NULL;
}
-int drm_dropmaster(drm_t* drm)
-{
- int ret = 0;
-
- if (!drm)
- drm = g_drm;
- if (drm)
- ret = drmDropMaster(drm->fd);
- return ret;
-}
-
-int drm_setmaster(drm_t* drm)
-{
- int ret = 0;
-
- if (!drm)
- drm = g_drm;
- if (drm)
- ret = drmSetMaster(drm->fd);
- return ret;
-}
-
/*
* Returns true if connector/crtc/driver have changed and framebuffer object have to be re-created.
*/
@@ -519,14 +438,10 @@ bool drm_rescan(void)
{
drm_t* ndrm;
- /* In case we had master, drop master so the newly created object could have it. */
- drm_dropmaster(g_drm);
ndrm = drm_scan();
if (ndrm) {
if (drm_equal(ndrm, g_drm)) {
drm_fini(ndrm);
- /* Regain master we dropped. */
- drm_setmaster(g_drm);
} else {
drm_delref(g_drm);
g_drm = ndrm;
diff --git a/drm.h b/drm.h
index 09720f8..ff42efc 100644
--- a/drm.h
+++ b/drm.h
@@ -19,7 +19,6 @@ typedef struct _drm_t {
drmModeRes* resources;
drmModePlaneResPtr plane_resources;
uint32_t console_connector_id;
- bool console_connector_internal;
drmModeModeInfo console_mode_info;
uint32_t delayed_rmfb_fb_id;
} drm_t;
@@ -29,8 +28,6 @@ void drm_set(drm_t* drm);
void drm_close(void);
drm_t* drm_addref(void);
void drm_delref(drm_t* drm);
-int drm_dropmaster(drm_t* drm);
-int drm_setmaster(drm_t* drm);
bool drm_rescan(void);
bool drm_valid(drm_t* drm);
int32_t drm_setmode(drm_t* drm, uint32_t fb_id);
diff --git a/main.c b/main.c
index 6df2379..313f9d4 100644
--- a/main.c
+++ b/main.c
@@ -176,30 +176,6 @@ int main_loop(void)
return 0;
}
-bool set_drm_master_relax(void)
-{
- int fd;
- int num_written;
-
- /*
- * Setting drm_master_relax flag in kernel allows us to transfer DRM master
- * between Chrome and frecon.
- */
- fd = open("/sys/kernel/debug/dri/drm_master_relax", O_WRONLY);
- if (fd != -1) {
- num_written = write(fd, "Y", 1);
- close(fd);
- if (num_written != 1) {
- LOG(ERROR, "Unable to set drm_master_relax.");
- return false;
- }
- } else {
- LOG(ERROR, "Unable to open drm_master_relax.");
- return false;
- }
- return true;
-}
-
int main(int argc, char* argv[])
{
int ret;
@@ -306,12 +282,9 @@ int main(int argc, char* argv[])
daemon_exit_code(EXIT_SUCCESS);
if (command_flags.daemon) {
- if (command_flags.enable_vts)
- set_drm_master_relax();
term_background(true);
} else {
/* Create and switch to first term in interactve mode. */
- set_drm_master_relax();
term_switch_to(1);
}
diff --git a/main.h b/main.h
index 079b6de..a98bd3c 100644
--- a/main.h
+++ b/main.h
@@ -11,7 +11,6 @@
#define FRECON_PID_FILE FRECON_RUN_DIR "/pid"
int main_process_events(uint32_t usec);
-bool set_drm_master_relax(void);
typedef struct {
bool daemon;
diff --git a/term.c b/term.c
index 56f4da5..e5ee1c6 100644
--- a/term.c
+++ b/term.c
@@ -738,7 +738,7 @@ void term_zoom(bool zoom_in)
}
/*
- * Put frecon in background. Give up DRM master.
+ * Put frecon in background.
* onetry - if true, do not retry to notify Chrome multiple times. For use at
* time when Chrome may be not around yet to receive the message.
*/
@@ -747,24 +747,14 @@ void term_background(bool onetry)
if (in_background)
return;
in_background = true;
- drm_dropmaster(NULL);
}
void term_foreground(void)
{
- int ret;
-
if (!in_background)
return;
in_background = false;
- /* LOG(INFO, "TIMING: Console switch time start."); */ /* Keep around for timing it in the future. */
-
- /* LOG(INFO, "TIMING: Console switch setmaster."); */
- ret = drm_setmaster(NULL);
- if (ret < 0)
- LOG(ERROR, "Could not set master when switching to foreground %m.");
-
if (hotplug_occured) {
hotplug_occured = false;
term_monitor_hotplug();
--
2.20.1