Overview   API Reference  

piix_ide_config_space.hpp

00001 #if !defined(__PIIX3_IDE_CONFIG_SPACE_HPP__)
00002 #define __PIIX3_IDE_CONFIG_SPACE_HPP__
00003 
00004 //
00005 // local includes
00006 //
00007 #include "devices/common.hpp"
00008 
00016 struct __packed(piix_ide_config_space) : public pci_config_header64
00017 {
00018     //
00019     // IDE Timing Modes (read-write) at offset: 0x40
00020     //     primary channel:   0x40-0x41 == ATA0 == IDE_timing_modes[0]
00021     //     secondary channel: 0x42-0x43 == ATA1 == IDE_timing_modes[1]
00022     //
00023     union IDE_timing_modes
00024     {
00025         le_uint16_t raw;
00026 
00027         struct __packed()
00028         {
00029           #if LITTLE_ENDIAN_BITFIELD
00030             //
00031             // drive 0 aka. the channel's master
00032             //
00033             unsigned enable_fast_timing_bank0       : 1;    // bit 0
00034             unsigned enable_IORDY_sample_point0     : 1;    // bit 1
00035             unsigned enable_prefetch_and_posting0   : 1;    // bit 2
00036             unsigned enable_DMA_timing0             : 1;    // bit 3
00037 
00038             //
00039             // drive 1 aka. the channel's slave
00040             //
00041             unsigned enable_fast_timing_bank1       : 1;    // bit 4
00042             unsigned enable_IORDY_sample_point1     : 1;    // bit 5
00043             unsigned enable_prefetch_and_posting1   : 1;    // bit 6
00044             unsigned enable_DMA_timing1             : 1;    // bit 7
00045 
00046             //
00047             // recovery_time & IORDY_sample_point for the channel's master
00048             //
00049             unsigned recovery_time                  : 2;    // bit 8-9
00050             unsigned reserved10_11                  : 2;    // bit 10-11
00051             unsigned IORDY_sample_point             : 2;    // bit 12-13
00052             unsigned enable_slave_timings           : 1;    // bit 14
00053             unsigned enable_IDE_decode              : 1;    // bit 15
00054           #elif BIG_ENDIAN_BITFIELD
00055             unsigned enable_DMA_timing1             : 1;    // bit 7
00056             unsigned enable_prefetch_and_posting1   : 1;    // bit 6
00057             unsigned enable_IORDY_sample_point1     : 1;    // bit 5
00058             unsigned enable_fast_timing_bank1       : 1;    // bit 4 (0 = 16-bit, 1 = 32-bit)
00059             unsigned enable_DMA_timing0             : 1;    // bit 3
00060             unsigned enable_prefetch_and_posting0   : 1;    // bit 2
00061             unsigned enable_IORDY_sample_point0     : 1;    // bit 1
00062             unsigned enable_fast_timing_bank0       : 1;    // bit 0 (0 = 16-bit, 1 = 32-bit)
00063 
00064             unsigned enable_IDE_decode              : 1;    // bit 15
00065             unsigned enable_slave_timings           : 1;    // bit 14
00066             unsigned IORDY_sample_point             : 2;    // bit 12-13
00067             unsigned reserved10_11                  : 2;    // bit 10-11
00068             unsigned recovery_time                  : 2;    // bit 8-9
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     // slave IDE Timing Modes (read-write) at offset: 0x44
00082     //     this register is only effective, if enable_slave_timings is set.
00083     //     used for both channels. the bits controlling the master are
00084     //     in the IDE Timing Modes register.
00085     //
00086     union slave_IDE_timing_modes
00087     {
00088         uint8_t raw;
00089 
00090         struct __packed()
00091         {
00092           #if LITTLE_ENDIAN_BITFIELD
00093             //
00094             // channel 0 aka. primary
00095             //
00096             unsigned ata0_recovery_time             : 2;    // bit 0-1
00097             unsigned ata0_IORDY_sample_point        : 2;    // bit 2-3
00098 
00099             //
00100             // channel 1 aka. secondary
00101             //
00102             unsigned ata1_recovery_time             : 2;    // bit 4-5
00103             unsigned ata1_IORDY_sample_point        : 2;    // bit 6-7
00104           #elif BIG_ENDIAN_BITFIELD
00105             unsigned ata1_IORDY_sample_point        : 2;    // bit 6-7
00106             unsigned ata1_recovery_time             : 2;    // bit 4-5
00107             unsigned ata0_IORDY_sample_point        : 2;    // bit 2-3
00108             unsigned ata0_recovery_time             : 2;    // bit 0-1
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     // unused
00121     //
00122     uint8_t unused45_47[0x47-0x44];
00123 
00124     //
00125     // Synchronous DMA Control Register (read-write) at offset: 0x48
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;    // bit 0
00135             unsigned ata01_sdma_enable              : 1;    // bit 1
00136             unsigned ata10_sdma_enable              : 1;    // bit 2
00137             unsigned ata11_sdma_enable              : 1;    // bit 3
00138             unsigned reserved4_7                    : 4;    // bit 4-7
00139           #elif BIG_ENDIAN_BITFIELD
00140             unsigned reserved4_7                    : 4;    // bit 4-7
00141             unsigned ata11_sdma_enable              : 1;    // bit 3
00142             unsigned ata10_sdma_enable              : 1;    // bit 2
00143             unsigned ata01_sdma_enable              : 1;    // bit 1
00144             unsigned ata00_sdma_enable              : 1;    // bit 0
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     // unused
00157     //
00158     uint8_t unused49;
00159 
00160     //
00161     // Synchronous DMA Timing Register (read-write) at offset: 0x4a
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;    // bit 0-1
00171             unsigned reserved2_3                    : 2;    // bit 2-3
00172             unsigned ata01_cycle_time               : 2;    // bit 4-5
00173             unsigned reserved6_7                    : 2;    // bit 6-7
00174 
00175             unsigned ata10_cycle_time               : 2;    // bit 8-9
00176             unsigned reserved10_11                  : 2;    // bit 10-11
00177             unsigned ata11_cycle_time               : 2;    // bit 12-13
00178             unsigned reserved14_15                  : 2;    // bit 14-15
00179           #elif BIG_ENDIAN_BITFIELD
00180             unsigned reserved6_7                    : 2;    // bit 6-7
00181             unsigned ata01_cycle_time               : 2;    // bit 4-5
00182             unsigned reserved2_3                    : 2;    // bit 2-3
00183             unsigned ata00_cycle_time               : 2;    // bit 0-1
00184 
00185             unsigned reserved14_15                  : 2;    // bit 14-15
00186             unsigned ata11_cycle_time               : 2;    // bit 12-13
00187             unsigned reserved10_11                  : 2;    // bit 10-11
00188             unsigned ata10_cycle_time               : 2;    // bit 8-9
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     // unused
00202     //
00203     uint8_t unused4c_53[0x53-0x4b];
00204 
00205     //
00206     // IDE I/O Configuration Register (read-write) at offset: 0x54
00207     //
00208     union ide_config
00209     {
00210         le_uint32_t raw;
00211 
00212         struct __packed()
00213         {
00214           #if LITTLE_ENDIAN_BITFIELD
00215             //
00216             // 0 = 33 MHz base clock for Ultra ATA timings.
00217             // 1 = 66 MHz base clock for Ultra ATA timings.
00218             //
00219             unsigned ata00_base_clock               : 1;    // bit 0
00220             unsigned ata01_base_clock               : 1;    // bit 1
00221             unsigned ata10_base_clock               : 1;    // bit 2
00222             unsigned ata11_base_clock               : 1;    // bit 3
00223 
00224             //
00225             // 0 = 40 conductor cable is present.
00226             // 1 = 80 conductor cable is present.
00227             //
00228             unsigned ata00_channel_cable_reporting  : 1;    // bit 4
00229             unsigned ata01_channel_cable_reporting  : 1;    // bit 5
00230             unsigned ata10_channel_cable_reporting  : 1;    // bit 6
00231             unsigned ata11_channel_cable_reporting  : 1;    // bit 7
00232 
00233             unsigned reserved8_9                    : 2;    // bit 8-9
00234             unsigned write_pingpong_enable          : 1;    // bit 10
00235             unsigned reserved11                     : 1;    // bit 11
00236             unsigned fast_ata00_base_clock          : 1;    // bit 12
00237             unsigned fast_ata01_base_clock          : 1;    // bit 13
00238             unsigned fast_ata10_base_clock          : 1;    // bit 14
00239             unsigned fast_ata11_base_clock          : 1;    // bit 15
00240 
00241             unsigned primary_sig_mode               : 2;    // bit 16-17
00242             unsigned secondary_sig_mode             : 2;    // bit 18-19
00243             unsigned miscellaneous_scratchpad       : 4;    // bit 20-23
00244           #elif BIG_ENDIAN_BITFIELD
00245             unsigned ata11_channel_cable_reporting  : 1;    // bit 7
00246             unsigned ata10_channel_cable_reporting  : 1;    // bit 6
00247             unsigned ata01_channel_cable_reporting  : 1;    // bit 5
00248             unsigned ata00_channel_cable_reporting  : 1;    // bit 4
00249             unsigned ata11_base_clock               : 1;    // bit 3
00250             unsigned ata10_base_clock               : 1;    // bit 2
00251             unsigned ata01_base_clock               : 1;    // bit 1
00252             unsigned ata00_base_clock               : 1;    // bit 0
00253 
00254             unsigned fast_ata11_base_clock          : 1;    // bit 15
00255             unsigned fast_ata10_base_clock          : 1;    // bit 14
00256             unsigned fast_ata01_base_clock          : 1;    // bit 13
00257             unsigned fast_ata00_base_clock          : 1;    // bit 12
00258             unsigned reserved11                     : 1;    // bit 11
00259             unsigned write_pingpong_enable          : 1;    // bit 10
00260             unsigned reserved8_9                    : 2;    // bit 8-9
00261 
00262             unsigned miscellaneous_scratchpad       : 4;    // bit 20-23
00263             unsigned secondary_sig_mode             : 2;    // bit 18-19
00264             unsigned primary_sig_mode               : 2;    // bit 16-17
00265           #else
00266             #error unknown bitfield order. fix this.
00267           #endif
00268 
00269             unsigned reserved24_31                  : 8;    // bit 24-31
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     // unused
00280     //
00281     uint8_t unused58_bf[0xbf-0x57];
00282 
00283     //
00284     // Trapping Control Register (read-write) at offset: 0xc0
00285     //
00286     union trap_control
00287     {
00288         uint8_t raw;
00289 
00290         struct __packed()
00291         {
00292           #if LITTLE_ENDIAN_BITFIELD
00293             unsigned ata00                          : 1;    // bit 0
00294             unsigned ata01                          : 1;    // bit 1
00295             unsigned reserved2_7                    : 6;    // bit 2-7
00296           #elif BIG_ENDIAN_BITFIELD
00297             unsigned reserved2_7                    : 6;    // bit 2-7
00298             unsigned ata01                          : 1;    // bit 1
00299             unsigned ata00                          : 1;    // bit 0
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     // unused
00312     //
00313     uint8_t unusedc1_c3[0xc3-0xc0];
00314 
00315     //
00316     // Trapping Status Register (read-write-clear) at offset: 0xc4
00317     //
00318     union trap_status
00319     {
00320         uint8_t raw;
00321 
00322         struct __packed()
00323         {
00324           #if LITTLE_ENDIAN_BITFIELD
00325             unsigned ata00                          : 1;    // bit 0
00326             unsigned ata01                          : 1;    // bit 1
00327             unsigned reserved2_7                    : 6;    // bit 2-7
00328           #elif BIG_ENDIAN_BITFIELD
00329             unsigned reserved2_7                    : 6;    // bit 2-7
00330             unsigned ata01                          : 1;    // bit 1
00331             unsigned ata00                          : 1;    // bit 0
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     // reserved
00344     //
00345     uint8_t unusedc5_ff[0xff-0xc4];
00346 
00347     //
00348     // constructor
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 // ***** end of source ***** //
00361 

L4vmm Reference Manual, written by Mario Schwalbe  © 2006-2008