User:GNUtoo
For coreboot users
This section is mainly usefull for finding informations for:
- running a free version of coreboot on the lenovo x60.
- knowing the machines I've been working on, in order to ask questions on them.
- Usefull howto for using coreboot.
Lenovo x60
I've a git tree with branches that have features that are not yet merged to coreboot.
The only interesting branch is the production+v5 branch, it contains:
- The native GPU init for it
- The new fallback mecanism
- The removal of the microcode for the Lenovo x60
Native GPU init
With the native (intel) GPU initialisation, coreboot itself initialises the GPU.
Initialisation method | Free software, based on | Advantages | Drawbacks |
---|---|---|---|
non-free VGA option rom | No, extracted from the BIOS. |
|
|
Linux kernel i915 driver | Yes, in the linux kernel |
|
|
Native GPU initialisation (by coreboot) | Yes, based on a replay of the kernel initialisation |
|
|
Yabel issue
Yabel works well for tracing. But the GPUs in the Lenovo x60 and t60 have a bar that gives access to the whole memory:
Region 1: I/O ports at 50a0 [size=8]
Hardware
I've contributed to the following ports:
- M4A785T-M: I've been the main person working on it.
- Lenovo x60: I've been working on the native GPU init, and various other improvements.
- Lenovo t60: I've been working on some improvements.
- Alix 1.C: I've been working on some improvements.
Howtos
make recent intel BIOS flash writable and/or extract its pieces
Coreboot has an uttility in util/ifdtool for that.
- power off the laptop totally (remove the power, the battery etc...)
- connect an external programmer to the BIOS flash chip.
- dump the chip content with flashrom and that external programmer.
- run ifdtool on the extracted chip content
- reflash the modified content
Personal oppinions
Microcode
The issue about the CPU microcodes is that they are non-free, and under a license that is incompatible with coreboot's license.
Practically speaking, I guess that if the microcode is in the cbfs(coreboot filesystem) instead of beeing integrated directly in coreboot, that would count as agrgate work and should be safe, but I'm not a lawyer(so ask a good one instead). The solution would then be to remove the microcodes from the coreboot repositories.
(I guess that it would then end up in the blob repository instead which is a separate repository, and would then be included in the coreboot filesytem).
Some people say that the microcode is the equivalent of having a more recent CPU, as a justification for using it. Though since Intel microcodes are encrypted and signed, its meaning is not public, therefore we can't really know what's inside, so people usually trust what the CPU vendor say about it, such as that it fixes some bugs(erratas for such bugs are published).
My goal is to have a 100% free computer, and also to spread that code, so that other people can have a 100% free computer too. According to the FSF, and the FSF criterias for differenciating software from hardware, that microcode is software. So since they consider it as non-free, a coreboot image containing that microcode would not be considered free by the FSF.
On my Lenovo x60, the microcode was easy to remove, and it worked fine, beside printing a scary kernel message pointing to an Intel errata. Practically speaking, after resuming(so after suspend to ram), the temperatures reading will not be updated, and the temperature overheat will not be reported. The hardware issues you may encounter will depend on your specific CPU, not the model, but instead the date at which it was manufactured.
The result of it is that the FSF certified the gluglug's lenovo x60: gluglug removed the last microcodes(that were not used by the x60), sent that source code to the FSF, which certified it. So instead of debating trough huge flames aobut the fact that we should use, or not use the microcode, it was more effective to remove it. The benefit is the publicity arround that laptop that can be made 100% free software, which makes users aware of it and willing to switch to it.
For coreboot developers
This section is mainly usefull for finding informations for:
- Asking me to test some code (that's why I listed all my hardware).
- Find my work in progress code.
- Find legacy code.
- Find what I'm interested in working on:
- If you want to work on the same thing than me, you could contact me if you want so:
- I could help if I have time.
- I could test if I have time.
- I may have some pointers.
- If you want to work on the same thing than me, you could contact me if you want so:
- HOWTO that documents how to do a native VGA init for the Lenovo x60:
- It probably applies to the Lenovo t60 that have an Intel GPU, with no or very minor modifications.
Hardware
Mainboard/Devices running coreboot
Device/Mainboard | Serial/output | flash recovery mecanism | My area of interest |
---|---|---|---|
M4A785T-M |
|
|
|
Lenovo X60 |
|
External programmer with pomona clip |
|
Lenovo X60T |
|
External programmer with pomona clip |
|
Lenovo T60 |
|
External programmer with pomona clip(untried but should work) |
|
Alix 1.C |
|
Hot swap with the LPC dongle |
|
E350M1 |
|
|
|
Mainboard/Devices not running coreboot (yet?)
- HP nc6320
- Asus N71JQ
Note that they will probably never run coreboot, as I don't think they're worth the time.
Debugging tools
- External programmers :
- Arduino duemillanove (serprog based)
- Arduino uno (serprog based)
- openmoko debug board (FTDI based)
- bug20 (linux_spi)
- A pomona clip
- a null-modem serial cable and 2 USB<->Serial adapters
- USB debug compatible devices:
- a bug20 (omap3530)
- a GTA04 A3 (DM370)
Interesting git trees
- http://www.gitorious.org/gnutoo-for-coreboot/coreboot/ : I push there the code that is not yet ready for review.
- production+v5 is a branch for the Lenovo x60 containing:
- The native GPU init for it
- The new fallback mecanism
- The removal of the microcode for the Lenovo x60
- production+v5 is a branch for the Lenovo x60 containing:
Way less interesting trees
- http://git.stuge.se/?p=gnutoo-chromiumos-coreboot.git;a=summary : it's an historic tree, containing code that is based on the replay of the option rom, before the native GPU init worked(so it doesn't work).
- http://git.stuge.se/?p=gnutoo-i915tool-x60.git;a=summary : contains an historic version of the i915tool
My TODO list
See also TODO of the respectives machines on their dedicated wiki page.
All machines
Add a working and easily usable normal/fallback selection.pushed for review- Port a logging mecanism from chromebooks to all devices in order to be able to retrive the log of the failed boot at the next reboot.
T60
Find out why the machine hang when the power supply is removed(only does it when the linux kernel is started)Fixed by ./nvramtool -w first_battery=Primary- Add cmos.default
(require disassembling the laptop for testing) - Add native graphics init(require waiting that Peter stuge push his part for review)
X60
- native GPU init and new fallback are pushed for review: Address the concerns.
- I pushed the new and complete native GPU init on gitorious, Peter Stuge will work on merging it while I finish addressing the fallback comments.
- fix the CPU microcode issue.
- update http://www.coreboot.org/Thinkpad_X60s
- Create a Native graphics<->VGA option rom.
- Make backlight work without the non-free option rom.
Later
- Improve the patch for SerialIce in order to get it merged.
- SD detection fix for my X60 version.
- Hotkey patch to clean and merge.
Alix 1.C
- Add cbmem -c support
- port the VSA to fasm?
Asus N71JQ
Probably not worth it...
- Find the USB debug port
- Find how to extract the BIOS pieces from the BIOS region
Native X60 GPU init stuff
scripts to help getting rid of the vbios of the x60
Script 1: generate the io access for the coreboot driver
- follow "Case study: new laptop (not complete, sorry)" in https://docs.google.com/document/d/1g8FMob25VZYxbWri2iFB8YiSL8gwF9vKJH3HGxr0xQU/edit?pli=1
- pacman -S plan9port
- cp /opt/plan9/bin/ssam ./
- replace the following line in ./ssam:
#!/usr/local/plan9/bin/rc
by the following line:
#!/opt/plan9/bin/rc
- create the ssamfix file with:
,s/\[ *[0-9]+\..[0-9]+\]//g ,s/^ *//g y/^[RWU]/s/^/M /g ,s/\nU/ ;;;UDELAY/g ,|uniq -c ,s/^ *//g ,s/(^[0-9]+) ([MRW])/\2 \1/g ,s/"/\\"/g ,s/^M ([0-9]+) *(\[.*)/{M, \1, "\2"},/g ,s/^M ([0-9]+) *(.*)/{M, \1, "\2"},/g ,s/: */:/g ,s/...UDELAY *([0-9]+)/\1/g ,s/^([RW]) ([0-9]+) (.*):0x([0-9a-f]+)(.*)/{\1, \2, "", \3, 0x\4, \5},/g
- run the following commands:
. /etc/profile.d/plan9.sh cat dmesg| ./ssam -f ssamfix > foo.c
Script2: compare the io access that were too fast
- Replace {V,0,}, with {V,7,}, in src/mainboard/vendor/device/i915io.c
- cat /dev/ttyUSB0 > accesses.txt
- Use that script against accesses.txt to find the guilty accesses:
#!/usr/bin/env python2 import sys,re def main(args): try: f = open(args[1],'ro') except: print args[0], " <file>" for line in f: if re.match("0x[0-9]*: Got .*, expect .*",line): line = line.replace('\r\n',).replace(", expect ",':').replace(": Got ",':') split = line.split(':') #print split if split[1] != split[2]: print line if __name__ == '__main__': main(sys.argv)
How to get semantic IOs
In i915tool:
- import your IOs in prettyregs.c
- compile prettyregs.c
- run prettyregs
How to get rid of the vbios of the x60 [New Version]
WARNING: DO NOT ATTEMPT TO DO THAT WITHOUT A FLASH RECOVERY MECANISM
Apply the coreboot patches, and adapt them for your mainboard
Then configure coreboot with:
[*] Output verbose x86emu debug messages [ ] Trace JMP/RETF [ ] Trace all opcodes [ ] Log Plug&Play accesses [ ] Log Disk I/O [ ] Log PMM [ ] Debug VESA BIOS Extensions [ ] Redirect INT10 output to console [ ] Log intXX calls [ ] Log special memory accesses [ ] Log all memory accesses [*] Log IO accesses
Build and flash coreboot.
git clone my fork of the i915tool until the code is merged in the official i915tool.
Get the tarball that contains the generated code, extract it.
Also get the i915_regs.h.gz file, decompress it and put it in final/
Then go into i915tool and apply some patches for the x60 or redo them for your mainboard.
Run make:
$ cd i915tool $ make
Then go into the x60 directory(or the directory of your device):
$ cd x60
use picocom -b 115200 /dev/ttyUSB0 or stty to set the bauds of the Serial port. Then get logs:
$ cat /dev/ttyUSB0 | tee coreboot.log
Then remove the binary symbols, dos2unix will help identifying where they are:
$ dos2unix coreboot.log dos2unix: Binary symbol found at line 136332 dos2unix: Skipping binary file coreboot.log
Then do:
$ dos2unix coreboot.log
Then remove the lines before and after the log, the log looks like that:
[0047229e]c000:51cb outl(0x80001014, 0x0cf8) [0047325f]c000:51d4 inw(0x0cfc) = 0x50a1
Then run make and fix the errors:
$ make
Then copy to coreboot as it says. Then if necessary try to compact the source code a bit, here for me I have a really long list of:
io_i915_write32(0xcffbe001,0x8001); io_i915_write32(0xcffbe001,0x8005); io_i915_write32(0xcffbe001,0x8009); io_i915_write32(0xcffbe001,0x800d); io_i915_write32(0xcffbe001,0x8011);
That can be replaced with:
int i = 0; for (i=0x8001;i<0x3fffa;i+=4){ io_i915_write32(0xcffbe001,i); }
Import the final code into the chromium fork of coreboot with my patches on top.
Personal notes
Patches notes
fallback improvements
All the patches necessary to make it work got merged but one:
The remaining patch add the following to the x60's Kconfig (src/mainboard/lenovo/x60/Kconfig):
config MAX_REBOOT_CNT int default 1