<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
h4
        {mso-style-priority:9;
        mso-style-link:"Heading 4 Char";
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:宋体;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:"Calibri","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
span.Heading4Char
        {mso-style-name:"Heading 4 Char";
        mso-style-priority:9;
        mso-style-link:"Heading 4";
        font-family:宋体;
        font-weight:bold;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:20523220;
        mso-list-template-ids:506731330;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1
        {mso-list-id:440422591;
        mso-list-template-ids:-912380010;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l2
        {mso-list-id:705834299;
        mso-list-type:hybrid;
        mso-list-template-ids:-461334500 67698701 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l2:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:21.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:42.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:63.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:84.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:105.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:126.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:147.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:168.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l2:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:189.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3
        {mso-list-id:858153930;
        mso-list-type:hybrid;
        mso-list-template-ids:645718770 67698701 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l3:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:21.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:42.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:63.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:84.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:105.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:126.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:147.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:168.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l3:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:189.0pt;
        text-indent:-21.0pt;
        font-family:Wingdings;}
@list l4
        {mso-list-id:1719282551;
        mso-list-template-ids:2008944358;}
@list l4:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5
        {mso-list-id:1994597642;
        mso-list-template-ids:1349391664;}
@list l5:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l5:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="blue" vlink="purple" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoPlainText"><span lang="EN-US">Hi,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">We test performance of this patch set compared to the current mainline without these patches applied.
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">With patches v.s. the current mainline, most of performance change little(<2%) except GL benchmark 2.7.0(</span><span style="font-family:宋体">↑</span><span lang="EN-US">5%). You may see results attached.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Environment<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l2 level1 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">²<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Platform<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">HSW desktop:</span><span lang="EN-US" style="font-size:13.5pt;font-family:SimSun;color:black">
</span><span lang="EN-US">Desktop GT2 SDP,</span><span lang="EN-US"> 0412 (rev 06),Core(TM) i5-4570 CPU @ 3.20GHz.</span><span lang="EN-US" style="font-size:12.0pt;font-family:宋体">
</span><span lang="EN-US">Lynx Point 02</span><span lang="EN-US" style="font-size:12.0pt;font-family:宋体">,</span><span lang="EN-US">Stepping B0. Max non-overclocked (RP0) frequency: 1150MHz</span><span lang="EN-US" style="font-size:12.0pt;font-family:宋体">.</span><span lang="EN-US">BIOS
 v108.</span><span lang="EN-US" style="font-size:12.0pt;font-family:宋体"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin-left:21.0pt;text-indent:-21.0pt;mso-list:l2 level1 lfo2">
<![if !supportLists]><span lang="EN-US" style="font-family:Wingdings"><span style="mso-list:Ignore">²<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]><span lang="EN-US">Kernel<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin-left:21.0pt"><span lang="EN-US">(Branch is wait-boost at http://cgit.freedesktop.org/~ickle/linux-2.6.)<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin-left:21.0pt"><span lang="EN-US">A: drm-intel-nightly (53749d35dc31297498cc0add8bd509c4303fe6a7)<o:p></o:p></span></p>
<p class="MsoPlainText" style="text-indent:21.0pt"><span lang="EN-US">B:git-2bf9c14 that includes four patches:<o:p></o:p></span></p>
<p class="MsoPlainText" style="text-indent:52.5pt"><span lang="EN-US">drm/i915: Fix __wait_seqno to use true infinite timeouts<o:p></o:p></span></p>
<p class="MsoPlainText" style="text-indent:52.5pt"><span lang="EN-US">drm/i915: Call io_schedule() whilst whilsting for the GPU<o:p></o:p></span></p>
<p class="MsoPlainText" style="text-indent:52.5pt"><span lang="EN-US">drm/i915: Boost RPS frequency for CPU stalls<o:p></o:p></span></p>
<p class="MsoPlainText" style="text-indent:52.5pt"><span lang="EN-US">drm/i915: Tweak RPS thresholds to more aggressively downclock<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Thanks,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Meng<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-----Original Message-----<br>
From: Chris Wilson [mailto:chris@chris-wilson.co.uk] <br>
Sent: Monday, August 26, 2013 6:00 PM<br>
To: intel-gfx@lists.freedesktop.org<br>
Cc: Chris Wilson; Kenneth Graunke; St</span><span lang="EN-US" style="font-family:"Courier New"">é</span><span lang="EN-US">phane Marchesin; Owen Taylor; Meng, Mengmeng; Zhuang, Lena<br>
Subject: [PATCH 1/2] drm/i915: Boost RPS frequency for CPU stalls</span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">If we encounter a situation where the CPU blocks waiting for results from the GPU, give the GPU a kick to boost its the frequency.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">This should work to reduce user interface stalls and to quickly promote mesa to high frequencies - but the cost is that our requested frequency stalls high (as we do not idle for long enough before rc6 to start reducing
 frequencies, nor are we aggressive at down clocking an underused GPU). However, this should be mitigated by rc6 itself powering off the GPU when idle, and that energy use is dependent upon the workload of the GPU in addition to its frequency (e.g. the math
 or sampler functions only consume power when used). Still, this is likely to adversely affect light workloads.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">In particular, this nearly eliminates the highly noticeable wake-up lag in animations from idle. For example, expose or workspace transitions.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">(However, given the situation where we fail to downclock, our requested frequency is almost always the maximum, except for Baytrail where we manually downclock upon idling. This often masks the latency of upclocking
 after being idle, so animations are typically smooth - at the cost of increased power consumption.)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">St</span><span lang="EN-US" style="font-family:"Courier New"">é</span><span lang="EN-US">phane raised the concern that this will punish good applications and reward bad applications - but due to the nature of how mesa
 performs its client throttling, I believe all mesa applications will be roughly equally affected. To address this concern, and to prevent applications like compositors from regularly boosting the RPS state, we only allow each client to receive one boost in
 each period of activity.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Unfortunately, this techinique is ineffective with Ironlake - which also has dynamic render power states and suffers just as dramatically. For Ironlake, the thermal/power headroom is shared with the CPU through Intelligent
 Power Sharing and the intel-ips module. This leaves us with no GPU boost frequencies available when coming out of idle, and due to hardware limitations we cannot change the arbitration between the CPU and GPU quickly enough to be effective.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">v2: Limit each client to receiving a single boost for each active period.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">v3: Tidy up. Allow the device to always boost if it waits outside of client context.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Cc: Kenneth Graunke <kenneth@whitecape.org><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Cc: St</span><span lang="EN-US" style="font-family:"Courier New"">é</span><span lang="EN-US">phane Marchesin <stephane.marchesin@gmail.com><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Cc: Owen Taylor <otaylor@redhat.com><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Cc: "Meng, Mengmeng" <mengmeng.meng@intel.com><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Cc: "Zhuang, Lena" <lena.zhuang@intel.com><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">---<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/i915_dma.c      |  16 ++---<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/i915_drv.h      |  19 +++--<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/i915_gem.c      | 136 ++++++++++++++++++++++++-----------<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/i915_irq.c      |  11 ---<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/intel_display.c |   3 +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/intel_drv.h     |   3 +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">drivers/gpu/drm/i915/intel_pm.c      |  42 ++++++-----<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">7 files changed, 139 insertions(+), 91 deletions(-)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 99159c9..883990f 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/i915_dma.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/i915_dma.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1811,19 +1811,11 @@ int i915_driver_unload(struct drm_device *dev)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> int i915_driver_open(struct drm_device *dev, struct drm_file *file)  {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        struct drm_i915_file_private *file_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        DRM_DEBUG_DRIVER("\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (!file_priv)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 return -ENOMEM;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        file->driver_priv = file_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        spin_lock_init(&file_priv->mm.lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        INIT_LIST_HEAD(&file_priv->mm.request_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       int ret;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        idr_init(&file_priv->context_idr);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       ret = i915_gem_open(dev, file);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (ret)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                return ret;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        return 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index f626271..8993a0b 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/i915_drv.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/i915_drv.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -829,9 +829,6 @@ struct intel_gen6_power_mgmt {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct work_struct work;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       u32 pm_iir;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        /* On vlv we need to manually drop to Vmin with a delayed work. */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        struct delayed_work vlv_work;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       /* The below variables an all the rps hw state are protected by<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * dev->struct mutext. */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       u8 cur_delay;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -947,6 +944,15 @@ struct i915_gem_mm {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct delayed_work retire_work;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        /**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       * When we detect an idle GPU, we want to turn on<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       * powersaving features. So once we see that there<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       * are no more requests outstanding and no more<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       * arrive within a small period of time, we fire<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       * off the idle_work.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct delayed_work idle_work;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       /**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * Are we in a non-interruptible section of code like<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * modesetting?<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1570,13 +1576,17 @@ struct drm_i915_gem_request {  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> struct drm_i915_file_private {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct drm_i915_private *dev_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                spinlock_t lock;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                struct list_head request_list;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                struct delayed_work idle_work;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       } mm;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct idr context_idr;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        struct i915_ctx_hang_stats hang_stats;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       atomic_t rps_wait_boost;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> #define INTEL_INFO(dev)       (to_i915(dev)->info)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1925,7 +1935,7 @@ i915_gem_object_unpin_fence(struct drm_i915_gem_object *obj)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-void i915_gem_retire_requests(struct drm_device *dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+bool i915_gem_retire_requests(struct drm_device *dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">void i915_gem_retire_requests_ring(struct intel_ring_buffer *ring);  int __must_check i915_gem_check_wedge(struct i915_gpu_error *error,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                         bool interruptible);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1978,6 +1988,7 @@ int i915_gem_attach_phys_object(struct drm_device *dev,  void i915_gem_detach_phys_object(struct drm_device *dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                    struct drm_i915_gem_object *obj);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">void i915_gem_free_all_phys_object(struct drm_device *dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+int i915_gem_open(struct drm_device *dev, struct drm_file *file);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">void i915_gem_release(struct drm_device *dev, struct drm_file *file);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> bool<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index b163c5e..85537d1 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/i915_gem.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/i915_gem.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1078,6 +1078,14 @@ static bool missed_irq(struct drm_i915_private *dev_priv,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       return test_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+static bool can_wait_boost(struct drm_i915_file_private *file_priv) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (file_priv == NULL)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                return true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       return !atomic_xchg(&file_priv->rps_wait_boost, true); }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  * __wait_seqno - wait until execution of seqno has finished<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  * @ring: the ring expected to report seqno @@ -1098,7 +1106,9 @@ static bool missed_irq(struct drm_i915_private *dev_priv,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                          unsigned reset_counter,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                           bool interruptible, struct timespec *timeout)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                          bool interruptible,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                          struct timespec *timeout,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                          struct drm_i915_file_private *file_priv)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       drm_i915_private_t *dev_priv = ring->dev->dev_private;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct timespec before, now;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1113,6 +1123,9 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        timeout_jiffies = timeout ? timespec_to_jiffies_timeout(timeout) : 1;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (dev_priv->info->gen >= 6 && can_wait_boost(file_priv))<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                gen6_rps_boost(dev_priv);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (!(dev_priv->gpu_error.test_irq_rings & intel_ring_flag(ring)) &&<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">           WARN_ON(!ring->irq_get(ring)))<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                return -ENODEV;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1212,7 +1225,7 @@ i915_wait_seqno(struct intel_ring_buffer *ring, uint32_t seqno)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        return __wait_seqno(ring, seqno,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                              atomic_read(&dev_priv->gpu_error.reset_counter),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                               interruptible, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                              interruptible, NULL, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> static int<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1262,6 +1275,7 @@ i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">static __must_check int<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                                                struct drm_file *file,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                                bool readonly)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct drm_device *dev = obj->base.dev; @@ -1288,7 +1302,7 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       mutex_unlock(&dev->struct_mutex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        ret = __wait_seqno(ring, seqno, reset_counter, true, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       ret = __wait_seqno(ring, seqno, reset_counter, true, NULL,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+file->driver_priv);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       mutex_lock(&dev->struct_mutex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (ret)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                return ret;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -1337,7 +1351,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * We will repeat the flush holding the lock in the normal manner<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * to catch cases where we are gazumped.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        ret = i915_gem_object_wait_rendering__nonblocking(obj, !write_domain);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       ret = i915_gem_object_wait_rendering__nonblocking(obj, file,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+!write_domain);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (ret)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                goto unref;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -2204,6 +2218,8 @@ int __i915_add_request(struct intel_ring_buffer *ring,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (file) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                struct drm_i915_file_private *file_priv = file->driver_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                cancel_delayed_work_sync(&file_priv->mm.idle_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                spin_lock(&file_priv->mm.lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                request->file_priv = file_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                list_add_tail(&request->client_list,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -2218,6 +2234,7 @@ int __i915_add_request(struct intel_ring_buffer *ring,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                i915_queue_hangcheck(ring->dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                 if (was_empty) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                          cancel_delayed_work_sync(&dev_priv->mm.idle_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                          queue_delayed_work(dev_priv->wq,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                               &dev_priv->mm.retire_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                               round_jiffies_up_relative(HZ)); @@ -2239,10 +2256,12 @@ i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                return;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        spin_lock(&file_priv->mm.lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (request->file_priv) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 list_del(&request->client_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 request->file_priv = NULL;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       list_del(&request->client_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (list_empty(&file_priv->mm.request_list))<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                mod_delayed_work(to_i915(request->ring->dev)->wq,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                                   &file_priv->mm.idle_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                                   msecs_to_jiffies(100));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       request->file_priv = NULL;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       spin_unlock(&file_priv->mm.lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -2488,57 +2507,53 @@ i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       WARN_ON(i915_verify_lists(ring->dev));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-void<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+bool<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">i915_gem_retire_requests(struct drm_device *dev)  {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       drm_i915_private_t *dev_priv = dev->dev_private;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct intel_ring_buffer *ring;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       bool idle = true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       int i;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        for_each_ring(ring, dev_priv, i)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       for_each_ring(ring, dev_priv, i) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                i915_gem_retire_requests_ring(ring);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                idle &= list_empty(&ring->request_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (idle)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                mod_delayed_work(dev_priv->wq,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                                      &dev_priv->mm.idle_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                                      msecs_to_jiffies(100));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       return idle;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> static void<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">i915_gem_retire_work_handler(struct work_struct *work)  {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        drm_i915_private_t *dev_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        struct drm_device *dev;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        struct intel_ring_buffer *ring;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct drm_i915_private *dev_priv =<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                container_of(work, typeof(*dev_priv), mm.retire_work.work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct drm_device *dev = dev_priv->dev;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       bool idle;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        int i;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        dev_priv = container_of(work, drm_i915_private_t,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                                    mm.retire_work.work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        dev = dev_priv->dev;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        /* Come back later if the device is busy... */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (!mutex_trylock(&dev->struct_mutex)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                                       round_jiffies_up_relative(HZ));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 return;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        i915_gem_retire_requests(dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        /* Send a periodic flush down the ring so we don't hold onto GEM<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        * objects indefinitely.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        idle = true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        for_each_ring(ring, dev_priv, i) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 if (ring->gpu_caches_dirty)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                           i915_add_request(ring, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 idle &= list_empty(&ring->request_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       idle = false;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (mutex_trylock(&dev->struct_mutex)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                idle = i915_gem_retire_requests(dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                mutex_unlock(&dev->struct_mutex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (!dev_priv->ums.mm_suspended && !idle)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (!idle)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                      round_jiffies_up_relative(HZ));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (idle)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 intel_mark_idle(dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        mutex_unlock(&dev->struct_mutex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+static void<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+i915_gem_idle_work_handler(struct work_struct *work) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct drm_i915_private *dev_priv =<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                container_of(work, typeof(*dev_priv), mm.idle_work.work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       intel_mark_idle(dev_priv->dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> /**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -2636,7 +2651,7 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       mutex_unlock(&dev->struct_mutex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        ret = __wait_seqno(ring, seqno, reset_counter, true, timeout);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       ret = __wait_seqno(ring, seqno, reset_counter, true, timeout,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+file->driver_priv);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (timeout)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                args->timeout_ns = timespec_to_ns(timeout);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       return ret;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -3846,7 +3861,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (seqno == 0)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                return 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        ret = __wait_seqno(ring, seqno, reset_counter, true, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       ret = __wait_seqno(ring, seqno, reset_counter, true, NULL, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (ret == 0)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -4320,6 +4335,7 @@ i915_gem_idle(struct drm_device *dev)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        /* Cancel the retire work handler, which should be idle now. */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       cancel_delayed_work_sync(&dev_priv->mm.retire_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       cancel_delayed_work_sync(&dev_priv->mm.idle_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        return 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -4647,6 +4663,8 @@ i915_gem_load(struct drm_device *dev)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       INIT_DELAYED_WORK(&dev_priv->mm.retire_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                            i915_gem_retire_work_handler);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       INIT_DELAYED_WORK(&dev_priv->mm.idle_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                            i915_gem_idle_work_handler);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       init_waitqueue_head(&dev_priv->gpu_error.reset_queue);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ @@ -4870,6 +4888,8 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)  {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct drm_i915_file_private *file_priv = file->driver_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       cancel_delayed_work_sync(&file_priv->mm.idle_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       /* Clean up our request list when the client is going away, so that<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * later retire_requests won't dereference our soon-to-be-gone<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        * file_priv.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -4887,6 +4907,38 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       spin_unlock(&file_priv->mm.lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+static void<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+i915_gem_file_idle_work_handler(struct work_struct *work) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct drm_i915_file_private *file_priv =<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                container_of(work, typeof(*file_priv), mm.idle_work.work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       atomic_set(&file_priv->rps_wait_boost, false); }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+int i915_gem_open(struct drm_device *dev, struct drm_file *file) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       struct drm_i915_file_private *file_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       DRM_DEBUG_DRIVER("\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (!file_priv)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                return -ENOMEM;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       file->driver_priv = file_priv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       file_priv->dev_priv = dev->dev_private;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       spin_lock_init(&file_priv->mm.lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       INIT_LIST_HEAD(&file_priv->mm.request_list);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       INIT_DELAYED_WORK(&file_priv->mm.idle_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                            i915_gem_file_idle_work_handler);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       idr_init(&file_priv->context_idr);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       return 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task)  {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       if (!mutex_is_locked(mutex))<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index e93c134a..875125f 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/i915_irq.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/i915_irq.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -853,17 +853,6 @@ static void gen6_pm_rps_work(struct work_struct *work)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                          gen6_set_rps(dev_priv->dev, new_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (IS_VALLEYVIEW(dev_priv->dev)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 /*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 * On VLV, when we enter RC6 we may not be at the minimum<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 * voltage level, so arm a timer to check.  It should only<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 * fire when there's activity or once after we've entered<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 * RC6, and then won't be re-armed until the next RPS interrupt.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 mod_delayed_work(dev_priv->wq, &dev_priv->rps.vlv_work,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                                    msecs_to_jiffies(100));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       mutex_unlock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">index fd8a5e8..2d81ac7 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/intel_display.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/intel_display.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -7497,6 +7497,9 @@ void intel_mark_idle(struct drm_device *dev)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                 intel_decrease_pllclock(crtc);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (dev_priv->info->gen >= 6)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                gen6_rps_idle(dev->dev_private);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> void intel_mark_fb_busy(struct drm_i915_gem_object *obj, diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">index 1760808..e7949cb 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/intel_drv.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/intel_drv.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -793,4 +793,7 @@ extern void hsw_pc8_restore_interrupts(struct drm_device *dev);  extern void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv);  extern void intel_aux_display_runtime_put(struct drm_i915_private
 *dev_priv);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+extern void gen6_rps_idle(struct drm_i915_private *dev_priv); extern
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+void gen6_rps_boost(struct drm_i915_private *dev_priv);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">#endif /* __INTEL_DRV_H__ */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 727b902..5c4fdd1 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/drivers/gpu/drm/i915/intel_pm.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/drivers/gpu/drm/i915/intel_pm.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -3320,6 +3320,26 @@ void gen6_set_rps(struct drm_device *dev, u8 val)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       trace_intel_gpu_freq_change(val * 50);  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+void gen6_rps_idle(struct drm_i915_private *dev_priv) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       mutex_lock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (dev_priv->info->is_valleyview)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                valleyview_set_rps(dev_priv->dev, dev_priv->rps.min_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       else<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                gen6_set_rps(dev_priv->dev, dev_priv->rps.min_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       mutex_unlock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+void gen6_rps_boost(struct drm_i915_private *dev_priv) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       mutex_lock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       if (dev_priv->info->is_valleyview)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                valleyview_set_rps(dev_priv->dev, dev_priv->rps.max_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       else<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                gen6_set_rps(dev_priv->dev, dev_priv->rps.max_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+       mutex_unlock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">/*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  * Wait until the previous freq change has completed,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  * or the timeout elapsed, and then update our notion @@ -3711,24 +3731,6 @@ int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       return vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM) & 0xff;  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-static void vlv_rps_timer_work(struct work_struct *work) -{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                                                           rps.vlv_work.work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        /*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        * Timer fired, we must be idle.  Drop to min voltage state.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        * Note: we use RPe here since it should match the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        * Vmin we were shooting for.  That should give us better<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        * perf when we come back out of RC6 than if we used the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        * min freq available.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        mutex_lock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        if (dev_priv->rps.cur_delay > dev_priv->rps.rpe_delay)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 valleyview_set_rps(dev_priv->dev, dev_priv->rps.rpe_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        mutex_unlock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">static void valleyview_setup_pctx(struct drm_device *dev)  {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       struct drm_i915_private *dev_priv = dev->dev_private; @@ -3866,8 +3868,6 @@ static void valleyview_enable_rps(struct drm_device *dev)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                                         dev_priv->rps.rpe_delay),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                           dev_priv->rps.rpe_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-        INIT_DELAYED_WORK(&dev_priv->rps.vlv_work, vlv_rps_timer_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       valleyview_set_rps(dev_priv->dev, dev_priv->rps.rpe_delay);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        gen6_enable_rps_interrupts(dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -4555,8 +4555,6 @@ void intel_disable_gt_powersave(struct drm_device *dev)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">       } else if (INTEL_INFO(dev)->gen >= 6) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                cancel_delayed_work_sync(&dev_priv->rps.delayed_resume_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                cancel_work_sync(&dev_priv->rps.work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                 if (IS_VALLEYVIEW(dev))<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-                           cancel_delayed_work_sync(&dev_priv->rps.vlv_work);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                mutex_lock(&dev_priv->rps.hw_lock);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                if (IS_VALLEYVIEW(dev))<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                          valleyview_disable_rps(dev);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">1.8.4.rc3<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>