AMD Hudson: Move the combining firmware from Python to sh.

Maybe sooner or later python is not a default tools to build coreboot.
Most of the work is done by awk now. GNU extension of gawk is not used, isn't?
echo, expr, printf, cat, awk, test, mv are the external tools.
If XHCI, IMC or GEC firmware is not available and not defined, this script can skip
integrating them.

Change-Id: I9944b22b0b755672a46d472c355d138abafd6393
Signed-off-by: Zheng Bao <zheng.bao@amd.com>
Signed-off-by: zbao <fishbaozi@gmail.com>
Reviewed-on: http://review.coreboot.org/1417
Tested-by: build bot (Jenkins)
Reviewed-by: Anton Kochkov <anton.kochkov@gmail.com>
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
This commit is contained in:
Zheng Bao 2012-08-27 18:40:44 +08:00 committed by Alexandru Gagniuc
parent a5de94128b
commit cc6019879d
2 changed files with 69 additions and 68 deletions

View File

@ -14,16 +14,81 @@ romstage-y += early_setup.c
ramstage-$(CONFIG_HAVE_ACPI_RESUME) += spi.c
$(obj)/hudson.bin:
python $(src)/southbridge/amd/agesa/hudson/hudson_fwm.py $(CONFIG_HUDSON_FWM_POSITION) $@ $(CONFIG_HUDSON_XHCI_FWM_FILE) $(CONFIG_HUDSON_IMC_FWM_FILE) ""
# ROMSIG At ROMBASE + 0x20000:
# +-----------+---------------+----------------+------------+
# |0x55AA55AA |EC ROM Address |GEC ROM Address |USB3 ROM |
# +-----------+---------------+----------------+------------+
# EC ROM should be 64K aligned.
HUDSON_FWM_POSITION=$(shell printf %d $(CONFIG_HUDSON_FWM_POSITION))
#assume the cbfs header is less than 128 bytes.
ROMSIG_SIZE=16
ifeq ($(CONFIG_HUDSON_XHCI_FWM), y)
HUDSON_XHCI_POSITION=$(shell expr $(HUDSON_FWM_POSITION) + $(ROMSIG_SIZE) + 128)
XHCI_FWM_SIZE=$(word 5,$(shell ls -l $(CONFIG_HUDSON_XHCI_FWM_FILE)))
else
HUDSON_XHCI_POSITION=0
XHCI_FWM_SIZE=0
endif
ifeq ($(CONFIG_HUDSON_GEC_FWM), y)
HUDSON_GEC_POSITION=$(shell expr $(HUDSON_FWM_POSITION) + $(ROMSIG_SIZE) + 128 \
+ $(XHCI_FWM_SIZE) + 128)
GEC_FWM_SIZE=$(word 5,$(shell ls -l $(CONFIG_HUDSON_GEC_FWM_FILE)))
else
HUDSON_GEC_POSITION=0
GEC_FWM_SIZE=0
endif
ifeq ($(CONFIG_HUDSON_IMC_FWM), y)
HUDSON_IMC_POSITION_UNALIGN=$(shell expr $(HUDSON_FWM_POSITION) + $(ROMSIG_SIZE) + 128 \
+ $(XHCI_FWM_SIZE) + 128 \
+ $(GEC_FWM_SIZE) + 128 + 65535)
HUDSON_IMC_POSITION=$(shell expr $(HUDSON_IMC_POSITION_UNALIGN) - $(HUDSON_IMC_POSITION_UNALIGN) % 65536)
else
HUDSON_IMC_POSITION=0
endif
$(obj)/hudson_romsig.bin: #$(call strip_quotes, $(CONFIG_HUDSON_XHCI_FWM_FILE)) \
$(call strip_quotes, $(CONFIG_HUDSON_IMC_FWM_FILE)) \
$(call strip_quotes, $(CONFIG_HUDSON_GEC_FWM_FILE)) \
$(obj)/config.h
echo " Hudson FW $@"
for fwm in 1437226410 \
$(HUDSON_IMC_POSITION) \
$(HUDSON_GEC_POSITION) \
$(HUDSON_XHCI_POSITION) ; do \
echo $$fwm | LC_ALL=C awk '{printf ("%c%c%c%c", $$1 % 0x100, $$1/0x100 % 0x100, $$1/0x10000 % 0x100, $$1/0x1000000);}'; \
done > $@
ifeq ($(CONFIG_HUDSON_FWM), y)
cbfs-files-y += hudson/fwm
hudson/fwm-file := $(obj)/hudson.bin
hudson/fwm-position := $(CONFIG_HUDSON_FWM_POSITION)
hudson/fwm-file := $(obj)/hudson_romsig.bin
hudson/fwm-position := $(HUDSON_FWM_POSITION)
hudson/fwm-type := raw
endif
ifeq ($(CONFIG_HUDSON_XHCI_FWM), y)
cbfs-files-y += hudson/xhci
hudson/xhci-file := $(call strip_quotes, $(CONFIG_HUDSON_XHCI_FWM_FILE))
hudson/xhci-position := $(HUDSON_XHCI_POSITION)
hudson/xhci-type := raw
endif
ifeq ($(CONFIG_HUDSON_IMC_FWM), y)
cbfs-files-y += hudson/imc
hudson/imc-file := $(call strip_quotes, $(CONFIG_HUDSON_IMC_FWM_FILE))
hudson/imc-position := $(HUDSON_IMC_POSITION)
hudson/imc-type := raw
endif
ifeq ($(CONFIG_HUDSON_GEC_FWM), y)
cbfs-files-y += hudson/gec
hudson/gec-file := $(call strip_quotes, $(CONFIG_HUDSON_GEC_FWM_FILE))
hudson/gec-position := $(HUDSON_GEC_POSITION)
hudson/gec-type := raw
endif
#ifeq ($(CONFIG_HUDSON_SATA_AHCI), y)
ifdef CONFIG_HUDSON_AHCI_ROM
stripped_ahci_rom_id = $(call strip_quotes,$(CONFIG_AHCI_ROM_ID))

