[Intel-gfx] Power saving using Display port HPD
Arun Chandran
achandran at mvista.com
Thu Apr 10 12:28:16 CEST 2014
Hi,
On Thu, Apr 10, 2014 at 12:54 PM, Daniel Vetter <daniel at ffwll.ch> wrote:
> On Thu, Apr 10, 2014 at 12:06:15PM +0530, Arun Chandran wrote:
> > I have connected only a DP monitor on Bayley Bay platform and booting
> > ubuntu 13.10 with the kernel
> > http://cgit.freedesktop.org/drm-intel/log/?h=drm-intel-fixes.
> >
> > I am experimenting with the HPD feature of display port with debug
> > messages enabled. (drm.debug=0xe).
> >
> > When I plug in/out DP cable I am able to see the below kernel messages
> > and ubuntu desktop is displayed on the DP monitor
> >
> > ##############################
> >
> >
> > root at arun-valley-view:~# uname -a
> > Linux arun-valley-view 3.14.0-00528-g67e9d82 #34 SMP PREEMPT Wed Apr 9
> > 18:48:30 IST 2014 i686 i686 i686 GNU/Linux
> >
> > root at arun-valley-view:~# dmesg -c
> >
> > [ 1028.506188] [drm:intel_hpd_irq_handler] hotplug event received,
> > stat 0x00100000
> > [ 1028.506217] [drm:intel_hpd_irq_handler] Received HPD interrupt on
> > PIN 5 - cnt: 0
> > [ 1028.513858] [drm:i915_hotplug_work_func] running encoder hotplug
> functions
> > [ 1028.513880] [drm:i915_hotplug_work_func] Connector eDP-1 (pin 5)
> > received hotplug event.
> > [ 1028.513896] [drm:i915_hotplug_work_func] Connector HDMI-A-2 (pin 5)
> > received hotplug event.
> > [ 1028.513913] [drm:_edp_panel_vdd_on] Turning eDP VDD on
> > [ 1028.513931] [drm:_edp_panel_vdd_on] PP_STATUS: 0x80000008
> > PP_CONTROL: 0xabcd000f
> > [ 1028.515064] [drm:intel_dp_get_dpcd] DPCD: 11 0a 84 01 01 00 01 80
> > 02 00 00 00 00 00 00
> > [ 1028.516563] [drm:intel_dp_check_link_status] TMDS-22: channel EQ
> > not ok, retraining
> > [ 1028.530884] [drm:intel_dp_set_signal_levels] Using signal levels
> 00000000
> > [ 1028.546113] [drm:intel_dp_set_signal_levels] Using signal levels
> 00000000
> > [ 1028.547233] [drm:intel_dp_start_link_train] clock recovery OK
> > [ 1028.548711] [drm:intel_dp_complete_link_train] Channel EQ done. DP
> > Training successful
> > [ 1028.549264] [drm:intel_dp_detect] [CONNECTOR:23:eDP-1]
> > [ 1028.549761] [drm:intel_dp_probe_oui] Sink OUI: 00e04c
> > [ 1028.550262] [drm:intel_dp_probe_oui] Branch OUI: 000000
> > [ 1028.550343] [drm:intel_hdmi_detect] [CONNECTOR:21:HDMI-A-2]
> > [ 1028.550595] [drm:gmbus_xfer] GMBUS [i915 gmbus dpc] NAK for addr:
> 0050 r(1)
> > [ 1028.550611] [drm:drm_do_probe_ddc_edid] drm: skipping non-existent
> > adapter i915 gmbus dpc
> >
> > ##################################
> >
> > After booting I am executing the below steps
> >
> > 1) unplug DP cable.
> >
> > 2) Mask the pin 18 (HPD) of DP cable using a paper strip then connect it
> > back
> > I have checked the dmesg output and the there is no messages related
> to
> > HPD. So kernel is
> > unaware that I have connected a DP monitor
> >
> > But still I see ubuntu desktop coming on the DP monitor. This means
> kernel
> > does not stop pumping display data after step 1.
> >
> > Is this the right behavior? . When kernel knows that the last existing
> > display is removed (via the HPD feature) it can save power by stopping
> the
> > data output to DP monitor (or shutting down the DP hardware related
> part.)
> >
> > Does anybody knows how to use the HPD feature to save power? Or anybody
> has
> > done this before?
>
> Yes, this is expected behaviour. Userspace asked the kernel to shovel
> pixels to the DP screen, the kernel obeyed. If you want to kill the pipe
> when unplugged, you need to make that policy decision in userspace.
>
>
OK I understood that this is the expected behavior.
In order to simulate power-saving with HPD I am now doing.
1) Boot http://cgit.freedesktop.org/drm-intel/log/?h=drm-intel-nightly<http://cgit.freedesktop.org/drm-intel/log/?h=drm-intel-fixes>
arun at arun-valley-view:~$ uname -a
Linux arun-valley-view 3.14.0-00345-gd22313b #35 SMP PREEMPT Thu Apr 10
14:54:09 IST 2014 i686 i686 i686 GNU/Linux
2) sudo dmesg -c > /dev/null; xset dpms force off ( I am planning to do
this when DP cable is unplugged by sending event to userspace)
Then take dmesg from serial console after display goes blank.
####################################
arun at arun-valley-view:~$ sudo dmesg -c
[ 955.521469] [drm:valleyview_set_rps] GPU freq request from 167 MHz (191)
to 542 MHz (209)
[ 956.085890] [drm:valleyview_set_rps] GPU freq request from 167 MHz (191)
to 791 MHz (221)
[ 956.101376] [drm:valleyview_set_rps] GPU freq request from 791 MHz (221)
to 791 MHz (221)
[ 956.102478] [drm:valleyview_set_rps] GPU freq request from 791 MHz (221)
to 791 MHz (221)
[ 956.103167] [drm:valleyview_set_rps] GPU freq request from 791 MHz (221)
to 791 MHz (221)
[ 958.852674] [drm:valleyview_set_rps] GPU freq request from 167 MHz (191)
to 542 MHz (209)
[ 963.907584] [drm:_edp_panel_vdd_on] Turning eDP VDD on
[ 963.907614] [drm:_edp_panel_vdd_on] PP_STATUS: 0x80000008 PP_CONTROL:
0xabcd000f
[ 963.907631] [drm:intel_panel_actually_set_backlight] set backlight PWM =
0
[ 963.907646] [drm:intel_edp_backlight_off]
[ 963.908150] [drm:intel_edp_panel_off] Turn eDP power off
[ 964.109165] [drm:wait_panel_off] Wait for panel power off time
[ 964.109194] [drm:wait_panel_status] mask b0000000 value 00000000 status
80000008 control abcd0000
[ 964.153214] [drm:wait_panel_status] Wait complete
[ 964.181035] [drm:intel_dp_link_down]
[ 964.233101] ------------[ cut here ]------------
[ 964.233139] WARNING: CPU: 0 PID: 1013 at
drivers/gpu/drm/i915/intel_display.c:768 g4x_wait_for_vblank+0xa5/0xbe()
[ 964.233150] vblank wait timed out
[ 964.233159] Modules linked in:
[ 964.233181] CPU: 0 PID: 1013 Comm: Xorg Tainted: G W
3.14.0-00345-gd22313b #35
[ 964.233193] Hardware name: Intel Corp. VALLEYVIEW B0 PLATFORM/NOTEBOOK,
BIOS BYTICRB1.86C.0072.R11.1401221240 01/22/2014
[ 964.233204] 00000300 ee793d68 c090f720 c0b2bb3f ee793d80 c0436ce0
c06f63b4 f3b40000
[ 964.233239] 001f0040 0000041b ee793d98 c0436d5b 00000009 ee793d90
c0b2dd12 ee793dac
[ 964.233271] ee793dc0 c06f63b4 c0b2bb3f 00000300 c0b2dd12 000a1ab1
000a1ae4 f3b40000
[ 964.233304] Call Trace:
[ 964.233327] [<c090f720>] dump_stack+0x48/0x70
[ 964.233349] [<c0436ce0>] warn_slowpath_common+0x63/0x7a
[ 964.233368] [<c06f63b4>] ? g4x_wait_for_vblank+0xa5/0xbe
[ 964.233387] [<c0436d5b>] warn_slowpath_fmt+0x26/0x2a
[ 964.233407] [<c06f63b4>] g4x_wait_for_vblank+0xa5/0xbe
[ 964.233426] [<c06f63f1>] intel_wait_for_vblank+0x24/0xe6
[ 964.233447] [<c070ab0d>] intel_dp_link_down+0xdb/0x18f
[ 964.233468] [<c070abcc>] vlv_post_disable_dp+0xb/0xd
[ 964.233488] [<c06fdba4>] i9xx_crtc_disable+0x151/0x237
[ 964.233510] [<c06ee8f5>] intel_crtc_update_dpms+0x56/0x68
[ 964.233529] [<c06f85b2>] intel_connector_dpms+0x3e/0x48
[ 964.233550] [<c06b1c01>] drm_mode_obj_set_property_ioctl+0x1c0/0x2e7
[ 964.233573] [<c0605c99>] ? kobject_uevent+0xc/0xc
[ 964.233592] [<c06f8574>] ? intel_modeset_check_state+0x6f/0x6f
[ 964.233612] [<c06b1d57>] drm_mode_connector_property_set_ioctl+0x2f/0x37
[ 964.233631] [<c06a9370>] drm_ioctl+0x248/0x350
[ 964.233650] [<c06b1d28>] ? drm_mode_obj_set_property_ioctl+0x2e7/0x2e7
[ 964.233672] [<c047e9b4>] ? __call_rcu_core+0x11/0xc2
[ 964.233692] [<c0507280>] ? mntput_no_expire+0x20/0x108
[ 964.233710] [<c050738a>] ? mntput+0x22/0x24
[ 964.233728] [<c06a9128>] ? drm_ioctl_permit+0x6a/0x6a
[ 964.233748] [<c04fde57>] do_vfs_ioctl+0x219/0x232
[ 964.233767] [<c04fdeac>] SyS_ioctl+0x3c/0x56
[ 964.233789] [<c0913bbe>] sysenter_do_call+0x12/0x26
[ 964.233802] ---[ end trace a3724fec7053be94 ]---
[ 964.284395] [drm:valleyview_update_wm] Setting FIFO watermarks - A:
plane=2, cursor=2, B: plane=2, cursor=2, SR: plane=0, cursor=0
[ 964.284666] [drm:check_encoder_state] [ENCODER:13:DAC-13]
[ 964.284703] [drm:check_encoder_state] [ENCODER:14:TMDS-14]
[ 964.284771] [drm:check_encoder_state] [ENCODER:18:TMDS-18]
[ 964.284839] [drm:check_encoder_state] [ENCODER:20:TMDS-20]
[ 964.284907] [drm:check_encoder_state] [ENCODER:22:TMDS-22]
[ 964.285029] [drm:check_crtc_state] [CRTC:5]
[ 964.285110] [drm:check_crtc_state] [CRTC:9]
[ 964.285192] [drm:drm_mode_setcrtc] [CRTC:5]
[ 964.285207] [drm:intel_crtc_set_config] [CRTC:5] [NOFB]
[ 964.285226] [drm:intel_set_config_compute_mode_changes] computed changes
for [CRTC:5], mode_changed=1, fb_changed=0
[ 964.285240] [drm:intel_modeset_stage_output_state] [CONNECTOR:23:eDP-1]
to [NOCRTC]
[ 964.285252] [drm:intel_modeset_stage_output_state] encoder changed, full
mode switch
[ 964.285264] [drm:intel_modeset_stage_output_state] crtc changed, full
mode switch
[ 964.285276] [drm:intel_modeset_stage_output_state] crtc disabled, full
mode switch
[ 964.285293] [drm:intel_modeset_affected_pipes] set mode pipe masks:
modeset: 0, prepare: 0, disable: 1
[ 964.285358] [drm:intel_display_power_put] disabling dpio-tx-c-23
[ 964.287059] [drm:intel_display_power_put] disabling dpio-tx-c-01
[ 964.293119] [drm:intel_display_power_put] disabling dpio-tx-b-23
[ 964.301223] [drm:intel_display_power_put] disabling dpio-tx-b-01
[ 964.303065] [drm:intel_display_power_put] disabling dpio-common
[ 964.305075] [drm:intel_display_power_put] disabling display
[ 964.307260] [drm:check_encoder_state] [ENCODER:13:DAC-13]
[ 964.307291] [drm:check_encoder_state] [ENCODER:14:TMDS-14]
[ 964.307316] [drm:check_encoder_state] [ENCODER:18:TMDS-18]
[ 964.307340] [drm:check_encoder_state] [ENCODER:20:TMDS-20]
[ 964.307364] [drm:check_encoder_state] [ENCODER:22:TMDS-22]
[ 964.307388] [drm:check_crtc_state] [CRTC:5]
[ 964.307411] [drm:check_crtc_state] [CRTC:9]
#############################################
3) Unplug DP cable
arun at arun-valley-view:~$ sudo dmesg -c
(empty printk buffer)
4) Plug DP cable (planning to send event to userspace to do '$xset dpms
force on'
arun at arun-valley-view:~$ sudo dmesg -c
(empty printk buffer)
I was hoping to see HPD events from step 3&4. But no events are generated.
Is there any way to keep the HPD detection part awake so that I can send
it to userspace to do '$xset dpms force on'
Regards,
Arun C
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20140410/5018221b/attachment.html>
More information about the Intel-gfx
mailing list