Re: [RFC] PCIE ASPM support

2008-01-07 Thread Shaohua Li

On Mon, 2008-01-07 at 10:19 -0800, Kok, Auke wrote:
> Shaohua Li wrote:
> > On Thu, 2008-01-03 at 11:33 -0800, Kok, Auke wrote:
> >> Shaohua Li wrote:
> >>> PCI Express ASPM defines a protocol for PCI Express components in the D0
> >>> state to reduce Link power by placing their Links into a low power state
> >>> and instructing the other end of the Link to do likewise. This
> >>> capability allows hardware-autonomous, dynamic Link power reduction
> >>> beyond what is achievable by software-only controlled power management.
> >>> However, The device should be configured by software appropriately.
> >>> Enabling ASPM will save power, but will introduce device latency.
> >>>
> >>> This patch adds ASPM support in Linux. It introduces a global policy for
> >>> ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
> >>> it. The interface can be used as a boot option too. Currently we have
> >>> below setting:
> >>>   -default, BIOS default setting
> >>>   -powersave, highest power saving mode, enable all available ASPM state
> >>> and clock power management
> >>>   -performance, highest performance, disable ASPM and clock power
> >>> management
> >>> By default, the 'default' policy is used currently.
> >>>
> >>> In my test, power difference between powersave mode and performance mode
> >>> is about 1.3w in a system with 3 PCIE links.
> >>>
> >>> please review, any comments will be appreciated.
> >>
> >> quickly glanced this over since I recently disabled l1 ASPM for the 
> >> e1000/e1000e
> >> driven 82573 device which has issues with l1 ASPM. that immediately gives 
> >> me the
> >> question: how can I continue to disable 1l aspm by default for this device 
> >> using
> >> this infrastructure?
> > I used to have a per-device interface, but thought the interface might
> > be hard to use for users. If we really need the per-device interface, I
> > can re-add it.
> > 
> >> I do like the fact that there is a generic way to re-enable it for the 
> >> users who
> >> want to use it. Can this change be done when the device is already active?
> > Yes, at least in my test.
> > 
> >> Can you
> >> change this parameter per device/module?
> > Another way is to provide a helper for driver, and driver disables
> > specific ASPM states. It sounds better to let driver do the disabling,
> > as users haven't the knowledge?
> 
> agreed, however this could still be usefull in debugging equipment for the
> experienced user. In any case an easy handle for the driver to dis/enable ASPM
> would certainly help our case, and possibly others.
Then I'll add a config option, and enable the per-device interface with
config enabled.

Thanks,
Shaohua

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-07 Thread Shaohua Li

On Tue, 2008-01-08 at 09:02 +1100, Michael Ellerman wrote:
> On Thu, 2008-01-03 at 14:15 +0800, Shaohua Li wrote:
> > PCI Express ASPM defines a protocol for PCI Express components in the D0
> > state to reduce Link power by placing their Links into a low power state
> > and instructing the other end of the Link to do likewise. This
> > capability allows hardware-autonomous, dynamic Link power reduction
> > beyond what is achievable by software-only controlled power management.
> > However, The device should be configured by software appropriately.
> > Enabling ASPM will save power, but will introduce device latency.
> > 
> > This patch adds ASPM support in Linux. It introduces a global policy for
> > ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
> > it. The interface can be used as a boot option too. Currently we have
> > below setting:
> > -default, BIOS default setting
> > -powersave, highest power saving mode, enable all available ASPM state
> > and clock power management
> > -performance, highest performance, disable ASPM and clock power
> > management
> > By default, the 'default' policy is used currently.
> > 
> > In my test, power difference between powersave mode and performance mode
> > is about 1.3w in a system with 3 PCIE links.
> > 
> > please review, any comments will be appreciated.
> > 
> > Signed-off-by: Shaohua Li <[EMAIL PROTECTED]>
> 
> Minor nit, but you do a lot of these:
> 
> + return ((struct link_state *)pdev->link_state)->bios_aspm_state;
> + return ((struct link_state *)pdev->link_state)->bios_clk_state;
> + ((struct link_state*)pdev->link_state)->clk_pm_enabled = !!enable;
> + ((struct link_state*)pdev->link_state)->clk_pm_capable = capable;
> + ((struct link_state*)pdev->link_state)->clk_pm_enabled = enabled;
> + ((struct link_state*)pdev->link_state)->bios_clk_state = enabled;
> + ((struct link_state *)pdev->link_state)->enabled_state = state;
> + if (((struct link_state *)pdev->link_state)->support_state == 0)
> + if (((struct link_state *)pdev->link_state)->enabled_state == state)
> + ((struct link_state *)pdev->link_state)->enabled_state);
Thanks for your time. I'll fix in next release.

