1*28d09237Sjsg /* $OpenBSD: pci_machdep.h,v 1.5 2024/05/22 05:51:49 jsg Exp $ */ 286392ca6Skettenis 386392ca6Skettenis /* 486392ca6Skettenis * Copyright (c) 2003-2004 Opsycon AB (www.opsycon.se / www.opsycon.com) 586392ca6Skettenis * 686392ca6Skettenis * Redistribution and use in source and binary forms, with or without 786392ca6Skettenis * modification, are permitted provided that the following conditions 886392ca6Skettenis * are met: 986392ca6Skettenis * 1. Redistributions of source code must retain the above copyright 1086392ca6Skettenis * notice, this list of conditions and the following disclaimer. 1186392ca6Skettenis * 2. Redistributions in binary form must reproduce the above copyright 1286392ca6Skettenis * notice, this list of conditions and the following disclaimer in the 1386392ca6Skettenis * documentation and/or other materials provided with the distribution. 1486392ca6Skettenis * 1586392ca6Skettenis * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 1686392ca6Skettenis * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1786392ca6Skettenis * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1886392ca6Skettenis * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 1986392ca6Skettenis * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2086392ca6Skettenis * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2186392ca6Skettenis * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2286392ca6Skettenis * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2386392ca6Skettenis * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2486392ca6Skettenis * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2586392ca6Skettenis * SUCH DAMAGE. 2686392ca6Skettenis * 2786392ca6Skettenis */ 2886392ca6Skettenis 2986392ca6Skettenis typedef struct machine_pci_chipset *pci_chipset_tag_t; 30bbd52f55Skettenis typedef uint64_t pcitag_t; 3186392ca6Skettenis 3229be823cSderaadt #define PCITAG_NODE(x) ((x) >> 32) 3329be823cSderaadt #define PCITAG_OFFSET(x) ((x) & 0xffffffff) 3429be823cSderaadt 3586392ca6Skettenis /* Supported interrupt types. */ 3686392ca6Skettenis #define PCI_NONE 0 3786392ca6Skettenis #define PCI_INTX 1 3886392ca6Skettenis #define PCI_MSI 2 3986392ca6Skettenis #define PCI_MSIX 3 4086392ca6Skettenis 4186392ca6Skettenis typedef struct { 4286392ca6Skettenis pci_chipset_tag_t ih_pc; 4386392ca6Skettenis pcitag_t ih_tag; 4486392ca6Skettenis int ih_intrpin; 4586392ca6Skettenis int ih_type; 4686392ca6Skettenis bus_dma_tag_t ih_dmat; 4786392ca6Skettenis } pci_intr_handle_t; 4886392ca6Skettenis 4986392ca6Skettenis struct pci_attach_args; 5086392ca6Skettenis 5186392ca6Skettenis /* 5286392ca6Skettenis * Machine-specific PCI structure and type definitions. 5386392ca6Skettenis * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. 5486392ca6Skettenis */ 5586392ca6Skettenis struct machine_pci_chipset { 5686392ca6Skettenis void *pc_conf_v; 5786392ca6Skettenis void (*pc_attach_hook)(struct device *, 5886392ca6Skettenis struct device *, struct pcibus_attach_args *); 5986392ca6Skettenis int (*pc_bus_maxdevs)(void *, int); 6086392ca6Skettenis pcitag_t (*pc_make_tag)(void *, int, int, int); 6186392ca6Skettenis void (*pc_decompose_tag)(void *, pcitag_t, int *, 6286392ca6Skettenis int *, int *); 6386392ca6Skettenis int (*pc_conf_size)(void *, pcitag_t); 6486392ca6Skettenis pcireg_t (*pc_conf_read)(void *, pcitag_t, int); 6586392ca6Skettenis void (*pc_conf_write)(void *, pcitag_t, int, pcireg_t); 6686392ca6Skettenis int (*pc_probe_device_hook)(void *, struct pci_attach_args *); 6786392ca6Skettenis 6886392ca6Skettenis void *pc_intr_v; 6986392ca6Skettenis int (*pc_intr_map)(struct pci_attach_args *, 7086392ca6Skettenis pci_intr_handle_t *); 7186392ca6Skettenis int (*pc_intr_map_msi)(struct pci_attach_args *, 7286392ca6Skettenis pci_intr_handle_t *); 7356d02c00Skettenis int (*pc_intr_map_msivec)(struct pci_attach_args *, 7456d02c00Skettenis int, pci_intr_handle_t *); 7586392ca6Skettenis int (*pc_intr_map_msix)(struct pci_attach_args *, 7686392ca6Skettenis int, pci_intr_handle_t *); 7786392ca6Skettenis const char *(*pc_intr_string)(void *, pci_intr_handle_t); 7886392ca6Skettenis void *(*pc_intr_establish)(void *, pci_intr_handle_t, 7986392ca6Skettenis int, struct cpu_info *, int (*)(void *), void *, 8086392ca6Skettenis char *); 8186392ca6Skettenis void (*pc_intr_disestablish)(void *, void *); 8286392ca6Skettenis }; 8386392ca6Skettenis 8486392ca6Skettenis /* 8586392ca6Skettenis * Functions provided to machine-independent PCI code. 8686392ca6Skettenis */ 8786392ca6Skettenis #define pci_attach_hook(p, s, pba) \ 8886392ca6Skettenis (*(pba)->pba_pc->pc_attach_hook)((p), (s), (pba)) 8986392ca6Skettenis #define pci_bus_maxdevs(c, b) \ 9086392ca6Skettenis (*(c)->pc_bus_maxdevs)((c)->pc_conf_v, (b)) 9186392ca6Skettenis #define pci_make_tag(c, b, d, f) \ 9286392ca6Skettenis (*(c)->pc_make_tag)((c)->pc_conf_v, (b), (d), (f)) 9386392ca6Skettenis #define pci_decompose_tag(c, t, bp, dp, fp) \ 9486392ca6Skettenis (*(c)->pc_decompose_tag)((c)->pc_conf_v, (t), (bp), (dp), (fp)) 9586392ca6Skettenis #define pci_conf_size(c, t) \ 9686392ca6Skettenis (*(c)->pc_conf_size)((c)->pc_conf_v, (t)) 9786392ca6Skettenis #define pci_conf_read(c, t, r) \ 9886392ca6Skettenis (*(c)->pc_conf_read)((c)->pc_conf_v, (t), (r)) 9986392ca6Skettenis #define pci_conf_write(c, t, r, v) \ 10086392ca6Skettenis (*(c)->pc_conf_write)((c)->pc_conf_v, (t), (r), (v)) 10186392ca6Skettenis #define pci_probe_device_hook(c, a) \ 10286392ca6Skettenis (*(c)->pc_probe_device_hook)((c)->pc_conf_v, (a)) 10386392ca6Skettenis #define pci_intr_map(c, ihp) \ 10486392ca6Skettenis (*(c)->pa_pc->pc_intr_map)((c), (ihp)) 10586392ca6Skettenis #define pci_intr_map_msi(c, ihp) \ 10686392ca6Skettenis (*(c)->pa_pc->pc_intr_map_msi)((c), (ihp)) 10786392ca6Skettenis #define pci_intr_map_msix(c, vec, ihp) \ 10886392ca6Skettenis (*(c)->pa_pc->pc_intr_map_msix)((c), (vec), (ihp)) 10986392ca6Skettenis #define pci_intr_string(c, ih) \ 11086392ca6Skettenis (*(c)->pc_intr_string)((c)->pc_intr_v, (ih)) 11186392ca6Skettenis #define pci_intr_establish(c, ih, l, h, a, nm) \ 11286392ca6Skettenis (*(c)->pc_intr_establish)((c)->pc_intr_v, (ih), (l), NULL, (h), (a),\ 11386392ca6Skettenis (nm)) 11486392ca6Skettenis #define pci_intr_establish_cpu(c, ih, l, ci, h, a, nm) \ 11586392ca6Skettenis (*(c)->pc_intr_establish)((c)->pc_intr_v, (ih), (l), (ci), (h), (a),\ 11686392ca6Skettenis (nm)) 11786392ca6Skettenis #define pci_intr_disestablish(c, iv) \ 11886392ca6Skettenis (*(c)->pc_intr_disestablish)((c)->pc_intr_v, (iv)) 11986392ca6Skettenis 12086392ca6Skettenis #define pci_min_powerstate(c, t) (PCI_PMCSR_STATE_D3) 12186392ca6Skettenis #define pci_set_powerstate_md(c, t, s, p) 12286392ca6Skettenis 12386392ca6Skettenis #define pci_dev_postattach(a, b) 12486392ca6Skettenis 12586392ca6Skettenis void pci_mcfg_init(bus_space_tag_t, bus_addr_t, int, int, int); 12686392ca6Skettenis 12786392ca6Skettenis void pci_msi_enable(pci_chipset_tag_t, pcitag_t, bus_addr_t, uint32_t); 12886392ca6Skettenis void pci_msix_enable(pci_chipset_tag_t, pcitag_t, bus_space_tag_t, 12986392ca6Skettenis int, bus_addr_t, uint32_t); 13086392ca6Skettenis int _pci_intr_map_msi(struct pci_attach_args *, pci_intr_handle_t *); 13156d02c00Skettenis int _pci_intr_map_msivec(struct pci_attach_args *, int, 13256d02c00Skettenis pci_intr_handle_t *); 13386392ca6Skettenis int _pci_intr_map_msix(struct pci_attach_args *, int, pci_intr_handle_t *); 13486392ca6Skettenis 13586392ca6Skettenis #define __HAVE_PCI_MSIX 13686392ca6Skettenis 13786392ca6Skettenis int pci_msix_table_map(pci_chipset_tag_t, pcitag_t, 13886392ca6Skettenis bus_space_tag_t, bus_space_handle_t *); 13986392ca6Skettenis void pci_msix_table_unmap(pci_chipset_tag_t, pcitag_t, 14086392ca6Skettenis bus_space_tag_t, bus_space_handle_t); 141