ahci.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  1. /*
  2. * QEMU AHCI Emulation
  3. *
  4. * Copyright (c) 2010 qiaochong@loongson.cn
  5. * Copyright (c) 2010 Roland Elek <elek.roland@gmail.com>
  6. * Copyright (c) 2010 Sebastian Herbszt <herbszt@gmx.de>
  7. * Copyright (c) 2010 Alexander Graf <agraf@suse.de>
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2 of the License, or (at your option) any later version.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  21. *
  22. */
  23. #include <hw/hw.h>
  24. #include <hw/pci/msi.h>
  25. #include <hw/pc.h>
  26. #include <hw/pci/pci.h>
  27. #include <hw/sysbus.h>
  28. #include "monitor.h"
  29. #include "dma.h"
  30. #include "cpu-common.h"
  31. #include "internal.h"
  32. #include <hw/ide/pci.h>
  33. #include <hw/ide/ahci.h>
  34. /* #define DEBUG_AHCI */
  35. #ifdef DEBUG_AHCI
  36. #define DPRINTF(port, fmt, ...) \
  37. do { fprintf(stderr, "ahci: %s: [%d] ", __FUNCTION__, port); \
  38. fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
  39. #else
  40. #define DPRINTF(port, fmt, ...) do {} while(0)
  41. #endif
  42. static void check_cmd(AHCIState *s, int port);
  43. static int handle_cmd(AHCIState *s,int port,int slot);
  44. static void ahci_reset_port(AHCIState *s, int port);
  45. static void ahci_write_fis_d2h(AHCIDevice *ad, uint8_t *cmd_fis);
  46. static void ahci_init_d2h(AHCIDevice *ad);
  47. static uint32_t ahci_port_read(AHCIState *s, int port, int offset)
  48. {
  49. uint32_t val;
  50. AHCIPortRegs *pr;
  51. pr = &s->dev[port].port_regs;
  52. switch (offset) {
  53. case PORT_LST_ADDR:
  54. val = pr->lst_addr;
  55. break;
  56. case PORT_LST_ADDR_HI:
  57. val = pr->lst_addr_hi;
  58. break;
  59. case PORT_FIS_ADDR:
  60. val = pr->fis_addr;
  61. break;
  62. case PORT_FIS_ADDR_HI:
  63. val = pr->fis_addr_hi;
  64. break;
  65. case PORT_IRQ_STAT:
  66. val = pr->irq_stat;
  67. break;
  68. case PORT_IRQ_MASK:
  69. val = pr->irq_mask;
  70. break;
  71. case PORT_CMD:
  72. val = pr->cmd;
  73. break;
  74. case PORT_TFDATA:
  75. val = ((uint16_t)s->dev[port].port.ifs[0].error << 8) |
  76. s->dev[port].port.ifs[0].status;
  77. break;
  78. case PORT_SIG:
  79. val = pr->sig;
  80. break;
  81. case PORT_SCR_STAT:
  82. if (s->dev[port].port.ifs[0].bs) {
  83. val = SATA_SCR_SSTATUS_DET_DEV_PRESENT_PHY_UP |
  84. SATA_SCR_SSTATUS_SPD_GEN1 | SATA_SCR_SSTATUS_IPM_ACTIVE;
  85. } else {
  86. val = SATA_SCR_SSTATUS_DET_NODEV;
  87. }
  88. break;
  89. case PORT_SCR_CTL:
  90. val = pr->scr_ctl;
  91. break;
  92. case PORT_SCR_ERR:
  93. val = pr->scr_err;
  94. break;
  95. case PORT_SCR_ACT:
  96. pr->scr_act &= ~s->dev[port].finished;
  97. s->dev[port].finished = 0;
  98. val = pr->scr_act;
  99. break;
  100. case PORT_CMD_ISSUE:
  101. val = pr->cmd_issue;
  102. break;
  103. case PORT_RESERVED:
  104. default:
  105. val = 0;
  106. }
  107. DPRINTF(port, "offset: 0x%x val: 0x%x\n", offset, val);
  108. return val;
  109. }
  110. static void ahci_irq_raise(AHCIState *s, AHCIDevice *dev)
  111. {
  112. struct AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
  113. DPRINTF(0, "raise irq\n");
  114. if (msi_enabled(&d->card)) {
  115. msi_notify(&d->card, 0);
  116. } else {
  117. qemu_irq_raise(s->irq);
  118. }
  119. }
  120. static void ahci_irq_lower(AHCIState *s, AHCIDevice *dev)
  121. {
  122. struct AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
  123. DPRINTF(0, "lower irq\n");
  124. if (!msi_enabled(&d->card)) {
  125. qemu_irq_lower(s->irq);
  126. }
  127. }
  128. static void ahci_check_irq(AHCIState *s)
  129. {
  130. int i;
  131. DPRINTF(-1, "check irq %#x\n", s->control_regs.irqstatus);
  132. s->control_regs.irqstatus = 0;
  133. for (i = 0; i < s->ports; i++) {
  134. AHCIPortRegs *pr = &s->dev[i].port_regs;
  135. if (pr->irq_stat & pr->irq_mask) {
  136. s->control_regs.irqstatus |= (1 << i);
  137. }
  138. }
  139. if (s->control_regs.irqstatus &&
  140. (s->control_regs.ghc & HOST_CTL_IRQ_EN)) {
  141. ahci_irq_raise(s, NULL);
  142. } else {
  143. ahci_irq_lower(s, NULL);
  144. }
  145. }
  146. static void ahci_trigger_irq(AHCIState *s, AHCIDevice *d,
  147. int irq_type)
  148. {
  149. DPRINTF(d->port_no, "trigger irq %#x -> %x\n",
  150. irq_type, d->port_regs.irq_mask & irq_type);
  151. d->port_regs.irq_stat |= irq_type;
  152. ahci_check_irq(s);
  153. }
  154. static void map_page(uint8_t **ptr, uint64_t addr, uint32_t wanted)
  155. {
  156. hwaddr len = wanted;
  157. if (*ptr) {
  158. cpu_physical_memory_unmap(*ptr, len, 1, len);
  159. }
  160. *ptr = cpu_physical_memory_map(addr, &len, 1);
  161. if (len < wanted) {
  162. cpu_physical_memory_unmap(*ptr, len, 1, len);
  163. *ptr = NULL;
  164. }
  165. }
  166. static void ahci_port_write(AHCIState *s, int port, int offset, uint32_t val)
  167. {
  168. AHCIPortRegs *pr = &s->dev[port].port_regs;
  169. DPRINTF(port, "offset: 0x%x val: 0x%x\n", offset, val);
  170. switch (offset) {
  171. case PORT_LST_ADDR:
  172. pr->lst_addr = val;
  173. map_page(&s->dev[port].lst,
  174. ((uint64_t)pr->lst_addr_hi << 32) | pr->lst_addr, 1024);
  175. s->dev[port].cur_cmd = NULL;
  176. break;
  177. case PORT_LST_ADDR_HI:
  178. pr->lst_addr_hi = val;
  179. map_page(&s->dev[port].lst,
  180. ((uint64_t)pr->lst_addr_hi << 32) | pr->lst_addr, 1024);
  181. s->dev[port].cur_cmd = NULL;
  182. break;
  183. case PORT_FIS_ADDR:
  184. pr->fis_addr = val;
  185. map_page(&s->dev[port].res_fis,
  186. ((uint64_t)pr->fis_addr_hi << 32) | pr->fis_addr, 256);
  187. break;
  188. case PORT_FIS_ADDR_HI:
  189. pr->fis_addr_hi = val;
  190. map_page(&s->dev[port].res_fis,
  191. ((uint64_t)pr->fis_addr_hi << 32) | pr->fis_addr, 256);
  192. break;
  193. case PORT_IRQ_STAT:
  194. pr->irq_stat &= ~val;
  195. ahci_check_irq(s);
  196. break;
  197. case PORT_IRQ_MASK:
  198. pr->irq_mask = val & 0xfdc000ff;
  199. ahci_check_irq(s);
  200. break;
  201. case PORT_CMD:
  202. pr->cmd = val & ~(PORT_CMD_LIST_ON | PORT_CMD_FIS_ON);
  203. if (pr->cmd & PORT_CMD_START) {
  204. pr->cmd |= PORT_CMD_LIST_ON;
  205. }
  206. if (pr->cmd & PORT_CMD_FIS_RX) {
  207. pr->cmd |= PORT_CMD_FIS_ON;
  208. }
  209. /* XXX usually the FIS would be pending on the bus here and
  210. issuing deferred until the OS enables FIS receival.
  211. Instead, we only submit it once - which works in most
  212. cases, but is a hack. */
  213. if ((pr->cmd & PORT_CMD_FIS_ON) &&
  214. !s->dev[port].init_d2h_sent) {
  215. ahci_init_d2h(&s->dev[port]);
  216. s->dev[port].init_d2h_sent = 1;
  217. }
  218. check_cmd(s, port);
  219. break;
  220. case PORT_TFDATA:
  221. s->dev[port].port.ifs[0].error = (val >> 8) & 0xff;
  222. s->dev[port].port.ifs[0].status = val & 0xff;
  223. break;
  224. case PORT_SIG:
  225. pr->sig = val;
  226. break;
  227. case PORT_SCR_STAT:
  228. pr->scr_stat = val;
  229. break;
  230. case PORT_SCR_CTL:
  231. if (((pr->scr_ctl & AHCI_SCR_SCTL_DET) == 1) &&
  232. ((val & AHCI_SCR_SCTL_DET) == 0)) {
  233. ahci_reset_port(s, port);
  234. }
  235. pr->scr_ctl = val;
  236. break;
  237. case PORT_SCR_ERR:
  238. pr->scr_err &= ~val;
  239. break;
  240. case PORT_SCR_ACT:
  241. /* RW1 */
  242. pr->scr_act |= val;
  243. break;
  244. case PORT_CMD_ISSUE:
  245. pr->cmd_issue |= val;
  246. check_cmd(s, port);
  247. break;
  248. default:
  249. break;
  250. }
  251. }
  252. static uint64_t ahci_mem_read(void *opaque, hwaddr addr,
  253. unsigned size)
  254. {
  255. AHCIState *s = opaque;
  256. uint32_t val = 0;
  257. if (addr < AHCI_GENERIC_HOST_CONTROL_REGS_MAX_ADDR) {
  258. switch (addr) {
  259. case HOST_CAP:
  260. val = s->control_regs.cap;
  261. break;
  262. case HOST_CTL:
  263. val = s->control_regs.ghc;
  264. break;
  265. case HOST_IRQ_STAT:
  266. val = s->control_regs.irqstatus;
  267. break;
  268. case HOST_PORTS_IMPL:
  269. val = s->control_regs.impl;
  270. break;
  271. case HOST_VERSION:
  272. val = s->control_regs.version;
  273. break;
  274. }
  275. DPRINTF(-1, "(addr 0x%08X), val 0x%08X\n", (unsigned) addr, val);
  276. } else if ((addr >= AHCI_PORT_REGS_START_ADDR) &&
  277. (addr < (AHCI_PORT_REGS_START_ADDR +
  278. (s->ports * AHCI_PORT_ADDR_OFFSET_LEN)))) {
  279. val = ahci_port_read(s, (addr - AHCI_PORT_REGS_START_ADDR) >> 7,
  280. addr & AHCI_PORT_ADDR_OFFSET_MASK);
  281. }
  282. return val;
  283. }
  284. static void ahci_mem_write(void *opaque, hwaddr addr,
  285. uint64_t val, unsigned size)
  286. {
  287. AHCIState *s = opaque;
  288. /* Only aligned reads are allowed on AHCI */
  289. if (addr & 3) {
  290. fprintf(stderr, "ahci: Mis-aligned write to addr 0x"
  291. TARGET_FMT_plx "\n", addr);
  292. return;
  293. }
  294. if (addr < AHCI_GENERIC_HOST_CONTROL_REGS_MAX_ADDR) {
  295. DPRINTF(-1, "(addr 0x%08X), val 0x%08"PRIX64"\n", (unsigned) addr, val);
  296. switch (addr) {
  297. case HOST_CAP: /* R/WO, RO */
  298. /* FIXME handle R/WO */
  299. break;
  300. case HOST_CTL: /* R/W */
  301. if (val & HOST_CTL_RESET) {
  302. DPRINTF(-1, "HBA Reset\n");
  303. ahci_reset(s);
  304. } else {
  305. s->control_regs.ghc = (val & 0x3) | HOST_CTL_AHCI_EN;
  306. ahci_check_irq(s);
  307. }
  308. break;
  309. case HOST_IRQ_STAT: /* R/WC, RO */
  310. s->control_regs.irqstatus &= ~val;
  311. ahci_check_irq(s);
  312. break;
  313. case HOST_PORTS_IMPL: /* R/WO, RO */
  314. /* FIXME handle R/WO */
  315. break;
  316. case HOST_VERSION: /* RO */
  317. /* FIXME report write? */
  318. break;
  319. default:
  320. DPRINTF(-1, "write to unknown register 0x%x\n", (unsigned)addr);
  321. }
  322. } else if ((addr >= AHCI_PORT_REGS_START_ADDR) &&
  323. (addr < (AHCI_PORT_REGS_START_ADDR +
  324. (s->ports * AHCI_PORT_ADDR_OFFSET_LEN)))) {
  325. ahci_port_write(s, (addr - AHCI_PORT_REGS_START_ADDR) >> 7,
  326. addr & AHCI_PORT_ADDR_OFFSET_MASK, val);
  327. }
  328. }
  329. static const MemoryRegionOps ahci_mem_ops = {
  330. .read = ahci_mem_read,
  331. .write = ahci_mem_write,
  332. .endianness = DEVICE_LITTLE_ENDIAN,
  333. };
  334. static uint64_t ahci_idp_read(void *opaque, hwaddr addr,
  335. unsigned size)
  336. {
  337. AHCIState *s = opaque;
  338. if (addr == s->idp_offset) {
  339. /* index register */
  340. return s->idp_index;
  341. } else if (addr == s->idp_offset + 4) {
  342. /* data register - do memory read at location selected by index */
  343. return ahci_mem_read(opaque, s->idp_index, size);
  344. } else {
  345. return 0;
  346. }
  347. }
  348. static void ahci_idp_write(void *opaque, hwaddr addr,
  349. uint64_t val, unsigned size)
  350. {
  351. AHCIState *s = opaque;
  352. if (addr == s->idp_offset) {
  353. /* index register - mask off reserved bits */
  354. s->idp_index = (uint32_t)val & ((AHCI_MEM_BAR_SIZE - 1) & ~3);
  355. } else if (addr == s->idp_offset + 4) {
  356. /* data register - do memory write at location selected by index */
  357. ahci_mem_write(opaque, s->idp_index, val, size);
  358. }
  359. }
  360. static const MemoryRegionOps ahci_idp_ops = {
  361. .read = ahci_idp_read,
  362. .write = ahci_idp_write,
  363. .endianness = DEVICE_LITTLE_ENDIAN,
  364. };
  365. static void ahci_reg_init(AHCIState *s)
  366. {
  367. int i;
  368. s->control_regs.cap = (s->ports - 1) |
  369. (AHCI_NUM_COMMAND_SLOTS << 8) |
  370. (AHCI_SUPPORTED_SPEED_GEN1 << AHCI_SUPPORTED_SPEED) |
  371. HOST_CAP_NCQ | HOST_CAP_AHCI;
  372. s->control_regs.impl = (1 << s->ports) - 1;
  373. s->control_regs.version = AHCI_VERSION_1_0;
  374. for (i = 0; i < s->ports; i++) {
  375. s->dev[i].port_state = STATE_RUN;
  376. }
  377. }
  378. static void check_cmd(AHCIState *s, int port)
  379. {
  380. AHCIPortRegs *pr = &s->dev[port].port_regs;
  381. int slot;
  382. if ((pr->cmd & PORT_CMD_START) && pr->cmd_issue) {
  383. for (slot = 0; (slot < 32) && pr->cmd_issue; slot++) {
  384. if ((pr->cmd_issue & (1 << slot)) &&
  385. !handle_cmd(s, port, slot)) {
  386. pr->cmd_issue &= ~(1 << slot);
  387. }
  388. }
  389. }
  390. }
  391. static void ahci_check_cmd_bh(void *opaque)
  392. {
  393. AHCIDevice *ad = opaque;
  394. qemu_bh_delete(ad->check_bh);
  395. ad->check_bh = NULL;
  396. if ((ad->busy_slot != -1) &&
  397. !(ad->port.ifs[0].status & (BUSY_STAT|DRQ_STAT))) {
  398. /* no longer busy */
  399. ad->port_regs.cmd_issue &= ~(1 << ad->busy_slot);
  400. ad->busy_slot = -1;
  401. }
  402. check_cmd(ad->hba, ad->port_no);
  403. }
  404. static void ahci_init_d2h(AHCIDevice *ad)
  405. {
  406. uint8_t init_fis[20];
  407. IDEState *ide_state = &ad->port.ifs[0];
  408. memset(init_fis, 0, sizeof(init_fis));
  409. init_fis[4] = 1;
  410. init_fis[12] = 1;
  411. if (ide_state->drive_kind == IDE_CD) {
  412. init_fis[5] = ide_state->lcyl;
  413. init_fis[6] = ide_state->hcyl;
  414. }
  415. ahci_write_fis_d2h(ad, init_fis);
  416. }
  417. static void ahci_reset_port(AHCIState *s, int port)
  418. {
  419. AHCIDevice *d = &s->dev[port];
  420. AHCIPortRegs *pr = &d->port_regs;
  421. IDEState *ide_state = &d->port.ifs[0];
  422. int i;
  423. DPRINTF(port, "reset port\n");
  424. ide_bus_reset(&d->port);
  425. ide_state->ncq_queues = AHCI_MAX_CMDS;
  426. pr->scr_stat = 0;
  427. pr->scr_err = 0;
  428. pr->scr_act = 0;
  429. d->busy_slot = -1;
  430. d->init_d2h_sent = 0;
  431. ide_state = &s->dev[port].port.ifs[0];
  432. if (!ide_state->bs) {
  433. return;
  434. }
  435. /* reset ncq queue */
  436. for (i = 0; i < AHCI_MAX_CMDS; i++) {
  437. NCQTransferState *ncq_tfs = &s->dev[port].ncq_tfs[i];
  438. if (!ncq_tfs->used) {
  439. continue;
  440. }
  441. if (ncq_tfs->aiocb) {
  442. bdrv_aio_cancel(ncq_tfs->aiocb);
  443. ncq_tfs->aiocb = NULL;
  444. }
  445. /* Maybe we just finished the request thanks to bdrv_aio_cancel() */
  446. if (!ncq_tfs->used) {
  447. continue;
  448. }
  449. qemu_sglist_destroy(&ncq_tfs->sglist);
  450. ncq_tfs->used = 0;
  451. }
  452. s->dev[port].port_state = STATE_RUN;
  453. if (!ide_state->bs) {
  454. s->dev[port].port_regs.sig = 0;
  455. ide_state->status = SEEK_STAT | WRERR_STAT;
  456. } else if (ide_state->drive_kind == IDE_CD) {
  457. s->dev[port].port_regs.sig = SATA_SIGNATURE_CDROM;
  458. ide_state->lcyl = 0x14;
  459. ide_state->hcyl = 0xeb;
  460. DPRINTF(port, "set lcyl = %d\n", ide_state->lcyl);
  461. ide_state->status = SEEK_STAT | WRERR_STAT | READY_STAT;
  462. } else {
  463. s->dev[port].port_regs.sig = SATA_SIGNATURE_DISK;
  464. ide_state->status = SEEK_STAT | WRERR_STAT;
  465. }
  466. ide_state->error = 1;
  467. ahci_init_d2h(d);
  468. }
  469. static void debug_print_fis(uint8_t *fis, int cmd_len)
  470. {
  471. #ifdef DEBUG_AHCI
  472. int i;
  473. fprintf(stderr, "fis:");
  474. for (i = 0; i < cmd_len; i++) {
  475. if ((i & 0xf) == 0) {
  476. fprintf(stderr, "\n%02x:",i);
  477. }
  478. fprintf(stderr, "%02x ",fis[i]);
  479. }
  480. fprintf(stderr, "\n");
  481. #endif
  482. }
  483. static void ahci_write_fis_sdb(AHCIState *s, int port, uint32_t finished)
  484. {
  485. AHCIPortRegs *pr = &s->dev[port].port_regs;
  486. IDEState *ide_state;
  487. uint8_t *sdb_fis;
  488. if (!s->dev[port].res_fis ||
  489. !(pr->cmd & PORT_CMD_FIS_RX)) {
  490. return;
  491. }
  492. sdb_fis = &s->dev[port].res_fis[RES_FIS_SDBFIS];
  493. ide_state = &s->dev[port].port.ifs[0];
  494. /* clear memory */
  495. *(uint32_t*)sdb_fis = 0;
  496. /* write values */
  497. sdb_fis[0] = ide_state->error;
  498. sdb_fis[2] = ide_state->status & 0x77;
  499. s->dev[port].finished |= finished;
  500. *(uint32_t*)(sdb_fis + 4) = cpu_to_le32(s->dev[port].finished);
  501. ahci_trigger_irq(s, &s->dev[port], PORT_IRQ_STAT_SDBS);
  502. }
  503. static void ahci_write_fis_d2h(AHCIDevice *ad, uint8_t *cmd_fis)
  504. {
  505. AHCIPortRegs *pr = &ad->port_regs;
  506. uint8_t *d2h_fis;
  507. int i;
  508. dma_addr_t cmd_len = 0x80;
  509. int cmd_mapped = 0;
  510. if (!ad->res_fis || !(pr->cmd & PORT_CMD_FIS_RX)) {
  511. return;
  512. }
  513. if (!cmd_fis) {
  514. /* map cmd_fis */
  515. uint64_t tbl_addr = le64_to_cpu(ad->cur_cmd->tbl_addr);
  516. cmd_fis = dma_memory_map(ad->hba->dma, tbl_addr, &cmd_len,
  517. DMA_DIRECTION_TO_DEVICE);
  518. cmd_mapped = 1;
  519. }
  520. d2h_fis = &ad->res_fis[RES_FIS_RFIS];
  521. d2h_fis[0] = 0x34;
  522. d2h_fis[1] = (ad->hba->control_regs.irqstatus ? (1 << 6) : 0);
  523. d2h_fis[2] = ad->port.ifs[0].status;
  524. d2h_fis[3] = ad->port.ifs[0].error;
  525. d2h_fis[4] = cmd_fis[4];
  526. d2h_fis[5] = cmd_fis[5];
  527. d2h_fis[6] = cmd_fis[6];
  528. d2h_fis[7] = cmd_fis[7];
  529. d2h_fis[8] = cmd_fis[8];
  530. d2h_fis[9] = cmd_fis[9];
  531. d2h_fis[10] = cmd_fis[10];
  532. d2h_fis[11] = cmd_fis[11];
  533. d2h_fis[12] = cmd_fis[12];
  534. d2h_fis[13] = cmd_fis[13];
  535. for (i = 14; i < 20; i++) {
  536. d2h_fis[i] = 0;
  537. }
  538. if (d2h_fis[2] & ERR_STAT) {
  539. ahci_trigger_irq(ad->hba, ad, PORT_IRQ_STAT_TFES);
  540. }
  541. ahci_trigger_irq(ad->hba, ad, PORT_IRQ_D2H_REG_FIS);
  542. if (cmd_mapped) {
  543. dma_memory_unmap(ad->hba->dma, cmd_fis, cmd_len,
  544. DMA_DIRECTION_TO_DEVICE, cmd_len);
  545. }
  546. }
  547. static int ahci_populate_sglist(AHCIDevice *ad, QEMUSGList *sglist, int offset)
  548. {
  549. AHCICmdHdr *cmd = ad->cur_cmd;
  550. uint32_t opts = le32_to_cpu(cmd->opts);
  551. uint64_t prdt_addr = le64_to_cpu(cmd->tbl_addr) + 0x80;
  552. int sglist_alloc_hint = opts >> AHCI_CMD_HDR_PRDT_LEN;
  553. dma_addr_t prdt_len = (sglist_alloc_hint * sizeof(AHCI_SG));
  554. dma_addr_t real_prdt_len = prdt_len;
  555. uint8_t *prdt;
  556. int i;
  557. int r = 0;
  558. int sum = 0;
  559. int off_idx = -1;
  560. int off_pos = -1;
  561. int tbl_entry_size;
  562. if (!sglist_alloc_hint) {
  563. DPRINTF(ad->port_no, "no sg list given by guest: 0x%08x\n", opts);
  564. return -1;
  565. }
  566. /* map PRDT */
  567. if (!(prdt = dma_memory_map(ad->hba->dma, prdt_addr, &prdt_len,
  568. DMA_DIRECTION_TO_DEVICE))){
  569. DPRINTF(ad->port_no, "map failed\n");
  570. return -1;
  571. }
  572. if (prdt_len < real_prdt_len) {
  573. DPRINTF(ad->port_no, "mapped less than expected\n");
  574. r = -1;
  575. goto out;
  576. }
  577. /* Get entries in the PRDT, init a qemu sglist accordingly */
  578. if (sglist_alloc_hint > 0) {
  579. AHCI_SG *tbl = (AHCI_SG *)prdt;
  580. sum = 0;
  581. for (i = 0; i < sglist_alloc_hint; i++) {
  582. /* flags_size is zero-based */
  583. tbl_entry_size = (le32_to_cpu(tbl[i].flags_size) + 1);
  584. if (offset <= (sum + tbl_entry_size)) {
  585. off_idx = i;
  586. off_pos = offset - sum;
  587. break;
  588. }
  589. sum += tbl_entry_size;
  590. }
  591. if ((off_idx == -1) || (off_pos < 0) || (off_pos > tbl_entry_size)) {
  592. DPRINTF(ad->port_no, "%s: Incorrect offset! "
  593. "off_idx: %d, off_pos: %d\n",
  594. __func__, off_idx, off_pos);
  595. r = -1;
  596. goto out;
  597. }
  598. qemu_sglist_init(sglist, (sglist_alloc_hint - off_idx), ad->hba->dma);
  599. qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr + off_pos),
  600. le32_to_cpu(tbl[off_idx].flags_size) + 1 - off_pos);
  601. for (i = off_idx + 1; i < sglist_alloc_hint; i++) {
  602. /* flags_size is zero-based */
  603. qemu_sglist_add(sglist, le64_to_cpu(tbl[i].addr),
  604. le32_to_cpu(tbl[i].flags_size) + 1);
  605. }
  606. }
  607. out:
  608. dma_memory_unmap(ad->hba->dma, prdt, prdt_len,
  609. DMA_DIRECTION_TO_DEVICE, prdt_len);
  610. return r;
  611. }
  612. static void ncq_cb(void *opaque, int ret)
  613. {
  614. NCQTransferState *ncq_tfs = (NCQTransferState *)opaque;
  615. IDEState *ide_state = &ncq_tfs->drive->port.ifs[0];
  616. /* Clear bit for this tag in SActive */
  617. ncq_tfs->drive->port_regs.scr_act &= ~(1 << ncq_tfs->tag);
  618. if (ret < 0) {
  619. /* error */
  620. ide_state->error = ABRT_ERR;
  621. ide_state->status = READY_STAT | ERR_STAT;
  622. ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag);
  623. } else {
  624. ide_state->status = READY_STAT | SEEK_STAT;
  625. }
  626. ahci_write_fis_sdb(ncq_tfs->drive->hba, ncq_tfs->drive->port_no,
  627. (1 << ncq_tfs->tag));
  628. DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n",
  629. ncq_tfs->tag);
  630. bdrv_acct_done(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct);
  631. qemu_sglist_destroy(&ncq_tfs->sglist);
  632. ncq_tfs->used = 0;
  633. }
  634. static void process_ncq_command(AHCIState *s, int port, uint8_t *cmd_fis,
  635. int slot)
  636. {
  637. NCQFrame *ncq_fis = (NCQFrame*)cmd_fis;
  638. uint8_t tag = ncq_fis->tag >> 3;
  639. NCQTransferState *ncq_tfs = &s->dev[port].ncq_tfs[tag];
  640. if (ncq_tfs->used) {
  641. /* error - already in use */
  642. fprintf(stderr, "%s: tag %d already used\n", __FUNCTION__, tag);
  643. return;
  644. }
  645. ncq_tfs->used = 1;
  646. ncq_tfs->drive = &s->dev[port];
  647. ncq_tfs->slot = slot;
  648. ncq_tfs->lba = ((uint64_t)ncq_fis->lba5 << 40) |
  649. ((uint64_t)ncq_fis->lba4 << 32) |
  650. ((uint64_t)ncq_fis->lba3 << 24) |
  651. ((uint64_t)ncq_fis->lba2 << 16) |
  652. ((uint64_t)ncq_fis->lba1 << 8) |
  653. (uint64_t)ncq_fis->lba0;
  654. /* Note: We calculate the sector count, but don't currently rely on it.
  655. * The total size of the DMA buffer tells us the transfer size instead. */
  656. ncq_tfs->sector_count = ((uint16_t)ncq_fis->sector_count_high << 8) |
  657. ncq_fis->sector_count_low;
  658. DPRINTF(port, "NCQ transfer LBA from %"PRId64" to %"PRId64", "
  659. "drive max %"PRId64"\n",
  660. ncq_tfs->lba, ncq_tfs->lba + ncq_tfs->sector_count - 2,
  661. s->dev[port].port.ifs[0].nb_sectors - 1);
  662. ahci_populate_sglist(&s->dev[port], &ncq_tfs->sglist, 0);
  663. ncq_tfs->tag = tag;
  664. switch(ncq_fis->command) {
  665. case READ_FPDMA_QUEUED:
  666. DPRINTF(port, "NCQ reading %d sectors from LBA %"PRId64", "
  667. "tag %d\n",
  668. ncq_tfs->sector_count-1, ncq_tfs->lba, ncq_tfs->tag);
  669. DPRINTF(port, "tag %d aio read %"PRId64"\n",
  670. ncq_tfs->tag, ncq_tfs->lba);
  671. dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
  672. &ncq_tfs->sglist, BDRV_ACCT_READ);
  673. ncq_tfs->aiocb = dma_bdrv_read(ncq_tfs->drive->port.ifs[0].bs,
  674. &ncq_tfs->sglist, ncq_tfs->lba,
  675. ncq_cb, ncq_tfs);
  676. break;
  677. case WRITE_FPDMA_QUEUED:
  678. DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n",
  679. ncq_tfs->sector_count-1, ncq_tfs->lba, ncq_tfs->tag);
  680. DPRINTF(port, "tag %d aio write %"PRId64"\n",
  681. ncq_tfs->tag, ncq_tfs->lba);
  682. dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
  683. &ncq_tfs->sglist, BDRV_ACCT_WRITE);
  684. ncq_tfs->aiocb = dma_bdrv_write(ncq_tfs->drive->port.ifs[0].bs,
  685. &ncq_tfs->sglist, ncq_tfs->lba,
  686. ncq_cb, ncq_tfs);
  687. break;
  688. default:
  689. DPRINTF(port, "error: tried to process non-NCQ command as NCQ\n");
  690. qemu_sglist_destroy(&ncq_tfs->sglist);
  691. break;
  692. }
  693. }
  694. static int handle_cmd(AHCIState *s, int port, int slot)
  695. {
  696. IDEState *ide_state;
  697. uint32_t opts;
  698. uint64_t tbl_addr;
  699. AHCICmdHdr *cmd;
  700. uint8_t *cmd_fis;
  701. dma_addr_t cmd_len;
  702. if (s->dev[port].port.ifs[0].status & (BUSY_STAT|DRQ_STAT)) {
  703. /* Engine currently busy, try again later */
  704. DPRINTF(port, "engine busy\n");
  705. return -1;
  706. }
  707. cmd = &((AHCICmdHdr *)s->dev[port].lst)[slot];
  708. if (!s->dev[port].lst) {
  709. DPRINTF(port, "error: lst not given but cmd handled");
  710. return -1;
  711. }
  712. /* remember current slot handle for later */
  713. s->dev[port].cur_cmd = cmd;
  714. opts = le32_to_cpu(cmd->opts);
  715. tbl_addr = le64_to_cpu(cmd->tbl_addr);
  716. cmd_len = 0x80;
  717. cmd_fis = dma_memory_map(s->dma, tbl_addr, &cmd_len,
  718. DMA_DIRECTION_FROM_DEVICE);
  719. if (!cmd_fis) {
  720. DPRINTF(port, "error: guest passed us an invalid cmd fis\n");
  721. return -1;
  722. }
  723. /* The device we are working for */
  724. ide_state = &s->dev[port].port.ifs[0];
  725. if (!ide_state->bs) {
  726. DPRINTF(port, "error: guest accessed unused port");
  727. goto out;
  728. }
  729. debug_print_fis(cmd_fis, 0x90);
  730. //debug_print_fis(cmd_fis, (opts & AHCI_CMD_HDR_CMD_FIS_LEN) * 4);
  731. switch (cmd_fis[0]) {
  732. case SATA_FIS_TYPE_REGISTER_H2D:
  733. break;
  734. default:
  735. DPRINTF(port, "unknown command cmd_fis[0]=%02x cmd_fis[1]=%02x "
  736. "cmd_fis[2]=%02x\n", cmd_fis[0], cmd_fis[1],
  737. cmd_fis[2]);
  738. goto out;
  739. break;
  740. }
  741. switch (cmd_fis[1]) {
  742. case SATA_FIS_REG_H2D_UPDATE_COMMAND_REGISTER:
  743. break;
  744. case 0:
  745. break;
  746. default:
  747. DPRINTF(port, "unknown command cmd_fis[0]=%02x cmd_fis[1]=%02x "
  748. "cmd_fis[2]=%02x\n", cmd_fis[0], cmd_fis[1],
  749. cmd_fis[2]);
  750. goto out;
  751. break;
  752. }
  753. switch (s->dev[port].port_state) {
  754. case STATE_RUN:
  755. if (cmd_fis[15] & ATA_SRST) {
  756. s->dev[port].port_state = STATE_RESET;
  757. }
  758. break;
  759. case STATE_RESET:
  760. if (!(cmd_fis[15] & ATA_SRST)) {
  761. ahci_reset_port(s, port);
  762. }
  763. break;
  764. }
  765. if (cmd_fis[1] == SATA_FIS_REG_H2D_UPDATE_COMMAND_REGISTER) {
  766. /* Check for NCQ command */
  767. if ((cmd_fis[2] == READ_FPDMA_QUEUED) ||
  768. (cmd_fis[2] == WRITE_FPDMA_QUEUED)) {
  769. process_ncq_command(s, port, cmd_fis, slot);
  770. goto out;
  771. }
  772. /* Decompose the FIS */
  773. ide_state->nsector = (int64_t)((cmd_fis[13] << 8) | cmd_fis[12]);
  774. ide_state->feature = cmd_fis[3];
  775. if (!ide_state->nsector) {
  776. ide_state->nsector = 256;
  777. }
  778. if (ide_state->drive_kind != IDE_CD) {
  779. /*
  780. * We set the sector depending on the sector defined in the FIS.
  781. * Unfortunately, the spec isn't exactly obvious on this one.
  782. *
  783. * Apparently LBA48 commands set fis bytes 10,9,8,6,5,4 to the
  784. * 48 bit sector number. ATA_CMD_READ_DMA_EXT is an example for
  785. * such a command.
  786. *
  787. * Non-LBA48 commands however use 7[lower 4 bits],6,5,4 to define a
  788. * 28-bit sector number. ATA_CMD_READ_DMA is an example for such
  789. * a command.
  790. *
  791. * Since the spec doesn't explicitly state what each field should
  792. * do, I simply assume non-used fields as reserved and OR everything
  793. * together, independent of the command.
  794. */
  795. ide_set_sector(ide_state, ((uint64_t)cmd_fis[10] << 40)
  796. | ((uint64_t)cmd_fis[9] << 32)
  797. /* This is used for LBA48 commands */
  798. | ((uint64_t)cmd_fis[8] << 24)
  799. /* This is used for non-LBA48 commands */
  800. | ((uint64_t)(cmd_fis[7] & 0xf) << 24)
  801. | ((uint64_t)cmd_fis[6] << 16)
  802. | ((uint64_t)cmd_fis[5] << 8)
  803. | cmd_fis[4]);
  804. }
  805. /* Copy the ACMD field (ATAPI packet, if any) from the AHCI command
  806. * table to ide_state->io_buffer
  807. */
  808. if (opts & AHCI_CMD_ATAPI) {
  809. memcpy(ide_state->io_buffer, &cmd_fis[AHCI_COMMAND_TABLE_ACMD], 0x10);
  810. ide_state->lcyl = 0x14;
  811. ide_state->hcyl = 0xeb;
  812. debug_print_fis(ide_state->io_buffer, 0x10);
  813. ide_state->feature = IDE_FEATURE_DMA;
  814. s->dev[port].done_atapi_packet = 0;
  815. /* XXX send PIO setup FIS */
  816. }
  817. ide_state->error = 0;
  818. /* Reset transferred byte counter */
  819. cmd->status = 0;
  820. /* We're ready to process the command in FIS byte 2. */
  821. ide_exec_cmd(&s->dev[port].port, cmd_fis[2]);
  822. if (s->dev[port].port.ifs[0].status & READY_STAT) {
  823. ahci_write_fis_d2h(&s->dev[port], cmd_fis);
  824. }
  825. }
  826. out:
  827. dma_memory_unmap(s->dma, cmd_fis, cmd_len, DMA_DIRECTION_FROM_DEVICE,
  828. cmd_len);
  829. if (s->dev[port].port.ifs[0].status & (BUSY_STAT|DRQ_STAT)) {
  830. /* async command, complete later */
  831. s->dev[port].busy_slot = slot;
  832. return -1;
  833. }
  834. /* done handling the command */
  835. return 0;
  836. }
  837. /* DMA dev <-> ram */
  838. static int ahci_start_transfer(IDEDMA *dma)
  839. {
  840. AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
  841. IDEState *s = &ad->port.ifs[0];
  842. uint32_t size = (uint32_t)(s->data_end - s->data_ptr);
  843. /* write == ram -> device */
  844. uint32_t opts = le32_to_cpu(ad->cur_cmd->opts);
  845. int is_write = opts & AHCI_CMD_WRITE;
  846. int is_atapi = opts & AHCI_CMD_ATAPI;
  847. int has_sglist = 0;
  848. if (is_atapi && !ad->done_atapi_packet) {
  849. /* already prepopulated iobuffer */
  850. ad->done_atapi_packet = 1;
  851. goto out;
  852. }
  853. if (!ahci_populate_sglist(ad, &s->sg, 0)) {
  854. has_sglist = 1;
  855. }
  856. DPRINTF(ad->port_no, "%sing %d bytes on %s w/%s sglist\n",
  857. is_write ? "writ" : "read", size, is_atapi ? "atapi" : "ata",
  858. has_sglist ? "" : "o");
  859. if (has_sglist && size) {
  860. if (is_write) {
  861. dma_buf_write(s->data_ptr, size, &s->sg);
  862. } else {
  863. dma_buf_read(s->data_ptr, size, &s->sg);
  864. }
  865. }
  866. /* update number of transferred bytes */
  867. ad->cur_cmd->status = cpu_to_le32(le32_to_cpu(ad->cur_cmd->status) + size);
  868. out:
  869. /* declare that we processed everything */
  870. s->data_ptr = s->data_end;
  871. if (has_sglist) {
  872. qemu_sglist_destroy(&s->sg);
  873. }
  874. s->end_transfer_func(s);
  875. if (!(s->status & DRQ_STAT)) {
  876. /* done with DMA */
  877. ahci_trigger_irq(ad->hba, ad, PORT_IRQ_STAT_DSS);
  878. }
  879. return 0;
  880. }
  881. static void ahci_start_dma(IDEDMA *dma, IDEState *s,
  882. BlockDriverCompletionFunc *dma_cb)
  883. {
  884. AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
  885. DPRINTF(ad->port_no, "\n");
  886. ad->dma_cb = dma_cb;
  887. ad->dma_status |= BM_STATUS_DMAING;
  888. s->io_buffer_offset = 0;
  889. dma_cb(s, 0);
  890. }
  891. static int ahci_dma_prepare_buf(IDEDMA *dma, int is_write)
  892. {
  893. AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
  894. IDEState *s = &ad->port.ifs[0];
  895. ahci_populate_sglist(ad, &s->sg, 0);
  896. s->io_buffer_size = s->sg.size;
  897. DPRINTF(ad->port_no, "len=%#x\n", s->io_buffer_size);
  898. return s->io_buffer_size != 0;
  899. }
  900. static int ahci_dma_rw_buf(IDEDMA *dma, int is_write)
  901. {
  902. AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
  903. IDEState *s = &ad->port.ifs[0];
  904. uint8_t *p = s->io_buffer + s->io_buffer_index;
  905. int l = s->io_buffer_size - s->io_buffer_index;
  906. if (ahci_populate_sglist(ad, &s->sg, s->io_buffer_offset)) {
  907. return 0;
  908. }
  909. if (is_write) {
  910. dma_buf_read(p, l, &s->sg);
  911. } else {
  912. dma_buf_write(p, l, &s->sg);
  913. }
  914. /* free sglist that was created in ahci_populate_sglist() */
  915. qemu_sglist_destroy(&s->sg);
  916. /* update number of transferred bytes */
  917. ad->cur_cmd->status = cpu_to_le32(le32_to_cpu(ad->cur_cmd->status) + l);
  918. s->io_buffer_index += l;
  919. s->io_buffer_offset += l;
  920. DPRINTF(ad->port_no, "len=%#x\n", l);
  921. return 1;
  922. }
  923. static int ahci_dma_set_unit(IDEDMA *dma, int unit)
  924. {
  925. /* only a single unit per link */
  926. return 0;
  927. }
  928. static int ahci_dma_add_status(IDEDMA *dma, int status)
  929. {
  930. AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
  931. ad->dma_status |= status;
  932. DPRINTF(ad->port_no, "set status: %x\n", status);
  933. if (status & BM_STATUS_INT) {
  934. ahci_trigger_irq(ad->hba, ad, PORT_IRQ_STAT_DSS);
  935. }
  936. return 0;
  937. }
  938. static int ahci_dma_set_inactive(IDEDMA *dma)
  939. {
  940. AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
  941. DPRINTF(ad->port_no, "dma done\n");
  942. /* update d2h status */
  943. ahci_write_fis_d2h(ad, NULL);
  944. ad->dma_cb = NULL;
  945. if (!ad->check_bh) {
  946. /* maybe we still have something to process, check later */
  947. ad->check_bh = qemu_bh_new(ahci_check_cmd_bh, ad);
  948. qemu_bh_schedule(ad->check_bh);
  949. }
  950. return 0;
  951. }
  952. static void ahci_irq_set(void *opaque, int n, int level)
  953. {
  954. }
  955. static void ahci_dma_restart_cb(void *opaque, int running, RunState state)
  956. {
  957. }
  958. static int ahci_dma_reset(IDEDMA *dma)
  959. {
  960. return 0;
  961. }
  962. static const IDEDMAOps ahci_dma_ops = {
  963. .start_dma = ahci_start_dma,
  964. .start_transfer = ahci_start_transfer,
  965. .prepare_buf = ahci_dma_prepare_buf,
  966. .rw_buf = ahci_dma_rw_buf,
  967. .set_unit = ahci_dma_set_unit,
  968. .add_status = ahci_dma_add_status,
  969. .set_inactive = ahci_dma_set_inactive,
  970. .restart_cb = ahci_dma_restart_cb,
  971. .reset = ahci_dma_reset,
  972. };
  973. void ahci_init(AHCIState *s, DeviceState *qdev, DMAContext *dma, int ports)
  974. {
  975. qemu_irq *irqs;
  976. int i;
  977. s->dma = dma;
  978. s->ports = ports;
  979. s->dev = g_malloc0(sizeof(AHCIDevice) * ports);
  980. ahci_reg_init(s);
  981. /* XXX BAR size should be 1k, but that breaks, so bump it to 4k for now */
  982. memory_region_init_io(&s->mem, &ahci_mem_ops, s, "ahci", AHCI_MEM_BAR_SIZE);
  983. memory_region_init_io(&s->idp, &ahci_idp_ops, s, "ahci-idp", 32);
  984. irqs = qemu_allocate_irqs(ahci_irq_set, s, s->ports);
  985. for (i = 0; i < s->ports; i++) {
  986. AHCIDevice *ad = &s->dev[i];
  987. ide_bus_new(&ad->port, qdev, i);
  988. ide_init2(&ad->port, irqs[i]);
  989. ad->hba = s;
  990. ad->port_no = i;
  991. ad->port.dma = &ad->dma;
  992. ad->port.dma->ops = &ahci_dma_ops;
  993. }
  994. }
  995. void ahci_uninit(AHCIState *s)
  996. {
  997. memory_region_destroy(&s->mem);
  998. memory_region_destroy(&s->idp);
  999. g_free(s->dev);
  1000. }
  1001. void ahci_reset(AHCIState *s)
  1002. {
  1003. AHCIPortRegs *pr;
  1004. int i;
  1005. s->control_regs.irqstatus = 0;
  1006. s->control_regs.ghc = 0;
  1007. for (i = 0; i < s->ports; i++) {
  1008. pr = &s->dev[i].port_regs;
  1009. pr->irq_stat = 0;
  1010. pr->irq_mask = 0;
  1011. pr->scr_ctl = 0;
  1012. pr->cmd = PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON;
  1013. ahci_reset_port(s, i);
  1014. }
  1015. }
  1016. typedef struct SysbusAHCIState {
  1017. SysBusDevice busdev;
  1018. AHCIState ahci;
  1019. uint32_t num_ports;
  1020. } SysbusAHCIState;
  1021. static const VMStateDescription vmstate_sysbus_ahci = {
  1022. .name = "sysbus-ahci",
  1023. .unmigratable = 1,
  1024. };
  1025. static void sysbus_ahci_reset(DeviceState *dev)
  1026. {
  1027. SysbusAHCIState *s = DO_UPCAST(SysbusAHCIState, busdev.qdev, dev);
  1028. ahci_reset(&s->ahci);
  1029. }
  1030. static int sysbus_ahci_init(SysBusDevice *dev)
  1031. {
  1032. SysbusAHCIState *s = FROM_SYSBUS(SysbusAHCIState, dev);
  1033. ahci_init(&s->ahci, &dev->qdev, NULL, s->num_ports);
  1034. sysbus_init_mmio(dev, &s->ahci.mem);
  1035. sysbus_init_irq(dev, &s->ahci.irq);
  1036. return 0;
  1037. }
  1038. static Property sysbus_ahci_properties[] = {
  1039. DEFINE_PROP_UINT32("num-ports", SysbusAHCIState, num_ports, 1),
  1040. DEFINE_PROP_END_OF_LIST(),
  1041. };
  1042. static void sysbus_ahci_class_init(ObjectClass *klass, void *data)
  1043. {
  1044. SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
  1045. DeviceClass *dc = DEVICE_CLASS(klass);
  1046. sbc->init = sysbus_ahci_init;
  1047. dc->vmsd = &vmstate_sysbus_ahci;
  1048. dc->props = sysbus_ahci_properties;
  1049. dc->reset = sysbus_ahci_reset;
  1050. }
  1051. static TypeInfo sysbus_ahci_info = {
  1052. .name = "sysbus-ahci",
  1053. .parent = TYPE_SYS_BUS_DEVICE,
  1054. .instance_size = sizeof(SysbusAHCIState),
  1055. .class_init = sysbus_ahci_class_init,
  1056. };
  1057. static void sysbus_ahci_register_types(void)
  1058. {
  1059. type_register_static(&sysbus_ahci_info);
  1060. }
  1061. type_init(sysbus_ahci_register_types)