Merge tag 'pull-loongarch-20240912' of https://gitlab.com/gaosong/qemu into staging
[qemu/kevin.git] / include / hw / ide / ide-dev.h
blob9a0d71db4e18957509ff9a007c23d7035dfd137d
1 /*
2 * ide device definitions
4 * Copyright (c) 2009 Gerd Hoffmann <kraxel@redhat.com>
6 * This code is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 #ifndef IDE_DEV_H
21 #define IDE_DEV_H
23 #include "sysemu/dma.h"
24 #include "hw/qdev-properties.h"
25 #include "hw/block/block.h"
27 typedef struct IDEDevice IDEDevice;
28 typedef struct IDEState IDEState;
29 typedef struct IDEBus IDEBus;
31 typedef void EndTransferFunc(IDEState *);
33 #define MAX_IDE_DEVS 2
35 #define TYPE_IDE_DEVICE "ide-device"
36 OBJECT_DECLARE_TYPE(IDEDevice, IDEDeviceClass, IDE_DEVICE)
38 typedef enum { IDE_HD, IDE_CD, IDE_CFATA } IDEDriveKind;
40 struct unreported_events {
41 bool eject_request;
42 bool new_media;
45 enum ide_dma_cmd {
46 IDE_DMA_READ = 0,
47 IDE_DMA_WRITE,
48 IDE_DMA_TRIM,
49 IDE_DMA_ATAPI,
50 IDE_DMA__COUNT
53 /* NOTE: IDEState represents in fact one drive */
54 struct IDEState {
55 IDEBus *bus;
56 uint8_t unit;
57 /* ide config */
58 IDEDriveKind drive_kind;
59 int drive_heads, drive_sectors;
60 int cylinders, heads, sectors, chs_trans;
61 int64_t nb_sectors;
62 int mult_sectors;
63 int identify_set;
64 uint8_t identify_data[512];
65 int drive_serial;
66 char drive_serial_str[21];
67 char drive_model_str[41];
68 bool win2k_install_hack;
69 uint64_t wwn;
70 /* ide regs */
71 uint8_t feature;
72 uint8_t error;
73 uint32_t nsector;
74 uint8_t sector;
75 uint8_t lcyl;
76 uint8_t hcyl;
77 /* other part of tf for lba48 support */
78 uint8_t hob_feature;
79 uint8_t hob_nsector;
80 uint8_t hob_sector;
81 uint8_t hob_lcyl;
82 uint8_t hob_hcyl;
84 uint8_t select;
85 uint8_t status;
87 bool io8;
88 bool reset_reverts;
90 /* set for lba48 access */
91 uint8_t lba48;
92 BlockBackend *blk;
93 char version[9];
94 /* ATAPI specific */
95 struct unreported_events events;
96 uint8_t sense_key;
97 uint8_t asc;
98 bool tray_open;
99 bool tray_locked;
100 uint8_t cdrom_changed;
101 int packet_transfer_size;
102 int elementary_transfer_size;
103 int32_t io_buffer_index;
104 int lba;
105 int cd_sector_size;
106 int atapi_dma; /* true if dma is requested for the packet cmd */
107 BlockAcctCookie acct;
108 BlockAIOCB *pio_aiocb;
109 QEMUIOVector qiov;
110 QLIST_HEAD(, IDEBufferedRequest) buffered_requests;
111 /* ATA DMA state */
112 uint64_t io_buffer_offset;
113 int32_t io_buffer_size;
114 QEMUSGList sg;
115 /* PIO transfer handling */
116 int req_nb_sectors; /* number of sectors per interrupt */
117 EndTransferFunc *end_transfer_func;
118 uint8_t *data_ptr;
119 uint8_t *data_end;
120 uint8_t *io_buffer;
121 /* PIO save/restore */
122 int32_t io_buffer_total_len;
123 int32_t cur_io_buffer_offset;
124 int32_t cur_io_buffer_len;
125 uint8_t end_transfer_fn_idx;
126 QEMUTimer *sector_write_timer; /* only used for win2k install hack */
127 uint32_t irq_count; /* counts IRQs when using win2k install hack */
128 /* CF-ATA extended error */
129 uint8_t ext_error;
130 /* CF-ATA metadata storage */
131 uint32_t mdata_size;
132 uint8_t *mdata_storage;
133 int media_changed;
134 enum ide_dma_cmd dma_cmd;
135 /* SMART */
136 uint8_t smart_enabled;
137 uint8_t smart_autosave;
138 int smart_errors;
139 uint8_t smart_selftest_count;
140 uint8_t *smart_selftest_data;
141 /* AHCI */
142 int ncq_queues;
145 struct IDEDeviceClass {
146 DeviceClass parent_class;
147 void (*realize)(IDEDevice *dev, Error **errp);
150 struct IDEDevice {
151 DeviceState qdev;
152 uint32_t unit;
153 BlockConf conf;
154 int chs_trans;
155 char *version;
156 char *serial;
157 char *model;
158 uint64_t wwn;
160 * 0x0000 - rotation rate not reported
161 * 0x0001 - non-rotating medium (SSD)
162 * 0x0002-0x0400 - reserved
163 * 0x0401-0xffe - rotations per minute
164 * 0xffff - reserved
166 uint16_t rotation_rate;
167 bool win2k_install_hack;
170 typedef struct IDEDrive {
171 IDEDevice dev;
172 } IDEDrive;
174 #define DEFINE_IDE_DEV_PROPERTIES() \
175 DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf), \
176 DEFINE_BLOCK_ERROR_PROPERTIES(IDEDrive, dev.conf), \
177 DEFINE_PROP_STRING("ver", IDEDrive, dev.version), \
178 DEFINE_PROP_UINT64("wwn", IDEDrive, dev.wwn, 0), \
179 DEFINE_PROP_STRING("serial", IDEDrive, dev.serial),\
180 DEFINE_PROP_STRING("model", IDEDrive, dev.model)
182 void ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind, Error **errp);
184 void ide_drive_get(DriveInfo **hd, int max_bus);
186 #endif