Thanks,
Shaohua

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-07 Thread Michael Ellerman
On Thu, 2008-01-03 at 14:15 +0800, Shaohua Li wrote:
> PCI Express ASPM defines a protocol for PCI Express components in the D0
> state to reduce Link power by placing their Links into a low power state
> and instructing the other end of the Link to do likewise. This
> capability allows hardware-autonomous, dynamic Link power reduction
> beyond what is achievable by software-only controlled power management.
> However, The device should be configured by software appropriately.
> Enabling ASPM will save power, but will introduce device latency.
> 
> This patch adds ASPM support in Linux. It introduces a global policy for
> ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
> it. The interface can be used as a boot option too. Currently we have
> below setting:
>   -default, BIOS default setting
>   -powersave, highest power saving mode, enable all available ASPM state
> and clock power management
>   -performance, highest performance, disable ASPM and clock power
> management
> By default, the 'default' policy is used currently.
> 
> In my test, power difference between powersave mode and performance mode
> is about 1.3w in a system with 3 PCIE links.
> 
> please review, any comments will be appreciated.
> 
> Signed-off-by: Shaohua Li <[EMAIL PROTECTED]>

Minor nit, but you do a lot of these:

+   return ((struct link_state *)pdev->link_state)->bios_aspm_state;
+   return ((struct link_state *)pdev->link_state)->bios_clk_state;
+   ((struct link_state*)pdev->link_state)->clk_pm_enabled = !!enable;
+   ((struct link_state*)pdev->link_state)->clk_pm_capable = capable;
+   ((struct link_state*)pdev->link_state)->clk_pm_enabled = enabled;
+   ((struct link_state*)pdev->link_state)->bios_clk_state = enabled;
+   ((struct link_state *)pdev->link_state)->enabled_state = state;
+   if (((struct link_state *)pdev->link_state)->support_state == 0)
+   if (((struct link_state *)pdev->link_state)->enabled_state == state)
+   ((struct link_state *)pdev->link_state)->enabled_state);

Which is a little hard on the eye.

cheers

-- 
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person


signature.asc
Description: This is a digitally signed message part


Re: [RFC] PCIE ASPM support

2008-01-07 Thread Kok, Auke
Shaohua Li wrote:
> On Thu, 2008-01-03 at 11:33 -0800, Kok, Auke wrote:
>> Shaohua Li wrote:
>>> PCI Express ASPM defines a protocol for PCI Express components in the D0
>>> state to reduce Link power by placing their Links into a low power state
>>> and instructing the other end of the Link to do likewise. This
>>> capability allows hardware-autonomous, dynamic Link power reduction
>>> beyond what is achievable by software-only controlled power management.
>>> However, The device should be configured by software appropriately.
>>> Enabling ASPM will save power, but will introduce device latency.
>>>
>>> This patch adds ASPM support in Linux. It introduces a global policy for
>>> ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
>>> it. The interface can be used as a boot option too. Currently we have
>>> below setting:
>>> -default, BIOS default setting
>>> -powersave, highest power saving mode, enable all available ASPM state
>>> and clock power management
>>> -performance, highest performance, disable ASPM and clock power
>>> management
>>> By default, the 'default' policy is used currently.
>>>
>>> In my test, power difference between powersave mode and performance mode
>>> is about 1.3w in a system with 3 PCIE links.
>>>
>>> please review, any comments will be appreciated.
>>
>> quickly glanced this over since I recently disabled l1 ASPM for the 
>> e1000/e1000e
>> driven 82573 device which has issues with l1 ASPM. that immediately gives me 
>> the
>> question: how can I continue to disable 1l aspm by default for this device 
>> using
>> this infrastructure?
> I used to have a per-device interface, but thought the interface might
> be hard to use for users. If we really need the per-device interface, I
> can re-add it.
> 
>> I do like the fact that there is a generic way to re-enable it for the users 
>> who
>> want to use it. Can this change be done when the device is already active?
> Yes, at least in my test.
> 
>> Can you
>> change this parameter per device/module?
> Another way is to provide a helper for driver, and driver disables
> specific ASPM states. It sounds better to let driver do the disabling,
> as users haven't the knowledge?

