All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
@ 2016-09-29  6:45 Emily Deng
       [not found] ` <1475131540-1987-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: Emily Deng @ 2016-09-29  6:45 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Emily Deng

Enable multi crtcs for virtual display, user can set the number of crtcs
by amdgpu module parameter  virtual_display.

Signed-off-by: Emily Deng <Emily.Deng@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118 +++++++++++++++++++++++------
 4 files changed, 140 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index b8d6667..3002836 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -149,7 +149,6 @@
 #define GRAPH_OBJECT_ENUM_ID5                     0x05
 #define GRAPH_OBJECT_ENUM_ID6                     0x06
 #define GRAPH_OBJECT_ENUM_ID7                     0x07
-#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
 
 /****************************************************/
 /* Graphics Object ID Bit definition                */
@@ -411,8 +410,28 @@
                                                   GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
                                                   ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT)
 
-#define ENCODER_VIRTUAL_ENUM_VIRTUAL            ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
-                                                  GRAPH_OBJECT_ENUM_VIRTUAL << ENUM_ID_SHIFT |\
+#define ENCODER_VIRTUAL_ENUM_ID1                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID2                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID3                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID4                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID5                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID6                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\
                                                   ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
 
 /****************************************************/
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index c626434..1f008a0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1239,20 +1239,37 @@ static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
 	if (amdgpu_virtual_display) {
 		struct drm_device *ddev = adev->ddev;
 		const char *pci_address_name = pci_name(ddev->pdev);
-		char *pciaddstr, *pciaddstr_tmp, *pciaddname;
+		char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
 
 		pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
 		pciaddstr_tmp = pciaddstr;
-		while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
+		while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
+			pciaddname = strsep(&pciaddname_tmp, ",");
 			if (!strcmp(pci_address_name, pciaddname)) {
+				long num_crtc;
+				int res = -1;
+
 				adev->enable_virtual_display = true;
+
+				if (pciaddname_tmp)
+					res = kstrtol(pciaddname_tmp, 10,
+						&num_crtc);
+
+				if (!res) {
+					if (num_crtc < 1)
+						num_crtc = 1;
+					if (num_crtc > 6)
+						num_crtc = 6;
+					adev->mode_info.num_crtc = num_crtc;
+				} else
+					adev->mode_info.num_crtc = 1;
 				break;
 			}
 		}
 
-		DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
-				 amdgpu_virtual_display, pci_address_name,
-				 adev->enable_virtual_display);
+		DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
+			amdgpu_virtual_display, pci_address_name,
+			adev->enable_virtual_display, adev->mode_info.num_crtc);
 
 		kfree(pciaddstr);
 	}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 80d8c93..d9b7cbc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -207,7 +207,7 @@ module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
 MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
 module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
 
-MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
+MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
 module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
 
 static const struct pci_device_id pciidlist[] = {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index f3debe8..531d025f 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
 	dce_virtual_set_display_funcs(adev);
 	dce_virtual_set_irq_funcs(adev);
 
-	adev->mode_info.num_crtc = 1;
 	adev->mode_info.num_hpd = 1;
 	adev->mode_info.num_dig = 1;
 	return 0;
@@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
 	struct amdgpu_i2c_bus_rec ddc_bus;
 	struct amdgpu_router router;
 	struct amdgpu_hpd hpd;
+	int i = 0;
+	uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
+	uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
 
 	/* look up gpio for ddc, hpd */
 	ddc_bus.valid = false;
@@ -373,17 +375,41 @@ static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
 	memset(&router, 0, sizeof(router));
 	router.ddc_valid = false;
 	router.cd_valid = false;
-	amdgpu_display_add_connector(adev,
-				      0,
-				      ATOM_DEVICE_CRT1_SUPPORT,
-				      DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
-				      CONNECTOR_OBJECT_ID_VIRTUAL,
-				      &hpd,
-				      &router);
-
-	amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL,
-							ATOM_DEVICE_CRT1_SUPPORT,
-							0);
+
+	for (i = 0; i < adev->mode_info.num_crtc; i++) {
+		switch (i) {
+		case 0:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
+			supported_device = ATOM_DEVICE_DFP1_SUPPORT;
+			break;
+		case 1:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
+			supported_device = ATOM_DEVICE_DFP2_SUPPORT;
+			break;
+		case 2:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
+			supported_device = ATOM_DEVICE_DFP3_SUPPORT;
+			break;
+		case 3:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
+			supported_device = ATOM_DEVICE_DFP4_SUPPORT;
+			break;
+		case 4:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
+			supported_device = ATOM_DEVICE_DFP5_SUPPORT;
+			break;
+		case 5:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
+			supported_device = ATOM_DEVICE_DFP6_SUPPORT;
+			break;
+		}
+
+		amdgpu_display_add_connector(adev, i, supported_device,
+				DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
+				CONNECTOR_OBJECT_ID_VIRTUAL, &hpd, &router);
+		amdgpu_display_add_encoder(adev, encoder_enum,
+				supported_device, 0);
+	}
 
 	amdgpu_link_encoder_connector(adev->ddev);
 
@@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct amdgpu_device *adev,
 		return;
 
 	encoder = &amdgpu_encoder->base;
-	encoder->possible_crtcs = 0x1;
+
+	switch (adev->mode_info.num_crtc) {
+	case 1:
+		encoder->possible_crtcs = 0x1;
+		break;
+	case 2:
+		encoder->possible_crtcs = 0x3;
+		break;
+	case 3:
+		encoder->possible_crtcs = 0x7;
+		break;
+	case 4:
+		encoder->possible_crtcs = 0xf;
+		break;
+	case 5:
+		encoder->possible_crtcs = 0x1f;
+		break;
+	case 6:
+		encoder->possible_crtcs = 0x3f;
+		break;
+	}
+
 	amdgpu_encoder->enc_priv = NULL;
 	amdgpu_encoder->encoder_enum = encoder_enum;
 	amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
@@ -648,9 +695,15 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla
 {
 	struct amdgpu_mode_info *mode_info = container_of(vblank_timer, struct amdgpu_mode_info ,vblank_timer);
 	struct amdgpu_device *adev = container_of(mode_info, struct amdgpu_device ,mode_info);
-	unsigned crtc = 0;
-	drm_handle_vblank(adev->ddev, crtc);
-	dce_virtual_pageflip_irq(adev, NULL, NULL);
+	int i;
+	struct amdgpu_iv_entry entry;
+
+	for (i = 0; i < adev->mode_info.num_crtc; i++) {
+		entry.src_id = i;
+		drm_handle_vblank(adev->ddev, i);
+		dce_virtual_pageflip_irq(adev, NULL, &entry);
+	}
+
 	hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
 	return HRTIMER_NORESTART;
 }
@@ -689,6 +742,21 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
 	case AMDGPU_CRTC_IRQ_VBLANK1:
 		dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
 		break;
+	case AMDGPU_CRTC_IRQ_VBLANK2:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK3:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK4:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK5:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK6:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
+		break;
 	default:
 		break;
 	}
@@ -708,16 +776,20 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
 			      struct amdgpu_irq_src *source,
 			      struct amdgpu_iv_entry *entry)
 {
-	unsigned crtc = 0;
+	int i;
 	unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
 
-	dce_virtual_crtc_vblank_int_ack(adev, crtc);
+	for (i = 0; i < adev->mode_info.num_crtc; i++) {
+		irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
+		entry->src_id = i;
+
+		dce_virtual_crtc_vblank_int_ack(adev, i);
+		if (amdgpu_irq_enabled(adev, source, irq_type))
+			drm_handle_vblank(adev->ddev, i);
 
-	if (amdgpu_irq_enabled(adev, source, irq_type)) {
-		drm_handle_vblank(adev->ddev, crtc);
+		dce_virtual_pageflip_irq(adev, NULL, entry);
+		DRM_DEBUG("IH: D%d vblank\n", i + 1);
 	}
-	dce_virtual_pageflip_irq(adev, NULL, NULL);
-	DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
 	return 0;
 }
 
@@ -744,7 +816,7 @@ static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
 	struct amdgpu_crtc *amdgpu_crtc;
 	struct amdgpu_flip_work *works;
 
-	crtc_id = 0;
+	crtc_id = entry->src_id;
 	amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
 
 	if (crtc_id >= adev->mode_info.num_crtc) {
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
       [not found] ` <1475131540-1987-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
