1/* $NetBSD: pci_machdep.h,v 1.31 2024/06/23 00:53:34 riastradh Exp $ */
2
3/*
4 * Copyright (c) 1999 Matthew R. Green
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#ifndef _MACHINE_PCI_MACHDEP_H_
30#define _MACHINE_PCI_MACHDEP_H_
31
32/*
33 * Forward declarations.
34 */
35struct pci_attach_args;
36
37/*
38 * define some bits used to glue into the common PCI code.
39 */
40
41/*
42 * The stuuuuuuupid allegedly MI PCI code expects pcitag_t to be a
43 * scalar type.  But we really need to store both the OFW node and
44 * the bus/device/function info in it.  (We'd like to store more,
45 * like all the ofw properties, but we don't need to.)  Luckily,
46 * both are 32-bit values, so we can squeeze them into a uint64_t
47 * with a little help from some macros.
48 */
49
50#define	PCITAG_NODE(x)		(int)(((x)>>32)&0xffffffff)
51#define	PCITAG_OFFSET(x)	((x)&0xffffffff)
52#define	PCITAG_BUS(t)		((PCITAG_OFFSET(t)>>16)&0xff)
53#define	PCITAG_DEV(t)		((PCITAG_OFFSET(t)>>11)&0x1f)
54#define	PCITAG_FUN(t)		((PCITAG_OFFSET(t)>>8)&0x7)
55#define	PCITAG_CREATE(n,b,d,f)	(((uint64_t)(n)<<32)|((b)<<16)|((d)<<11)|((f)<<8))
56#define	PCITAG_SETNODE(t,n)	((t)&0xffffffff)|(((n)<<32)
57typedef uint64_t pcitag_t;
58
59typedef struct sparc_pci_chipset *pci_chipset_tag_t;
60typedef u_int pci_intr_handle_t;
61
62struct sparc_pci_chipset {
63	void		*cookie;	/* psycho_pbm/, but sssh! */
64	int		rootnode;	/* PCI controller */
65
66	/* pci(9) interfaces */
67	pcireg_t	(*spc_conf_read)(pci_chipset_tag_t, pcitag_t, int);
68	void		(*spc_conf_write)(pci_chipset_tag_t, pcitag_t, int, pcireg_t);
69
70	int		(*spc_intr_map)(const struct pci_attach_args *, pci_intr_handle_t *);
71	void		*(*spc_intr_establish)(pci_chipset_tag_t, pci_intr_handle_t, int, int (*)(void *), void *);
72
73	/* private interfaces */
74	int		(*spc_find_ino)(const struct pci_attach_args *, pci_intr_handle_t *);
75
76	int		spc_busmax;
77	struct spc_busnode {
78		int	node;
79		int	(*valid)(void *);
80		void	*arg;
81	}		(*spc_busnode)[256];
82};
83
84
85void		pci_attach_hook(device_t, device_t,
86		    struct pcibus_attach_args *);
87int		pci_bus_maxdevs(pci_chipset_tag_t, int);
88pcitag_t	pci_make_tag(pci_chipset_tag_t, int, int, int);
89void		pci_decompose_tag(pci_chipset_tag_t, pcitag_t, int *, int *,
90		    int *);
91const char	*pci_intr_string(pci_chipset_tag_t, pci_intr_handle_t,
92		    char *, size_t);
93const struct evcnt *pci_intr_evcnt(pci_chipset_tag_t, pci_intr_handle_t);
94int		pci_intr_map(const struct pci_attach_args *,
95		    pci_intr_handle_t *);
96void		pci_intr_disestablish(pci_chipset_tag_t, void *);
97
98int		sparc64_pci_enumerate_bus1(struct pci_softc *, const int *,
99		    int (*)(void *, const struct pci_attach_args *), void *,
100		    struct pci_attach_args *);
101#define PCI_MACHDEP_ENUMERATE_BUS1 sparc64_pci_enumerate_bus1
102
103#define	pci_conf_read(pc, tag, reg) \
104		((pc)->spc_conf_read(pc, tag, reg))
105#define	pci_conf_write(pc, tag, reg, val) \
106		((pc)->spc_conf_write(pc, tag, reg, val))
107#define	pci_intr_establish(pc, handle, level, func, arg) \
108		((pc)->spc_intr_establish(pc, handle, level, func, arg))
109
110/* SPARC specific PCI interfaces */
111int		sparc_pci_childspace(int);
112
113#endif /* _MACHINE_PCI_MACHDEP_H_ */
114