From: Minep Date: Tue, 9 Aug 2022 15:09:18 +0000 (+0100) Subject: Merge branch 'master' into vfs-dev X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/commitdiff_plain/a5338b60e111972364a8bc6f07011c6defd213d2?hp=-c Merge branch 'master' into vfs-dev --- a5338b60e111972364a8bc6f07011c6defd213d2 diff --combined lunaix-os/hal/ahci/ahci.c index 39e511c,ee52156..0551ee5 --- a/lunaix-os/hal/ahci/ahci.c +++ b/lunaix-os/hal/ahci/ahci.c @@@ -16,7 -16,6 +16,7 @@@ #include #include +#include #include #include #include @@@ -161,8 -160,6 +161,6 @@@ ahci_init( // 需要通过全部置位去清空这些寄存器(相当的奇怪……) port_regs[HBA_RPxSERR] = -1; - port_regs[HBA_RPxIE] |= (HBA_PxINTR_DPS); - hba.ports[i] = port; if (!HBA_RPxSSTS_IF(port->ssts)) { @@@ -176,8 -173,6 +174,8 @@@ if (!ahci_init_device(port)) { kprintf(KERROR "fail to init device"); } + + block_mount_disk(port->device); } } @@@ -189,7 -184,8 +187,8 @@@ char sata_ifs[][20] = { "Not detected" void __ahci_hba_isr(isr_param param) { - // TODO: hba interrupt + // TODO: clear the interrupt status + // TODO: I/O-operation scheduler should be here kprintf(KDEBUG "HBA INTR\n"); } @@@ -280,7 -276,7 +279,7 @@@ hba_prepare_cmd(struct hba_port* port // 构建命令头(Command Header)和命令表(Command Table) struct hba_cmdh* cmd_header = &port->cmdlst[slot]; - struct hba_cmdt* cmd_table = vcalloc_dma(sizeof(struct hba_cmdt)); + struct hba_cmdt* cmd_table = vzalloc_dma(sizeof(struct hba_cmdt)); memset(cmd_header, 0, sizeof(*cmd_header)); @@@ -293,7 -289,7 +292,7 @@@ cmd_header->prdt_len = 1; cmd_table->entries[0] = (struct hba_prdte){ .data_base = vmm_v2p(buffer), - .byte_count = (size - 1) | (0x80000000) }; + .byte_count = size - 1 }; } *cmdh = cmd_header; @@@ -309,6 -305,9 +308,9 @@@ ahci_init_device(struct hba_port* port struct hba_cmdt* cmd_table; struct hba_cmdh* cmd_header; + // mask DHR interrupt + port->regs[HBA_RPxIE] &= ~HBA_PxINTR_DHR; + // 确保端口是空闲的 wait_until(!(port->regs[HBA_RPxTFD] & (HBA_PxTFD_BSY))); @@@ -319,8 -318,7 +321,8 @@@ // 清空任何待响应的中断 port->regs[HBA_RPxIS] = 0; - port->device = vcalloc(sizeof(struct hba_device)); + port->device = vzalloc(sizeof(struct hba_device)); + port->device->port = port; // 在命令表中构建命令FIS struct sata_reg_fis* cmd_fis = (struct sata_reg_fis*)cmd_table->command_fis; @@@ -402,6 -400,9 +404,9 @@@ scsi_parse_capacity(port->device, (uint32_t*)data_in); done: + // reset interrupt status and unmask D2HR interrupt + port->regs[HBA_RPxIS] = -1; + port->regs[HBA_RPxIE] |= HBA_PxINTR_DHR; achi_register_ops(port); vfree_dma(data_in); @@@ -410,6 -411,8 +415,8 @@@ return 1; fail: + port->regs[HBA_RPxIS] = -1; + port->regs[HBA_RPxIE] |= HBA_PxINTR_DHR; vfree_dma(data_in); vfree_dma(cmd_table); diff --combined lunaix-os/includes/hal/ahci/hba.h index 334acd5,9ca688d..c868c6f --- a/lunaix-os/includes/hal/ahci/hba.h +++ b/lunaix-os/includes/hal/ahci/hba.h @@@ -31,7 -31,7 +31,7 @@@ #define HBA_PxCMD_FR (1 << 14) #define HBA_PxCMD_ST (1) #define HBA_PxINTR_DMA (1 << 2) - #define HBA_PxINTR_D2HR (1) + #define HBA_PxINTR_DHR (1) #define HBA_PxINTR_DPS (1 << 5) #define HBA_PxTFD_ERR (1) #define HBA_PxTFD_BSY (1 << 7) @@@ -105,16 -105,15 +105,16 @@@ struct hba_devic uint32_t alignment_offset; uint32_t block_per_sec; uint32_t capabilities; + struct hba_port* port; struct { - int (*identify)(struct hba_port* port); - int (*read_buffer)(struct hba_port* port, + int (*identify)(struct hba_device* dev); + int (*read_buffer)(struct hba_device* dev, uint64_t lba, void* buffer, uint32_t size); - int (*write_buffer)(struct hba_port* port, + int (*write_buffer)(struct hba_device* dev, uint64_t lba, void* buffer, uint32_t size);