@ 2016-09-29  9:46   ` Deng, Emily
       [not found]     ` <DM5PR12MB16599B8DB28E608664C492168FCE0-2J9CzHegvk/nc5151fM8tgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
  2016-09-30  3:28   ` Alex Deucher
  1 sibling, 1 reply; 7+ messages in thread
From: Deng, Emily @ 2016-09-29  9:46 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Jiang, Jerry (SW)

Add Jerry.

Best Wishes,
Emily Deng

> -----Original Message-----
> From: Emily Deng [mailto:Emily.Deng@amd.com]
> Sent: Thursday, September 29, 2016 2:46 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deng, Emily <Emily.Deng@amd.com>
> Subject: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
> 
> Enable multi crtcs for virtual display, user can set the number of crtcs by
> amdgpu module parameter  virtual_display.
> 
> Signed-off-by: Emily Deng <Emily.Deng@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
>  drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118
> +++++++++++++++++++++++------
>  4 files changed, 140 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> index b8d6667..3002836 100644
> --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> @@ -149,7 +149,6 @@
>  #define GRAPH_OBJECT_ENUM_ID5                     0x05
>  #define GRAPH_OBJECT_ENUM_ID6                     0x06
>  #define GRAPH_OBJECT_ENUM_ID7                     0x07
> -#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
> 
>  /****************************************************/
>  /* Graphics Object ID Bit definition                */
> @@ -411,8 +410,28 @@
>                                                    GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> |\
>                                                    ENCODER_OBJECT_ID_HDMI_ANX9805 <<
> OBJECT_ID_SHIFT)
> 
> -#define ENCODER_VIRTUAL_ENUM_VIRTUAL
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> -                                                  GRAPH_OBJECT_ENUM_VIRTUAL <<
> ENUM_ID_SHIFT |\
> +#define ENCODER_VIRTUAL_ENUM_ID1
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID2
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID3
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID4
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID5
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID6
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID6
> +<< ENUM_ID_SHIFT |\
>                                                    ENCODER_OBJECT_ID_VIRTUAL <<
> OBJECT_ID_SHIFT)
> 
>  /****************************************************/
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index c626434..1f008a0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1239,20 +1239,37 @@ static void
> amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
>  	if (amdgpu_virtual_display) {
>  		struct drm_device *ddev = adev->ddev;
>  		const char *pci_address_name = pci_name(ddev->pdev);
> -		char *pciaddstr, *pciaddstr_tmp, *pciaddname;
> +		char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp,
> *pciaddname;
> 
>  		pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
>  		pciaddstr_tmp = pciaddstr;
> -		while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
> +		while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
> +			pciaddname = strsep(&pciaddname_tmp, ",");
>  			if (!strcmp(pci_address_name, pciaddname)) {
> +				long num_crtc;
> +				int res = -1;
> +
>  				adev->enable_virtual_display = true;
> +
> +				if (pciaddname_tmp)
> +					res = kstrtol(pciaddname_tmp, 10,
> +						&num_crtc);
> +
> +				if (!res) {
> +					if (num_crtc < 1)
> +						num_crtc = 1;
> +					if (num_crtc > 6)
> +						num_crtc = 6;
> +					adev->mode_info.num_crtc =
> num_crtc;
> +				} else
> +					adev->mode_info.num_crtc = 1;
>  				break;
>  			}
>  		}
> 
> -		DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
> -				 amdgpu_virtual_display, pci_address_name,
> -				 adev->enable_virtual_display);
> +		DRM_INFO("virtual display string:%s, %s:virtual_display:%d,
> num_crtc:%d\n",
> +			amdgpu_virtual_display, pci_address_name,
> +			adev->enable_virtual_display, adev-
> >mode_info.num_crtc);
> 
>  		kfree(pciaddstr);
>  	}
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 80d8c93..d9b7cbc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -207,7 +207,7 @@ module_param_named(pg_mask, amdgpu_pg_mask,
> uint, 0444);  MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
> module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
> 
> -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the
> virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
> +MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the
> +virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
>  module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
> 
>  static const struct pci_device_id pciidlist[] = { diff --git
> a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index f3debe8..531d025f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
>  	dce_virtual_set_display_funcs(adev);
>  	dce_virtual_set_irq_funcs(adev);
> 
> -	adev->mode_info.num_crtc = 1;
>  	adev->mode_info.num_hpd = 1;
>  	adev->mode_info.num_dig = 1;
>  	return 0;
> @@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct
> amdgpu_device *adev)
>  	struct amdgpu_i2c_bus_rec ddc_bus;
>  	struct amdgpu_router router;
>  	struct amdgpu_hpd hpd;
> +	int i = 0;
> +	uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> +	uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> 
>  	/* look up gpio for ddc, hpd */
>  	ddc_bus.valid = false;
> @@ -373,17 +375,41 @@ static bool dce_virtual_get_connector_info(struct
> amdgpu_device *adev)
>  	memset(&router, 0, sizeof(router));
>  	router.ddc_valid = false;
>  	router.cd_valid = false;
> -	amdgpu_display_add_connector(adev,
> -				      0,
> -				      ATOM_DEVICE_CRT1_SUPPORT,
> -				      DRM_MODE_CONNECTOR_VIRTUAL,
> &ddc_bus,
> -				      CONNECTOR_OBJECT_ID_VIRTUAL,
> -				      &hpd,
> -				      &router);
> -
> -	amdgpu_display_add_encoder(adev,
> ENCODER_VIRTUAL_ENUM_VIRTUAL,
> -
> 	ATOM_DEVICE_CRT1_SUPPORT,
> -							0);
> +
> +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +		switch (i) {
> +		case 0:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> +			supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> +			break;
> +		case 1:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
> +			supported_device = ATOM_DEVICE_DFP2_SUPPORT;
> +			break;
> +		case 2:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
> +			supported_device = ATOM_DEVICE_DFP3_SUPPORT;
> +			break;
> +		case 3:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
> +			supported_device = ATOM_DEVICE_DFP4_SUPPORT;
> +			break;
> +		case 4:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
> +			supported_device = ATOM_DEVICE_DFP5_SUPPORT;
> +			break;
> +		case 5:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
> +			supported_device = ATOM_DEVICE_DFP6_SUPPORT;
> +			break;
> +		}
> +
> +		amdgpu_display_add_connector(adev, i, supported_device,
> +				DRM_MODE_CONNECTOR_VIRTUAL,
> &ddc_bus,
> +				CONNECTOR_OBJECT_ID_VIRTUAL, &hpd,
> &router);
> +		amdgpu_display_add_encoder(adev, encoder_enum,
> +				supported_device, 0);
> +	}
> 
>  	amdgpu_link_encoder_connector(adev->ddev);
> 
> @@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct
> amdgpu_device *adev,
>  		return;
> 
>  	encoder = &amdgpu_encoder->base;
> -	encoder->possible_crtcs = 0x1;
> +
> +	switch (adev->mode_info.num_crtc) {
> +	case 1:
> +		encoder->possible_crtcs = 0x1;
> +		break;
> +	case 2:
> +		encoder->possible_crtcs = 0x3;
> +		break;
> +	case 3:
> +		encoder->possible_crtcs = 0x7;
> +		break;
> +	case 4:
> +		encoder->possible_crtcs = 0xf;
> +		break;
> +	case 5:
> +		encoder->possible_crtcs = 0x1f;
> +		break;
> +	case 6:
> +		encoder->possible_crtcs = 0x3f;
> +		break;
> +	}
> +
>  	amdgpu_encoder->enc_priv = NULL;
>  	amdgpu_encoder->encoder_enum = encoder_enum;
>  	amdgpu_encoder->encoder_id = (encoder_enum &
> OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; @@ -648,9 +695,15 @@ static enum
> hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla  {
>  	struct amdgpu_mode_info *mode_info = container_of(vblank_timer,
> struct amdgpu_mode_info ,vblank_timer);
>  	struct amdgpu_device *adev = container_of(mode_info, struct
> amdgpu_device ,mode_info);
> -	unsigned crtc = 0;
> -	drm_handle_vblank(adev->ddev, crtc);
> -	dce_virtual_pageflip_irq(adev, NULL, NULL);
> +	int i;
> +	struct amdgpu_iv_entry entry;
> +
> +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +		entry.src_id = i;
> +		drm_handle_vblank(adev->ddev, i);
> +		dce_virtual_pageflip_irq(adev, NULL, &entry);
> +	}
> +
>  	hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
>  	return HRTIMER_NORESTART;
>  }
> @@ -689,6 +742,21 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
>  	case AMDGPU_CRTC_IRQ_VBLANK1:
>  		dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
>  		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK2:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK3:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK4:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK5:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK6:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
> +		break;
>  	default:
>  		break;
>  	}
> @@ -708,16 +776,20 @@ static int dce_virtual_crtc_irq(struct amdgpu_device
> *adev,
>  			      struct amdgpu_irq_src *source,
>  			      struct amdgpu_iv_entry *entry)  {
> -	unsigned crtc = 0;
> +	int i;
>  	unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
> 
> -	dce_virtual_crtc_vblank_int_ack(adev, crtc);
> +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +		irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
> +		entry->src_id = i;
> +
> +		dce_virtual_crtc_vblank_int_ack(adev, i);
> +		if (amdgpu_irq_enabled(adev, source, irq_type))
> +			drm_handle_vblank(adev->ddev, i);
> 
> -	if (amdgpu_irq_enabled(adev, source, irq_type)) {
> -		drm_handle_vblank(adev->ddev, crtc);
> +		dce_virtual_pageflip_irq(adev, NULL, entry);
> +		DRM_DEBUG("IH: D%d vblank\n", i + 1);
>  	}
> -	dce_virtual_pageflip_irq(adev, NULL, NULL);
> -	DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
>  	return 0;
>  }
> 
> @@ -744,7 +816,7 @@ static int dce_virtual_pageflip_irq(struct
> amdgpu_device *adev,
>  	struct amdgpu_crtc *amdgpu_crtc;
>  	struct amdgpu_flip_work *works;
> 
> -	crtc_id = 0;
> +	crtc_id = entry->src_id;
>  	amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> 
>  	if (crtc_id >= adev->mode_info.num_crtc) {
> --
> 1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
       [not found]     ` <DM5PR12MB16599B8DB28E608664C492168FCE0-2J9CzHegvk/nc5151fM8tgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
