00001 #if !defined(__PIIX3_IDE_CONFIG_SPACE_HPP__)
00002 #define __PIIX3_IDE_CONFIG_SPACE_HPP__
00003
00004
00005
00006
00007 #include "devices/common.hpp"
00008
00016 struct __packed(piix_ide_config_space) : public pci_config_header64
00017 {
00018
00019
00020
00021
00022
00023 union IDE_timing_modes
00024 {
00025 le_uint16_t raw;
00026
00027 struct __packed()
00028 {
00029 #if LITTLE_ENDIAN_BITFIELD
00030
00031
00032
00033 unsigned enable_fast_timing_bank0 : 1;
00034 unsigned enable_IORDY_sample_point0 : 1;
00035 unsigned enable_prefetch_and_posting0 : 1;
00036 unsigned enable_DMA_timing0 : 1;
00037
00038
00039
00040
00041 unsigned enable_fast_timing_bank1 : 1;
00042 unsigned enable_IORDY_sample_point1 : 1;
00043 unsigned enable_prefetch_and_posting1 : 1;
00044 unsigned enable_DMA_timing1 : 1;
00045
00046
00047
00048
00049 unsigned recovery_time : 2;
00050 unsigned reserved10_11 : 2;
00051 unsigned IORDY_sample_point : 2;
00052 unsigned enable_slave_timings : 1;
00053 unsigned enable_IDE_decode : 1;
00054 #elif BIG_ENDIAN_BITFIELD
00055 unsigned enable_DMA_timing1 : 1;
00056 unsigned enable_prefetch_and_posting1 : 1;
00057 unsigned enable_IORDY_sample_point1 : 1;
00058 unsigned enable_fast_timing_bank1 : 1;
00059 unsigned enable_DMA_timing0 : 1;
00060 unsigned enable_prefetch_and_posting0 : 1;
00061 unsigned enable_IORDY_sample_point0 : 1;
00062 unsigned enable_fast_timing_bank0 : 1;
00063
00064 unsigned enable_IDE_decode : 1;
00065 unsigned enable_slave_timings : 1;
00066 unsigned IORDY_sample_point : 2;
00067 unsigned reserved10_11 : 2;
00068 unsigned recovery_time : 2;
00069 #else
00070 #error unknown bitfield order. fix this.
00071 #endif
00072 };
00073
00074 ACCESS_FUNCTORS(IDE_timing_modes&, uint16_t, raw)
00075 NUMERIC_ACCESS_OPERATORS(IDE_timing_modes&, uint16_t, raw)
00076 NUMERIC_ACCESS_OPERATORS(IDE_timing_modes&, le_uint16_t, raw)
00077 INCREMENT_OPERATORS(IDE_timing_modes, raw)
00078 } IDE_timing_modes[2];
00079
00080
00081
00082
00083
00084
00085
00086 union slave_IDE_timing_modes
00087 {
00088 uint8_t raw;
00089
00090 struct __packed()
00091 {
00092 #if LITTLE_ENDIAN_BITFIELD
00093
00094
00095
00096 unsigned ata0_recovery_time : 2;
00097 unsigned ata0_IORDY_sample_point : 2;
00098
00099
00100
00101
00102 unsigned ata1_recovery_time : 2;
00103 unsigned ata1_IORDY_sample_point : 2;
00104 #elif BIG_ENDIAN_BITFIELD
00105 unsigned ata1_IORDY_sample_point : 2;
00106 unsigned ata1_recovery_time : 2;
00107 unsigned ata0_IORDY_sample_point : 2;
00108 unsigned ata0_recovery_time : 2;
00109 #else
00110 #error unknown bitfield order. fix this.
00111 #endif
00112 };
00113
00114 ACCESS_FUNCTORS(slave_IDE_timing_modes&, uint8_t, raw)
00115 NUMERIC_ACCESS_OPERATORS(slave_IDE_timing_modes&, uint8_t, raw)
00116 INCREMENT_OPERATORS(slave_IDE_timing_modes, raw)
00117 } slave_IDE_timing_modes;
00118
00119
00120
00121
00122 uint8_t unused45_47[0x47-0x44];
00123
00124
00125
00126
00127 union sdma_control
00128 {
00129 uint8_t raw;
00130
00131 struct __packed()
00132 {
00133 #if LITTLE_ENDIAN_BITFIELD
00134 unsigned ata00_sdma_enable : 1;
00135 unsigned ata01_sdma_enable : 1;
00136 unsigned ata10_sdma_enable : 1;
00137 unsigned ata11_sdma_enable : 1;
00138 unsigned reserved4_7 : 4;
00139 #elif BIG_ENDIAN_BITFIELD
00140 unsigned reserved4_7 : 4;
00141 unsigned ata11_sdma_enable : 1;
00142 unsigned ata10_sdma_enable : 1;
00143 unsigned ata01_sdma_enable : 1;
00144 unsigned ata00_sdma_enable : 1;
00145 #else
00146 #error unknown bitfield order. fix this.
00147 #endif
00148 };
00149
00150 ACCESS_FUNCTORS(sdma_control&, uint8_t, raw)
00151 NUMERIC_ACCESS_OPERATORS(sdma_control&, uint8_t, raw)
00152 INCREMENT_OPERATORS(sdma_control, raw)
00153 } sdma_control;
00154
00155
00156
00157
00158 uint8_t unused49;
00159
00160
00161
00162
00163 union sdma_timing
00164 {
00165 le_uint16_t raw;
00166
00167 struct __packed()
00168 {
00169 #if LITTLE_ENDIAN_BITFIELD
00170 unsigned ata00_cycle_time : 2;
00171 unsigned reserved2_3 : 2;
00172 unsigned ata01_cycle_time : 2;
00173 unsigned reserved6_7 : 2;
00174
00175 unsigned ata10_cycle_time : 2;
00176 unsigned reserved10_11 : 2;
00177 unsigned ata11_cycle_time : 2;
00178 unsigned reserved14_15 : 2;
00179 #elif BIG_ENDIAN_BITFIELD
00180 unsigned reserved6_7 : 2;
00181 unsigned ata01_cycle_time : 2;
00182 unsigned reserved2_3 : 2;
00183 unsigned ata00_cycle_time : 2;
00184
00185 unsigned reserved14_15 : 2;
00186 unsigned ata11_cycle_time : 2;
00187 unsigned reserved10_11 : 2;
00188 unsigned ata10_cycle_time : 2;
00189 #else
00190 #error unknown bitfield order. fix this.
00191 #endif
00192 };
00193
00194 ACCESS_FUNCTORS(sdma_timing&, uint16_t, raw)
00195 NUMERIC_ACCESS_OPERATORS(sdma_timing&, uint16_t, raw)
00196 NUMERIC_ACCESS_OPERATORS(sdma_timing&, le_uint16_t, raw)
00197 INCREMENT_OPERATORS(sdma_timing, raw)
00198 } sdma_timing;
00199
00200
00201
00202
00203 uint8_t unused4c_53[0x53-0x4b];
00204
00205
00206
00207
00208 union ide_config
00209 {
00210 le_uint32_t raw;
00211
00212 struct __packed()
00213 {
00214 #if LITTLE_ENDIAN_BITFIELD
00215
00216
00217
00218
00219 unsigned ata00_base_clock : 1;
00220 unsigned ata01_base_clock : 1;
00221 unsigned ata10_base_clock : 1;
00222 unsigned ata11_base_clock : 1;
00223
00224
00225
00226
00227
00228 unsigned ata00_channel_cable_reporting : 1;
00229 unsigned ata01_channel_cable_reporting : 1;
00230 unsigned ata10_channel_cable_reporting : 1;
00231 unsigned ata11_channel_cable_reporting : 1;
00232
00233 unsigned reserved8_9 : 2;
00234 unsigned write_pingpong_enable : 1;
00235 unsigned reserved11 : 1;
00236 unsigned fast_ata00_base_clock : 1;
00237 unsigned fast_ata01_base_clock : 1;
00238 unsigned fast_ata10_base_clock : 1;
00239 unsigned fast_ata11_base_clock : 1;
00240
00241 unsigned primary_sig_mode : 2;
00242 unsigned secondary_sig_mode : 2;
00243 unsigned miscellaneous_scratchpad : 4;
00244 #elif BIG_ENDIAN_BITFIELD
00245 unsigned ata11_channel_cable_reporting : 1;
00246 unsigned ata10_channel_cable_reporting : 1;
00247 unsigned ata01_channel_cable_reporting : 1;
00248 unsigned ata00_channel_cable_reporting : 1;
00249 unsigned ata11_base_clock : 1;
00250 unsigned ata10_base_clock : 1;
00251 unsigned ata01_base_clock : 1;
00252 unsigned ata00_base_clock : 1;
00253
00254 unsigned fast_ata11_base_clock : 1;
00255 unsigned fast_ata10_base_clock : 1;
00256 unsigned fast_ata01_base_clock : 1;
00257 unsigned fast_ata00_base_clock : 1;
00258 unsigned reserved11 : 1;
00259 unsigned write_pingpong_enable : 1;
00260 unsigned reserved8_9 : 2;
00261
00262 unsigned miscellaneous_scratchpad : 4;
00263 unsigned secondary_sig_mode : 2;
00264 unsigned primary_sig_mode : 2;
00265 #else
00266 #error unknown bitfield order. fix this.
00267 #endif
00268
00269 unsigned reserved24_31 : 8;
00270 };
00271
00272 ACCESS_FUNCTORS(ide_config&, uint32_t, raw)
00273 NUMERIC_ACCESS_OPERATORS(ide_config&, uint32_t, raw)
00274 NUMERIC_ACCESS_OPERATORS(ide_config&, le_uint32_t, raw)
00275 INCREMENT_OPERATORS(ide_config, raw)
00276 } ide_config;
00277
00278
00279
00280
00281 uint8_t unused58_bf[0xbf-0x57];
00282
00283
00284
00285
00286 union trap_control
00287 {
00288 uint8_t raw;
00289
00290 struct __packed()
00291 {
00292 #if LITTLE_ENDIAN_BITFIELD
00293 unsigned ata00 : 1;
00294 unsigned ata01 : 1;
00295 unsigned reserved2_7 : 6;
00296 #elif BIG_ENDIAN_BITFIELD
00297 unsigned reserved2_7 : 6;
00298 unsigned ata01 : 1;
00299 unsigned ata00 : 1;
00300 #else
00301 #error unknown bitfield order. fix this.
00302 #endif
00303 };
00304
00305 ACCESS_FUNCTORS(trap_control&, uint8_t, raw)
00306 NUMERIC_ACCESS_OPERATORS(trap_control&, uint8_t, raw)
00307 INCREMENT_OPERATORS(trap_control, raw)
00308 } trap_control;
00309
00310
00311
00312
00313 uint8_t unusedc1_c3[0xc3-0xc0];
00314
00315
00316
00317
00318 union trap_status
00319 {
00320 uint8_t raw;
00321
00322 struct __packed()
00323 {
00324 #if LITTLE_ENDIAN_BITFIELD
00325 unsigned ata00 : 1;
00326 unsigned ata01 : 1;
00327 unsigned reserved2_7 : 6;
00328 #elif BIG_ENDIAN_BITFIELD
00329 unsigned reserved2_7 : 6;
00330 unsigned ata01 : 1;
00331 unsigned ata00 : 1;
00332 #else
00333 #error unknown bitfield order. fix this.
00334 #endif
00335 };
00336
00337 ACCESS_FUNCTORS(trap_status&, uint8_t, raw)
00338 NUMERIC_ACCESS_OPERATORS(trap_status&, uint8_t, raw)
00339 INCREMENT_OPERATORS(trap_status, raw)
00340 } trap_status;
00341
00342
00343
00344
00345 uint8_t unusedc5_ff[0xff-0xc4];
00346
00347
00348
00349
00350 piix_ide_config_space(void)
00351 {
00352 memset(this, 0, static_unsigned_min<sizeof(piix_ide_config_space), 256>::value);
00353 }
00354 };
00355
00356 static_assert(sizeof(piix_ide_config_space) == 256, "piix_ide_config_space's size must be 256");
00357
00358 #endif
00359
00360
00361