agreed, however this could still be usefull in debugging equipment for the
experienced user. In any case an easy handle for the driver to dis/enable ASPM
would certainly help our case, and possibly others.

Auke


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-07 Thread Kok, Auke
Shaohua Li wrote:
 On Thu, 2008-01-03 at 11:33 -0800, Kok, Auke wrote:
 Shaohua Li wrote:
 PCI Express ASPM defines a protocol for PCI Express components in the D0
 state to reduce Link power by placing their Links into a low power state
 and instructing the other end of the Link to do likewise. This
 capability allows hardware-autonomous, dynamic Link power reduction
 beyond what is achievable by software-only controlled power management.
 However, The device should be configured by software appropriately.
 Enabling ASPM will save power, but will introduce device latency.

 This patch adds ASPM support in Linux. It introduces a global policy for
 ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
 it. The interface can be used as a boot option too. Currently we have
 below setting:
 -default, BIOS default setting
 -powersave, highest power saving mode, enable all available ASPM state
 and clock power management
 -performance, highest performance, disable ASPM and clock power
 management
 By default, the 'default' policy is used currently.

 In my test, power difference between powersave mode and performance mode
 is about 1.3w in a system with 3 PCIE links.

 please review, any comments will be appreciated.

 quickly glanced this over since I recently disabled l1 ASPM for the 
 e1000/e1000e
 driven 82573 device which has issues with l1 ASPM. that immediately gives me 
 the
 question: how can I continue to disable 1l aspm by default for this device 
 using
 this infrastructure?
 I used to have a per-device interface, but thought the interface might
 be hard to use for users. If we really need the per-device interface, I
 can re-add it.
 
 I do like the fact that there is a generic way to re-enable it for the users 
 who
 want to use it. Can this change be done when the device is already active?
 Yes, at least in my test.
 
 Can you
 change this parameter per device/module?
 Another way is to provide a helper for driver, and driver disables
 specific ASPM states. It sounds better to let driver do the disabling,
 as users haven't the knowledge?

agreed, however this could still be usefull in debugging equipment for the
experienced user. In any case an easy handle for the driver to dis/enable ASPM
would certainly help our case, and possibly others.

Auke


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-07 Thread Michael Ellerman
On Thu, 2008-01-03 at 14:15 +0800, Shaohua Li wrote:
 PCI Express ASPM defines a protocol for PCI Express components in the D0
 state to reduce Link power by placing their Links into a low power state
 and instructing the other end of the Link to do likewise. This
 capability allows hardware-autonomous, dynamic Link power reduction
 beyond what is achievable by software-only controlled power management.
 However, The device should be configured by software appropriately.
 Enabling ASPM will save power, but will introduce device latency.
 
 This patch adds ASPM support in Linux. It introduces a global policy for
 ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
 it. The interface can be used as a boot option too. Currently we have
 below setting:
   -default, BIOS default setting
   -powersave, highest power saving mode, enable all available ASPM state
 and clock power management
   -performance, highest performance, disable ASPM and clock power
 management
 By default, the 'default' policy is used currently.
 
 In my test, power difference between powersave mode and performance mode
 is about 1.3w in a system with 3 PCIE links.
 
 please review, any comments will be appreciated.
 
 Signed-off-by: Shaohua Li [EMAIL PROTECTED]

Minor nit, but you do a lot of these:

