162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2014 IBM Corp.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _ASM_PNV_PCI_H
762306a36Sopenharmony_ci#define _ASM_PNV_PCI_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/pci.h>
1062306a36Sopenharmony_ci#include <linux/pci_hotplug.h>
1162306a36Sopenharmony_ci#include <linux/irq.h>
1262306a36Sopenharmony_ci#include <linux/of.h>
1362306a36Sopenharmony_ci#include <misc/cxl-base.h>
1462306a36Sopenharmony_ci#include <asm/opal-api.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define PCI_SLOT_ID_PREFIX	(1UL << 63)
1762306a36Sopenharmony_ci#define PCI_SLOT_ID(phb_id, bdfn)	\
1862306a36Sopenharmony_ci	(PCI_SLOT_ID_PREFIX | ((uint64_t)(bdfn) << 16) | (phb_id))
1962306a36Sopenharmony_ci#define PCI_PHB_SLOT_ID(phb_id)		(phb_id)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciextern int pnv_pci_get_slot_id(struct device_node *np, uint64_t *id);
2262306a36Sopenharmony_ciextern int pnv_pci_get_device_tree(uint32_t phandle, void *buf, uint64_t len);
2362306a36Sopenharmony_ciextern int pnv_pci_get_presence_state(uint64_t id, uint8_t *state);
2462306a36Sopenharmony_ciextern int pnv_pci_get_power_state(uint64_t id, uint8_t *state);
2562306a36Sopenharmony_ciextern int pnv_pci_set_power_state(uint64_t id, uint8_t state,
2662306a36Sopenharmony_ci				   struct opal_msg *msg);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciextern int pnv_pci_set_tunnel_bar(struct pci_dev *dev, uint64_t addr,
2962306a36Sopenharmony_ci				  int enable);
3062306a36Sopenharmony_ciint pnv_phb_to_cxl_mode(struct pci_dev *dev, uint64_t mode);
3162306a36Sopenharmony_ciint pnv_cxl_ioda_msi_setup(struct pci_dev *dev, unsigned int hwirq,
3262306a36Sopenharmony_ci			   unsigned int virq);
3362306a36Sopenharmony_ciint pnv_cxl_alloc_hwirqs(struct pci_dev *dev, int num);
3462306a36Sopenharmony_civoid pnv_cxl_release_hwirqs(struct pci_dev *dev, int hwirq, int num);
3562306a36Sopenharmony_ciint pnv_cxl_get_irq_count(struct pci_dev *dev);
3662306a36Sopenharmony_cistruct device_node *pnv_pci_get_phb_node(struct pci_dev *dev);
3762306a36Sopenharmony_ciint64_t pnv_opal_pci_msi_eoi(struct irq_data *d);
3862306a36Sopenharmony_cibool is_pnv_opal_msi(struct irq_chip *chip);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#ifdef CONFIG_CXL_BASE
4162306a36Sopenharmony_ciint pnv_cxl_alloc_hwirq_ranges(struct cxl_irq_ranges *irqs,
4262306a36Sopenharmony_ci			       struct pci_dev *dev, int num);
4362306a36Sopenharmony_civoid pnv_cxl_release_hwirq_ranges(struct cxl_irq_ranges *irqs,
4462306a36Sopenharmony_ci				  struct pci_dev *dev);
4562306a36Sopenharmony_ci#endif
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct pnv_php_slot {
4862306a36Sopenharmony_ci	struct hotplug_slot		slot;
4962306a36Sopenharmony_ci	uint64_t			id;
5062306a36Sopenharmony_ci	char				*name;
5162306a36Sopenharmony_ci	int				slot_no;
5262306a36Sopenharmony_ci	unsigned int			flags;
5362306a36Sopenharmony_ci#define PNV_PHP_FLAG_BROKEN_PDC		0x1
5462306a36Sopenharmony_ci	struct kref			kref;
5562306a36Sopenharmony_ci#define PNV_PHP_STATE_INITIALIZED	0
5662306a36Sopenharmony_ci#define PNV_PHP_STATE_REGISTERED	1
5762306a36Sopenharmony_ci#define PNV_PHP_STATE_POPULATED		2
5862306a36Sopenharmony_ci#define PNV_PHP_STATE_OFFLINE		3
5962306a36Sopenharmony_ci	int				state;
6062306a36Sopenharmony_ci	int				irq;
6162306a36Sopenharmony_ci	struct workqueue_struct		*wq;
6262306a36Sopenharmony_ci	struct device_node		*dn;
6362306a36Sopenharmony_ci	struct pci_dev			*pdev;
6462306a36Sopenharmony_ci	struct pci_bus			*bus;
6562306a36Sopenharmony_ci	bool				power_state_check;
6662306a36Sopenharmony_ci	u8				attention_state;
6762306a36Sopenharmony_ci	void				*fdt;
6862306a36Sopenharmony_ci	void				*dt;
6962306a36Sopenharmony_ci	struct of_changeset		ocs;
7062306a36Sopenharmony_ci	struct pnv_php_slot		*parent;
7162306a36Sopenharmony_ci	struct list_head		children;
7262306a36Sopenharmony_ci	struct list_head		link;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ciextern struct pnv_php_slot *pnv_php_find_slot(struct device_node *dn);
7562306a36Sopenharmony_ciextern int pnv_php_set_slot_power_state(struct hotplug_slot *slot,
7662306a36Sopenharmony_ci					uint8_t state);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#endif
79