@ 2016-09-30  1:42       ` Deng, Emily
  0 siblings, 0 replies; 7+ messages in thread
From: Deng, Emily @ 2016-09-30  1:42 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Jiang, Jerry (SW)

Ping ...
Please help to review this patch. Thanks.

Best Wishes,
Emily Deng



> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf Of
> Deng, Emily
> Sent: Thursday, September 29, 2016 5:47 PM
> To: amd-gfx@lists.freedesktop.org; Jiang, Jerry (SW) <Jerry.Jiang@amd.com>
> Subject: RE: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
> 
> Add Jerry.
> 
> Best Wishes,
> Emily Deng
> 
> > -----Original Message-----
> > From: Emily Deng [mailto:Emily.Deng@amd.com]
> > Sent: Thursday, September 29, 2016 2:46 PM
> > To: amd-gfx@lists.freedesktop.org
> > Cc: Deng, Emily <Emily.Deng@amd.com>
> > Subject: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
> >
> > Enable multi crtcs for virtual display, user can set the number of
> > crtcs by amdgpu module parameter  virtual_display.
> >
> > Signed-off-by: Emily Deng <Emily.Deng@amd.com>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
> >  drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118
> > +++++++++++++++++++++++------
> >  4 files changed, 140 insertions(+), 32 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > index b8d6667..3002836 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > @@ -149,7 +149,6 @@
> >  #define GRAPH_OBJECT_ENUM_ID5                     0x05
> >  #define GRAPH_OBJECT_ENUM_ID6                     0x06
> >  #define GRAPH_OBJECT_ENUM_ID7                     0x07
> > -#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
> >
> >  /****************************************************/
> >  /* Graphics Object ID Bit definition                */
> > @@ -411,8 +410,28 @@
> >
> > GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> > |\
> >
> > ENCODER_OBJECT_ID_HDMI_ANX9805 <<
> > OBJECT_ID_SHIFT)
> >
> > -#define ENCODER_VIRTUAL_ENUM_VIRTUAL
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > -                                                  GRAPH_OBJECT_ENUM_VIRTUAL <<
> > ENUM_ID_SHIFT |\
> > +#define ENCODER_VIRTUAL_ENUM_ID1
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> > |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID2
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT
> > |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID3
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > + GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT
> > |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID4
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > + GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT
> > |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID5
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > + GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT
> > |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID6
> > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > +GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\
> >
> > ENCODER_OBJECT_ID_VIRTUAL <<
> > OBJECT_ID_SHIFT)
> >
> >  /****************************************************/
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > index c626434..1f008a0 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > @@ -1239,20 +1239,37 @@ static void
> > amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
> >  	if (amdgpu_virtual_display) {
> >  		struct drm_device *ddev = adev->ddev;
> >  		const char *pci_address_name = pci_name(ddev->pdev);
> > -		char *pciaddstr, *pciaddstr_tmp, *pciaddname;
> > +		char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp,
> > *pciaddname;
> >
> >  		pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
> >  		pciaddstr_tmp = pciaddstr;
> > -		while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
> > +		while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
> > +			pciaddname = strsep(&pciaddname_tmp, ",");
> >  			if (!strcmp(pci_address_name, pciaddname)) {
> > +				long num_crtc;
> > +				int res = -1;
> > +
> >  				adev->enable_virtual_display = true;
> > +
> > +				if (pciaddname_tmp)
> > +					res = kstrtol(pciaddname_tmp, 10,
> > +						&num_crtc);
> > +
> > +				if (!res) {
> > +					if (num_crtc < 1)
> > +						num_crtc = 1;
> > +					if (num_crtc > 6)
> > +						num_crtc = 6;
> > +					adev->mode_info.num_crtc =
> > num_crtc;
> > +				} else
> > +					adev->mode_info.num_crtc = 1;
> >  				break;
> >  			}
> >  		}
> >
> > -		DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
> > -				 amdgpu_virtual_display, pci_address_name,
> > -				 adev->enable_virtual_display);
> > +		DRM_INFO("virtual display string:%s, %s:virtual_display:%d,
> > num_crtc:%d\n",
> > +			amdgpu_virtual_display, pci_address_name,
> > +			adev->enable_virtual_display, adev-
> > >mode_info.num_crtc);
> >
> >  		kfree(pciaddstr);
> >  	}
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > index 80d8c93..d9b7cbc 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > @@ -207,7 +207,7 @@ module_param_named(pg_mask, amdgpu_pg_mask,
> uint,
> > 0444);  MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
> > module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
> >
> > -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature
> > (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
> > +MODULE_PARM_DESC(virtual_display, "Enable virtual display feature
> > +(the virtual_display will be set like
> > +xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
> >  module_param_named(virtual_display, amdgpu_virtual_display, charp,
> > 0444);
> >
> >  static const struct pci_device_id pciidlist[] = { diff --git
> > a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > index f3debe8..531d025f 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > @@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
> >  	dce_virtual_set_display_funcs(adev);
> >  	dce_virtual_set_irq_funcs(adev);
> >
> > -	adev->mode_info.num_crtc = 1;
> >  	adev->mode_info.num_hpd = 1;
> >  	adev->mode_info.num_dig = 1;
> >  	return 0;
> > @@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct
> > amdgpu_device *adev)
> >  	struct amdgpu_i2c_bus_rec ddc_bus;
> >  	struct amdgpu_router router;
> >  	struct amdgpu_hpd hpd;
> > +	int i = 0;
> > +	uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> > +	uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> >
> >  	/* look up gpio for ddc, hpd */
> >  	ddc_bus.valid = false;
> > @@ -373,17 +375,41 @@ static bool
> > dce_virtual_get_connector_info(struct
> > amdgpu_device *adev)
> >  	memset(&router, 0, sizeof(router));
> >  	router.ddc_valid = false;
> >  	router.cd_valid = false;
> > -	amdgpu_display_add_connector(adev,
> > -				      0,
> > -				      ATOM_DEVICE_CRT1_SUPPORT,
> > -				      DRM_MODE_CONNECTOR_VIRTUAL,
> > &ddc_bus,
> > -				      CONNECTOR_OBJECT_ID_VIRTUAL,
> > -				      &hpd,
> > -				      &router);
> > -
> > -	amdgpu_display_add_encoder(adev,
> > ENCODER_VIRTUAL_ENUM_VIRTUAL,
> > -
> > 	ATOM_DEVICE_CRT1_SUPPORT,
> > -							0);
> > +
> > +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> > +		switch (i) {
> > +		case 0:
> > +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> > +			supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> > +			break;
> > +		case 1:
> > +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
> > +			supported_device = ATOM_DEVICE_DFP2_SUPPORT;
> > +			break;
> > +		case 2:
> > +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
> > +			supported_device = ATOM_DEVICE_DFP3_SUPPORT;
> > +			break;
> > +		case 3:
> > +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
> > +			supported_device = ATOM_DEVICE_DFP4_SUPPORT;
> > +			break;
> > +		case 4:
> > +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
> > +			supported_device = ATOM_DEVICE_DFP5_SUPPORT;
> > +			break;
> > +		case 5:
> > +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
> > +			supported_device = ATOM_DEVICE_DFP6_SUPPORT;
> > +			break;
> > +		}
> > +
> > +		amdgpu_display_add_connector(adev, i, supported_device,
> > +				DRM_MODE_CONNECTOR_VIRTUAL,
> > &ddc_bus,
> > +				CONNECTOR_OBJECT_ID_VIRTUAL, &hpd,
> > &router);
> > +		amdgpu_display_add_encoder(adev, encoder_enum,
> > +				supported_device, 0);
> > +	}
> >
> >  	amdgpu_link_encoder_connector(adev->ddev);
> >
> > @@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct
> > amdgpu_device *adev,
> >  		return;
> >
> >  	encoder = &amdgpu_encoder->base;
> > -	encoder->possible_crtcs = 0x1;
> > +
> > +	switch (adev->mode_info.num_crtc) {
> > +	case 1:
> > +		encoder->possible_crtcs = 0x1;
> > +		break;
> > +	case 2:
> > +		encoder->possible_crtcs = 0x3;
> > +		break;
> > +	case 3:
> > +		encoder->possible_crtcs = 0x7;
> > +		break;
> > +	case 4:
> > +		encoder->possible_crtcs = 0xf;
> > +		break;
> > +	case 5:
> > +		encoder->possible_crtcs = 0x1f;
> > +		break;
> > +	case 6:
> > +		encoder->possible_crtcs = 0x3f;
> > +		break;
> > +	}
> > +
> >  	amdgpu_encoder->enc_priv = NULL;
> >  	amdgpu_encoder->encoder_enum = encoder_enum;
> >  	amdgpu_encoder->encoder_id = (encoder_enum &
> > OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; @@ -648,9 +695,15 @@ static
> enum
> > hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla  {
> >  	struct amdgpu_mode_info *mode_info = container_of(vblank_timer,
> > struct amdgpu_mode_info ,vblank_timer);
> >  	struct amdgpu_device *adev = container_of(mode_info, struct
> > amdgpu_device ,mode_info);
> > -	unsigned crtc = 0;
> > -	drm_handle_vblank(adev->ddev, crtc);
> > -	dce_virtual_pageflip_irq(adev, NULL, NULL);
> > +	int i;
> > +	struct amdgpu_iv_entry entry;
> > +
> > +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> > +		entry.src_id = i;
> > +		drm_handle_vblank(adev->ddev, i);
> > +		dce_virtual_pageflip_irq(adev, NULL, &entry);
> > +	}
> > +
> >  	hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD),
> > HRTIMER_MODE_REL);
> >  	return HRTIMER_NORESTART;
> >  }
> > @@ -689,6 +742,21 @@ static int dce_virtual_set_crtc_irq_state(struct
> > amdgpu_device *adev,
> >  	case AMDGPU_CRTC_IRQ_VBLANK1:
> >  		dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
> >  		break;
> > +	case AMDGPU_CRTC_IRQ_VBLANK2:
> > +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
> > +		break;
> > +	case AMDGPU_CRTC_IRQ_VBLANK3:
> > +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
> > +		break;
> > +	case AMDGPU_CRTC_IRQ_VBLANK4:
> > +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
> > +		break;
> > +	case AMDGPU_CRTC_IRQ_VBLANK5:
> > +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
> > +		break;
> > +	case AMDGPU_CRTC_IRQ_VBLANK6:
> > +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
> > +		break;
> >  	default:
> >  		break;
> >  	}
> > @@ -708,16 +776,20 @@ static int dce_virtual_crtc_irq(struct
> > amdgpu_device *adev,
> >  			      struct amdgpu_irq_src *source,
> >  			      struct amdgpu_iv_entry *entry)  {
> > -	unsigned crtc = 0;
> > +	int i;
> >  	unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
> >
> > -	dce_virtual_crtc_vblank_int_ack(adev, crtc);
> > +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> > +		irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
> > +		entry->src_id = i;
> > +
> > +		dce_virtual_crtc_vblank_int_ack(adev, i);
> > +		if (amdgpu_irq_enabled(adev, source, irq_type))
> > +			drm_handle_vblank(adev->ddev, i);
> >
> > -	if (amdgpu_irq_enabled(adev, source, irq_type)) {
> > -		drm_handle_vblank(adev->ddev, crtc);
> > +		dce_virtual_pageflip_irq(adev, NULL, entry);
> > +		DRM_DEBUG("IH: D%d vblank\n", i + 1);
> >  	}
> > -	dce_virtual_pageflip_irq(adev, NULL, NULL);
> > -	DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
> >  	return 0;
> >  }
> >
> > @@ -744,7 +816,7 @@ static int dce_virtual_pageflip_irq(struct
> > amdgpu_device *adev,
> >  	struct amdgpu_crtc *amdgpu_crtc;
> >  	struct amdgpu_flip_work *works;
> >
> > -	crtc_id = 0;
> > +	crtc_id = entry->src_id;
> >  	amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> >
> >  	if (crtc_id >= adev->mode_info.num_crtc) {
> > --
> > 1.9.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
       [not found] ` <1475131540-1987-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
  2016-09-29  9:46   ` Deng, Emily
@ 2016-09-30  3:28   ` Alex Deucher
       [not found]     ` <CADnq5_OxAYkR_p5JN7iPaTF11Erfy61zKdwyt3YKngpjB+Vj7w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  1 sibling, 1 reply; 7+ messages in thread
From: Alex Deucher @ 2016-09-30  3:28 UTC (permalink / raw)
  To: Emily Deng; +Cc: amd-gfx list

On Thu, Sep 29, 2016 at 2:45 AM, Emily Deng <Emily.Deng@amd.com> wrote:
> Enable multi crtcs for virtual display, user can set the number of crtcs
> by amdgpu module parameter  virtual_display.
>
> Signed-off-by: Emily Deng <Emily.Deng@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
>  drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118 +++++++++++++++++++++++------
>  4 files changed, 140 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> index b8d6667..3002836 100644
> --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> @@ -149,7 +149,6 @@
>  #define GRAPH_OBJECT_ENUM_ID5                     0x05
>  #define GRAPH_OBJECT_ENUM_ID6                     0x06
>  #define GRAPH_OBJECT_ENUM_ID7                     0x07
> -#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
>
>  /****************************************************/
>  /* Graphics Object ID Bit definition                */
> @@ -411,8 +410,28 @@
>                                                    GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
>                                                    ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT)
>
> -#define ENCODER_VIRTUAL_ENUM_VIRTUAL            ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> -                                                  GRAPH_OBJECT_ENUM_VIRTUAL << ENUM_ID_SHIFT |\
> +#define ENCODER_VIRTUAL_ENUM_ID1                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
> +                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID2                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
> +                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID3                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\
> +                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID4                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\
> +                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID5                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\
> +                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID6                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\
>                                                    ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
>
>  /****************************************************/
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index c626434..1f008a0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1239,20 +1239,37 @@ static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
>         if (amdgpu_virtual_display) {
>                 struct drm_device *ddev = adev->ddev;
>                 const char *pci_address_name = pci_name(ddev->pdev);
> -               char *pciaddstr, *pciaddstr_tmp, *pciaddname;
> +               char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
>
>                 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
>                 pciaddstr_tmp = pciaddstr;
> -               while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
> +               while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
> +                       pciaddname = strsep(&pciaddname_tmp, ",");
>                         if (!strcmp(pci_address_name, pciaddname)) {
> +                               long num_crtc;
> +                               int res = -1;
> +
>                                 adev->enable_virtual_display = true;
> +
> +                               if (pciaddname_tmp)
> +                                       res = kstrtol(pciaddname_tmp, 10,
> +                                               &num_crtc);
> +
> +                               if (!res) {
> +                                       if (num_crtc < 1)
> +                                               num_crtc = 1;
> +                                       if (num_crtc > 6)
> +                                               num_crtc = 6;
> +                                       adev->mode_info.num_crtc = num_crtc;
> +                               } else
> +                                       adev->mode_info.num_crtc = 1;
>                                 break;
>                         }
>                 }
>
> -               DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
> -                                amdgpu_virtual_display, pci_address_name,
> -                                adev->enable_virtual_display);
> +               DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
> +                       amdgpu_virtual_display, pci_address_name,
> +                       adev->enable_virtual_display, adev->mode_info.num_crtc);
>
>                 kfree(pciaddstr);
>         }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 80d8c93..d9b7cbc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -207,7 +207,7 @@ module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
>  MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
>  module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
>
> -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
> +MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
>  module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
>
>  static const struct pci_device_id pciidlist[] = {
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index f3debe8..531d025f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
>         dce_virtual_set_display_funcs(adev);
>         dce_virtual_set_irq_funcs(adev);
>
> -       adev->mode_info.num_crtc = 1;
>         adev->mode_info.num_hpd = 1;
>         adev->mode_info.num_dig = 1;
>         return 0;
> @@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
>         struct amdgpu_i2c_bus_rec ddc_bus;
>         struct amdgpu_router router;
>         struct amdgpu_hpd hpd;
> +       int i = 0;
> +       uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> +       uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
>
>         /* look up gpio for ddc, hpd */
>         ddc_bus.valid = false;
> @@ -373,17 +375,41 @@ static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
>         memset(&router, 0, sizeof(router));
>         router.ddc_valid = false;
>         router.cd_valid = false;
> -       amdgpu_display_add_connector(adev,
> -                                     0,
> -                                     ATOM_DEVICE_CRT1_SUPPORT,
> -                                     DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
> -                                     CONNECTOR_OBJECT_ID_VIRTUAL,
> -                                     &hpd,
> -                                     &router);
> -
> -       amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL,
> -                                                       ATOM_DEVICE_CRT1_SUPPORT,
> -                                                       0);
> +
> +       for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +               switch (i) {
> +               case 0:
> +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> +                       supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> +                       break;
> +               case 1:
> +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
> +                       supported_device = ATOM_DEVICE_DFP2_SUPPORT;
> +                       break;
> +               case 2:
> +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
> +                       supported_device = ATOM_DEVICE_DFP3_SUPPORT;
> +                       break;
> +               case 3:
> +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
> +                       supported_device = ATOM_DEVICE_DFP4_SUPPORT;
> +                       break;
> +               case 4:
> +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
> +                       supported_device = ATOM_DEVICE_DFP5_SUPPORT;
> +                       break;
> +               case 5:
> +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
> +                       supported_device = ATOM_DEVICE_DFP6_SUPPORT;
> +                       break;
> +               }
> +
> +               amdgpu_display_add_connector(adev, i, supported_device,
> +                               DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
> +                               CONNECTOR_OBJECT_ID_VIRTUAL, &hpd, &router);
> +               amdgpu_display_add_encoder(adev, encoder_enum,
> +                               supported_device, 0);
> +       }
>
>         amdgpu_link_encoder_connector(adev->ddev);
>
> @@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct amdgpu_device *adev,
>                 return;
>
>         encoder = &amdgpu_encoder->base;
> -       encoder->possible_crtcs = 0x1;
> +
> +       switch (adev->mode_info.num_crtc) {
> +       case 1:
> +               encoder->possible_crtcs = 0x1;
> +               break;
> +       case 2:
> +               encoder->possible_crtcs = 0x3;
> +               break;
> +       case 3:
> +               encoder->possible_crtcs = 0x7;
> +               break;
> +       case 4:
> +               encoder->possible_crtcs = 0xf;
> +               break;
> +       case 5:
> +               encoder->possible_crtcs = 0x1f;
> +               break;
> +       case 6:
> +               encoder->possible_crtcs = 0x3f;
> +               break;
> +       }
> +
>         amdgpu_encoder->enc_priv = NULL;
>         amdgpu_encoder->encoder_enum = encoder_enum;
>         amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
> @@ -648,9 +695,15 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla
>  {
>         struct amdgpu_mode_info *mode_info = container_of(vblank_timer, struct amdgpu_mode_info ,vblank_timer);
>         struct amdgpu_device *adev = container_of(mode_info, struct amdgpu_device ,mode_info);
> -       unsigned crtc = 0;
> -       drm_handle_vblank(adev->ddev, crtc);
> -       dce_virtual_pageflip_irq(adev, NULL, NULL);
> +       int i;
> +       struct amdgpu_iv_entry entry;
> +
> +       for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +               entry.src_id = i;
> +               drm_handle_vblank(adev->ddev, i);
> +               dce_virtual_pageflip_irq(adev, NULL, &entry);
> +       }

Don't you want a separate timer for each virtual crtc?  I think you
should also at least track which virtual crtcs have vblanks enabled so
you don't handle vblanks on crtcs that are off for example.


> +
>         hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
>         return HRTIMER_NORESTART;
>  }
> @@ -689,6 +742,21 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
>         case AMDGPU_CRTC_IRQ_VBLANK1:
>                 dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
>                 break;
> +       case AMDGPU_CRTC_IRQ_VBLANK2:
> +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
> +               break;
> +       case AMDGPU_CRTC_IRQ_VBLANK3:
> +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
> +               break;
> +       case AMDGPU_CRTC_IRQ_VBLANK4:
> +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
> +               break;
> +       case AMDGPU_CRTC_IRQ_VBLANK5:
> +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
> +               break;
> +       case AMDGPU_CRTC_IRQ_VBLANK6:
> +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
> +               break;
>         default:
>                 break;
>         }
> @@ -708,16 +776,20 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
>                               struct amdgpu_irq_src *source,
>                               struct amdgpu_iv_entry *entry)
>  {
> -       unsigned crtc = 0;
> +       int i;
>         unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
>
> -       dce_virtual_crtc_vblank_int_ack(adev, crtc);
> +       for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +               irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
> +               entry->src_id = i;
> +
> +               dce_virtual_crtc_vblank_int_ack(adev, i);
> +               if (amdgpu_irq_enabled(adev, source, irq_type))
> +                       drm_handle_vblank(adev->ddev, i);
>
> -       if (amdgpu_irq_enabled(adev, source, irq_type)) {
> -               drm_handle_vblank(adev->ddev, crtc);
> +               dce_virtual_pageflip_irq(adev, NULL, entry);
> +               DRM_DEBUG("IH: D%d vblank\n", i + 1);
>         }
> -       dce_virtual_pageflip_irq(adev, NULL, NULL);
> -       DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
>         return 0;
>  }
>
> @@ -744,7 +816,7 @@ static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
>         struct amdgpu_crtc *amdgpu_crtc;
>         struct amdgpu_flip_work *works;
>
> -       crtc_id = 0;
> +       crtc_id = entry->src_id;
>         amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
>
>         if (crtc_id >= adev->mode_info.num_crtc) {
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
       [not found]     ` <CADnq5_OxAYkR_p5JN7iPaTF11Erfy61zKdwyt3YKngpjB+Vj7w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2016-09-30  3:49       ` Deng, Emily
  0 siblings, 0 replies; 7+ messages in thread
From: Deng, Emily @ 2016-09-30  3:49 UTC (permalink / raw)
  To: Alex Deucher; +Cc: amd-gfx list



> -----Original Message-----
> From: Alex Deucher [mailto:alexdeucher@gmail.com]
> Sent: Friday, September 30, 2016 11:29 AM
> To: Deng, Emily <Emily.Deng@amd.com>
> Cc: amd-gfx list <amd-gfx@lists.freedesktop.org>
> Subject: Re: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
> 
> On Thu, Sep 29, 2016 at 2:45 AM, Emily Deng <Emily.Deng@amd.com> wrote:
> > Enable multi crtcs for virtual display, user can set the number of
> > crtcs by amdgpu module parameter  virtual_display.
> >
> > Signed-off-by: Emily Deng <Emily.Deng@amd.com>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
> >  drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118
> +++++++++++++++++++++++------
> >  4 files changed, 140 insertions(+), 32 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > index b8d6667..3002836 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> > @@ -149,7 +149,6 @@
> >  #define GRAPH_OBJECT_ENUM_ID5                     0x05
> >  #define GRAPH_OBJECT_ENUM_ID6                     0x06
> >  #define GRAPH_OBJECT_ENUM_ID7                     0x07
> > -#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
> >
> >  /****************************************************/
> >  /* Graphics Object ID Bit definition                */
> > @@ -411,8 +410,28 @@
> >                                                    GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> |\
> >
> > ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT)
> >
> > -#define ENCODER_VIRTUAL_ENUM_VIRTUAL
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > -                                                  GRAPH_OBJECT_ENUM_VIRTUAL <<
> ENUM_ID_SHIFT |\
> > +#define ENCODER_VIRTUAL_ENUM_ID1
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +                                                  GRAPH_OBJECT_ENUM_ID1 <<
> ENUM_ID_SHIFT |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID2
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +                                                  GRAPH_OBJECT_ENUM_ID2 <<
> ENUM_ID_SHIFT |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID3
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +                                                  GRAPH_OBJECT_ENUM_ID3 <<
> ENUM_ID_SHIFT |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID4
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +                                                  GRAPH_OBJECT_ENUM_ID4 <<
> ENUM_ID_SHIFT |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID5
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +                                                  GRAPH_OBJECT_ENUM_ID5 <<
> ENUM_ID_SHIFT |\
> > +
> > +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> > +
> > +#define ENCODER_VIRTUAL_ENUM_ID6
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> > +
> > +GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\
> >
> > ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> >
> >  /****************************************************/
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > index c626434..1f008a0 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > @@ -1239,20 +1239,37 @@ static void
> amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
> >         if (amdgpu_virtual_display) {
> >                 struct drm_device *ddev = adev->ddev;
> >                 const char *pci_address_name = pci_name(ddev->pdev);
> > -               char *pciaddstr, *pciaddstr_tmp, *pciaddname;
> > +               char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp,
> > + *pciaddname;
> >
> >                 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
> >                 pciaddstr_tmp = pciaddstr;
> > -               while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
> > +               while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
> > +                       pciaddname = strsep(&pciaddname_tmp, ",");
> >                         if (!strcmp(pci_address_name, pciaddname)) {
> > +                               long num_crtc;
> > +                               int res = -1;
> > +
> >                                 adev->enable_virtual_display = true;
> > +
> > +                               if (pciaddname_tmp)
> > +                                       res = kstrtol(pciaddname_tmp, 10,
> > +                                               &num_crtc);
> > +
> > +                               if (!res) {
> > +                                       if (num_crtc < 1)
> > +                                               num_crtc = 1;
> > +                                       if (num_crtc > 6)
> > +                                               num_crtc = 6;
> > +                                       adev->mode_info.num_crtc = num_crtc;
> > +                               } else
> > +                                       adev->mode_info.num_crtc = 1;
> >                                 break;
> >                         }
> >                 }
> >
> > -               DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
> > -                                amdgpu_virtual_display, pci_address_name,
> > -                                adev->enable_virtual_display);
> > +               DRM_INFO("virtual display string:%s, %s:virtual_display:%d,
> num_crtc:%d\n",
> > +                       amdgpu_virtual_display, pci_address_name,
> > +                       adev->enable_virtual_display,
> > + adev->mode_info.num_crtc);
> >
> >                 kfree(pciaddstr);
> >         }
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > index 80d8c93..d9b7cbc 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> > @@ -207,7 +207,7 @@ module_param_named(pg_mask, amdgpu_pg_mask,
> uint,
> > 0444);  MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
> > module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
> >
> > -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature
> > (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
> > +MODULE_PARM_DESC(virtual_display, "Enable virtual display feature
> > +(the virtual_display will be set like
> > +xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
> >  module_param_named(virtual_display, amdgpu_virtual_display, charp,
> > 0444);
> >
> >  static const struct pci_device_id pciidlist[] = { diff --git
> > a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > index f3debe8..531d025f 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> > @@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
> >         dce_virtual_set_display_funcs(adev);
> >         dce_virtual_set_irq_funcs(adev);
> >
> > -       adev->mode_info.num_crtc = 1;
> >         adev->mode_info.num_hpd = 1;
> >         adev->mode_info.num_dig = 1;
> >         return 0;
> > @@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct
> amdgpu_device *adev)
> >         struct amdgpu_i2c_bus_rec ddc_bus;
> >         struct amdgpu_router router;
> >         struct amdgpu_hpd hpd;
> > +       int i = 0;
> > +       uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> > +       uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> >
> >         /* look up gpio for ddc, hpd */
> >         ddc_bus.valid = false;
> > @@ -373,17 +375,41 @@ static bool dce_virtual_get_connector_info(struct
> amdgpu_device *adev)
> >         memset(&router, 0, sizeof(router));
> >         router.ddc_valid = false;
> >         router.cd_valid = false;
> > -       amdgpu_display_add_connector(adev,
> > -                                     0,
> > -                                     ATOM_DEVICE_CRT1_SUPPORT,
> > -                                     DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
> > -                                     CONNECTOR_OBJECT_ID_VIRTUAL,
> > -                                     &hpd,
> > -                                     &router);
> > -
> > -       amdgpu_display_add_encoder(adev,
> ENCODER_VIRTUAL_ENUM_VIRTUAL,
> > -                                                       ATOM_DEVICE_CRT1_SUPPORT,
> > -                                                       0);
> > +
> > +       for (i = 0; i < adev->mode_info.num_crtc; i++) {
> > +               switch (i) {
> > +               case 0:
> > +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> > +                       supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> > +                       break;
> > +               case 1:
> > +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
> > +                       supported_device = ATOM_DEVICE_DFP2_SUPPORT;
> > +                       break;
> > +               case 2:
> > +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
> > +                       supported_device = ATOM_DEVICE_DFP3_SUPPORT;
> > +                       break;
> > +               case 3:
> > +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
> > +                       supported_device = ATOM_DEVICE_DFP4_SUPPORT;
> > +                       break;
> > +               case 4:
> > +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
> > +                       supported_device = ATOM_DEVICE_DFP5_SUPPORT;
> > +                       break;
> > +               case 5:
> > +                       encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
> > +                       supported_device = ATOM_DEVICE_DFP6_SUPPORT;
> > +                       break;
> > +               }
> > +
> > +               amdgpu_display_add_connector(adev, i, supported_device,
> > +                               DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
> > +                               CONNECTOR_OBJECT_ID_VIRTUAL, &hpd, &router);
> > +               amdgpu_display_add_encoder(adev, encoder_enum,
> > +                               supported_device, 0);
> > +       }
> >
> >         amdgpu_link_encoder_connector(adev->ddev);
> >
> > @@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct
> amdgpu_device *adev,
> >                 return;
> >
> >         encoder = &amdgpu_encoder->base;
> > -       encoder->possible_crtcs = 0x1;
> > +
> > +       switch (adev->mode_info.num_crtc) {
> > +       case 1:
> > +               encoder->possible_crtcs = 0x1;
> > +               break;
> > +       case 2:
> > +               encoder->possible_crtcs = 0x3;
> > +               break;
> > +       case 3:
> > +               encoder->possible_crtcs = 0x7;
> > +               break;
> > +       case 4:
> > +               encoder->possible_crtcs = 0xf;
> > +               break;
> > +       case 5:
> > +               encoder->possible_crtcs = 0x1f;
> > +               break;
> > +       case 6:
> > +               encoder->possible_crtcs = 0x3f;
> > +               break;
> > +       }
> > +
> >         amdgpu_encoder->enc_priv = NULL;
> >         amdgpu_encoder->encoder_enum = encoder_enum;
> >         amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK)
> > >> OBJECT_ID_SHIFT; @@ -648,9 +695,15 @@ static enum hrtimer_restart
> > dce_virtual_vblank_timer_handle(struct hrtimer *vbla  {
> >         struct amdgpu_mode_info *mode_info = container_of(vblank_timer,
> struct amdgpu_mode_info ,vblank_timer);
> >         struct amdgpu_device *adev = container_of(mode_info, struct
> amdgpu_device ,mode_info);
> > -       unsigned crtc = 0;
> > -       drm_handle_vblank(adev->ddev, crtc);
> > -       dce_virtual_pageflip_irq(adev, NULL, NULL);
> > +       int i;
> > +       struct amdgpu_iv_entry entry;
> > +
> > +       for (i = 0; i < adev->mode_info.num_crtc; i++) {
> > +               entry.src_id = i;
> > +               drm_handle_vblank(adev->ddev, i);
> > +               dce_virtual_pageflip_irq(adev, NULL, &entry);
> > +       }
> 
> Don't you want a separate timer for each virtual crtc?  I think you should also
> at least track which virtual crtcs have vblanks enabled so you don't handle
> vblanks on crtcs that are off for example.
> 
[[EmilyD]] Thanks, Ok. I will separate the timer for each crtc.
> 
> > +
> >         hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
> >         return HRTIMER_NORESTART;
> >  }
> > @@ -689,6 +742,21 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
> >         case AMDGPU_CRTC_IRQ_VBLANK1:
> >                 dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
> >                 break;
> > +       case AMDGPU_CRTC_IRQ_VBLANK2:
> > +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
> > +               break;
> > +       case AMDGPU_CRTC_IRQ_VBLANK3:
> > +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
> > +               break;
> > +       case AMDGPU_CRTC_IRQ_VBLANK4:
> > +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
> > +               break;
> > +       case AMDGPU_CRTC_IRQ_VBLANK5:
> > +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
> > +               break;
> > +       case AMDGPU_CRTC_IRQ_VBLANK6:
> > +               dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
> > +               break;
> >         default:
> >                 break;
> >         }
> > @@ -708,16 +776,20 @@ static int dce_virtual_crtc_irq(struct
> amdgpu_device *adev,
> >                               struct amdgpu_irq_src *source,
> >                               struct amdgpu_iv_entry *entry)  {
> > -       unsigned crtc = 0;
> > +       int i;
> >         unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
> >
> > -       dce_virtual_crtc_vblank_int_ack(adev, crtc);
> > +       for (i = 0; i < adev->mode_info.num_crtc; i++) {
> > +               irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
> > +               entry->src_id = i;
> > +
> > +               dce_virtual_crtc_vblank_int_ack(adev, i);
> > +               if (amdgpu_irq_enabled(adev, source, irq_type))
> > +                       drm_handle_vblank(adev->ddev, i);
> >
> > -       if (amdgpu_irq_enabled(adev, source, irq_type)) {
> > -               drm_handle_vblank(adev->ddev, crtc);
> > +               dce_virtual_pageflip_irq(adev, NULL, entry);
> > +               DRM_DEBUG("IH: D%d vblank\n", i + 1);
> >         }
> > -       dce_virtual_pageflip_irq(adev, NULL, NULL);
> > -       DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
> >         return 0;
> >  }
> >
> > @@ -744,7 +816,7 @@ static int dce_virtual_pageflip_irq(struct
> amdgpu_device *adev,
> >         struct amdgpu_crtc *amdgpu_crtc;
> >         struct amdgpu_flip_work *works;
> >
> > -       crtc_id = 0;
> > +       crtc_id = entry->src_id;
> >         amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> >
> >         if (crtc_id >= adev->mode_info.num_crtc) {
> > --
> > 1.9.1
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
       [not found] ` <1475129481-2018-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
