pci_cfgspace_impl.h revision 748:3a1ae73086e8
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef _SYS_PCI_CFGSPACE_IMPL_H 28#define _SYS_PCI_CFGSPACE_IMPL_H 29 30#pragma ident "%Z%%M% %I% %E% SMI" 31 32/* 33 * Routines to support particular PCI chipsets 34 */ 35 36#ifdef __cplusplus 37extern "C" { 38#endif 39 40/* 41 * Generic Mechanism 1 routines 42 * XX64 putb -> put8, putw -> put16 etc. 43 */ 44extern uint8_t pci_mech1_getb(int bus, int dev, int func, int reg); 45extern uint16_t pci_mech1_getw(int bus, int dev, int func, int reg); 46extern uint32_t pci_mech1_getl(int bus, int dev, int func, int reg); 47extern void pci_mech1_putb(int bus, int dev, int func, int reg, uint8_t val); 48extern void pci_mech1_putw(int bus, int dev, int func, int reg, uint16_t val); 49extern void pci_mech1_putl(int bus, int dev, int func, int reg, uint32_t val); 50 51/* 52 * Generic Mechanism 2 routines 53 */ 54extern uint8_t pci_mech2_getb(int bus, int dev, int func, int reg); 55extern uint16_t pci_mech2_getw(int bus, int dev, int func, int reg); 56extern uint32_t pci_mech2_getl(int bus, int dev, int func, int reg); 57extern void pci_mech2_putb(int bus, int dev, int func, int reg, uint8_t val); 58extern void pci_mech2_putw(int bus, int dev, int func, int reg, uint16_t val); 59extern void pci_mech2_putl(int bus, int dev, int func, int reg, uint32_t val); 60 61/* 62 * Intel Neptune routines. Neptune is Mech 1, except that BIOSes 63 * often initialize it into Mech 2 so we dynamically switch it to 64 * Mech 1. The chipset's buggy, so we have to do it carefully. 65 */ 66extern boolean_t pci_check_neptune(void); 67extern uint8_t pci_neptune_getb(int bus, int dev, int func, int reg); 68extern uint16_t pci_neptune_getw(int bus, int dev, int func, int reg); 69extern uint32_t pci_neptune_getl(int bus, int dev, int func, int reg); 70extern void pci_neptune_putb(int bus, int dev, int func, int reg, uint8_t val); 71extern void pci_neptune_putw(int bus, int dev, int func, int reg, uint16_t val); 72extern void pci_neptune_putl(int bus, int dev, int func, int reg, uint32_t val); 73 74/* 75 * Intel Orion routines. Orion is Mech 1, except that there's a bug 76 * in the peer bridge that requires that it be tweaked specially 77 * around accesses to config space. 78 */ 79extern boolean_t pci_is_broken_orion(void); 80extern uint8_t pci_orion_getb(int bus, int dev, int func, int reg); 81extern uint16_t pci_orion_getw(int bus, int dev, int func, int reg); 82extern uint32_t pci_orion_getl(int bus, int dev, int func, int reg); 83extern void pci_orion_putb(int bus, int dev, int func, int reg, uint8_t val); 84extern void pci_orion_putw(int bus, int dev, int func, int reg, uint16_t val); 85extern void pci_orion_putl(int bus, int dev, int func, int reg, uint32_t val); 86 87/* 88 * Generic PCI constants. Probably these should be in pci.h. 89 */ 90#define PCI_MAX_BUSSES 256 91#define PCI_MAX_DEVS 32 92#define PCI_MAX_FUNCS 8 93/* 94 * PCI access mechanism constants. Probably these should be in pci_impl.h. 95 */ 96#define PCI_MECH2_CONFIG_ENABLE 0x10 /* any nonzero high nibble works */ 97 98#define PCI_MECH1_SPEC_CYCLE_DEV 0x1f /* dev to request spec cyc */ 99#define PCI_MECH1_SPEC_CYCLE_FUNC 0x07 /* func to request spec cyc */ 100 101/* 102 * Mutex for all pci config space routines to share 103 */ 104 105extern kmutex_t pcicfg_mutex; 106 107/* 108 * Orion/Neptune cfg access wraps mech1 cfg access, so needs a separate mutex 109 */ 110 111extern kmutex_t pcicfg_chipset_mutex; 112 113/* 114 * pci get irq routing information support 115 */ 116#define PCI_GET_IRQ_ROUTING 0x0e 117 118#define PCI_FUNCTION_ID (0xb1) 119#define PCI_BIOS_PRESENT (0x1) 120 121/* 122 * low-mem addresses for irq routing bios operations 123 * We set up the initial request for up to 32 table entries, and will 124 * re-issue for up to 255 entries if the bios indicates it requires 125 * a larger table. 255 entries plus the header would consume the 126 * memory between 0x7000-0x7fff. 127 */ 128#define BIOS_IRQ_ROUTING_HDR 0x7000 129#define BIOS_IRQ_ROUTING_DATA 0x7010 130 131#define N_PCI_IRQ_ROUTES 32 132#define N_PCI_IRQ_ROUTES_MAX 255 133 134#define FP_OFF(fp) (((uintptr_t)(fp)) & 0xFFFF) 135#define FP_SEG(fp) ((((uintptr_t)(fp)) >> 16) & 0xFFFF) 136 137#pragma pack(1) 138typedef struct pci_irq_route { 139 uchar_t pir_bus; 140 uchar_t pir_dev; 141 uchar_t pir_inta_link; 142 uint16_t pir_inta_irq_map; 143 uchar_t pir_intb_link; 144 uint16_t pir_intb_irq_map; 145 uchar_t pir_intc_link; 146 uint16_t pir_intc_irq_map; 147 uchar_t pir_intd_link; 148 uint16_t pir_intd_irq_map; 149 uchar_t pir_slot; 150 uchar_t pir_reserved; 151} pci_irq_route_t; 152#pragma pack() 153 154#pragma pack(1) 155typedef struct pci_irq_route_hdr { 156 uint16_t pir_size; 157 uint32_t pir_addr; 158} pci_irq_route_hdr_t; 159#pragma pack() 160 161#ifdef __cplusplus 162} 163#endif 164 165#endif /* _SYS_PCI_CFGSPACE_IMPL_H */ 166