[SeaBIOS] [PATCH 3/3] ahci: alloc structs in high memory, simplify realloc
Gerd Hoffmann
kraxel at redhat.com
Tue Nov 26 14:23:41 CET 2013
With ahci running in 32bit mode we can also allocate the
(ahci private) data structures in high memory. This
reduces the real mode memory footprint and also simplifies
the realloc as we only need to move struct ahci_port_s
(which contains struct drive_s) from high memory to fseg
in case the port probe was successful.
Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
---
src/hw/ahci.c | 27 ++++-----------------------
1 file changed, 4 insertions(+), 23 deletions(-)
diff --git a/src/hw/ahci.c b/src/hw/ahci.c
index 5984c1c..5add207 100644
--- a/src/hw/ahci.c
+++ b/src/hw/ahci.c
@@ -358,9 +358,9 @@ ahci_port_alloc(struct ahci_ctrl_s *ctrl, u32 pnr)
}
port->pnr = pnr;
port->ctrl = ctrl;
- port->list = memalign_tmp(1024, 1024);
- port->fis = memalign_tmp(256, 256);
- port->cmd = memalign_tmp(256, 256);
+ port->list = memalign_high(1024, 1024);
+ port->fis = memalign_high(256, 256);
+ port->cmd = memalign_high(256, 256);
if (port->list == NULL || port->fis == NULL || port->cmd == NULL) {
warn_noalloc();
return NULL;
@@ -386,7 +386,6 @@ static void ahci_port_release(struct ahci_port_s *port)
static struct ahci_port_s* ahci_port_realloc(struct ahci_port_s *port)
{
struct ahci_port_s *tmp;
- u32 cmd;
tmp = malloc_fseg(sizeof(*port));
if (!tmp) {
@@ -396,25 +395,7 @@ static struct ahci_port_s* ahci_port_realloc(struct ahci_port_s *port)
}
*tmp = *port;
free(port);
- port = tmp;
-
- ahci_port_reset(port->ctrl, port->pnr);
-
- free(port->list);
- free(port->fis);
- free(port->cmd);
- port->list = memalign_low(1024, 1024);
- port->fis = memalign_low(256, 256);
- port->cmd = memalign_low(256, 256);
-
- ahci_port_writel(port->ctrl, port->pnr, PORT_LST_ADDR, (u32)port->list);
- ahci_port_writel(port->ctrl, port->pnr, PORT_FIS_ADDR, (u32)port->fis);
-
- cmd = ahci_port_readl(port->ctrl, port->pnr, PORT_CMD);
- cmd |= (PORT_CMD_FIS_RX|PORT_CMD_START);
- ahci_port_writel(port->ctrl, port->pnr, PORT_CMD, cmd);
-
- return port;
+ return tmp;
}
#define MAXMODEL 40
--
1.8.3.1
More information about the SeaBIOS
mailing list