Annotation of qemu/hw/slotid_cap.c, revision 1.1

1.1     ! root        1: #include "slotid_cap.h"
        !             2: #include "pci.h"
        !             3: 
        !             4: #define SLOTID_CAP_LENGTH 4
        !             5: #define SLOTID_NSLOTS_SHIFT (ffs(PCI_SID_ESR_NSLOTS) - 1)
        !             6: 
        !             7: int slotid_cap_init(PCIDevice *d, int nslots,
        !             8:                     uint8_t chassis,
        !             9:                     unsigned offset)
        !            10: {
        !            11:     int cap;
        !            12:     if (!chassis) {
        !            13:         error_report("Bridge chassis not specified. Each bridge is required "
        !            14:                      "to be assigned a unique chassis id > 0.");
        !            15:         return -EINVAL;
        !            16:     }
        !            17:     if (nslots < 0 || nslots > (PCI_SID_ESR_NSLOTS >> SLOTID_NSLOTS_SHIFT)) {
        !            18:         /* TODO: error report? */
        !            19:         return -EINVAL;
        !            20:     }
        !            21: 
        !            22:     cap = pci_add_capability(d, PCI_CAP_ID_SLOTID, offset, SLOTID_CAP_LENGTH);
        !            23:     if (cap < 0) {
        !            24:         return cap;
        !            25:     }
        !            26:     /* We make each chassis unique, this way each bridge is First in Chassis */
        !            27:     d->config[cap + PCI_SID_ESR] = PCI_SID_ESR_FIC |
        !            28:         (nslots << SLOTID_NSLOTS_SHIFT);
        !            29:     d->cmask[cap + PCI_SID_ESR] = 0xff;
        !            30:     d->config[cap + PCI_SID_CHASSIS_NR] = chassis;
        !            31:     /* Note: Chassis number register is non-volatile,
        !            32:        so we don't reset it. */
        !            33:     /* TODO: store in eeprom? */
        !            34:     d->wmask[cap + PCI_SID_CHASSIS_NR] = 0xff;
        !            35: 
        !            36:     d->cap_present |= QEMU_PCI_CAP_SLOTID;
        !            37:     return 0;
        !            38: }
        !            39: 
        !            40: void slotid_cap_cleanup(PCIDevice *d)
        !            41: {
        !            42:     /* TODO: cleanup config space? */
        !            43:     d->cap_present &= ~QEMU_PCI_CAP_SLOTID;
        !            44: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.