* [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
[parent not found: <1475129481-2018-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>]
* 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: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
[parent not found: <1475131540-1987-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>]
* 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
[parent not found: <DM5PR12MB16599B8DB28E608664C492168FCE0-2J9CzHegvk/nc5151fM8tgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* 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
[parent not found: <CADnq5_OxAYkR_p5JN7iPaTF11Erfy61zKdwyt3YKngpjB+Vj7w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* 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
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:11 [PATCH] drm/amd/amdgpu: For virtual display, enable multi crtcs Emily Deng [not found] ` <1475129481-2018-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org> 2016-09-29 6:15 ` Deng, Emily 2016-09-29 6:45 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
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.