drv_ahci.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-08-04 JasonHu first version
  9. */
  10. #include <rtconfig.h>
  11. #ifdef BSP_DRV_AHCI
  12. #include <rtthread.h>
  13. #include <rtdef.h>
  14. #include <rtdbg.h>
  15. #include <rthw.h>
  16. #include <ioremap.h>
  17. #include <dma.h>
  18. #include <mmu.h>
  19. #include <board.h>
  20. #include "drv_ahci.h"
  21. #include "pci.h"
  22. #define DEV_NAME "sd"
  23. // #define RT_DRV_AHCI_DEBUG
  24. #ifdef RT_DRV_AHCI_DEBUG
  25. #define dbgprint rt_kprintf
  26. #else
  27. #define dbgprint(...)
  28. #endif
  29. /* memio info on the pci bar 5 */
  30. #define PCI_AHCI_MEMIO_BAR 5
  31. #define LOWER32(a) (rt_uint32_t)((a) & 0xffffffff)
  32. #define LOWER8(a) (rt_uint8_t)((a) & 0xff)
  33. #define HIGHER8(a) (rt_uint8_t)(((a) >> 8) & 0xff)
  34. /* maxim ports we support */
  35. #define DRV_AHCI_PORT_NR 32
  36. struct device_extension
  37. {
  38. rt_uint64_t sector_count; /* sectors in this disk. */
  39. rt_uint8_t type; /* AHCI device type */
  40. rt_uint8_t port; /* port for each device. */
  41. rt_uint32_t slots; /* solts for device read/write transfer bits */
  42. struct rt_mutex lock; /* lock for disk read/write */
  43. void *fis_vaddr;
  44. void *clb_vaddr;
  45. rt_hw_dma_t clb_dma;
  46. rt_hw_dma_t fis_dma;
  47. void *cmd_hdrs[HBA_COMMAND_HEADER_NUM]; /* command header */
  48. rt_hw_dma_t cmd_hdrs_dmas[HBA_COMMAND_HEADER_NUM]; /* command header dma */
  49. };
  50. typedef struct device_extension rt_device_extension_t;
  51. static struct hba_memory *g_hba_base; /* hba memory io base addr */
  52. static rt_err_t ahci_create_device(rt_device_extension_t *extension);
  53. static rt_uint32_t ahci_flush_commands(struct hba_port *port)
  54. {
  55. /* the commands may not take effect until the command
  56. * register is read again by software, because reasons.
  57. */
  58. rt_hw_dsb();
  59. volatile rt_uint32_t c = port->command;
  60. rt_hw_dmb();
  61. return c;
  62. }
  63. static void ahci_stop_port_command_engine(struct hba_port *port)
  64. {
  65. rt_hw_dsb();
  66. port->command &= ~HBA_PxCMD_ST;
  67. rt_hw_dsb();
  68. port->command &= ~HBA_PxCMD_FRE;
  69. rt_hw_dmb();
  70. while((port->command & HBA_PxCMD_CR) || (port->command & HBA_PxCMD_FR))
  71. {
  72. rt_hw_cpu_pause();
  73. }
  74. }
  75. static void ahci_start_port_command_engine(struct hba_port *port)
  76. {
  77. rt_hw_dmb();
  78. while(port->command & HBA_PxCMD_CR)
  79. {
  80. rt_hw_cpu_pause();
  81. }
  82. rt_hw_dsb();
  83. port->command |= HBA_PxCMD_FRE;
  84. rt_hw_dsb();
  85. port->command |= HBA_PxCMD_ST;
  86. ahci_flush_commands((struct hba_port *)port);
  87. }
  88. static struct hba_command_header *ahci_initialize_command_header(rt_device_extension_t *dev, struct hba_memory *abar,
  89. struct hba_port *port, int slot, int write,
  90. int atapi, int prd_entries, int fis_len)
  91. {
  92. struct hba_command_header *hdr = (struct hba_command_header *)dev->clb_vaddr;
  93. hdr += slot;
  94. hdr->write = write ? 1 : 0;
  95. hdr->prdb_count = 0;
  96. hdr->atapi=atapi ? 1 : 0;
  97. hdr->fis_length = fis_len;
  98. hdr->prdt_len = prd_entries;
  99. hdr->prefetchable = 0;
  100. hdr->bist = 0;
  101. hdr->pmport = 0;
  102. hdr->reset = 0;
  103. return hdr;
  104. }
  105. static struct fis_reg_host_to_device *ahci_initialize_fis_host_to_device(rt_device_extension_t *dev, struct hba_memory *abar,
  106. struct hba_port *port, int slot, int cmdctl, int ata_command)
  107. {
  108. struct hba_command_table *tbl = (struct hba_command_table *)(dev->cmd_hdrs[slot]);
  109. struct fis_reg_host_to_device *fis = (struct fis_reg_host_to_device *)(tbl->command_fis);
  110. rt_memset(fis, 0, sizeof(*fis));
  111. fis->fis_type = FIS_TYPE_REG_H2D;
  112. fis->command = ata_command;
  113. fis->c = cmdctl ? 1 : 0;
  114. return fis;
  115. }
  116. static void ahci_send_command(struct hba_port *port, int slot)
  117. {
  118. port->interrupt_status = ~0;
  119. port->command_issue = (1 << slot);
  120. ahci_flush_commands(port);
  121. }
  122. static int ahci_write_prdt(rt_device_extension_t *dev, struct hba_memory *abar, struct hba_port *port,
  123. int slot, int offset, int length, rt_ubase_t virt_buffer)
  124. {
  125. int num_entries = ((length - 1) / PRDT_MAX_COUNT) + 1;
  126. struct hba_command_table *tbl = (struct hba_command_table *)(dev->cmd_hdrs[slot]);
  127. int i;
  128. struct hba_prdt_entry *prd;
  129. for(i = 0; i < num_entries - 1; i++)
  130. {
  131. rt_ubase_t phys_buffer;
  132. phys_buffer = rt_hw_vir2phy(virt_buffer);
  133. prd = &tbl->prdt_entries[i + offset];
  134. prd->byte_count = PRDT_MAX_COUNT - 1;
  135. prd->data_base_l = LOWER32(phys_buffer);
  136. prd->data_base_h = 0;
  137. prd->interrupt_on_complete = 0;
  138. length -= PRDT_MAX_COUNT;
  139. virt_buffer += PRDT_MAX_COUNT;
  140. }
  141. rt_ubase_t phys_buffer;
  142. phys_buffer = rt_hw_vir2phy(virt_buffer);
  143. prd = &tbl->prdt_entries[i + offset];
  144. prd->byte_count = length - 1;
  145. prd->data_base_l = LOWER32(phys_buffer);
  146. prd->data_base_h = 0;
  147. prd->interrupt_on_complete = 0;
  148. return num_entries;
  149. }
  150. static void ahci_reset_device(struct hba_memory *abar, struct hba_port *port, rt_device_extension_t *dev)
  151. {
  152. dbgprint("[ahci] device port %d: sending COMRESET and reinitializing\n", dev->port);
  153. ahci_stop_port_command_engine(port);
  154. port->sata_error = ~0;
  155. /* power on, spin up */
  156. port->command |= 2;
  157. port->command |= 4;
  158. ahci_flush_commands(port);
  159. rt_thread_mdelay(1);
  160. /* initialize state */
  161. port->interrupt_status = ~0; /* clear pending interrupts */
  162. port->interrupt_enable = AHCI_DEFAULT_INT; /* we want some interrupts */
  163. port->command &= ~((1 << 27) | (1 << 26)); /* clear some bits */
  164. port->sata_control |= 1;
  165. rt_thread_mdelay(10);
  166. port->sata_control |= (~1);
  167. rt_thread_mdelay(10);
  168. port->interrupt_status = ~0; /* clear pending interrupts */
  169. port->interrupt_enable = AHCI_DEFAULT_INT; /* we want some interrupts */
  170. ahci_start_port_command_engine(port);
  171. dev->slots = 0;
  172. port->sata_error = ~0;
  173. }
  174. static rt_err_t ahci_port_dma_data_transfer(rt_device_extension_t *dev, struct hba_memory *abar, struct hba_port *port,
  175. int slot, int write, rt_ubase_t virt_buffer, int sectors, rt_uint64_t lba)
  176. {
  177. struct fis_reg_host_to_device *fis;
  178. int timeout;
  179. int fis_len = sizeof(struct fis_reg_host_to_device) / 4;
  180. int ne = ahci_write_prdt(dev, abar, port, slot, 0, ATA_SECTOR_SIZE * sectors, virt_buffer);
  181. ahci_initialize_command_header(dev, abar, port, slot, write, 0, ne, fis_len);
  182. fis = ahci_initialize_fis_host_to_device(dev, abar, port, slot, 1, write ? ATA_CMD_WRITE_DMA_EX : ATA_CMD_READ_DMA_EX);
  183. fis->device = 1 << 6;
  184. fis->count_l = LOWER8(sectors);
  185. fis->count_h = HIGHER8(sectors);
  186. fis->lba0 = (unsigned char)( lba & 0xFF);
  187. fis->lba1 = (unsigned char)((lba >> 8) & 0xFF);
  188. fis->lba2 = (unsigned char)((lba >> 16) & 0xFF);
  189. fis->lba3 = (unsigned char)((lba >> 24) & 0xFF);
  190. fis->lba4 = (unsigned char)((lba >> 32) & 0xFF);
  191. fis->lba5 = (unsigned char)((lba >> 40) & 0xFF);
  192. port->sata_error = ~0;
  193. timeout = ATA_TFD_TIMEOUT;
  194. while ((port->task_file_data & (ATA_DEV_BUSY | ATA_DEV_DRQ)) && --timeout)
  195. {
  196. rt_thread_yield();
  197. }
  198. if(!timeout)
  199. {
  200. goto port_hung;
  201. }
  202. port->sata_error = ~0;
  203. ahci_send_command(port, slot);
  204. timeout = ATA_TFD_TIMEOUT;
  205. while ((port->task_file_data & (ATA_DEV_BUSY | ATA_DEV_DRQ)) && --timeout)
  206. {
  207. rt_thread_yield();
  208. }
  209. if(!timeout)
  210. {
  211. goto port_hung;
  212. }
  213. timeout = AHCI_CMD_TIMEOUT;
  214. while(--timeout)
  215. {
  216. if(!((port->sata_active | port->command_issue) & (1 << slot)))
  217. break;
  218. rt_thread_yield();
  219. }
  220. if(!timeout)
  221. {
  222. goto port_hung;
  223. }
  224. if(port->sata_error)
  225. {
  226. dbg_log(DBG_ERROR, "[ahci] device %d: ahci error\n", dev->port);
  227. goto error;
  228. }
  229. if(port->task_file_data & ATA_DEV_ERR)
  230. {
  231. dbg_log(DBG_ERROR, "[ahci] device %d: task file data error\n", dev->port);
  232. goto error;
  233. }
  234. return RT_EOK;
  235. port_hung:
  236. dbg_log(DBG_ERROR, "[ahci] device %d: port hung\n", dev->port);
  237. error:
  238. dbg_log(DBG_ERROR, "[ahci] device %d: tfd=%x, serr=%x\n",
  239. dev->port, port->task_file_data, port->sata_error);
  240. ahci_reset_device(abar, port, dev);
  241. return RT_ERROR;
  242. }
  243. static rt_err_t ahci_device_identify(rt_device_extension_t *dev, struct hba_memory *abar, struct hba_port *port)
  244. {
  245. int fis_len = sizeof(struct fis_reg_host_to_device) / 4;
  246. rt_hw_dma_t dma;
  247. dma.size = 0x1000;
  248. dma.alignment = 0x1000;
  249. RT_ASSERT(rt_hw_dma_alloc(&dma) == RT_EOK);
  250. ahci_write_prdt(dev, abar, port, 0, 0, 512, (rt_ubase_t)dma.vaddr);
  251. ahci_initialize_command_header(dev, abar, port, 0, 0, 0, 1, fis_len);
  252. ahci_initialize_fis_host_to_device(dev, abar, port, 0, 1, ATA_CMD_IDENTIFY);
  253. int timeout = ATA_TFD_TIMEOUT;
  254. port->sata_error = ~0;
  255. while ((port->task_file_data & (ATA_DEV_BUSY | ATA_DEV_DRQ)) && --timeout)
  256. {
  257. rt_hw_cpu_pause();
  258. }
  259. if(!timeout )
  260. {
  261. dbg_log(DBG_ERROR, "[ahci] device %d: identify 1: port hung\n", dev->port);
  262. dbg_log(DBG_ERROR, "[ahci] device %d: identify 1: tfd=%x, serr=%x\n",
  263. dev->port, port->task_file_data, port->sata_error);
  264. rt_hw_dma_free(&dma);
  265. return RT_ETIMEOUT;
  266. }
  267. ahci_send_command(port, 0);
  268. timeout = AHCI_CMD_TIMEOUT;
  269. while(--timeout)
  270. {
  271. if(!((port->sata_active | port->command_issue) & 1))
  272. break;
  273. }
  274. if(!timeout)
  275. {
  276. dbg_log(DBG_ERROR, "[ahci] device %d: identify 2: port hung\n", dev->port);
  277. dbg_log(DBG_ERROR, "[ahci] device %d: identify 2: tfd=%x, serr=%x\n",
  278. dev->port, port->task_file_data, port->sata_error);
  279. rt_hw_dma_free(&dma);
  280. return RT_ETIMEOUT;
  281. }
  282. struct ata_identify *identify = (struct ata_identify *) dma.vaddr;
  283. if (identify->lba48_addressable_sectors)
  284. {
  285. dev->sector_count = identify->lba48_addressable_sectors;
  286. }
  287. else
  288. {
  289. dev->sector_count = 0;
  290. }
  291. dbgprint("[ahci] device %d: num sectors=%d\n", dev->port, dev->sector_count);
  292. rt_hw_dma_free(&dma);
  293. if (!dev->sector_count)
  294. {
  295. dbg_log(DBG_ERROR, "[ahci] device %d invalid sectors ZERO.\n", dev->port);
  296. return RT_EINVAL;
  297. }
  298. return RT_EOK;
  299. }
  300. static rt_uint32_t ahci_check_type(volatile struct hba_port *port)
  301. {
  302. port->command &= ~1;
  303. while(port->command & (1 << 15))
  304. {
  305. rt_hw_cpu_pause();
  306. }
  307. port->command &= ~(1 << 4);
  308. while(port->command & (1 << 14))
  309. {
  310. rt_hw_cpu_pause();
  311. }
  312. rt_hw_dsb();
  313. port->command |= 2;
  314. rt_hw_dsb();
  315. rt_thread_mdelay(10);
  316. rt_uint32_t s = port->sata_status;
  317. uint8_t ipm, det;
  318. ipm = (s >> 8) & 0x0F;
  319. det = s & 0x0F;
  320. if(ipm != HBA_PORT_IPM_ACTIVE || det != HBA_PORT_DET_PRESENT)
  321. {
  322. return AHCI_DEV_NULL;
  323. }
  324. switch (port->signature)
  325. {
  326. case SATA_SIG_ATAPI:
  327. return AHCI_DEV_SATAPI;
  328. case SATA_SIG_SEMB:
  329. return AHCI_DEV_SEMB;
  330. case SATA_SIG_PM:
  331. return AHCI_DEV_PM;
  332. default:
  333. return AHCI_DEV_SATA;
  334. }
  335. return AHCI_DEV_SATA;
  336. }
  337. int ahci_initialize_device(rt_device_extension_t *dev, struct hba_memory *abar)
  338. {
  339. struct hba_port *port = (struct hba_port *)&abar->ports[dev->port];
  340. ahci_stop_port_command_engine(port);
  341. port->sata_error = ~0;
  342. /* power on, spin up */
  343. port->command |= (2 | 4);
  344. ahci_flush_commands(port);
  345. rt_thread_mdelay(2);
  346. /* initialize state */
  347. port->interrupt_status = ~0; /* clear pending interrupts */
  348. port->interrupt_enable = AHCI_DEFAULT_INT; /* we want some interrupts */
  349. port->command &= ~1;
  350. while(port->command & (1 << 15))
  351. {
  352. rt_hw_cpu_pause();
  353. }
  354. port->command &= ~((1 << 27) | (1 << 26) | 1); /* clear some bits */
  355. ahci_flush_commands(port);
  356. /* start reset sata */
  357. port->sata_control |= 1;
  358. rt_thread_mdelay(20);
  359. /* close DET, after init sata device done. */
  360. port->sata_control &= (~1);
  361. rt_thread_mdelay(10);
  362. while(!(port->sata_status & 1))
  363. {
  364. rt_hw_cpu_pause();
  365. }
  366. port->sata_error = ~0;
  367. port->command |= (1 << 28); /* set interface to active */
  368. while((port->sata_status >> 8) != 1)
  369. {
  370. rt_hw_cpu_pause();
  371. }
  372. port->interrupt_status = ~0; /* clear pending interrupts */
  373. port->interrupt_enable = AHCI_DEFAULT_INT; /* we want some interrupts */
  374. rt_ubase_t clb_phys, fis_phys;
  375. dev->clb_dma.size = 0x2000;
  376. dev->clb_dma.alignment = 0x1000;
  377. dev->fis_dma.size = 0x1000;
  378. dev->fis_dma.alignment = 0x1000;
  379. RT_ASSERT(rt_hw_dma_alloc(&dev->clb_dma) == RT_EOK);
  380. RT_ASSERT(rt_hw_dma_alloc(&dev->fis_dma) == RT_EOK);
  381. dev->clb_vaddr = (void *)dev->clb_dma.vaddr;
  382. dev->fis_vaddr = (void *)dev->fis_dma.vaddr;
  383. clb_phys = dev->clb_dma.paddr;
  384. fis_phys = dev->fis_dma.paddr;
  385. dev->slots=0;
  386. struct hba_command_header *hdr = (struct hba_command_header *)dev->clb_vaddr;
  387. int i;
  388. for(i = 0; i < HBA_COMMAND_HEADER_NUM; i++)
  389. {
  390. dev->cmd_hdrs_dmas[i].size = 0x1000;
  391. dev->cmd_hdrs_dmas[i].alignment = 0x1000;
  392. RT_ASSERT(rt_hw_dma_alloc(&dev->cmd_hdrs_dmas[i]) == RT_EOK);
  393. dev->cmd_hdrs[i] = (void *)dev->cmd_hdrs_dmas[i].vaddr;
  394. rt_memset(hdr, 0, sizeof(*hdr));
  395. hdr->command_table_base_l = LOWER32(dev->cmd_hdrs_dmas[i].paddr);
  396. hdr->command_table_base_h = 0;
  397. hdr++;
  398. }
  399. port->command_list_base_l = LOWER32(clb_phys);
  400. port->command_list_base_h = 0;
  401. port->fis_base_l = LOWER32(fis_phys);
  402. port->fis_base_h = 0;
  403. ahci_start_port_command_engine(port);
  404. port->sata_error = ~0;
  405. return ahci_device_identify(dev, abar, port);
  406. }
  407. static rt_uint32_t ahci_probe_ports(struct hba_memory *abar)
  408. {
  409. rt_uint32_t pi = abar->port_implemented;
  410. dbgprint("[ahci] ports implemented: %x\n", pi);
  411. int counts = 0; /* exist device count */
  412. int i = 0;
  413. rt_device_extension_t *extension;
  414. while (i < DRV_AHCI_PORT_NR)
  415. {
  416. if (pi & 1)
  417. {
  418. rt_uint32_t type = ahci_check_type(&abar->ports[i]);
  419. if (type == AHCI_DEV_SATA) { /* SATA device */
  420. dbgprint("[ahci] detected SATA device on port %d\n", i);
  421. extension = rt_malloc(sizeof(rt_device_extension_t));
  422. if (extension == RT_NULL)
  423. {
  424. dbg_log(DBG_ERROR, "[ahci] port %d alloc memory for extension failed!\n", i);
  425. return counts;
  426. }
  427. extension->type = type;
  428. extension->port = i;
  429. rt_mutex_init(&extension->lock, "ahci", RT_IPC_FLAG_PRIO);
  430. if (ahci_initialize_device(extension, abar) == RT_EOK)\
  431. {
  432. if (ahci_create_device(extension) == RT_EOK) {
  433. counts++;
  434. }
  435. else
  436. {
  437. dbg_log(DBG_ERROR, "[ahci] failed to create device %d, disabling port!\n", i);
  438. rt_free(extension);
  439. }
  440. } else {
  441. dbg_log(DBG_ERROR, "[ahci] failed to initialize device %d, disabling port.\n", i);
  442. }
  443. } else if(type == AHCI_DEV_SATAPI) { /* SATAPI device */
  444. dbg_log(DBG_WARNING, "[ahci] not support SATAPI device on port %d now!\n", i);
  445. } else if(type == AHCI_DEV_PM) { /* PM device */
  446. dbg_log(DBG_WARNING, "[ahci] not support Port multiplier on port %d now!\n", i);
  447. } else if(type == AHCI_DEV_SEMB) { /* SEMB device */
  448. dbg_log(DBG_WARNING, "[ahci] not support Enclosure management bridge on port %d now!\n", i);
  449. }
  450. /* do not deal other type now. */
  451. }
  452. i++;
  453. pi >>= 1;
  454. }
  455. return counts;
  456. }
  457. static int ahci_port_get_slot(rt_device_extension_t *dev)
  458. {
  459. for(;;)
  460. {
  461. int i;
  462. rt_mutex_take(&dev->lock, RT_WAITING_FOREVER);
  463. for(i = 0; i < DRV_AHCI_PORT_NR; i++)
  464. {
  465. if(!(dev->slots & (1 << i)))
  466. {
  467. dev->slots |= (1 << i);
  468. rt_mutex_release(&dev->lock);
  469. return i;
  470. }
  471. }
  472. rt_mutex_release(&dev->lock);
  473. rt_thread_yield();
  474. }
  475. }
  476. void ahci_port_put_slot(rt_device_extension_t *dev, int slot)
  477. {
  478. rt_mutex_take(&dev->lock, RT_WAITING_FOREVER);
  479. dev->slots &= ~(1 << slot);
  480. rt_mutex_release(&dev->lock);
  481. }
  482. /* since a DMA transfer must write to contiguous physical RAM, we need to allocate
  483. * buffers that allow us to create PRDT entries that do not cross a page boundary.
  484. * That means that each PRDT entry can transfer a maximum of PAGE_SIZE bytes (for
  485. * 0x1000 page size, that's 8 sectors). Thus, we allocate a buffer that is page aligned,
  486. * in a multiple of PAGE_SIZE, so that the PRDT will write to contiguous physical ram
  487. * (the key here is that the buffer need not be contiguous across multiple PRDT entries).
  488. */
  489. static rt_size_t ahci_rw_multiple_do(rt_device_extension_t *dev, int rw, rt_uint64_t blk, unsigned char *out_buffer, int count)
  490. {
  491. rt_uint32_t length = count * ATA_SECTOR_SIZE;
  492. rt_uint64_t end_blk = dev->sector_count;
  493. if (blk >= end_blk)
  494. {
  495. dbg_log(DBG_ERROR, "ahci: lba %d out of range %d\n", blk, end_blk);
  496. return 0;
  497. }
  498. if((blk + count) > end_blk)
  499. {
  500. count = end_blk - blk;
  501. }
  502. if(!count)
  503. {
  504. return 0;
  505. }
  506. int num_pages = ((ATA_SECTOR_SIZE * (count - 1)) / PAGE_SIZE) + 1;
  507. RT_ASSERT((length <= (unsigned)num_pages * 0x1000));
  508. rt_hw_dma_t dma;
  509. dma.size = 0x1000 * num_pages;
  510. dma.alignment = 0x1000;
  511. RT_ASSERT(rt_hw_dma_alloc(&dma) == RT_EOK);
  512. rt_size_t num_read_blocks = count;
  513. struct hba_port *port = (struct hba_port *)&g_hba_base->ports[dev->port];
  514. if(rw == 1)
  515. {
  516. rt_memcpy((void *)dma.vaddr, out_buffer, length);
  517. }
  518. int slot = ahci_port_get_slot(dev);
  519. if(ahci_port_dma_data_transfer(dev, g_hba_base, port, slot, rw == 1 ? 1 : 0, (rt_ubase_t)dma.vaddr, count, blk) != RT_EOK)
  520. {
  521. num_read_blocks = 0;
  522. }
  523. ahci_port_put_slot(dev, slot);
  524. if(rw == 0 && num_read_blocks)
  525. {
  526. rt_memcpy(out_buffer, (void *)dma.vaddr, length);
  527. }
  528. rt_hw_dma_free(&dma);
  529. return num_read_blocks;
  530. }
  531. /* and then since there is a maximum transfer amount because of the page size
  532. * limit, wrap the transfer function to allow for bigger transfers than that even.
  533. */
  534. static rt_size_t ahci_rw_multiple(rt_device_extension_t *dev, int rw, rt_uint64_t blk, unsigned char *out_buffer, int count)
  535. {
  536. int i = 0;
  537. rt_size_t ret = 0;
  538. int c = count;
  539. for(i = 0; i < count; i += (PRDT_MAX_ENTRIES * PRDT_MAX_COUNT) / ATA_SECTOR_SIZE)
  540. {
  541. int n = (PRDT_MAX_ENTRIES * PRDT_MAX_COUNT) / ATA_SECTOR_SIZE;
  542. if(n > c)
  543. {
  544. n = c;
  545. }
  546. ret += ahci_rw_multiple_do(dev, rw, blk+i, out_buffer + ret, n);
  547. c -= n;
  548. }
  549. return ret;
  550. }
  551. static rt_pci_device_t *ahci_get_pci_info(void)
  552. {
  553. rt_pci_device_t *ahci = rt_pci_device_get(0x1, 0x6);
  554. if(ahci == RT_NULL)
  555. {
  556. ahci = rt_pci_device_get(0x8086, 0x8c03);
  557. }
  558. if(ahci == RT_NULL)
  559. {
  560. ahci = rt_pci_device_get(0x8086, 0x2922);
  561. }
  562. if(ahci == RT_NULL)
  563. {
  564. return RT_NULL;
  565. }
  566. dbgprint("[ahci] device vendorID %x deviceID %x class code %x\n", ahci->vendor_id, ahci->device_id, ahci->class_code);
  567. rt_pci_enable_bus_mastering(ahci);
  568. g_hba_base = rt_ioremap((void *) ahci->bars[PCI_AHCI_MEMIO_BAR].base_addr, ahci->bars[PCI_AHCI_MEMIO_BAR].length);
  569. if (g_hba_base == RT_NULL) {
  570. dbgprint("[ahci] device memio_remap on %x length %x failed!\n", ahci->bars[PCI_AHCI_MEMIO_BAR].base_addr, ahci->bars[PCI_AHCI_MEMIO_BAR].length);
  571. return RT_NULL;
  572. }
  573. mmu_flush_tlb();
  574. dbgprint("[ahci] mapping memory iobase from paddr %x to vaddr %x\n", ahci->bars[PCI_AHCI_MEMIO_BAR].base_addr, g_hba_base);
  575. dbgprint("[ahci] using interrupt %d\n", ahci->irq_line);
  576. return ahci;
  577. }
  578. static rt_err_t rt_ahci_init(rt_device_t dev)
  579. {
  580. return RT_EOK;
  581. }
  582. static rt_err_t rt_ahci_open(rt_device_t dev, rt_uint16_t oflag)
  583. {
  584. return RT_EOK;
  585. }
  586. static rt_err_t rt_ahci_close(rt_device_t dev)
  587. {
  588. return RT_EOK;
  589. }
  590. /*
  591. * position: block page address, not bytes address
  592. * buffer: read buffer addr
  593. * size : how many blocks
  594. */
  595. static rt_size_t rt_ahci_read(rt_device_t device, rt_off_t position, void *buffer, rt_size_t size)
  596. {
  597. return ahci_rw_multiple((rt_device_extension_t *)device->user_data, 0, position, (unsigned char *)buffer, size);
  598. }
  599. /*
  600. * position: block page address, not bytes address
  601. * buffer: write buffer addr
  602. * size : how many blocks
  603. */
  604. static rt_size_t rt_ahci_write(rt_device_t device, rt_off_t position, const void *buffer, rt_size_t size)
  605. {
  606. return ahci_rw_multiple((rt_device_extension_t *)device->user_data, 1, position, (unsigned char *)buffer, size);
  607. }
  608. static rt_err_t rt_ahci_control(rt_device_t dev, int cmd, void *args)
  609. {
  610. RT_ASSERT(dev != RT_NULL);
  611. RT_ASSERT(dev->user_data != NULL);
  612. RT_ASSERT(args != RT_NULL);
  613. rt_device_extension_t *extension = (rt_device_extension_t *)dev->user_data;
  614. rt_err_t err = RT_EOK;
  615. switch(cmd)
  616. {
  617. case RT_DEVICE_CTRL_BLK_GETGEOME:
  618. {
  619. struct rt_device_blk_geometry *geometry;
  620. geometry = (struct rt_device_blk_geometry *)args;
  621. if (geometry == RT_NULL)
  622. {
  623. return -RT_ERROR;
  624. }
  625. geometry->bytes_per_sector = ATA_SECTOR_SIZE;
  626. geometry->block_size = ATA_SECTOR_SIZE;
  627. geometry->sector_count = extension->sector_count;
  628. dbgprint("[ahci] getgeome: bytes_per_sector:%d, block_size:%d, sector_count:%d\n",
  629. geometry->bytes_per_sector, geometry->block_size, geometry->sector_count);
  630. break;
  631. }
  632. default:
  633. err = RT_ERROR;
  634. break;
  635. }
  636. return err;
  637. }
  638. static void rt_hw_ahci_isr(int vector, void *param)
  639. {
  640. int i;
  641. for (i = 0; i < 32; i++)
  642. {
  643. if (g_hba_base->interrupt_status & (1 << i))
  644. {
  645. dbgprint("[ahci] interrupt on port %d occured!\n", i);
  646. g_hba_base->ports[i].interrupt_status = ~0;
  647. g_hba_base->interrupt_status = (1 << i);
  648. ahci_flush_commands((struct hba_port *)&g_hba_base->ports[i]);
  649. }
  650. }
  651. }
  652. static void ahci_init_hba(struct hba_memory *abar)
  653. {
  654. if(abar->ext_capabilities & 1)
  655. {
  656. /* request BIOS/OS ownership handoff */
  657. abar->bohc |= (1 << 1);
  658. while((abar->bohc & 1) || !(abar->bohc & (1<<1)))
  659. {
  660. rt_hw_cpu_pause();
  661. }
  662. }
  663. /* enable the AHCI and reset it */
  664. abar->global_host_control |= HBA_GHC_AHCI_ENABLE;
  665. abar->global_host_control |= HBA_GHC_RESET;
  666. /* wait for reset to complete */
  667. while(abar->global_host_control & HBA_GHC_RESET)
  668. {
  669. rt_hw_cpu_pause();
  670. }
  671. /* enable the AHCI and interrupts */
  672. abar->global_host_control |= HBA_GHC_AHCI_ENABLE;
  673. abar->global_host_control |= HBA_GHC_INTERRUPT_ENABLE;
  674. rt_thread_mdelay(20);
  675. dbgprint("[ahci] caps: %x %x ver:%x ctl: %x\n", abar->capability, abar->ext_capabilities, abar->version, abar->global_host_control);
  676. }
  677. #ifdef RT_USING_DEVICE_OPS
  678. const static struct rt_device_ops ahci_ops =
  679. {
  680. rt_ahci_init,
  681. rt_ahci_open,
  682. rt_ahci_close,
  683. rt_ahci_read,
  684. rt_ahci_write,
  685. rt_ahci_control
  686. };
  687. #endif
  688. static rt_err_t ahci_create_device(rt_device_extension_t *extension)
  689. {
  690. static int ahci_next_device = 0; /* first is sd0 */
  691. rt_device_t device = rt_device_create(RT_Device_Class_Block, 0);
  692. if (device == RT_NULL)
  693. {
  694. dbg_log(DBG_ERROR, "[ahci] create device failed!\n");
  695. return RT_ENOMEM;
  696. }
  697. device->user_data = (void *)extension;
  698. #ifdef RT_USING_DEVICE_OPS
  699. device->ops = &ahci_ops;
  700. #else
  701. device->init = rt_ahci_init;
  702. device->open = rt_ahci_open;
  703. device->close = rt_ahci_close;
  704. device->read = rt_ahci_read;
  705. device->write = rt_ahci_write;
  706. device->control = rt_ahci_control;
  707. #endif
  708. char devname[8] = {0};
  709. rt_sprintf(devname, "%s%c", DEV_NAME, '0' + ahci_next_device);
  710. ahci_next_device++;
  711. if (rt_device_register(device, devname, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE) != RT_EOK)
  712. {
  713. dbg_log(DBG_ERROR, "[ahci] register device failed!\n");
  714. rt_device_destroy(device);
  715. return RT_ENOMEM;
  716. }
  717. return RT_EOK;
  718. }
  719. static int rt_hw_ahci_init(void)
  720. {
  721. /* 1. get pci info */
  722. rt_pci_device_t *ahci_pci = ahci_get_pci_info();
  723. if(ahci_pci == RT_NULL)
  724. {
  725. dbg_log(DBG_ERROR, "[ahci] no AHCI controllers present!\n");
  726. return RT_ERROR;
  727. }
  728. /* 2. install intr */
  729. if (rt_hw_interrupt_install(ahci_pci->irq_line, rt_hw_ahci_isr, RT_NULL, "ahci") < 0)
  730. {
  731. dbg_log(DBG_ERROR, "[ahci] install IRQ failed!\n");
  732. rt_iounmap(g_hba_base);
  733. return RT_ERROR;
  734. }
  735. rt_hw_interrupt_umask(ahci_pci->irq_line);
  736. /* 3. init ahci device */
  737. ahci_init_hba(g_hba_base);
  738. if (!ahci_probe_ports(g_hba_base))
  739. {
  740. dbg_log(DBG_ERROR, "[ahci] initializing ahci driver failed!.\n");
  741. rt_hw_interrupt_mask(ahci_pci->irq_line);
  742. rt_iounmap(g_hba_base);
  743. return RT_ERROR;
  744. }
  745. rt_kprintf("[ahci] disk driver init done!\n");
  746. return RT_EOK;
  747. }
  748. #ifdef RT_USING_COMPONENTS_INIT
  749. INIT_DEVICE_EXPORT(rt_hw_ahci_init);
  750. #endif
  751. #endif /* BSP_DRV_AHCI */