@ 2016-09-29  6:15   ` Deng, Emily
  0 siblings, 0 replies; 7+ messages in thread
From: Deng, Emily @ 2016-09-29  6:15 UTC (permalink / raw)
  To: Deng, Emily, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Hi All,
     Please ignore this mail, it has some format issue.

Best Wishes,
Emily Deng



> -----Original Message-----
> From: Emily Deng [mailto:Emily.Deng@amd.com]
> Sent: Thursday, September 29, 2016 2:11 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deng, Emily <Emily.Deng@amd.com>
> Subject: [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
> 
> Enable multi crtcs for virtual display, user can set the number of crtcs by
> amdgpu module parameter  virtual_display.
> 
> Signed-off-by: Emily Deng <Emily.Deng@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
>  drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118
> +++++++++++++++++++++++------
>  4 files changed, 140 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> index b8d6667..3002836 100644
> --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> @@ -149,7 +149,6 @@
>  #define GRAPH_OBJECT_ENUM_ID5                     0x05
>  #define GRAPH_OBJECT_ENUM_ID6                     0x06
>  #define GRAPH_OBJECT_ENUM_ID7                     0x07
> -#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
> 
>  /****************************************************/
>  /* Graphics Object ID Bit definition                */
> @@ -411,8 +410,28 @@
>                                                    GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> |\
>                                                    ENCODER_OBJECT_ID_HDMI_ANX9805 <<
> OBJECT_ID_SHIFT)
> 
> -#define ENCODER_VIRTUAL_ENUM_VIRTUAL
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> -                                                  GRAPH_OBJECT_ENUM_VIRTUAL <<
> ENUM_ID_SHIFT |\
> +#define ENCODER_VIRTUAL_ENUM_ID1
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID2
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID3
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID4
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID5
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT
> |\
> +
> +ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
> +
> +#define ENCODER_VIRTUAL_ENUM_ID6
> ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
> +                                                  GRAPH_OBJECT_ENUM_ID6
> +<< ENUM_ID_SHIFT |\
>                                                    ENCODER_OBJECT_ID_VIRTUAL <<
> OBJECT_ID_SHIFT)
> 
>  /****************************************************/
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 7cd9f49..2a1f832 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1239,20 +1239,37 @@ static void
> amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
>  	if (amdgpu_virtual_display) {
>  		struct drm_device *ddev = adev->ddev;
>  		const char *pci_address_name = pci_name(ddev->pdev);
> -		char *pciaddstr, *pciaddstr_tmp, *pciaddname;
> +		char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp,
> *pciaddname;
> 
>  		pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
>  		pciaddstr_tmp = pciaddstr;
> -		while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
> +		while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
> +			pciaddname = strsep(&pciaddname_tmp, ",");
>  			if (!strcmp(pci_address_name, pciaddname)) {
> +				long num_crtc;
> +				int res = -1;
> +
>  				adev->enable_virtual_display = true;
> +
> +				if (pciaddname_tmp)
> +					res = kstrtol(pciaddname_tmp, 10,
> +						&num_crtc);
> +
> +				if (!res) {
> +					if (num_crtc < 1)
> +						num_crtc = 1;
> +					if (num_crtc > 6)
> +						num_crtc = 6;
> +					adev->mode_info.num_crtc =
> num_crtc;
> +				} else
> +					adev->mode_info.num_crtc = 1;
>  				break;
>  			}
>  		}
> 
> -		DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
> -				 amdgpu_virtual_display, pci_address_name,
> -				 adev->enable_virtual_display);
> +		DRM_INFO("virtual display string:%s, %s:virtual_display:%d,
> num_crtc:%d\n",
> +			amdgpu_virtual_display, pci_address_name,
> +			adev->enable_virtual_display, adev-
> >mode_info.num_crtc);
> 
>  		kfree(pciaddstr);
>  	}
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index e059bb2..7480590 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -213,7 +213,7 @@ module_param_named(pg_mask, amdgpu_pg_mask,
> uint, 0444);  MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
> module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
> 
> -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the
> virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
> +MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the
> +virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
>  module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
> 
>  static const struct pci_device_id pciidlist[] = { diff --git
> a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index c86eb72..5ee5a29 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
>  	dce_virtual_set_display_funcs(adev);
>  	dce_virtual_set_irq_funcs(adev);
> 
> -	adev->mode_info.num_crtc = 1;
>  	adev->mode_info.num_hpd = 1;
>  	adev->mode_info.num_dig = 1;
>  	return 0;
> @@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct
> amdgpu_device *adev)
>  	struct amdgpu_i2c_bus_rec ddc_bus;
>  	struct amdgpu_router router;
>  	struct amdgpu_hpd hpd;
> +	int i = 0;
> +	uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> +	uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> 
>  	/* look up gpio for ddc, hpd */
>  	ddc_bus.valid = false;
> @@ -373,17 +375,41 @@ static bool dce_virtual_get_connector_info(struct
> amdgpu_device *adev)
>  	memset(&router, 0, sizeof(router));
>  	router.ddc_valid = false;
>  	router.cd_valid = false;
> -	amdgpu_display_add_connector(adev,
> -				      0,
> -				      ATOM_DEVICE_CRT1_SUPPORT,
> -				      DRM_MODE_CONNECTOR_VIRTUAL,
> &ddc_bus,
> -				      CONNECTOR_OBJECT_ID_VIRTUAL,
> -				      &hpd,
> -				      &router);
> -
> -	amdgpu_display_add_encoder(adev,
> ENCODER_VIRTUAL_ENUM_VIRTUAL,
> -
> 	ATOM_DEVICE_CRT1_SUPPORT,
> -							0);
> +
> +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +		switch (i) {
> +		case 0:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
> +			supported_device = ATOM_DEVICE_DFP1_SUPPORT;
> +			break;
> +		case 1:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
> +			supported_device = ATOM_DEVICE_DFP2_SUPPORT;
> +			break;
> +		case 2:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
> +			supported_device = ATOM_DEVICE_DFP3_SUPPORT;
> +			break;
> +		case 3:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
> +			supported_device = ATOM_DEVICE_DFP4_SUPPORT;
> +			break;
> +		case 4:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
> +			supported_device = ATOM_DEVICE_DFP5_SUPPORT;
> +			break;
> +		case 5:
> +			encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
> +			supported_device = ATOM_DEVICE_DFP6_SUPPORT;
> +			break;
> +		}
> +
> +		amdgpu_display_add_connector(adev, i, supported_device,
> +				DRM_MODE_CONNECTOR_VIRTUAL,
> &ddc_bus,
> +				CONNECTOR_OBJECT_ID_VIRTUAL, &hpd,
> &router);
> +		amdgpu_display_add_encoder(adev, encoder_enum,
> +				supported_device, 0);
> +	}
> 
>  	amdgpu_link_encoder_connector(adev->ddev);
> 
> @@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct
> amdgpu_device *adev,
>  		return;
> 
>  	encoder = &amdgpu_encoder->base;
> -	encoder->possible_crtcs = 0x1;
> +
> +	switch (adev->mode_info.num_crtc) {
> +	case 1:
> +		encoder->possible_crtcs = 0x1;
> +		break;
> +	case 2:
> +		encoder->possible_crtcs = 0x3;
> +		break;
> +	case 3:
> +		encoder->possible_crtcs = 0x7;
> +		break;
> +	case 4:
> +		encoder->possible_crtcs = 0xf;
> +		break;
> +	case 5:
> +		encoder->possible_crtcs = 0x1f;
> +		break;
> +	case 6:
> +		encoder->possible_crtcs = 0x3f;
> +		break;
> +	}
> +
>  	amdgpu_encoder->enc_priv = NULL;
>  	amdgpu_encoder->encoder_enum = encoder_enum;
>  	amdgpu_encoder->encoder_id = (encoder_enum &
> OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; @@ -647,9 +694,15 @@ static enum
> hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla  {
>  	struct amdgpu_mode_info *mode_info = container_of(vblank_timer,
> struct amdgpu_mode_info ,vblank_timer);
>  	struct amdgpu_device *adev = container_of(mode_info, struct
> amdgpu_device ,mode_info);
> -	unsigned crtc = 0;
> -	drm_handle_vblank(adev->ddev, crtc);
> -	dce_virtual_pageflip_irq(adev, NULL, NULL);
> +	int i;
> +	struct amdgpu_iv_entry entry;
> +
> +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +		entry.src_id = i;
> +		drm_handle_vblank(adev->ddev, i);
> +		dce_virtual_pageflip_irq(adev, NULL, &entry);
> +	}
> +
>  	hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
>  	return HRTIMER_NORESTART;
>  }
> @@ -688,6 +741,21 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
>  	case AMDGPU_CRTC_IRQ_VBLANK1:
>  		dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
>  		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK2:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK3:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK4:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK5:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
> +		break;
> +	case AMDGPU_CRTC_IRQ_VBLANK6:
> +		dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
> +		break;
>  	default:
>  		break;
>  	}
> @@ -707,16 +775,20 @@ static int dce_virtual_crtc_irq(struct amdgpu_device
> *adev,
>  			      struct amdgpu_irq_src *source,
>  			      struct amdgpu_iv_entry *entry)  {
> -	unsigned crtc = 0;
> +	int i;
>  	unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
> 
> -	dce_virtual_crtc_vblank_int_ack(adev, crtc);
> +	for (i = 0; i < adev->mode_info.num_crtc; i++) {
> +		irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
> +		entry->src_id = i;
> +
> +		dce_virtual_crtc_vblank_int_ack(adev, i);
> +		if (amdgpu_irq_enabled(adev, source, irq_type))
> +			drm_handle_vblank(adev->ddev, i);
> 
> -	if (amdgpu_irq_enabled(adev, source, irq_type)) {
> -		drm_handle_vblank(adev->ddev, crtc);
> +		dce_virtual_pageflip_irq(adev, NULL, entry);
> +		DRM_DEBUG("IH: D%d vblank\n", i + 1);
>  	}
> -	dce_virtual_pageflip_irq(adev, NULL, NULL);
> -	DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
>  	return 0;
>  }
> 
> @@ -743,7 +815,7 @@ static int dce_virtual_pageflip_irq(struct
> amdgpu_device *adev,
>  	struct amdgpu_crtc *amdgpu_crtc;
>  	struct amdgpu_flip_work *works;
> 
> -	crtc_id = 0;
> +	crtc_id = entry->src_id;
>  	amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> 
>  	if (crtc_id >= adev->mode_info.num_crtc) {
> --
> 1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs.
@ 2016-09-29  6:11 Emily Deng
       [not found] ` <1475129481-2018-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: Emily Deng @ 2016-09-29  6:11 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Emily Deng

