00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __pci_h
00009 #define __pci_h
00010
00011 #include <system/config.h>
00012 #include <system/pci_ids-linux.h>
00013
00014 __BEGIN_SYS
00015
00016 class PCI_Common
00017 {
00018 protected:
00019 PCI_Common() {}
00020
00021 protected:
00022 typedef CPU::Reg8 Reg8;
00023 typedef CPU::Reg16 Reg16;
00024 typedef CPU::Reg32 Reg32;
00025 typedef CPU::Log_Addr Log_Addr;
00026 typedef CPU::Phy_Addr Phy_Addr;
00027
00028 public:
00029
00030 enum {
00031 VENDOR_ID = 0x00,
00032 DEVICE_ID = 0x02,
00033 COMMAND = 0x04,
00034 STATUS = 0x06,
00035 REVISION_ID = 0x08,
00036 CLASS_PROG = 0x09,
00037 CLASS_ID = 0x0a,
00038 CACHE_LINE_SIZE = 0x0c,
00039 LATENCY_TIMER = 0x0d,
00040 HEADER_TYPE = 0x0e,
00041 BIST = 0x0f,
00042 BASE_ADDRESS_0 = 0x10,
00043 BASE_ADDRESS_1 = 0x14,
00044 BASE_ADDRESS_2 = 0x18,
00045 BASE_ADDRESS_3 = 0x1c,
00046 BASE_ADDRESS_4 = 0x20,
00047 BASE_ADDRESS_5 = 0x24,
00048 CARDBUS_CIS = 0x28,
00049 SUBSYSTEM_VENDOR_ID = 0x2c,
00050 SUBSYSTEM_DEVICE_ID = 0x2e,
00051 ROM_ADDRESS = 0x30,
00052
00053 INTERRUPT_LINE = 0x3c,
00054 INTERRUPT_PIN = 0x3d,
00055 MIN_GNT = 0x3e,
00056 MAX_LAT = 0x3f,
00057 };
00058
00059
00060 enum {
00061 COMMAND_IO = 0x1,
00062 COMMAND_MEMORY = 0x2,
00063 COMMAND_MASTER = 0x4,
00064 COMMAND_SPECIAL = 0x8,
00065 COMMAND_INVALIDATE = 0x10,
00066 COMMAND_VGA_PALETTE = 0x20,
00067 COMMAND_PARITY = 0x40,
00068 COMMAND_WAIT = 0x80,
00069 COMMAND_SERR = 0x100,
00070 COMMAND_FAST_BACK = 0x200,
00071 };
00072
00073
00074 enum {
00075 STATUS_CAP_LIST = 0x10,
00076 STATUS_66MHZ = 0x20,
00077 STATUS_UDF = 0x40,
00078 STATUS_FAST_BACK = 0x80,
00079 STATUS_PARITY = 0x100,
00080 STATUS_DEVSEL_MASK = 0x600,
00081 STATUS_DEVSEL_FAST = 0x000,
00082 STATUS_DEVSEL_MEDIUM = 0x200,
00083 STATUS_DEVSEL_SLOW = 0x400,
00084 STATUS_SIG_TARGET_ABORT = 0x800,
00085 STATUS_REC_TARGET_ABORT = 0x1000,
00086 STATUS_REC_MASTER_ABORT = 0x2000,
00087 STATUS_SIG_SYSTEM_ERROR = 0x4000,
00088 STATUS_DETECTED_PARITY = 0x8000,
00089 };
00090
00091
00092 enum {
00093 HEADER_TYPE_NORMAL = 0,
00094 HEADER_TYPE_BRIDGE = 1,
00095 HEADER_TYPE_CARDBUS = 2,
00096 };
00097
00098
00099 enum {
00100 BIST_CODE_MASK = 0x0f,
00101 BIST_START = 0x40,
00102 BIST_CAPABLE = 0x80,
00103 };
00104
00105
00106 enum PCI_Masks {
00107 BASE_ADDRESS_SPACE_MASK = 0x01,
00108 BASE_ADDRESS_SPACE_MEM = 0x00,
00109 BASE_ADDRESS_SPACE_IO = 0x01,
00110 BASE_ADDRESS_MEM_TYPE_MASK = 0x06,
00111 BASE_ADDRESS_MEM_TYPE_32 = 0x00,
00112 BASE_ADDRESS_MEM_TYPE_1M = 0x02,
00113 BASE_ADDRESS_MEM_TYPE_64 = 0x04,
00114 BASE_ADDRESS_MEM_PREFETCH = 0x08,
00115 BASE_ADDRESS_MEM_MASK = ~0x0fUL,
00116 BASE_ADDRESS_IO_MASK = ~0x03UL
00117 };
00118
00119
00120 enum {
00121 ROM_ADDRESS_MASK = ~0x7ffUL
00122 };
00123
00124
00125 enum {
00126 PRIMARY_BUS = 0x18,
00127 SECONDARY_BUS = 0x19,
00128 SUBORDINATE_BUS = 0x1a,
00129 SEC_LATENCY_TIMER = 0x1b,
00130 IO_BASE = 0x1c,
00131 IO_LIMIT = 0x1d,
00132 SEC_STATUS = 0x1e,
00133 MEMORY_BASE = 0x20,
00134 MEMORY_LIMIT = 0x22,
00135 PREF_MEMORY_BASE = 0x24,
00136 PREF_MEMORY_LIMIT = 0x26,
00137 PREF_BASE_UPPER32 = 0x28,
00138 PREF_LIMIT_UPPER32 = 0x2c,
00139 IO_BASE_UPPER16 = 0x30,
00140 IO_LIMIT_UPPER16 = 0x32,
00141
00142
00143 ROM_ADDRESS1 = 0x38,
00144
00145 BRIDGE_CONTROL = 0x3e
00146 };
00147
00148
00149 enum {
00150 BRIDGE_CTL_PARITY = 0x01,
00151 BRIDGE_CTL_SERR = 0x02,
00152 BRIDGE_CTL_NO_ISA = 0x04,
00153 BRIDGE_CTL_VGA = 0x08,
00154 BRIDGE_CTL_MASTER_ABORT = 0x20,
00155 BRIDGE_CTL_BUS_RESET = 0x40,
00156 BRIDGE_CTL_FAST_BACK = 0x80
00157 };
00158
00159
00160 enum {
00161 IO_RANGE_TYPE_MASK = 0x0fUL,
00162 IO_RANGE_TYPE_16 = 0x00,
00163 IO_RANGE_TYPE_32 = 0x01,
00164 IO_RANGE_MASK = ~0x0fUL
00165 };
00166
00167
00168 enum {
00169 MEMORY_RANGE_TYPE_MASK = 0x0fUL,
00170 MEMORY_RANGE_MASK = ~0x0fUL
00171 };
00172
00173
00174 enum {
00175 PREF_RANGE_TYPE_MASK = 0x0fUL,
00176 PREF_RANGE_TYPE_32 = 0x00,
00177 PREF_RANGE_TYPE_64 = 0x01,
00178 PREF_RANGE_MASK = ~0x0fUL
00179 };
00180
00181 typedef unsigned short Class_Id;
00182 typedef unsigned short Vendor_Id;
00183 typedef unsigned short Device_Id;
00184
00185 struct Locator {
00186 static const Reg8 INVALID = ~0;
00187
00188 Locator() {}
00189 Locator(Reg8 b, Reg8 d) : bus(b), dev_fn(d) {}
00190
00191 operator bool() { return (bus != INVALID); }
00192
00193 Reg8 bus;
00194 Reg8 dev_fn;
00195 };
00196
00197 struct Region {
00198 static const int N = 6;
00199
00200 operator bool() { return (size != 0); }
00201
00202 bool memory;
00203 Log_Addr log_addr;
00204 Phy_Addr phy_addr;
00205 Reg32 size;
00206 };
00207
00208 struct Header {
00209 operator bool() { return locator; }
00210
00211 Locator locator;
00212 Vendor_Id vendor_id;
00213 Device_Id device_id;
00214 Reg16 command;
00215 Reg16 status;
00216 Reg8 revision_id;
00217 Reg8 class_prog;
00218 Class_Id class_id;
00219 Reg8 cache_line_size;
00220 Reg8 latency_time;
00221 Reg8 type;
00222 Reg8 bist;
00223 Region region[Region::N];
00224 Reg32 cardbus_cis;
00225 Vendor_Id subsystem_vendor_id;
00226 Device_Id subsystem_device_id;
00227 Reg32 rom_address;
00228 Reg8 interrupt_line;
00229 Reg8 interrupt_pin;
00230 Reg8 min_gnt;
00231 Reg8 max_lat;
00232 };
00233 };
00234
00235 __END_SYS
00236
00237 #include __HEADER_MACH(pci)
00238
00239 #endif