From: Dave Airlie <airl...@redhat.com>

This is step one towards MST connector hotplug support,
it stop caching the mode resources structure, and
just passes a pointer to it around.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/drmmode_display.c | 35 +++++++++++++++++++----------------
 src/drmmode_display.h |  2 +-
 src/radeon_dri2.c     |  2 +-
 src/radeon_kms.c      |  2 +-
 4 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index ef5dfbe..c69abbf 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -850,7 +850,7 @@ void drmmode_crtc_hw_id(xf86CrtcPtr crtc)
 }
 
 static void
-drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
+drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr 
mode_res, int num)
 {
        xf86CrtcPtr crtc;
        drmmode_crtc_private_ptr drmmode_crtc;
@@ -860,7 +860,7 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, 
int num)
                return;
 
        drmmode_crtc = xnfcalloc(sizeof(drmmode_crtc_private_rec), 1);
-       drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd, 
drmmode->mode_res->crtcs[num]);
+       drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd, 
mode_res->crtcs[num]);
        drmmode_crtc->drmmode = drmmode;
        crtc->driver_private = drmmode_crtc;
        drmmode_crtc_hw_id(crtc);
@@ -1195,7 +1195,7 @@ const char *output_names[] = { "None",
 #define NUM_OUTPUT_NAMES (sizeof(output_names) / sizeof(output_names[0]))
 
 static void
-drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num, int 
*num_dvi, int *num_hdmi)
+drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr 
mode_res, int num, int *num_dvi, int *num_hdmi)
 {
        RADEONInfoPtr info = RADEONPTR(pScrn);
        xf86OutputPtr output;
@@ -1207,7 +1207,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr 
drmmode, int num, int *num_dv
        int i;
        const char *s;
 
-       koutput = drmModeGetConnector(drmmode->fd, 
drmmode->mode_res->connectors[num]);
+       koutput = drmModeGetConnector(drmmode->fd, mode_res->connectors[num]);
        if (!koutput)
                return;
 
@@ -1285,7 +1285,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr 
drmmode, int num, int *num_dv
                goto out_free_encoders;
        }
 
-       drmmode_output->output_id = drmmode->mode_res->connectors[num];
+       drmmode_output->output_id = mode_res->connectors[num];
        drmmode_output->mode_output = koutput;
        drmmode_output->mode_encoders = kencoders;
        drmmode_output->drmmode = drmmode;
@@ -1354,7 +1354,7 @@ uint32_t find_clones(ScrnInfoPtr scrn, xf86OutputPtr 
output)
 
 
 static void
-drmmode_clones_init(ScrnInfoPtr scrn, drmmode_ptr drmmode)
+drmmode_clones_init(ScrnInfoPtr scrn, drmmode_ptr drmmode, drmModeResPtr 
mode_res)
 {
        int i, j;
        xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
@@ -1369,8 +1369,8 @@ drmmode_clones_init(ScrnInfoPtr scrn, drmmode_ptr drmmode)
                for (j = 0; j < drmmode_output->mode_output->count_encoders; 
j++)
                {
                        int k;
-                       for (k = 0; k < drmmode->mode_res->count_encoders; k++) 
{
-                               if (drmmode->mode_res->encoders[k] == 
drmmode_output->mode_encoders[j]->encoder_id)
+                       for (k = 0; k < mode_res->count_encoders; k++) {
+                               if (mode_res->encoders[k] == 
drmmode_output->mode_encoders[j]->encoder_id)
                                        drmmode_output->enc_mask |= (1 << k);
                        }
 
@@ -1730,25 +1730,27 @@ drm_wakeup_handler(pointer data, int err, pointer p)
 Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp)
 {
        int i, num_dvi = 0, num_hdmi = 0;
+       drmModeResPtr mode_res;
 
        xf86CrtcConfigInit(pScrn, &drmmode_xf86crtc_config_funcs);
 
        drmmode->scrn = pScrn;
        drmmode->cpp = cpp;
-       drmmode->mode_res = drmModeGetResources(drmmode->fd);
-       if (!drmmode->mode_res)
+       mode_res = drmModeGetResources(drmmode->fd);
+       if (!mode_res)
                return FALSE;
 
-       xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width, 
drmmode->mode_res->max_height);
-       for (i = 0; i < drmmode->mode_res->count_crtcs; i++)
+       drmmode->count_crtcs = mode_res->count_crtcs;
+       xf86CrtcSetSizeRange(pScrn, 320, 200, mode_res->max_width, 
mode_res->max_height);
+       for (i = 0; i < mode_res->count_crtcs; i++)
                if (!xf86IsEntityShared(pScrn->entityList[0]) || 
pScrn->confScreen->device->screen == i)
-                       drmmode_crtc_init(pScrn, drmmode, i);
+                       drmmode_crtc_init(pScrn, drmmode, mode_res, i);
 
-       for (i = 0; i < drmmode->mode_res->count_connectors; i++)
-               drmmode_output_init(pScrn, drmmode, i, &num_dvi, &num_hdmi);
+       for (i = 0; i < mode_res->count_connectors; i++)
+               drmmode_output_init(pScrn, drmmode, mode_res, i, &num_dvi, 
&num_hdmi);
 
        /* workout clones */
-       drmmode_clones_init(pScrn, drmmode);
+       drmmode_clones_init(pScrn, drmmode, mode_res);
 
 #ifdef RADEON_PIXMAP_SHARING
        xf86ProviderSetup(pScrn, NULL, "radeon");
@@ -1760,6 +1762,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr 
drmmode, int cpp)
        drmmode->event_context.vblank_handler = drmmode_vblank_handler;
        drmmode->event_context.page_flip_handler = drmmode_flip_handler;
 
+       drmModeFreeResources(mode_res);
        return TRUE;
 }
 
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 41e29f6..2e83ed5 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -41,7 +41,6 @@
 typedef struct {
   int fd;
   unsigned fb_id;
-  drmModeResPtr mode_res;
   drmModeFBPtr mode_fb;
   int cpp;
   struct radeon_bo_manager *bufmgr;
@@ -51,6 +50,7 @@ typedef struct {
   InputHandlerProc uevent_handler;
 #endif
   drmEventContext event_context;
+  int count_crtcs;
 } drmmode_rec, *drmmode_ptr;
 
 typedef struct {
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 64e541f..56beeec 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -1581,7 +1581,7 @@ radeon_dri2_screen_init(ScreenPtr pScreen)
        scheduling_works = FALSE;
     }
 
-    if (scheduling_works && info->drmmode.mode_res->count_crtcs > 2) {
+    if (scheduling_works && info->drmmode.count_crtcs > 2) {
 #ifdef DRM_CAP_VBLANK_HIGH_CRTC
        uint64_t cap_value;
 
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index b6d11e8..c1a4dec 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -942,7 +942,7 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
        goto fail;
     }
 
-    if (info->drmmode.mode_res->count_crtcs == 1)
+    if (info->drmmode.count_crtcs == 1)
         pRADEONEnt->HasCRTC2 = FALSE;
     else
         pRADEONEnt->HasCRTC2 = TRUE;
-- 
1.9.3

_______________________________________________
xorg-driver-ati mailing list
xorg-driver-ati@lists.x.org
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to