Changeset 832cbe7 in mainline for uspace/drv/block/isa-ide/main.c


Ignore:
Timestamp:
2025-02-05T12:30:20Z (9 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
accdf882
Parents:
0dab4850
git-author:
Jiri Svoboda <jiri@…> (2025-02-04 21:30:06)
git-committer:
Jiri Svoboda <jiri@…> (2025-02-05 12:30:20)
Message:

Add proper IDE PCI to ISA fallback mechanism.

To determine if legacy IDE I/O ports are free, isa-ide asks isa,
who asks pciintel. pciintel waits for bus enumeration to complete,
then waits for all functions except the one who is asking
(which is ISA bus) to stabilize. During attach pci-ide will claim
the legacy IDE ports. Thus, if at this point legacy IDE ports
are unclaimed, pciintel tells ISA they are free, which tells isa-ide,
which continues to attach. If they are not free, isa-ide will not
attach.

This works for all use cases, including system without PCI bus,
system with PCI bus, but no (or disabled) PCI IDE, system with PCI
IDE with unrecognized VID/PID (which we will handle in legacy ISA mode).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/block/isa-ide/main.c

    r0dab4850 r832cbe7  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4343
    4444#include "isa-ide.h"
     45#include "isa-ide_hw.h"
    4546#include "main.h"
    4647
     
    7071        async_sess_t *parent_sess;
    7172        hw_res_list_parsed_t hw_res;
    72         hw_res_flags_t flags;
     73        hw_res_claims_t claims;
    7374        errno_t rc;
    7475
     
    7778                return ENOMEM;
    7879
    79         rc = hw_res_get_flags(parent_sess, &flags);
    80         if (rc != EOK)
    81                 return rc;
    82 
    83         /*
    84          * Prevent attaching to the legacy ISA IDE register block
    85          * on a system with PCI not to conflict with PCI IDE.
    86          *
    87          * XXX This is a simplification. If we had a PCI-based system without
    88          * PCI-IDE or with PCI-IDE disabled and would still like to use
    89          * an ISA IDE controller, this would prevent us from doing so.
    90          */
    91         if (flags & hwf_isa_bridge) {
    92                 ddf_msg(LVL_NOTE, "Will not attach to PCI/ISA bridge.");
    93                 return EIO;
     80        rc = hw_res_query_legacy_io(parent_sess, &claims);
     81        if (rc != EOK) {
     82                ddf_msg(LVL_NOTE, "Error getting HW resource flags.");
     83                return rc;
    9484        }
    9585
    9686        hw_res_list_parsed_init(&hw_res);
    9787        rc = hw_res_get_list_parsed(parent_sess, &hw_res, 0);
    98         if (rc != EOK)
    99                 return rc;
     88        if (rc != EOK) {
     89                ddf_msg(LVL_NOTE, "Error getting HW resource list.");
     90                return rc;
     91        }
    10092
    10193        if (hw_res.io_ranges.count != 4) {
     
    148140        }
    149141
     142        /*
     143         * Only attach to legacy ISA IDE register block if it
     144         * is not claimed by PCI IDE driver.
     145         */
     146        if (res->cmd1 == leg_ide_ata_cmd_p &&
     147            res->cmd2 == leg_ide_ata_cmd_s &&
     148            (claims & hwc_isa_ide) != 0) {
     149                ddf_msg(LVL_NOTE, "Will not attach to ISA legacy ports "
     150                    "since they are already handled by PCI.");
     151                return EBUSY;
     152        }
     153
    150154        return EOK;
    151155error:
     
    167171        rc = isa_ide_get_res(dev, &res);
    168172        if (rc != EOK) {
    169                 ddf_msg(LVL_ERROR, "Invalid HW resource configuration.");
     173                if (rc == EINVAL)
     174                        ddf_msg(LVL_ERROR, "Invalid HW resource configuration.");
    170175                return EINVAL;
    171176        }
Note: See TracChangeset for help on using the changeset viewer.