Commit | Line | Data |
---|---|---|
80c49c7e IM |
1 | /* |
2 | * Copyright 2014 IBM Corp. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version | |
7 | * 2 of the License, or (at your option) any later version. | |
8 | */ | |
9 | ||
10 | #ifndef _ASM_PNV_PCI_H | |
11 | #define _ASM_PNV_PCI_H | |
12 | ||
13 | #include <linux/pci.h> | |
89379f16 | 14 | #include <linux/pci_hotplug.h> |
ec249dd8 | 15 | #include <misc/cxl-base.h> |
ea0d856c | 16 | #include <asm/opal-api.h> |
80c49c7e | 17 | |
ebe22531 GS |
18 | #define PCI_SLOT_ID_PREFIX 0x8000000000000000 |
19 | #define PCI_SLOT_ID(phb_id, bdfn) \ | |
20 | (PCI_SLOT_ID_PREFIX | ((uint64_t)(bdfn) << 16) | (phb_id)) | |
21 | ||
7e19bf32 | 22 | extern int pnv_pci_get_slot_id(struct device_node *np, uint64_t *id); |
ea0d856c GS |
23 | extern int pnv_pci_get_device_tree(uint32_t phandle, void *buf, uint64_t len); |
24 | extern int pnv_pci_get_presence_state(uint64_t id, uint8_t *state); | |
25 | extern int pnv_pci_get_power_state(uint64_t id, uint8_t *state); | |
26 | extern int pnv_pci_set_power_state(uint64_t id, uint8_t state, | |
27 | struct opal_msg *msg); | |
7e19bf32 | 28 | |
1212aa1c | 29 | int pnv_phb_to_cxl_mode(struct pci_dev *dev, uint64_t mode); |
80c49c7e IM |
30 | int pnv_cxl_ioda_msi_setup(struct pci_dev *dev, unsigned int hwirq, |
31 | unsigned int virq); | |
32 | int pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num); | |
33 | void pnv_cxl_release_hwirqs(struct pci_dev *dev, int hwirq, int num); | |
34 | int pnv_cxl_get_irq_count(struct pci_dev *dev); | |
6f963ec2 | 35 | struct device_node *pnv_pci_get_phb_node(struct pci_dev *dev); |
80c49c7e IM |
36 | |
37 | #ifdef CONFIG_CXL_BASE | |
38 | int pnv_cxl_alloc_hwirq_ranges(struct cxl_irq_ranges *irqs, | |
39 | struct pci_dev *dev, int num); | |
40 | void pnv_cxl_release_hwirq_ranges(struct cxl_irq_ranges *irqs, | |
41 | struct pci_dev *dev); | |
4361b034 IM |
42 | |
43 | /* Support for the cxl kernel api on the real PHB (instead of vPHB) */ | |
44 | int pnv_cxl_enable_phb_kernel_api(struct pci_controller *hose, bool enable); | |
45 | bool pnv_pci_on_cxl_phb(struct pci_dev *dev); | |
46 | struct cxl_afu *pnv_cxl_phb_to_afu(struct pci_controller *hose); | |
47 | void pnv_cxl_phb_set_peer_afu(struct pci_dev *dev, struct cxl_afu *afu); | |
48 | ||
80c49c7e IM |
49 | #endif |
50 | ||
89379f16 AD |
51 | struct pnv_php_slot { |
52 | struct hotplug_slot slot; | |
53 | struct hotplug_slot_info slot_info; | |
54 | uint64_t id; | |
55 | char *name; | |
56 | int slot_no; | |
57 | struct kref kref; | |
58 | #define PNV_PHP_STATE_INITIALIZED 0 | |
59 | #define PNV_PHP_STATE_REGISTERED 1 | |
60 | #define PNV_PHP_STATE_POPULATED 2 | |
61 | #define PNV_PHP_STATE_OFFLINE 3 | |
62 | int state; | |
63 | struct device_node *dn; | |
64 | struct pci_dev *pdev; | |
65 | struct pci_bus *bus; | |
66 | bool power_state_check; | |
67 | void *fdt; | |
68 | void *dt; | |
69 | struct of_changeset ocs; | |
70 | struct pnv_php_slot *parent; | |
71 | struct list_head children; | |
72 | struct list_head link; | |
73 | }; | |
74 | extern struct pnv_php_slot *pnv_php_find_slot(struct device_node *dn); | |
75 | extern int pnv_php_set_slot_power_state(struct hotplug_slot *slot, | |
76 | uint8_t state); | |
77 | ||
80c49c7e | 78 | #endif |