PCI: Move pci_get_hp_params() to drivers/pci/pci-acpi.c
Move pci_get_hp_params() and related functions from drivers/pci/hotplug/acpi_pcihp.c to drivers/pci/pci-acpi.c. Previously, pci_get_hp_params() was used only by hotplug drivers. But future changes will move this into the normal device enumeration process, so it will be used even when CONFIG_HOTPLUG_PCI is not set. No functional change. Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
1197ba22c5
commit
9ce90ea5c0
2 changed files with 250 additions and 251 deletions
|
@ -46,215 +46,6 @@
|
||||||
|
|
||||||
static bool debug_acpi;
|
static bool debug_acpi;
|
||||||
|
|
||||||
static acpi_status
|
|
||||||
decode_type0_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
union acpi_object *fields = record->package.elements;
|
|
||||||
u32 revision = fields[1].integer.value;
|
|
||||||
|
|
||||||
switch (revision) {
|
|
||||||
case 1:
|
|
||||||
if (record->package.count != 6)
|
|
||||||
return AE_ERROR;
|
|
||||||
for (i = 2; i < 6; i++)
|
|
||||||
if (fields[i].type != ACPI_TYPE_INTEGER)
|
|
||||||
return AE_ERROR;
|
|
||||||
hpx->t0 = &hpx->type0_data;
|
|
||||||
hpx->t0->revision = revision;
|
|
||||||
hpx->t0->cache_line_size = fields[2].integer.value;
|
|
||||||
hpx->t0->latency_timer = fields[3].integer.value;
|
|
||||||
hpx->t0->enable_serr = fields[4].integer.value;
|
|
||||||
hpx->t0->enable_perr = fields[5].integer.value;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printk(KERN_WARNING
|
|
||||||
"%s: Type 0 Revision %d record not supported\n",
|
|
||||||
__func__, revision);
|
|
||||||
return AE_ERROR;
|
|
||||||
}
|
|
||||||
return AE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static acpi_status
|
|
||||||
decode_type1_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
union acpi_object *fields = record->package.elements;
|
|
||||||
u32 revision = fields[1].integer.value;
|
|
||||||
|
|
||||||
switch (revision) {
|
|
||||||
case 1:
|
|
||||||
if (record->package.count != 5)
|
|
||||||
return AE_ERROR;
|
|
||||||
for (i = 2; i < 5; i++)
|
|
||||||
if (fields[i].type != ACPI_TYPE_INTEGER)
|
|
||||||
return AE_ERROR;
|
|
||||||
hpx->t1 = &hpx->type1_data;
|
|
||||||
hpx->t1->revision = revision;
|
|
||||||
hpx->t1->max_mem_read = fields[2].integer.value;
|
|
||||||
hpx->t1->avg_max_split = fields[3].integer.value;
|
|
||||||
hpx->t1->tot_max_split = fields[4].integer.value;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printk(KERN_WARNING
|
|
||||||
"%s: Type 1 Revision %d record not supported\n",
|
|
||||||
__func__, revision);
|
|
||||||
return AE_ERROR;
|
|
||||||
}
|
|
||||||
return AE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static acpi_status
|
|
||||||
decode_type2_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
union acpi_object *fields = record->package.elements;
|
|
||||||
u32 revision = fields[1].integer.value;
|
|
||||||
|
|
||||||
switch (revision) {
|
|
||||||
case 1:
|
|
||||||
if (record->package.count != 18)
|
|
||||||
return AE_ERROR;
|
|
||||||
for (i = 2; i < 18; i++)
|
|
||||||
if (fields[i].type != ACPI_TYPE_INTEGER)
|
|
||||||
return AE_ERROR;
|
|
||||||
hpx->t2 = &hpx->type2_data;
|
|
||||||
hpx->t2->revision = revision;
|
|
||||||
hpx->t2->unc_err_mask_and = fields[2].integer.value;
|
|
||||||
hpx->t2->unc_err_mask_or = fields[3].integer.value;
|
|
||||||
hpx->t2->unc_err_sever_and = fields[4].integer.value;
|
|
||||||
hpx->t2->unc_err_sever_or = fields[5].integer.value;
|
|
||||||
hpx->t2->cor_err_mask_and = fields[6].integer.value;
|
|
||||||
hpx->t2->cor_err_mask_or = fields[7].integer.value;
|
|
||||||
hpx->t2->adv_err_cap_and = fields[8].integer.value;
|
|
||||||
hpx->t2->adv_err_cap_or = fields[9].integer.value;
|
|
||||||
hpx->t2->pci_exp_devctl_and = fields[10].integer.value;
|
|
||||||
hpx->t2->pci_exp_devctl_or = fields[11].integer.value;
|
|
||||||
hpx->t2->pci_exp_lnkctl_and = fields[12].integer.value;
|
|
||||||
hpx->t2->pci_exp_lnkctl_or = fields[13].integer.value;
|
|
||||||
hpx->t2->sec_unc_err_sever_and = fields[14].integer.value;
|
|
||||||
hpx->t2->sec_unc_err_sever_or = fields[15].integer.value;
|
|
||||||
hpx->t2->sec_unc_err_mask_and = fields[16].integer.value;
|
|
||||||
hpx->t2->sec_unc_err_mask_or = fields[17].integer.value;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printk(KERN_WARNING
|
|
||||||
"%s: Type 2 Revision %d record not supported\n",
|
|
||||||
__func__, revision);
|
|
||||||
return AE_ERROR;
|
|
||||||
}
|
|
||||||
return AE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static acpi_status
|
|
||||||
acpi_run_hpx(acpi_handle handle, struct hotplug_params *hpx)
|
|
||||||
{
|
|
||||||
acpi_status status;
|
|
||||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
|
||||||
union acpi_object *package, *record, *fields;
|
|
||||||
u32 type;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Clear the return buffer with zeros */
|
|
||||||
memset(hpx, 0, sizeof(struct hotplug_params));
|
|
||||||
|
|
||||||
status = acpi_evaluate_object(handle, "_HPX", NULL, &buffer);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return status;
|
|
||||||
|
|
||||||
package = (union acpi_object *)buffer.pointer;
|
|
||||||
if (package->type != ACPI_TYPE_PACKAGE) {
|
|
||||||
status = AE_ERROR;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < package->package.count; i++) {
|
|
||||||
record = &package->package.elements[i];
|
|
||||||
if (record->type != ACPI_TYPE_PACKAGE) {
|
|
||||||
status = AE_ERROR;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
fields = record->package.elements;
|
|
||||||
if (fields[0].type != ACPI_TYPE_INTEGER ||
|
|
||||||
fields[1].type != ACPI_TYPE_INTEGER) {
|
|
||||||
status = AE_ERROR;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
type = fields[0].integer.value;
|
|
||||||
switch (type) {
|
|
||||||
case 0:
|
|
||||||
status = decode_type0_hpx_record(record, hpx);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
goto exit;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
status = decode_type1_hpx_record(record, hpx);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
goto exit;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
status = decode_type2_hpx_record(record, hpx);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
goto exit;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printk(KERN_ERR "%s: Type %d record not supported\n",
|
|
||||||
__func__, type);
|
|
||||||
status = AE_ERROR;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit:
|
|
||||||
kfree(buffer.pointer);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static acpi_status
|
|
||||||
acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
|
|
||||||
{
|
|
||||||
acpi_status status;
|
|
||||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
|
||||||
union acpi_object *package, *fields;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memset(hpp, 0, sizeof(struct hotplug_params));
|
|
||||||
|
|
||||||
status = acpi_evaluate_object(handle, "_HPP", NULL, &buffer);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return status;
|
|
||||||
|
|
||||||
package = (union acpi_object *) buffer.pointer;
|
|
||||||
if (package->type != ACPI_TYPE_PACKAGE ||
|
|
||||||
package->package.count != 4) {
|
|
||||||
status = AE_ERROR;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
fields = package->package.elements;
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
if (fields[i].type != ACPI_TYPE_INTEGER) {
|
|
||||||
status = AE_ERROR;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hpp->t0 = &hpp->type0_data;
|
|
||||||
hpp->t0->revision = 1;
|
|
||||||
hpp->t0->cache_line_size = fields[0].integer.value;
|
|
||||||
hpp->t0->latency_timer = fields[1].integer.value;
|
|
||||||
hpp->t0->enable_serr = fields[2].integer.value;
|
|
||||||
hpp->t0->enable_perr = fields[3].integer.value;
|
|
||||||
|
|
||||||
exit:
|
|
||||||
kfree(buffer.pointer);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* acpi_run_oshp - get control of hotplug from the firmware
|
/* acpi_run_oshp - get control of hotplug from the firmware
|
||||||
*
|
*
|
||||||
* @handle - the handle of the hotplug controller.
|
* @handle - the handle of the hotplug controller.
|
||||||
|
@ -283,48 +74,6 @@ static acpi_status acpi_run_oshp(acpi_handle handle)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pci_get_hp_params
|
|
||||||
*
|
|
||||||
* @dev - the pci_dev for which we want parameters
|
|
||||||
* @hpp - allocated by the caller
|
|
||||||
*/
|
|
||||||
int pci_get_hp_params(struct pci_dev *dev, struct hotplug_params *hpp)
|
|
||||||
{
|
|
||||||
acpi_status status;
|
|
||||||
acpi_handle handle, phandle;
|
|
||||||
struct pci_bus *pbus;
|
|
||||||
|
|
||||||
handle = NULL;
|
|
||||||
for (pbus = dev->bus; pbus; pbus = pbus->parent) {
|
|
||||||
handle = acpi_pci_get_bridge_handle(pbus);
|
|
||||||
if (handle)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* _HPP settings apply to all child buses, until another _HPP is
|
|
||||||
* encountered. If we don't find an _HPP for the input pci dev,
|
|
||||||
* look for it in the parent device scope since that would apply to
|
|
||||||
* this pci dev.
|
|
||||||
*/
|
|
||||||
while (handle) {
|
|
||||||
status = acpi_run_hpx(handle, hpp);
|
|
||||||
if (ACPI_SUCCESS(status))
|
|
||||||
return 0;
|
|
||||||
status = acpi_run_hpp(handle, hpp);
|
|
||||||
if (ACPI_SUCCESS(status))
|
|
||||||
return 0;
|
|
||||||
if (acpi_is_root_bridge(handle))
|
|
||||||
break;
|
|
||||||
status = acpi_get_parent(handle, &phandle);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
break;
|
|
||||||
handle = phandle;
|
|
||||||
}
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(pci_get_hp_params);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_get_hp_hw_control_from_firmware
|
* acpi_get_hp_hw_control_from_firmware
|
||||||
* @dev: the pci_dev of the bridge that has a hotplug controller
|
* @dev: the pci_dev of the bridge that has a hotplug controller
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/pci_hotplug.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/pci-aspm.h>
|
#include <linux/pci-aspm.h>
|
||||||
#include <linux/pci-acpi.h>
|
#include <linux/pci-acpi.h>
|
||||||
|
@ -98,6 +99,255 @@ phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle)
|
||||||
return (phys_addr_t)mcfg_addr;
|
return (phys_addr_t)mcfg_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static acpi_status
|
||||||
|
decode_type0_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
union acpi_object *fields = record->package.elements;
|
||||||
|
u32 revision = fields[1].integer.value;
|
||||||
|
|
||||||
|
switch (revision) {
|
||||||
|
case 1:
|
||||||
|
if (record->package.count != 6)
|
||||||
|
return AE_ERROR;
|
||||||
|
for (i = 2; i < 6; i++)
|
||||||
|
if (fields[i].type != ACPI_TYPE_INTEGER)
|
||||||
|
return AE_ERROR;
|
||||||
|
hpx->t0 = &hpx->type0_data;
|
||||||
|
hpx->t0->revision = revision;
|
||||||
|
hpx->t0->cache_line_size = fields[2].integer.value;
|
||||||
|
hpx->t0->latency_timer = fields[3].integer.value;
|
||||||
|
hpx->t0->enable_serr = fields[4].integer.value;
|
||||||
|
hpx->t0->enable_perr = fields[5].integer.value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(KERN_WARNING
|
||||||
|
"%s: Type 0 Revision %d record not supported\n",
|
||||||
|
__func__, revision);
|
||||||
|
return AE_ERROR;
|
||||||
|
}
|
||||||
|
return AE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static acpi_status
|
||||||
|
decode_type1_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
union acpi_object *fields = record->package.elements;
|
||||||
|
u32 revision = fields[1].integer.value;
|
||||||
|
|
||||||
|
switch (revision) {
|
||||||
|
case 1:
|
||||||
|
if (record->package.count != 5)
|
||||||
|
return AE_ERROR;
|
||||||
|
for (i = 2; i < 5; i++)
|
||||||
|
if (fields[i].type != ACPI_TYPE_INTEGER)
|
||||||
|
return AE_ERROR;
|
||||||
|
hpx->t1 = &hpx->type1_data;
|
||||||
|
hpx->t1->revision = revision;
|
||||||
|
hpx->t1->max_mem_read = fields[2].integer.value;
|
||||||
|
hpx->t1->avg_max_split = fields[3].integer.value;
|
||||||
|
hpx->t1->tot_max_split = fields[4].integer.value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(KERN_WARNING
|
||||||
|
"%s: Type 1 Revision %d record not supported\n",
|
||||||
|
__func__, revision);
|
||||||
|
return AE_ERROR;
|
||||||
|
}
|
||||||
|
return AE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static acpi_status
|
||||||
|
decode_type2_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
union acpi_object *fields = record->package.elements;
|
||||||
|
u32 revision = fields[1].integer.value;
|
||||||
|
|
||||||
|
switch (revision) {
|
||||||
|
case 1:
|
||||||
|
if (record->package.count != 18)
|
||||||
|
return AE_ERROR;
|
||||||
|
for (i = 2; i < 18; i++)
|
||||||
|
if (fields[i].type != ACPI_TYPE_INTEGER)
|
||||||
|
return AE_ERROR;
|
||||||
|
hpx->t2 = &hpx->type2_data;
|
||||||
|
hpx->t2->revision = revision;
|
||||||
|
hpx->t2->unc_err_mask_and = fields[2].integer.value;
|
||||||
|
hpx->t2->unc_err_mask_or = fields[3].integer.value;
|
||||||
|
hpx->t2->unc_err_sever_and = fields[4].integer.value;
|
||||||
|
hpx->t2->unc_err_sever_or = fields[5].integer.value;
|
||||||
|
hpx->t2->cor_err_mask_and = fields[6].integer.value;
|
||||||
|
hpx->t2->cor_err_mask_or = fields[7].integer.value;
|
||||||
|
hpx->t2->adv_err_cap_and = fields[8].integer.value;
|
||||||
|
hpx->t2->adv_err_cap_or = fields[9].integer.value;
|
||||||
|
hpx->t2->pci_exp_devctl_and = fields[10].integer.value;
|
||||||
|
hpx->t2->pci_exp_devctl_or = fields[11].integer.value;
|
||||||
|
hpx->t2->pci_exp_lnkctl_and = fields[12].integer.value;
|
||||||
|
hpx->t2->pci_exp_lnkctl_or = fields[13].integer.value;
|
||||||
|
hpx->t2->sec_unc_err_sever_and = fields[14].integer.value;
|
||||||
|
hpx->t2->sec_unc_err_sever_or = fields[15].integer.value;
|
||||||
|
hpx->t2->sec_unc_err_mask_and = fields[16].integer.value;
|
||||||
|
hpx->t2->sec_unc_err_mask_or = fields[17].integer.value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(KERN_WARNING
|
||||||
|
"%s: Type 2 Revision %d record not supported\n",
|
||||||
|
__func__, revision);
|
||||||
|
return AE_ERROR;
|
||||||
|
}
|
||||||
|
return AE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static acpi_status
|
||||||
|
acpi_run_hpx(acpi_handle handle, struct hotplug_params *hpx)
|
||||||
|
{
|
||||||
|
acpi_status status;
|
||||||
|
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||||
|
union acpi_object *package, *record, *fields;
|
||||||
|
u32 type;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Clear the return buffer with zeros */
|
||||||
|
memset(hpx, 0, sizeof(struct hotplug_params));
|
||||||
|
|
||||||
|
status = acpi_evaluate_object(handle, "_HPX", NULL, &buffer);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
package = (union acpi_object *)buffer.pointer;
|
||||||
|
if (package->type != ACPI_TYPE_PACKAGE) {
|
||||||
|
status = AE_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < package->package.count; i++) {
|
||||||
|
record = &package->package.elements[i];
|
||||||
|
if (record->type != ACPI_TYPE_PACKAGE) {
|
||||||
|
status = AE_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fields = record->package.elements;
|
||||||
|
if (fields[0].type != ACPI_TYPE_INTEGER ||
|
||||||
|
fields[1].type != ACPI_TYPE_INTEGER) {
|
||||||
|
status = AE_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = fields[0].integer.value;
|
||||||
|
switch (type) {
|
||||||
|
case 0:
|
||||||
|
status = decode_type0_hpx_record(record, hpx);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
goto exit;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
status = decode_type1_hpx_record(record, hpx);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
goto exit;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
status = decode_type2_hpx_record(record, hpx);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
goto exit;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(KERN_ERR "%s: Type %d record not supported\n",
|
||||||
|
__func__, type);
|
||||||
|
status = AE_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
kfree(buffer.pointer);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static acpi_status
|
||||||
|
acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
|
||||||
|
{
|
||||||
|
acpi_status status;
|
||||||
|
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||||
|
union acpi_object *package, *fields;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(hpp, 0, sizeof(struct hotplug_params));
|
||||||
|
|
||||||
|
status = acpi_evaluate_object(handle, "_HPP", NULL, &buffer);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
package = (union acpi_object *) buffer.pointer;
|
||||||
|
if (package->type != ACPI_TYPE_PACKAGE ||
|
||||||
|
package->package.count != 4) {
|
||||||
|
status = AE_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fields = package->package.elements;
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
if (fields[i].type != ACPI_TYPE_INTEGER) {
|
||||||
|
status = AE_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hpp->t0 = &hpp->type0_data;
|
||||||
|
hpp->t0->revision = 1;
|
||||||
|
hpp->t0->cache_line_size = fields[0].integer.value;
|
||||||
|
hpp->t0->latency_timer = fields[1].integer.value;
|
||||||
|
hpp->t0->enable_serr = fields[2].integer.value;
|
||||||
|
hpp->t0->enable_perr = fields[3].integer.value;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
kfree(buffer.pointer);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pci_get_hp_params
|
||||||
|
*
|
||||||
|
* @dev - the pci_dev for which we want parameters
|
||||||
|
* @hpp - allocated by the caller
|
||||||
|
*/
|
||||||
|
int pci_get_hp_params(struct pci_dev *dev, struct hotplug_params *hpp)
|
||||||
|
{
|
||||||
|
acpi_status status;
|
||||||
|
acpi_handle handle, phandle;
|
||||||
|
struct pci_bus *pbus;
|
||||||
|
|
||||||
|
handle = NULL;
|
||||||
|
for (pbus = dev->bus; pbus; pbus = pbus->parent) {
|
||||||
|
handle = acpi_pci_get_bridge_handle(pbus);
|
||||||
|
if (handle)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* _HPP settings apply to all child buses, until another _HPP is
|
||||||
|
* encountered. If we don't find an _HPP for the input pci dev,
|
||||||
|
* look for it in the parent device scope since that would apply to
|
||||||
|
* this pci dev.
|
||||||
|
*/
|
||||||
|
while (handle) {
|
||||||
|
status = acpi_run_hpx(handle, hpp);
|
||||||
|
if (ACPI_SUCCESS(status))
|
||||||
|
return 0;
|
||||||
|
status = acpi_run_hpp(handle, hpp);
|
||||||
|
if (ACPI_SUCCESS(status))
|
||||||
|
return 0;
|
||||||
|
if (acpi_is_root_bridge(handle))
|
||||||
|
break;
|
||||||
|
status = acpi_get_parent(handle, &phandle);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
break;
|
||||||
|
handle = phandle;
|
||||||
|
}
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_get_hp_params);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* _SxD returns the D-state with the highest power
|
* _SxD returns the D-state with the highest power
|
||||||
* (lowest D-state number) supported in the S-state "x".
|
* (lowest D-state number) supported in the S-state "x".
|
||||||
|
|
Loading…
Add table
Reference in a new issue