Enable multi crtcs for virtual display, user can set the number of crtcs
by amdgpu module parameter  virtual_display.

Signed-off-by: Emily Deng <Emily.Deng@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/ObjectID.h      |  25 +++++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  27 +++++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |   2 +-
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   | 118 +++++++++++++++++++++++------
 4 files changed, 140 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index b8d6667..3002836 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -149,7 +149,6 @@
 #define GRAPH_OBJECT_ENUM_ID5                     0x05
 #define GRAPH_OBJECT_ENUM_ID6                     0x06
 #define GRAPH_OBJECT_ENUM_ID7                     0x07
-#define GRAPH_OBJECT_ENUM_VIRTUAL                 0x08
 
 /****************************************************/
 /* Graphics Object ID Bit definition                */
@@ -411,8 +410,28 @@
                                                   GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
                                                   ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT)
 
-#define ENCODER_VIRTUAL_ENUM_VIRTUAL            ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
-                                                  GRAPH_OBJECT_ENUM_VIRTUAL << ENUM_ID_SHIFT |\
+#define ENCODER_VIRTUAL_ENUM_ID1                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID2                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID3                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID4                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID5                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\
+                                                  ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
+
+#define ENCODER_VIRTUAL_ENUM_ID6                 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
+                                                  GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\
                                                   ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
 
 /****************************************************/
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 7cd9f49..2a1f832 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1239,20 +1239,37 @@ static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
 	if (amdgpu_virtual_display) {
 		struct drm_device *ddev = adev->ddev;
 		const char *pci_address_name = pci_name(ddev->pdev);
-		char *pciaddstr, *pciaddstr_tmp, *pciaddname;
+		char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname;
 
 		pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
 		pciaddstr_tmp = pciaddstr;
-		while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
+		while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) {
+			pciaddname = strsep(&pciaddname_tmp, ",");
 			if (!strcmp(pci_address_name, pciaddname)) {
+				long num_crtc;
+				int res = -1;
+
 				adev->enable_virtual_display = true;
+
+				if (pciaddname_tmp)
+					res = kstrtol(pciaddname_tmp, 10,
+						&num_crtc);
+
+				if (!res) {
+					if (num_crtc < 1)
+						num_crtc = 1;
+					if (num_crtc > 6)
+						num_crtc = 6;
+					adev->mode_info.num_crtc = num_crtc;
+				} else
+					adev->mode_info.num_crtc = 1;
 				break;
 			}
 		}
 
