Revert "frecon: add atomic modeset"
This reverts commit 7bb94df09196e7c863e83dec9e4105dd13fad14b.
Reason for revert:
Broke virtual terminals on octopus. Reverting this one change
fixed the issue.
BUG=b:117590941,b:117559913
Original change's description:
> frecon: add atomic modeset
>
> This should make switch to console potentially faster on kernels that
> support atomic ioctl.
>
> BUG=chromium:863853,b:110258421
> TEST=switch to console on Grunt
>
> Change-Id: I792e962d897df894994035c3267e0d0f5136698e
> Signed-off-by: Dominik Behr <dbehr@chromium.org>
> Reviewed-on: https://chromium-review.googlesource.com/1176396
> Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
> Reviewed-by: Stphane Marchesin <marcheu@chromium.org>
Bug: chromium:863853, b:110258421
Change-Id: I5305b183b90340bbca97a37e6ab6465240febe15
Reviewed-on: https://chromium-review.googlesource.com/1277045
Commit-Ready: Daniel Kurtz <djkurtz@chromium.org>
Tested-by: Ross Zwisler <zwisler@chromium.org>
Reviewed-by: Dominik Behr <dbehr@chromium.org>
Reviewed-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Drew Davenport <ddavenport@chromium.org>
Reviewed-by: Ross Zwisler <zwisler@chromium.org>
diff --git a/drm.c b/drm.c
index c3b5890..6b2e568 100644
--- a/drm.c
+++ b/drm.c
@@ -21,32 +21,6 @@
static drm_t* g_drm = NULL;
-static int32_t atomic_set_prop(drm_t* drm, drmModeAtomicReqPtr pset, uint32_t id,
- drmModeObjectPropertiesPtr props, const char *name, uint64_t value)
-{
- uint32_t u;
- int32_t ret;
- drmModePropertyPtr prop;
-
- for (u = 0; u < props->count_props; u++) {
- prop = drmModeGetProperty(drm->fd, props->props[u]);
- if (!prop)
- continue;
- if (strcmp(prop->name, name)) {
- drmModeFreeProperty(prop);
- continue;
- }
- ret = drmModeAtomicAddProperty(pset, id, prop->prop_id, value);
- if (ret < 0) {
- LOG(ERROR, "setting atomic property %s failed with %d\n", name, ret);
- }
- drmModeFreeProperty(prop);
- return ret;
- }
- LOG(ERROR, "could not find atomic property %s\n", name);
- return -ENOENT;
-}
-
static int32_t crtc_planes_num(drm_t* drm, int32_t crtc_index)
{
drmModePlanePtr plane;
@@ -391,7 +365,6 @@
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));
if (!drm)
@@ -421,16 +394,6 @@
/* 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) {
- drm->atomic = true;
- ret = drmSetClientCap(drm->fd, DRM_CLIENT_CAP_ATOMIC, 1);
- if (ret < 0) {
- LOG(ERROR, "Failed to set atomic cap.");
- drm->atomic = false;
- }
- }
-
drm->resources = drmModeGetResources(drm->fd);
if (!drm->resources) {
drm_fini(drm);
@@ -577,184 +540,12 @@
return drm && drm->fd >= 0 && drm->resources && drm->console_connector_id;
}
-static bool is_crtc_possible(drm_t* drm, uint32_t crtc_id, uint32_t mask)
-{
- int32_t crtc;
- for (crtc = 0; crtc < drm->resources->count_crtcs; crtc++)
- if (drm->resources->crtcs[crtc] == crtc_id)
- return !!(mask & (1u << crtc));
-
- return false;
-
-}
-
-#define CHECK(fn) do { ret = fn; if (!ret) goto error_mode; } while (0)
-static int32_t drm_setmode_atomic(drm_t* drm, uint32_t fb_id)
-{
- int32_t ret;
- int32_t crtc, conn;
- uint32_t plane;
- uint32_t console_crtc_id = 0;
- drmModeObjectPropertiesPtr crtc_props = NULL;
- drmModeObjectPropertiesPtr plane_props = NULL;
- drmModeObjectPropertiesPtr conn_props = NULL;
- drmModePlaneResPtr plane_resources;
- drmModeAtomicReqPtr pset = NULL;
- uint32_t mode_id = 0;
-
- plane_resources = drmModeGetPlaneResources(drm->fd);
- if (!plane_resources)
- return -ENOENT;
-
- get_connector_path(drm, drm->console_connector_id, NULL, &console_crtc_id);
- if (!console_crtc_id)
- find_crtc_for_connector(drm, drm->console_connector_id, &console_crtc_id);
- if (!console_crtc_id) {
- LOG(ERROR, "Could not get console crtc for connector:%d in modeset.\n", drm->console_connector_id);
- return -ENOENT;
- }
-
- pset = drmModeAtomicAlloc();
- if (!pset) {
- ret = -ENOMEM;
- goto error_mode;
- }
-
- for (crtc = 0; crtc < drm->resources->count_crtcs; crtc++) {
- uint32_t crtc_id = drm->resources->crtcs[crtc];
-
- crtc_props = drmModeObjectGetProperties(drm->fd, crtc_id, DRM_MODE_OBJECT_CRTC);
-
- if (!crtc_props) {
- LOG(ERROR, "Could not query properties for crtc %d %m.", crtc_id);
- if (crtc_id != console_crtc_id)
- continue;
- ret = -ENOENT;
- goto error_mode;
- }
-
- if (crtc_id == console_crtc_id) {
- CHECK(drmModeCreatePropertyBlob(drm->fd, &drm->console_mode_info,
- sizeof(drm->console_mode_info),
- &mode_id));
-
- /* drm->crtc->mode has been set during init */
- CHECK(atomic_set_prop(drm, pset, crtc_id, crtc_props, "MODE_ID", mode_id));
- CHECK(atomic_set_prop(drm, pset, crtc_id, crtc_props, "ACTIVE", 1));
- } else {
- CHECK(atomic_set_prop(drm, pset, crtc_id, crtc_props, "MODE_ID", 0));
- CHECK(atomic_set_prop(drm, pset, crtc_id, crtc_props, "ACTIVE", 0));
- }
-
- drmModeFreeObjectProperties(crtc_props);
- }
-
- for (plane = 0; plane < plane_resources->count_planes; plane++) {
- drmModePlanePtr planeobj;
- uint32_t plane_id = plane_resources->planes[plane];
- uint32_t possible_crtcs;
- int primary;
-
- planeobj = drmModeGetPlane(drm->fd, plane_id);
- if (!planeobj) {
- LOG(ERROR, "Could not query plane object for plane %d %m.", plane_id);
- ret = -ENOENT;
- goto error_mode;
- }
-
- possible_crtcs = planeobj->possible_crtcs;
- drmModeFreePlane(planeobj);
-
- primary = drm_is_primary_plane(drm, plane_id);
-
- plane_props = drmModeObjectGetProperties(drm->fd, plane_id, DRM_MODE_OBJECT_PLANE);
- if (!plane_props) {
- LOG(ERROR, "Could not query properties for plane %d %m.", plane_id);
- ret = -ENOENT;
- goto error_mode;
- }
-
- if (is_crtc_possible(drm, console_crtc_id, possible_crtcs) && primary) {
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "FB_ID", fb_id));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "CRTC_ID", console_crtc_id));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "CRTC_X", 0));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "CRTC_Y", 0));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "CRTC_W", drm->console_mode_info.hdisplay));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "CRTC_H", drm->console_mode_info.vdisplay));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "SRC_X", 0));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "SRC_Y", 0));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "SRC_W", drm->console_mode_info.hdisplay << 16));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "SRC_H", drm->console_mode_info.vdisplay << 16));
- } else {
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "FB_ID", 0));
- CHECK(atomic_set_prop(drm, pset, plane_id, plane_props, "CRTC_ID", 0));
- }
-
- drmModeFreeObjectProperties(plane_props);
- plane_props = NULL;
- }
-
- for (conn = 0; conn < drm->resources->count_connectors; conn++) {
- uint32_t conn_id = drm->resources->connectors[conn];
-
- conn_props = drmModeObjectGetProperties(drm->fd, conn_id, DRM_MODE_OBJECT_CONNECTOR);
- if (!conn_props) {
- LOG(ERROR, "Could not query properties for connector %d %m.", conn_id);
- if (conn_id != drm->console_connector_id)
- continue;
- ret = -ENOENT;
- goto error_mode;
- }
- if (conn_id == drm->console_connector_id) {
- CHECK(atomic_set_prop(drm, pset, conn_id, conn_props, "CRTC_ID", console_crtc_id));
- } else {
- CHECK(atomic_set_prop(drm, pset, conn_id, conn_props, "CRTC_ID", 0));
- }
- drmModeFreeObjectProperties(conn_props);
- conn_props = NULL;
- }
-
- drmModeFreePlaneResources(plane_resources);
-
- ret = drmModeAtomicCommit(drm->fd, pset,
- DRM_MODE_ATOMIC_ALLOW_MODESET , NULL);
- if (!ret) {
- drm_clear_rmfb(drm);
- /* LOG(INFO, "TIMING: Console switch atomic modeset finished."); */
- }
-
-error_mode:
- if (mode_id)
- drmModeDestroyPropertyBlob(drm->fd, mode_id);
-
- if (plane_resources)
- drmModeFreePlaneResources(plane_resources);
-
- if (crtc_props)
- drmModeFreeObjectProperties(crtc_props);
-
- if (conn_props)
- drmModeFreeObjectProperties(conn_props);
-
- if (plane_props)
- drmModeFreeObjectProperties(plane_props);
-
- drmModeAtomicFree(pset);
- return ret;
-}
-#undef CHECK
-
int32_t drm_setmode(drm_t* drm, uint32_t fb_id)
{
int conn;
int32_t ret;
uint32_t existing_console_crtc_id = 0;
- if (drm->atomic)
- if (drm_setmode_atomic(drm, fb_id) == 0)
- return 0;
- /* Fallback to legacy mode set. */
-
get_connector_path(drm, drm->console_connector_id, NULL, &existing_console_crtc_id);
/* Loop through all the connectors, disable ones that are configured and set video mode on console connector. */
diff --git a/drm.h b/drm.h
index 65a523e..7fc17b9 100644
--- a/drm.h
+++ b/drm.h
@@ -27,7 +27,6 @@
bool edid_found;
char edid[EDID_SIZE];
uint32_t delayed_rmfb_fb_id;
- bool atomic;
} drm_t;
drm_t* drm_scan(void);