mirror of https://github.com/wolfSSL/wolfBoot.git
ahci: move SATA memory areas in wolfboot .bss
parent
bc90f85f1b
commit
32b66f9368
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue