Annotation of embedaddon/pciutils/lib/access.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     The PCI Library -- User Access
        !             3:  *
        !             4:  *     Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
        !             5:  *
        !             6:  *     Can be freely distributed and used under the terms of the GNU GPL.
        !             7:  */
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <stdlib.h>
        !            11: #include <stdarg.h>
        !            12: #include <string.h>
        !            13: 
        !            14: #include "internal.h"
        !            15: 
        !            16: void
        !            17: pci_scan_bus(struct pci_access *a)
        !            18: {
        !            19:   a->methods->scan(a);
        !            20: }
        !            21: 
        !            22: struct pci_dev *
        !            23: pci_alloc_dev(struct pci_access *a)
        !            24: {
        !            25:   struct pci_dev *d = pci_malloc(a, sizeof(struct pci_dev));
        !            26: 
        !            27:   memset(d, 0, sizeof(*d));
        !            28:   d->access = a;
        !            29:   d->methods = a->methods;
        !            30:   d->hdrtype = -1;
        !            31:   if (d->methods->init_dev)
        !            32:     d->methods->init_dev(d);
        !            33:   return d;
        !            34: }
        !            35: 
        !            36: int
        !            37: pci_link_dev(struct pci_access *a, struct pci_dev *d)
        !            38: {
        !            39:   d->next = a->devices;
        !            40:   a->devices = d;
        !            41: 
        !            42:   return 1;
        !            43: }
        !            44: 
        !            45: struct pci_dev *
        !            46: pci_get_dev(struct pci_access *a, int domain, int bus, int dev, int func)
        !            47: {
        !            48:   struct pci_dev *d = pci_alloc_dev(a);
        !            49: 
        !            50:   d->domain = domain;
        !            51:   d->bus = bus;
        !            52:   d->dev = dev;
        !            53:   d->func = func;
        !            54:   return d;
        !            55: }
        !            56: 
        !            57: void pci_free_dev(struct pci_dev *d)
        !            58: {
        !            59:   if (d->methods->cleanup_dev)
        !            60:     d->methods->cleanup_dev(d);
        !            61:   pci_free_caps(d);
        !            62:   pci_mfree(d->phy_slot);
        !            63:   pci_mfree(d);
        !            64: }
        !            65: 
        !            66: static inline void
        !            67: pci_read_data(struct pci_dev *d, void *buf, int pos, int len)
        !            68: {
        !            69:   if (pos & (len-1))
        !            70:     d->access->error("Unaligned read: pos=%02x, len=%d", pos, len);
        !            71:   if (pos + len <= d->cache_len)
        !            72:     memcpy(buf, d->cache + pos, len);
        !            73:   else if (!d->methods->read(d, pos, buf, len))
        !            74:     memset(buf, 0xff, len);
        !            75: }
        !            76: 
        !            77: byte
        !            78: pci_read_byte(struct pci_dev *d, int pos)
        !            79: {
        !            80:   byte buf;
        !            81:   pci_read_data(d, &buf, pos, 1);
        !            82:   return buf;
        !            83: }
        !            84: 
        !            85: word
        !            86: pci_read_word(struct pci_dev *d, int pos)
        !            87: {
        !            88:   word buf;
        !            89:   pci_read_data(d, &buf, pos, 2);
        !            90:   return le16_to_cpu(buf);
        !            91: }
        !            92: 
        !            93: u32
        !            94: pci_read_long(struct pci_dev *d, int pos)
        !            95: {
        !            96:   u32 buf;
        !            97:   pci_read_data(d, &buf, pos, 4);
        !            98:   return le32_to_cpu(buf);
        !            99: }
        !           100: 
        !           101: int
        !           102: pci_read_block(struct pci_dev *d, int pos, byte *buf, int len)
        !           103: {
        !           104:   return d->methods->read(d, pos, buf, len);
        !           105: }
        !           106: 
        !           107: int
        !           108: pci_read_vpd(struct pci_dev *d, int pos, byte *buf, int len)
        !           109: {
        !           110:   return d->methods->read_vpd ? d->methods->read_vpd(d, pos, buf, len) : 0;
        !           111: }
        !           112: 
        !           113: static inline int
        !           114: pci_write_data(struct pci_dev *d, void *buf, int pos, int len)
        !           115: {
        !           116:   if (pos & (len-1))
        !           117:     d->access->error("Unaligned write: pos=%02x,len=%d", pos, len);
        !           118:   if (pos + len <= d->cache_len)
        !           119:     memcpy(d->cache + pos, buf, len);
        !           120:   return d->methods->write(d, pos, buf, len);
        !           121: }
        !           122: 
        !           123: int
        !           124: pci_write_byte(struct pci_dev *d, int pos, byte data)
        !           125: {
        !           126:   return pci_write_data(d, &data, pos, 1);
        !           127: }
        !           128: 
        !           129: int
        !           130: pci_write_word(struct pci_dev *d, int pos, word data)
        !           131: {
        !           132:   word buf = cpu_to_le16(data);
        !           133:   return pci_write_data(d, &buf, pos, 2);
        !           134: }
        !           135: 
        !           136: int
        !           137: pci_write_long(struct pci_dev *d, int pos, u32 data)
        !           138: {
        !           139:   u32 buf = cpu_to_le32(data);
        !           140:   return pci_write_data(d, &buf, pos, 4);
        !           141: }
        !           142: 
        !           143: int
        !           144: pci_write_block(struct pci_dev *d, int pos, byte *buf, int len)
        !           145: {
        !           146:   if (pos < d->cache_len)
        !           147:     {
        !           148:       int l = (pos + len >= d->cache_len) ? (d->cache_len - pos) : len;
        !           149:       memcpy(d->cache + pos, buf, l);
        !           150:     }
        !           151:   return d->methods->write(d, pos, buf, len);
        !           152: }
        !           153: 
        !           154: int
        !           155: pci_fill_info_v31(struct pci_dev *d, int flags)
        !           156: {
        !           157:   if (flags & PCI_FILL_RESCAN)
        !           158:     {
        !           159:       flags &= ~PCI_FILL_RESCAN;
        !           160:       d->known_fields = 0;
        !           161:       pci_free_caps(d);
        !           162:     }
        !           163:   if (flags & ~d->known_fields)
        !           164:     d->known_fields |= d->methods->fill_info(d, flags & ~d->known_fields);
        !           165:   return d->known_fields;
        !           166: }
        !           167: 
        !           168: /* In version 3.1, pci_fill_info got new flags => versioned alias */
        !           169: STATIC_ALIAS(int pci_fill_info(struct pci_dev *d, int flags), pci_fill_info_v31(d,flags));
        !           170: DEFINE_ALIAS(int pci_fill_info_v30(struct pci_dev *d, int flags), pci_fill_info_v31);
        !           171: SYMBOL_VERSION(pci_fill_info_v30, pci_fill_info@LIBPCI_3.0);
        !           172: SYMBOL_VERSION(pci_fill_info_v31, pci_fill_info@@LIBPCI_3.1);
        !           173: 
        !           174: void
        !           175: pci_setup_cache(struct pci_dev *d, byte *cache, int len)
        !           176: {
        !           177:   d->cache = cache;
        !           178:   d->cache_len = len;
        !           179: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>