Merge branch 'master' into vfs-dev
authorMinep <zelong56@gmail.com>
Tue, 9 Aug 2022 15:09:18 +0000 (16:09 +0100)
committerMinep <zelong56@gmail.com>
Tue, 9 Aug 2022 15:09:18 +0000 (16:09 +0100)
1  2 
lunaix-os/hal/ahci/ahci.c
lunaix-os/includes/hal/ahci/hba.h

index 39e511c33fde391a965c9b455daf06dc35312b54,ee521561da66fcdca484778002f4143fa1eb4a83..0551ee547fe9283bf4c063895bc61db89806d4fd
@@@ -16,7 -16,6 +16,7 @@@
  
  #include <hal/pci.h>
  #include <klibc/string.h>
 +#include <lunaix/block.h>
  #include <lunaix/mm/mmio.h>
  #include <lunaix/mm/pmm.h>
  #include <lunaix/mm/valloc.h>
@@@ -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)) {
          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));
  
          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)));
  
  
      // 清空任何待响应的中断
      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;
      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);
      return 1;
  
  fail:
+     port->regs[HBA_RPxIS] = -1;
+     port->regs[HBA_RPxIE] |= HBA_PxINTR_DHR;
      vfree_dma(data_in);
      vfree_dma(cmd_table);
  
index 334acd508a7dda0562478b00f88b35aed7acac9e,9ca688d5c5d85459039fdfb012d707e350c47021..c868c6ff1e740c70323ae2783626cb9b960f41b9
@@@ -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);