Commit 4a2dbedd authored by Krzysztof Wilczynski's avatar Krzysztof Wilczynski Committed by Bjorn Helgaas

PCI/ACPI: Remove unnecessary struct hotplug_program_ops

Move the ACPI-specific structs hpx_type0, hpx_type1, hpx_type2 and
hpx_type3 to drivers/pci/pci-acpi.c as they are not used anywhere else.
Then remove the struct hotplug_program_ops that has been shared between
drivers/pci/probe.c and drivers/pci/pci-acpi.c from drivers/pci/pci.h as it
is no longer needed.

The struct hotplug_program_ops was added by 87fcf12e ("PCI/ACPI: Remove
the need for 'struct hotplug_params'") and replaced previously used struct
hotplug_params enabling the support for the _HPX Type 3 Setting Record that
was added by f873c51a ("PCI/ACPI: Implement _HPX Type 3 Setting
Record").

The new struct allowed for the static functions such program_hpx_type0(),
program_hpx_type1(), etc., from the drivers/pci/probe.c to be called from
the function pci_acpi_program_hp_params() in the drivers/pci/pci-acpi.c.

Previously a programming of _HPX Type 0 was as follows:

  drivers/pci/probe.c:

    program_hpx_type0()
    ...
    pci_configure_device()
      hp_ops = {
        .program_type0 = program_hpx_type0,
        ...
      }
      pci_acpi_program_hp_params(&hp_ops)

  drivers/pci/pci-acpi.c:

    pci_acpi_program_hp_params(&hp_ops)
      acpi_run_hpx(hp_ops)
        decode_type0_hpx_record()
          hp_ops->program_type0     # program_hpx_type0() called via hp_ops

After the ACPI-specific functions, structs, enums, etc., have been moved to
drivers/pci/pci-acpi.c there is no need for the hotplug_program_ops as all
of the _HPX Type 0, 1, 2 and 3 are directly accessible.

Link: https://lore.kernel.org/r/20190827094951.10613-4-kw@linux.comSigned-off-by: default avatarKrzysztof Wilczynski <kw@linux.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 8c3aac6e
...@@ -118,6 +118,15 @@ phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle) ...@@ -118,6 +118,15 @@ phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle)
return (phys_addr_t)mcfg_addr; return (phys_addr_t)mcfg_addr;
} }
/* _HPX PCI Setting Record (Type 0); same as _HPP */
struct hpx_type0 {
u32 revision; /* Not present in _HPP */
u8 cache_line_size; /* Not applicable to PCIe */
u8 latency_timer; /* Not applicable to PCIe */
u8 enable_serr;
u8 enable_perr;
};
static struct hpx_type0 pci_default_type0 = { static struct hpx_type0 pci_default_type0 = {
.revision = 1, .revision = 1,
.cache_line_size = 8, .cache_line_size = 8,
...@@ -126,7 +135,7 @@ static struct hpx_type0 pci_default_type0 = { ...@@ -126,7 +135,7 @@ static struct hpx_type0 pci_default_type0 = {
.enable_perr = 0, .enable_perr = 0,
}; };
void program_hpx_type0(struct pci_dev *dev, struct hpx_type0 *hpx) static void program_hpx_type0(struct pci_dev *dev, struct hpx_type0 *hpx)
{ {
u16 pci_cmd, pci_bctl; u16 pci_cmd, pci_bctl;
...@@ -187,7 +196,15 @@ static acpi_status decode_type0_hpx_record(union acpi_object *record, ...@@ -187,7 +196,15 @@ static acpi_status decode_type0_hpx_record(union acpi_object *record,
return AE_OK; return AE_OK;
} }
void program_hpx_type1(struct pci_dev *dev, struct hpx_type1 *hpx) /* _HPX PCI-X Setting Record (Type 1) */
struct hpx_type1 {
u32 revision;
u8 max_mem_read;
u8 avg_max_split;
u16 tot_max_split;
};
static void program_hpx_type1(struct pci_dev *dev, struct hpx_type1 *hpx)
{ {
int pos; int pos;
...@@ -243,7 +260,28 @@ static bool pcie_root_rcb_set(struct pci_dev *dev) ...@@ -243,7 +260,28 @@ static bool pcie_root_rcb_set(struct pci_dev *dev)
return false; return false;
} }
void program_hpx_type2(struct pci_dev *dev, struct hpx_type2 *hpx) /* _HPX PCI Express Setting Record (Type 2) */
struct hpx_type2 {
u32 revision;
u32 unc_err_mask_and;
u32 unc_err_mask_or;
u32 unc_err_sever_and;
u32 unc_err_sever_or;
u32 cor_err_mask_and;
u32 cor_err_mask_or;
u32 adv_err_cap_and;
u32 adv_err_cap_or;
u16 pci_exp_devctl_and;
u16 pci_exp_devctl_or;
u16 pci_exp_lnkctl_and;
u16 pci_exp_lnkctl_or;
u32 sec_unc_err_sever_and;
u32 sec_unc_err_sever_or;
u32 sec_unc_err_mask_and;
u32 sec_unc_err_mask_or;
};
static void program_hpx_type2(struct pci_dev *dev, struct hpx_type2 *hpx)
{ {
int pos; int pos;
u32 reg32; u32 reg32;
...@@ -369,6 +407,24 @@ static acpi_status decode_type2_hpx_record(union acpi_object *record, ...@@ -369,6 +407,24 @@ static acpi_status decode_type2_hpx_record(union acpi_object *record,
return AE_OK; return AE_OK;
} }
/* _HPX PCI Express Setting Record (Type 3) */
struct hpx_type3 {
u16 device_type;
u16 function_type;
u16 config_space_location;
u16 pci_exp_cap_id;
u16 pci_exp_cap_ver;
u16 pci_exp_vendor_id;
u16 dvsec_id;
u16 dvsec_rev;
u16 match_offset;
u32 match_mask_and;
u32 match_value;
u16 reg_offset;
u32 reg_mask_and;
u32 reg_mask_or;
};
enum hpx_type3_dev_type { enum hpx_type3_dev_type {
HPX_TYPE_ENDPOINT = BIT(0), HPX_TYPE_ENDPOINT = BIT(0),
HPX_TYPE_LEG_END = BIT(1), HPX_TYPE_LEG_END = BIT(1),
...@@ -498,7 +554,7 @@ static void program_hpx_type3_register(struct pci_dev *dev, ...@@ -498,7 +554,7 @@ static void program_hpx_type3_register(struct pci_dev *dev,
pos, orig_value, write_reg); pos, orig_value, write_reg);
} }
void program_hpx_type3(struct pci_dev *dev, struct hpx_type3 *hpx) static void program_hpx_type3(struct pci_dev *dev, struct hpx_type3 *hpx)
{ {
if (!hpx) if (!hpx)
return; return;
...@@ -529,8 +585,7 @@ static void parse_hpx3_register(struct hpx_type3 *hpx3_reg, ...@@ -529,8 +585,7 @@ static void parse_hpx3_register(struct hpx_type3 *hpx3_reg,
} }
static acpi_status program_type3_hpx_record(struct pci_dev *dev, static acpi_status program_type3_hpx_record(struct pci_dev *dev,
union acpi_object *record, union acpi_object *record)
const struct hotplug_program_ops *hp_ops)
{ {
union acpi_object *fields = record->package.elements; union acpi_object *fields = record->package.elements;
u32 desc_count, expected_length, revision; u32 desc_count, expected_length, revision;
...@@ -554,7 +609,7 @@ static acpi_status program_type3_hpx_record(struct pci_dev *dev, ...@@ -554,7 +609,7 @@ static acpi_status program_type3_hpx_record(struct pci_dev *dev,
for (i = 0; i < desc_count; i++) { for (i = 0; i < desc_count; i++) {
reg_fields = fields + 3 + i * 14; reg_fields = fields + 3 + i * 14;
parse_hpx3_register(&hpx3, reg_fields); parse_hpx3_register(&hpx3, reg_fields);
hp_ops->program_type3(dev, &hpx3); program_hpx_type3(dev, &hpx3);
} }
break; break;
...@@ -567,8 +622,7 @@ static acpi_status program_type3_hpx_record(struct pci_dev *dev, ...@@ -567,8 +622,7 @@ static acpi_status program_type3_hpx_record(struct pci_dev *dev,
return AE_OK; return AE_OK;
} }
static acpi_status acpi_run_hpx(struct pci_dev *dev, acpi_handle handle, static acpi_status acpi_run_hpx(struct pci_dev *dev, acpi_handle handle)
const struct hotplug_program_ops *hp_ops)
{ {
acpi_status status; acpi_status status;
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
...@@ -610,24 +664,24 @@ static acpi_status acpi_run_hpx(struct pci_dev *dev, acpi_handle handle, ...@@ -610,24 +664,24 @@ static acpi_status acpi_run_hpx(struct pci_dev *dev, acpi_handle handle,
status = decode_type0_hpx_record(record, &hpx0); status = decode_type0_hpx_record(record, &hpx0);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
goto exit; goto exit;
hp_ops->program_type0(dev, &hpx0); program_hpx_type0(dev, &hpx0);
break; break;
case 1: case 1:
memset(&hpx1, 0, sizeof(hpx1)); memset(&hpx1, 0, sizeof(hpx1));
status = decode_type1_hpx_record(record, &hpx1); status = decode_type1_hpx_record(record, &hpx1);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
goto exit; goto exit;
hp_ops->program_type1(dev, &hpx1); program_hpx_type1(dev, &hpx1);
break; break;
case 2: case 2:
memset(&hpx2, 0, sizeof(hpx2)); memset(&hpx2, 0, sizeof(hpx2));
status = decode_type2_hpx_record(record, &hpx2); status = decode_type2_hpx_record(record, &hpx2);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
goto exit; goto exit;
hp_ops->program_type2(dev, &hpx2); program_hpx_type2(dev, &hpx2);
break; break;
case 3: case 3:
status = program_type3_hpx_record(dev, record, hp_ops); status = program_type3_hpx_record(dev, record);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
goto exit; goto exit;
break; break;
...@@ -643,8 +697,7 @@ static acpi_status acpi_run_hpx(struct pci_dev *dev, acpi_handle handle, ...@@ -643,8 +697,7 @@ static acpi_status acpi_run_hpx(struct pci_dev *dev, acpi_handle handle,
return status; return status;
} }
static acpi_status acpi_run_hpp(struct pci_dev *dev, acpi_handle handle, static acpi_status acpi_run_hpp(struct pci_dev *dev, acpi_handle handle)
const struct hotplug_program_ops *hp_ops)
{ {
acpi_status status; acpi_status status;
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
...@@ -679,20 +732,18 @@ static acpi_status acpi_run_hpp(struct pci_dev *dev, acpi_handle handle, ...@@ -679,20 +732,18 @@ static acpi_status acpi_run_hpp(struct pci_dev *dev, acpi_handle handle,
hpx0.enable_serr = fields[2].integer.value; hpx0.enable_serr = fields[2].integer.value;
hpx0.enable_perr = fields[3].integer.value; hpx0.enable_perr = fields[3].integer.value;
hp_ops->program_type0(dev, &hpx0); program_hpx_type0(dev, &hpx0);
exit: exit:
kfree(buffer.pointer); kfree(buffer.pointer);
return status; return status;
} }
/* pci_get_hp_params /* pci_acpi_program_hp_params
* *
* @dev - the pci_dev for which we want parameters * @dev - the pci_dev for which we want parameters
* @hpp - allocated by the caller
*/ */
int pci_acpi_program_hp_params(struct pci_dev *dev, int pci_acpi_program_hp_params(struct pci_dev *dev)
const struct hotplug_program_ops *hp_ops)
{ {
acpi_status status; acpi_status status;
acpi_handle handle, phandle; acpi_handle handle, phandle;
...@@ -715,10 +766,10 @@ int pci_acpi_program_hp_params(struct pci_dev *dev, ...@@ -715,10 +766,10 @@ int pci_acpi_program_hp_params(struct pci_dev *dev,
* this pci dev. * this pci dev.
*/ */
while (handle) { while (handle) {
status = acpi_run_hpx(dev, handle, hp_ops); status = acpi_run_hpx(dev, handle);
if (ACPI_SUCCESS(status)) if (ACPI_SUCCESS(status))
return 0; return 0;
status = acpi_run_hpp(dev, handle, hp_ops); status = acpi_run_hpp(dev, handle);
if (ACPI_SUCCESS(status)) if (ACPI_SUCCESS(status))
return 0; return 0;
if (acpi_is_root_bridge(handle)) if (acpi_is_root_bridge(handle))
......
...@@ -608,80 +608,10 @@ static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { } ...@@ -608,80 +608,10 @@ static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { }
static inline void pci_aer_clear_device_status(struct pci_dev *dev) { } static inline void pci_aer_clear_device_status(struct pci_dev *dev) { }
#endif #endif
/* _HPX PCI Setting Record (Type 0); same as _HPP */
struct hpx_type0 {
u32 revision; /* Not present in _HPP */
u8 cache_line_size; /* Not applicable to PCIe */
u8 latency_timer; /* Not applicable to PCIe */
u8 enable_serr;
u8 enable_perr;
};
/* _HPX PCI-X Setting Record (Type 1) */
struct hpx_type1 {
u32 revision;
u8 max_mem_read;
u8 avg_max_split;
u16 tot_max_split;
};
/* _HPX PCI Express Setting Record (Type 2) */
struct hpx_type2 {
u32 revision;
u32 unc_err_mask_and;
u32 unc_err_mask_or;
u32 unc_err_sever_and;
u32 unc_err_sever_or;
u32 cor_err_mask_and;
u32 cor_err_mask_or;
u32 adv_err_cap_and;
u32 adv_err_cap_or;
u16 pci_exp_devctl_and;
u16 pci_exp_devctl_or;
u16 pci_exp_lnkctl_and;
u16 pci_exp_lnkctl_or;
u32 sec_unc_err_sever_and;
u32 sec_unc_err_sever_or;
u32 sec_unc_err_mask_and;
u32 sec_unc_err_mask_or;
};
/* _HPX PCI Express Setting Record (Type 3) */
struct hpx_type3 {
u16 device_type;
u16 function_type;
u16 config_space_location;
u16 pci_exp_cap_id;
u16 pci_exp_cap_ver;
u16 pci_exp_vendor_id;
u16 dvsec_id;
u16 dvsec_rev;
u16 match_offset;
u32 match_mask_and;
u32 match_value;
u16 reg_offset;
u32 reg_mask_and;
u32 reg_mask_or;
};
void program_hpx_type0(struct pci_dev *dev, struct hpx_type0 *hpx);
void program_hpx_type1(struct pci_dev *dev, struct hpx_type1 *hpx);
void program_hpx_type2(struct pci_dev *dev, struct hpx_type2 *hpx);
void program_hpx_type3(struct pci_dev *dev, struct hpx_type3 *hpx);
struct hotplug_program_ops {
void (*program_type0)(struct pci_dev *dev, struct hpx_type0 *hpx);
void (*program_type1)(struct pci_dev *dev, struct hpx_type1 *hpx);
void (*program_type2)(struct pci_dev *dev, struct hpx_type2 *hpx);
void (*program_type3)(struct pci_dev *dev, struct hpx_type3 *hpx);
};
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
int pci_acpi_program_hp_params(struct pci_dev *dev, int pci_acpi_program_hp_params(struct pci_dev *dev);
const struct hotplug_program_ops *hp_ops);
#else #else
static inline int pci_acpi_program_hp_params(struct pci_dev *dev, static inline int pci_acpi_program_hp_params(struct pci_dev *dev)
const struct hotplug_program_ops *hp_ops)
{ {
return -ENODEV; return -ENODEV;
} }
......
...@@ -2100,13 +2100,6 @@ static void pci_configure_serr(struct pci_dev *dev) ...@@ -2100,13 +2100,6 @@ static void pci_configure_serr(struct pci_dev *dev)
static void pci_configure_device(struct pci_dev *dev) static void pci_configure_device(struct pci_dev *dev)
{ {
static const struct hotplug_program_ops hp_ops = {
.program_type0 = program_hpx_type0,
.program_type1 = program_hpx_type1,
.program_type2 = program_hpx_type2,
.program_type3 = program_hpx_type3,
};
pci_configure_mps(dev); pci_configure_mps(dev);
pci_configure_extended_tags(dev, NULL); pci_configure_extended_tags(dev, NULL);
pci_configure_relaxed_ordering(dev); pci_configure_relaxed_ordering(dev);
...@@ -2114,7 +2107,7 @@ static void pci_configure_device(struct pci_dev *dev) ...@@ -2114,7 +2107,7 @@ static void pci_configure_device(struct pci_dev *dev)
pci_configure_eetlp_prefix(dev); pci_configure_eetlp_prefix(dev);
pci_configure_serr(dev); pci_configure_serr(dev);
pci_acpi_program_hp_params(dev, &hp_ops); pci_acpi_program_hp_params(dev);
} }
static void pci_release_capabilities(struct pci_dev *dev) static void pci_release_capabilities(struct pci_dev *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment