1/*	$NetBSD: pcibios.h,v 1.11 2006/12/10 04:17:20 uwe Exp $	*/
2
3/*
4 * Copyright (c) 1999, by UCHIYAMA Yasushi
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. The name of the developer may NOT be used to endorse or promote products
13 *    derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/*
29 * Data structure definitions for the PCI BIOS interface.
30 */
31
32/*
33 * PCI BIOS return codes.
34 */
35#define	PCIBIOS_SUCCESS			0x00
36#define	PCIBIOS_SERVICE_NOT_PRESENT	0x80
37#define	PCIBIOS_FUNCTION_NOT_SUPPORTED	0x81
38#define	PCIBIOS_BAD_VENDOR_ID		0x83
39#define	PCIBIOS_DEVICE_NOT_FOUND	0x86
40#define	PCIBIOS_BAD_REGISTER_NUMBER	0x87
41#define	PCIBIOS_SET_FAILED		0x88
42#define	PCIBIOS_BUFFER_TOO_SMALL	0x89
43
44/*
45 * PCI IRQ Routing Table definitions.
46 */
47
48/*
49 * Slot entry (per PCI 2.1)
50 */
51struct pcibios_linkmap {
52	uint8_t		link;
53	uint16_t	bitmap;
54} __packed;
55
56struct pcibios_intr_routing {
57	uint8_t		bus;
58	uint8_t		device;
59	struct pcibios_linkmap linkmap[4];	/* INT[A:D]# */
60	uint8_t		slot;
61	uint8_t		reserved;
62} __packed;
63
64/*
65 * $PIR header.  Reference:
66 *
67 *	http://www.microsoft.com/whdc/hwdev/archive/BUSBIOS/pciirq.mspx
68 */
69struct pcibios_pir_header {
70	uint32_t	signature;		/* $PIR */
71	uint16_t	version;
72	uint16_t	tablesize;
73	uint8_t		router_bus;
74	uint8_t		router_devfunc;
75	uint16_t	exclusive_irq;
76	uint32_t	compat_router;		/* PCI vendor/product */
77	uint32_t	miniport;
78	uint8_t		reserved[11];
79	uint8_t		checksum;
80} __packed;
81
82#define	PIR_DEVFUNC_DEVICE(devfunc)	(((devfunc) >> 3) & 0x1f)
83#define	PIR_DEVFUNC_FUNCTION(devfunc)	((devfunc) & 7)
84
85void	pcibios_init(void);
86
87extern struct pcibios_pir_header pcibios_pir_header;
88extern struct pcibios_intr_routing *pcibios_pir_table;
89extern int pcibios_pir_table_nentries;
90extern int pcibios_max_bus;
91
92#ifdef PCIBIOSVERBOSE
93extern int pcibiosverbose;
94
95#define	PCIBIOS_PRINTV(arg) \
96	do { \
97		if (pcibiosverbose) \
98			aprint_normal arg; \
99	} while (0)
100#define	PCIBIOS_PRINTVN(n, arg) \
101	do { \
102		 if (pcibiosverbose > (n)) \
103			aprint_normal arg; \
104	} while (0)
105#else
106#define	PCIBIOS_PRINTV(arg)
107#define	PCIBIOS_PRINTVN(n, arg)
108#endif
109