ahci: move SATA memory areas in wolfboot .bss

pull/365/head
Marco Oliverio 2023-09-13 15:16:24 +00:00
parent bc90f85f1b
commit 32b66f9368
1 changed files with 18 additions and 12 deletions

View File

@ -47,15 +47,18 @@
#define SATA_BASE 0x02200000 #define SATA_BASE 0x02200000
#endif /* TARGET_qemu_fsp */ #endif /* TARGET_qemu_fsp */
#define HBA_FIS_BASE (SATA_BASE + 0x100)
#define HBA_CLB_BASE (SATA_BASE + 0x1000)
#define HBA_TBL_BASE (SATA_BASE + 0x200000)
#define HBA_FIS_SIZE 0x100 #define HBA_FIS_SIZE 0x100
#define HBA_CLB_SIZE 0x400 #define HBA_CLB_SIZE 0x400
#define HBA_TBL_SIZE 0x800 #define HBA_TBL_SIZE 0x800
#define HBA_TBL_ALIGN 0x80
#define HBA_FIS_PORT_SIZE 0x80 static uint8_t ahci_hba_fis[HBA_FIS_SIZE * AHCI_MAX_PORTS]
__attribute__((aligned(HBA_FIS_SIZE)));
static uint8_t ahci_hba_clb[HBA_CLB_SIZE * AHCI_MAX_PORTS]
__attribute__((aligned(HBA_CLB_SIZE)));
static uint8_t ahci_hba_tbl[HBA_TBL_SIZE * AHCI_MAX_PORTS]
__attribute__((aligned(HBA_TBL_ALIGN)));
#define PCI_REG_PCS 0x92 #define PCI_REG_PCS 0x92
#define PCI_REG_CLK 0x94 #define PCI_REG_CLK 0x94
@ -193,6 +196,7 @@ void ahci_dump_port(uint32_t base, int i)
void sata_enable(uint32_t base) { void sata_enable(uint32_t base) {
volatile uint32_t count; volatile uint32_t count;
uint32_t cap, ports_impl; uint32_t cap, ports_impl;
uint32_t fis, clb, tbl;
uint8_t sata_only; uint8_t sata_only;
uint8_t cap_sud; uint8_t cap_sud;
uint32_t n_ports; uint32_t n_ports;
@ -201,6 +205,7 @@ void sata_enable(uint32_t base) {
uint32_t data; uint32_t data;
uint32_t reg; uint32_t reg;
mmio_or32(AHCI_HBA_GHC(base), HBA_GHC_AE); mmio_or32(AHCI_HBA_GHC(base), HBA_GHC_AE);
/* Wait until enabled. */ /* Wait until enabled. */
@ -341,19 +346,21 @@ void sata_enable(uint32_t base) {
} while ((reg & AHCI_PORT_CMD_FR) != 0); } while ((reg & AHCI_PORT_CMD_FR) != 0);
AHCI_DEBUG_PRINTF("AHCI port: FIS disabled.\r\n"); AHCI_DEBUG_PRINTF("AHCI port: FIS disabled.\r\n");
clb = (uint32_t)(uintptr_t)(ahci_hba_clb + i * HBA_CLB_SIZE);
fis = (uint32_t)(uintptr_t)(ahci_hba_fis + i * HBA_FIS_SIZE);
tbl = (uint32_t)(uintptr_t)(ahci_hba_tbl + i * HBA_TBL_SIZE);
/* Initialize FIS and CLB address */ /* Initialize FIS and CLB address */
mmio_write32(AHCI_PxCLB(base, i), mmio_write32(AHCI_PxCLB(base, i),
HBA_CLB_BASE + i * HBA_CLB_SIZE); (uint32_t)(uintptr_t)(clb));
mmio_write32(AHCI_PxCLBH(base, i), 0); mmio_write32(AHCI_PxCLBH(base, i), 0);
mmio_write32(AHCI_PxFB(base, i), mmio_write32(AHCI_PxFB(base, i),
HBA_FIS_BASE + i * HBA_FIS_SIZE); (uint32_t)(uintptr_t)(fis));
mmio_write32(AHCI_PxFBH(base, i), 0); mmio_write32(AHCI_PxFBH(base, i), 0);
memset((void*)(uintptr_t)(HBA_CLB_BASE + i * HBA_CLB_SIZE), memset((uint8_t*)(uintptr_t)clb, 0, HBA_CLB_SIZE);
0, HBA_CLB_SIZE); memset((uint8_t*)(uintptr_t)fis, 0, HBA_FIS_SIZE);
memset((void*)(uintptr_t)(HBA_FIS_BASE + i * HBA_FIS_SIZE),
0, HBA_FIS_SIZE);
/* Wait until CR is cleared */ /* Wait until CR is cleared */
do { do {
@ -377,8 +384,7 @@ void sata_enable(uint32_t base) {
int drv; int drv;
wolfBoot_printf("SATA disk drive detected on AHCI port %d\r\n", wolfBoot_printf("SATA disk drive detected on AHCI port %d\r\n",
i); i);
drv = ata_drive_new(base, i, HBA_CLB_BASE + i * HBA_CLB_SIZE, drv = ata_drive_new(base, i, clb, tbl, fis);
HBA_TBL_BASE + i * HBA_TBL_SIZE, HBA_FIS_BASE + i * HBA_FIS_SIZE);
if (drv < 0) { if (drv < 0) {
wolfBoot_printf("Failed to associate ATA drive to disk\r\n"); wolfBoot_printf("Failed to associate ATA drive to disk\r\n");
} else { } else {