+   return ((struct link_state *)pdev-link_state)-bios_aspm_state;
+   return ((struct link_state *)pdev-link_state)-bios_clk_state;
+   ((struct link_state*)pdev-link_state)-clk_pm_enabled = !!enable;
+   ((struct link_state*)pdev-link_state)-clk_pm_capable = capable;
+   ((struct link_state*)pdev-link_state)-clk_pm_enabled = enabled;
+   ((struct link_state*)pdev-link_state)-bios_clk_state = enabled;
+   ((struct link_state *)pdev-link_state)-enabled_state = state;
+   if (((struct link_state *)pdev-link_state)-support_state == 0)
+   if (((struct link_state *)pdev-link_state)-enabled_state == state)
+   ((struct link_state *)pdev-link_state)-enabled_state);

Which is a little hard on the eye.

cheers

-- 
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person


signature.asc
Description: This is a digitally signed message part


Re: [RFC] PCIE ASPM support

2008-01-07 Thread Shaohua Li

On Mon, 2008-01-07 at 10:19 -0800, Kok, Auke wrote:
 Shaohua Li wrote:
  On Thu, 2008-01-03 at 11:33 -0800, Kok, Auke wrote:
  Shaohua Li wrote:
  PCI Express ASPM defines a protocol for PCI Express components in the D0
  state to reduce Link power by placing their Links into a low power state
  and instructing the other end of the Link to do likewise. This
  capability allows hardware-autonomous, dynamic Link power reduction
  beyond what is achievable by software-only controlled power management.
  However, The device should be configured by software appropriately.
  Enabling ASPM will save power, but will introduce device latency.
 
  This patch adds ASPM support in Linux. It introduces a global policy for
  ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
  it. The interface can be used as a boot option too. Currently we have
  below setting:
-default, BIOS default setting
-powersave, highest power saving mode, enable all available ASPM state
  and clock power management
-performance, highest performance, disable ASPM and clock power
  management
  By default, the 'default' policy is used currently.
 
  In my test, power difference between powersave mode and performance mode
  is about 1.3w in a system with 3 PCIE links.
 
  please review, any comments will be appreciated.
 
  quickly glanced this over since I recently disabled l1 ASPM for the 
  e1000/e1000e
  driven 82573 device which has issues with l1 ASPM. that immediately gives 
  me the
  question: how can I continue to disable 1l aspm by default for this device 
  using
  this infrastructure?
  I used to have a per-device interface, but thought the interface might
  be hard to use for users. If we really need the per-device interface, I
  can re-add it.
  
  I do like the fact that there is a generic way to re-enable it for the 
  users who
  want to use it. Can this change be done when the device is already active?
  Yes, at least in my test.
  
  Can you
  change this parameter per device/module?
  Another way is to provide a helper for driver, and driver disables
  specific ASPM states. It sounds better to let driver do the disabling,
  as users haven't the knowledge?
 
 agreed, however this could still be usefull in debugging equipment for the
 experienced user. In any case an easy handle for the driver to dis/enable ASPM
 would certainly help our case, and possibly others.
Then I'll add a config option, and enable the per-device interface with
config enabled.

Thanks,
Shaohua

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-03 Thread Shaohua Li
On Thu, 2008-01-03 at 11:33 -0800, Kok, Auke wrote:
> Shaohua Li wrote:
> > PCI Express ASPM defines a protocol for PCI Express components in the D0
> > state to reduce Link power by placing their Links into a low power state
> > and instructing the other end of the Link to do likewise. This
> > capability allows hardware-autonomous, dynamic Link power reduction
> > beyond what is achievable by software-only controlled power management.
> > However, The device should be configured by software appropriately.
> > Enabling ASPM will save power, but will introduce device latency.
> > 
> > This patch adds ASPM support in Linux. It introduces a global policy for
> > ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
> > it. The interface can be used as a boot option too. Currently we have
> > below setting:
> > -default, BIOS default setting
> > -powersave, highest power saving mode, enable all available ASPM state
> > and clock power management
> > -performance, highest performance, disable ASPM and clock power
> > management
> > By default, the 'default' policy is used currently.
> > 
> > In my test, power difference between powersave mode and performance mode
> > is about 1.3w in a system with 3 PCIE links.
> > 
> > please review, any comments will be appreciated.
> 
> 
> quickly glanced this over since I recently disabled l1 ASPM for the 
> e1000/e1000e
> driven 82573 device which has issues with l1 ASPM. that immediately gives me 
> the
> question: how can I continue to disable 1l aspm by default for this device 
> using
> this infrastructure?
I used to have a per-device interface, but thought the interface might
be hard to use for users. If we really need the per-device interface, I
can re-add it.

