]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
PCI: Move pci_get_hp_params() to drivers/pci/pci-acpi.c
authorBjorn Helgaas <bhelgaas@google.com>
Fri, 12 Sep 2014 21:23:14 +0000 (15:23 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Sat, 13 Sep 2014 02:01:27 +0000 (20:01 -0600)
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>
drivers/pci/hotplug/acpi_pcihp.c
drivers/pci/pci-acpi.c

index a94d850ae228c377387d036fd0f3af7e656130c6..2ac9a28d7fa14b6f81dd4c75da9c4aec2f078591 100644 (file)
 
 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
  *
  * @handle - the handle of the hotplug controller.
@@ -283,48 +74,6 @@ static acpi_status acpi_run_oshp(acpi_handle handle)
        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
  * @dev: the pci_dev of the bridge that has a hotplug controller
index 37263b0ebfe32570f49a3df7bfc027ab6cd562e0..06e0b41c397e0aed177676816a30047fb9f1e4b0 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/pci.h>
+#include <linux/pci_hotplug.h>
 #include <linux/module.h>
 #include <linux/pci-aspm.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;
 }
 
+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
  * (lowest D-state number) supported in the S-state "x".