-		DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
-				 amdgpu_virtual_display, pci_address_name,
-				 adev->enable_virtual_display);
+		DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n",
+			amdgpu_virtual_display, pci_address_name,
+			adev->enable_virtual_display, adev->mode_info.num_crtc);
 
 		kfree(pciaddstr);
 	}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index e059bb2..7480590 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -213,7 +213,7 @@ module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
 MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
 module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
 
-MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
+MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)");
 module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
 
 static const struct pci_device_id pciidlist[] = {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index c86eb72..5ee5a29 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -352,7 +352,6 @@ static int dce_virtual_early_init(void *handle)
 	dce_virtual_set_display_funcs(adev);
 	dce_virtual_set_irq_funcs(adev);
 
-	adev->mode_info.num_crtc = 1;
 	adev->mode_info.num_hpd = 1;
 	adev->mode_info.num_dig = 1;
 	return 0;
@@ -363,6 +362,9 @@ static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
 	struct amdgpu_i2c_bus_rec ddc_bus;
 	struct amdgpu_router router;
 	struct amdgpu_hpd hpd;
+	int i = 0;
+	uint32_t encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
+	uint32_t supported_device = ATOM_DEVICE_DFP1_SUPPORT;
 
 	/* look up gpio for ddc, hpd */
 	ddc_bus.valid = false;
@@ -373,17 +375,41 @@ static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
 	memset(&router, 0, sizeof(router));
 	router.ddc_valid = false;
 	router.cd_valid = false;
-	amdgpu_display_add_connector(adev,
-				      0,
-				      ATOM_DEVICE_CRT1_SUPPORT,
-				      DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
-				      CONNECTOR_OBJECT_ID_VIRTUAL,
-				      &hpd,
-				      &router);
-
-	amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL,
-							ATOM_DEVICE_CRT1_SUPPORT,
-							0);
+
+	for (i = 0; i < adev->mode_info.num_crtc; i++) {
+		switch (i) {
+		case 0:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID1;
+			supported_device = ATOM_DEVICE_DFP1_SUPPORT;
+			break;
+		case 1:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID2;
+			supported_device = ATOM_DEVICE_DFP2_SUPPORT;
+			break;
+		case 2:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID3;
+			supported_device = ATOM_DEVICE_DFP3_SUPPORT;
+			break;
+		case 3:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID4;
+			supported_device = ATOM_DEVICE_DFP4_SUPPORT;
+			break;
+		case 4:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID5;
+			supported_device = ATOM_DEVICE_DFP5_SUPPORT;
+			break;
+		case 5:
+			encoder_enum = ENCODER_VIRTUAL_ENUM_ID6;
+			supported_device = ATOM_DEVICE_DFP6_SUPPORT;
+			break;
+		}
+
+		amdgpu_display_add_connector(adev, i, supported_device,
+				DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
+				CONNECTOR_OBJECT_ID_VIRTUAL, &hpd, &router);
+		amdgpu_display_add_encoder(adev, encoder_enum,
+				supported_device, 0);
+	}
 
 	amdgpu_link_encoder_connector(adev->ddev);
 