> I do like the fact that there is a generic way to re-enable it for the users 
> who
> want to use it. Can this change be done when the device is already active?
Yes, at least in my test.

> Can you
> change this parameter per device/module?
Another way is to provide a helper for driver, and driver disables
specific ASPM states. It sounds better to let driver do the disabling,
as users haven't the knowledge?

Thanks,
Shaohua

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-03 Thread Kok, Auke
Shaohua Li wrote:
> PCI Express ASPM defines a protocol for PCI Express components in the D0
> state to reduce Link power by placing their Links into a low power state
> and instructing the other end of the Link to do likewise. This
> capability allows hardware-autonomous, dynamic Link power reduction
> beyond what is achievable by software-only controlled power management.
> However, The device should be configured by software appropriately.
> Enabling ASPM will save power, but will introduce device latency.
> 
> This patch adds ASPM support in Linux. It introduces a global policy for
> ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
> it. The interface can be used as a boot option too. Currently we have
> below setting:
>   -default, BIOS default setting
>   -powersave, highest power saving mode, enable all available ASPM state
> and clock power management
>   -performance, highest performance, disable ASPM and clock power
> management
> By default, the 'default' policy is used currently.
> 
> In my test, power difference between powersave mode and performance mode
> is about 1.3w in a system with 3 PCIE links.
> 
> please review, any comments will be appreciated.


quickly glanced this over since I recently disabled l1 ASPM for the e1000/e1000e
driven 82573 device which has issues with l1 ASPM. that immediately gives me the
question: how can I continue to disable 1l aspm by default for this device using
this infrastructure?

I do like the fact that there is a generic way to re-enable it for the users who
want to use it. Can this change be done when the device is already active? Can 
you
change this parameter per device/module?

> + /* Clock PM state*/
> + unsigned int clk_pm_capable:1;
> + unsigned int clk_pm_enabled:1;
> + unsigned int bios_clk_state:1;

might want to get rid of these bitfields?

Cheers,

Auke
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-03 Thread Kok, Auke
Shaohua Li wrote:
 PCI Express ASPM defines a protocol for PCI Express components in the D0
 state to reduce Link power by placing their Links into a low power state
 and instructing the other end of the Link to do likewise. This
 capability allows hardware-autonomous, dynamic Link power reduction
 beyond what is achievable by software-only controlled power management.
 However, The device should be configured by software appropriately.
 Enabling ASPM will save power, but will introduce device latency.
 
 This patch adds ASPM support in Linux. It introduces a global policy for
 ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
 it. The interface can be used as a boot option too. Currently we have
 below setting:
   -default, BIOS default setting
   -powersave, highest power saving mode, enable all available ASPM state
 and clock power management
   -performance, highest performance, disable ASPM and clock power
 management
 By default, the 'default' policy is used currently.
 
 In my test, power difference between powersave mode and performance mode
 is about 1.3w in a system with 3 PCIE links.
 
 please review, any comments will be appreciated.


quickly glanced this over since I recently disabled l1 ASPM for the e1000/e1000e
driven 82573 device which has issues with l1 ASPM. that immediately gives me the
question: how can I continue to disable 1l aspm by default for this device using
this infrastructure?

I do like the fact that there is a generic way to re-enable it for the users who
want to use it. Can this change be done when the device is already active? Can 
you
change this parameter per device/module?

 + /* Clock PM state*/
 + unsigned int clk_pm_capable:1;
 + unsigned int clk_pm_enabled:1;
 + unsigned int bios_clk_state:1;

might want to get rid of these bitfields?

Cheers,

Auke
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC] PCIE ASPM support

