From a43e3c8f1c6e91341632bf3ddb5e775214c66f04 Mon Sep 17 00:00:00 2001
From: Alberto Milone <alberto.milone@canonical.com>
Date: Wed, 14 Mar 2018 09:10:46 +0100
Subject: [PATCH 1/1] Add support for Linux 4.15

This fixes support for PRIME Synchronization (LP: #1752739).
---
 conftest.sh                       |  5 +++++
 nvidia-drm/nvidia-drm-connector.c |  5 +++++
 nvidia-drm/nvidia-drm-crtc.c      | 13 +++++++++++++
 nvidia-drm/nvidia-drm-modeset.c   | 25 +++++++++++++++++++++++++
 4 files changed, 48 insertions(+)

diff --git a/conftest.sh b/conftest.sh
index ce83b25..3695888 100755
--- a/conftest.sh
+++ b/conftest.sh
@@ -2124,6 +2124,7 @@ compile_test() {
             #endif
             #include <drm/drm_atomic.h>
             #include <drm/drm_atomic_helper.h>
+            #include <linux/version.h>
             #if !defined(CONFIG_DRM) && !defined(CONFIG_DRM_MODULE)
             #error DRM not enabled
             #endif
@@ -2147,8 +2148,12 @@ compile_test() {
                 /* 2014-12-18 88a48e297b3a3bac6022c03babfb038f1a886cea */
                 i = DRIVER_ATOMIC;
 
+                #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
                 /* 2015-04-10 df63b9994eaf942afcdb946d27a28661d7dfbf2a */
                 for_each_crtc_in_state(s, c, cs, i) { }
+                #else
+                for_each_new_crtc_in_state(s, c, cs, i) { }
+                #endif
 
                 /* 2015-05-18 036ef5733ba433760a3512bb5f7a155946e2df05 */
                 a = offsetof(struct drm_mode_config_funcs, atomic_state_alloc);
diff --git a/nvidia-drm/nvidia-drm-connector.c b/nvidia-drm/nvidia-drm-connector.c
index cf16b6f..a66ae5a 100644
--- a/nvidia-drm/nvidia-drm-connector.c
+++ b/nvidia-drm/nvidia-drm-connector.c
@@ -33,6 +33,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <linux/version.h>
 
 static void nv_drm_connector_destroy(struct drm_connector *connector)
 {
@@ -87,7 +88,11 @@ static enum drm_connector_status __nv_drm_connector_detect_internal(
             break;
         }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
         encoder = drm_encoder_find(dev, connector->encoder_ids[i]);
+#else
+        encoder = drm_encoder_find(dev, NULL, connector->encoder_ids[i]);
+#endif
 
         if (encoder == NULL) {
             BUG_ON(encoder != NULL);
diff --git a/nvidia-drm/nvidia-drm-crtc.c b/nvidia-drm/nvidia-drm-crtc.c
index b54128a..d820dc2 100644
--- a/nvidia-drm/nvidia-drm-crtc.c
+++ b/nvidia-drm/nvidia-drm-crtc.c
@@ -37,6 +37,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <linux/version.h>
 
 static const u32 nv_default_supported_plane_drm_formats[] = {
     DRM_FORMAT_ARGB1555,
@@ -141,7 +142,11 @@ static int nv_drm_plane_atomic_check(struct drm_plane *plane,
         goto done;
     }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
     for_each_crtc_in_state(plane_state->state, crtc, crtc_state, i) {
+#else
+    for_each_new_crtc_in_state(plane_state->state, crtc, crtc_state, i) {
+#endif
         struct nv_drm_crtc_state *nv_crtc_state = to_nv_crtc_state(crtc_state);
         struct NvKmsKapiHeadRequestedConfig *head_req_config =
             &nv_crtc_state->req_config;
@@ -365,7 +370,11 @@ static int nv_drm_crtc_atomic_check(struct drm_crtc *crtc,
 
         req_config->flags.displaysChanged = NV_TRUE;
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
         for_each_connector_in_state(crtc_state->state,
+#else
+        for_each_new_connector_in_state(crtc_state->state,
+#endif
                                     connector, connector_state, j) {
             if (connector_state->crtc != crtc) {
                 continue;
@@ -613,7 +622,11 @@ int nv_drm_get_crtc_crc32_ioctl(struct drm_device *dev,
         goto done;
     }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
     crtc = drm_crtc_find(dev, params->crtc_id);
+#else
+    crtc = drm_crtc_find(dev, NULL, params->crtc_id);
+#endif
     if (!crtc) {
         ret = -ENOENT;
         goto done;
diff --git a/nvidia-drm/nvidia-drm-modeset.c b/nvidia-drm/nvidia-drm-modeset.c
index da15d89..91f64ea 100644
--- a/nvidia-drm/nvidia-drm-modeset.c
+++ b/nvidia-drm/nvidia-drm-modeset.c
@@ -33,6 +33,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
+#include <linux/version.h>
 
 struct nv_drm_atomic_state {
     struct NvKmsKapiRequestedModeSetConfig config;
@@ -110,7 +111,11 @@ nv_drm_atomic_apply_modeset_config(struct drm_device *dev,
     memset(requested_config, 0, sizeof(*requested_config));
 
     /* Loop over affected crtcs and construct NvKmsKapiRequestedModeSetConfig */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
     for_each_crtc_in_state(state, crtc, crtc_state, i) {
+#else
+    for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+#endif
         /*
          * When commiting a state, the new state is already stored in
          * crtc->state. When checking a proposed state, the proposed state is
@@ -178,7 +183,11 @@ void nv_drm_atomic_helper_commit_tail(struct drm_atomic_state *state)
          nv_drm_write_combine_flush();
     }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
     for_each_crtc_in_state(state, crtc, crtc_state, i) {
+#else
+    for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+#endif
         struct nv_drm_crtc *nv_crtc = to_nv_crtc(crtc);
         struct nv_drm_crtc_state *nv_crtc_state = to_nv_crtc_state(crtc->state);
         struct nv_drm_flip *nv_flip = nv_crtc_state->nv_flip;
@@ -282,7 +291,11 @@ static void nv_drm_atomic_commit_task_callback(struct work_struct *work)
             ret);
     }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
     for_each_crtc_in_state(state, crtc, crtc_state, i) {
+#else
+    for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+#endif
         struct nv_drm_crtc *nv_crtc = to_nv_crtc(crtc);
 
         if (wait_event_timeout(
@@ -351,7 +364,11 @@ static int nv_drm_atomic_commit_internal(
          * condition between two/more nvKms->applyModeSetConfig() on single
          * crtc and generate flip events in correct order.
          */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
         for_each_crtc_in_state(state, crtc, crtc_state, i) {
+#else
+        for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+#endif
             struct nv_drm_device *nv_dev = to_nv_device(dev);
             struct nv_drm_crtc *nv_crtc = to_nv_crtc(crtc);
 
@@ -372,7 +389,11 @@ static int nv_drm_atomic_commit_internal(
             }
         }
     } else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
         for_each_crtc_in_state(state, crtc, crtc_state, i) {
+#else
+        for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+#endif
             struct nv_drm_crtc *nv_crtc = to_nv_crtc(crtc);
 
             if (atomic_read(&nv_crtc->has_pending_commit) ||
@@ -388,7 +409,11 @@ static int nv_drm_atomic_commit_internal(
      * flip events.
      */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
     for_each_crtc_in_state(state, crtc, crtc_state, i) {
+#else
+    for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
+#endif
         struct nv_drm_crtc *nv_crtc = to_nv_crtc(crtc);
 
         atomic_set(&nv_crtc->has_pending_commit, true);
-- 
2.7.4