@@ -603,7 +629,28 @@ static void dce_virtual_encoder_add(struct amdgpu_device *adev,
 		return;
 
 	encoder = &amdgpu_encoder->base;
-	encoder->possible_crtcs = 0x1;
+
+	switch (adev->mode_info.num_crtc) {
+	case 1:
+		encoder->possible_crtcs = 0x1;
+		break;
+	case 2:
+		encoder->possible_crtcs = 0x3;
+		break;
+	case 3:
+		encoder->possible_crtcs = 0x7;
+		break;
+	case 4:
+		encoder->possible_crtcs = 0xf;
+		break;
+	case 5:
+		encoder->possible_crtcs = 0x1f;
+		break;
+	case 6:
+		encoder->possible_crtcs = 0x3f;
+		break;
+	}
+
 	amdgpu_encoder->enc_priv = NULL;
 	amdgpu_encoder->encoder_enum = encoder_enum;
 	amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
@@ -647,9 +694,15 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla
 {
 	struct amdgpu_mode_info *mode_info = container_of(vblank_timer, struct amdgpu_mode_info ,vblank_timer);
 	struct amdgpu_device *adev = container_of(mode_info, struct amdgpu_device ,mode_info);
-	unsigned crtc = 0;
-	drm_handle_vblank(adev->ddev, crtc);
-	dce_virtual_pageflip_irq(adev, NULL, NULL);
+	int i;
+	struct amdgpu_iv_entry entry;
+
+	for (i = 0; i < adev->mode_info.num_crtc; i++) {
+		entry.src_id = i;
+		drm_handle_vblank(adev->ddev, i);
+		dce_virtual_pageflip_irq(adev, NULL, &entry);
+	}
+
 	hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
 	return HRTIMER_NORESTART;
 }
@@ -688,6 +741,21 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
 	case AMDGPU_CRTC_IRQ_VBLANK1:
 		dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
 		break;
+	case AMDGPU_CRTC_IRQ_VBLANK2:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 1, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK3:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 2, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK4:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 3, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK5:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 4, state);
+		break;
+	case AMDGPU_CRTC_IRQ_VBLANK6:
+		dce_virtual_set_crtc_vblank_interrupt_state(adev, 5, state);
+		break;
 	default:
 		break;
 	}
