@ -8,23 +8,17 @@
*/
# include "hw/ide.h"
# include "sysemu/dma.h"
# include "hw/block/block.h"
# include "exec/ioport.h"
# include "hw/ide/ide-dma.h"
# include "hw/ide/ide-dev.h"
/* debug IDE devices */
# define USE_DMA_CDROM
# include "qom/object.h"
typedef struct IDEDevice IDEDevice ;
typedef struct IDEState IDEState ;
# define TYPE_IDE_BUS "IDE"
OBJECT_DECLARE_SIMPLE_TYPE ( IDEBus , IDE_BUS )
# define MAX_IDE_DEVS 2
/* Device/Head ("select") Register */
# define ATA_DEV_SELECT 0x10
/* ATA1,3: Defined as '1'.
@ -327,23 +321,6 @@ OBJECT_DECLARE_SIMPLE_TYPE(IDEBus, IDE_BUS)
# define SMART_DISABLE 0xd9
# define SMART_STATUS 0xda
typedef enum { IDE_HD , IDE_CD , IDE_CFATA } IDEDriveKind ;
typedef void EndTransferFunc ( IDEState * ) ;
struct unreported_events {
bool eject_request ;
bool new_media ;
} ;
enum ide_dma_cmd {
IDE_DMA_READ = 0 ,
IDE_DMA_WRITE ,
IDE_DMA_TRIM ,
IDE_DMA_ATAPI ,
IDE_DMA__COUNT
} ;
extern const char * IDE_DMA_CMD_lookup [ IDE_DMA__COUNT ] ;
extern const MemoryRegionPortio ide_portio_list [ ] ;
@ -361,97 +338,6 @@ typedef struct IDEBufferedRequest {
bool orphaned ;
} IDEBufferedRequest ;
/* NOTE: IDEState represents in fact one drive */
struct IDEState {
IDEBus * bus ;
uint8_t unit ;
/* ide config */
IDEDriveKind drive_kind ;
int drive_heads , drive_sectors ;
int cylinders , heads , sectors , chs_trans ;
int64_t nb_sectors ;
int mult_sectors ;
int identify_set ;
uint8_t identify_data [ 512 ] ;
int drive_serial ;
char drive_serial_str [ 21 ] ;
char drive_model_str [ 41 ] ;
uint64_t wwn ;
/* ide regs */
uint8_t feature ;
uint8_t error ;
uint32_t nsector ;
uint8_t sector ;
uint8_t lcyl ;
uint8_t hcyl ;
/* other part of tf for lba48 support */
uint8_t hob_feature ;
uint8_t hob_nsector ;
uint8_t hob_sector ;
uint8_t hob_lcyl ;
uint8_t hob_hcyl ;
uint8_t select ;
uint8_t status ;
bool io8 ;
bool reset_reverts ;
/* set for lba48 access */
uint8_t lba48 ;
BlockBackend * blk ;
char version [ 9 ] ;
/* ATAPI specific */
struct unreported_events events ;
uint8_t sense_key ;
uint8_t asc ;
bool tray_open ;
bool tray_locked ;
uint8_t cdrom_changed ;
int packet_transfer_size ;
int elementary_transfer_size ;
int32_t io_buffer_index ;
int lba ;
int cd_sector_size ;
int atapi_dma ; /* true if dma is requested for the packet cmd */
BlockAcctCookie acct ;
BlockAIOCB * pio_aiocb ;
QEMUIOVector qiov ;
QLIST_HEAD ( , IDEBufferedRequest ) buffered_requests ;
/* ATA DMA state */
uint64_t io_buffer_offset ;
int32_t io_buffer_size ;
QEMUSGList sg ;
/* PIO transfer handling */
int req_nb_sectors ; /* number of sectors per interrupt */
EndTransferFunc * end_transfer_func ;
uint8_t * data_ptr ;
uint8_t * data_end ;
uint8_t * io_buffer ;
/* PIO save/restore */
int32_t io_buffer_total_len ;
int32_t cur_io_buffer_offset ;
int32_t cur_io_buffer_len ;
uint8_t end_transfer_fn_idx ;
QEMUTimer * sector_write_timer ; /* only used for win2k install hack */
uint32_t irq_count ; /* counts IRQs when using win2k install hack */
/* CF-ATA extended error */
uint8_t ext_error ;
/* CF-ATA metadata storage */
uint32_t mdata_size ;
uint8_t * mdata_storage ;
int media_changed ;
enum ide_dma_cmd dma_cmd ;
/* SMART */
uint8_t smart_enabled ;
uint8_t smart_autosave ;
int smart_errors ;
uint8_t smart_selftest_count ;
uint8_t * smart_selftest_data ;
/* AHCI */
int ncq_queues ;
} ;
struct IDEBus {
BusState qbus ;
IDEDevice * master ;
@ -475,33 +361,6 @@ struct IDEBus {
VMChangeStateEntry * vmstate ;
} ;
# define TYPE_IDE_DEVICE "ide-device"
OBJECT_DECLARE_TYPE ( IDEDevice , IDEDeviceClass , IDE_DEVICE )
struct IDEDeviceClass {
DeviceClass parent_class ;
void ( * realize ) ( IDEDevice * dev , Error * * errp ) ;
} ;
struct IDEDevice {
DeviceState qdev ;
uint32_t unit ;
BlockConf conf ;
int chs_trans ;
char * version ;
char * serial ;
char * model ;
uint64_t wwn ;
/*
* 0x0000 - rotation rate not reported
* 0x0001 - non - rotating medium ( SSD )
* 0x0002 - 0x0400 - reserved
* 0x0401 - 0xffe - rotations per minute
* 0xffff - reserved
*/
uint16_t rotation_rate ;
} ;
/* These are used for the error_status field of IDEBus */
# define IDE_RETRY_MASK 0xf8
# define IDE_RETRY_DMA 0x08