2008-01-03 Thread Shaohua Li
On Thu, 2008-01-03 at 11:33 -0800, Kok, Auke wrote:
 Shaohua Li wrote:
  PCI Express ASPM defines a protocol for PCI Express components in the D0
  state to reduce Link power by placing their Links into a low power state
  and instructing the other end of the Link to do likewise. This
  capability allows hardware-autonomous, dynamic Link power reduction
  beyond what is achievable by software-only controlled power management.
  However, The device should be configured by software appropriately.
  Enabling ASPM will save power, but will introduce device latency.
  
  This patch adds ASPM support in Linux. It introduces a global policy for
  ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
  it. The interface can be used as a boot option too. Currently we have
  below setting:
  -default, BIOS default setting
  -powersave, highest power saving mode, enable all available ASPM state
  and clock power management
  -performance, highest performance, disable ASPM and clock power
  management
  By default, the 'default' policy is used currently.
  
  In my test, power difference between powersave mode and performance mode
  is about 1.3w in a system with 3 PCIE links.
  
  please review, any comments will be appreciated.
 
 
 quickly glanced this over since I recently disabled l1 ASPM for the 
 e1000/e1000e
 driven 82573 device which has issues with l1 ASPM. that immediately gives me 
 the
 question: how can I continue to disable 1l aspm by default for this device 
 using
 this infrastructure?
I used to have a per-device interface, but thought the interface might
be hard to use for users. If we really need the per-device interface, I
can re-add it.

 I do like the fact that there is a generic way to re-enable it for the users 
 who
 want to use it. Can this change be done when the device is already active?
Yes, at least in my test.

 Can you
 change this parameter per device/module?
Another way is to provide a helper for driver, and driver disables
specific ASPM states. It sounds better to let driver do the disabling,
as users haven't the knowledge?

Thanks,
Shaohua

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC] PCIE ASPM support

2008-01-02 Thread Shaohua Li
PCI Express ASPM defines a protocol for PCI Express components in the D0
state to reduce Link power by placing their Links into a low power state
and instructing the other end of the Link to do likewise. This
capability allows hardware-autonomous, dynamic Link power reduction
beyond what is achievable by software-only controlled power management.
However, The device should be configured by software appropriately.
Enabling ASPM will save power, but will introduce device latency.

This patch adds ASPM support in Linux. It introduces a global policy for
ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
it. The interface can be used as a boot option too. Currently we have
below setting:
-default, BIOS default setting
-powersave, highest power saving mode, enable all available ASPM state
and clock power management
-performance, highest performance, disable ASPM and clock power
management
By default, the 'default' policy is used currently.

In my test, power difference between powersave mode and performance mode
is about 1.3w in a system with 3 PCIE links.

please review, any comments will be appreciated.

Signed-off-by: Shaohua Li <[EMAIL PROTECTED]>
---
 drivers/pci/pci-acpi.c|9 
 drivers/pci/pci.c |4 
 drivers/pci/pcie/Kconfig  |   13 
 drivers/pci/pcie/Makefile |3 
 drivers/pci/pcie/aspm.c   |  673 ++
 drivers/pci/probe.c   |5 
 drivers/pci/remove.c  |4 
 include/linux/aspm.h  |   33 ++
 include/linux/pci.h   |4 
 include/linux/pci_regs.h  |8 
 10 files changed, 756 insertions(+)

Index: linux/drivers/pci/pcie/Makefile
===
--- linux.orig/drivers/pci/pcie/Makefile2008-01-03 13:16:52.0 
+0800
+++ linux/drivers/pci/pcie/Makefile 2008-01-03 13:47:34.0 +0800
@@ -2,6 +2,9 @@
 # Makefile for PCI-Express PORT Driver
 #
 
+# Build PCI Express ASPM if needed
+obj-$(CONFIG_PCIEASPM) += aspm.o
+
 pcieportdrv-y  := portdrv_core.o portdrv_pci.o portdrv_bus.o
 
 obj-$(CONFIG_PCIEPORTBUS)  += pcieportdrv.o
