aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/DocBook/drm.tmpl10
-rw-r--r--drivers/gpu/Makefile1
-rw-r--r--drivers/gpu/drm/armada/armada_drv.c2
-rw-r--r--drivers/gpu/drm/ast/ast_post.c4
-rw-r--r--drivers/gpu/drm/drm_edid.c3
-rw-r--r--drivers/gpu/drm/exynos/exynos_dp_core.c2
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dpi.c2
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.c2
-rw-r--r--drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c2
-rw-r--r--drivers/gpu/drm/gma500/psb_drv.c2
-rw-r--r--drivers/gpu/drm/i810/i810_dma.c2
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c2
-rw-r--r--drivers/gpu/drm/i915/i915_ioc32.c2
-rw-r--r--drivers/gpu/drm/mga/mga_ioc32.c2
-rw-r--r--drivers/gpu/drm/mga/mga_state.c2
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c2
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/nv50.c2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_ioc32.c2
-rw-r--r--drivers/gpu/drm/qxl/qxl_ioctl.c2
-rw-r--r--drivers/gpu/drm/r128/r128_ioc32.c2
-rw-r--r--drivers/gpu/drm/r128/r128_state.c2
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c3
-rw-r--r--drivers/gpu/drm/radeon/cik.c18
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c26
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c12
-rw-r--r--drivers/gpu/drm/radeon/ni.c16
-rw-r--r--drivers/gpu/drm/radeon/r100.c8
-rw-r--r--drivers/gpu/drm/radeon/r300.c7
-rw-r--r--drivers/gpu/drm/radeon/r600.c11
-rw-r--r--drivers/gpu/drm/radeon/radeon.h22
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h12
-rw-r--r--drivers/gpu/drm/radeon/radeon_bios.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c31
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c44
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c11
-rw-r--r--drivers/gpu/drm/radeon/radeon_fence.c22
-rw-r--r--drivers/gpu/drm/radeon/radeon_ioc32.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c18
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c9
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_state.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_uvd.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_vce.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_vm.c28
-rw-r--r--drivers/gpu/drm/radeon/rs400.c7
-rw-r--r--drivers/gpu/drm/radeon/rs600.c11
-rw-r--r--drivers/gpu/drm/radeon/rv770.c3
-rw-r--r--drivers/gpu/drm/radeon/si.c17
-rw-r--r--drivers/gpu/drm/radeon/si_dma.c8
-rw-r--r--drivers/gpu/drm/radeon/si_dpm.c13
-rw-r--r--drivers/gpu/drm/radeon/uvd_v2_2.c2
-rw-r--r--drivers/gpu/drm/savage/savage_bci.c2
-rw-r--r--drivers/gpu/drm/sis/sis_mm.c2
-rw-r--r--drivers/gpu/drm/via/via_dma.c2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c2
-rw-r--r--drivers/gpu/ipu-v3/Kconfig7
-rw-r--r--drivers/gpu/ipu-v3/Makefile (renamed from drivers/staging/imx-drm/ipu-v3/Makefile)4
-rw-r--r--drivers/gpu/ipu-v3/ipu-common.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-common.c)82
-rw-r--r--drivers/gpu/ipu-v3/ipu-dc.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-dc.c)3
-rw-r--r--drivers/gpu/ipu-v3/ipu-di.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-di.c)2
-rw-r--r--drivers/gpu/ipu-v3/ipu-dmfc.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c)2
-rw-r--r--drivers/gpu/ipu-v3/ipu-dp.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-dp.c)2
-rw-r--r--drivers/gpu/ipu-v3/ipu-prv.h (renamed from drivers/staging/imx-drm/ipu-v3/ipu-prv.h)8
-rw-r--r--drivers/gpu/ipu-v3/ipu-smfc.c97
-rw-r--r--drivers/staging/imx-drm/Kconfig11
-rw-r--r--drivers/staging/imx-drm/Makefile1
-rw-r--r--drivers/staging/imx-drm/imx-hdmi.c2
-rw-r--r--drivers/staging/imx-drm/imx-tve.c2
-rw-r--r--drivers/staging/imx-drm/ipuv3-crtc.c2
-rw-r--r--drivers/staging/imx-drm/ipuv3-plane.c2
-rw-r--r--drivers/video/Kconfig1
-rw-r--r--include/drm/drmP.h2
-rw-r--r--include/drm/drm_crtc.h3
-rw-r--r--include/uapi/drm/radeon_drm.h2
-rw-r--r--include/video/imx-ipu-v3.h (renamed from drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h)16
79 files changed, 537 insertions, 165 deletions
diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index c526d8194883..7df3134ebc0e 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -2502,7 +2502,7 @@ void intel_crt_init(struct drm_device *dev)
2502 <td valign="top" >Description/Restrictions</td> 2502 <td valign="top" >Description/Restrictions</td>
2503 </tr> 2503 </tr>
2504 <tr> 2504 <tr>
2505 <td rowspan="19" valign="top" >DRM</td> 2505 <td rowspan="20" valign="top" >DRM</td>
2506 <td rowspan="2" valign="top" >Generic</td> 2506 <td rowspan="2" valign="top" >Generic</td>
2507 <td valign="top" >“EDID”</td> 2507 <td valign="top" >“EDID”</td>
2508 <td valign="top" >BLOB | IMMUTABLE</td> 2508 <td valign="top" >BLOB | IMMUTABLE</td>
@@ -2518,6 +2518,14 @@ void intel_crt_init(struct drm_device *dev)
2518 <td valign="top" >Contains DPMS operation mode value.</td> 2518 <td valign="top" >Contains DPMS operation mode value.</td>
2519 </tr> 2519 </tr>
2520 <tr> 2520 <tr>
2521 <td rowspan="1" valign="top" >Plane</td>
2522 <td valign="top" >“type”</td>
2523 <td valign="top" >ENUM | IMMUTABLE</td>
2524 <td valign="top" >{ "Overlay", "Primary", "Cursor" }</td>
2525 <td valign="top" >Plane</td>
2526 <td valign="top" >Plane type</td>
2527 </tr>
2528 <tr>
2521 <td rowspan="2" valign="top" >DVI-I</td> 2529 <td rowspan="2" valign="top" >DVI-I</td>
2522 <td valign="top" >“subconnector”</td> 2530 <td valign="top" >“subconnector”</td>
2523 <td valign="top" >ENUM</td> 2531 <td valign="top" >ENUM</td>
diff --git a/drivers/gpu/Makefile b/drivers/gpu/Makefile
index d8a22c2a579d..70da9eb52a42 100644
--- a/drivers/gpu/Makefile
+++ b/drivers/gpu/Makefile
@@ -1,2 +1,3 @@
1obj-y += drm/ vga/ 1obj-y += drm/ vga/
2obj-$(CONFIG_TEGRA_HOST1X) += host1x/ 2obj-$(CONFIG_TEGRA_HOST1X) += host1x/
3obj-$(CONFIG_IMX_IPUV3_CORE) += ipu-v3/
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c
index 567cfbde0883..8ab3cd1a8cdb 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -402,7 +402,7 @@ static struct platform_driver armada_drm_platform_driver = {
402 402
403static int __init armada_drm_init(void) 403static int __init armada_drm_init(void)
404{ 404{
405 armada_drm_driver.num_ioctls = DRM_ARRAY_SIZE(armada_ioctls); 405 armada_drm_driver.num_ioctls = ARRAY_SIZE(armada_ioctls);
406 return platform_driver_register(&armada_drm_platform_driver); 406 return platform_driver_register(&armada_drm_platform_driver);
407} 407}
408module_init(armada_drm_init); 408module_init(armada_drm_init);
diff --git a/drivers/gpu/drm/ast/ast_post.c b/drivers/gpu/drm/ast/ast_post.c
index 4e5ea3898e72..38d437f3a267 100644
--- a/drivers/gpu/drm/ast/ast_post.c
+++ b/drivers/gpu/drm/ast/ast_post.c
@@ -1083,7 +1083,7 @@ static void get_ddr3_info(struct ast_private *ast, struct ast2300_dram_param *pa
1083 case AST_DRAM_4Gx16: 1083 case AST_DRAM_4Gx16:
1084 param->dram_config = 0x133; 1084 param->dram_config = 0x133;
1085 break; 1085 break;
1086 }; /* switch size */ 1086 } /* switch size */
1087 1087
1088 switch (param->vram_size) { 1088 switch (param->vram_size) {
1089 default: 1089 default:
@@ -1454,7 +1454,7 @@ static void get_ddr2_info(struct ast_private *ast, struct ast2300_dram_param *pa
1454 case AST_DRAM_4Gx16: 1454 case AST_DRAM_4Gx16:
1455 param->dram_config = 0x123; 1455 param->dram_config = 0x123;
1456 break; 1456 break;
1457 }; /* switch size */ 1457 } /* switch size */
1458 1458
1459 switch (param->vram_size) { 1459 switch (param->vram_size) {
1460 default: 1460 default:
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 7be21781d3bd..dfa9769b26b5 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3471,18 +3471,21 @@ static bool drm_assign_hdmi_deep_color_info(struct edid *edid,
3471 3471
3472 if (hdmi[6] & DRM_EDID_HDMI_DC_30) { 3472 if (hdmi[6] & DRM_EDID_HDMI_DC_30) {
3473 dc_bpc = 10; 3473 dc_bpc = 10;
3474 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_30;
3474 DRM_DEBUG("%s: HDMI sink does deep color 30.\n", 3475 DRM_DEBUG("%s: HDMI sink does deep color 30.\n",
3475 connector->name); 3476 connector->name);
3476 } 3477 }
3477 3478
3478 if (hdmi[6] & DRM_EDID_HDMI_DC_36) { 3479 if (hdmi[6] & DRM_EDID_HDMI_DC_36) {
3479 dc_bpc = 12; 3480 dc_bpc = 12;
3481 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_36;
3480 DRM_DEBUG("%s: HDMI sink does deep color 36.\n", 3482 DRM_DEBUG("%s: HDMI sink does deep color 36.\n",
3481 connector->name); 3483 connector->name);
3482 } 3484 }
3483 3485
3484 if (hdmi[6] & DRM_EDID_HDMI_DC_48) { 3486 if (hdmi[6] & DRM_EDID_HDMI_DC_48) {
3485 dc_bpc = 16; 3487 dc_bpc = 16;
3488 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_48;
3486 DRM_DEBUG("%s: HDMI sink does deep color 48.\n", 3489 DRM_DEBUG("%s: HDMI sink does deep color 48.\n",
3487 connector->name); 3490 connector->name);
3488 } 3491 }
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
index 5e05dbc60082..a8ffc8c1477b 100644
--- a/drivers/gpu/drm/exynos/exynos_dp_core.c
+++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
@@ -1087,7 +1087,7 @@ static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
1087 break; 1087 break;
1088 default: 1088 default:
1089 break; 1089 break;
1090 }; 1090 }
1091 dp->dpms_mode = mode; 1091 dp->dpms_mode = mode;
1092} 1092}
1093 1093
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
index f1b8587cc63d..482127f633c5 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
@@ -152,7 +152,7 @@ static void exynos_dpi_dpms(struct exynos_drm_display *display, int mode)
152 break; 152 break;
153 default: 153 default:
154 break; 154 break;
155 }; 155 }
156 ctx->dpms_mode = mode; 156 ctx->dpms_mode = mode;
157} 157}
158 158
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 5d225dd58a87..d91f27777537 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -573,7 +573,7 @@ static int exynos_drm_platform_probe(struct platform_device *pdev)
573 int ret; 573 int ret;
574 574
575 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); 575 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
576 exynos_drm_driver.num_ioctls = DRM_ARRAY_SIZE(exynos_ioctls); 576 exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);
577 577
578#ifdef CONFIG_DRM_EXYNOS_FIMD 578#ifdef CONFIG_DRM_EXYNOS_FIMD
579 ret = platform_driver_register(&fimd_driver); 579 ret = platform_driver_register(&fimd_driver);
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c b/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
index 489ffd2c66e5..87885d8c06e8 100644
--- a/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
+++ b/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
@@ -148,7 +148,7 @@ static int handle_dsi_error(struct mdfld_dsi_pkg_sender *sender, u32 mask)
148 break; 148 break;
149 case BIT(14): 149 case BIT(14):
150 /*wait for all fifo empty*/ 150 /*wait for all fifo empty*/
151 /*wait_for_all_fifos_empty(sender)*/; 151 /*wait_for_all_fifos_empty(sender)*/
152 break; 152 break;
153 case BIT(15): 153 case BIT(15):
154 dev_dbg(sender->dev->dev, "No Action required\n"); 154 dev_dbg(sender->dev->dev, "No Action required\n");
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 59ea45e5c97e..6e8fe9ec02b5 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -477,7 +477,7 @@ static struct drm_driver driver = {
477 .lastclose = psb_driver_lastclose, 477 .lastclose = psb_driver_lastclose,
478 .preclose = psb_driver_preclose, 478 .preclose = psb_driver_preclose,
479 479
480 .num_ioctls = DRM_ARRAY_SIZE(psb_ioctls), 480 .num_ioctls = ARRAY_SIZE(psb_ioctls),
481 .device_is_agp = psb_driver_device_is_agp, 481 .device_is_agp = psb_driver_device_is_agp,
482 .irq_preinstall = psb_irq_preinstall, 482 .irq_preinstall = psb_irq_preinstall,
483 .irq_postinstall = psb_irq_postinstall, 483 .irq_postinstall = psb_irq_postinstall,
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c
index aeace37415aa..e88bac1d781f 100644
--- a/drivers/gpu/drm/i810/i810_dma.c
+++ b/drivers/gpu/drm/i810/i810_dma.c
@@ -1251,7 +1251,7 @@ const struct drm_ioctl_desc i810_ioctls[] = {
1251 DRM_IOCTL_DEF_DRV(I810_FLIP, i810_flip_bufs, DRM_AUTH|DRM_UNLOCKED), 1251 DRM_IOCTL_DEF_DRV(I810_FLIP, i810_flip_bufs, DRM_AUTH|DRM_UNLOCKED),
1252}; 1252};
1253 1253
1254int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls); 1254int i810_max_ioctl = ARRAY_SIZE(i810_ioctls);
1255 1255
1256/** 1256/**
1257 * Determine if the device really is AGP or not. 1257 * Determine if the device really is AGP or not.
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index b9159ade5e85..4c22a5b7f4c5 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1986,7 +1986,7 @@ const struct drm_ioctl_desc i915_ioctls[] = {
1986 DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), 1986 DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1987}; 1987};
1988 1988
1989int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); 1989int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
1990 1990
1991/* 1991/*
1992 * This is really ugly: Because old userspace abused the linux agp interface to 1992 * This is really ugly: Because old userspace abused the linux agp interface to
diff --git a/drivers/gpu/drm/i915/i915_ioc32.c b/drivers/gpu/drm/i915/i915_ioc32.c
index 3c59584161c2..2e0613e26251 100644
--- a/drivers/gpu/drm/i915/i915_ioc32.c
+++ b/drivers/gpu/drm/i915/i915_ioc32.c
@@ -208,7 +208,7 @@ long i915_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
208 if (nr < DRM_COMMAND_BASE) 208 if (nr < DRM_COMMAND_BASE)
209 return drm_compat_ioctl(filp, cmd, arg); 209 return drm_compat_ioctl(filp, cmd, arg);
210 210
211 if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(i915_compat_ioctls)) 211 if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls))
212 fn = i915_compat_ioctls[nr - DRM_COMMAND_BASE]; 212 fn = i915_compat_ioctls[nr - DRM_COMMAND_BASE];
213 213
214 if (fn != NULL) 214 if (fn != NULL)
diff --git a/drivers/gpu/drm/mga/mga_ioc32.c b/drivers/gpu/drm/mga/mga_ioc32.c
index 86b4bb804852..729bfd56b55f 100644
--- a/drivers/gpu/drm/mga/mga_ioc32.c
+++ b/drivers/gpu/drm/mga/mga_ioc32.c
@@ -214,7 +214,7 @@ long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
214 if (nr < DRM_COMMAND_BASE) 214 if (nr < DRM_COMMAND_BASE)
215 return drm_compat_ioctl(filp, cmd, arg); 215 return drm_compat_ioctl(filp, cmd, arg);
216 216
217 if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(mga_compat_ioctls)) 217 if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
218 fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE]; 218 fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE];
219 219
220 if (fn != NULL) 220 if (fn != NULL)
diff --git a/drivers/gpu/drm/mga/mga_state.c b/drivers/gpu/drm/mga/mga_state.c
index 3cb58df5237e..792f924496fc 100644
--- a/drivers/gpu/drm/mga/mga_state.c
+++ b/drivers/gpu/drm/mga/mga_state.c
@@ -1099,4 +1099,4 @@ const struct drm_ioctl_desc mga_ioctls[] = {
1099 DRM_IOCTL_DEF_DRV(MGA_DMA_BOOTSTRAP, mga_dma_bootstrap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1099 DRM_IOCTL_DEF_DRV(MGA_DMA_BOOTSTRAP, mga_dma_bootstrap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1100}; 1100};
1101 1101
1102int mga_max_ioctl = DRM_ARRAY_SIZE(mga_ioctls); 1102int mga_max_ioctl = ARRAY_SIZE(mga_ioctls);
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c
index 0fab95e49f53..dec03f04114d 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c
@@ -842,7 +842,7 @@ nvf0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
842 u16 magic3 = 0x0648; 842 u16 magic3 = 0x0648;
843 magic[gpc][0] = 0x10000000 | (magic0 << 16) | offset; 843 magic[gpc][0] = 0x10000000 | (magic0 << 16) | offset;
844 magic[gpc][1] = 0x00000000 | (magic1 << 16); 844 magic[gpc][1] = 0x00000000 | (magic1 << 16);
845 offset += 0x0324 * (priv->tpc_nr[gpc] - 1);; 845 offset += 0x0324 * (priv->tpc_nr[gpc] - 1);
846 magic[gpc][2] = 0x10000000 | (magic2 << 16) | offset; 846 magic[gpc][2] = 0x10000000 | (magic2 << 16) | offset;
847 magic[gpc][3] = 0x00000000 | (magic3 << 16); 847 magic[gpc][3] = 0x00000000 | (magic3 << 16);
848 offset += 0x0324; 848 offset += 0x0324;
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c
index 2c7809e1a09b..1a2d56493cf6 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c
@@ -901,7 +901,7 @@ nv50_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
901 nv_engine(priv)->sclass = nvaf_graph_sclass; 901 nv_engine(priv)->sclass = nvaf_graph_sclass;
902 break; 902 break;
903 903
904 }; 904 }
905 905
906 /* unfortunate hw bug workaround... */ 906 /* unfortunate hw bug workaround... */
907 if (nv_device(priv)->chipset != 0x50 && 907 if (nv_device(priv)->chipset != 0x50 &&
diff --git a/drivers/gpu/drm/nouveau/nouveau_ioc32.c b/drivers/gpu/drm/nouveau/nouveau_ioc32.c
index c1a7e5a73a26..462679a8fec5 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ioc32.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ioc32.c
@@ -57,7 +57,7 @@ long nouveau_compat_ioctl(struct file *filp, unsigned int cmd,
57 return drm_compat_ioctl(filp, cmd, arg); 57 return drm_compat_ioctl(filp, cmd, arg);
58 58
59#if 0 59#if 0
60 if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(mga_compat_ioctls)) 60 if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
61 fn = nouveau_compat_ioctls[nr - DRM_COMMAND_BASE]; 61 fn = nouveau_compat_ioctls[nr - DRM_COMMAND_BASE];
62#endif 62#endif
63 if (fn != NULL) 63 if (fn != NULL)
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c
index 0bb86e6d41b4..b110883f8253 100644
--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
@@ -451,4 +451,4 @@ const struct drm_ioctl_desc qxl_ioctls[] = {
451 DRM_AUTH|DRM_UNLOCKED), 451 DRM_AUTH|DRM_UNLOCKED),
452}; 452};
453 453
454int qxl_max_ioctls = DRM_ARRAY_SIZE(qxl_ioctls); 454int qxl_max_ioctls = ARRAY_SIZE(qxl_ioctls);
diff --git a/drivers/gpu/drm/r128/r128_ioc32.c b/drivers/gpu/drm/r128/r128_ioc32.c
index b0d0fd3e4376..663f38c63ba6 100644
--- a/drivers/gpu/drm/r128/r128_ioc32.c
+++ b/drivers/gpu/drm/r128/r128_ioc32.c
@@ -203,7 +203,7 @@ long r128_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
203 if (nr < DRM_COMMAND_BASE) 203 if (nr < DRM_COMMAND_BASE)
204 return drm_compat_ioctl(filp, cmd, arg); 204 return drm_compat_ioctl(filp, cmd, arg);
205 205
206 if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(r128_compat_ioctls)) 206 if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(r128_compat_ioctls))
207 fn = r128_compat_ioctls[nr - DRM_COMMAND_BASE]; 207 fn = r128_compat_ioctls[nr - DRM_COMMAND_BASE];
208 208
209 if (fn != NULL) 209 if (fn != NULL)
diff --git a/drivers/gpu/drm/r128/r128_state.c b/drivers/gpu/drm/r128/r128_state.c
index 97064dd434c2..575e986f82a7 100644
--- a/drivers/gpu/drm/r128/r128_state.c
+++ b/drivers/gpu/drm/r128/r128_state.c
@@ -1641,4 +1641,4 @@ const struct drm_ioctl_desc r128_ioctls[] = {
1641 DRM_IOCTL_DEF_DRV(R128_GETPARAM, r128_getparam, DRM_AUTH), 1641 DRM_IOCTL_DEF_DRV(R128_GETPARAM, r128_getparam, DRM_AUTH),
1642}; 1642};
1643 1643
1644int r128_max_ioctl = DRM_ARRAY_SIZE(r128_ioctls); 1644int r128_max_ioctl = ARRAY_SIZE(r128_ioctls);
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 76c30f2da3fb..26c12a3fe430 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -962,6 +962,9 @@ static bool atombios_crtc_prepare_pll(struct drm_crtc *crtc, struct drm_display_
962 struct radeon_connector_atom_dig *dig_connector = 962 struct radeon_connector_atom_dig *dig_connector =
963 radeon_connector->con_priv; 963 radeon_connector->con_priv;
964 int dp_clock; 964 int dp_clock;
965
966 /* Assign mode clock for hdmi deep color max clock limit check */
967 radeon_connector->pixelclock_for_modeset = mode->clock;
965 radeon_crtc->bpc = radeon_get_monitor_bpc(connector); 968 radeon_crtc->bpc = radeon_get_monitor_bpc(connector);
966 969
967 switch (encoder_mode) { 970 switch (encoder_mode) {
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 69a00d64716e..dcd4518a9b08 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -80,6 +80,7 @@ extern int sumo_rlc_init(struct radeon_device *rdev);
80extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 80extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
81extern void si_rlc_reset(struct radeon_device *rdev); 81extern void si_rlc_reset(struct radeon_device *rdev);
82extern void si_init_uvd_internal_cg(struct radeon_device *rdev); 82extern void si_init_uvd_internal_cg(struct radeon_device *rdev);
83static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
83extern int cik_sdma_resume(struct radeon_device *rdev); 84extern int cik_sdma_resume(struct radeon_device *rdev);
84extern void cik_sdma_enable(struct radeon_device *rdev, bool enable); 85extern void cik_sdma_enable(struct radeon_device *rdev, bool enable);
85extern void cik_sdma_fini(struct radeon_device *rdev); 86extern void cik_sdma_fini(struct radeon_device *rdev);
@@ -3257,7 +3258,7 @@ static void cik_gpu_init(struct radeon_device *rdev)
3257 u32 mc_shared_chmap, mc_arb_ramcfg; 3258 u32 mc_shared_chmap, mc_arb_ramcfg;
3258 u32 hdp_host_path_cntl; 3259 u32 hdp_host_path_cntl;
3259 u32 tmp; 3260 u32 tmp;
3260 int i, j; 3261 int i, j, k;
3261 3262
3262 switch (rdev->family) { 3263 switch (rdev->family) {
3263 case CHIP_BONAIRE: 3264 case CHIP_BONAIRE:
@@ -3446,6 +3447,15 @@ static void cik_gpu_init(struct radeon_device *rdev)
3446 rdev->config.cik.max_sh_per_se, 3447 rdev->config.cik.max_sh_per_se,
3447 rdev->config.cik.max_backends_per_se); 3448 rdev->config.cik.max_backends_per_se);
3448 3449
3450 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
3451 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
3452 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k++) {
3453 rdev->config.cik.active_cus +=
3454 hweight32(cik_get_cu_active_bitmap(rdev, i, j));
3455 }
3456 }
3457 }
3458
3449 /* set HW defaults for 3D engine */ 3459 /* set HW defaults for 3D engine */
3450 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60)); 3460 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
3451 3461
@@ -3698,7 +3708,7 @@ bool cik_semaphore_ring_emit(struct radeon_device *rdev,
3698 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; 3708 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
3699 3709
3700 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); 3710 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
3701 radeon_ring_write(ring, addr & 0xffffffff); 3711 radeon_ring_write(ring, lower_32_bits(addr));
3702 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel); 3712 radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel);
3703 3713
3704 return true; 3714 return true;
@@ -3818,7 +3828,7 @@ void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3818 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3828 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3819 radeon_ring_write(ring, WRITE_DATA_DST_SEL(1)); 3829 radeon_ring_write(ring, WRITE_DATA_DST_SEL(1));
3820 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); 3830 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3821 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); 3831 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
3822 radeon_ring_write(ring, next_rptr); 3832 radeon_ring_write(ring, next_rptr);
3823 } 3833 }
3824 3834
@@ -5446,7 +5456,7 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev)
5446 (u32)(rdev->dummy_page.addr >> 12)); 5456 (u32)(rdev->dummy_page.addr >> 12));
5447 WREG32(VM_CONTEXT1_CNTL2, 4); 5457 WREG32(VM_CONTEXT1_CNTL2, 4);
5448 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | 5458 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
5449 PAGE_TABLE_BLOCK_SIZE(RADEON_VM_BLOCK_SIZE - 9) | 5459 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
5450 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 5460 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
5451 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | 5461 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
5452 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 5462 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index 1347162ca1a4..8e9d0f1d858e 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -141,7 +141,7 @@ void cik_sdma_ring_ib_execute(struct radeon_device *rdev,
141 next_rptr += 4; 141 next_rptr += 4;
142 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0)); 142 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
143 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); 143 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
144 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); 144 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
145 radeon_ring_write(ring, 1); /* number of DWs to follow */ 145 radeon_ring_write(ring, 1); /* number of DWs to follow */
146 radeon_ring_write(ring, next_rptr); 146 radeon_ring_write(ring, next_rptr);
147 } 147 }
@@ -151,7 +151,7 @@ void cik_sdma_ring_ib_execute(struct radeon_device *rdev,
151 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); 151 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
152 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_INDIRECT_BUFFER, 0, extra_bits)); 152 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_INDIRECT_BUFFER, 0, extra_bits));
153 radeon_ring_write(ring, ib->gpu_addr & 0xffffffe0); /* base must be 32 byte aligned */ 153 radeon_ring_write(ring, ib->gpu_addr & 0xffffffe0); /* base must be 32 byte aligned */
154 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xffffffff); 154 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr));
155 radeon_ring_write(ring, ib->length_dw); 155 radeon_ring_write(ring, ib->length_dw);
156 156
157} 157}
@@ -203,8 +203,8 @@ void cik_sdma_fence_ring_emit(struct radeon_device *rdev,
203 203
204 /* write the fence */ 204 /* write the fence */
205 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_FENCE, 0, 0)); 205 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_FENCE, 0, 0));
206 radeon_ring_write(ring, addr & 0xffffffff); 206 radeon_ring_write(ring, lower_32_bits(addr));
207 radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff); 207 radeon_ring_write(ring, upper_32_bits(addr));
208 radeon_ring_write(ring, fence->seq); 208 radeon_ring_write(ring, fence->seq);
209 /* generate an interrupt */ 209 /* generate an interrupt */
210 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0)); 210 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0));
@@ -233,7 +233,7 @@ bool cik_sdma_semaphore_ring_emit(struct radeon_device *rdev,
233 233
234 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, extra_bits)); 234 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, extra_bits));
235 radeon_ring_write(ring, addr & 0xfffffff8); 235 radeon_ring_write(ring, addr & 0xfffffff8);
236 radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff); 236 radeon_ring_write(ring, upper_32_bits(addr));
237 237
238 return true; 238 return true;
239} 239}
@@ -551,10 +551,10 @@ int cik_copy_dma(struct radeon_device *rdev,
551 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0)); 551 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0));
552 radeon_ring_write(ring, cur_size_in_bytes); 552 radeon_ring_write(ring, cur_size_in_bytes);
553 radeon_ring_write(ring, 0); /* src/dst endian swap */ 553 radeon_ring_write(ring, 0); /* src/dst endian swap */
554 radeon_ring_write(ring, src_offset & 0xffffffff); 554 radeon_ring_write(ring, lower_32_bits(src_offset));
555 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff); 555 radeon_ring_write(ring, upper_32_bits(src_offset));
556 radeon_ring_write(ring, dst_offset & 0xffffffff); 556 radeon_ring_write(ring, lower_32_bits(dst_offset));
557 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff); 557 radeon_ring_write(ring, upper_32_bits(dst_offset));
558 src_offset += cur_size_in_bytes; 558 src_offset += cur_size_in_bytes;
559 dst_offset += cur_size_in_bytes; 559 dst_offset += cur_size_in_bytes;
560 } 560 }
@@ -605,7 +605,7 @@ int cik_sdma_ring_test(struct radeon_device *rdev,
605 } 605 }
606 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0)); 606 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
607 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc); 607 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc);
608 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xffffffff); 608 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr));
609 radeon_ring_write(ring, 1); /* number of DWs to follow */ 609 radeon_ring_write(ring, 1); /* number of DWs to follow */
610 radeon_ring_write(ring, 0xDEADBEEF); 610 radeon_ring_write(ring, 0xDEADBEEF);
611 radeon_ring_unlock_commit(rdev, ring); 611 radeon_ring_unlock_commit(rdev, ring);
@@ -660,7 +660,7 @@ int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
660 660
661 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 661 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
662 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc; 662 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc;
663 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xffffffff; 663 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr);
664 ib.ptr[3] = 1; 664 ib.ptr[3] = 1;
665 ib.ptr[4] = 0xDEADBEEF; 665 ib.ptr[4] = 0xDEADBEEF;
666 ib.length_dw = 5; 666 ib.length_dw = 5;
@@ -752,9 +752,9 @@ void cik_sdma_vm_set_page(struct radeon_device *rdev,
752 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 752 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
753 ib->ptr[ib->length_dw++] = bytes; 753 ib->ptr[ib->length_dw++] = bytes;
754 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 754 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
755 ib->ptr[ib->length_dw++] = src & 0xffffffff; 755 ib->ptr[ib->length_dw++] = lower_32_bits(src);
756 ib->ptr[ib->length_dw++] = upper_32_bits(src); 756 ib->ptr[ib->length_dw++] = upper_32_bits(src);
757 ib->ptr[ib->length_dw++] = pe & 0xffffffff; 757 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
758 ib->ptr[ib->length_dw++] = upper_32_bits(pe); 758 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
759 759
760 pe += bytes; 760 pe += bytes;
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 653eff814504..e2f605224e8c 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -3337,6 +3337,18 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
3337 disabled_rb_mask &= ~(1 << i); 3337 disabled_rb_mask &= ~(1 << i);
3338 } 3338 }
3339 3339
3340 for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
3341 u32 simd_disable_bitmap;
3342
3343 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3344 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3345 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
3346 simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
3347 tmp <<= 16;
3348 tmp |= simd_disable_bitmap;
3349 }
3350 rdev->config.evergreen.active_simds = hweight32(~tmp);
3351
3340 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 3352 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3341 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 3353 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3342 3354
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 1d3209ffbbdc..5a33ca681867 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1057,6 +1057,18 @@ static void cayman_gpu_init(struct radeon_device *rdev)
1057 disabled_rb_mask &= ~(1 << i); 1057 disabled_rb_mask &= ~(1 << i);
1058 } 1058 }
1059 1059
1060 for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
1061 u32 simd_disable_bitmap;
1062
1063 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1064 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1065 simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
1066 simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
1067 tmp <<= 16;
1068 tmp |= simd_disable_bitmap;
1069 }
1070 rdev->config.cayman.active_simds = hweight32(~tmp);
1071
1060 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1072 WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1061 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 1073 WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1062 1074
@@ -1268,7 +1280,7 @@ static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1268 (u32)(rdev->dummy_page.addr >> 12)); 1280 (u32)(rdev->dummy_page.addr >> 12));
1269 WREG32(VM_CONTEXT1_CNTL2, 4); 1281 WREG32(VM_CONTEXT1_CNTL2, 4);
1270 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | 1282 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1271 PAGE_TABLE_BLOCK_SIZE(RADEON_VM_BLOCK_SIZE - 9) | 1283 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1272 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1284 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1273 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | 1285 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1274 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 1286 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
@@ -1346,7 +1358,7 @@ void cayman_fence_ring_emit(struct radeon_device *rdev,
1346 /* EVENT_WRITE_EOP - flush caches, send int */ 1358 /* EVENT_WRITE_EOP - flush caches, send int */
1347 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 1359 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1348 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 1360 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1349 radeon_ring_write(ring, addr & 0xffffffff); 1361 radeon_ring_write(ring, lower_32_bits(addr));
1350 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 1362 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1351 radeon_ring_write(ring, fence->seq); 1363 radeon_ring_write(ring, fence->seq);
1352 radeon_ring_write(ring, 0); 1364 radeon_ring_write(ring, 0);
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index ad99813cfa8f..1544efcf1c3a 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -682,15 +682,11 @@ void r100_pci_gart_disable(struct radeon_device *rdev)
682 WREG32(RADEON_AIC_HI_ADDR, 0); 682 WREG32(RADEON_AIC_HI_ADDR, 0);
683} 683}
684 684
685int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 685void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i,
686 uint64_t addr)
686{ 687{
687 u32 *gtt = rdev->gart.ptr; 688 u32 *gtt = rdev->gart.ptr;
688
689 if (i < 0 || i > rdev->gart.num_gpu_pages) {
690 return -EINVAL;
691 }
692 gtt[i] = cpu_to_le32(lower_32_bits(addr)); 689 gtt[i] = cpu_to_le32(lower_32_bits(addr));
693 return 0;
694} 690}
695 691
696void r100_pci_gart_fini(struct radeon_device *rdev) 692void r100_pci_gart_fini(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index 206caf9700b7..3c21d77a483d 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -72,13 +72,11 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
72#define R300_PTE_WRITEABLE (1 << 2) 72#define R300_PTE_WRITEABLE (1 << 2)
73#define R300_PTE_READABLE (1 << 3) 73#define R300_PTE_READABLE (1 << 3)
74 74
75int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 75void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i,
76 uint64_t addr)
76{ 77{
77 void __iomem *ptr = rdev->gart.ptr; 78 void __iomem *ptr = rdev->gart.ptr;
78 79
79 if (i < 0 || i > rdev->gart.num_gpu_pages) {
80 return -EINVAL;
81 }
82 addr = (lower_32_bits(addr) >> 8) | 80 addr = (lower_32_bits(addr) >> 8) |
83 ((upper_32_bits(addr) & 0xff) << 24) | 81 ((upper_32_bits(addr) & 0xff) << 24) |
84 R300_PTE_WRITEABLE | R300_PTE_READABLE; 82 R300_PTE_WRITEABLE | R300_PTE_READABLE;
@@ -86,7 +84,6 @@ int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
86 * on powerpc without HW swappers, it'll get swapped on way 84 * on powerpc without HW swappers, it'll get swapped on way
87 * into VRAM - so no need for cpu_to_le32 on VRAM tables */ 85 * into VRAM - so no need for cpu_to_le32 on VRAM tables */
88 writel(addr, ((void __iomem *)ptr) + (i * 4)); 86 writel(addr, ((void __iomem *)ptr) + (i * 4));
89 return 0;
90} 87}
91 88
92int rv370_pcie_gart_init(struct radeon_device *rdev) 89int rv370_pcie_gart_init(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index c75881223d18..c66952d4b00c 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1958,6 +1958,9 @@ static void r600_gpu_init(struct radeon_device *rdev)
1958 if (tmp < rdev->config.r600.max_simds) { 1958 if (tmp < rdev->config.r600.max_simds) {
1959 rdev->config.r600.max_simds = tmp; 1959 rdev->config.r600.max_simds = tmp;
1960 } 1960 }
1961 tmp = rdev->config.r600.max_simds -
1962 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK);
1963 rdev->config.r600.active_simds = tmp;
1961 1964
1962 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; 1965 disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK;
1963 tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 1966 tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
@@ -2724,7 +2727,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
2724 /* EVENT_WRITE_EOP - flush caches, send int */ 2727 /* EVENT_WRITE_EOP - flush caches, send int */
2725 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 2728 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
2726 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 2729 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
2727 radeon_ring_write(ring, addr & 0xffffffff); 2730 radeon_ring_write(ring, lower_32_bits(addr));
2728 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 2731 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
2729 radeon_ring_write(ring, fence->seq); 2732 radeon_ring_write(ring, fence->seq);
2730 radeon_ring_write(ring, 0); 2733 radeon_ring_write(ring, 0);
@@ -2763,7 +2766,7 @@ bool r600_semaphore_ring_emit(struct radeon_device *rdev,
2763 sel |= PACKET3_SEM_WAIT_ON_SIGNAL; 2766 sel |= PACKET3_SEM_WAIT_ON_SIGNAL;
2764 2767
2765 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); 2768 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
2766 radeon_ring_write(ring, addr & 0xffffffff); 2769 radeon_ring_write(ring, lower_32_bits(addr));
2767 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); 2770 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel);
2768 2771
2769 return true; 2772 return true;
@@ -2824,9 +2827,9 @@ int r600_copy_cpdma(struct radeon_device *rdev,
2824 if (size_in_bytes == 0) 2827 if (size_in_bytes == 0)
2825 tmp |= PACKET3_CP_DMA_CP_SYNC; 2828 tmp |= PACKET3_CP_DMA_CP_SYNC;
2826 radeon_ring_write(ring, PACKET3(PACKET3_CP_DMA, 4)); 2829 radeon_ring_write(ring, PACKET3(PACKET3_CP_DMA, 4));
2827 radeon_ring_write(ring, src_offset & 0xffffffff); 2830 radeon_ring_write(ring, lower_32_bits(src_offset));
2828 radeon_ring_write(ring, tmp); 2831 radeon_ring_write(ring, tmp);
2829 radeon_ring_write(ring, dst_offset & 0xffffffff); 2832 radeon_ring_write(ring, lower_32_bits(dst_offset));
2830 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); 2833 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
2831 radeon_ring_write(ring, cur_size_in_bytes); 2834 radeon_ring_write(ring, cur_size_in_bytes);
2832 src_offset += cur_size_in_bytes; 2835 src_offset += cur_size_in_bytes;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 7501ba318c67..4b0bbf88d5c0 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -100,6 +100,8 @@ extern int radeon_dpm;
100extern int radeon_aspm; 100extern int radeon_aspm;
101extern int radeon_runtime_pm; 101extern int radeon_runtime_pm;
102extern int radeon_hard_reset; 102extern int radeon_hard_reset;
103extern int radeon_vm_size;
104extern int radeon_vm_block_size;
103 105
104/* 106/*
105 * Copy from radeon_drv.h so we don't have to include both and have conflicting 107 * Copy from radeon_drv.h so we don't have to include both and have conflicting
@@ -837,13 +839,8 @@ struct radeon_mec {
837/* maximum number of VMIDs */ 839/* maximum number of VMIDs */
838#define RADEON_NUM_VM 16 840#define RADEON_NUM_VM 16
839 841
840/* defines number of bits in page table versus page directory,
841 * a page is 4KB so we have 12 bits offset, 9 bits in the page
842 * table and the remaining 19 bits are in the page directory */
843#define RADEON_VM_BLOCK_SIZE 9
844
845/* number of entries in page table */ 842/* number of entries in page table */
846#define RADEON_VM_PTE_COUNT (1 << RADEON_VM_BLOCK_SIZE) 843#define RADEON_VM_PTE_COUNT (1 << radeon_vm_block_size)
847 844
848/* PTBs (Page Table Blocks) need to be aligned to 32K */ 845/* PTBs (Page Table Blocks) need to be aligned to 32K */
849#define RADEON_VM_PTB_ALIGN_SIZE 32768 846#define RADEON_VM_PTB_ALIGN_SIZE 32768
@@ -997,8 +994,8 @@ struct radeon_cs_reloc {
997 struct radeon_bo *robj; 994 struct radeon_bo *robj;
998 struct ttm_validate_buffer tv; 995 struct ttm_validate_buffer tv;
999 uint64_t gpu_offset; 996 uint64_t gpu_offset;
1000 unsigned domain; 997 unsigned prefered_domains;
1001 unsigned alt_domain; 998 unsigned allowed_domains;
1002 uint32_t tiling_flags; 999 uint32_t tiling_flags;
1003 uint32_t handle; 1000 uint32_t handle;
1004}; 1001};
@@ -1782,7 +1779,8 @@ struct radeon_asic {
1782 /* gart */ 1779 /* gart */
1783 struct { 1780 struct {
1784 void (*tlb_flush)(struct radeon_device *rdev); 1781 void (*tlb_flush)(struct radeon_device *rdev);
1785 int (*set_page)(struct radeon_device *rdev, int i, uint64_t addr); 1782 void (*set_page)(struct radeon_device *rdev, unsigned i,
1783 uint64_t addr);
1786 } gart; 1784 } gart;
1787 struct { 1785 struct {
1788 int (*init)(struct radeon_device *rdev); 1786 int (*init)(struct radeon_device *rdev);
@@ -1934,6 +1932,7 @@ struct r600_asic {
1934 unsigned tiling_group_size; 1932 unsigned tiling_group_size;
1935 unsigned tile_config; 1933 unsigned tile_config;
1936 unsigned backend_map; 1934 unsigned backend_map;
1935 unsigned active_simds;
1937}; 1936};
1938 1937
1939struct rv770_asic { 1938struct rv770_asic {
@@ -1959,6 +1958,7 @@ struct rv770_asic {
1959 unsigned tiling_group_size; 1958 unsigned tiling_group_size;
1960 unsigned tile_config; 1959 unsigned tile_config;
1961 unsigned backend_map; 1960 unsigned backend_map;
1961 unsigned active_simds;
1962}; 1962};
1963 1963
1964struct evergreen_asic { 1964struct evergreen_asic {
@@ -1985,6 +1985,7 @@ struct evergreen_asic {
1985 unsigned tiling_group_size; 1985 unsigned tiling_group_size;
1986 unsigned tile_config; 1986 unsigned tile_config;
1987 unsigned backend_map; 1987 unsigned backend_map;
1988 unsigned active_simds;
1988}; 1989};
1989 1990
1990struct cayman_asic { 1991struct cayman_asic {
@@ -2023,6 +2024,7 @@ struct cayman_asic {
2023 unsigned multi_gpu_tile_size; 2024 unsigned multi_gpu_tile_size;
2024 2025
2025 unsigned tile_config; 2026 unsigned tile_config;
2027 unsigned active_simds;
2026}; 2028};
2027 2029
2028struct si_asic { 2030struct si_asic {
@@ -2053,6 +2055,7 @@ struct si_asic {
2053 2055
2054 unsigned tile_config; 2056 unsigned tile_config;
2055 uint32_t tile_mode_array[32]; 2057 uint32_t tile_mode_array[32];
2058 uint32_t active_cus;
2056}; 2059};
2057 2060
2058struct cik_asic { 2061struct cik_asic {
@@ -2084,6 +2087,7 @@ struct cik_asic {
2084 unsigned tile_config; 2087 unsigned tile_config;
2085 uint32_t tile_mode_array[32]; 2088 uint32_t tile_mode_array[32];
2086 uint32_t macrotile_mode_array[16]; 2089 uint32_t macrotile_mode_array[16];
2090 uint32_t active_cus;
2087}; 2091};
2088 2092
2089union radeon_asic_config { 2093union radeon_asic_config {
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index 34ea53d980a1..34b9aa9e3c06 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -2029,8 +2029,8 @@ static struct radeon_asic ci_asic = {
2029 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 2029 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
2030 .dma = &cik_copy_dma, 2030 .dma = &cik_copy_dma,
2031 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 2031 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
2032 .copy = &cik_copy_cpdma, 2032 .copy = &cik_copy_dma,
2033 .copy_ring_index = RADEON_RING_TYPE_GFX_INDEX, 2033 .copy_ring_index = R600_RING_TYPE_DMA_INDEX,
2034 }, 2034 },
2035 .surface = { 2035 .surface = {
2036 .set_reg = r600_set_surface_reg, 2036 .set_reg = r600_set_surface_reg,
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 0eab015b2cfb..01e7c0ad8f01 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -67,7 +67,8 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
67int r100_asic_reset(struct radeon_device *rdev); 67int r100_asic_reset(struct radeon_device *rdev);
68u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); 68u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
69void r100_pci_gart_tlb_flush(struct radeon_device *rdev); 69void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
70int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 70void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i,
71 uint64_t addr);
71void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); 72void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring);
72int r100_irq_set(struct radeon_device *rdev); 73int r100_irq_set(struct radeon_device *rdev);
73int r100_irq_process(struct radeon_device *rdev); 74int r100_irq_process(struct radeon_device *rdev);
@@ -171,7 +172,8 @@ extern void r300_fence_ring_emit(struct radeon_device *rdev,
171 struct radeon_fence *fence); 172 struct radeon_fence *fence);
172extern int r300_cs_parse(struct radeon_cs_parser *p); 173extern int r300_cs_parse(struct radeon_cs_parser *p);
173extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); 174extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev);
174extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 175extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i,
176 uint64_t addr);
175extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); 177extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
176extern int rv370_get_pcie_lanes(struct radeon_device *rdev); 178extern int rv370_get_pcie_lanes(struct radeon_device *rdev);
177extern void r300_set_reg_safe(struct radeon_device *rdev); 179extern void r300_set_reg_safe(struct radeon_device *rdev);
@@ -206,7 +208,8 @@ extern void rs400_fini(struct radeon_device *rdev);
206extern int rs400_suspend(struct radeon_device *rdev); 208extern int rs400_suspend(struct radeon_device *rdev);
207extern int rs400_resume(struct radeon_device *rdev); 209extern int rs400_resume(struct radeon_device *rdev);
208void rs400_gart_tlb_flush(struct radeon_device *rdev); 210void rs400_gart_tlb_flush(struct radeon_device *rdev);
209int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 211void rs400_gart_set_page(struct radeon_device *rdev, unsigned i,
212 uint64_t addr);
210uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); 213uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg);
211void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 214void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
212int rs400_gart_init(struct radeon_device *rdev); 215int rs400_gart_init(struct radeon_device *rdev);
@@ -229,7 +232,8 @@ int rs600_irq_process(struct radeon_device *rdev);
229void rs600_irq_disable(struct radeon_device *rdev); 232void rs600_irq_disable(struct radeon_device *rdev);
230u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); 233u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc);
231void rs600_gart_tlb_flush(struct radeon_device *rdev); 234void rs600_gart_tlb_flush(struct radeon_device *rdev);
232int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 235void rs600_gart_set_page(struct radeon_device *rdev, unsigned i,
236 uint64_t addr);
233uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); 237uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg);
234void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 238void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
235void rs600_bandwidth_update(struct radeon_device *rdev); 239void rs600_bandwidth_update(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c
index 9ab30976287d..6a03624fadaa 100644
--- a/drivers/gpu/drm/radeon/radeon_bios.c
+++ b/drivers/gpu/drm/radeon/radeon_bios.c
@@ -626,7 +626,7 @@ static bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
626 vhdr->DeviceID != rdev->pdev->device) { 626 vhdr->DeviceID != rdev->pdev->device) {
627 DRM_INFO("ACPI VFCT table is not for this card\n"); 627 DRM_INFO("ACPI VFCT table is not for this card\n");
628 goto out_unmap; 628 goto out_unmap;
629 }; 629 }
630 630
631 if (vfct->VBIOSImageOffset + sizeof(VFCT_IMAGE_HEADER) + vhdr->ImageLength > tbl_size) { 631 if (vfct->VBIOSImageOffset + sizeof(VFCT_IMAGE_HEADER) + vhdr->ImageLength > tbl_size) {
632 DRM_ERROR("ACPI VFCT image truncated\n"); 632 DRM_ERROR("ACPI VFCT image truncated\n");
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index 4522f7dce653..933c5c39654d 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -101,6 +101,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
101 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 101 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
102 struct radeon_connector_atom_dig *dig_connector; 102 struct radeon_connector_atom_dig *dig_connector;
103 int bpc = 8; 103 int bpc = 8;
104 int mode_clock, max_tmds_clock;
104 105
105 switch (connector->connector_type) { 106 switch (connector->connector_type) {
106 case DRM_MODE_CONNECTOR_DVII: 107 case DRM_MODE_CONNECTOR_DVII:
@@ -166,6 +167,36 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
166 connector->name, bpc); 167 connector->name, bpc);
167 bpc = 12; 168 bpc = 12;
168 } 169 }
170
171 /* Any defined maximum tmds clock limit we must not exceed? */
172 if (connector->max_tmds_clock > 0) {
173 /* mode_clock is clock in kHz for mode to be modeset on this connector */
174 mode_clock = radeon_connector->pixelclock_for_modeset;
175
176 /* Maximum allowable input clock in kHz */
177 max_tmds_clock = connector->max_tmds_clock * 1000;
178
179 DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n",
180 connector->name, mode_clock, max_tmds_clock);
181
182 /* Check if bpc is within clock limit. Try to degrade gracefully otherwise */
183 if ((bpc == 12) && (mode_clock * 3/2 > max_tmds_clock)) {
184 if ((connector->display_info.edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_30) &&
185 (mode_clock * 5/4 <= max_tmds_clock))
186 bpc = 10;
187 else
188 bpc = 8;
189
190 DRM_DEBUG("%s: HDMI deep color 12 bpc exceeds max tmds clock. Using %d bpc.\n",
191 connector->name, bpc);
192 }
193
194 if ((bpc == 10) && (mode_clock * 5/4 > max_tmds_clock)) {
195 bpc = 8;
196 DRM_DEBUG("%s: HDMI deep color 10 bpc exceeds max tmds clock. Using %d bpc.\n",
197 connector->name, bpc);
198 }
199 }
169 } 200 }
170 201
171 DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n", 202 DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 41ecf8a60611..71a143461478 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -140,10 +140,10 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
140 if (p->ring == R600_RING_TYPE_UVD_INDEX && 140 if (p->ring == R600_RING_TYPE_UVD_INDEX &&
141 (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { 141 (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) {
142 /* TODO: is this still needed for NI+ ? */ 142 /* TODO: is this still needed for NI+ ? */
143 p->relocs[i].domain = 143 p->relocs[i].prefered_domains =
144 RADEON_GEM_DOMAIN_VRAM; 144 RADEON_GEM_DOMAIN_VRAM;
145 145
146 p->relocs[i].alt_domain = 146 p->relocs[i].allowed_domains =
147 RADEON_GEM_DOMAIN_VRAM; 147 RADEON_GEM_DOMAIN_VRAM;
148 148
149 /* prioritize this over any other relocation */ 149 /* prioritize this over any other relocation */
@@ -158,10 +158,10 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
158 return -EINVAL; 158 return -EINVAL;
159 } 159 }
160 160
161 p->relocs[i].domain = domain; 161 p->relocs[i].prefered_domains = domain;
162 if (domain == RADEON_GEM_DOMAIN_VRAM) 162 if (domain == RADEON_GEM_DOMAIN_VRAM)
163 domain |= RADEON_GEM_DOMAIN_GTT; 163 domain |= RADEON_GEM_DOMAIN_GTT;
164 p->relocs[i].alt_domain = domain; 164 p->relocs[i].allowed_domains = domain;
165 } 165 }
166 166
167 p->relocs[i].tv.bo = &p->relocs[i].robj->tbo; 167 p->relocs[i].tv.bo = &p->relocs[i].robj->tbo;
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 31565de1116c..03686fab842d 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1052,6 +1052,43 @@ static void radeon_check_arguments(struct radeon_device *rdev)
1052 radeon_agpmode = 0; 1052 radeon_agpmode = 0;
1053 break; 1053 break;
1054 } 1054 }
1055
1056 if (!radeon_check_pot_argument(radeon_vm_size)) {
1057 dev_warn(rdev->dev, "VM size (%d) must be a power of 2\n",
1058 radeon_vm_size);
1059 radeon_vm_size = 4096;
1060 }
1061
1062 if (radeon_vm_size < 4) {
1063 dev_warn(rdev->dev, "VM size (%d) to small, min is 4MB\n",
1064 radeon_vm_size);
1065 radeon_vm_size = 4096;
1066 }
1067
1068 /*
1069 * Max GPUVM size for Cayman, SI and CI are 40 bits.
1070 */
1071 if (radeon_vm_size > 1024*1024) {
1072 dev_warn(rdev->dev, "VM size (%d) to large, max is 1TB\n",
1073 radeon_vm_size);
1074 radeon_vm_size = 4096;
1075 }
1076
1077 /* defines number of bits in page table versus page directory,
1078 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1079 * page table and the remaining bits are in the page directory */
1080 if (radeon_vm_block_size < 9) {
1081 dev_warn(rdev->dev, "VM page table size (%d) to small\n",
1082 radeon_vm_block_size);
1083 radeon_vm_block_size = 9;
1084 }
1085
1086 if (radeon_vm_block_size > 24 ||
1087 radeon_vm_size < (1ull << radeon_vm_block_size)) {
1088 dev_warn(rdev->dev, "VM page table size (%d) to large\n",
1089 radeon_vm_block_size);
1090 radeon_vm_block_size = 9;
1091 }
1055} 1092}
1056 1093
1057/** 1094/**
@@ -1197,17 +1234,16 @@ int radeon_device_init(struct radeon_device *rdev,
1197 if (r) 1234 if (r)
1198 return r; 1235 return r;
1199 1236
1237 radeon_check_arguments(rdev);
1200 /* Adjust VM size here. 1238 /* Adjust VM size here.
1201 * Currently set to 4GB ((1 << 20) 4k pages). 1239 * Max GPUVM size for cayman+ is 40 bits.
1202 * Max GPUVM size for cayman and SI is 40 bits.
1203 */ 1240 */
1204 rdev->vm_manager.max_pfn = 1 << 20; 1241 rdev->vm_manager.max_pfn = radeon_vm_size << 8;
1205 1242
1206 /* Set asic functions */ 1243 /* Set asic functions */
1207 r = radeon_asic_init(rdev); 1244 r = radeon_asic_init(rdev);
1208 if (r) 1245 if (r)
1209 return r; 1246 return r;
1210 radeon_check_arguments(rdev);
1211 1247
1212 /* all of the newer IGP chips have an internal gart 1248 /* all of the newer IGP chips have an internal gart
1213 * However some rs4xx report as AGP, so remove that here. 1249 * However some rs4xx report as AGP, so remove that here.
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index a4e725c6b8c8..5ed617056b9c 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -462,9 +462,6 @@ static void radeon_flip_work_func(struct work_struct *__work)
462 /* We borrow the event spin lock for protecting flip_work */ 462 /* We borrow the event spin lock for protecting flip_work */
463 spin_lock_irqsave(&crtc->dev->event_lock, flags); 463 spin_lock_irqsave(&crtc->dev->event_lock, flags);
464 464
465 /* update crtc fb */
466 crtc->primary->fb = fb;
467
468 /* set the proper interrupt */ 465 /* set the proper interrupt */
469 radeon_irq_kms_pflip_irq_get(rdev, radeon_crtc->crtc_id); 466 radeon_irq_kms_pflip_irq_get(rdev, radeon_crtc->crtc_id);
470 467
@@ -539,6 +536,9 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
539 } 536 }
540 radeon_crtc->flip_work = work; 537 radeon_crtc->flip_work = work;
541 538
539 /* update crtc fb */
540 crtc->primary->fb = fb;
541
542 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 542 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
543 543
544 queue_work(radeon_crtc->flip_queue, &work->flip_work); 544 queue_work(radeon_crtc->flip_queue, &work->flip_work);
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 15447a4119f4..6e3017413386 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -81,9 +81,10 @@
81 * 2.37.0 - allow GS ring setup on r6xx/r7xx 81 * 2.37.0 - allow GS ring setup on r6xx/r7xx
82 * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN), 82 * 2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN),
83 * CIK: 1D and linear tiling modes contain valid PIPE_CONFIG 83 * CIK: 1D and linear tiling modes contain valid PIPE_CONFIG
84 * 2.39.0 - Add INFO query for number of active CUs
84 */ 85 */
85#define KMS_DRIVER_MAJOR 2 86#define KMS_DRIVER_MAJOR 2
86#define KMS_DRIVER_MINOR 38 87#define KMS_DRIVER_MINOR 39
87#define KMS_DRIVER_PATCHLEVEL 0 88#define KMS_DRIVER_PATCHLEVEL 0
88int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); 89int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
89int radeon_driver_unload_kms(struct drm_device *dev); 90int radeon_driver_unload_kms(struct drm_device *dev);
@@ -172,6 +173,8 @@ int radeon_dpm = -1;
172int radeon_aspm = -1; 173int radeon_aspm = -1;
173int radeon_runtime_pm = -1; 174int radeon_runtime_pm = -1;
174int radeon_hard_reset = 0; 175int radeon_hard_reset = 0;
176int radeon_vm_size = 4096;
177int radeon_vm_block_size = 9;
175 178
176MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); 179MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
177module_param_named(no_wb, radeon_no_wb, int, 0444); 180module_param_named(no_wb, radeon_no_wb, int, 0444);
@@ -239,6 +242,12 @@ module_param_named(runpm, radeon_runtime_pm, int, 0444);
239MODULE_PARM_DESC(hard_reset, "PCI config reset (1 = force enable, 0 = disable (default))"); 242MODULE_PARM_DESC(hard_reset, "PCI config reset (1 = force enable, 0 = disable (default))");
240module_param_named(hard_reset, radeon_hard_reset, int, 0444); 243module_param_named(hard_reset, radeon_hard_reset, int, 0444);
241 244
245MODULE_PARM_DESC(vm_size, "VM address space size in megabytes (default 4GB)");
246module_param_named(vm_size, radeon_vm_size, int, 0444);
247
248MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default 9)");
249module_param_named(vm_block_size, radeon_vm_block_size, int, 0444);
250
242static struct pci_device_id pciidlist[] = { 251static struct pci_device_id pciidlist[] = {
243 radeon_PCI_IDS 252 radeon_PCI_IDS
244}; 253};
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index a77b1c13ea43..913787085dfa 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -819,15 +819,35 @@ static int radeon_debugfs_fence_info(struct seq_file *m, void *data)
819 return 0; 819 return 0;
820} 820}
821 821
822/**
823 * radeon_debugfs_gpu_reset - manually trigger a gpu reset
824 *
825 * Manually trigger a gpu reset at the next fence wait.
826 */
827static int radeon_debugfs_gpu_reset(struct seq_file *m, void *data)
828{
829 struct drm_info_node *node = (struct drm_info_node *) m->private;
830 struct drm_device *dev = node->minor->dev;
831 struct radeon_device *rdev = dev->dev_private;
832
833 down_read(&rdev->exclusive_lock);
834 seq_printf(m, "%d\n", rdev->needs_reset);
835 rdev->needs_reset = true;
836 up_read(&rdev->exclusive_lock);
837
838 return 0;
839}
840
822static struct drm_info_list radeon_debugfs_fence_list[] = { 841static struct drm_info_list radeon_debugfs_fence_list[] = {
823 {"radeon_fence_info", &radeon_debugfs_fence_info, 0, NULL}, 842 {"radeon_fence_info", &radeon_debugfs_fence_info, 0, NULL},
843 {"radeon_gpu_reset", &radeon_debugfs_gpu_reset, 0, NULL}
824}; 844};
825#endif 845#endif
826 846
827int radeon_debugfs_fence_init(struct radeon_device *rdev) 847int radeon_debugfs_fence_init(struct radeon_device *rdev)
828{ 848{
829#if defined(CONFIG_DEBUG_FS) 849#if defined(CONFIG_DEBUG_FS)
830 return radeon_debugfs_add_files(rdev, radeon_debugfs_fence_list, 1); 850 return radeon_debugfs_add_files(rdev, radeon_debugfs_fence_list, 2);
831#else 851#else
832 return 0; 852 return 0;
833#endif 853#endif
diff --git a/drivers/gpu/drm/radeon/radeon_ioc32.c b/drivers/gpu/drm/radeon/radeon_ioc32.c
index bdb0f93e73bc..0b98ea134579 100644
--- a/drivers/gpu/drm/radeon/radeon_ioc32.c
+++ b/drivers/gpu/drm/radeon/radeon_ioc32.c
@@ -399,7 +399,7 @@ long radeon_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
399 if (nr < DRM_COMMAND_BASE) 399 if (nr < DRM_COMMAND_BASE)
400 return drm_compat_ioctl(filp, cmd, arg); 400 return drm_compat_ioctl(filp, cmd, arg);
401 401
402 if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(radeon_compat_ioctls)) 402 if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(radeon_compat_ioctls))
403 fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE]; 403 fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE];
404 404
405 if (fn != NULL) 405 if (fn != NULL)
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index eaaedba04675..35d931881b4b 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -513,6 +513,22 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file
513 value_size = sizeof(uint64_t); 513 value_size = sizeof(uint64_t);
514 value64 = atomic64_read(&rdev->gtt_usage); 514 value64 = atomic64_read(&rdev->gtt_usage);
515 break; 515 break;
516 case RADEON_INFO_ACTIVE_CU_COUNT:
517 if (rdev->family >= CHIP_BONAIRE)
518 *value = rdev->config.cik.active_cus;
519 else if (rdev->family >= CHIP_TAHITI)
520 *value = rdev->config.si.active_cus;
521 else if (rdev->family >= CHIP_CAYMAN)
522 *value = rdev->config.cayman.active_simds;
523 else if (rdev->family >= CHIP_CEDAR)
524 *value = rdev->config.evergreen.active_simds;
525 else if (rdev->family >= CHIP_RV770)
526 *value = rdev->config.rv770.active_simds;
527 else if (rdev->family >= CHIP_R600)
528 *value = rdev->config.r600.active_simds;
529 else
530 *value = 1;
531 break;
516 default: 532 default:
517 DRM_DEBUG_KMS("Invalid request %d\n", info->request); 533 DRM_DEBUG_KMS("Invalid request %d\n", info->request);
518 return -EINVAL; 534 return -EINVAL;
@@ -859,4 +875,4 @@ const struct drm_ioctl_desc radeon_ioctls_kms[] = {
859 DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 875 DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
860 DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 876 DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
861}; 877};
862int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); 878int radeon_max_kms_ioctl = ARRAY_SIZE(radeon_ioctls_kms);
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index ea72ad889a11..ad0e4b8cc7e3 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -506,6 +506,7 @@ struct radeon_connector {
506 struct radeon_i2c_chan *router_bus; 506 struct radeon_i2c_chan *router_bus;
507 enum radeon_connector_audio audio; 507 enum radeon_connector_audio audio;
508 enum radeon_connector_dither dither; 508 enum radeon_connector_dither dither;
509 int pixelclock_for_modeset;
509}; 510};
510 511
511struct radeon_framebuffer { 512struct radeon_framebuffer {
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 2918087e572f..6c717b257d6d 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -446,7 +446,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
446 list_for_each_entry(lobj, head, tv.head) { 446 list_for_each_entry(lobj, head, tv.head) {
447 bo = lobj->robj; 447 bo = lobj->robj;
448 if (!bo->pin_count) { 448 if (!bo->pin_count) {
449 u32 domain = lobj->domain; 449 u32 domain = lobj->prefered_domains;
450 u32 current_domain = 450 u32 current_domain =
451 radeon_mem_type_to_domain(bo->tbo.mem.mem_type); 451 radeon_mem_type_to_domain(bo->tbo.mem.mem_type);
452 452
@@ -458,7 +458,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
458 * into account. We don't want to disallow buffer moves 458 * into account. We don't want to disallow buffer moves
459 * completely. 459 * completely.
460 */ 460 */
461 if ((lobj->alt_domain & current_domain) != 0 && 461 if ((lobj->allowed_domains & current_domain) != 0 &&
462 (domain & current_domain) == 0 && /* will be moved */ 462 (domain & current_domain) == 0 && /* will be moved */
463 bytes_moved > bytes_moved_threshold) { 463 bytes_moved > bytes_moved_threshold) {
464 /* don't move it */ 464 /* don't move it */
@@ -476,8 +476,9 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
476 initial_bytes_moved; 476 initial_bytes_moved;
477 477
478 if (unlikely(r)) { 478 if (unlikely(r)) {
479 if (r != -ERESTARTSYS && domain != lobj->alt_domain) { 479 if (r != -ERESTARTSYS &&
480 domain = lobj->alt_domain; 480 domain != lobj->allowed_domains) {
481 domain = lobj->allowed_domains;
481 goto retry; 482 goto retry;
482 } 483 }
483 ttm_eu_backoff_reservation(ticket, head); 484 ttm_eu_backoff_reservation(ticket, head);
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 2bdae61c0ac0..12c663e86ca1 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -984,6 +984,8 @@ void radeon_dpm_enable_uvd(struct radeon_device *rdev, bool enable)
984 if (enable) { 984 if (enable) {
985 mutex_lock(&rdev->pm.mutex); 985 mutex_lock(&rdev->pm.mutex);
986 rdev->pm.dpm.uvd_active = true; 986 rdev->pm.dpm.uvd_active = true;
987 /* disable this for now */
988#if 0
987 if ((rdev->pm.dpm.sd == 1) && (rdev->pm.dpm.hd == 0)) 989 if ((rdev->pm.dpm.sd == 1) && (rdev->pm.dpm.hd == 0))
988 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_SD; 990 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_SD;
989 else if ((rdev->pm.dpm.sd == 2) && (rdev->pm.dpm.hd == 0)) 991 else if ((rdev->pm.dpm.sd == 2) && (rdev->pm.dpm.hd == 0))
@@ -993,6 +995,7 @@ void radeon_dpm_enable_uvd(struct radeon_device *rdev, bool enable)
993 else if ((rdev->pm.dpm.sd == 0) && (rdev->pm.dpm.hd == 2)) 995 else if ((rdev->pm.dpm.sd == 0) && (rdev->pm.dpm.hd == 2))
994 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD2; 996 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD2;
995 else 997 else
998#endif
996 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD; 999 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD;
997 rdev->pm.dpm.state = dpm_state; 1000 rdev->pm.dpm.state = dpm_state;
998 mutex_unlock(&rdev->pm.mutex); 1001 mutex_unlock(&rdev->pm.mutex);
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c
index b576549fc783..23bb64fd775f 100644
--- a/drivers/gpu/drm/radeon/radeon_state.c
+++ b/drivers/gpu/drm/radeon/radeon_state.c
@@ -3258,4 +3258,4 @@ struct drm_ioctl_desc radeon_ioctls[] = {
3258 DRM_IOCTL_DEF_DRV(RADEON_CS, r600_cs_legacy_ioctl, DRM_AUTH) 3258 DRM_IOCTL_DEF_DRV(RADEON_CS, r600_cs_legacy_ioctl, DRM_AUTH)
3259}; 3259};
3260 3260
3261int radeon_max_ioctl = DRM_ARRAY_SIZE(radeon_ioctls); 3261int radeon_max_ioctl = ARRAY_SIZE(radeon_ioctls);
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 1b65ae2433cd..a4ad270e8261 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -812,7 +812,8 @@ void radeon_uvd_note_usage(struct radeon_device *rdev)
812 (rdev->pm.dpm.hd != hd)) { 812 (rdev->pm.dpm.hd != hd)) {
813 rdev->pm.dpm.sd = sd; 813 rdev->pm.dpm.sd = sd;
814 rdev->pm.dpm.hd = hd; 814 rdev->pm.dpm.hd = hd;
815 streams_changed = true; 815 /* disable this for now */
816 /*streams_changed = true;*/
816 } 817 }
817 } 818 }
818 819
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
index 3971d968af6c..aa21c31a846c 100644
--- a/drivers/gpu/drm/radeon/radeon_vce.c
+++ b/drivers/gpu/drm/radeon/radeon_vce.c
@@ -66,6 +66,7 @@ int radeon_vce_init(struct radeon_device *rdev)
66 case CHIP_BONAIRE: 66 case CHIP_BONAIRE:
67 case CHIP_KAVERI: 67 case CHIP_KAVERI:
68 case CHIP_KABINI: 68 case CHIP_KABINI:
69 case CHIP_HAWAII:
69 case CHIP_MULLINS: 70 case CHIP_MULLINS:
70 fw_name = FIRMWARE_BONAIRE; 71 fw_name = FIRMWARE_BONAIRE;
71 break; 72 break;
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index a72e9c81805d..899d9126cad6 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -59,7 +59,7 @@
59 */ 59 */
60static unsigned radeon_vm_num_pdes(struct radeon_device *rdev) 60static unsigned radeon_vm_num_pdes(struct radeon_device *rdev)
61{ 61{
62 return rdev->vm_manager.max_pfn >> RADEON_VM_BLOCK_SIZE; 62 return rdev->vm_manager.max_pfn >> radeon_vm_block_size;
63} 63}
64 64
65/** 65/**
@@ -140,8 +140,8 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
140 /* add the vm page table to the list */ 140 /* add the vm page table to the list */
141 list[0].gobj = NULL; 141 list[0].gobj = NULL;
142 list[0].robj = vm->page_directory; 142 list[0].robj = vm->page_directory;
143 list[0].domain = RADEON_GEM_DOMAIN_VRAM; 143 list[0].prefered_domains = RADEON_GEM_DOMAIN_VRAM;
144 list[0].alt_domain = RADEON_GEM_DOMAIN_VRAM; 144 list[0].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
145 list[0].tv.bo = &vm->page_directory->tbo; 145 list[0].tv.bo = &vm->page_directory->tbo;
146 list[0].tiling_flags = 0; 146 list[0].tiling_flags = 0;
147 list[0].handle = 0; 147 list[0].handle = 0;
@@ -153,8 +153,8 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
153 153
154 list[idx].gobj = NULL; 154 list[idx].gobj = NULL;
155 list[idx].robj = vm->page_tables[i].bo; 155 list[idx].robj = vm->page_tables[i].bo;
156 list[idx].domain = RADEON_GEM_DOMAIN_VRAM; 156 list[idx].prefered_domains = RADEON_GEM_DOMAIN_VRAM;
157 list[idx].alt_domain = RADEON_GEM_DOMAIN_VRAM; 157 list[idx].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
158 list[idx].tv.bo = &list[idx].robj->tbo; 158 list[idx].tv.bo = &list[idx].robj->tbo;
159 list[idx].tiling_flags = 0; 159 list[idx].tiling_flags = 0;
160 list[idx].handle = 0; 160 list[idx].handle = 0;
@@ -474,8 +474,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
474 bo_va->valid = false; 474 bo_va->valid = false;
475 list_move(&bo_va->vm_list, head); 475 list_move(&bo_va->vm_list, head);
476 476
477 soffset = (soffset / RADEON_GPU_PAGE_SIZE) >> RADEON_VM_BLOCK_SIZE; 477 soffset = (soffset / RADEON_GPU_PAGE_SIZE) >> radeon_vm_block_size;
478 eoffset = (eoffset / RADEON_GPU_PAGE_SIZE) >> RADEON_VM_BLOCK_SIZE; 478 eoffset = (eoffset / RADEON_GPU_PAGE_SIZE) >> radeon_vm_block_size;
479
480 BUG_ON(eoffset >= radeon_vm_num_pdes(rdev));
479 481
480 if (eoffset > vm->max_pde_used) 482 if (eoffset > vm->max_pde_used)
481 vm->max_pde_used = eoffset; 483 vm->max_pde_used = eoffset;
@@ -583,10 +585,9 @@ static uint32_t radeon_vm_page_flags(uint32_t flags)
583int radeon_vm_update_page_directory(struct radeon_device *rdev, 585int radeon_vm_update_page_directory(struct radeon_device *rdev,
584 struct radeon_vm *vm) 586 struct radeon_vm *vm)
585{ 587{
586 static const uint32_t incr = RADEON_VM_PTE_COUNT * 8;
587
588 struct radeon_bo *pd = vm->page_directory; 588 struct radeon_bo *pd = vm->page_directory;
589 uint64_t pd_addr = radeon_bo_gpu_offset(pd); 589 uint64_t pd_addr = radeon_bo_gpu_offset(pd);
590 uint32_t incr = RADEON_VM_PTE_COUNT * 8;
590 uint64_t last_pde = ~0, last_pt = ~0; 591 uint64_t last_pde = ~0, last_pt = ~0;
591 unsigned count = 0, pt_idx, ndw; 592 unsigned count = 0, pt_idx, ndw;
592 struct radeon_ib ib; 593 struct radeon_ib ib;
@@ -757,8 +758,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
757 uint64_t start, uint64_t end, 758 uint64_t start, uint64_t end,
758 uint64_t dst, uint32_t flags) 759 uint64_t dst, uint32_t flags)
759{ 760{
760 static const uint64_t mask = RADEON_VM_PTE_COUNT - 1; 761 uint64_t mask = RADEON_VM_PTE_COUNT - 1;
761
762 uint64_t last_pte = ~0, last_dst = ~0; 762 uint64_t last_pte = ~0, last_dst = ~0;
763 unsigned count = 0; 763 unsigned count = 0;
764 uint64_t addr; 764 uint64_t addr;
@@ -768,7 +768,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
768 768
769 /* walk over the address space and update the page tables */ 769 /* walk over the address space and update the page tables */
770 for (addr = start; addr < end; ) { 770 for (addr = start; addr < end; ) {
771 uint64_t pt_idx = addr >> RADEON_VM_BLOCK_SIZE; 771 uint64_t pt_idx = addr >> radeon_vm_block_size;
772 struct radeon_bo *pt = vm->page_tables[pt_idx].bo; 772 struct radeon_bo *pt = vm->page_tables[pt_idx].bo;
773 unsigned nptes; 773 unsigned nptes;
774 uint64_t pte; 774 uint64_t pte;
@@ -873,13 +873,13 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
873 /* padding, etc. */ 873 /* padding, etc. */
874 ndw = 64; 874 ndw = 64;
875 875
876 if (RADEON_VM_BLOCK_SIZE > 11) 876 if (radeon_vm_block_size > 11)
877 /* reserve space for one header for every 2k dwords */ 877 /* reserve space for one header for every 2k dwords */
878 ndw += (nptes >> 11) * 4; 878 ndw += (nptes >> 11) * 4;
879 else 879 else
880 /* reserve space for one header for 880 /* reserve space for one header for
881 every (1 << BLOCK_SIZE) entries */ 881 every (1 << BLOCK_SIZE) entries */
882 ndw += (nptes >> RADEON_VM_BLOCK_SIZE) * 4; 882 ndw += (nptes >> radeon_vm_block_size) * 4;
883 883
884 /* reserve space for pte addresses */ 884 /* reserve space for pte addresses */
885 ndw += nptes * 2; 885 ndw += nptes * 2;
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index 130d5cc50d43..a0f96decece3 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -212,21 +212,16 @@ void rs400_gart_fini(struct radeon_device *rdev)
212#define RS400_PTE_WRITEABLE (1 << 2) 212#define RS400_PTE_WRITEABLE (1 << 2)
213#define RS400_PTE_READABLE (1 << 3) 213#define RS400_PTE_READABLE (1 << 3)
214 214
215int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 215void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr)
216{ 216{
217 uint32_t entry; 217 uint32_t entry;
218 u32 *gtt = rdev->gart.ptr; 218 u32 *gtt = rdev->gart.ptr;
219 219
220 if (i < 0 || i > rdev->gart.num_gpu_pages) {
221 return -EINVAL;
222 }
223
224 entry = (lower_32_bits(addr) & PAGE_MASK) | 220 entry = (lower_32_bits(addr) & PAGE_MASK) |
225 ((upper_32_bits(addr) & 0xff) << 4) | 221 ((upper_32_bits(addr) & 0xff) << 4) |
226 RS400_PTE_WRITEABLE | RS400_PTE_READABLE; 222 RS400_PTE_WRITEABLE | RS400_PTE_READABLE;
227 entry = cpu_to_le32(entry); 223 entry = cpu_to_le32(entry);
228 gtt[i] = entry; 224 gtt[i] = entry;
229 return 0;
230} 225}
231 226
232int rs400_mc_wait_for_idle(struct radeon_device *rdev) 227int rs400_mc_wait_for_idle(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 0a8be63926d8..d1a35cb1c91d 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -626,17 +626,16 @@ static void rs600_gart_fini(struct radeon_device *rdev)
626 radeon_gart_table_vram_free(rdev); 626 radeon_gart_table_vram_free(rdev);
627} 627}
628 628
629int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 629void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr)
630{ 630{
631 void __iomem *ptr = (void *)rdev->gart.ptr; 631 void __iomem *ptr = (void *)rdev->gart.ptr;
632 632
633 if (i < 0 || i > rdev->gart.num_gpu_pages) {
634 return -EINVAL;
635 }
636 addr = addr & 0xFFFFFFFFFFFFF000ULL; 633 addr = addr & 0xFFFFFFFFFFFFF000ULL;
637 addr |= R600_PTE_GART; 634 if (addr == rdev->dummy_page.addr)
635 addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED;
636 else
637 addr |= R600_PTE_GART;
638 writeq(addr, ptr + (i * 8)); 638 writeq(addr, ptr + (i * 8));
639 return 0;
640} 639}
641 640
642int rs600_irq_set(struct radeon_device *rdev) 641int rs600_irq_set(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 97b776666b75..da8703d8d455 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -1327,6 +1327,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)
1327 if (tmp < rdev->config.rv770.max_simds) { 1327 if (tmp < rdev->config.rv770.max_simds) {
1328 rdev->config.rv770.max_simds = tmp; 1328 rdev->config.rv770.max_simds = tmp;
1329 } 1329 }
1330 tmp = rdev->config.rv770.max_simds -
1331 r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1332 rdev->config.rv770.active_simds = tmp;
1330 1333
1331 switch (rdev->config.rv770.max_tile_pipes) { 1334 switch (rdev->config.rv770.max_tile_pipes) {
1332 case 1: 1335 case 1:
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index d64ef9115b69..730cee2c34cf 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -71,6 +71,7 @@ MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
71MODULE_FIRMWARE("radeon/HAINAN_rlc.bin"); 71MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
72MODULE_FIRMWARE("radeon/HAINAN_smc.bin"); 72MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
73 73
74static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
74static void si_pcie_gen3_enable(struct radeon_device *rdev); 75static void si_pcie_gen3_enable(struct radeon_device *rdev);
75static void si_program_aspm(struct radeon_device *rdev); 76static void si_program_aspm(struct radeon_device *rdev);
76extern void sumo_rlc_fini(struct radeon_device *rdev); 77extern void sumo_rlc_fini(struct radeon_device *rdev);
@@ -2900,7 +2901,7 @@ static void si_gpu_init(struct radeon_device *rdev)
2900 u32 sx_debug_1; 2901 u32 sx_debug_1;
2901 u32 hdp_host_path_cntl; 2902 u32 hdp_host_path_cntl;
2902 u32 tmp; 2903 u32 tmp;
2903 int i, j; 2904 int i, j, k;
2904 2905
2905 switch (rdev->family) { 2906 switch (rdev->family) {
2906 case CHIP_TAHITI: 2907 case CHIP_TAHITI:
@@ -3098,6 +3099,14 @@ static void si_gpu_init(struct radeon_device *rdev)
3098 rdev->config.si.max_sh_per_se, 3099 rdev->config.si.max_sh_per_se,
3099 rdev->config.si.max_cu_per_sh); 3100 rdev->config.si.max_cu_per_sh);
3100 3101
3102 for (i = 0; i < rdev->config.si.max_shader_engines; i++) {
3103 for (j = 0; j < rdev->config.si.max_sh_per_se; j++) {
3104 for (k = 0; k < rdev->config.si.max_cu_per_sh; k++) {
3105 rdev->config.si.active_cus +=
3106 hweight32(si_get_cu_active_bitmap(rdev, i, j));
3107 }
3108 }
3109 }
3101 3110
3102 /* set HW defaults for 3D engine */ 3111 /* set HW defaults for 3D engine */
3103 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | 3112 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
@@ -3186,7 +3195,7 @@ void si_fence_ring_emit(struct radeon_device *rdev,
3186 /* EVENT_WRITE_EOP - flush caches, send int */ 3195 /* EVENT_WRITE_EOP - flush caches, send int */
3187 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 3196 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
3188 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5)); 3197 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
3189 radeon_ring_write(ring, addr & 0xffffffff); 3198 radeon_ring_write(ring, lower_32_bits(addr));
3190 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 3199 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
3191 radeon_ring_write(ring, fence->seq); 3200 radeon_ring_write(ring, fence->seq);
3192 radeon_ring_write(ring, 0); 3201 radeon_ring_write(ring, 0);
@@ -3219,7 +3228,7 @@ void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3219 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3228 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3220 radeon_ring_write(ring, (1 << 8)); 3229 radeon_ring_write(ring, (1 << 8));
3221 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); 3230 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3222 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); 3231 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr));
3223 radeon_ring_write(ring, next_rptr); 3232 radeon_ring_write(ring, next_rptr);
3224 } 3233 }
3225 3234
@@ -4095,7 +4104,7 @@ static int si_pcie_gart_enable(struct radeon_device *rdev)
4095 (u32)(rdev->dummy_page.addr >> 12)); 4104 (u32)(rdev->dummy_page.addr >> 12));
4096 WREG32(VM_CONTEXT1_CNTL2, 4); 4105 WREG32(VM_CONTEXT1_CNTL2, 4);
4097 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | 4106 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
4098 PAGE_TABLE_BLOCK_SIZE(RADEON_VM_BLOCK_SIZE - 9) | 4107 PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
4099 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 4108 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
4100 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | 4109 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
4101 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 4110 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
index 9a660f861d2c..e24c94b6d14d 100644
--- a/drivers/gpu/drm/radeon/si_dma.c
+++ b/drivers/gpu/drm/radeon/si_dma.c
@@ -88,8 +88,8 @@ void si_dma_vm_set_page(struct radeon_device *rdev,
88 88
89 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY, 89 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,
90 1, 0, 0, bytes); 90 1, 0, 0, bytes);
91 ib->ptr[ib->length_dw++] = pe & 0xffffffff; 91 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
92 ib->ptr[ib->length_dw++] = src & 0xffffffff; 92 ib->ptr[ib->length_dw++] = lower_32_bits(src);
93 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 93 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
94 ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff; 94 ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff;
95 95
@@ -220,8 +220,8 @@ int si_copy_dma(struct radeon_device *rdev,
220 cur_size_in_bytes = 0xFFFFF; 220 cur_size_in_bytes = 0xFFFFF;
221 size_in_bytes -= cur_size_in_bytes; 221 size_in_bytes -= cur_size_in_bytes;
222 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 1, 0, 0, cur_size_in_bytes)); 222 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 1, 0, 0, cur_size_in_bytes));
223 radeon_ring_write(ring, dst_offset & 0xffffffff); 223 radeon_ring_write(ring, lower_32_bits(dst_offset));
224 radeon_ring_write(ring, src_offset & 0xffffffff); 224 radeon_ring_write(ring, lower_32_bits(src_offset));
225 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); 225 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
226 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff); 226 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
227 src_offset += cur_size_in_bytes; 227 src_offset += cur_size_in_bytes;
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
index 9a3567bedaae..58918868f894 100644
--- a/drivers/gpu/drm/radeon/si_dpm.c
+++ b/drivers/gpu/drm/radeon/si_dpm.c
@@ -1948,6 +1948,10 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
1948 si_pi->cac_weights = cac_weights_cape_verde_pro; 1948 si_pi->cac_weights = cac_weights_cape_verde_pro;
1949 si_pi->dte_data = dte_data_cape_verde; 1949 si_pi->dte_data = dte_data_cape_verde;
1950 break; 1950 break;
1951 case 0x682C:
1952 si_pi->cac_weights = cac_weights_cape_verde_pro;
1953 si_pi->dte_data = dte_data_sun_xt;
1954 break;
1951 case 0x6825: 1955 case 0x6825:
1952 case 0x6827: 1956 case 0x6827:
1953 si_pi->cac_weights = cac_weights_heathrow; 1957 si_pi->cac_weights = cac_weights_heathrow;
@@ -1971,10 +1975,9 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
1971 si_pi->dte_data = dte_data_venus_xt; 1975 si_pi->dte_data = dte_data_venus_xt;
1972 break; 1976 break;
1973 case 0x6823: 1977 case 0x6823:
1974 si_pi->cac_weights = cac_weights_chelsea_pro;
1975 si_pi->dte_data = dte_data_venus_pro;
1976 break;
1977 case 0x682B: 1978 case 0x682B:
1979 case 0x6822:
1980 case 0x682A:
1978 si_pi->cac_weights = cac_weights_chelsea_pro; 1981 si_pi->cac_weights = cac_weights_chelsea_pro;
1979 si_pi->dte_data = dte_data_venus_pro; 1982 si_pi->dte_data = dte_data_venus_pro;
1980 break; 1983 break;
@@ -1988,6 +1991,7 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
1988 case 0x6601: 1991 case 0x6601:
1989 case 0x6621: 1992 case 0x6621:
1990 case 0x6603: 1993 case 0x6603:
1994 case 0x6605:
1991 si_pi->cac_weights = cac_weights_mars_pro; 1995 si_pi->cac_weights = cac_weights_mars_pro;
1992 si_pi->lcac_config = lcac_mars_pro; 1996 si_pi->lcac_config = lcac_mars_pro;
1993 si_pi->cac_override = cac_override_oland; 1997 si_pi->cac_override = cac_override_oland;
@@ -1998,6 +2002,7 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
1998 case 0x6600: 2002 case 0x6600:
1999 case 0x6606: 2003 case 0x6606:
2000 case 0x6620: 2004 case 0x6620:
2005 case 0x6604:
2001 si_pi->cac_weights = cac_weights_mars_xt; 2006 si_pi->cac_weights = cac_weights_mars_xt;
2002 si_pi->lcac_config = lcac_mars_pro; 2007 si_pi->lcac_config = lcac_mars_pro;
2003 si_pi->cac_override = cac_override_oland; 2008 si_pi->cac_override = cac_override_oland;
@@ -2006,6 +2011,8 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
2006 update_dte_from_pl2 = true; 2011 update_dte_from_pl2 = true;
2007 break; 2012 break;
2008 case 0x6611: 2013 case 0x6611:
2014 case 0x6613:
2015 case 0x6608:
2009 si_pi->cac_weights = cac_weights_oland_pro; 2016 si_pi->cac_weights = cac_weights_oland_pro;
2010 si_pi->lcac_config = lcac_mars_pro; 2017 si_pi->lcac_config = lcac_mars_pro;
2011 si_pi->cac_override = cac_override_oland; 2018 si_pi->cac_override = cac_override_oland;
diff --git a/drivers/gpu/drm/radeon/uvd_v2_2.c b/drivers/gpu/drm/radeon/uvd_v2_2.c
index d1771004cb52..8bfdadd56598 100644
--- a/drivers/gpu/drm/radeon/uvd_v2_2.c
+++ b/drivers/gpu/drm/radeon/uvd_v2_2.c
@@ -45,7 +45,7 @@ void uvd_v2_2_fence_emit(struct radeon_device *rdev,
45 radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0)); 45 radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0));
46 radeon_ring_write(ring, fence->seq); 46 radeon_ring_write(ring, fence->seq);
47 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA0, 0)); 47 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA0, 0));
48 radeon_ring_write(ring, addr & 0xffffffff); 48 radeon_ring_write(ring, lower_32_bits(addr));
49 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA1, 0)); 49 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA1, 0));
50 radeon_ring_write(ring, upper_32_bits(addr) & 0xff); 50 radeon_ring_write(ring, upper_32_bits(addr) & 0xff);
51 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_CMD, 0)); 51 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_CMD, 0));
diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c
index d2b2df9e26f3..c97cdc9ab239 100644
--- a/drivers/gpu/drm/savage/savage_bci.c
+++ b/drivers/gpu/drm/savage/savage_bci.c
@@ -1079,4 +1079,4 @@ const struct drm_ioctl_desc savage_ioctls[] = {
1079 DRM_IOCTL_DEF_DRV(SAVAGE_BCI_EVENT_WAIT, savage_bci_event_wait, DRM_AUTH), 1079 DRM_IOCTL_DEF_DRV(SAVAGE_BCI_EVENT_WAIT, savage_bci_event_wait, DRM_AUTH),
1080}; 1080};
1081 1081
1082int savage_max_ioctl = DRM_ARRAY_SIZE(savage_ioctls); 1082int savage_max_ioctl = ARRAY_SIZE(savage_ioctls);
diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c
index 0573be0d2933..77f288e4a0a6 100644
--- a/drivers/gpu/drm/sis/sis_mm.c
+++ b/drivers/gpu/drm/sis/sis_mm.c
@@ -359,4 +359,4 @@ const struct drm_ioctl_desc sis_ioctls[] = {
359 DRM_IOCTL_DEF_DRV(SIS_FB_INIT, sis_fb_init, DRM_AUTH | DRM_MASTER | DRM_ROOT_ONLY), 359 DRM_IOCTL_DEF_DRV(SIS_FB_INIT, sis_fb_init, DRM_AUTH | DRM_MASTER | DRM_ROOT_ONLY),
360}; 360};
361 361
362int sis_max_ioctl = DRM_ARRAY_SIZE(sis_ioctls); 362int sis_max_ioctl = ARRAY_SIZE(sis_ioctls);
diff --git a/drivers/gpu/drm/via/via_dma.c b/drivers/gpu/drm/via/via_dma.c
index a18479c6b6da..6fc0648dd37f 100644
--- a/drivers/gpu/drm/via/via_dma.c
+++ b/drivers/gpu/drm/via/via_dma.c
@@ -737,4 +737,4 @@ const struct drm_ioctl_desc via_ioctls[] = {
737 DRM_IOCTL_DEF_DRV(VIA_BLIT_SYNC, via_dma_blit_sync, DRM_AUTH) 737 DRM_IOCTL_DEF_DRV(VIA_BLIT_SYNC, via_dma_blit_sync, DRM_AUTH)
738}; 738};
739 739
740int via_max_ioctl = DRM_ARRAY_SIZE(via_ioctls); 740int via_max_ioctl = ARRAY_SIZE(via_ioctls);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 6bdd15eea7e8..246a62bab378 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -1417,7 +1417,7 @@ static struct drm_driver driver = {
1417 .enable_vblank = vmw_enable_vblank, 1417 .enable_vblank = vmw_enable_vblank,
1418 .disable_vblank = vmw_disable_vblank, 1418 .disable_vblank = vmw_disable_vblank,
1419 .ioctls = vmw_ioctls, 1419 .ioctls = vmw_ioctls,
1420 .num_ioctls = DRM_ARRAY_SIZE(vmw_ioctls), 1420 .num_ioctls = ARRAY_SIZE(vmw_ioctls),
1421 .master_create = vmw_master_create, 1421 .master_create = vmw_master_create,
1422 .master_destroy = vmw_master_destroy, 1422 .master_destroy = vmw_master_destroy,
1423 .master_set = vmw_master_set, 1423 .master_set = vmw_master_set,
diff --git a/drivers/gpu/ipu-v3/Kconfig b/drivers/gpu/ipu-v3/Kconfig
new file mode 100644
index 000000000000..2f228a2f2a48
--- /dev/null
+++ b/drivers/gpu/ipu-v3/Kconfig
@@ -0,0 +1,7 @@
1config IMX_IPUV3_CORE
2 tristate "IPUv3 core support"
3 depends on SOC_IMX5 || SOC_IMX6Q || SOC_IMX6SL || ARCH_MULTIPLATFORM
4 depends on RESET_CONTROLLER
5 help
6 Choose this if you have a i.MX5/6 system and want to use the Image
7 Processing Unit. This option only enables IPU base support.
diff --git a/drivers/staging/imx-drm/ipu-v3/Makefile b/drivers/gpu/ipu-v3/Makefile
index 28ed72e98a96..1887972b4ac2 100644
--- a/drivers/staging/imx-drm/ipu-v3/Makefile
+++ b/drivers/gpu/ipu-v3/Makefile
@@ -1,3 +1,3 @@
1obj-$(CONFIG_DRM_IMX_IPUV3_CORE) += imx-ipu-v3.o 1obj-$(CONFIG_IMX_IPUV3_CORE) += imx-ipu-v3.o
2 2
3imx-ipu-v3-objs := ipu-common.o ipu-dc.o ipu-di.o ipu-dp.o ipu-dmfc.o 3imx-ipu-v3-objs := ipu-common.o ipu-dc.o ipu-di.o ipu-dp.o ipu-dmfc.o ipu-smfc.o
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
index ca85d3d70ae3..719788ce7d9f 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c
+++ b/drivers/gpu/ipu-v3/ipu-common.c
@@ -31,7 +31,7 @@
31 31
32#include <drm/drm_fourcc.h> 32#include <drm/drm_fourcc.h>
33 33
34#include "imx-ipu-v3.h" 34#include <video/imx-ipu-v3.h>
35#include "ipu-prv.h" 35#include "ipu-prv.h"
36 36
37static inline u32 ipu_cm_read(struct ipu_soc *ipu, unsigned offset) 37static inline u32 ipu_cm_read(struct ipu_soc *ipu, unsigned offset)
@@ -661,6 +661,39 @@ int ipu_module_disable(struct ipu_soc *ipu, u32 mask)
661} 661}
662EXPORT_SYMBOL_GPL(ipu_module_disable); 662EXPORT_SYMBOL_GPL(ipu_module_disable);
663 663
664int ipu_csi_enable(struct ipu_soc *ipu, int csi)
665{
666 return ipu_module_enable(ipu, csi ? IPU_CONF_CSI1_EN : IPU_CONF_CSI0_EN);
667}
668EXPORT_SYMBOL_GPL(ipu_csi_enable);
669
670int ipu_csi_disable(struct ipu_soc *ipu, int csi)
671{
672 return ipu_module_disable(ipu, csi ? IPU_CONF_CSI1_EN : IPU_CONF_CSI0_EN);
673}
674EXPORT_SYMBOL_GPL(ipu_csi_disable);
675
676int ipu_smfc_enable(struct ipu_soc *ipu)
677{
678 return ipu_module_enable(ipu, IPU_CONF_SMFC_EN);
679}
680EXPORT_SYMBOL_GPL(ipu_smfc_enable);
681
682int ipu_smfc_disable(struct ipu_soc *ipu)
683{
684 return ipu_module_disable(ipu, IPU_CONF_SMFC_EN);
685}
686EXPORT_SYMBOL_GPL(ipu_smfc_disable);
687
688int ipu_idmac_get_current_buffer(struct ipuv3_channel *channel)
689{
690 struct ipu_soc *ipu = channel->ipu;
691 unsigned int chno = channel->num;
692
693 return (ipu_cm_read(ipu, IPU_CHA_CUR_BUF(chno)) & idma_mask(chno)) ? 1 : 0;
694}
695EXPORT_SYMBOL_GPL(ipu_idmac_get_current_buffer);
696
664void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num) 697void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num)
665{ 698{
666 struct ipu_soc *ipu = channel->ipu; 699 struct ipu_soc *ipu = channel->ipu;
@@ -874,8 +907,17 @@ static int ipu_submodules_init(struct ipu_soc *ipu,
874 goto err_dp; 907 goto err_dp;
875 } 908 }
876 909
910 ret = ipu_smfc_init(ipu, dev, ipu_base +
911 devtype->cm_ofs + IPU_CM_SMFC_REG_OFS);
912 if (ret) {
913 unit = "smfc";
914 goto err_smfc;
915 }
916
877 return 0; 917 return 0;
878 918
919err_smfc:
920 ipu_dp_exit(ipu);
879err_dp: 921err_dp:
880 ipu_dmfc_exit(ipu); 922 ipu_dmfc_exit(ipu);
881err_dmfc: 923err_dmfc:
@@ -947,6 +989,7 @@ EXPORT_SYMBOL_GPL(ipu_idmac_channel_irq);
947 989
948static void ipu_submodules_exit(struct ipu_soc *ipu) 990static void ipu_submodules_exit(struct ipu_soc *ipu)
949{ 991{
992 ipu_smfc_exit(ipu);
950 ipu_dp_exit(ipu); 993 ipu_dp_exit(ipu);
951 ipu_dmfc_exit(ipu); 994 ipu_dmfc_exit(ipu);
952 ipu_dc_exit(ipu); 995 ipu_dc_exit(ipu);
@@ -971,6 +1014,7 @@ static void platform_device_unregister_children(struct platform_device *pdev)
971struct ipu_platform_reg { 1014struct ipu_platform_reg {
972 struct ipu_client_platformdata pdata; 1015 struct ipu_client_platformdata pdata;
973 const char *name; 1016 const char *name;
1017 int reg_offset;
974}; 1018};
975 1019
976static const struct ipu_platform_reg client_reg[] = { 1020static const struct ipu_platform_reg client_reg[] = {
@@ -992,13 +1036,29 @@ static const struct ipu_platform_reg client_reg[] = {
992 .dma[1] = -EINVAL, 1036 .dma[1] = -EINVAL,
993 }, 1037 },
994 .name = "imx-ipuv3-crtc", 1038 .name = "imx-ipuv3-crtc",
1039 }, {
1040 .pdata = {
1041 .csi = 0,
1042 .dma[0] = IPUV3_CHANNEL_CSI0,
1043 .dma[1] = -EINVAL,
1044 },
1045 .reg_offset = IPU_CM_CSI0_REG_OFS,
1046 .name = "imx-ipuv3-camera",
1047 }, {
1048 .pdata = {
1049 .csi = 1,
1050 .dma[0] = IPUV3_CHANNEL_CSI1,
1051 .dma[1] = -EINVAL,
1052 },
1053 .reg_offset = IPU_CM_CSI1_REG_OFS,
1054 .name = "imx-ipuv3-camera",
995 }, 1055 },
996}; 1056};
997 1057
998static DEFINE_MUTEX(ipu_client_id_mutex); 1058static DEFINE_MUTEX(ipu_client_id_mutex);
999static int ipu_client_id; 1059static int ipu_client_id;
1000 1060
1001static int ipu_add_client_devices(struct ipu_soc *ipu) 1061static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
1002{ 1062{
1003 struct device *dev = ipu->dev; 1063 struct device *dev = ipu->dev;
1004 unsigned i; 1064 unsigned i;
@@ -1012,9 +1072,19 @@ static int ipu_add_client_devices(struct ipu_soc *ipu)
1012 for (i = 0; i < ARRAY_SIZE(client_reg); i++) { 1072 for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
1013 const struct ipu_platform_reg *reg = &client_reg[i]; 1073 const struct ipu_platform_reg *reg = &client_reg[i];
1014 struct platform_device *pdev; 1074 struct platform_device *pdev;
1015 1075 struct resource res;
1016 pdev = platform_device_register_data(dev, reg->name, 1076
1017 id++, &reg->pdata, sizeof(reg->pdata)); 1077 if (reg->reg_offset) {
1078 memset(&res, 0, sizeof(res));
1079 res.flags = IORESOURCE_MEM;
1080 res.start = ipu_base + ipu->devtype->cm_ofs + reg->reg_offset;
1081 res.end = res.start + PAGE_SIZE - 1;
1082 pdev = platform_device_register_resndata(dev, reg->name,
1083 id++, &res, 1, &reg->pdata, sizeof(reg->pdata));
1084 } else {
1085 pdev = platform_device_register_data(dev, reg->name,
1086 id++, &reg->pdata, sizeof(reg->pdata));
1087 }
1018 1088
1019 if (IS_ERR(pdev)) 1089 if (IS_ERR(pdev))
1020 goto err_register; 1090 goto err_register;
@@ -1210,7 +1280,7 @@ static int ipu_probe(struct platform_device *pdev)
1210 if (ret) 1280 if (ret)
1211 goto failed_submodules_init; 1281 goto failed_submodules_init;
1212 1282
1213 ret = ipu_add_client_devices(ipu); 1283 ret = ipu_add_client_devices(ipu, ipu_base);
1214 if (ret) { 1284 if (ret) {
1215 dev_err(&pdev->dev, "adding client devices failed with %d\n", 1285 dev_err(&pdev->dev, "adding client devices failed with %d\n",
1216 ret); 1286 ret);
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dc.c b/drivers/gpu/ipu-v3/ipu-dc.c
index d5de8bb5c803..9f1e5efa3acf 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-dc.c
+++ b/drivers/gpu/ipu-v3/ipu-dc.c
@@ -20,8 +20,7 @@
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/io.h> 21#include <linux/io.h>
22 22
23#include "../imx-drm.h" 23#include <video/imx-ipu-v3.h>
24#include "imx-ipu-v3.h"
25#include "ipu-prv.h" 24#include "ipu-prv.h"
26 25
27#define DC_MAP_CONF_PTR(n) (0x108 + ((n) & ~0x1) * 2) 26#define DC_MAP_CONF_PTR(n) (0x108 + ((n) & ~0x1) * 2)
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 82a9ebad697c..42e60b447ae7 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -20,7 +20,7 @@
20#include <linux/err.h> 20#include <linux/err.h>
21#include <linux/platform_device.h> 21#include <linux/platform_device.h>
22 22
23#include "imx-ipu-v3.h" 23#include <video/imx-ipu-v3.h>
24#include "ipu-prv.h" 24#include "ipu-prv.h"
25 25
26struct ipu_di { 26struct ipu_di {
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c b/drivers/gpu/ipu-v3/ipu-dmfc.c
index 45213017fa4b..e1493ab36ca2 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c
+++ b/drivers/gpu/ipu-v3/ipu-dmfc.c
@@ -17,7 +17,7 @@
17#include <linux/errno.h> 17#include <linux/errno.h>
18#include <linux/io.h> 18#include <linux/io.h>
19 19
20#include "imx-ipu-v3.h" 20#include <video/imx-ipu-v3.h>
21#include "ipu-prv.h" 21#include "ipu-prv.h"
22 22
23#define DMFC_RD_CHAN 0x0000 23#define DMFC_RD_CHAN 0x0000
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dp.c b/drivers/gpu/ipu-v3/ipu-dp.c
index 58f87c8d7c07..e17fa3f7c4b6 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-dp.c
+++ b/drivers/gpu/ipu-v3/ipu-dp.c
@@ -19,7 +19,7 @@
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/err.h> 20#include <linux/err.h>
21 21
22#include "imx-ipu-v3.h" 22#include <video/imx-ipu-v3.h>
23#include "ipu-prv.h" 23#include "ipu-prv.h"
24 24
25#define DP_SYNC 0 25#define DP_SYNC 0
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-prv.h b/drivers/gpu/ipu-v3/ipu-prv.h
index 4df00501adc2..acf181183f0b 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-prv.h
+++ b/drivers/gpu/ipu-v3/ipu-prv.h
@@ -22,7 +22,7 @@ struct ipu_soc;
22#include <linux/clk.h> 22#include <linux/clk.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24 24
25#include "imx-ipu-v3.h" 25#include <video/imx-ipu-v3.h>
26 26
27#define IPUV3_CHANNEL_CSI0 0 27#define IPUV3_CHANNEL_CSI0 0
28#define IPUV3_CHANNEL_CSI1 1 28#define IPUV3_CHANNEL_CSI1 1
@@ -151,6 +151,8 @@ struct ipuv3_channel {
151struct ipu_dc_priv; 151struct ipu_dc_priv;
152struct ipu_dmfc_priv; 152struct ipu_dmfc_priv;
153struct ipu_di; 153struct ipu_di;
154struct ipu_smfc_priv;
155
154struct ipu_devtype; 156struct ipu_devtype;
155 157
156struct ipu_soc { 158struct ipu_soc {
@@ -178,6 +180,7 @@ struct ipu_soc {
178 struct ipu_dp_priv *dp_priv; 180 struct ipu_dp_priv *dp_priv;
179 struct ipu_dmfc_priv *dmfc_priv; 181 struct ipu_dmfc_priv *dmfc_priv;
180 struct ipu_di *di_priv[2]; 182 struct ipu_di *di_priv[2];
183 struct ipu_smfc_priv *smfc_priv;
181}; 184};
182 185
183void ipu_srm_dp_sync_update(struct ipu_soc *ipu); 186void ipu_srm_dp_sync_update(struct ipu_soc *ipu);
@@ -203,4 +206,7 @@ void ipu_dc_exit(struct ipu_soc *ipu);
203int ipu_cpmem_init(struct ipu_soc *ipu, struct device *dev, unsigned long base); 206int ipu_cpmem_init(struct ipu_soc *ipu, struct device *dev, unsigned long base);
204void ipu_cpmem_exit(struct ipu_soc *ipu); 207void ipu_cpmem_exit(struct ipu_soc *ipu);
205 208
209int ipu_smfc_init(struct ipu_soc *ipu, struct device *dev, unsigned long base);
210void ipu_smfc_exit(struct ipu_soc *ipu);
211
206#endif /* __IPU_PRV_H__ */ 212#endif /* __IPU_PRV_H__ */
diff --git a/drivers/gpu/ipu-v3/ipu-smfc.c b/drivers/gpu/ipu-v3/ipu-smfc.c
new file mode 100644
index 000000000000..e4f85ad286fc
--- /dev/null
+++ b/drivers/gpu/ipu-v3/ipu-smfc.c
@@ -0,0 +1,97 @@
1/*
2 * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11#define DEBUG
12#include <linux/export.h>
13#include <linux/types.h>
14#include <linux/init.h>
15#include <linux/io.h>
16#include <linux/errno.h>
17#include <linux/spinlock.h>
18#include <linux/delay.h>
19#include <linux/clk.h>
20#include <video/imx-ipu-v3.h>
21
22#include "ipu-prv.h"
23
24struct ipu_smfc_priv {
25 void __iomem *base;
26 spinlock_t lock;
27};
28
29/*SMFC Registers */
30#define SMFC_MAP 0x0000
31#define SMFC_WMC 0x0004
32#define SMFC_BS 0x0008
33
34int ipu_smfc_set_burstsize(struct ipu_soc *ipu, int channel, int burstsize)
35{
36 struct ipu_smfc_priv *smfc = ipu->smfc_priv;
37 unsigned long flags;
38 u32 val, shift;
39
40 spin_lock_irqsave(&smfc->lock, flags);
41
42 shift = channel * 4;
43 val = readl(smfc->base + SMFC_BS);
44 val &= ~(0xf << shift);
45 val |= burstsize << shift;
46 writel(val, smfc->base + SMFC_BS);
47
48 spin_unlock_irqrestore(&smfc->lock, flags);
49
50 return 0;
51}
52EXPORT_SYMBOL_GPL(ipu_smfc_set_burstsize);
53
54int ipu_smfc_map_channel(struct ipu_soc *ipu, int channel, int csi_id, int mipi_id)
55{
56 struct ipu_smfc_priv *smfc = ipu->smfc_priv;
57 unsigned long flags;
58 u32 val, shift;
59
60 spin_lock_irqsave(&smfc->lock, flags);
61
62 shift = channel * 3;
63 val = readl(smfc->base + SMFC_MAP);
64 val &= ~(0x7 << shift);
65 val |= ((csi_id << 2) | mipi_id) << shift;
66 writel(val, smfc->base + SMFC_MAP);
67
68 spin_unlock_irqrestore(&smfc->lock, flags);
69
70 return 0;
71}
72EXPORT_SYMBOL_GPL(ipu_smfc_map_channel);
73
74int ipu_smfc_init(struct ipu_soc *ipu, struct device *dev,
75 unsigned long base)
76{
77 struct ipu_smfc_priv *smfc;
78
79 smfc = devm_kzalloc(dev, sizeof(*smfc), GFP_KERNEL);
80 if (!smfc)
81 return -ENOMEM;
82
83 ipu->smfc_priv = smfc;
84 spin_lock_init(&smfc->lock);
85
86 smfc->base = devm_ioremap(dev, base, PAGE_SIZE);
87 if (!smfc->base)
88 return -ENOMEM;
89
90 pr_debug("%s: ioremap 0x%08lx -> %p\n", __func__, base, smfc->base);
91
92 return 0;
93}
94
95void ipu_smfc_exit(struct ipu_soc *ipu)
96{
97}
diff --git a/drivers/staging/imx-drm/Kconfig b/drivers/staging/imx-drm/Kconfig
index c6e8ba7b3e4e..82fb758a29bc 100644
--- a/drivers/staging/imx-drm/Kconfig
+++ b/drivers/staging/imx-drm/Kconfig
@@ -39,19 +39,10 @@ config DRM_IMX_LDB
39 Choose this to enable the internal LVDS Display Bridge (LDB) 39 Choose this to enable the internal LVDS Display Bridge (LDB)
40 found on i.MX53 and i.MX6 processors. 40 found on i.MX53 and i.MX6 processors.
41 41
42config DRM_IMX_IPUV3_CORE
43 tristate "IPUv3 core support"
44 depends on DRM_IMX
45 depends on RESET_CONTROLLER
46 help
47 Choose this if you have a i.MX5/6 system and want
48 to use the IPU. This option only enables IPU base
49 support.
50
51config DRM_IMX_IPUV3 42config DRM_IMX_IPUV3
52 tristate "DRM Support for i.MX IPUv3" 43 tristate "DRM Support for i.MX IPUv3"
53 depends on DRM_IMX 44 depends on DRM_IMX
54 depends on DRM_IMX_IPUV3_CORE 45 depends on IMX_IPUV3_CORE
55 help 46 help
56 Choose this if you have a i.MX5 or i.MX6 processor. 47 Choose this if you have a i.MX5 or i.MX6 processor.
57 48
diff --git a/drivers/staging/imx-drm/Makefile b/drivers/staging/imx-drm/Makefile
index 129e3a3f59f1..582c438d8cbd 100644
--- a/drivers/staging/imx-drm/Makefile
+++ b/drivers/staging/imx-drm/Makefile
@@ -6,7 +6,6 @@ obj-$(CONFIG_DRM_IMX) += imxdrm.o
6obj-$(CONFIG_DRM_IMX_PARALLEL_DISPLAY) += parallel-display.o 6obj-$(CONFIG_DRM_IMX_PARALLEL_DISPLAY) += parallel-display.o
7obj-$(CONFIG_DRM_IMX_TVE) += imx-tve.o 7obj-$(CONFIG_DRM_IMX_TVE) += imx-tve.o
8obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o 8obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o
9obj-$(CONFIG_DRM_IMX_IPUV3_CORE) += ipu-v3/
10 9
11imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.o 10imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.o
12obj-$(CONFIG_DRM_IMX_IPUV3) += imx-ipuv3-crtc.o 11obj-$(CONFIG_DRM_IMX_IPUV3) += imx-ipuv3-crtc.o
diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
index 9fbe6d6a989d..76749231c48a 100644
--- a/drivers/staging/imx-drm/imx-hdmi.c
+++ b/drivers/staging/imx-drm/imx-hdmi.c
@@ -27,8 +27,8 @@
27#include <drm/drm_crtc_helper.h> 27#include <drm/drm_crtc_helper.h>
28#include <drm/drm_edid.h> 28#include <drm/drm_edid.h>
29#include <drm/drm_encoder_slave.h> 29#include <drm/drm_encoder_slave.h>
30#include <video/imx-ipu-v3.h>
30 31
31#include "ipu-v3/imx-ipu-v3.h"
32#include "imx-hdmi.h" 32#include "imx-hdmi.h"
33#include "imx-drm.h" 33#include "imx-drm.h"
34 34
diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c
index 4caef2b1653d..c628fcdc22ae 100644
--- a/drivers/staging/imx-drm/imx-tve.c
+++ b/drivers/staging/imx-drm/imx-tve.c
@@ -30,8 +30,8 @@
30#include <drm/drmP.h> 30#include <drm/drmP.h>
31#include <drm/drm_fb_helper.h> 31#include <drm/drm_fb_helper.h>
32#include <drm/drm_crtc_helper.h> 32#include <drm/drm_crtc_helper.h>
33#include <video/imx-ipu-v3.h>
33 34
34#include "ipu-v3/imx-ipu-v3.h"
35#include "imx-drm.h" 35#include "imx-drm.h"
36 36
37#define TVE_COM_CONF_REG 0x00 37#define TVE_COM_CONF_REG 0x00
diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c
index c48f640db006..d6913d2e6f77 100644
--- a/drivers/staging/imx-drm/ipuv3-crtc.c
+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
@@ -30,7 +30,7 @@
30#include <drm/drm_gem_cma_helper.h> 30#include <drm/drm_gem_cma_helper.h>
31#include <drm/drm_fb_cma_helper.h> 31#include <drm/drm_fb_cma_helper.h>
32 32
33#include "ipu-v3/imx-ipu-v3.h" 33#include <video/imx-ipu-v3.h>
34#include "imx-drm.h" 34#include "imx-drm.h"
35#include "ipuv3-plane.h" 35#include "ipuv3-plane.h"
36 36
diff --git a/drivers/staging/imx-drm/ipuv3-plane.c b/drivers/staging/imx-drm/ipuv3-plane.c
index 27a8d735dae0..02b4486435a0 100644
--- a/drivers/staging/imx-drm/ipuv3-plane.c
+++ b/drivers/staging/imx-drm/ipuv3-plane.c
@@ -17,7 +17,7 @@
17#include <drm/drm_fb_cma_helper.h> 17#include <drm/drm_fb_cma_helper.h>
18#include <drm/drm_gem_cma_helper.h> 18#include <drm/drm_gem_cma_helper.h>
19 19
20#include "ipu-v3/imx-ipu-v3.h" 20#include "video/imx-ipu-v3.h"
21#include "ipuv3-plane.h" 21#include "ipuv3-plane.h"
22 22
23#define to_ipu_plane(x) container_of(x, struct ipu_plane, base) 23#define to_ipu_plane(x) container_of(x, struct ipu_plane, base)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index c7b4f0f927b1..8bf495ffb020 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -20,6 +20,7 @@ source "drivers/char/agp/Kconfig"
20source "drivers/gpu/vga/Kconfig" 20source "drivers/gpu/vga/Kconfig"
21 21
22source "drivers/gpu/host1x/Kconfig" 22source "drivers/gpu/host1x/Kconfig"
23source "drivers/gpu/ipu-v3/Kconfig"
23 24
24menu "Direct Rendering Manager" 25menu "Direct Rendering Manager"
25source "drivers/gpu/drm/Kconfig" 26source "drivers/gpu/drm/Kconfig"
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 83222db41566..8af71a8e2c00 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -234,8 +234,6 @@ int drm_err(const char *func, const char *format, ...);
234/** \name Internal types and structures */ 234/** \name Internal types and structures */
235/*@{*/ 235/*@{*/
236 236
237#define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x)
238
239#define DRM_IF_VERSION(maj, min) (maj << 16 | min) 237#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
240 238
241/** 239/**
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index a7fac5686915..251b75e6bf7a 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -121,6 +121,9 @@ struct drm_display_info {
121 enum subpixel_order subpixel_order; 121 enum subpixel_order subpixel_order;
122 u32 color_formats; 122 u32 color_formats;
123 123
124 /* Mask of supported hdmi deep color modes */
125 u8 edid_hdmi_dc_modes;
126
124 u8 cea_rev; 127 u8 cea_rev;
125}; 128};
126 129
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index aefa2f6afa3b..1cc0b610f162 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -1007,7 +1007,7 @@ struct drm_radeon_cs {
1007#define RADEON_INFO_NUM_BYTES_MOVED 0x1d 1007#define RADEON_INFO_NUM_BYTES_MOVED 0x1d
1008#define RADEON_INFO_VRAM_USAGE 0x1e 1008#define RADEON_INFO_VRAM_USAGE 0x1e
1009#define RADEON_INFO_GTT_USAGE 0x1f 1009#define RADEON_INFO_GTT_USAGE 0x1f
1010 1010#define RADEON_INFO_ACTIVE_CU_COUNT 0x20
1011 1011
1012struct drm_radeon_info { 1012struct drm_radeon_info {
1013 uint32_t request; 1013 uint32_t request;
diff --git a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index c4d14ead5837..61d6d25caf95 100644
--- a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -103,6 +103,7 @@ int ipu_idmac_wait_busy(struct ipuv3_channel *channel, int ms);
103 103
104void ipu_idmac_set_double_buffer(struct ipuv3_channel *channel, 104void ipu_idmac_set_double_buffer(struct ipuv3_channel *channel,
105 bool doublebuffer); 105 bool doublebuffer);
106int ipu_idmac_get_current_buffer(struct ipuv3_channel *channel);
106void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num); 107void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num);
107 108
108/* 109/*
@@ -160,6 +161,20 @@ int ipu_dp_set_window_pos(struct ipu_dp *, u16 x_pos, u16 y_pos);
160int ipu_dp_set_global_alpha(struct ipu_dp *dp, bool enable, u8 alpha, 161int ipu_dp_set_global_alpha(struct ipu_dp *dp, bool enable, u8 alpha,
161 bool bg_chan); 162 bool bg_chan);
162 163
164/*
165 * IPU CMOS Sensor Interface (csi) functions
166 */
167int ipu_csi_enable(struct ipu_soc *ipu, int csi);
168int ipu_csi_disable(struct ipu_soc *ipu, int csi);
169
170/*
171 * IPU Sensor Multiple FIFO Controller (SMFC) functions
172 */
173int ipu_smfc_enable(struct ipu_soc *ipu);
174int ipu_smfc_disable(struct ipu_soc *ipu);
175int ipu_smfc_map_channel(struct ipu_soc *ipu, int channel, int csi_id, int mipi_id);
176int ipu_smfc_set_burstsize(struct ipu_soc *ipu, int channel, int burstsize);
177
163#define IPU_CPMEM_WORD(word, ofs, size) ((((word) * 160 + (ofs)) << 8) | (size)) 178#define IPU_CPMEM_WORD(word, ofs, size) ((((word) * 160 + (ofs)) << 8) | (size))
164 179
165#define IPU_FIELD_UBO IPU_CPMEM_WORD(0, 46, 22) 180#define IPU_FIELD_UBO IPU_CPMEM_WORD(0, 46, 22)
@@ -316,6 +331,7 @@ static inline void ipu_cpmem_set_burstsize(struct ipu_ch_param __iomem *p,
316}; 331};
317 332
318struct ipu_client_platformdata { 333struct ipu_client_platformdata {
334 int csi;
319 int di; 335 int di;
320 int dc; 336 int dc;
321 int dp; 337 int dp;