Sushma,
The problem(s) with ‘cat’ are that 1) It won’t modify the header for the legacy
oprom, and 2) it assumes that the legacy oprom image is exactly the correct
number of 512 bytes blocks. ‘cat’ is placing one image after the other, but it
doesn’t take into account any padding requirements (everything needs to be
aligned to 512 byte boundaries) or filling that may have occurred (i.e. padding
unused legacy oprom space to say 64KB as we do). As I mentioned in one of the
emails, our default legacy rom images are always padded out to 64KB even if the
image size is less than 64KB. Such in image will NOT work when using ‘cat’
As for the header, it’s not the EFI ROM image you need to worry about, it’s any
image that comes before it – in this case, the legacy oprom.
Look through this and see if it helps…
-Joe
I’ve included some dumps from our images to demonstrate: (This happens to be
for a SAS disk controller…)
Legacy OPROM before combining – ROM_L.bin – 65536 bytes in length: Can be used
as is for a standalone legacy oprom. MUST be modified if an oprom image is to
be placed AFTER this image.
1 0x000000: 55 aa 7d e9 50 08 52 43 00 53 26 00 4c 02 91 d5
*U.}.P.RC.S&.L...*
2 0x000010: 9c 06 28 10 24 1f c3 0d 1c 00 48 00 50 43 49 52
*..(.$.....H.PCIR*
3 0x000020: 28 10 16 00 00 00 18 00 00 00 04 01 7d 00 01 00
*(...........}...*
4 0x000030: 00 80 00 00 04 04 51 00 14 08 48 01 6f 01 9e 0b
*......Q...H.o...*
5 0x000040: a3 0b a8 0b ad 0b 00 00 24 50 6e 50 01 02 00 00
*........$PnP....*
6 0x000050: 00 5f 28 10 16 00 48 01 6f 01 01 04 00 44 14 08
*._(...H.o....D..*
7 0x000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*................*
Decoding --
Offset 0000: Option ROM header
Signature: 55 AA
Option ROM Length: 7d
; length in 512 byte “sectors”
Init Vector: e9 50 08
; jmp _init – BIOS calls offset 3 to jump to legacy oprom init
routine
Application Specific: <offset 06 thru 19> ; we
store a OPROM checksum at offset 9 – we need to modify our checksum if we
change the image
Offset to PCIR: 1c 00
; offset 001C
Offset 001C: PCIR header
Signature: 50 43 49 52
; ASCII ‘PCIR’
Vendor ID: 28 10
Device ID: 16 00
Device List Ptr: 00 00
Struct Length: 18 00
Struct Rev: 00
Class Code: 00 04 01
Image length: 7d 00
; in 512 byte sectors
Vendor rev level: 01 00
Code Type: 00
; 0 = intel x86
Last Image: 80
; this is (currently) marked as the last image – this needs to
be modified
UEFI OPROM before combining – ROM_U.bin – 147456 bytes in length: Can be used
as a standalone UEFI oprom or can be added, as is, after a legacy oprom image.
1 0x000000: 55 aa 20 01 f1 0e 00 00 0b 00 64 86 00 00 00 00 *U. .......d.....*
2 0x000010: 00 00 00 00 00 00 34 00 1c 00 00 00 50 43 49 52 *......4.....PCIR*
3 0x000020: 28 10 16 00 00 00 18 00 00 00 00 00 20 01 00 00 *(........... ...*
4 0x000030: 03 80 00 00 4d 5a 00 00 00 00 00 00 00 00 00 00 *....MZ..........*
5 0x000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 *................*
6 0x000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 *................*
7 0x000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 *................*
If I were to cat the two files together, the UEFI oprom image would start at
offset 65536 but according to the legacy oprom header, it should start at
offset 7d * 512, or 64000. Also, unless I change the last image indicator, BIOS
won’t look past the legacy oprom for the UEFI oprom, even if the offsets were
correct.
Anyways, using the code I sent, we clear the last image indicator for the
legacy oprom image, patch the checksum byte, and only copy out the 64000 bytes
of the legacy oprom.
Immediately after that, we copy unchanged, the UEFI oprom image.
Here’s the new header on the merged image (first image is legacy oprom) –
ROM_C.bin – 211968 bytes in length:
1 0x000000: 55 aa 7d e9 50 08 52 43 00 d3 26 00 4c 02 91 d5 *U.}.P.RC..&.L...*
2 0x000010: 9c 06 28 10 24 1f c3 0d 1c 00 48 00 50 43 49 52 *..(.$.....H.PCIR*
3 0x000020: 28 10 16 00 00 00 18 00 00 00 04 01 7d 00 01 00 *(...........}...*
4 0x000030: 00 00 00 00 04 04 51 00 14 08 48 01 6f 01 9e 0b *......Q...H.o...*
5 0x000040: a3 0b a8 0b ad 0b 00 00 24 50 6e 50 01 02 00 00 *........$PnP....*
6 0x000050: 00 5f 28 10 16 00 48 01 6f 01 01 04 00 44 14 08 *._(...H.o....D..*
7 0x000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 *................*
Notice the byte at offset 0x31 (offset 0x15 in the PCIR header) has changed
from 80 to 00. The is the clearing of the last image indicator. BIOS now knows
that another image should follow this one.
Also, the byte at offset 0x09, our checksum, changed from 53 to d3.
If I dmp from offset 64000 (0xFA00 = 0x7d * 0x200), I should, and do, see my
header for the UEFI oprom image…
1 0x00f9e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*................* <-- padding of legacy image to 512 byte boundary
2 0x00f9f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*................* <-- more padding
3 0x00fa00: 55 aa 20 01 f1 0e 00 00 0b 00 64 86 00 00 00 00 *U.
.......d.....* <-- 0x7D * 0x200 – offset from start to this image
4 0x00fa10: 00 00 00 00 00 00 34 00 1c 00 00 00 50 43 49 52 *......4.....PCIR*
5 0x00fa20: 28 10 16 00 00 00 18 00 00 00 00 00 20 01 00 00 *(........... ...*
6 0x00fa30: 03 80 00 00 4d 5a 00 00 00 00 00 00 00 00 00 00 *....MZ..........*
7 0x00fa40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 *................*
As you can see, nothing changed in the UEFI oprom header.
I think you can figure out what’s happening if you look at your legacy oprom
last indicator in the combined image – make sure it’s 00, and then look to make
sure your UEFI oprom image is at the correct offset – multiply the legacy oprom
image size (offset 2) by 0x200 (or 512). You should see your UEFI oprom header
at that offset in your combined image.
// Joseph Thomas
// Principal Software Engineer
// Dot Hill Systems
// 2905 NorthWest Blvd., Suite 20
// Plymouth, MN 55441
// 763.226.2640
From: sushma s [mailto:sushma.bharadw...@gmail.com]
Sent: Thursday, August 07, 2014 5:31 AM
To: edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
Subject: Re: [edk2] making UEFI driver part of optrom
Hi Joe,
Thanks for your inputs.
We had missed to set"Last Image Indicator" in legacy optrom header as zero.
But even with this change, the BIOS doesn't see our driver UEFI ROM image.
We are using win32 tool "CAT" to combine our legacy optrom image and UEFI ROM
image.
Instead of using CAT, should we place the images just one below the other?
I have dumped the ROM header contents using EfiRom utility run against my
UEFI.rom image. Please have a look at let us know if anything is missed.
ROM header contents
Signature 0xAA55
PCIR offset 0x001C
Signature PCIR
Vendor ID 0xxxxx
Device ID 0xxxx
Length 0x001C
Revision 0x0003
DeviceListOffset 0x00
Class Code 0x010100
Image size 0x11E00
Code revision: 0x0000
MaxRuntimeImageLength 0x00
ConfigUtilityCodeHeaderOffset 0x00
DMTFCLPEntryPointOffset 0x00
Indicator 0x80 (last image)
Code type 0x03 (EFI image)
EFI ROM header contents
EFI Signature 0x0EF1
Compression Type 0x0001 (compressed)
Machine type 0x0EBC (EBC)
Subsystem 0x000B (EFI boot service driver)
EFI image offset 0x0038 (@0x38)
Thanks,
Sushma.S
On Wed, Aug 6, 2014 at 6:01 PM, Joe Thomas
<joe.tho...@dothill.com<mailto:joe.tho...@dothill.com>> wrote:
Sushma,
When you say “We placed this UEFI driver ROM image, below the legacy optrom and
flashed the same on the PCIe card.”, how exactly did you do this?
Did you change the headers in the legacy image to indicated that it no longer
is the last image?
It’s been several years since I’ve done this so I’m still going back trying to
find the tools we used but it almost sounds like the PCI Data Structure in the
legacy ROM wasn’t updated and therefore, the BIOS only sees the one image,
regardless of what you put after… (There’s a ‘Last Image Indicator’ that needs
to have bit 7 set to zero in all images except the last. In this, case, the
legacy image should be zero and the UEFI image should be 1 (0x80). The UEFI
image then needs to follow the legacy image at ‘Image Length’ * 512 bytes.)
I’ll try to find what we did and forward if I can.
-Joe
// Joseph Thomas
// Principal Software Engineer
// Dot Hill Systems
// 2905 NorthWest Blvd., Suite 20
// Plymouth, MN 55441
// 763.226.2640
From: Ramesh R. [mailto:rame...@ami.com<mailto:rame...@ami.com>]
Sent: Wednesday, August 06, 2014 7:19 AM
To: edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
Subject: Re: [edk2] making UEFI driver part of optrom
Hi Sushma,
It’s depend on the platform BIOS to decide which option rom needs to be
invoked. May be the BIOS you are having invokes only Legacy option rom if it’s
exists and doesn’t launch the UEFI option rom.
I mean to say from the option rom we can’t control which option rom needs to be
launched. It’s decided by the platform BIOS.
Thanks,
Ramesh
From: sushma s [mailto:sushma.bharadw...@gmail.com]
Sent: 06 August 2014 11:33
To: edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
Subject: Re: [edk2] making UEFI driver part of optrom
Hello,
As suggested, we placed only uefi.rom in the PCIE optrom, our UEFI driver is
getting loaded during boot.
But if i keep both the legacy optrom images, and UEFI driver rom image, i below
the other in the optrom space, my UEFI driver is not getting loaded.
Any additional changes required to make both images co-exist. Please advise.
Regards,
Sushma.S
On Mon, Aug 4, 2014 at 11:17 AM, Onipchuk Vladimir
<v-onipc...@yandex.ru<mailto:v-onipc...@yandex.ru>> wrote:
>>> We are able to successfully load the UEFI driver ROM using loadpicrom UEFI
>>> shell command.
During loadpcirom command please make sure what "start" function was loaded
(not just "entrypoint").
>>> In the PCIE card optrom layout We placed this UEFI driver ROM image, below
>>> the legacy optrom image and flashed the same on the PCIe card.
Try to place only UEFI driver ROM image on the PCIe card.
Thanks,
Vladimir
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel