pci-acpi.h 3.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * File		pci-acpi.h
 *
 * Copyright (C) 2004 Intel
 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
 */

#ifndef _PCI_ACPI_H_
#define _PCI_ACPI_H_

11 12
#include <linux/acpi.h>

L
Linus Torvalds 已提交
13
#ifdef CONFIG_ACPI
14 15 16 17 18
extern acpi_status pci_acpi_add_bus_pm_notifier(struct acpi_device *dev);
static inline acpi_status pci_acpi_remove_bus_pm_notifier(struct acpi_device *dev)
{
	return acpi_remove_pm_notifier(dev);
}
19 20
extern acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev,
					     struct pci_dev *pci_dev);
21 22 23 24
static inline acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev)
{
	return acpi_remove_pm_notifier(dev);
}
25
extern phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle);
26

27 28
extern phys_addr_t pci_mcfg_lookup(u16 domain, struct resource *bus_res);

29 30
static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
{
31
	struct pci_bus *pbus = pdev->bus;
32

33
	/* Find a PCI root bus */
34
	while (!pci_is_root_bus(pbus))
35
		pbus = pbus->parent;
36

37
	return ACPI_HANDLE(pbus->bridge);
38
}
39 40 41

static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)
{
42 43 44 45
	struct device *dev;

	if (pci_is_root_bus(pbus))
		dev = pbus->bridge;
46 47 48 49 50
	else {
		/* If pbus is a virtual bus, there is no bridge to it */
		if (!pbus->self)
			return NULL;

51
		dev = &pbus->self->dev;
52
	}
53

54
	return ACPI_HANDLE(dev);
55
}
56

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
struct acpi_pci_root;
struct acpi_pci_root_ops;

struct acpi_pci_root_info {
	struct acpi_pci_root		*root;
	struct acpi_device		*bridge;
	struct acpi_pci_root_ops	*ops;
	struct list_head		resources;
	char				name[16];
};

struct acpi_pci_root_ops {
	struct pci_ops *pci_ops;
	int (*init_info)(struct acpi_pci_root_info *info);
	void (*release_info)(struct acpi_pci_root_info *info);
	int (*prepare_resources)(struct acpi_pci_root_info *info);
};

extern int acpi_pci_probe_root_resources(struct acpi_pci_root_info *info);
extern struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
					    struct acpi_pci_root_ops *ops,
					    struct acpi_pci_root_info *info,
					    void *sd);

81 82
void acpi_pci_add_bus(struct pci_bus *bus);
void acpi_pci_remove_bus(struct pci_bus *bus);
83 84 85

#ifdef	CONFIG_ACPI_PCI_SLOT
void acpi_pci_slot_init(void);
86
void acpi_pci_slot_enumerate(struct pci_bus *bus);
87 88 89
void acpi_pci_slot_remove(struct pci_bus *bus);
#else
static inline void acpi_pci_slot_init(void) { }
90
static inline void acpi_pci_slot_enumerate(struct pci_bus *bus) { }
91 92 93
static inline void acpi_pci_slot_remove(struct pci_bus *bus) { }
#endif

94 95
#ifdef	CONFIG_HOTPLUG_PCI_ACPI
void acpiphp_init(void);
96
void acpiphp_enumerate_slots(struct pci_bus *bus);
97
void acpiphp_remove_slots(struct pci_bus *bus);
98
void acpiphp_check_host_bridge(struct acpi_device *adev);
99 100
#else
static inline void acpiphp_init(void) { }
101
static inline void acpiphp_enumerate_slots(struct pci_bus *bus) { }
102
static inline void acpiphp_remove_slots(struct pci_bus *bus) { }
103
static inline void acpiphp_check_host_bridge(struct acpi_device *adev) { }
104 105
#endif

106 107
extern const u8 pci_acpi_dsm_uuid[];
#define DEVICE_LABEL_DSM	0x07
108 109
#define RESET_DELAY_DSM		0x08
#define FUNCTION_DELAY_DSM	0x09
110

111 112 113 114
#else	/* CONFIG_ACPI */
static inline void acpi_pci_add_bus(struct pci_bus *bus) { }
static inline void acpi_pci_remove_bus(struct pci_bus *bus) { }
#endif	/* CONFIG_ACPI */
L
Linus Torvalds 已提交
115

116 117 118 119 120 121
#ifdef CONFIG_ACPI_APEI
extern bool aer_acpi_firmware_first(void);
#else
static inline bool aer_acpi_firmware_first(void) { return false; }
#endif

L
Linus Torvalds 已提交
122
#endif	/* _PCI_ACPI_H_ */