Annotation of qemu/roms/seabios/src/pci_region.c, revision 1.1

1.1     ! root        1: // helper functions to manage pci io/memory/prefetch memory region
        !             2: //
        !             3: // Copyright (C) 2009 Isaku Yamahata <yamahata at valinux co jp>
        !             4: //
        !             5: // This file may be distributed under the terms of the GNU LGPLv3 license.
        !             6: //
        !             7: //
        !             8: 
        !             9: #include "util.h"
        !            10: 
        !            11: #define PCI_REGION_DISABLED     (-1)
        !            12: 
        !            13: void pci_region_init(struct pci_region *r, u32 first, u32 last)
        !            14: {
        !            15:     r->first = first;
        !            16:     r->last = last;
        !            17: 
        !            18:     r->cur_first = r->first;
        !            19: }
        !            20: 
        !            21: // PCI_REGION_DISABLED represents that the region is in special state.
        !            22: // its value is chosen such that cur_first can't be PCI_REGION_DISABLED
        !            23: // normally.
        !            24: // NOTE: the area right below 4G is used for LAPIC, so such area can't
        !            25: //       be used for PCI memory.
        !            26: u32 pci_region_disable(struct pci_region *r)
        !            27: {
        !            28:     return r->cur_first = PCI_REGION_DISABLED;
        !            29: }
        !            30: 
        !            31: static int pci_region_disabled(const struct pci_region *r)
        !            32: {
        !            33:     return r->cur_first == PCI_REGION_DISABLED;
        !            34: }
        !            35: 
        !            36: static u32 pci_region_alloc_align(struct pci_region *r, u32 size, u32 align)
        !            37: {
        !            38:     if (pci_region_disabled(r)) {
        !            39:         return 0;
        !            40:     }
        !            41: 
        !            42:     u32 s = ALIGN(r->cur_first, align);
        !            43:     if (s > r->last || s < r->cur_first) {
        !            44:         return 0;
        !            45:     }
        !            46:     u32 e = s + size;
        !            47:     if (e < s || e - 1 > r->last) {
        !            48:         return 0;
        !            49:     }
        !            50:     r->cur_first = e;
        !            51:     return s;
        !            52: }
        !            53: 
        !            54: u32 pci_region_alloc(struct pci_region *r, u32 size)
        !            55: {
        !            56:     return pci_region_alloc_align(r, size, size);
        !            57: }
        !            58: 
        !            59: u32 pci_region_align(struct pci_region *r, u32 align)
        !            60: {
        !            61:     return pci_region_alloc_align(r, 0, align);
        !            62: }
        !            63: 
        !            64: void pci_region_revert(struct pci_region *r, u32 addr)
        !            65: {
        !            66:     r->cur_first = addr;
        !            67: }
        !            68: 
        !            69: u32 pci_region_addr(const struct pci_region *r)
        !            70: {
        !            71:     return r->cur_first;
        !            72: }
        !            73: 
        !            74: u32 pci_region_size(const struct pci_region *r)
        !            75: {
        !            76:     return r->last - r->first + 1;
        !            77: }

unix.superglobalmegacorp.com

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