@@ -707,16 +775,20 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
 			      struct amdgpu_irq_src *source,
 			      struct amdgpu_iv_entry *entry)
 {
-	unsigned crtc = 0;
+	int i;
 	unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
 
-	dce_virtual_crtc_vblank_int_ack(adev, crtc);
+	for (i = 0; i < adev->mode_info.num_crtc; i++) {
+		irq_type = amdgpu_crtc_idx_to_irq_type(adev, i);
+		entry->src_id = i;
+
+		dce_virtual_crtc_vblank_int_ack(adev, i);
+		if (amdgpu_irq_enabled(adev, source, irq_type))
+			drm_handle_vblank(adev->ddev, i);
 
-	if (amdgpu_irq_enabled(adev, source, irq_type)) {
-		drm_handle_vblank(adev->ddev, crtc);
+		dce_virtual_pageflip_irq(adev, NULL, entry);
+		DRM_DEBUG("IH: D%d vblank\n", i + 1);
 	}
-	dce_virtual_pageflip_irq(adev, NULL, NULL);
-	DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
 	return 0;
 }
 
@@ -743,7 +815,7 @@ static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
 	struct amdgpu_crtc *amdgpu_crtc;
 	struct amdgpu_flip_work *works;
 
-	crtc_id = 0;
+	crtc_id = entry->src_id;
 	amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
 
 	if (crtc_id >= adev->mode_info.num_crtc) {
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-09-30  3:49 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-29  6:45 [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs Emily Deng
     [not found] ` <1475131540-1987-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
2016-09-29  9:46   ` Deng, Emily
     [not found]     ` <DM5PR12MB16599B8DB28E608664C492168FCE0-2J9CzHegvk/nc5151fM8tgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2016-09-30  1:42       ` Deng, Emily
2016-09-30  3:28   ` Alex Deucher
     [not found]     ` <CADnq5_OxAYkR_p5JN7iPaTF11Erfy61zKdwyt3YKngpjB+Vj7w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-09-30  3:49       ` Deng, Emily
  -- strict thread matches above, loose matches on Subject: below --
2016-09-29  6:11 Emily Deng
     [not found] ` <1475129481-2018-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
2016-09-29  6:15   ` Deng, Emily

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.