Annotation of qemu/hw/ide/internal.h, revision 1.1

1.1     ! root        1: #ifndef HW_IDE_INTERNAL_H
        !             2: #define HW_IDE_INTERNAL_H
        !             3: 
        !             4: /*
        !             5:  * QEMU IDE Emulation -- internal header file
        !             6:  * only files in hw/ide/ are supposed to include this file.
        !             7:  * non-internal declarations are in hw/ide.h
        !             8:  */
        !             9: #include <hw/ide.h>
        !            10: 
        !            11: /* debug IDE devices */
        !            12: //#define DEBUG_IDE
        !            13: //#define DEBUG_IDE_ATAPI
        !            14: //#define DEBUG_AIO
        !            15: #define USE_DMA_CDROM
        !            16: 
        !            17: typedef struct IDEBus IDEBus;
        !            18: typedef struct IDEDevice IDEDevice;
        !            19: typedef struct IDEDeviceInfo IDEDeviceInfo;
        !            20: typedef struct IDEState IDEState;
        !            21: typedef struct BMDMAState BMDMAState;
        !            22: 
        !            23: /* Bits of HD_STATUS */
        !            24: #define ERR_STAT               0x01
        !            25: #define INDEX_STAT             0x02
        !            26: #define ECC_STAT               0x04    /* Corrected error */
        !            27: #define DRQ_STAT               0x08
        !            28: #define SEEK_STAT              0x10
        !            29: #define SRV_STAT               0x10
        !            30: #define WRERR_STAT             0x20
        !            31: #define READY_STAT             0x40
        !            32: #define BUSY_STAT              0x80
        !            33: 
        !            34: /* Bits for HD_ERROR */
        !            35: #define MARK_ERR               0x01    /* Bad address mark */
        !            36: #define TRK0_ERR               0x02    /* couldn't find track 0 */
        !            37: #define ABRT_ERR               0x04    /* Command aborted */
        !            38: #define MCR_ERR                        0x08    /* media change request */
        !            39: #define ID_ERR                 0x10    /* ID field not found */
        !            40: #define MC_ERR                 0x20    /* media changed */
        !            41: #define ECC_ERR                        0x40    /* Uncorrectable ECC error */
        !            42: #define BBD_ERR                        0x80    /* pre-EIDE meaning:  block marked bad */
        !            43: #define ICRC_ERR               0x80    /* new meaning:  CRC error during transfer */
        !            44: 
        !            45: /* Bits of HD_NSECTOR */
        !            46: #define CD                     0x01
        !            47: #define IO                     0x02
        !            48: #define REL                    0x04
        !            49: #define TAG_MASK               0xf8
        !            50: 
        !            51: #define IDE_CMD_RESET           0x04
        !            52: #define IDE_CMD_DISABLE_IRQ     0x02
        !            53: 
        !            54: /* ATA/ATAPI Commands pre T13 Spec */
        !            55: #define WIN_NOP                                0x00
        !            56: /*
        !            57:  *     0x01->0x02 Reserved
        !            58:  */
        !            59: #define CFA_REQ_EXT_ERROR_CODE         0x03 /* CFA Request Extended Error Code */
        !            60: /*
        !            61:  *     0x04->0x07 Reserved
        !            62:  */
        !            63: #define WIN_SRST                       0x08 /* ATAPI soft reset command */
        !            64: #define WIN_DEVICE_RESET               0x08
        !            65: /*
        !            66:  *     0x09->0x0F Reserved
        !            67:  */
        !            68: #define WIN_RECAL                      0x10
        !            69: #define WIN_RESTORE                    WIN_RECAL
        !            70: /*
        !            71:  *     0x10->0x1F Reserved
        !            72:  */
        !            73: #define WIN_READ                       0x20 /* 28-Bit */
        !            74: #define WIN_READ_ONCE                  0x21 /* 28-Bit without retries */
        !            75: #define WIN_READ_LONG                  0x22 /* 28-Bit */
        !            76: #define WIN_READ_LONG_ONCE             0x23 /* 28-Bit without retries */
        !            77: #define WIN_READ_EXT                   0x24 /* 48-Bit */
        !            78: #define WIN_READDMA_EXT                        0x25 /* 48-Bit */
        !            79: #define WIN_READDMA_QUEUED_EXT         0x26 /* 48-Bit */
        !            80: #define WIN_READ_NATIVE_MAX_EXT                0x27 /* 48-Bit */
        !            81: /*
        !            82:  *     0x28
        !            83:  */
        !            84: #define WIN_MULTREAD_EXT               0x29 /* 48-Bit */
        !            85: /*
        !            86:  *     0x2A->0x2F Reserved
        !            87:  */
        !            88: #define WIN_WRITE                      0x30 /* 28-Bit */
        !            89: #define WIN_WRITE_ONCE                 0x31 /* 28-Bit without retries */
        !            90: #define WIN_WRITE_LONG                 0x32 /* 28-Bit */
        !            91: #define WIN_WRITE_LONG_ONCE            0x33 /* 28-Bit without retries */
        !            92: #define WIN_WRITE_EXT                  0x34 /* 48-Bit */
        !            93: #define WIN_WRITEDMA_EXT               0x35 /* 48-Bit */
        !            94: #define WIN_WRITEDMA_QUEUED_EXT                0x36 /* 48-Bit */
        !            95: #define WIN_SET_MAX_EXT                        0x37 /* 48-Bit */
        !            96: #define CFA_WRITE_SECT_WO_ERASE                0x38 /* CFA Write Sectors without erase */
        !            97: #define WIN_MULTWRITE_EXT              0x39 /* 48-Bit */
        !            98: /*
        !            99:  *     0x3A->0x3B Reserved
        !           100:  */
        !           101: #define WIN_WRITE_VERIFY               0x3C /* 28-Bit */
        !           102: /*
        !           103:  *     0x3D->0x3F Reserved
        !           104:  */
        !           105: #define WIN_VERIFY                     0x40 /* 28-Bit - Read Verify Sectors */
        !           106: #define WIN_VERIFY_ONCE                        0x41 /* 28-Bit - without retries */
        !           107: #define WIN_VERIFY_EXT                 0x42 /* 48-Bit */
        !           108: /*
        !           109:  *     0x43->0x4F Reserved
        !           110:  */
        !           111: #define WIN_FORMAT                     0x50
        !           112: /*
        !           113:  *     0x51->0x5F Reserved
        !           114:  */
        !           115: #define WIN_INIT                       0x60
        !           116: /*
        !           117:  *     0x61->0x5F Reserved
        !           118:  */
        !           119: #define WIN_SEEK                       0x70 /* 0x70-0x7F Reserved */
        !           120: #define CFA_TRANSLATE_SECTOR           0x87 /* CFA Translate Sector */
        !           121: #define WIN_DIAGNOSE                   0x90
        !           122: #define WIN_SPECIFY                    0x91 /* set drive geometry translation */
        !           123: #define WIN_DOWNLOAD_MICROCODE         0x92
        !           124: #define WIN_STANDBYNOW2                        0x94
        !           125: #define CFA_IDLEIMMEDIATE              0x95 /* force drive to become "ready" */
        !           126: #define WIN_STANDBY2                   0x96
        !           127: #define WIN_SETIDLE2                   0x97
        !           128: #define WIN_CHECKPOWERMODE2            0x98
        !           129: #define WIN_SLEEPNOW2                  0x99
        !           130: /*
        !           131:  *     0x9A VENDOR
        !           132:  */
        !           133: #define WIN_PACKETCMD                  0xA0 /* Send a packet command. */
        !           134: #define WIN_PIDENTIFY                  0xA1 /* identify ATAPI device   */
        !           135: #define WIN_QUEUED_SERVICE             0xA2
        !           136: #define WIN_SMART                      0xB0 /* self-monitoring and reporting */
        !           137: #define CFA_ACCESS_METADATA_STORAGE    0xB8
        !           138: #define CFA_ERASE_SECTORS              0xC0 /* microdrives implement as NOP */
        !           139: #define WIN_MULTREAD                   0xC4 /* read sectors using multiple mode*/
        !           140: #define WIN_MULTWRITE                  0xC5 /* write sectors using multiple mode */
        !           141: #define WIN_SETMULT                    0xC6 /* enable/disable multiple mode */
        !           142: #define WIN_READDMA_QUEUED             0xC7 /* read sectors using Queued DMA transfers */
        !           143: #define WIN_READDMA                    0xC8 /* read sectors using DMA transfers */
        !           144: #define WIN_READDMA_ONCE               0xC9 /* 28-Bit - without retries */
        !           145: #define WIN_WRITEDMA                   0xCA /* write sectors using DMA transfers */
        !           146: #define WIN_WRITEDMA_ONCE              0xCB /* 28-Bit - without retries */
        !           147: #define WIN_WRITEDMA_QUEUED            0xCC /* write sectors using Queued DMA transfers */
        !           148: #define CFA_WRITE_MULTI_WO_ERASE       0xCD /* CFA Write multiple without erase */
        !           149: #define WIN_GETMEDIASTATUS             0xDA
        !           150: #define WIN_ACKMEDIACHANGE             0xDB /* ATA-1, ATA-2 vendor */
        !           151: #define WIN_POSTBOOT                   0xDC
        !           152: #define WIN_PREBOOT                    0xDD
        !           153: #define WIN_DOORLOCK                   0xDE /* lock door on removable drives */
        !           154: #define WIN_DOORUNLOCK                 0xDF /* unlock door on removable drives */
        !           155: #define WIN_STANDBYNOW1                        0xE0
        !           156: #define WIN_IDLEIMMEDIATE              0xE1 /* force drive to become "ready" */
        !           157: #define WIN_STANDBY                    0xE2 /* Set device in Standby Mode */
        !           158: #define WIN_SETIDLE1                   0xE3
        !           159: #define WIN_READ_BUFFER                        0xE4 /* force read only 1 sector */
        !           160: #define WIN_CHECKPOWERMODE1            0xE5
        !           161: #define WIN_SLEEPNOW1                  0xE6
        !           162: #define WIN_FLUSH_CACHE                        0xE7
        !           163: #define WIN_WRITE_BUFFER               0xE8 /* force write only 1 sector */
        !           164: #define WIN_WRITE_SAME                 0xE9 /* read ata-2 to use */
        !           165:        /* SET_FEATURES 0x22 or 0xDD */
        !           166: #define WIN_FLUSH_CACHE_EXT            0xEA /* 48-Bit */
        !           167: #define WIN_IDENTIFY                   0xEC /* ask drive to identify itself    */
        !           168: #define WIN_MEDIAEJECT                 0xED
        !           169: #define WIN_IDENTIFY_DMA               0xEE /* same as WIN_IDENTIFY, but DMA */
        !           170: #define WIN_SETFEATURES                        0xEF /* set special drive features */
        !           171: #define EXABYTE_ENABLE_NEST            0xF0
        !           172: #define IBM_SENSE_CONDITION            0xF0 /* measure disk temperature */
        !           173: #define WIN_SECURITY_SET_PASS          0xF1
        !           174: #define WIN_SECURITY_UNLOCK            0xF2
        !           175: #define WIN_SECURITY_ERASE_PREPARE     0xF3
        !           176: #define WIN_SECURITY_ERASE_UNIT                0xF4
        !           177: #define WIN_SECURITY_FREEZE_LOCK       0xF5
        !           178: #define CFA_WEAR_LEVEL                 0xF5 /* microdrives implement as NOP */
        !           179: #define WIN_SECURITY_DISABLE           0xF6
        !           180: #define WIN_READ_NATIVE_MAX            0xF8 /* return the native maximum address */
        !           181: #define WIN_SET_MAX                    0xF9
        !           182: #define DISABLE_SEAGATE                        0xFB
        !           183: 
        !           184: /* set to 1 set disable mult support */
        !           185: #define MAX_MULT_SECTORS 16
        !           186: 
        !           187: #define IDE_DMA_BUF_SECTORS 256
        !           188: 
        !           189: #if (IDE_DMA_BUF_SECTORS < MAX_MULT_SECTORS)
        !           190: #error "IDE_DMA_BUF_SECTORS must be bigger or equal to MAX_MULT_SECTORS"
        !           191: #endif
        !           192: 
        !           193: /* ATAPI defines */
        !           194: 
        !           195: #define ATAPI_PACKET_SIZE 12
        !           196: 
        !           197: /* The generic packet command opcodes for CD/DVD Logical Units,
        !           198:  * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
        !           199: #define GPCMD_BLANK                        0xa1
        !           200: #define GPCMD_CLOSE_TRACK                  0x5b
        !           201: #define GPCMD_FLUSH_CACHE                  0x35
        !           202: #define GPCMD_FORMAT_UNIT                  0x04
        !           203: #define GPCMD_GET_CONFIGURATION                    0x46
        !           204: #define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
        !           205: #define GPCMD_GET_PERFORMANCE              0xac
        !           206: #define GPCMD_INQUIRY                      0x12
        !           207: #define GPCMD_LOAD_UNLOAD                  0xa6
        !           208: #define GPCMD_MECHANISM_STATUS             0xbd
        !           209: #define GPCMD_MODE_SELECT_10               0x55
        !           210: #define GPCMD_MODE_SENSE_10                0x5a
        !           211: #define GPCMD_PAUSE_RESUME                 0x4b
        !           212: #define GPCMD_PLAY_AUDIO_10                0x45
        !           213: #define GPCMD_PLAY_AUDIO_MSF               0x47
        !           214: #define GPCMD_PLAY_AUDIO_TI                0x48
        !           215: #define GPCMD_PLAY_CD                      0xbc
        !           216: #define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL  0x1e
        !           217: #define GPCMD_READ_10                      0x28
        !           218: #define GPCMD_READ_12                      0xa8
        !           219: #define GPCMD_READ_CDVD_CAPACITY           0x25
        !           220: #define GPCMD_READ_CD                      0xbe
        !           221: #define GPCMD_READ_CD_MSF                  0xb9
        !           222: #define GPCMD_READ_DISC_INFO               0x51
        !           223: #define GPCMD_READ_DVD_STRUCTURE           0xad
        !           224: #define GPCMD_READ_FORMAT_CAPACITIES       0x23
        !           225: #define GPCMD_READ_HEADER                  0x44
        !           226: #define GPCMD_READ_TRACK_RZONE_INFO        0x52
        !           227: #define GPCMD_READ_SUBCHANNEL              0x42
        !           228: #define GPCMD_READ_TOC_PMA_ATIP                    0x43
        !           229: #define GPCMD_REPAIR_RZONE_TRACK           0x58
        !           230: #define GPCMD_REPORT_KEY                   0xa4
        !           231: #define GPCMD_REQUEST_SENSE                0x03
        !           232: #define GPCMD_RESERVE_RZONE_TRACK          0x53
        !           233: #define GPCMD_SCAN                         0xba
        !           234: #define GPCMD_SEEK                         0x2b
        !           235: #define GPCMD_SEND_DVD_STRUCTURE           0xad
        !           236: #define GPCMD_SEND_EVENT                   0xa2
        !           237: #define GPCMD_SEND_KEY                     0xa3
        !           238: #define GPCMD_SEND_OPC                     0x54
        !           239: #define GPCMD_SET_READ_AHEAD               0xa7
        !           240: #define GPCMD_SET_STREAMING                0xb6
        !           241: #define GPCMD_START_STOP_UNIT              0x1b
        !           242: #define GPCMD_STOP_PLAY_SCAN               0x4e
        !           243: #define GPCMD_TEST_UNIT_READY              0x00
        !           244: #define GPCMD_VERIFY_10                            0x2f
        !           245: #define GPCMD_WRITE_10                     0x2a
        !           246: #define GPCMD_WRITE_AND_VERIFY_10          0x2e
        !           247: /* This is listed as optional in ATAPI 2.6, but is (curiously)
        !           248:  * missing from Mt. Fuji, Table 57.  It _is_ mentioned in Mt. Fuji
        !           249:  * Table 377 as an MMC command for SCSi devices though...  Most ATAPI
        !           250:  * drives support it. */
        !           251: #define GPCMD_SET_SPEED                            0xbb
        !           252: /* This seems to be a SCSI specific CD-ROM opcode
        !           253:  * to play data at track/index */
        !           254: #define GPCMD_PLAYAUDIO_TI                 0x48
        !           255: /*
        !           256:  * From MS Media Status Notification Support Specification. For
        !           257:  * older drives only.
        !           258:  */
        !           259: #define GPCMD_GET_MEDIA_STATUS             0xda
        !           260: #define GPCMD_MODE_SENSE_6                 0x1a
        !           261: 
        !           262: /* Mode page codes for mode sense/set */
        !           263: #define GPMODE_R_W_ERROR_PAGE          0x01
        !           264: #define GPMODE_WRITE_PARMS_PAGE                0x05
        !           265: #define GPMODE_AUDIO_CTL_PAGE          0x0e
        !           266: #define GPMODE_POWER_PAGE              0x1a
        !           267: #define GPMODE_FAULT_FAIL_PAGE         0x1c
        !           268: #define GPMODE_TO_PROTECT_PAGE         0x1d
        !           269: #define GPMODE_CAPABILITIES_PAGE       0x2a
        !           270: #define GPMODE_ALL_PAGES               0x3f
        !           271: /* Not in Mt. Fuji, but in ATAPI 2.6 -- depricated now in favor
        !           272:  * of MODE_SENSE_POWER_PAGE */
        !           273: #define GPMODE_CDROM_PAGE              0x0d
        !           274: 
        !           275: /*
        !           276:  * Based on values from <linux/cdrom.h> but extending CD_MINS
        !           277:  * to the maximum common size allowed by the Orange's Book ATIP
        !           278:  *
        !           279:  * 90 and 99 min CDs are also available but using them as the
        !           280:  * upper limit reduces the effectiveness of the heuristic to
        !           281:  * detect DVDs burned to less than 25% of their maximum capacity
        !           282:  */
        !           283: 
        !           284: /* Some generally useful CD-ROM information */
        !           285: #define CD_MINS                       80 /* max. minutes per CD */
        !           286: #define CD_SECS                       60 /* seconds per minute */
        !           287: #define CD_FRAMES                     75 /* frames per second */
        !           288: #define CD_FRAMESIZE                2048 /* bytes per frame, "cooked" mode */
        !           289: #define CD_MAX_BYTES       (CD_MINS * CD_SECS * CD_FRAMES * CD_FRAMESIZE)
        !           290: #define CD_MAX_SECTORS     (CD_MAX_BYTES / 512)
        !           291: 
        !           292: /*
        !           293:  * The MMC values are not IDE specific and might need to be moved
        !           294:  * to a common header if they are also needed for the SCSI emulation
        !           295:  */
        !           296: 
        !           297: /* Profile list from MMC-6 revision 1 table 91 */
        !           298: #define MMC_PROFILE_NONE                0x0000
        !           299: #define MMC_PROFILE_CD_ROM              0x0008
        !           300: #define MMC_PROFILE_CD_R                0x0009
        !           301: #define MMC_PROFILE_CD_RW               0x000A
        !           302: #define MMC_PROFILE_DVD_ROM             0x0010
        !           303: #define MMC_PROFILE_DVD_R_SR            0x0011
        !           304: #define MMC_PROFILE_DVD_RAM             0x0012
        !           305: #define MMC_PROFILE_DVD_RW_RO           0x0013
        !           306: #define MMC_PROFILE_DVD_RW_SR           0x0014
        !           307: #define MMC_PROFILE_DVD_R_DL_SR         0x0015
        !           308: #define MMC_PROFILE_DVD_R_DL_JR         0x0016
        !           309: #define MMC_PROFILE_DVD_RW_DL           0x0017
        !           310: #define MMC_PROFILE_DVD_DDR             0x0018
        !           311: #define MMC_PROFILE_DVD_PLUS_RW         0x001A
        !           312: #define MMC_PROFILE_DVD_PLUS_R          0x001B
        !           313: #define MMC_PROFILE_DVD_PLUS_RW_DL      0x002A
        !           314: #define MMC_PROFILE_DVD_PLUS_R_DL       0x002B
        !           315: #define MMC_PROFILE_BD_ROM              0x0040
        !           316: #define MMC_PROFILE_BD_R_SRM            0x0041
        !           317: #define MMC_PROFILE_BD_R_RRM            0x0042
        !           318: #define MMC_PROFILE_BD_RE               0x0043
        !           319: #define MMC_PROFILE_HDDVD_ROM           0x0050
        !           320: #define MMC_PROFILE_HDDVD_R             0x0051
        !           321: #define MMC_PROFILE_HDDVD_RAM           0x0052
        !           322: #define MMC_PROFILE_HDDVD_RW            0x0053
        !           323: #define MMC_PROFILE_HDDVD_R_DL          0x0058
        !           324: #define MMC_PROFILE_HDDVD_RW_DL         0x005A
        !           325: #define MMC_PROFILE_INVALID             0xFFFF
        !           326: 
        !           327: #define ATAPI_INT_REASON_CD             0x01 /* 0 = data transfer */
        !           328: #define ATAPI_INT_REASON_IO             0x02 /* 1 = transfer to the host */
        !           329: #define ATAPI_INT_REASON_REL            0x04
        !           330: #define ATAPI_INT_REASON_TAG            0xf8
        !           331: 
        !           332: /* same constants as bochs */
        !           333: #define ASC_ILLEGAL_OPCODE                   0x20
        !           334: #define ASC_LOGICAL_BLOCK_OOR                0x21
        !           335: #define ASC_INV_FIELD_IN_CMD_PACKET          0x24
        !           336: #define ASC_MEDIUM_MAY_HAVE_CHANGED          0x28
        !           337: #define ASC_INCOMPATIBLE_FORMAT              0x30
        !           338: #define ASC_MEDIUM_NOT_PRESENT               0x3a
        !           339: #define ASC_SAVING_PARAMETERS_NOT_SUPPORTED  0x39
        !           340: #define ASC_MEDIA_REMOVAL_PREVENTED          0x53
        !           341: 
        !           342: #define CFA_NO_ERROR            0x00
        !           343: #define CFA_MISC_ERROR          0x09
        !           344: #define CFA_INVALID_COMMAND     0x20
        !           345: #define CFA_INVALID_ADDRESS     0x21
        !           346: #define CFA_ADDRESS_OVERFLOW    0x2f
        !           347: 
        !           348: #define SENSE_NONE            0
        !           349: #define SENSE_NOT_READY       2
        !           350: #define SENSE_ILLEGAL_REQUEST 5
        !           351: #define SENSE_UNIT_ATTENTION  6
        !           352: 
        !           353: #define SMART_READ_DATA       0xd0
        !           354: #define SMART_READ_THRESH     0xd1
        !           355: #define SMART_ATTR_AUTOSAVE   0xd2
        !           356: #define SMART_SAVE_ATTR       0xd3
        !           357: #define SMART_EXECUTE_OFFLINE 0xd4
        !           358: #define SMART_READ_LOG        0xd5
        !           359: #define SMART_WRITE_LOG       0xd6
        !           360: #define SMART_ENABLE          0xd8
        !           361: #define SMART_DISABLE         0xd9
        !           362: #define SMART_STATUS          0xda
        !           363: 
        !           364: typedef void EndTransferFunc(IDEState *);
        !           365: 
        !           366: /* NOTE: IDEState represents in fact one drive */
        !           367: struct IDEState {
        !           368:     IDEBus *bus;
        !           369:     uint8_t unit;
        !           370:     /* ide config */
        !           371:     int is_cdrom;
        !           372:     int is_cf;
        !           373:     int cylinders, heads, sectors;
        !           374:     int64_t nb_sectors;
        !           375:     int mult_sectors;
        !           376:     int identify_set;
        !           377:     uint8_t identify_data[512];
        !           378:     int drive_serial;
        !           379:     char drive_serial_str[21];
        !           380:     /* ide regs */
        !           381:     uint8_t feature;
        !           382:     uint8_t error;
        !           383:     uint32_t nsector;
        !           384:     uint8_t sector;
        !           385:     uint8_t lcyl;
        !           386:     uint8_t hcyl;
        !           387:     /* other part of tf for lba48 support */
        !           388:     uint8_t hob_feature;
        !           389:     uint8_t hob_nsector;
        !           390:     uint8_t hob_sector;
        !           391:     uint8_t hob_lcyl;
        !           392:     uint8_t hob_hcyl;
        !           393: 
        !           394:     uint8_t select;
        !           395:     uint8_t status;
        !           396: 
        !           397:     /* set for lba48 access */
        !           398:     uint8_t lba48;
        !           399:     BlockDriverState *bs;
        !           400:     /* ATAPI specific */
        !           401:     uint8_t sense_key;
        !           402:     uint8_t asc;
        !           403:     uint8_t cdrom_changed;
        !           404:     int packet_transfer_size;
        !           405:     int elementary_transfer_size;
        !           406:     int io_buffer_index;
        !           407:     int lba;
        !           408:     int cd_sector_size;
        !           409:     int atapi_dma; /* true if dma is requested for the packet cmd */
        !           410:     /* ATA DMA state */
        !           411:     int io_buffer_size;
        !           412:     QEMUSGList sg;
        !           413:     /* PIO transfer handling */
        !           414:     int req_nb_sectors; /* number of sectors per interrupt */
        !           415:     EndTransferFunc *end_transfer_func;
        !           416:     uint8_t *data_ptr;
        !           417:     uint8_t *data_end;
        !           418:     uint8_t *io_buffer;
        !           419:     QEMUTimer *sector_write_timer; /* only used for win2k install hack */
        !           420:     uint32_t irq_count; /* counts IRQs when using win2k install hack */
        !           421:     /* CF-ATA extended error */
        !           422:     uint8_t ext_error;
        !           423:     /* CF-ATA metadata storage */
        !           424:     uint32_t mdata_size;
        !           425:     uint8_t *mdata_storage;
        !           426:     int media_changed;
        !           427:     /* for pmac */
        !           428:     int is_read;
        !           429:     /* SMART */
        !           430:     uint8_t smart_enabled;
        !           431:     uint8_t smart_autosave;
        !           432:     int smart_errors;
        !           433:     uint8_t smart_selftest_count;
        !           434:     uint8_t *smart_selftest_data;
        !           435: };
        !           436: 
        !           437: struct IDEBus {
        !           438:     BusState qbus;
        !           439:     IDEDevice *master;
        !           440:     IDEDevice *slave;
        !           441:     BMDMAState *bmdma;
        !           442:     IDEState ifs[2];
        !           443:     uint8_t unit;
        !           444:     uint8_t cmd;
        !           445:     qemu_irq irq;
        !           446: };
        !           447: 
        !           448: struct IDEDevice {
        !           449:     DeviceState qdev;
        !           450:     uint32_t unit;
        !           451:     DriveInfo *dinfo;
        !           452: };
        !           453: 
        !           454: typedef int (*ide_qdev_initfn)(IDEDevice *dev);
        !           455: struct IDEDeviceInfo {
        !           456:     DeviceInfo qdev;
        !           457:     ide_qdev_initfn init;
        !           458:     uint32_t unit;
        !           459:     DriveInfo *drive;
        !           460: };
        !           461: 
        !           462: #define BM_STATUS_DMAING 0x01
        !           463: #define BM_STATUS_ERROR  0x02
        !           464: #define BM_STATUS_INT    0x04
        !           465: #define BM_STATUS_DMA_RETRY  0x08
        !           466: #define BM_STATUS_PIO_RETRY  0x10
        !           467: #define BM_STATUS_RETRY_READ 0x20
        !           468: 
        !           469: #define BM_CMD_START     0x01
        !           470: #define BM_CMD_READ      0x08
        !           471: 
        !           472: struct BMDMAState {
        !           473:     uint8_t cmd;
        !           474:     uint8_t status;
        !           475:     uint32_t addr;
        !           476: 
        !           477:     IDEBus *bus;
        !           478:     /* current transfer state */
        !           479:     uint32_t cur_addr;
        !           480:     uint32_t cur_prd_last;
        !           481:     uint32_t cur_prd_addr;
        !           482:     uint32_t cur_prd_len;
        !           483:     uint8_t unit;
        !           484:     BlockDriverCompletionFunc *dma_cb;
        !           485:     BlockDriverAIOCB *aiocb;
        !           486:     struct iovec iov;
        !           487:     QEMUIOVector qiov;
        !           488:     int64_t sector_num;
        !           489:     uint32_t nsector;
        !           490:     QEMUBH *bh;
        !           491: };
        !           492: 
        !           493: static inline IDEState *idebus_active_if(IDEBus *bus)
        !           494: {
        !           495:     return bus->ifs + bus->unit;
        !           496: }
        !           497: 
        !           498: static inline IDEState *bmdma_active_if(BMDMAState *bmdma)
        !           499: {
        !           500:     assert(bmdma->unit != (uint8_t)-1);
        !           501:     return bmdma->bus->ifs + bmdma->unit;
        !           502: }
        !           503: 
        !           504: static inline void ide_set_irq(IDEBus *bus)
        !           505: {
        !           506:     BMDMAState *bm = bus->bmdma;
        !           507:     if (!(bus->cmd & IDE_CMD_DISABLE_IRQ)) {
        !           508:         if (bm) {
        !           509:             bm->status |= BM_STATUS_INT;
        !           510:         }
        !           511:         qemu_irq_raise(bus->irq);
        !           512:     }
        !           513: }
        !           514: 
        !           515: /* hw/ide/core.c */
        !           516: extern const VMStateDescription vmstate_ide_bus;
        !           517: 
        !           518: #define VMSTATE_IDE_BUS(_field, _state)                          \
        !           519:     VMSTATE_STRUCT(_field, _state, 1, vmstate_ide_bus, IDEBus)
        !           520: 
        !           521: #define VMSTATE_IDE_BUS_ARRAY(_field, _state, _num)              \
        !           522:     VMSTATE_STRUCT_ARRAY(_field, _state, _num, 1, vmstate_ide_bus, IDEBus)
        !           523: 
        !           524: extern const VMStateDescription vmstate_ide_drive;
        !           525: 
        !           526: #define VMSTATE_IDE_DRIVES(_field, _state) \
        !           527:     VMSTATE_STRUCT_ARRAY(_field, _state, 2, 3, vmstate_ide_drive, IDEState)
        !           528: 
        !           529: void ide_bus_reset(IDEBus *bus);
        !           530: int64_t ide_get_sector(IDEState *s);
        !           531: void ide_set_sector(IDEState *s, int64_t sector_num);
        !           532: 
        !           533: void ide_dma_cancel(BMDMAState *bm);
        !           534: void ide_dma_restart_cb(void *opaque, int running, int reason);
        !           535: void ide_dma_error(IDEState *s);
        !           536: void ide_dma_reset(BMDMAState *bm);
        !           537: 
        !           538: void ide_atapi_cmd_ok(IDEState *s);
        !           539: void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc);
        !           540: void ide_atapi_io_error(IDEState *s, int ret);
        !           541: 
        !           542: void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val);
        !           543: uint32_t ide_ioport_read(void *opaque, uint32_t addr1);
        !           544: uint32_t ide_status_read(void *opaque, uint32_t addr);
        !           545: void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val);
        !           546: void ide_data_writew(void *opaque, uint32_t addr, uint32_t val);
        !           547: uint32_t ide_data_readw(void *opaque, uint32_t addr);
        !           548: void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
        !           549: uint32_t ide_data_readl(void *opaque, uint32_t addr);
        !           550: 
        !           551: void ide_init_drive(IDEState *s, DriveInfo *dinfo);
        !           552: void ide_init2(IDEBus *bus, DriveInfo *hd0, DriveInfo *hd1,
        !           553:                qemu_irq irq);
        !           554: void ide_init_ioport(IDEBus *bus, int iobase, int iobase2);
        !           555: 
        !           556: /* hw/ide/qdev.c */
        !           557: void ide_bus_new(IDEBus *idebus, DeviceState *dev);
        !           558: IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive);
        !           559: 
        !           560: #endif /* HW_IDE_INTERNAL_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.