View File

@ -1,64 +0,0 @@
import sys, os, re
import struct
from Queue import Queue
def main(start_addr, file_name, xhci_name, imc_name, gec_name):
fwm_sig = 0x55AA55AA # Hudson-2/3/4 firmware signature
fwm_header_len = 0x10 # 55AA55AA, imc_off, gec_off, xhci_off
if not os.path.exists(xhci_name):
print "XHCI firmware %s does not exist\n" % xhci_name
sys.exit(1)
if not os.path.exists(imc_name):
print "IMC firmware %s does not exist\n" % imc_name
sys.exit(1)
f = open(file_name, "w")
print "write to file " + file_name
imc_offset = 0x10000 # 64K Bytes offset, hardcoded
imc_addr = start_addr + imc_offset; #startaddr + 0x10000
gec_offset = 0 #TODO
gec_addr = 0 #TODO
xhci_addr = start_addr + fwm_header_len #ROMSIG take 0x10 bytes
format="I" # one unsigned integer
data=struct.pack(format, fwm_sig)
f.write(data)
data=struct.pack(format, imc_addr)
f.write(data)
data=struct.pack(format, gec_addr)
f.write(data)
data=struct.pack(format, xhci_addr)
f.write(data)
fwm_content = open(xhci_name).read()
f.write(fwm_content)
imc_content = open(imc_name).read()
f.seek(0)
f.seek(imc_offset)
f.write(imc_content)
# if os.path.exists(gec_name):
# gec_conent = open(gec_name).read()
# f.seek(0)
# f.seek(gec_offset)
# f.write(gec_content)
f.close()
print "done\n"
if __name__ == '__main__':
if (len(sys.argv) < 6):
print "\nUsage: %s <rom_addr> <rom_file> <xhci_rom> <imc_rom> <gec_rom>\n" % sys.argv[0]
print "Example: %s 0xFFF20000 hudson.bin xhci.bin imc.bin gec.bin\n" % sys.argv[0]
sys.exit(1)
rom_addr = int(sys.argv[1], 16)
rom_file = sys.argv[2]
xhci_file = sys.argv[3]
imc_file = sys.argv[4]
gec_file = sys.argv[5]
print "%x %s %s %s %s" % (rom_addr, rom_file, xhci_file, imc_file, gec_file)
main(rom_addr, rom_file, xhci_file, imc_file, gec_file)