I've tried to add this several times to via the bug report tool on the website, but get stuck in a loop on the captcha page.
Can I post this here to get it looked at?
Filo does not boot from the CF or PCMCIA controllers. I did find a work around, some 70 prom flashes later..
I've limited the scope of my work to ide.c, for the legacy boot, not the grub-compatible.
This is one will need the help of a real developer to fix properly.
Here is what I've found:
Problem 1:
There are 2 types of detections for IDE interfaces:
if ((sata && class == 0x180) || (pata && class == 0x101)) {
and
if (hdr == HEADER_TYPE_BRIDGE || hdr == HEADER_TYPE_CARDBUS) {
The 2nd does not work... The first excludes the CF/PC-CARD because it doesn't include the correct class. I have no idea how to fix the CARDBUS check. It's got stuff that reaches into the libpayload code..
So I've made this modification:
if ((sata && class == 0x180) || (pata && class == 0x101) || (pata && class == 0x607)) {
This explicitly directs the driver to treat the CF as an IDE device.
That part works, and it does to a proper detection once it's in the "if" statement. The problem is, as far as I can tell detects this card before all others, and stops. I can see no other IDE channels once I set this.
Problem 2:
We enter this in "native PCI mode", which is ok.
if ((prog_if & mask) || (devclass != 0x0101)) {
debug("native PCI mode\n");
if ((ctrl_index & 1) == 0) {
/* Primary channel */
ctrl->cmd_base = pci_read_resource(dev, 0);
ctrl->ctrl_base = pci_read_resource(dev, 1);
} else {
/* Secondary channel */
ctrl->cmd_base = pci_read_resource(dev, 2);
ctrl->ctrl_base = pci_read_resource(dev, 3);
}
ctrl->cmd_base &= ~3;
ctrl->ctrl_base &= ~3;
What is not ok, is that we are now using pci_read_resource to set the ctrl->* stuff when we _explicitly_ listed those elsewhere.. Obviously that doesn't work... I have no idea why we do the "&= ~3" either, so I'm not inclined to mess with it.
What does work, is adding these two lines after those:
ctrl->cmd_base = 0x1e0;
ctrl->ctrl_base = 0x1ec;
Obviously we just overwrite all the crap we just set with the pci_read call and the additional lines.
Once these are done, the machine can boot of the CF slot, but ONLY the CF slot.
A real fix would probably be cool.