hw/pci.c hw/timer.c hw/rtc.c hw/dma.c hw/pic.c hw/ps2port.c \
hw/usb.c hw/usb-uhci.c hw/usb-ohci.c hw/usb-ehci.c hw/usb-xhci.c \
hw/usb-hid.c hw/usb-msc.c hw/usb-uas.c \
- hw/blockcmd.c hw/floppy.c hw/ata.c hw/ahci.c hw/ramdisk.c \
+ hw/blockcmd.c hw/floppy.c hw/ata.c hw/ramdisk.c \
hw/virtio-ring.c hw/virtio-pci.c hw/virtio-blk.c hw/virtio-scsi.c \
hw/lsi-scsi.c hw/esp-scsi.c hw/megasas.c
SRC16=$(SRCBOTH) system.c disk.c font.c
SRC32FLAT=$(SRCBOTH) post.c memmap.c malloc.c pmm.c romfile.c optionroms.c \
boot.c bootsplash.c jpeg.c bmp.c \
- hw/usb-hub.c \
+ hw/ahci.c hw/usb-hub.c \
fw/coreboot.c fw/lzmadecode.c fw/csm.c fw/biostables.c \
fw/paravirt.c fw/shadow.c fw/pciinit.c fw/smm.c fw/mtrr.c fw/xen.c \
fw/acpi.c fw/mptable.c fw/pirtable.c fw/smbios.c
}
}
-static int
+int VISIBLE32FLAT
process_atapi_op(struct disk_op_s *op)
{
switch (op->command) {
case DTYPE_VIRTIO_BLK:
return process_virtio_blk_op(op);
case DTYPE_AHCI:
- return process_ahci_op(op);
+ op->drive_g = (void*)op->drive_g + BUILD_BIOS_ADDR;
+ extern void _cfunc32flat_process_ahci_op(void);
+ return call32(_cfunc32flat_process_ahci_op
+ , (u32)MAKE_FLATPTR(GET_SEG(SS), op), DISK_RET_EPARAM);
case DTYPE_ATA_ATAPI:
- case DTYPE_AHCI_ATAPI:
return process_atapi_op(op);
+ case DTYPE_AHCI_ATAPI:
+ op->drive_g = (void*)op->drive_g + BUILD_BIOS_ADDR;
+ extern void _cfunc32flat_process_atapi_op(void);
+ return call32(_cfunc32flat_process_atapi_op
+ , (u32)MAKE_FLATPTR(GET_SEG(SS), op), DISK_RET_EPARAM);
case DTYPE_USB:
case DTYPE_UAS:
case DTYPE_VIRTIO_SCSI:
#define AHCI_RESET_TIMEOUT 500 // 500 miliseconds
#define AHCI_LINK_TIMEOUT 10 // 10 miliseconds
-/****************************************************************
- * these bits must run in both 16bit and 32bit modes
- ****************************************************************/
-
// prepare sata command fis
static void sata_prep_simple(struct sata_cmd_fis *fis, u8 command)
{
static u32 ahci_ctrl_readl(struct ahci_ctrl_s *ctrl, u32 reg)
{
u32 addr = GET_GLOBALFLAT(ctrl->iobase) + reg;
- return pci_readl(addr);
+ return readl((void*)addr);
}
static void ahci_ctrl_writel(struct ahci_ctrl_s *ctrl, u32 reg, u32 val)
{
u32 addr = GET_GLOBALFLAT(ctrl->iobase) + reg;
- pci_writel(addr, val);
+ writel((void*)addr, val);
}
static u32 ahci_port_to_ctrl(u32 pnr, u32 port_reg)
}
// command demuxer
-int process_ahci_op(struct disk_op_s *op)
+int VISIBLE32FLAT
+process_ahci_op(struct disk_op_s *op)
{
if (!CONFIG_AHCI)
return 0;
}
}
-/****************************************************************
- * everything below is pure 32bit code
- ****************************************************************/
-
static void
ahci_port_reset(struct ahci_ctrl_s *ctrl, u32 pnr)
{
return usb_cmd_data(op, cdbcmd, blocksize);
case DTYPE_UAS:
return uas_cmd_data(op, cdbcmd, blocksize);
- case DTYPE_AHCI_ATAPI:
- return ahci_cmd_data(op, cdbcmd, blocksize);
case DTYPE_VIRTIO_SCSI:
return virtio_scsi_cmd_data(op, cdbcmd, blocksize);
case DTYPE_LSI_SCSI:
return esp_scsi_cmd_data(op, cdbcmd, blocksize);
case DTYPE_MEGASAS:
return megasas_cmd_data(op, cdbcmd, blocksize);
+ case DTYPE_AHCI_ATAPI:
+ if (!MODESEGMENT)
+ return ahci_cmd_data(op, cdbcmd, blocksize);
default:
op->count = 0;
return DISK_RET_EPARAM;