LCOV - code coverage report
Current view: top level - drivers/gpu/drm/i915 - i915_pci.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 14 59 23.7 %
Date: 2022-04-01 14:17:54 Functions: 1 5 20.0 %
Branches: 6 44 13.6 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright © 2016 Intel Corporation
       3                 :            :  *
       4                 :            :  * Permission is hereby granted, free of charge, to any person obtaining a
       5                 :            :  * copy of this software and associated documentation files (the "Software"),
       6                 :            :  * to deal in the Software without restriction, including without limitation
       7                 :            :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
       8                 :            :  * and/or sell copies of the Software, and to permit persons to whom the
       9                 :            :  * Software is furnished to do so, subject to the following conditions:
      10                 :            :  *
      11                 :            :  * The above copyright notice and this permission notice (including the next
      12                 :            :  * paragraph) shall be included in all copies or substantial portions of the
      13                 :            :  * Software.
      14                 :            :  *
      15                 :            :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      16                 :            :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      17                 :            :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      18                 :            :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      19                 :            :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      20                 :            :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
      21                 :            :  * IN THE SOFTWARE.
      22                 :            :  *
      23                 :            :  */
      24                 :            : 
      25                 :            : #include <linux/console.h>
      26                 :            : #include <linux/vga_switcheroo.h>
      27                 :            : 
      28                 :            : #include <drm/drm_drv.h>
      29                 :            : 
      30                 :            : #include "display/intel_fbdev.h"
      31                 :            : 
      32                 :            : #include "i915_drv.h"
      33                 :            : #include "i915_perf.h"
      34                 :            : #include "i915_globals.h"
      35                 :            : #include "i915_selftest.h"
      36                 :            : 
      37                 :            : #define PLATFORM(x) .platform = (x)
      38                 :            : #define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)
      39                 :            : 
      40                 :            : #define I845_PIPE_OFFSETS \
      41                 :            :         .pipe_offsets = { \
      42                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
      43                 :            :         }, \
      44                 :            :         .trans_offsets = { \
      45                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
      46                 :            :         }
      47                 :            : 
      48                 :            : #define I9XX_PIPE_OFFSETS \
      49                 :            :         .pipe_offsets = { \
      50                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
      51                 :            :                 [TRANSCODER_B] = PIPE_B_OFFSET, \
      52                 :            :         }, \
      53                 :            :         .trans_offsets = { \
      54                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
      55                 :            :                 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
      56                 :            :         }
      57                 :            : 
      58                 :            : #define IVB_PIPE_OFFSETS \
      59                 :            :         .pipe_offsets = { \
      60                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
      61                 :            :                 [TRANSCODER_B] = PIPE_B_OFFSET, \
      62                 :            :                 [TRANSCODER_C] = PIPE_C_OFFSET, \
      63                 :            :         }, \
      64                 :            :         .trans_offsets = { \
      65                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
      66                 :            :                 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
      67                 :            :                 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
      68                 :            :         }
      69                 :            : 
      70                 :            : #define HSW_PIPE_OFFSETS \
      71                 :            :         .pipe_offsets = { \
      72                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
      73                 :            :                 [TRANSCODER_B] = PIPE_B_OFFSET, \
      74                 :            :                 [TRANSCODER_C] = PIPE_C_OFFSET, \
      75                 :            :                 [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
      76                 :            :         }, \
      77                 :            :         .trans_offsets = { \
      78                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
      79                 :            :                 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
      80                 :            :                 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
      81                 :            :                 [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
      82                 :            :         }
      83                 :            : 
      84                 :            : #define CHV_PIPE_OFFSETS \
      85                 :            :         .pipe_offsets = { \
      86                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
      87                 :            :                 [TRANSCODER_B] = PIPE_B_OFFSET, \
      88                 :            :                 [TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
      89                 :            :         }, \
      90                 :            :         .trans_offsets = { \
      91                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
      92                 :            :                 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
      93                 :            :                 [TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
      94                 :            :         }
      95                 :            : 
      96                 :            : #define I845_CURSOR_OFFSETS \
      97                 :            :         .cursor_offsets = { \
      98                 :            :                 [PIPE_A] = CURSOR_A_OFFSET, \
      99                 :            :         }
     100                 :            : 
     101                 :            : #define I9XX_CURSOR_OFFSETS \
     102                 :            :         .cursor_offsets = { \
     103                 :            :                 [PIPE_A] = CURSOR_A_OFFSET, \
     104                 :            :                 [PIPE_B] = CURSOR_B_OFFSET, \
     105                 :            :         }
     106                 :            : 
     107                 :            : #define CHV_CURSOR_OFFSETS \
     108                 :            :         .cursor_offsets = { \
     109                 :            :                 [PIPE_A] = CURSOR_A_OFFSET, \
     110                 :            :                 [PIPE_B] = CURSOR_B_OFFSET, \
     111                 :            :                 [PIPE_C] = CHV_CURSOR_C_OFFSET, \
     112                 :            :         }
     113                 :            : 
     114                 :            : #define IVB_CURSOR_OFFSETS \
     115                 :            :         .cursor_offsets = { \
     116                 :            :                 [PIPE_A] = CURSOR_A_OFFSET, \
     117                 :            :                 [PIPE_B] = IVB_CURSOR_B_OFFSET, \
     118                 :            :                 [PIPE_C] = IVB_CURSOR_C_OFFSET, \
     119                 :            :         }
     120                 :            : 
     121                 :            : #define TGL_CURSOR_OFFSETS \
     122                 :            :         .cursor_offsets = { \
     123                 :            :                 [PIPE_A] = CURSOR_A_OFFSET, \
     124                 :            :                 [PIPE_B] = IVB_CURSOR_B_OFFSET, \
     125                 :            :                 [PIPE_C] = IVB_CURSOR_C_OFFSET, \
     126                 :            :                 [PIPE_D] = TGL_CURSOR_D_OFFSET, \
     127                 :            :         }
     128                 :            : 
     129                 :            : #define I9XX_COLORS \
     130                 :            :         .color = { .gamma_lut_size = 256 }
     131                 :            : #define I965_COLORS \
     132                 :            :         .color = { .gamma_lut_size = 129, \
     133                 :            :                    .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
     134                 :            :         }
     135                 :            : #define ILK_COLORS \
     136                 :            :         .color = { .gamma_lut_size = 1024 }
     137                 :            : #define IVB_COLORS \
     138                 :            :         .color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
     139                 :            : #define CHV_COLORS \
     140                 :            :         .color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \
     141                 :            :                    .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
     142                 :            :                    .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
     143                 :            :         }
     144                 :            : #define GLK_COLORS \
     145                 :            :         .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
     146                 :            :                    .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
     147                 :            :                                         DRM_COLOR_LUT_EQUAL_CHANNELS, \
     148                 :            :         }
     149                 :            : 
     150                 :            : /* Keep in gen based order, and chronological order within a gen */
     151                 :            : 
     152                 :            : #define GEN_DEFAULT_PAGE_SIZES \
     153                 :            :         .page_sizes = I915_GTT_PAGE_SIZE_4K
     154                 :            : 
     155                 :            : #define GEN_DEFAULT_REGIONS \
     156                 :            :         .memory_regions = REGION_SMEM | REGION_STOLEN
     157                 :            : 
     158                 :            : #define I830_FEATURES \
     159                 :            :         GEN(2), \
     160                 :            :         .is_mobile = 1, \
     161                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
     162                 :            :         .display.has_overlay = 1, \
     163                 :            :         .display.cursor_needs_physical = 1, \
     164                 :            :         .display.overlay_needs_physical = 1, \
     165                 :            :         .display.has_gmch = 1, \
     166                 :            :         .gpu_reset_clobbers_display = true, \
     167                 :            :         .hws_needs_physical = 1, \
     168                 :            :         .unfenced_needs_alignment = 1, \
     169                 :            :         .engine_mask = BIT(RCS0), \
     170                 :            :         .has_snoop = true, \
     171                 :            :         .has_coherent_ggtt = false, \
     172                 :            :         I9XX_PIPE_OFFSETS, \
     173                 :            :         I9XX_CURSOR_OFFSETS, \
     174                 :            :         I9XX_COLORS, \
     175                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     176                 :            :         GEN_DEFAULT_REGIONS
     177                 :            : 
     178                 :            : #define I845_FEATURES \
     179                 :            :         GEN(2), \
     180                 :            :         .pipe_mask = BIT(PIPE_A), \
     181                 :            :         .display.has_overlay = 1, \
     182                 :            :         .display.overlay_needs_physical = 1, \
     183                 :            :         .display.has_gmch = 1, \
     184                 :            :         .gpu_reset_clobbers_display = true, \
     185                 :            :         .hws_needs_physical = 1, \
     186                 :            :         .unfenced_needs_alignment = 1, \
     187                 :            :         .engine_mask = BIT(RCS0), \
     188                 :            :         .has_snoop = true, \
     189                 :            :         .has_coherent_ggtt = false, \
     190                 :            :         I845_PIPE_OFFSETS, \
     191                 :            :         I845_CURSOR_OFFSETS, \
     192                 :            :         I9XX_COLORS, \
     193                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     194                 :            :         GEN_DEFAULT_REGIONS
     195                 :            : 
     196                 :            : static const struct intel_device_info i830_info = {
     197                 :            :         I830_FEATURES,
     198                 :            :         PLATFORM(INTEL_I830),
     199                 :            : };
     200                 :            : 
     201                 :            : static const struct intel_device_info i845g_info = {
     202                 :            :         I845_FEATURES,
     203                 :            :         PLATFORM(INTEL_I845G),
     204                 :            : };
     205                 :            : 
     206                 :            : static const struct intel_device_info i85x_info = {
     207                 :            :         I830_FEATURES,
     208                 :            :         PLATFORM(INTEL_I85X),
     209                 :            :         .display.has_fbc = 1,
     210                 :            : };
     211                 :            : 
     212                 :            : static const struct intel_device_info i865g_info = {
     213                 :            :         I845_FEATURES,
     214                 :            :         PLATFORM(INTEL_I865G),
     215                 :            : };
     216                 :            : 
     217                 :            : #define GEN3_FEATURES \
     218                 :            :         GEN(3), \
     219                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
     220                 :            :         .display.has_gmch = 1, \
     221                 :            :         .gpu_reset_clobbers_display = true, \
     222                 :            :         .engine_mask = BIT(RCS0), \
     223                 :            :         .has_snoop = true, \
     224                 :            :         .has_coherent_ggtt = true, \
     225                 :            :         I9XX_PIPE_OFFSETS, \
     226                 :            :         I9XX_CURSOR_OFFSETS, \
     227                 :            :         I9XX_COLORS, \
     228                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     229                 :            :         GEN_DEFAULT_REGIONS
     230                 :            : 
     231                 :            : static const struct intel_device_info i915g_info = {
     232                 :            :         GEN3_FEATURES,
     233                 :            :         PLATFORM(INTEL_I915G),
     234                 :            :         .has_coherent_ggtt = false,
     235                 :            :         .display.cursor_needs_physical = 1,
     236                 :            :         .display.has_overlay = 1,
     237                 :            :         .display.overlay_needs_physical = 1,
     238                 :            :         .hws_needs_physical = 1,
     239                 :            :         .unfenced_needs_alignment = 1,
     240                 :            : };
     241                 :            : 
     242                 :            : static const struct intel_device_info i915gm_info = {
     243                 :            :         GEN3_FEATURES,
     244                 :            :         PLATFORM(INTEL_I915GM),
     245                 :            :         .is_mobile = 1,
     246                 :            :         .display.cursor_needs_physical = 1,
     247                 :            :         .display.has_overlay = 1,
     248                 :            :         .display.overlay_needs_physical = 1,
     249                 :            :         .display.supports_tv = 1,
     250                 :            :         .display.has_fbc = 1,
     251                 :            :         .hws_needs_physical = 1,
     252                 :            :         .unfenced_needs_alignment = 1,
     253                 :            : };
     254                 :            : 
     255                 :            : static const struct intel_device_info i945g_info = {
     256                 :            :         GEN3_FEATURES,
     257                 :            :         PLATFORM(INTEL_I945G),
     258                 :            :         .display.has_hotplug = 1,
     259                 :            :         .display.cursor_needs_physical = 1,
     260                 :            :         .display.has_overlay = 1,
     261                 :            :         .display.overlay_needs_physical = 1,
     262                 :            :         .hws_needs_physical = 1,
     263                 :            :         .unfenced_needs_alignment = 1,
     264                 :            : };
     265                 :            : 
     266                 :            : static const struct intel_device_info i945gm_info = {
     267                 :            :         GEN3_FEATURES,
     268                 :            :         PLATFORM(INTEL_I945GM),
     269                 :            :         .is_mobile = 1,
     270                 :            :         .display.has_hotplug = 1,
     271                 :            :         .display.cursor_needs_physical = 1,
     272                 :            :         .display.has_overlay = 1,
     273                 :            :         .display.overlay_needs_physical = 1,
     274                 :            :         .display.supports_tv = 1,
     275                 :            :         .display.has_fbc = 1,
     276                 :            :         .hws_needs_physical = 1,
     277                 :            :         .unfenced_needs_alignment = 1,
     278                 :            : };
     279                 :            : 
     280                 :            : static const struct intel_device_info g33_info = {
     281                 :            :         GEN3_FEATURES,
     282                 :            :         PLATFORM(INTEL_G33),
     283                 :            :         .display.has_hotplug = 1,
     284                 :            :         .display.has_overlay = 1,
     285                 :            : };
     286                 :            : 
     287                 :            : static const struct intel_device_info pnv_g_info = {
     288                 :            :         GEN3_FEATURES,
     289                 :            :         PLATFORM(INTEL_PINEVIEW),
     290                 :            :         .display.has_hotplug = 1,
     291                 :            :         .display.has_overlay = 1,
     292                 :            : };
     293                 :            : 
     294                 :            : static const struct intel_device_info pnv_m_info = {
     295                 :            :         GEN3_FEATURES,
     296                 :            :         PLATFORM(INTEL_PINEVIEW),
     297                 :            :         .is_mobile = 1,
     298                 :            :         .display.has_hotplug = 1,
     299                 :            :         .display.has_overlay = 1,
     300                 :            : };
     301                 :            : 
     302                 :            : #define GEN4_FEATURES \
     303                 :            :         GEN(4), \
     304                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
     305                 :            :         .display.has_hotplug = 1, \
     306                 :            :         .display.has_gmch = 1, \
     307                 :            :         .gpu_reset_clobbers_display = true, \
     308                 :            :         .engine_mask = BIT(RCS0), \
     309                 :            :         .has_snoop = true, \
     310                 :            :         .has_coherent_ggtt = true, \
     311                 :            :         I9XX_PIPE_OFFSETS, \
     312                 :            :         I9XX_CURSOR_OFFSETS, \
     313                 :            :         I965_COLORS, \
     314                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     315                 :            :         GEN_DEFAULT_REGIONS
     316                 :            : 
     317                 :            : static const struct intel_device_info i965g_info = {
     318                 :            :         GEN4_FEATURES,
     319                 :            :         PLATFORM(INTEL_I965G),
     320                 :            :         .display.has_overlay = 1,
     321                 :            :         .hws_needs_physical = 1,
     322                 :            :         .has_snoop = false,
     323                 :            : };
     324                 :            : 
     325                 :            : static const struct intel_device_info i965gm_info = {
     326                 :            :         GEN4_FEATURES,
     327                 :            :         PLATFORM(INTEL_I965GM),
     328                 :            :         .is_mobile = 1,
     329                 :            :         .display.has_fbc = 1,
     330                 :            :         .display.has_overlay = 1,
     331                 :            :         .display.supports_tv = 1,
     332                 :            :         .hws_needs_physical = 1,
     333                 :            :         .has_snoop = false,
     334                 :            : };
     335                 :            : 
     336                 :            : static const struct intel_device_info g45_info = {
     337                 :            :         GEN4_FEATURES,
     338                 :            :         PLATFORM(INTEL_G45),
     339                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0),
     340                 :            :         .gpu_reset_clobbers_display = false,
     341                 :            : };
     342                 :            : 
     343                 :            : static const struct intel_device_info gm45_info = {
     344                 :            :         GEN4_FEATURES,
     345                 :            :         PLATFORM(INTEL_GM45),
     346                 :            :         .is_mobile = 1,
     347                 :            :         .display.has_fbc = 1,
     348                 :            :         .display.supports_tv = 1,
     349                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0),
     350                 :            :         .gpu_reset_clobbers_display = false,
     351                 :            : };
     352                 :            : 
     353                 :            : #define GEN5_FEATURES \
     354                 :            :         GEN(5), \
     355                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
     356                 :            :         .display.has_hotplug = 1, \
     357                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0), \
     358                 :            :         .has_snoop = true, \
     359                 :            :         .has_coherent_ggtt = true, \
     360                 :            :         /* ilk does support rc6, but we do not implement [power] contexts */ \
     361                 :            :         .has_rc6 = 0, \
     362                 :            :         I9XX_PIPE_OFFSETS, \
     363                 :            :         I9XX_CURSOR_OFFSETS, \
     364                 :            :         ILK_COLORS, \
     365                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     366                 :            :         GEN_DEFAULT_REGIONS
     367                 :            : 
     368                 :            : static const struct intel_device_info ilk_d_info = {
     369                 :            :         GEN5_FEATURES,
     370                 :            :         PLATFORM(INTEL_IRONLAKE),
     371                 :            : };
     372                 :            : 
     373                 :            : static const struct intel_device_info ilk_m_info = {
     374                 :            :         GEN5_FEATURES,
     375                 :            :         PLATFORM(INTEL_IRONLAKE),
     376                 :            :         .is_mobile = 1,
     377                 :            :         .display.has_fbc = 1,
     378                 :            : };
     379                 :            : 
     380                 :            : #define GEN6_FEATURES \
     381                 :            :         GEN(6), \
     382                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
     383                 :            :         .display.has_hotplug = 1, \
     384                 :            :         .display.has_fbc = 1, \
     385                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
     386                 :            :         .has_coherent_ggtt = true, \
     387                 :            :         .has_llc = 1, \
     388                 :            :         .has_rc6 = 1, \
     389                 :            :         .has_rc6p = 1, \
     390                 :            :         .has_rps = true, \
     391                 :            :         .ppgtt_type = INTEL_PPGTT_ALIASING, \
     392                 :            :         .ppgtt_size = 31, \
     393                 :            :         I9XX_PIPE_OFFSETS, \
     394                 :            :         I9XX_CURSOR_OFFSETS, \
     395                 :            :         ILK_COLORS, \
     396                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     397                 :            :         GEN_DEFAULT_REGIONS
     398                 :            : 
     399                 :            : #define SNB_D_PLATFORM \
     400                 :            :         GEN6_FEATURES, \
     401                 :            :         PLATFORM(INTEL_SANDYBRIDGE)
     402                 :            : 
     403                 :            : static const struct intel_device_info snb_d_gt1_info = {
     404                 :            :         SNB_D_PLATFORM,
     405                 :            :         .gt = 1,
     406                 :            : };
     407                 :            : 
     408                 :            : static const struct intel_device_info snb_d_gt2_info = {
     409                 :            :         SNB_D_PLATFORM,
     410                 :            :         .gt = 2,
     411                 :            : };
     412                 :            : 
     413                 :            : #define SNB_M_PLATFORM \
     414                 :            :         GEN6_FEATURES, \
     415                 :            :         PLATFORM(INTEL_SANDYBRIDGE), \
     416                 :            :         .is_mobile = 1
     417                 :            : 
     418                 :            : 
     419                 :            : static const struct intel_device_info snb_m_gt1_info = {
     420                 :            :         SNB_M_PLATFORM,
     421                 :            :         .gt = 1,
     422                 :            : };
     423                 :            : 
     424                 :            : static const struct intel_device_info snb_m_gt2_info = {
     425                 :            :         SNB_M_PLATFORM,
     426                 :            :         .gt = 2,
     427                 :            : };
     428                 :            : 
     429                 :            : #define GEN7_FEATURES  \
     430                 :            :         GEN(7), \
     431                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
     432                 :            :         .display.has_hotplug = 1, \
     433                 :            :         .display.has_fbc = 1, \
     434                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
     435                 :            :         .has_coherent_ggtt = true, \
     436                 :            :         .has_llc = 1, \
     437                 :            :         .has_rc6 = 1, \
     438                 :            :         .has_rc6p = 1, \
     439                 :            :         .has_rps = true, \
     440                 :            :         .ppgtt_type = INTEL_PPGTT_ALIASING, \
     441                 :            :         .ppgtt_size = 31, \
     442                 :            :         IVB_PIPE_OFFSETS, \
     443                 :            :         IVB_CURSOR_OFFSETS, \
     444                 :            :         IVB_COLORS, \
     445                 :            :         GEN_DEFAULT_PAGE_SIZES, \
     446                 :            :         GEN_DEFAULT_REGIONS
     447                 :            : 
     448                 :            : #define IVB_D_PLATFORM \
     449                 :            :         GEN7_FEATURES, \
     450                 :            :         PLATFORM(INTEL_IVYBRIDGE), \
     451                 :            :         .has_l3_dpf = 1
     452                 :            : 
     453                 :            : static const struct intel_device_info ivb_d_gt1_info = {
     454                 :            :         IVB_D_PLATFORM,
     455                 :            :         .gt = 1,
     456                 :            : };
     457                 :            : 
     458                 :            : static const struct intel_device_info ivb_d_gt2_info = {
     459                 :            :         IVB_D_PLATFORM,
     460                 :            :         .gt = 2,
     461                 :            : };
     462                 :            : 
     463                 :            : #define IVB_M_PLATFORM \
     464                 :            :         GEN7_FEATURES, \
     465                 :            :         PLATFORM(INTEL_IVYBRIDGE), \
     466                 :            :         .is_mobile = 1, \
     467                 :            :         .has_l3_dpf = 1
     468                 :            : 
     469                 :            : static const struct intel_device_info ivb_m_gt1_info = {
     470                 :            :         IVB_M_PLATFORM,
     471                 :            :         .gt = 1,
     472                 :            : };
     473                 :            : 
     474                 :            : static const struct intel_device_info ivb_m_gt2_info = {
     475                 :            :         IVB_M_PLATFORM,
     476                 :            :         .gt = 2,
     477                 :            : };
     478                 :            : 
     479                 :            : static const struct intel_device_info ivb_q_info = {
     480                 :            :         GEN7_FEATURES,
     481                 :            :         PLATFORM(INTEL_IVYBRIDGE),
     482                 :            :         .gt = 2,
     483                 :            :         .pipe_mask = 0, /* legal, last one wins */
     484                 :            :         .has_l3_dpf = 1,
     485                 :            : };
     486                 :            : 
     487                 :            : static const struct intel_device_info vlv_info = {
     488                 :            :         PLATFORM(INTEL_VALLEYVIEW),
     489                 :            :         GEN(7),
     490                 :            :         .is_lp = 1,
     491                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
     492                 :            :         .has_runtime_pm = 1,
     493                 :            :         .has_rc6 = 1,
     494                 :            :         .has_rps = true,
     495                 :            :         .display.has_gmch = 1,
     496                 :            :         .display.has_hotplug = 1,
     497                 :            :         .ppgtt_type = INTEL_PPGTT_ALIASING,
     498                 :            :         .ppgtt_size = 31,
     499                 :            :         .has_snoop = true,
     500                 :            :         .has_coherent_ggtt = false,
     501                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
     502                 :            :         .display_mmio_offset = VLV_DISPLAY_BASE,
     503                 :            :         I9XX_PIPE_OFFSETS,
     504                 :            :         I9XX_CURSOR_OFFSETS,
     505                 :            :         I965_COLORS,
     506                 :            :         GEN_DEFAULT_PAGE_SIZES,
     507                 :            :         GEN_DEFAULT_REGIONS,
     508                 :            : };
     509                 :            : 
     510                 :            : #define G75_FEATURES  \
     511                 :            :         GEN7_FEATURES, \
     512                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
     513                 :            :         .display.has_ddi = 1, \
     514                 :            :         .has_fpga_dbg = 1, \
     515                 :            :         .display.has_psr = 1, \
     516                 :            :         .display.has_dp_mst = 1, \
     517                 :            :         .has_rc6p = 0 /* RC6p removed-by HSW */, \
     518                 :            :         HSW_PIPE_OFFSETS, \
     519                 :            :         .has_runtime_pm = 1
     520                 :            : 
     521                 :            : #define HSW_PLATFORM \
     522                 :            :         G75_FEATURES, \
     523                 :            :         PLATFORM(INTEL_HASWELL), \
     524                 :            :         .has_l3_dpf = 1
     525                 :            : 
     526                 :            : static const struct intel_device_info hsw_gt1_info = {
     527                 :            :         HSW_PLATFORM,
     528                 :            :         .gt = 1,
     529                 :            : };
     530                 :            : 
     531                 :            : static const struct intel_device_info hsw_gt2_info = {
     532                 :            :         HSW_PLATFORM,
     533                 :            :         .gt = 2,
     534                 :            : };
     535                 :            : 
     536                 :            : static const struct intel_device_info hsw_gt3_info = {
     537                 :            :         HSW_PLATFORM,
     538                 :            :         .gt = 3,
     539                 :            : };
     540                 :            : 
     541                 :            : #define GEN8_FEATURES \
     542                 :            :         G75_FEATURES, \
     543                 :            :         GEN(8), \
     544                 :            :         .has_logical_ring_contexts = 1, \
     545                 :            :         .ppgtt_type = INTEL_PPGTT_FULL, \
     546                 :            :         .ppgtt_size = 48, \
     547                 :            :         .has_64bit_reloc = 1, \
     548                 :            :         .has_reset_engine = 1
     549                 :            : 
     550                 :            : #define BDW_PLATFORM \
     551                 :            :         GEN8_FEATURES, \
     552                 :            :         PLATFORM(INTEL_BROADWELL)
     553                 :            : 
     554                 :            : static const struct intel_device_info bdw_gt1_info = {
     555                 :            :         BDW_PLATFORM,
     556                 :            :         .gt = 1,
     557                 :            : };
     558                 :            : 
     559                 :            : static const struct intel_device_info bdw_gt2_info = {
     560                 :            :         BDW_PLATFORM,
     561                 :            :         .gt = 2,
     562                 :            : };
     563                 :            : 
     564                 :            : static const struct intel_device_info bdw_rsvd_info = {
     565                 :            :         BDW_PLATFORM,
     566                 :            :         .gt = 3,
     567                 :            :         /* According to the device ID those devices are GT3, they were
     568                 :            :          * previously treated as not GT3, keep it like that.
     569                 :            :          */
     570                 :            : };
     571                 :            : 
     572                 :            : static const struct intel_device_info bdw_gt3_info = {
     573                 :            :         BDW_PLATFORM,
     574                 :            :         .gt = 3,
     575                 :            :         .engine_mask =
     576                 :            :                 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
     577                 :            : };
     578                 :            : 
     579                 :            : static const struct intel_device_info chv_info = {
     580                 :            :         PLATFORM(INTEL_CHERRYVIEW),
     581                 :            :         GEN(8),
     582                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
     583                 :            :         .display.has_hotplug = 1,
     584                 :            :         .is_lp = 1,
     585                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
     586                 :            :         .has_64bit_reloc = 1,
     587                 :            :         .has_runtime_pm = 1,
     588                 :            :         .has_rc6 = 1,
     589                 :            :         .has_rps = true,
     590                 :            :         .has_logical_ring_contexts = 1,
     591                 :            :         .display.has_gmch = 1,
     592                 :            :         .ppgtt_type = INTEL_PPGTT_ALIASING,
     593                 :            :         .ppgtt_size = 32,
     594                 :            :         .has_reset_engine = 1,
     595                 :            :         .has_snoop = true,
     596                 :            :         .has_coherent_ggtt = false,
     597                 :            :         .display_mmio_offset = VLV_DISPLAY_BASE,
     598                 :            :         CHV_PIPE_OFFSETS,
     599                 :            :         CHV_CURSOR_OFFSETS,
     600                 :            :         CHV_COLORS,
     601                 :            :         GEN_DEFAULT_PAGE_SIZES,
     602                 :            :         GEN_DEFAULT_REGIONS,
     603                 :            : };
     604                 :            : 
     605                 :            : #define GEN9_DEFAULT_PAGE_SIZES \
     606                 :            :         .page_sizes = I915_GTT_PAGE_SIZE_4K | \
     607                 :            :                       I915_GTT_PAGE_SIZE_64K
     608                 :            : 
     609                 :            : #define GEN9_FEATURES \
     610                 :            :         GEN8_FEATURES, \
     611                 :            :         GEN(9), \
     612                 :            :         GEN9_DEFAULT_PAGE_SIZES, \
     613                 :            :         .has_logical_ring_preemption = 1, \
     614                 :            :         .display.has_csr = 1, \
     615                 :            :         .has_gt_uc = 1, \
     616                 :            :         .display.has_hdcp = 1, \
     617                 :            :         .display.has_ipc = 1, \
     618                 :            :         .ddb_size = 896
     619                 :            : 
     620                 :            : #define SKL_PLATFORM \
     621                 :            :         GEN9_FEATURES, \
     622                 :            :         PLATFORM(INTEL_SKYLAKE)
     623                 :            : 
     624                 :            : static const struct intel_device_info skl_gt1_info = {
     625                 :            :         SKL_PLATFORM,
     626                 :            :         .gt = 1,
     627                 :            : };
     628                 :            : 
     629                 :            : static const struct intel_device_info skl_gt2_info = {
     630                 :            :         SKL_PLATFORM,
     631                 :            :         .gt = 2,
     632                 :            : };
     633                 :            : 
     634                 :            : #define SKL_GT3_PLUS_PLATFORM \
     635                 :            :         SKL_PLATFORM, \
     636                 :            :         .engine_mask = \
     637                 :            :                 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
     638                 :            : 
     639                 :            : 
     640                 :            : static const struct intel_device_info skl_gt3_info = {
     641                 :            :         SKL_GT3_PLUS_PLATFORM,
     642                 :            :         .gt = 3,
     643                 :            : };
     644                 :            : 
     645                 :            : static const struct intel_device_info skl_gt4_info = {
     646                 :            :         SKL_GT3_PLUS_PLATFORM,
     647                 :            :         .gt = 4,
     648                 :            : };
     649                 :            : 
     650                 :            : #define GEN9_LP_FEATURES \
     651                 :            :         GEN(9), \
     652                 :            :         .is_lp = 1, \
     653                 :            :         .display.has_hotplug = 1, \
     654                 :            :         .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
     655                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
     656                 :            :         .has_64bit_reloc = 1, \
     657                 :            :         .display.has_ddi = 1, \
     658                 :            :         .has_fpga_dbg = 1, \
     659                 :            :         .display.has_fbc = 1, \
     660                 :            :         .display.has_hdcp = 1, \
     661                 :            :         .display.has_psr = 1, \
     662                 :            :         .has_runtime_pm = 1, \
     663                 :            :         .display.has_csr = 1, \
     664                 :            :         .has_rc6 = 1, \
     665                 :            :         .has_rps = true, \
     666                 :            :         .display.has_dp_mst = 1, \
     667                 :            :         .has_logical_ring_contexts = 1, \
     668                 :            :         .has_logical_ring_preemption = 1, \
     669                 :            :         .has_gt_uc = 1, \
     670                 :            :         .ppgtt_type = INTEL_PPGTT_FULL, \
     671                 :            :         .ppgtt_size = 48, \
     672                 :            :         .has_reset_engine = 1, \
     673                 :            :         .has_snoop = true, \
     674                 :            :         .has_coherent_ggtt = false, \
     675                 :            :         .display.has_ipc = 1, \
     676                 :            :         HSW_PIPE_OFFSETS, \
     677                 :            :         IVB_CURSOR_OFFSETS, \
     678                 :            :         IVB_COLORS, \
     679                 :            :         GEN9_DEFAULT_PAGE_SIZES, \
     680                 :            :         GEN_DEFAULT_REGIONS
     681                 :            : 
     682                 :            : static const struct intel_device_info bxt_info = {
     683                 :            :         GEN9_LP_FEATURES,
     684                 :            :         PLATFORM(INTEL_BROXTON),
     685                 :            :         .ddb_size = 512,
     686                 :            : };
     687                 :            : 
     688                 :            : static const struct intel_device_info glk_info = {
     689                 :            :         GEN9_LP_FEATURES,
     690                 :            :         PLATFORM(INTEL_GEMINILAKE),
     691                 :            :         .ddb_size = 1024,
     692                 :            :         GLK_COLORS,
     693                 :            : };
     694                 :            : 
     695                 :            : #define KBL_PLATFORM \
     696                 :            :         GEN9_FEATURES, \
     697                 :            :         PLATFORM(INTEL_KABYLAKE)
     698                 :            : 
     699                 :            : static const struct intel_device_info kbl_gt1_info = {
     700                 :            :         KBL_PLATFORM,
     701                 :            :         .gt = 1,
     702                 :            : };
     703                 :            : 
     704                 :            : static const struct intel_device_info kbl_gt2_info = {
     705                 :            :         KBL_PLATFORM,
     706                 :            :         .gt = 2,
     707                 :            : };
     708                 :            : 
     709                 :            : static const struct intel_device_info kbl_gt3_info = {
     710                 :            :         KBL_PLATFORM,
     711                 :            :         .gt = 3,
     712                 :            :         .engine_mask =
     713                 :            :                 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
     714                 :            : };
     715                 :            : 
     716                 :            : #define CFL_PLATFORM \
     717                 :            :         GEN9_FEATURES, \
     718                 :            :         PLATFORM(INTEL_COFFEELAKE)
     719                 :            : 
     720                 :            : static const struct intel_device_info cfl_gt1_info = {
     721                 :            :         CFL_PLATFORM,
     722                 :            :         .gt = 1,
     723                 :            : };
     724                 :            : 
     725                 :            : static const struct intel_device_info cfl_gt2_info = {
     726                 :            :         CFL_PLATFORM,
     727                 :            :         .gt = 2,
     728                 :            : };
     729                 :            : 
     730                 :            : static const struct intel_device_info cfl_gt3_info = {
     731                 :            :         CFL_PLATFORM,
     732                 :            :         .gt = 3,
     733                 :            :         .engine_mask =
     734                 :            :                 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
     735                 :            : };
     736                 :            : 
     737                 :            : #define GEN10_FEATURES \
     738                 :            :         GEN9_FEATURES, \
     739                 :            :         GEN(10), \
     740                 :            :         .ddb_size = 1024, \
     741                 :            :         .display.has_dsc = 1, \
     742                 :            :         .has_coherent_ggtt = false, \
     743                 :            :         GLK_COLORS
     744                 :            : 
     745                 :            : static const struct intel_device_info cnl_info = {
     746                 :            :         GEN10_FEATURES,
     747                 :            :         PLATFORM(INTEL_CANNONLAKE),
     748                 :            :         .gt = 2,
     749                 :            : };
     750                 :            : 
     751                 :            : #define GEN11_DEFAULT_PAGE_SIZES \
     752                 :            :         .page_sizes = I915_GTT_PAGE_SIZE_4K | \
     753                 :            :                       I915_GTT_PAGE_SIZE_64K | \
     754                 :            :                       I915_GTT_PAGE_SIZE_2M
     755                 :            : 
     756                 :            : #define GEN11_FEATURES \
     757                 :            :         GEN10_FEATURES, \
     758                 :            :         GEN11_DEFAULT_PAGE_SIZES, \
     759                 :            :         .pipe_offsets = { \
     760                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
     761                 :            :                 [TRANSCODER_B] = PIPE_B_OFFSET, \
     762                 :            :                 [TRANSCODER_C] = PIPE_C_OFFSET, \
     763                 :            :                 [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
     764                 :            :                 [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
     765                 :            :                 [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
     766                 :            :         }, \
     767                 :            :         .trans_offsets = { \
     768                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
     769                 :            :                 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
     770                 :            :                 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
     771                 :            :                 [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
     772                 :            :                 [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
     773                 :            :                 [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
     774                 :            :         }, \
     775                 :            :         GEN(11), \
     776                 :            :         .ddb_size = 2048, \
     777                 :            :         .has_logical_ring_elsq = 1, \
     778                 :            :         .color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
     779                 :            : 
     780                 :            : static const struct intel_device_info icl_info = {
     781                 :            :         GEN11_FEATURES,
     782                 :            :         PLATFORM(INTEL_ICELAKE),
     783                 :            :         .engine_mask =
     784                 :            :                 BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
     785                 :            : };
     786                 :            : 
     787                 :            : static const struct intel_device_info ehl_info = {
     788                 :            :         GEN11_FEATURES,
     789                 :            :         PLATFORM(INTEL_ELKHARTLAKE),
     790                 :            :         .require_force_probe = 1,
     791                 :            :         .engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
     792                 :            :         .ppgtt_size = 36,
     793                 :            : };
     794                 :            : 
     795                 :            : #define GEN12_FEATURES \
     796                 :            :         GEN11_FEATURES, \
     797                 :            :         GEN(12), \
     798                 :            :         .pipe_offsets = { \
     799                 :            :                 [TRANSCODER_A] = PIPE_A_OFFSET, \
     800                 :            :                 [TRANSCODER_B] = PIPE_B_OFFSET, \
     801                 :            :                 [TRANSCODER_C] = PIPE_C_OFFSET, \
     802                 :            :                 [TRANSCODER_D] = PIPE_D_OFFSET, \
     803                 :            :                 [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
     804                 :            :                 [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
     805                 :            :         }, \
     806                 :            :         .trans_offsets = { \
     807                 :            :                 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
     808                 :            :                 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
     809                 :            :                 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
     810                 :            :                 [TRANSCODER_D] = TRANSCODER_D_OFFSET, \
     811                 :            :                 [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
     812                 :            :                 [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
     813                 :            :         }, \
     814                 :            :         TGL_CURSOR_OFFSETS, \
     815                 :            :         .has_global_mocs = 1, \
     816                 :            :         .display.has_dsb = 1
     817                 :            : 
     818                 :            : static const struct intel_device_info tgl_info = {
     819                 :            :         GEN12_FEATURES,
     820                 :            :         PLATFORM(INTEL_TIGERLAKE),
     821                 :            :         .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
     822                 :            :         .require_force_probe = 1,
     823                 :            :         .display.has_modular_fia = 1,
     824                 :            :         .engine_mask =
     825                 :            :                 BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
     826                 :            :         .has_rps = false, /* XXX disabled for debugging */
     827                 :            : };
     828                 :            : 
     829                 :            : #define GEN12_DGFX_FEATURES \
     830                 :            :         GEN12_FEATURES, \
     831                 :            :         .is_dgfx = 1
     832                 :            : 
     833                 :            : #undef GEN
     834                 :            : #undef PLATFORM
     835                 :            : 
     836                 :            : /*
     837                 :            :  * Make sure any device matches here are from most specific to most
     838                 :            :  * general.  For example, since the Quanta match is based on the subsystem
     839                 :            :  * and subvendor IDs, we need it to come before the more general IVB
     840                 :            :  * PCI ID matches, otherwise we'll use the wrong info struct above.
     841                 :            :  */
     842                 :            : static const struct pci_device_id pciidlist[] = {
     843                 :            :         INTEL_I830_IDS(&i830_info),
     844                 :            :         INTEL_I845G_IDS(&i845g_info),
     845                 :            :         INTEL_I85X_IDS(&i85x_info),
     846                 :            :         INTEL_I865G_IDS(&i865g_info),
     847                 :            :         INTEL_I915G_IDS(&i915g_info),
     848                 :            :         INTEL_I915GM_IDS(&i915gm_info),
     849                 :            :         INTEL_I945G_IDS(&i945g_info),
     850                 :            :         INTEL_I945GM_IDS(&i945gm_info),
     851                 :            :         INTEL_I965G_IDS(&i965g_info),
     852                 :            :         INTEL_G33_IDS(&g33_info),
     853                 :            :         INTEL_I965GM_IDS(&i965gm_info),
     854                 :            :         INTEL_GM45_IDS(&gm45_info),
     855                 :            :         INTEL_G45_IDS(&g45_info),
     856                 :            :         INTEL_PINEVIEW_G_IDS(&pnv_g_info),
     857                 :            :         INTEL_PINEVIEW_M_IDS(&pnv_m_info),
     858                 :            :         INTEL_IRONLAKE_D_IDS(&ilk_d_info),
     859                 :            :         INTEL_IRONLAKE_M_IDS(&ilk_m_info),
     860                 :            :         INTEL_SNB_D_GT1_IDS(&snb_d_gt1_info),
     861                 :            :         INTEL_SNB_D_GT2_IDS(&snb_d_gt2_info),
     862                 :            :         INTEL_SNB_M_GT1_IDS(&snb_m_gt1_info),
     863                 :            :         INTEL_SNB_M_GT2_IDS(&snb_m_gt2_info),
     864                 :            :         INTEL_IVB_Q_IDS(&ivb_q_info), /* must be first IVB */
     865                 :            :         INTEL_IVB_M_GT1_IDS(&ivb_m_gt1_info),
     866                 :            :         INTEL_IVB_M_GT2_IDS(&ivb_m_gt2_info),
     867                 :            :         INTEL_IVB_D_GT1_IDS(&ivb_d_gt1_info),
     868                 :            :         INTEL_IVB_D_GT2_IDS(&ivb_d_gt2_info),
     869                 :            :         INTEL_HSW_GT1_IDS(&hsw_gt1_info),
     870                 :            :         INTEL_HSW_GT2_IDS(&hsw_gt2_info),
     871                 :            :         INTEL_HSW_GT3_IDS(&hsw_gt3_info),
     872                 :            :         INTEL_VLV_IDS(&vlv_info),
     873                 :            :         INTEL_BDW_GT1_IDS(&bdw_gt1_info),
     874                 :            :         INTEL_BDW_GT2_IDS(&bdw_gt2_info),
     875                 :            :         INTEL_BDW_GT3_IDS(&bdw_gt3_info),
     876                 :            :         INTEL_BDW_RSVD_IDS(&bdw_rsvd_info),
     877                 :            :         INTEL_CHV_IDS(&chv_info),
     878                 :            :         INTEL_SKL_GT1_IDS(&skl_gt1_info),
     879                 :            :         INTEL_SKL_GT2_IDS(&skl_gt2_info),
     880                 :            :         INTEL_SKL_GT3_IDS(&skl_gt3_info),
     881                 :            :         INTEL_SKL_GT4_IDS(&skl_gt4_info),
     882                 :            :         INTEL_BXT_IDS(&bxt_info),
     883                 :            :         INTEL_GLK_IDS(&glk_info),
     884                 :            :         INTEL_KBL_GT1_IDS(&kbl_gt1_info),
     885                 :            :         INTEL_KBL_GT2_IDS(&kbl_gt2_info),
     886                 :            :         INTEL_KBL_GT3_IDS(&kbl_gt3_info),
     887                 :            :         INTEL_KBL_GT4_IDS(&kbl_gt3_info),
     888                 :            :         INTEL_AML_KBL_GT2_IDS(&kbl_gt2_info),
     889                 :            :         INTEL_CFL_S_GT1_IDS(&cfl_gt1_info),
     890                 :            :         INTEL_CFL_S_GT2_IDS(&cfl_gt2_info),
     891                 :            :         INTEL_CFL_H_GT1_IDS(&cfl_gt1_info),
     892                 :            :         INTEL_CFL_H_GT2_IDS(&cfl_gt2_info),
     893                 :            :         INTEL_CFL_U_GT2_IDS(&cfl_gt2_info),
     894                 :            :         INTEL_CFL_U_GT3_IDS(&cfl_gt3_info),
     895                 :            :         INTEL_WHL_U_GT1_IDS(&cfl_gt1_info),
     896                 :            :         INTEL_WHL_U_GT2_IDS(&cfl_gt2_info),
     897                 :            :         INTEL_AML_CFL_GT2_IDS(&cfl_gt2_info),
     898                 :            :         INTEL_WHL_U_GT3_IDS(&cfl_gt3_info),
     899                 :            :         INTEL_CML_GT1_IDS(&cfl_gt1_info),
     900                 :            :         INTEL_CML_GT2_IDS(&cfl_gt2_info),
     901                 :            :         INTEL_CML_U_GT1_IDS(&cfl_gt1_info),
     902                 :            :         INTEL_CML_U_GT2_IDS(&cfl_gt2_info),
     903                 :            :         INTEL_CNL_IDS(&cnl_info),
     904                 :            :         INTEL_ICL_11_IDS(&icl_info),
     905                 :            :         INTEL_EHL_IDS(&ehl_info),
     906                 :            :         INTEL_TGL_12_IDS(&tgl_info),
     907                 :            :         {0, 0, 0}
     908                 :            : };
     909                 :            : MODULE_DEVICE_TABLE(pci, pciidlist);
     910                 :            : 
     911                 :          0 : static void i915_pci_remove(struct pci_dev *pdev)
     912                 :            : {
     913                 :          0 :         struct drm_i915_private *i915;
     914                 :            : 
     915         [ #  # ]:          0 :         i915 = pci_get_drvdata(pdev);
     916         [ #  # ]:          0 :         if (!i915) /* driver load aborted, nothing to cleanup */
     917                 :            :                 return;
     918                 :            : 
     919                 :          0 :         i915_driver_remove(i915);
     920                 :          0 :         pci_set_drvdata(pdev, NULL);
     921                 :            : 
     922                 :          0 :         drm_dev_put(&i915->drm);
     923                 :            : }
     924                 :            : 
     925                 :            : /* is device_id present in comma separated list of ids */
     926                 :          0 : static bool force_probe(u16 device_id, const char *devices)
     927                 :            : {
     928                 :          0 :         char *s, *p, *tok;
     929                 :          0 :         bool ret;
     930                 :            : 
     931                 :            :         /* FIXME: transitional */
     932         [ #  # ]:          0 :         if (i915_modparams.alpha_support) {
     933                 :          0 :                 DRM_INFO("i915.alpha_support is deprecated, use i915.force_probe=%04x instead\n",
     934                 :            :                          device_id);
     935                 :          0 :                 return true;
     936                 :            :         }
     937                 :            : 
     938   [ #  #  #  # ]:          0 :         if (!devices || !*devices)
     939                 :            :                 return false;
     940                 :            : 
     941                 :            :         /* match everything */
     942         [ #  # ]:          0 :         if (strcmp(devices, "*") == 0)
     943                 :            :                 return true;
     944                 :            : 
     945                 :          0 :         s = kstrdup(devices, GFP_KERNEL);
     946         [ #  # ]:          0 :         if (!s)
     947                 :            :                 return false;
     948                 :            : 
     949         [ #  # ]:          0 :         for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
     950                 :          0 :                 u16 val;
     951                 :            : 
     952   [ #  #  #  # ]:          0 :                 if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
     953                 :          0 :                         ret = true;
     954                 :          0 :                         break;
     955                 :            :                 }
     956                 :            :         }
     957                 :            : 
     958                 :          0 :         kfree(s);
     959                 :            : 
     960                 :          0 :         return ret;
     961                 :            : }
     962                 :            : 
     963                 :          0 : static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
     964                 :            : {
     965                 :          0 :         struct intel_device_info *intel_info =
     966                 :          0 :                 (struct intel_device_info *) ent->driver_data;
     967                 :          0 :         int err;
     968                 :            : 
     969   [ #  #  #  # ]:          0 :         if (intel_info->require_force_probe &&
     970                 :          0 :             !force_probe(pdev->device, i915_modparams.force_probe)) {
     971                 :          0 :                 DRM_INFO("Your graphics device %04x is not properly supported by the driver in this\n"
     972                 :            :                          "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
     973                 :            :                          "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
     974                 :            :                          "or (recommended) check for kernel updates.\n",
     975                 :            :                          pdev->device, pdev->device, pdev->device);
     976                 :          0 :                 return -ENODEV;
     977                 :            :         }
     978                 :            : 
     979                 :            :         /* Only bind to function 0 of the device. Early generations
     980                 :            :          * used function 1 as a placeholder for multi-head. This causes
     981                 :            :          * us confusion instead, especially on the systems where both
     982                 :            :          * functions have the same PCI-ID!
     983                 :            :          */
     984         [ #  # ]:          0 :         if (PCI_FUNC(pdev->devfn))
     985                 :            :                 return -ENODEV;
     986                 :            : 
     987                 :            :         /*
     988                 :            :          * apple-gmux is needed on dual GPU MacBook Pro
     989                 :            :          * to probe the panel if we're the inactive GPU.
     990                 :            :          */
     991                 :          0 :         if (vga_switcheroo_client_probe_defer(pdev))
     992                 :            :                 return -EPROBE_DEFER;
     993                 :            : 
     994                 :          0 :         err = i915_driver_probe(pdev, ent);
     995         [ #  # ]:          0 :         if (err)
     996                 :          0 :                 return err;
     997                 :            : 
     998                 :            :         if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
     999                 :            :                 i915_pci_remove(pdev);
    1000                 :            :                 return -ENODEV;
    1001                 :            :         }
    1002                 :            : 
    1003                 :            :         err = i915_live_selftests(pdev);
    1004                 :            :         if (err) {
    1005                 :            :                 i915_pci_remove(pdev);
    1006                 :            :                 return err > 0 ? -ENOTTY : err;
    1007                 :            :         }
    1008                 :            : 
    1009                 :            :         err = i915_perf_selftests(pdev);
    1010                 :            :         if (err) {
    1011                 :            :                 i915_pci_remove(pdev);
    1012                 :            :                 return err > 0 ? -ENOTTY : err;
    1013                 :            :         }
    1014                 :            : 
    1015                 :            :         return 0;
    1016                 :            : }
    1017                 :            : 
    1018                 :            : static struct pci_driver i915_pci_driver = {
    1019                 :            :         .name = DRIVER_NAME,
    1020                 :            :         .id_table = pciidlist,
    1021                 :            :         .probe = i915_pci_probe,
    1022                 :            :         .remove = i915_pci_remove,
    1023                 :            :         .driver.pm = &i915_pm_ops,
    1024                 :            : };
    1025                 :            : 
    1026                 :         11 : static int __init i915_init(void)
    1027                 :            : {
    1028                 :         11 :         bool use_kms = true;
    1029                 :         11 :         int err;
    1030                 :            : 
    1031                 :         11 :         err = i915_globals_init();
    1032         [ +  - ]:         11 :         if (err)
    1033                 :            :                 return err;
    1034                 :            : 
    1035         [ -  + ]:         11 :         err = i915_mock_selftests();
    1036                 :         11 :         if (err)
    1037                 :            :                 return err > 0 ? 0 : err;
    1038                 :            : 
    1039                 :            :         /*
    1040                 :            :          * Enable KMS by default, unless explicitly overriden by
    1041                 :            :          * either the i915.modeset prarameter or by the
    1042                 :            :          * vga_text_mode_force boot option.
    1043                 :            :          */
    1044                 :            : 
    1045         [ -  + ]:         11 :         if (i915_modparams.modeset == 0)
    1046                 :          0 :                 use_kms = false;
    1047                 :            : 
    1048   [ -  +  -  - ]:         11 :         if (vgacon_text_force() && i915_modparams.modeset == -1)
    1049                 :            :                 use_kms = false;
    1050                 :            : 
    1051         [ -  + ]:         11 :         if (!use_kms) {
    1052                 :            :                 /* Silently fail loading to not upset userspace. */
    1053                 :          0 :                 DRM_DEBUG_DRIVER("KMS disabled.\n");
    1054                 :          0 :                 return 0;
    1055                 :            :         }
    1056                 :            : 
    1057                 :         11 :         err = pci_register_driver(&i915_pci_driver);
    1058         [ +  - ]:         11 :         if (err)
    1059                 :            :                 return err;
    1060                 :            : 
    1061                 :         11 :         i915_perf_sysctl_register();
    1062                 :         11 :         return 0;
    1063                 :            : }
    1064                 :            : 
    1065                 :          0 : static void __exit i915_exit(void)
    1066                 :            : {
    1067         [ #  # ]:          0 :         if (!i915_pci_driver.driver.owner)
    1068                 :            :                 return;
    1069                 :            : 
    1070                 :          0 :         i915_perf_sysctl_unregister();
    1071                 :          0 :         pci_unregister_driver(&i915_pci_driver);
    1072                 :          0 :         i915_globals_exit();
    1073                 :            : }
    1074                 :            : 
    1075                 :            : module_init(i915_init);
    1076                 :            : module_exit(i915_exit);
    1077                 :            : 
    1078                 :            : MODULE_AUTHOR("Tungsten Graphics, Inc.");
    1079                 :            : MODULE_AUTHOR("Intel Corporation");
    1080                 :            : 
    1081                 :            : MODULE_DESCRIPTION(DRIVER_DESC);
    1082                 :            : MODULE_LICENSE("GPL and additional rights");

Generated by: LCOV version 1.14