* [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs
@ 2016-09-30 17:08 Alex Deucher
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
0 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
Never used.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 35 ++++++--------------------------
1 file changed, 6 insertions(+), 29 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index 359fe56..cf43caa 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -209,10 +209,9 @@ static void dce_virtual_crtc_dpms(struct drm_crtc *crtc, int mode)
switch (mode) {
case DRM_MODE_DPMS_ON:
amdgpu_crtc->enabled = true;
- /* Make sure VBLANK and PFLIP interrupts are still enabled */
+ /* Make sure VBLANK interrupts are still enabled */
type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id);
amdgpu_irq_update(adev, &adev->crtc_irq, type);
- amdgpu_irq_update(adev, &adev->pageflip_irq, type);
drm_vblank_on(dev, amdgpu_crtc->crtc_id);
break;
case DRM_MODE_DPMS_STANDBY:
@@ -672,8 +671,8 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla
}
static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev,
- int crtc,
- enum amdgpu_interrupt_state state)
+ int crtc,
+ enum amdgpu_interrupt_state state)
{
if (crtc >= adev->mode_info.num_crtc) {
DRM_DEBUG("invalid crtc %d\n", crtc);
@@ -697,9 +696,9 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad
static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
- struct amdgpu_irq_src *source,
- unsigned type,
- enum amdgpu_interrupt_state state)
+ struct amdgpu_irq_src *source,
+ unsigned type,
+ enum amdgpu_interrupt_state state)
{
switch (type) {
case AMDGPU_CRTC_IRQ_VBLANK1:
@@ -726,20 +725,6 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
return 0;
}
-static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev,
- struct amdgpu_irq_src *src,
- unsigned type,
- enum amdgpu_interrupt_state state)
-{
- if (type >= adev->mode_info.num_crtc) {
- DRM_ERROR("invalid pageflip crtc %d\n", type);
- return -EINVAL;
- }
- DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state);
-
- return 0;
-}
-
static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
struct amdgpu_irq_src *source,
struct amdgpu_iv_entry *entry)
@@ -793,17 +778,9 @@ static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
.process = dce_virtual_crtc_irq,
};
-static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = {
- .set = dce_virtual_set_pageflip_irq_state,
- .process = dce_virtual_pageflip_irq,
-};
-
static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev)
{
adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST;
adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs;
-
- adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST;
- adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs;
}
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-09-30 17:08 ` Alex Deucher
[not found] ` <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling Alex Deucher
` (6 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
Virtual crtcs interrupts do not show up in the IV ring,
so it will never be called.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 17 +----------------
1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index cf43caa..8163622 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -710,21 +710,6 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
return 0;
}
-static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
- struct amdgpu_irq_src *source,
- struct amdgpu_iv_entry *entry)
-{
- unsigned crtc = 0;
- unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
-
- if (amdgpu_irq_enabled(adev, source, irq_type)) {
- drm_handle_vblank(adev->ddev, crtc);
- }
- dce_virtual_pageflip_irq(adev, NULL, NULL);
- DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
- return 0;
-}
-
static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
struct amdgpu_irq_src *source,
struct amdgpu_iv_entry *entry)
@@ -775,7 +760,7 @@ static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
.set = dce_virtual_set_crtc_irq_state,
- .process = dce_virtual_crtc_irq,
+ .process = NULL,
};
static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev)
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback Alex Deucher
@ 2016-09-30 17:08 ` Alex Deucher
[not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup Alex Deucher
` (5 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
We handle the virtual interrupts from a timer so no
need to try an look like we are handling IV ring events.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 109 +++++++++++++++----------------
1 file changed, 54 insertions(+), 55 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index 8163622..29e0ce0 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -39,9 +39,6 @@
static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev);
-static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
- struct amdgpu_irq_src *source,
- struct amdgpu_iv_entry *entry);
/**
* dce_virtual_vblank_wait - vblank wait asic callback.
@@ -659,14 +656,64 @@ static void dce_virtual_set_display_funcs(struct amdgpu_device *adev)
adev->mode_info.funcs = &dce_virtual_display_funcs;
}
+static int dce_virtual_pageflip(struct amdgpu_device *adev,
+ unsigned crtc_id)
+{
+ unsigned long flags;
+ struct amdgpu_crtc *amdgpu_crtc;
+ struct amdgpu_flip_work *works;
+
+ amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
+
+ if (crtc_id >= adev->mode_info.num_crtc) {
+ DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
+ return -EINVAL;
+ }
+
+ /* IRQ could occur when in initial stage */
+ if (amdgpu_crtc == NULL)
+ return 0;
+
+ spin_lock_irqsave(&adev->ddev->event_lock, flags);
+ works = amdgpu_crtc->pflip_works;
+ if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
+ DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
+ "AMDGPU_FLIP_SUBMITTED(%d)\n",
+ amdgpu_crtc->pflip_status,
+ AMDGPU_FLIP_SUBMITTED);
+ spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
+ return 0;
+ }
+
+ /* page flip completed. clean up */
+ amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
+ amdgpu_crtc->pflip_works = NULL;
+
+ /* wakeup usersapce */
+ if (works->event)
+ drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
+
+ spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
+
+ drm_crtc_vblank_put(&amdgpu_crtc->base);
+ schedule_work(&works->unpin_work);
+
+ return 0;
+}
+
static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer)
{
- 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);
+ 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);
- hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
+ dce_virtual_pageflip(adev, crtc);
+ hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD),
+ HRTIMER_MODE_REL);
+
return HRTIMER_NORESTART;
}
@@ -710,54 +757,6 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
return 0;
}
-static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
- struct amdgpu_irq_src *source,
- struct amdgpu_iv_entry *entry)
-{
- unsigned long flags;
- unsigned crtc_id = 0;
- struct amdgpu_crtc *amdgpu_crtc;
- struct amdgpu_flip_work *works;
-
- crtc_id = 0;
- amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
-
- if (crtc_id >= adev->mode_info.num_crtc) {
- DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
- return -EINVAL;
- }
-
- /* IRQ could occur when in initial stage */
- if (amdgpu_crtc == NULL)
- return 0;
-
- spin_lock_irqsave(&adev->ddev->event_lock, flags);
- works = amdgpu_crtc->pflip_works;
- if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
- DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
- "AMDGPU_FLIP_SUBMITTED(%d)\n",
- amdgpu_crtc->pflip_status,
- AMDGPU_FLIP_SUBMITTED);
- spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
- return 0;
- }
-
- /* page flip completed. clean up */
- amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
- amdgpu_crtc->pflip_works = NULL;
-
- /* wakeup usersapce */
- if (works->event)
- drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
-
- spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
-
- drm_crtc_vblank_put(&amdgpu_crtc->base);
- schedule_work(&works->unpin_work);
-
- return 0;
-}
-
static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
.set = dce_virtual_set_crtc_irq_state,
.process = NULL,
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback Alex Deucher
2016-09-30 17:08 ` [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling Alex Deucher
@ 2016-09-30 17:08 ` Alex Deucher
[not found] ` <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." Alex Deucher
` (4 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
No need to emulate all of the stuff for real hw.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 93 ----------
drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 231 +++++++++++++++----------
2 files changed, 144 insertions(+), 180 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index decbba5..ff0b55a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -1504,88 +1504,6 @@ static const struct drm_connector_funcs amdgpu_connector_edp_funcs = {
.force = amdgpu_connector_dvi_force,
};
-static struct drm_encoder *
-amdgpu_connector_virtual_encoder(struct drm_connector *connector)
-{
- int enc_id = connector->encoder_ids[0];
- struct drm_encoder *encoder;
- int i;
- for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
- if (connector->encoder_ids[i] == 0)
- break;
-
- encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
- if (!encoder)
- continue;
-
- if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
- return encoder;
- }
-
- /* pick the first one */
- if (enc_id)
- return drm_encoder_find(connector->dev, enc_id);
- return NULL;
-}
-
-static int amdgpu_connector_virtual_get_modes(struct drm_connector *connector)
-{
- struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
-
- if (encoder) {
- amdgpu_connector_add_common_modes(encoder, connector);
- }
-
- return 0;
-}
-
-static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector,
- struct drm_display_mode *mode)
-{
- return MODE_OK;
-}
-
-static int
-amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode)
-{
- return 0;
-}
-
-static enum drm_connector_status
-
-amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force)
-{
- return connector_status_connected;
-}
-
-static int
-amdgpu_connector_virtual_set_property(struct drm_connector *connector,
- struct drm_property *property,
- uint64_t val)
-{
- return 0;
-}
-
-static void amdgpu_connector_virtual_force(struct drm_connector *connector)
-{
- return;
-}
-
-static const struct drm_connector_helper_funcs amdgpu_connector_virtual_helper_funcs = {
- .get_modes = amdgpu_connector_virtual_get_modes,
- .mode_valid = amdgpu_connector_virtual_mode_valid,
- .best_encoder = amdgpu_connector_virtual_encoder,
-};
-
-static const struct drm_connector_funcs amdgpu_connector_virtual_funcs = {
- .dpms = amdgpu_connector_virtual_dpms,
- .detect = amdgpu_connector_virtual_detect,
- .fill_modes = drm_helper_probe_single_connector_modes,
- .set_property = amdgpu_connector_virtual_set_property,
- .destroy = amdgpu_connector_destroy,
- .force = amdgpu_connector_virtual_force,
-};
-
void
amdgpu_connector_add(struct amdgpu_device *adev,
uint32_t connector_id,
@@ -1970,17 +1888,6 @@ amdgpu_connector_add(struct amdgpu_device *adev,
connector->interlace_allowed = false;
connector->doublescan_allowed = false;
break;
- case DRM_MODE_CONNECTOR_VIRTUAL:
- amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
- if (!amdgpu_dig_connector)
- goto failed;
- amdgpu_connector->con_priv = amdgpu_dig_connector;
- drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_virtual_funcs, connector_type);
- drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_virtual_helper_funcs);
- subpixel_order = SubPixelHorizontalRGB;
- connector->interlace_allowed = false;
- connector->doublescan_allowed = false;
- break;
}
}
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index 29e0ce0..0c8b21e 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -39,6 +39,8 @@
static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev);
+static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev,
+ int index);
/**
* dce_virtual_vblank_wait - vblank wait asic callback.
@@ -274,24 +276,6 @@ static bool dce_virtual_crtc_mode_fixup(struct drm_crtc *crtc,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{
- struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
- struct drm_device *dev = crtc->dev;
- struct drm_encoder *encoder;
-
- /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */
- list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
- if (encoder->crtc == crtc) {
- amdgpu_crtc->encoder = encoder;
- amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder);
- break;
- }
- }
- if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) {
- amdgpu_crtc->encoder = NULL;
- amdgpu_crtc->connector = NULL;
- return false;
- }
-
return true;
}
@@ -370,38 +354,120 @@ static int dce_virtual_early_init(void *handle)
return 0;
}
-static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
+static struct drm_encoder *
+dce_virtual_encoder(struct drm_connector *connector)
{
- struct amdgpu_i2c_bus_rec ddc_bus;
- struct amdgpu_router router;
- struct amdgpu_hpd hpd;
+ int enc_id = connector->encoder_ids[0];
+ struct drm_encoder *encoder;
+ int i;
+
+ for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
+ if (connector->encoder_ids[i] == 0)
+ break;
+
+ encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
+ if (!encoder)
+ continue;
- /* look up gpio for ddc, hpd */
- ddc_bus.valid = false;
- hpd.hpd = AMDGPU_HPD_NONE;
- /* needed for aux chan transactions */
- ddc_bus.hpd = hpd.hpd;
+ if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
+ return encoder;
+ }
- 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);
+ /* pick the first one */
+ if (enc_id)
+ return drm_encoder_find(connector->dev, enc_id);
+ return NULL;
+}
+
+static int dce_virtual_get_modes(struct drm_connector *connector)
+{
+ struct drm_device *dev = connector->dev;
+ struct drm_display_mode *mode = NULL;
+ unsigned i;
+ static const struct mode_size {
+ int w;
+ int h;
+ } common_modes[17] = {
+ { 640, 480},
+ { 720, 480},
+ { 800, 600},
+ { 848, 480},
+ {1024, 768},
+ {1152, 768},
+ {1280, 720},
+ {1280, 800},
+ {1280, 854},
+ {1280, 960},
+ {1280, 1024},
+ {1440, 900},
+ {1400, 1050},
+ {1680, 1050},
+ {1600, 1200},
+ {1920, 1080},
+ {1920, 1200}
+ };
+
+ for (i = 0; i < 17; i++) {
+ mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
+ drm_mode_probed_add(connector, mode);
+ }
- amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL,
- ATOM_DEVICE_CRT1_SUPPORT,
- 0);
+ return 0;
+}
- amdgpu_link_encoder_connector(adev->ddev);
+static int dce_virtual_mode_valid(struct drm_connector *connector,
+ struct drm_display_mode *mode)
+{
+ return MODE_OK;
+}
- return true;
+static int
+dce_virtual_dpms(struct drm_connector *connector, int mode)
+{
+ return 0;
}
+static enum drm_connector_status
+dce_virtual_detect(struct drm_connector *connector, bool force)
+{
+ return connector_status_connected;
+}
+
+static int
+dce_virtual_set_property(struct drm_connector *connector,
+ struct drm_property *property,
+ uint64_t val)
+{
+ return 0;
+}
+
+static void dce_virtual_destroy(struct drm_connector *connector)
+{
+ drm_connector_unregister(connector);
+ drm_connector_cleanup(connector);
+ kfree(connector);
+}
+
+static void dce_virtual_force(struct drm_connector *connector)
+{
+ return;
+}
+
+static const struct drm_connector_helper_funcs dce_virtual_connector_helper_funcs = {
+ .get_modes = dce_virtual_get_modes,
+ .mode_valid = dce_virtual_mode_valid,
+ .best_encoder = dce_virtual_encoder,
+};
+
+static const struct drm_connector_funcs dce_virtual_connector_funcs = {
+ .dpms = dce_virtual_dpms,
+ .detect = dce_virtual_detect,
+ .fill_modes = drm_helper_probe_single_connector_modes,
+ .set_property = dce_virtual_set_property,
+ .destroy = dce_virtual_destroy,
+ .force = dce_virtual_force,
+};
+
static int dce_virtual_sw_init(void *handle)
{
int r, i;
@@ -430,16 +496,16 @@ static int dce_virtual_sw_init(void *handle)
adev->ddev->mode_config.max_width = 16384;
adev->ddev->mode_config.max_height = 16384;
- /* allocate crtcs */
+ /* allocate crtcs, encoders, connectors */
for (i = 0; i < adev->mode_info.num_crtc; i++) {
r = dce_virtual_crtc_init(adev, i);
if (r)
return r;
+ r = dce_virtual_connector_encoder_init(adev, i);
+ if (r)
+ return r;
}
- dce_virtual_get_connector_info(adev);
- amdgpu_print_display_setup(adev->ddev);
-
drm_kms_helper_poll_init(adev->ddev);
adev->mode_info.mode_config_initialized = true;
@@ -540,8 +606,8 @@ static void dce_virtual_encoder_commit(struct drm_encoder *encoder)
static void
dce_virtual_encoder_mode_set(struct drm_encoder *encoder,
- struct drm_display_mode *mode,
- struct drm_display_mode *adjusted_mode)
+ struct drm_display_mode *mode,
+ struct drm_display_mode *adjusted_mode)
{
return;
}
@@ -561,10 +627,6 @@ static bool dce_virtual_encoder_mode_fixup(struct drm_encoder *encoder,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{
-
- /* set the active encoder to connector routing */
- amdgpu_encoder_set_active_device(encoder);
-
return true;
}
@@ -590,45 +652,40 @@ static const struct drm_encoder_funcs dce_virtual_encoder_funcs = {
.destroy = dce_virtual_encoder_destroy,
};
-static void dce_virtual_encoder_add(struct amdgpu_device *adev,
- uint32_t encoder_enum,
- uint32_t supported_device,
- u16 caps)
+static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev,
+ int index)
{
- struct drm_device *dev = adev->ddev;
struct drm_encoder *encoder;
- struct amdgpu_encoder *amdgpu_encoder;
-
- /* see if we already added it */
- list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
- amdgpu_encoder = to_amdgpu_encoder(encoder);
- if (amdgpu_encoder->encoder_enum == encoder_enum) {
- amdgpu_encoder->devices |= supported_device;
- return;
- }
+ struct drm_connector *connector;
+ /* add a new encoder */
+ encoder = kzalloc(sizeof(struct drm_encoder), GFP_KERNEL);
+ if (!encoder) {
+ kfree(connector);
+ return -ENOMEM;
}
+ encoder->possible_crtcs = 1 << index;
+ drm_encoder_init(adev->ddev, encoder, &dce_virtual_encoder_funcs,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs);
- /* add a new one */
- amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL);
- if (!amdgpu_encoder)
- return;
+ connector = kzalloc(sizeof(struct drm_connector), GFP_KERNEL);
+ if (!connector)
+ return -ENOMEM;
- encoder = &amdgpu_encoder->base;
- encoder->possible_crtcs = 0x1;
- amdgpu_encoder->enc_priv = NULL;
- amdgpu_encoder->encoder_enum = encoder_enum;
- amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
- amdgpu_encoder->devices = supported_device;
- amdgpu_encoder->rmx_type = RMX_OFF;
- amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
- amdgpu_encoder->is_ext_encoder = false;
- amdgpu_encoder->caps = caps;
-
- drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs,
- DRM_MODE_ENCODER_VIRTUAL, NULL);
- drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs);
- DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder->encoder_id);
+ /* add a new connector */
+ drm_connector_init(adev->ddev, connector, &dce_virtual_connector_funcs,
+ DRM_MODE_CONNECTOR_VIRTUAL);
+ drm_connector_helper_add(connector, &dce_virtual_connector_helper_funcs);
+ connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+ connector->interlace_allowed = false;
+ connector->doublescan_allowed = false;
+ drm_connector_register(connector);
+
+ /* link them */
+ drm_mode_connector_attach_encoder(connector, encoder);
+
+ return 0;
}
static const struct amdgpu_display_funcs dce_virtual_display_funcs = {
@@ -644,8 +701,8 @@ static const struct amdgpu_display_funcs dce_virtual_display_funcs = {
.hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg,
.page_flip = &dce_virtual_page_flip,
.page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos,
- .add_encoder = &dce_virtual_encoder_add,
- .add_connector = &amdgpu_connector_add,
+ .add_encoder = NULL,
+ .add_connector = NULL,
.stop_mc_access = &dce_virtual_stop_mc_access,
.resume_mc_access = &dce_virtual_resume_mc_access,
};
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros."
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
` (2 preceding siblings ...)
2016-09-30 17:08 ` [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup Alex Deucher
@ 2016-09-30 17:08 ` Alex Deucher
[not found] ` <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display Alex Deucher
` (3 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
This reverts commit 16925c92dbd97524655525b6816625e1f0063d12.
This is no longer necessary.
---
drivers/gpu/drm/amd/amdgpu/ObjectID.h | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index b8d6667..0619269 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -90,7 +90,6 @@
#define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24
#define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25
#define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27
-#define ENCODER_OBJECT_ID_VIRTUAL 0x28
#define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF
@@ -120,7 +119,6 @@
#define CONNECTOR_OBJECT_ID_eDP 0x14
#define CONNECTOR_OBJECT_ID_MXM 0x15
#define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16
-#define CONNECTOR_OBJECT_ID_VIRTUAL 0x17
/* deleted */
@@ -149,7 +147,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,10 +408,6 @@
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 |\
- ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
-
/****************************************************/
/* Connector Object ID definition - Shared with BIOS */
/****************************************************/
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
` (3 preceding siblings ...)
2016-09-30 17:08 ` [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." Alex Deucher
@ 2016-09-30 17:08 ` Alex Deucher
[not found] ` <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) Alex Deucher
` (2 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
to match the other functions in that file.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 99a15ca..13caa52 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1231,7 +1231,7 @@ int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev,
return 1;
}
-static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
+static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev)
{
adev->enable_virtual_display = false;
@@ -1261,7 +1261,7 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
{
int i, r;
- amdgpu_whether_enable_virtual_display(adev);
+ amdgpu_device_enable_virtual_display(adev);
switch (adev->asic_type) {
case CHIP_TOPAZ:
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3)
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
` (4 preceding siblings ...)
2016-09-30 17:08 ` [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display Alex Deucher
@ 2016-09-30 17:08 ` Alex Deucher
[not found] ` <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:52 ` [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Christian König
2016-10-08 8:24 ` Deng, Emily
7 siblings, 1 reply; 16+ messages in thread
From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher, Emily Deng
From: Emily Deng <Emily.Deng@amd.com>
Enable multi crtcs for virtual display, user can set the number of crtcs
by amdgpu module parameter virtual_display.
v2: make timers per crtc
v3: agd: simplify implementation
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 28 +++++++++++++----
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 5 ++--
drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 48 +++++++++++++++---------------
4 files changed, 52 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 13caa52..91dc851 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1238,20 +1238,38 @@ static void amdgpu_device_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 728e8ca..721ef24 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -201,7 +201,8 @@ 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/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 7b0eff7..1e23334 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -341,8 +341,6 @@ struct amdgpu_mode_info {
int num_dig; /* number of dig blocks */
int disp_priority;
const struct amdgpu_display_funcs *funcs;
- struct hrtimer vblank_timer;
- enum amdgpu_interrupt_state vsync_timer_enabled;
};
#define AMDGPU_MAX_BL_LEVEL 0xFF
@@ -413,6 +411,9 @@ struct amdgpu_crtc {
u32 wm_high;
u32 lb_vblank_lead_lines;
struct drm_display_mode hw_mode;
+ /* for virtual dce */
+ struct hrtimer vblank_timer;
+ enum amdgpu_interrupt_state vsync_timer_enabled;
};
struct amdgpu_encoder_atom_dig {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index 0c8b21e..682e066 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -335,6 +335,7 @@ static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index)
amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
amdgpu_crtc->encoder = NULL;
amdgpu_crtc->connector = NULL;
+ amdgpu_crtc->vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE;
drm_crtc_helper_add(&amdgpu_crtc->base, &dce_virtual_crtc_helper_funcs);
return 0;
@@ -344,11 +345,9 @@ static int dce_virtual_early_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
- adev->mode_info.vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE;
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;
@@ -760,14 +759,13 @@ static int dce_virtual_pageflip(struct amdgpu_device *adev,
static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer)
{
- 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;
+ struct amdgpu_crtc *amdgpu_crtc = container_of(vblank_timer,
+ struct amdgpu_crtc, vblank_timer);
+ struct drm_device *ddev = amdgpu_crtc->base.dev;
+ struct amdgpu_device *adev = ddev->dev_private;
- drm_handle_vblank(adev->ddev, crtc);
- dce_virtual_pageflip(adev, crtc);
+ drm_handle_vblank(ddev, amdgpu_crtc->crtc_id);
+ dce_virtual_pageflip(adev, amdgpu_crtc->crtc_id);
hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD),
HRTIMER_MODE_REL);
@@ -783,18 +781,22 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad
return;
}
- if (state && !adev->mode_info.vsync_timer_enabled) {
+ if (state && !adev->mode_info.crtcs[crtc]->vsync_timer_enabled) {
DRM_DEBUG("Enable software vsync timer\n");
- hrtimer_init(&adev->mode_info.vblank_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
- hrtimer_set_expires(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD));
- adev->mode_info.vblank_timer.function = dce_virtual_vblank_timer_handle;
- hrtimer_start(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
- } else if (!state && adev->mode_info.vsync_timer_enabled) {
+ hrtimer_init(&adev->mode_info.crtcs[crtc]->vblank_timer,
+ CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+ hrtimer_set_expires(&adev->mode_info.crtcs[crtc]->vblank_timer,
+ ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD));
+ adev->mode_info.crtcs[crtc]->vblank_timer.function =
+ dce_virtual_vblank_timer_handle;
+ hrtimer_start(&adev->mode_info.crtcs[crtc]->vblank_timer,
+ ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
+ } else if (!state && adev->mode_info.crtcs[crtc]->vsync_timer_enabled) {
DRM_DEBUG("Disable software vsync timer\n");
- hrtimer_cancel(&adev->mode_info.vblank_timer);
+ hrtimer_cancel(&adev->mode_info.crtcs[crtc]->vblank_timer);
}
- adev->mode_info.vsync_timer_enabled = state;
+ adev->mode_info.crtcs[crtc]->vsync_timer_enabled = state;
DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc, state);
}
@@ -804,13 +806,11 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
unsigned type,
enum amdgpu_interrupt_state state)
{
- switch (type) {
- case AMDGPU_CRTC_IRQ_VBLANK1:
- dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
- break;
- default:
- break;
- }
+ if (type > AMDGPU_CRTC_IRQ_VBLANK6)
+ return -EINVAL;
+
+ dce_virtual_set_crtc_vblank_interrupt_state(adev, type, state);
+
return 0;
}
--
2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
` (5 preceding siblings ...)
2016-09-30 17:08 ` [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) Alex Deucher
@ 2016-09-30 17:52 ` Christian König
2016-10-08 8:24 ` Deng, Emily
7 siblings, 0 replies; 16+ messages in thread
From: Christian König @ 2016-09-30 17:52 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher
Am 30.09.2016 um 19:08 schrieb Alex Deucher:
> Never used.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>.
> ---
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 35 ++++++--------------------------
> 1 file changed, 6 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index 359fe56..cf43caa 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -209,10 +209,9 @@ static void dce_virtual_crtc_dpms(struct drm_crtc *crtc, int mode)
> switch (mode) {
> case DRM_MODE_DPMS_ON:
> amdgpu_crtc->enabled = true;
> - /* Make sure VBLANK and PFLIP interrupts are still enabled */
> + /* Make sure VBLANK interrupts are still enabled */
> type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id);
> amdgpu_irq_update(adev, &adev->crtc_irq, type);
> - amdgpu_irq_update(adev, &adev->pageflip_irq, type);
> drm_vblank_on(dev, amdgpu_crtc->crtc_id);
> break;
> case DRM_MODE_DPMS_STANDBY:
> @@ -672,8 +671,8 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla
> }
>
> static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev,
> - int crtc,
> - enum amdgpu_interrupt_state state)
> + int crtc,
> + enum amdgpu_interrupt_state state)
> {
> if (crtc >= adev->mode_info.num_crtc) {
> DRM_DEBUG("invalid crtc %d\n", crtc);
> @@ -697,9 +696,9 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad
>
>
> static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - unsigned type,
> - enum amdgpu_interrupt_state state)
> + struct amdgpu_irq_src *source,
> + unsigned type,
> + enum amdgpu_interrupt_state state)
> {
> switch (type) {
> case AMDGPU_CRTC_IRQ_VBLANK1:
> @@ -726,20 +725,6 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
> return 0;
> }
>
> -static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *src,
> - unsigned type,
> - enum amdgpu_interrupt_state state)
> -{
> - if (type >= adev->mode_info.num_crtc) {
> - DRM_ERROR("invalid pageflip crtc %d\n", type);
> - return -EINVAL;
> - }
> - DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state);
> -
> - return 0;
> -}
> -
> static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> struct amdgpu_irq_src *source,
> struct amdgpu_iv_entry *entry)
> @@ -793,17 +778,9 @@ static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
> .process = dce_virtual_crtc_irq,
> };
>
> -static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = {
> - .set = dce_virtual_set_pageflip_irq_state,
> - .process = dce_virtual_pageflip_irq,
> -};
> -
> static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev)
> {
> adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST;
> adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs;
> -
> - adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST;
> - adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs;
> }
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback
[not found] ` <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-10-08 8:22 ` Deng, Emily
0 siblings, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process
> callback
>
> Virtual crtcs interrupts do not show up in the IV ring, so it will never be called.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 17 +----------------
> 1 file changed, 1 insertion(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index cf43caa..8163622 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -710,21 +710,6 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
> return 0;
> }
>
> -static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - struct amdgpu_iv_entry *entry)
> -{
> - unsigned crtc = 0;
> - unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
> -
> - if (amdgpu_irq_enabled(adev, source, irq_type)) {
> - drm_handle_vblank(adev->ddev, crtc);
> - }
> - dce_virtual_pageflip_irq(adev, NULL, NULL);
> - DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
> - return 0;
> -}
> -
> static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> struct amdgpu_irq_src *source,
> struct amdgpu_iv_entry *entry)
> @@ -775,7 +760,7 @@ static int dce_virtual_pageflip_irq(struct
> amdgpu_device *adev,
>
> static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
> .set = dce_virtual_set_crtc_irq_state,
> - .process = dce_virtual_crtc_irq,
> + .process = NULL,
> };
>
> static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev)
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
* RE: [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3)
[not found] ` <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-10-08 8:22 ` Deng, Emily
0 siblings, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: Alex Deucher [mailto:alexdeucher@gmail.com]
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deng, Emily <Emily.Deng@amd.com>; Deucher, Alexander
> <Alexander.Deucher@amd.com>
> Subject: [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi
> crtcs. (v3)
>
> From: Emily Deng <Emily.Deng@amd.com>
>
> Enable multi crtcs for virtual display, user can set the number of crtcs by
> amdgpu module parameter virtual_display.
>
> v2: make timers per crtc
> v3: agd: simplify implementation
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 28 +++++++++++++----
> drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 5 ++--
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 48 +++++++++++++++--------
> -------
> 4 files changed, 52 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 13caa52..91dc851 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1238,20 +1238,38 @@ static void
> amdgpu_device_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 728e8ca..721ef24 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -201,7 +201,8 @@ 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/amdgpu_mode.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> index 7b0eff7..1e23334 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> @@ -341,8 +341,6 @@ struct amdgpu_mode_info {
> int num_dig; /* number of dig blocks */
> int disp_priority;
> const struct amdgpu_display_funcs *funcs;
> - struct hrtimer vblank_timer;
> - enum amdgpu_interrupt_state vsync_timer_enabled;
> };
>
> #define AMDGPU_MAX_BL_LEVEL 0xFF
> @@ -413,6 +411,9 @@ struct amdgpu_crtc {
> u32 wm_high;
> u32 lb_vblank_lead_lines;
> struct drm_display_mode hw_mode;
> + /* for virtual dce */
> + struct hrtimer vblank_timer;
> + enum amdgpu_interrupt_state vsync_timer_enabled;
> };
>
> struct amdgpu_encoder_atom_dig {
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index 0c8b21e..682e066 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -335,6 +335,7 @@ static int dce_virtual_crtc_init(struct amdgpu_device
> *adev, int index)
> amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
> amdgpu_crtc->encoder = NULL;
> amdgpu_crtc->connector = NULL;
> + amdgpu_crtc->vsync_timer_enabled =
> AMDGPU_IRQ_STATE_DISABLE;
> drm_crtc_helper_add(&amdgpu_crtc->base,
> &dce_virtual_crtc_helper_funcs);
>
> return 0;
> @@ -344,11 +345,9 @@ static int dce_virtual_early_init(void *handle) {
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> - adev->mode_info.vsync_timer_enabled =
> AMDGPU_IRQ_STATE_DISABLE;
> 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;
> @@ -760,14 +759,13 @@ static int dce_virtual_pageflip(struct
> amdgpu_device *adev,
>
> static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer
> *vblank_timer) {
> - 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;
> + struct amdgpu_crtc *amdgpu_crtc = container_of(vblank_timer,
> + struct amdgpu_crtc,
> vblank_timer);
> + struct drm_device *ddev = amdgpu_crtc->base.dev;
> + struct amdgpu_device *adev = ddev->dev_private;
>
> - drm_handle_vblank(adev->ddev, crtc);
> - dce_virtual_pageflip(adev, crtc);
> + drm_handle_vblank(ddev, amdgpu_crtc->crtc_id);
> + dce_virtual_pageflip(adev, amdgpu_crtc->crtc_id);
> hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD),
> HRTIMER_MODE_REL);
>
> @@ -783,18 +781,22 @@ static void
> dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad
> return;
> }
>
> - if (state && !adev->mode_info.vsync_timer_enabled) {
> + if (state && !adev->mode_info.crtcs[crtc]->vsync_timer_enabled) {
> DRM_DEBUG("Enable software vsync timer\n");
> - hrtimer_init(&adev->mode_info.vblank_timer,
> CLOCK_MONOTONIC, HRTIMER_MODE_REL);
> - hrtimer_set_expires(&adev->mode_info.vblank_timer,
> ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD));
> - adev->mode_info.vblank_timer.function =
> dce_virtual_vblank_timer_handle;
> - hrtimer_start(&adev->mode_info.vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
> - } else if (!state && adev->mode_info.vsync_timer_enabled) {
> + hrtimer_init(&adev->mode_info.crtcs[crtc]->vblank_timer,
> + CLOCK_MONOTONIC, HRTIMER_MODE_REL);
> + hrtimer_set_expires(&adev->mode_info.crtcs[crtc]-
> >vblank_timer,
> + ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD));
> + adev->mode_info.crtcs[crtc]->vblank_timer.function =
> + dce_virtual_vblank_timer_handle;
> + hrtimer_start(&adev->mode_info.crtcs[crtc]->vblank_timer,
> + ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD),
> HRTIMER_MODE_REL);
> + } else if (!state && adev->mode_info.crtcs[crtc]-
> >vsync_timer_enabled)
> +{
> DRM_DEBUG("Disable software vsync timer\n");
> - hrtimer_cancel(&adev->mode_info.vblank_timer);
> + hrtimer_cancel(&adev->mode_info.crtcs[crtc]-
> >vblank_timer);
> }
>
> - adev->mode_info.vsync_timer_enabled = state;
> + adev->mode_info.crtcs[crtc]->vsync_timer_enabled = state;
> DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc,
> state); }
>
> @@ -804,13 +806,11 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
> unsigned type,
> enum amdgpu_interrupt_state state)
> {
> - switch (type) {
> - case AMDGPU_CRTC_IRQ_VBLANK1:
> - dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
> - break;
> - default:
> - break;
> - }
> + if (type > AMDGPU_CRTC_IRQ_VBLANK6)
> + return -EINVAL;
> +
> + dce_virtual_set_crtc_vblank_interrupt_state(adev, type, state);
> +
> return 0;
> }
>
> --
> 2.5.5
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros."
[not found] ` <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-10-08 8:22 ` Deng, Emily
0 siblings, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and
> encoder macros."
>
> This reverts commit 16925c92dbd97524655525b6816625e1f0063d12.
>
> This is no longer necessary.
> ---
> drivers/gpu/drm/amd/amdgpu/ObjectID.h | 7 -------
> 1 file changed, 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> index b8d6667..0619269 100644
> --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
> @@ -90,7 +90,6 @@
> #define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24
> #define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25
> #define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27
> -#define ENCODER_OBJECT_ID_VIRTUAL 0x28
>
> #define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF
>
> @@ -120,7 +119,6 @@
> #define CONNECTOR_OBJECT_ID_eDP 0x14
> #define CONNECTOR_OBJECT_ID_MXM 0x15
> #define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16
> -#define CONNECTOR_OBJECT_ID_VIRTUAL 0x17
>
> /* deleted */
>
> @@ -149,7 +147,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,10 +408,6 @@
> 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 |\
> - ENCODER_OBJECT_ID_VIRTUAL <<
> OBJECT_ID_SHIFT)
> -
> /****************************************************/
> /* Connector Object ID definition - Shared with BIOS */
> /****************************************************/
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
* RE: [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup
[not found] ` <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-10-08 8:22 ` Deng, Emily
0 siblings, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup
>
> No need to emulate all of the stuff for real hw.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 93 ----------
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 231 +++++++++++++++----
> ------
> 2 files changed, 144 insertions(+), 180 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> index decbba5..ff0b55a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> @@ -1504,88 +1504,6 @@ static const struct drm_connector_funcs
> amdgpu_connector_edp_funcs = {
> .force = amdgpu_connector_dvi_force,
> };
>
> -static struct drm_encoder *
> -amdgpu_connector_virtual_encoder(struct drm_connector *connector) -{
> - int enc_id = connector->encoder_ids[0];
> - struct drm_encoder *encoder;
> - int i;
> - for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
> - if (connector->encoder_ids[i] == 0)
> - break;
> -
> - encoder = drm_encoder_find(connector->dev, connector-
> >encoder_ids[i]);
> - if (!encoder)
> - continue;
> -
> - if (encoder->encoder_type ==
> DRM_MODE_ENCODER_VIRTUAL)
> - return encoder;
> - }
> -
> - /* pick the first one */
> - if (enc_id)
> - return drm_encoder_find(connector->dev, enc_id);
> - return NULL;
> -}
> -
> -static int amdgpu_connector_virtual_get_modes(struct drm_connector
> *connector) -{
> - struct drm_encoder *encoder =
> amdgpu_connector_best_single_encoder(connector);
> -
> - if (encoder) {
> - amdgpu_connector_add_common_modes(encoder,
> connector);
> - }
> -
> - return 0;
> -}
> -
> -static int amdgpu_connector_virtual_mode_valid(struct drm_connector
> *connector,
> - struct drm_display_mode *mode)
> -{
> - return MODE_OK;
> -}
> -
> -static int
> -amdgpu_connector_virtual_dpms(struct drm_connector *connector, int
> mode) -{
> - return 0;
> -}
> -
> -static enum drm_connector_status
> -
> -amdgpu_connector_virtual_detect(struct drm_connector *connector, bool
> force) -{
> - return connector_status_connected;
> -}
> -
> -static int
> -amdgpu_connector_virtual_set_property(struct drm_connector *connector,
> - struct drm_property *property,
> - uint64_t val)
> -{
> - return 0;
> -}
> -
> -static void amdgpu_connector_virtual_force(struct drm_connector
> *connector) -{
> - return;
> -}
> -
> -static const struct drm_connector_helper_funcs
> amdgpu_connector_virtual_helper_funcs = {
> - .get_modes = amdgpu_connector_virtual_get_modes,
> - .mode_valid = amdgpu_connector_virtual_mode_valid,
> - .best_encoder = amdgpu_connector_virtual_encoder,
> -};
> -
> -static const struct drm_connector_funcs amdgpu_connector_virtual_funcs
> = {
> - .dpms = amdgpu_connector_virtual_dpms,
> - .detect = amdgpu_connector_virtual_detect,
> - .fill_modes = drm_helper_probe_single_connector_modes,
> - .set_property = amdgpu_connector_virtual_set_property,
> - .destroy = amdgpu_connector_destroy,
> - .force = amdgpu_connector_virtual_force,
> -};
> -
> void
> amdgpu_connector_add(struct amdgpu_device *adev,
> uint32_t connector_id,
> @@ -1970,17 +1888,6 @@ amdgpu_connector_add(struct amdgpu_device
> *adev,
> connector->interlace_allowed = false;
> connector->doublescan_allowed = false;
> break;
> - case DRM_MODE_CONNECTOR_VIRTUAL:
> - amdgpu_dig_connector = kzalloc(sizeof(struct
> amdgpu_connector_atom_dig), GFP_KERNEL);
> - if (!amdgpu_dig_connector)
> - goto failed;
> - amdgpu_connector->con_priv =
> amdgpu_dig_connector;
> - drm_connector_init(dev, &amdgpu_connector->base,
> &amdgpu_connector_virtual_funcs, connector_type);
> - drm_connector_helper_add(&amdgpu_connector-
> >base, &amdgpu_connector_virtual_helper_funcs);
> - subpixel_order = SubPixelHorizontalRGB;
> - connector->interlace_allowed = false;
> - connector->doublescan_allowed = false;
> - break;
> }
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index 29e0ce0..0c8b21e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -39,6 +39,8 @@
>
> static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
> static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev);
> +static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev,
> + int index);
>
> /**
> * dce_virtual_vblank_wait - vblank wait asic callback.
> @@ -274,24 +276,6 @@ static bool dce_virtual_crtc_mode_fixup(struct
> drm_crtc *crtc,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> {
> - struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
> - struct drm_device *dev = crtc->dev;
> - struct drm_encoder *encoder;
> -
> - /* assign the encoder to the amdgpu crtc to avoid repeated lookups
> later */
> - list_for_each_entry(encoder, &dev->mode_config.encoder_list,
> head) {
> - if (encoder->crtc == crtc) {
> - amdgpu_crtc->encoder = encoder;
> - amdgpu_crtc->connector =
> amdgpu_get_connector_for_encoder(encoder);
> - break;
> - }
> - }
> - if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector ==
> NULL)) {
> - amdgpu_crtc->encoder = NULL;
> - amdgpu_crtc->connector = NULL;
> - return false;
> - }
> -
> return true;
> }
>
> @@ -370,38 +354,120 @@ static int dce_virtual_early_init(void *handle)
> return 0;
> }
>
> -static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
> +static struct drm_encoder *
> +dce_virtual_encoder(struct drm_connector *connector)
> {
> - struct amdgpu_i2c_bus_rec ddc_bus;
> - struct amdgpu_router router;
> - struct amdgpu_hpd hpd;
> + int enc_id = connector->encoder_ids[0];
> + struct drm_encoder *encoder;
> + int i;
> +
> + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
> + if (connector->encoder_ids[i] == 0)
> + break;
> +
> + encoder = drm_encoder_find(connector->dev, connector-
> >encoder_ids[i]);
> + if (!encoder)
> + continue;
>
> - /* look up gpio for ddc, hpd */
> - ddc_bus.valid = false;
> - hpd.hpd = AMDGPU_HPD_NONE;
> - /* needed for aux chan transactions */
> - ddc_bus.hpd = hpd.hpd;
> + if (encoder->encoder_type ==
> DRM_MODE_ENCODER_VIRTUAL)
> + return encoder;
> + }
>
> - 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);
> + /* pick the first one */
> + if (enc_id)
> + return drm_encoder_find(connector->dev, enc_id);
> + return NULL;
> +}
> +
> +static int dce_virtual_get_modes(struct drm_connector *connector) {
> + struct drm_device *dev = connector->dev;
> + struct drm_display_mode *mode = NULL;
> + unsigned i;
> + static const struct mode_size {
> + int w;
> + int h;
> + } common_modes[17] = {
> + { 640, 480},
> + { 720, 480},
> + { 800, 600},
> + { 848, 480},
> + {1024, 768},
> + {1152, 768},
> + {1280, 720},
> + {1280, 800},
> + {1280, 854},
> + {1280, 960},
> + {1280, 1024},
> + {1440, 900},
> + {1400, 1050},
> + {1680, 1050},
> + {1600, 1200},
> + {1920, 1080},
> + {1920, 1200}
> + };
> +
> + for (i = 0; i < 17; i++) {
> + mode = drm_cvt_mode(dev, common_modes[i].w,
> common_modes[i].h, 60, false, false, false);
> + drm_mode_probed_add(connector, mode);
> + }
>
> - amdgpu_display_add_encoder(adev,
> ENCODER_VIRTUAL_ENUM_VIRTUAL,
> -
> ATOM_DEVICE_CRT1_SUPPORT,
> - 0);
> + return 0;
> +}
>
> - amdgpu_link_encoder_connector(adev->ddev);
> +static int dce_virtual_mode_valid(struct drm_connector *connector,
> + struct drm_display_mode *mode)
> +{
> + return MODE_OK;
> +}
>
> - return true;
> +static int
> +dce_virtual_dpms(struct drm_connector *connector, int mode) {
> + return 0;
> }
>
> +static enum drm_connector_status
> +dce_virtual_detect(struct drm_connector *connector, bool force) {
> + return connector_status_connected;
> +}
> +
> +static int
> +dce_virtual_set_property(struct drm_connector *connector,
> + struct drm_property *property,
> + uint64_t val)
> +{
> + return 0;
> +}
> +
> +static void dce_virtual_destroy(struct drm_connector *connector) {
> + drm_connector_unregister(connector);
> + drm_connector_cleanup(connector);
> + kfree(connector);
> +}
> +
> +static void dce_virtual_force(struct drm_connector *connector) {
> + return;
> +}
> +
> +static const struct drm_connector_helper_funcs
> dce_virtual_connector_helper_funcs = {
> + .get_modes = dce_virtual_get_modes,
> + .mode_valid = dce_virtual_mode_valid,
> + .best_encoder = dce_virtual_encoder,
> +};
> +
> +static const struct drm_connector_funcs dce_virtual_connector_funcs = {
> + .dpms = dce_virtual_dpms,
> + .detect = dce_virtual_detect,
> + .fill_modes = drm_helper_probe_single_connector_modes,
> + .set_property = dce_virtual_set_property,
> + .destroy = dce_virtual_destroy,
> + .force = dce_virtual_force,
> +};
> +
> static int dce_virtual_sw_init(void *handle) {
> int r, i;
> @@ -430,16 +496,16 @@ static int dce_virtual_sw_init(void *handle)
> adev->ddev->mode_config.max_width = 16384;
> adev->ddev->mode_config.max_height = 16384;
>
> - /* allocate crtcs */
> + /* allocate crtcs, encoders, connectors */
> for (i = 0; i < adev->mode_info.num_crtc; i++) {
> r = dce_virtual_crtc_init(adev, i);
> if (r)
> return r;
> + r = dce_virtual_connector_encoder_init(adev, i);
> + if (r)
> + return r;
> }
>
> - dce_virtual_get_connector_info(adev);
> - amdgpu_print_display_setup(adev->ddev);
> -
> drm_kms_helper_poll_init(adev->ddev);
>
> adev->mode_info.mode_config_initialized = true; @@ -540,8 +606,8
> @@ static void dce_virtual_encoder_commit(struct drm_encoder *encoder)
>
> static void
> dce_virtual_encoder_mode_set(struct drm_encoder *encoder,
> - struct drm_display_mode *mode,
> - struct drm_display_mode *adjusted_mode)
> + struct drm_display_mode *mode,
> + struct drm_display_mode *adjusted_mode)
> {
> return;
> }
> @@ -561,10 +627,6 @@ static bool dce_virtual_encoder_mode_fixup(struct
> drm_encoder *encoder,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> {
> -
> - /* set the active encoder to connector routing */
> - amdgpu_encoder_set_active_device(encoder);
> -
> return true;
> }
>
> @@ -590,45 +652,40 @@ static const struct drm_encoder_funcs
> dce_virtual_encoder_funcs = {
> .destroy = dce_virtual_encoder_destroy, };
>
> -static void dce_virtual_encoder_add(struct amdgpu_device *adev,
> - uint32_t encoder_enum,
> - uint32_t supported_device,
> - u16 caps)
> +static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev,
> + int index)
> {
> - struct drm_device *dev = adev->ddev;
> struct drm_encoder *encoder;
> - struct amdgpu_encoder *amdgpu_encoder;
> -
> - /* see if we already added it */
> - list_for_each_entry(encoder, &dev->mode_config.encoder_list,
> head) {
> - amdgpu_encoder = to_amdgpu_encoder(encoder);
> - if (amdgpu_encoder->encoder_enum == encoder_enum) {
> - amdgpu_encoder->devices |= supported_device;
> - return;
> - }
> + struct drm_connector *connector;
>
> + /* add a new encoder */
> + encoder = kzalloc(sizeof(struct drm_encoder), GFP_KERNEL);
> + if (!encoder) {
> + kfree(connector);
> + return -ENOMEM;
> }
> + encoder->possible_crtcs = 1 << index;
> + drm_encoder_init(adev->ddev, encoder,
> &dce_virtual_encoder_funcs,
> + DRM_MODE_ENCODER_VIRTUAL, NULL);
> + drm_encoder_helper_add(encoder,
> &dce_virtual_encoder_helper_funcs);
>
> - /* add a new one */
> - amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder),
> GFP_KERNEL);
> - if (!amdgpu_encoder)
> - return;
> + connector = kzalloc(sizeof(struct drm_connector), GFP_KERNEL);
> + if (!connector)
> + return -ENOMEM;
>
> - encoder = &amdgpu_encoder->base;
> - encoder->possible_crtcs = 0x1;
> - amdgpu_encoder->enc_priv = NULL;
> - amdgpu_encoder->encoder_enum = encoder_enum;
> - amdgpu_encoder->encoder_id = (encoder_enum &
> OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
> - amdgpu_encoder->devices = supported_device;
> - amdgpu_encoder->rmx_type = RMX_OFF;
> - amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
> - amdgpu_encoder->is_ext_encoder = false;
> - amdgpu_encoder->caps = caps;
> -
> - drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs,
> - DRM_MODE_ENCODER_VIRTUAL,
> NULL);
> - drm_encoder_helper_add(encoder,
> &dce_virtual_encoder_helper_funcs);
> - DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder-
> >encoder_id);
> + /* add a new connector */
> + drm_connector_init(adev->ddev, connector,
> &dce_virtual_connector_funcs,
> + DRM_MODE_CONNECTOR_VIRTUAL);
> + drm_connector_helper_add(connector,
> &dce_virtual_connector_helper_funcs);
> + connector->display_info.subpixel_order = SubPixelHorizontalRGB;
> + connector->interlace_allowed = false;
> + connector->doublescan_allowed = false;
> + drm_connector_register(connector);
> +
> + /* link them */
> + drm_mode_connector_attach_encoder(connector, encoder);
> +
> + return 0;
> }
>
> static const struct amdgpu_display_funcs dce_virtual_display_funcs = { @@
> -644,8 +701,8 @@ static const struct amdgpu_display_funcs
> dce_virtual_display_funcs = {
> .hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg,
> .page_flip = &dce_virtual_page_flip,
> .page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos,
> - .add_encoder = &dce_virtual_encoder_add,
> - .add_connector = &amdgpu_connector_add,
> + .add_encoder = NULL,
> + .add_connector = NULL,
> .stop_mc_access = &dce_virtual_stop_mc_access,
> .resume_mc_access = &dce_virtual_resume_mc_access, };
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
* RE: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling
[not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-10-08 8:23 ` Deng, Emily
2016-10-08 8:23 ` Deng, Emily
1 sibling, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:23 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling
>
> We handle the virtual interrupts from a timer so no need to try an look like
> we are handling IV ring events.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 109 +++++++++++++++--------
> --------
> 1 file changed, 54 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index 8163622..29e0ce0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -39,9 +39,6 @@
>
> static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
> static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); -static
> int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - struct amdgpu_iv_entry *entry);
>
> /**
> * dce_virtual_vblank_wait - vblank wait asic callback.
> @@ -659,14 +656,64 @@ static void dce_virtual_set_display_funcs(struct
> amdgpu_device *adev)
> adev->mode_info.funcs = &dce_virtual_display_funcs; }
>
> +static int dce_virtual_pageflip(struct amdgpu_device *adev,
> + unsigned crtc_id)
> +{
> + unsigned long flags;
> + struct amdgpu_crtc *amdgpu_crtc;
> + struct amdgpu_flip_work *works;
> +
> + amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> +
> + if (crtc_id >= adev->mode_info.num_crtc) {
> + DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
> + return -EINVAL;
> + }
> +
> + /* IRQ could occur when in initial stage */
> + if (amdgpu_crtc == NULL)
> + return 0;
> +
> + spin_lock_irqsave(&adev->ddev->event_lock, flags);
> + works = amdgpu_crtc->pflip_works;
> + if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
> + DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
> + "AMDGPU_FLIP_SUBMITTED(%d)\n",
> + amdgpu_crtc->pflip_status,
> + AMDGPU_FLIP_SUBMITTED);
> + spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> + return 0;
> + }
> +
> + /* page flip completed. clean up */
> + amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
> + amdgpu_crtc->pflip_works = NULL;
> +
> + /* wakeup usersapce */
> + if (works->event)
> + drm_crtc_send_vblank_event(&amdgpu_crtc->base, works-
> >event);
> +
> + spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> +
> + drm_crtc_vblank_put(&amdgpu_crtc->base);
> + schedule_work(&works->unpin_work);
> +
> + return 0;
> +}
> +
> static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer
> *vblank_timer) {
> - 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);
> + 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);
> - hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
> + dce_virtual_pageflip(adev, crtc);
> + hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD),
> + HRTIMER_MODE_REL);
> +
> return HRTIMER_NORESTART;
> }
>
> @@ -710,54 +757,6 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
> return 0;
> }
>
> -static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - struct amdgpu_iv_entry *entry)
> -{
> - unsigned long flags;
> - unsigned crtc_id = 0;
> - struct amdgpu_crtc *amdgpu_crtc;
> - struct amdgpu_flip_work *works;
> -
> - crtc_id = 0;
> - amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> -
> - if (crtc_id >= adev->mode_info.num_crtc) {
> - DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
> - return -EINVAL;
> - }
> -
> - /* IRQ could occur when in initial stage */
> - if (amdgpu_crtc == NULL)
> - return 0;
> -
> - spin_lock_irqsave(&adev->ddev->event_lock, flags);
> - works = amdgpu_crtc->pflip_works;
> - if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
> - DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
> - "AMDGPU_FLIP_SUBMITTED(%d)\n",
> - amdgpu_crtc->pflip_status,
> - AMDGPU_FLIP_SUBMITTED);
> - spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> - return 0;
> - }
> -
> - /* page flip completed. clean up */
> - amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
> - amdgpu_crtc->pflip_works = NULL;
> -
> - /* wakeup usersapce */
> - if (works->event)
> - drm_crtc_send_vblank_event(&amdgpu_crtc->base, works-
> >event);
> -
> - spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> -
> - drm_crtc_vblank_put(&amdgpu_crtc->base);
> - schedule_work(&works->unpin_work);
> -
> - return 0;
> -}
> -
> static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
> .set = dce_virtual_set_crtc_irq_state,
> .process = NULL,
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
* RE: [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display
[not found] ` <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
@ 2016-10-08 8:23 ` Deng, Emily
0 siblings, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:23 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 6/7] drm/amdgpu: rename
> amdgpu_whether_enable_virtual_display
>
> to match the other functions in that file.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 99a15ca..13caa52 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1231,7 +1231,7 @@ int amdgpu_ip_block_version_cmp(struct
> amdgpu_device *adev,
> return 1;
> }
>
> -static void amdgpu_whether_enable_virtual_display(struct amdgpu_device
> *adev)
> +static void amdgpu_device_enable_virtual_display(struct amdgpu_device
> +*adev)
> {
> adev->enable_virtual_display = false;
>
> @@ -1261,7 +1261,7 @@ static int amdgpu_early_init(struct
> amdgpu_device *adev) {
> int i, r;
>
> - amdgpu_whether_enable_virtual_display(adev);
> + amdgpu_device_enable_virtual_display(adev);
>
> switch (adev->asic_type) {
> case CHIP_TOPAZ:
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
* RE: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling
[not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:23 ` Deng, Emily
@ 2016-10-08 8:23 ` Deng, Emily
1 sibling, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:23 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling
>
> We handle the virtual interrupts from a timer so no need to try an look like
> we are handling IV ring events.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 109 +++++++++++++++--------
> --------
> 1 file changed, 54 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index 8163622..29e0ce0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -39,9 +39,6 @@
>
> static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
> static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); -static
> int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - struct amdgpu_iv_entry *entry);
>
> /**
> * dce_virtual_vblank_wait - vblank wait asic callback.
> @@ -659,14 +656,64 @@ static void dce_virtual_set_display_funcs(struct
> amdgpu_device *adev)
> adev->mode_info.funcs = &dce_virtual_display_funcs; }
>
> +static int dce_virtual_pageflip(struct amdgpu_device *adev,
> + unsigned crtc_id)
> +{
> + unsigned long flags;
> + struct amdgpu_crtc *amdgpu_crtc;
> + struct amdgpu_flip_work *works;
> +
> + amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> +
> + if (crtc_id >= adev->mode_info.num_crtc) {
> + DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
> + return -EINVAL;
> + }
> +
> + /* IRQ could occur when in initial stage */
> + if (amdgpu_crtc == NULL)
> + return 0;
> +
> + spin_lock_irqsave(&adev->ddev->event_lock, flags);
> + works = amdgpu_crtc->pflip_works;
> + if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
> + DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
> + "AMDGPU_FLIP_SUBMITTED(%d)\n",
> + amdgpu_crtc->pflip_status,
> + AMDGPU_FLIP_SUBMITTED);
> + spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> + return 0;
> + }
> +
> + /* page flip completed. clean up */
> + amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
> + amdgpu_crtc->pflip_works = NULL;
> +
> + /* wakeup usersapce */
> + if (works->event)
> + drm_crtc_send_vblank_event(&amdgpu_crtc->base, works-
> >event);
> +
> + spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> +
> + drm_crtc_vblank_put(&amdgpu_crtc->base);
> + schedule_work(&works->unpin_work);
> +
> + return 0;
> +}
> +
> static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer
> *vblank_timer) {
> - 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);
> + 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);
> - hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
> + dce_virtual_pageflip(adev, crtc);
> + hrtimer_start(vblank_timer, ktime_set(0,
> DCE_VIRTUAL_VBLANK_PERIOD),
> + HRTIMER_MODE_REL);
> +
> return HRTIMER_NORESTART;
> }
>
> @@ -710,54 +757,6 @@ static int dce_virtual_set_crtc_irq_state(struct
> amdgpu_device *adev,
> return 0;
> }
>
> -static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - struct amdgpu_iv_entry *entry)
> -{
> - unsigned long flags;
> - unsigned crtc_id = 0;
> - struct amdgpu_crtc *amdgpu_crtc;
> - struct amdgpu_flip_work *works;
> -
> - crtc_id = 0;
> - amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
> -
> - if (crtc_id >= adev->mode_info.num_crtc) {
> - DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
> - return -EINVAL;
> - }
> -
> - /* IRQ could occur when in initial stage */
> - if (amdgpu_crtc == NULL)
> - return 0;
> -
> - spin_lock_irqsave(&adev->ddev->event_lock, flags);
> - works = amdgpu_crtc->pflip_works;
> - if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
> - DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
> - "AMDGPU_FLIP_SUBMITTED(%d)\n",
> - amdgpu_crtc->pflip_status,
> - AMDGPU_FLIP_SUBMITTED);
> - spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> - return 0;
> - }
> -
> - /* page flip completed. clean up */
> - amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
> - amdgpu_crtc->pflip_works = NULL;
> -
> - /* wakeup usersapce */
> - if (works->event)
> - drm_crtc_send_vblank_event(&amdgpu_crtc->base, works-
> >event);
> -
> - spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
> -
> - drm_crtc_vblank_put(&amdgpu_crtc->base);
> - schedule_work(&works->unpin_work);
> -
> - return 0;
> -}
> -
> static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
> .set = dce_virtual_set_crtc_irq_state,
> .process = NULL,
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
* RE: [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
` (6 preceding siblings ...)
2016-09-30 17:52 ` [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Christian König
@ 2016-10-08 8:24 ` Deng, Emily
7 siblings, 0 replies; 16+ messages in thread
From: Deng, Emily @ 2016-10-08 8:24 UTC (permalink / raw)
To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander
Reviewed-By: Emily Deng <Emily.Deng@amd.com>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Alex Deucher
> Sent: Saturday, October 01, 2016 1:09 AM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>
> Subject: [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs
>
> Never used.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 35 ++++++-----------------------
> ---
> 1 file changed, 6 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> index 359fe56..cf43caa 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
> @@ -209,10 +209,9 @@ static void dce_virtual_crtc_dpms(struct drm_crtc
> *crtc, int mode)
> switch (mode) {
> case DRM_MODE_DPMS_ON:
> amdgpu_crtc->enabled = true;
> - /* Make sure VBLANK and PFLIP interrupts are still enabled */
> + /* Make sure VBLANK interrupts are still enabled */
> type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc-
> >crtc_id);
> amdgpu_irq_update(adev, &adev->crtc_irq, type);
> - amdgpu_irq_update(adev, &adev->pageflip_irq, type);
> drm_vblank_on(dev, amdgpu_crtc->crtc_id);
> break;
> case DRM_MODE_DPMS_STANDBY:
> @@ -672,8 +671,8 @@ static enum hrtimer_restart
> dce_virtual_vblank_timer_handle(struct hrtimer *vbla }
>
> static void dce_virtual_set_crtc_vblank_interrupt_state(struct
> amdgpu_device *adev,
> - int crtc,
> - enum
> amdgpu_interrupt_state state)
> + int crtc,
> + enum
> amdgpu_interrupt_state state)
> {
> if (crtc >= adev->mode_info.num_crtc) {
> DRM_DEBUG("invalid crtc %d\n", crtc); @@ -697,9 +696,9
> @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct
> amdgpu_device *ad
>
>
> static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *source,
> - unsigned type,
> - enum amdgpu_interrupt_state state)
> + struct amdgpu_irq_src *source,
> + unsigned type,
> + enum amdgpu_interrupt_state state)
> {
> switch (type) {
> case AMDGPU_CRTC_IRQ_VBLANK1:
> @@ -726,20 +725,6 @@ static int dce_virtual_crtc_irq(struct
> amdgpu_device *adev,
> return 0;
> }
>
> -static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev,
> - struct amdgpu_irq_src *src,
> - unsigned type,
> - enum amdgpu_interrupt_state
> state)
> -{
> - if (type >= adev->mode_info.num_crtc) {
> - DRM_ERROR("invalid pageflip crtc %d\n", type);
> - return -EINVAL;
> - }
> - DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state);
> -
> - return 0;
> -}
> -
> static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
> struct amdgpu_irq_src *source,
> struct amdgpu_iv_entry *entry)
> @@ -793,17 +778,9 @@ static const struct amdgpu_irq_src_funcs
> dce_virtual_crtc_irq_funcs = {
> .process = dce_virtual_crtc_irq,
> };
>
> -static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = {
> - .set = dce_virtual_set_pageflip_irq_state,
> - .process = dce_virtual_pageflip_irq,
> -};
> -
> static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) {
> adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST;
> adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs;
> -
> - adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST;
> - adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs;
> }
>
> --
> 2.5.5
>
> _______________________________________________
> 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] 16+ messages in thread
end of thread, other threads:[~2016-10-08 8:24 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-30 17:08 [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Alex Deucher
[not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-09-30 17:08 ` [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback Alex Deucher
[not found] ` <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:22 ` Deng, Emily
2016-09-30 17:08 ` [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling Alex Deucher
[not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:23 ` Deng, Emily
2016-10-08 8:23 ` Deng, Emily
2016-09-30 17:08 ` [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup Alex Deucher
[not found] ` <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:22 ` Deng, Emily
2016-09-30 17:08 ` [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." Alex Deucher
[not found] ` <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:22 ` Deng, Emily
2016-09-30 17:08 ` [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display Alex Deucher
[not found] ` <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:23 ` Deng, Emily
2016-09-30 17:08 ` [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) Alex Deucher
[not found] ` <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>
2016-10-08 8:22 ` Deng, Emily
2016-09-30 17:52 ` [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Christian König
2016-10-08 8:24 ` 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.