Index: linux/drivers/pci/pcie/aspm.c
===
--- /dev/null   1970-01-01 00:00:00.0 +
+++ linux/drivers/pci/pcie/aspm.c   2008-01-03 13:47:34.0 +0800
@@ -0,0 +1,673 @@
+/*
+ * File:   drivers/pci/pcie/aspm.c
+ * Enabling PCIE link L0s/L1 state and Clock Power Management
+ *
+ * Copyright (C) 2007 Intel
+ * Copyright (C) Zhang Yanmin ([EMAIL PROTECTED])
+ * Copyright (C) Shaohua Li ([EMAIL PROTECTED])
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "../pci.h"
+
+#ifdef MODULE_PARAM_PREFIX
+#undef MODULE_PARAM_PREFIX
+#endif
+#define MODULE_PARAM_PREFIX "pcie_aspm."
+
+#definePCIE_ASPM_L0S   (1U)
+#definePCIE_ASPM_L1(2U)
+
+/* only for downstream port */
+struct link_state {
+   struct list_head sibiling;
+   struct pci_dev *pdev;
+
+   /* ASPM state */
+   unsigned int support_state;
+   unsigned int enabled_state;
+   unsigned int bios_aspm_state;
+   /* upstream component */
+   unsigned int l0s_upper_latency;
+   unsigned int l1_upper_latency;
+   /* downstream component */
+   unsigned int l0s_down_latency;
+   unsigned int l1_down_latency;
+   /* Clock PM state*/
+   unsigned int clk_pm_capable:1;
+   unsigned int clk_pm_enabled:1;
+   unsigned int bios_clk_state:1;
+
+};
+
+/* Only for endpoint */
+struct endpoint_state {
+   unsigned int l0s_acceptable_latency;
+   unsigned int l1_acceptable_latency;
+};
+
+static int aspm_disabled;
+static DEFINE_MUTEX(aspm_lock);
+static LIST_HEAD(link_list);
+
+#define POLICY_DEFAULT 0   /* BIOS default setting */
+#define POLICY_PERFORMANCE 1   /* high performance */
+#define POLICY_POWERSAVE 2 /* high power saving */
+static int aspm_policy;
+static const char* policy_str[] = {
+   [POLICY_DEFAULT] = "default",
+   [POLICY_PERFORMANCE] = "performance",
+   [POLICY_POWERSAVE] = "powersave"
+};
+
+static int policy_to_aspm_state(struct pci_dev *pdev)
+{
+   switch (aspm_policy) {
+   case POLICY_PERFORMANCE:
+   /* Disable ASPM and Clock PM */
+   return 0;
+   case POLICY_POWERSAVE:
+   /* Enable ASPM L0s/L1 */
+   return 3;
+   case POLICY_DEFAULT:
+   return ((struct link_state *)pdev->link_state)->bios_aspm_state;
+   }
+   return 0;
+}
+
+static int policy_to_clkpm_state(struct pci_dev *pdev)
+{
+   switch (aspm_policy) {
+   case POLICY_PERFORMANCE:
+   /* Disable ASPM and Clock PM */
+   return 0;
+   case POLICY_POWERSAVE:
+   /* Disable Clock PM */
+   return 1;
+   case 

[RFC] PCIE ASPM support

2008-01-02 Thread Shaohua Li
PCI Express ASPM defines a protocol for PCI Express components in the D0
state to reduce Link power by placing their Links into a low power state
and instructing the other end of the Link to do likewise. This
capability allows hardware-autonomous, dynamic Link power reduction
beyond what is achievable by software-only controlled power management.
However, The device should be configured by software appropriately.
Enabling ASPM will save power, but will introduce device latency.

This patch adds ASPM support in Linux. It introduces a global policy for
ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
it. The interface can be used as a boot option too. Currently we have
below setting:
-default, BIOS default setting
-powersave, highest power saving mode, enable all available ASPM state
and clock power management
-performance, highest performance, disable ASPM and clock power
management
By default, the 'default' policy is used currently.

In my test, power difference between powersave mode and performance mode
is about 1.3w in a system with 3 PCIE links.

please review, any comments will be appreciated.

Signed-off-by: Shaohua Li [EMAIL PROTECTED]
---
 drivers/pci/pci-acpi.c|9 
 drivers/pci/pci.c |4 
 drivers/pci/pcie/Kconfig  |   13 
 drivers/pci/pcie/Makefile |3 
 drivers/pci/pcie/aspm.c   |  673 ++
 drivers/pci/probe.c   |5 
 drivers/pci/remove.c  |4 
 include/linux/aspm.h  |   33 ++
 include/linux/pci.h   |4 
 include/linux/pci_regs.h  |8 
 10 files changed, 756 insertions(+)

Index: linux/drivers/pci/pcie/Makefile
===
--- linux.orig/drivers/pci/pcie/Makefile2008-01-03 13:16:52.0 
+0800
+++ linux/drivers/pci/pcie/Makefile 2008-01-03 13:47:34.0 +0800
@@ -2,6 +2,9 @@
 # Makefile for PCI-Express PORT Driver
 #
 
+# Build PCI Express ASPM if needed
+obj-$(CONFIG_PCIEASPM) += aspm.o
+
 pcieportdrv-y  := portdrv_core.o portdrv_pci.o portdrv_bus.o
 
 obj-$(CONFIG_PCIEPORTBUS)  += pcieportdrv.o
Index: linux/drivers/pci/pcie/aspm.c
===
--- /dev/null   1970-01-01 00:00:00.0 +
+++ linux/drivers/pci/pcie/aspm.c   2008-01-03 13:47:34.0 +0800
@@ -0,0 +1,673 @@
+/*
+ * File:   drivers/pci/pcie/aspm.c
+ * Enabling PCIE link L0s/L1 state and Clock Power Management
+ *
+ * Copyright (C) 2007 Intel
+ * Copyright (C) Zhang Yanmin ([EMAIL PROTECTED])
+ * Copyright (C) Shaohua Li ([EMAIL PROTECTED])
+ */
+
+#include linux/kernel.h
+#include linux/module.h
+#include linux/moduleparam.h
+#include linux/pci.h
+#include linux/pci_regs.h
+#include linux/errno.h
+#include linux/pm.h
+#include linux/init.h
+#include linux/slab.h
+#include linux/aspm.h
+#include acpi/acpi_bus.h
+#include linux/pci-acpi.h
+#include ../pci.h
+
+#ifdef MODULE_PARAM_PREFIX
+#undef MODULE_PARAM_PREFIX
+#endif
+#define MODULE_PARAM_PREFIX pcie_aspm.
+
+#definePCIE_ASPM_L0S   (1U)
+#definePCIE_ASPM_L1(2U)
+
+/* only for downstream port */
+struct link_state {
+   struct list_head sibiling;
+   struct pci_dev *pdev;
+
+   /* ASPM state */
+   unsigned int support_state;
+   unsigned int enabled_state;
+   unsigned int bios_aspm_state;
+   /* upstream component */
+   unsigned int l0s_upper_latency;
+   unsigned int l1_upper_latency;
+   /* downstream component */
+   unsigned int l0s_down_latency;
+   unsigned int l1_down_latency;
+   /* Clock PM state*/
+   unsigned int clk_pm_capable:1;
+   unsigned int clk_pm_enabled:1;
+   unsigned int bios_clk_state:1;
+
+};
+
+/* Only for endpoint */
+struct endpoint_state {
+   unsigned int l0s_acceptable_latency;
+   unsigned int l1_acceptable_latency;
+};
+
+static int aspm_disabled;
+static DEFINE_MUTEX(aspm_lock);
+static LIST_HEAD(link_list);
+
+#define POLICY_DEFAULT 0   /* BIOS default setting */
+#define POLICY_PERFORMANCE 1   /* high performance */
+#define POLICY_POWERSAVE 2 /* high power saving */
+static int aspm_policy;
+static const char* policy_str[] = {
+   [POLICY_DEFAULT] = default,
+   [POLICY_PERFORMANCE] = performance,
+   [POLICY_POWERSAVE] = powersave
+};
+
+static int policy_to_aspm_state(struct pci_dev *pdev)
+{
+   switch (aspm_policy) {
+   case POLICY_PERFORMANCE:
+   /* Disable ASPM and Clock PM */
+   return 0;
+   case POLICY_POWERSAVE:
+   /* Enable ASPM L0s/L1 */
+   return 3;
+   case POLICY_DEFAULT:
+   return ((struct link_state *)pdev-link_state)-bios_aspm_state;
+   }
+   return 0;
+}
+
+static int policy_to_clkpm_state(struct pci_dev *pdev)
+{
+   switch (aspm_policy) {
+   case POLICY_PERFORMANCE:
+   /* Disable ASPM