common_interface.c revision 814b5855
1/*
2 * (C) Copyright IBM Corporation 2006
3 * All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * on the rights to use, copy, modify, merge, publish, distribute, sub
9 * license, and/or sell copies of the Software, and to permit persons to whom
10 * the Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19 * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25/**
26 * \file common_interface.c
27 * Platform independent interface glue.
28 *
29 * \author Ian Romanick <idr@us.ibm.com>
30 */
31#ifdef HAVE_CONFIG_H
32#include "config.h"
33#endif
34
35#include <stdlib.h>
36#include <string.h>
37#include <errno.h>
38
39#include "pciaccess.h"
40#include "pciaccess_private.h"
41
42#if defined(__linux__) || defined(__GLIBC__) || defined(__CYGWIN__)
43#include <byteswap.h>
44
45#if __BYTE_ORDER == __BIG_ENDIAN
46# define LETOH_16(x)   bswap_16(x)
47# define HTOLE_16(x)   bswap_16(x)
48# define LETOH_32(x)   bswap_32(x)
49# define HTOLE_32(x)   bswap_32(x)
50#else
51# define LETOH_16(x)   (x)
52# define HTOLE_16(x)   (x)
53# define LETOH_32(x)   (x)
54# define HTOLE_32(x)   (x)
55#endif /* linux */
56
57#elif defined(__sun)
58
59#include <sys/byteorder.h>
60
61#ifdef _BIG_ENDIAN
62# define LETOH_16(x)   BSWAP_16(x)
63# define HTOLE_16(x)   BSWAP_16(x)
64# define LETOH_32(x)   BSWAP_32(x)
65# define HTOLE_32(x)   BSWAP_32(x)
66#else
67# define LETOH_16(x)   (x)
68# define HTOLE_16(x)   (x)
69# define LETOH_32(x)   (x)
70# define HTOLE_32(x)   (x)
71#endif /* Solaris */
72
73#else
74
75#include <sys/endian.h>
76
77#define HTOLE_16(x)	htole16(x)
78#define HTOLE_32(x)	htole32(x)
79
80#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
81#define LETOH_16(x)	le16toh(x)
82#define LETOH_32(x)	le32toh(x)
83#else
84#define LETOH_16(x)	letoh16(x)
85#define LETOH_32(x)	letoh32(x)
86#endif
87
88#endif /* others */
89
90/**
91 * Read a device's expansion ROM.
92 *
93 * Reads the device's expansion ROM and stores the data in the memory pointed
94 * to by \c buffer.  The buffer must be at least \c pci_device::rom_size
95 * bytes.
96 *
97 * \param dev    Device whose expansion ROM is to be read.
98 * \param buffer Memory in which to store the ROM.
99 *
100 * \return
101 * Zero on success or an \c errno value on failure.
102 */
103int
104pci_device_read_rom( struct pci_device * dev, void * buffer )
105{
106    if ( (dev == NULL) || (buffer == NULL) ) {
107	return EFAULT;
108    }
109
110
111    return (pci_sys->methods->read_rom)( dev, buffer );
112}
113
114/**
115 * Probe a PCI (VGA) device to determine if its the boot VGA device
116 *
117 * \param dev    Device whose VGA status to query
118 * \return
119 * Zero if not the boot VGA, 1 if the boot VGA.
120 */
121int
122pci_device_is_boot_vga( struct pci_device * dev )
123{
124	if (!pci_sys->methods->boot_vga)
125		return 0;
126	return pci_sys->methods->boot_vga( dev );
127}
128
129/**
130 * Probe a PCI device to determine if a kernel driver is attached.
131 *
132 * \param dev Device to query
133 * \return
134 * Zero if no driver attached, 1 if attached kernel drviver
135 */
136int
137pci_device_has_kernel_driver( struct pci_device * dev )
138{
139	if (!pci_sys->methods->has_kernel_driver)
140		return 0;
141	return pci_sys->methods->has_kernel_driver( dev );
142}
143
144/**
145 * Probe a PCI device to learn information about the device.
146 *
147 * Probes a PCI device to learn various information about the device.  Before
148 * calling this function, the only public fields in the \c pci_device
149 * structure that have valid values are \c pci_device::domain,
150 * \c pci_device::bus, \c pci_device::dev, and \c pci_device::func.
151 *
152 * \param dev  Device to be probed.
153 *
154 * \return
155 * Zero on success or an \c errno value on failure.
156 */
157int
158pci_device_probe( struct pci_device * dev )
159{
160    if ( dev == NULL ) {
161	return EFAULT;
162    }
163
164
165    return (pci_sys->methods->probe)( dev );
166}
167
168
169/**
170 * Map the specified BAR so that it can be accessed by the CPU.
171 *
172 * Maps the specified BAR for access by the processor.  The pointer to the
173 * mapped region is stored in the \c pci_mem_region::memory pointer for the
174 * BAR.
175 *
176 * \param dev          Device whose memory region is to be mapped.
177 * \param region       Region, on the range [0, 5], that is to be mapped.
178 * \param write_enable Map for writing (non-zero).
179 *
180 * \return
181 * Zero on success or an \c errno value on failure.
182 *
183 * \sa pci_device_map_range, pci_device_unmap_range
184 * \deprecated
185 */
186int
187pci_device_map_region(struct pci_device * dev, unsigned region,
188                      int write_enable)
189{
190    const unsigned map_flags =
191        (write_enable) ? PCI_DEV_MAP_FLAG_WRITABLE : 0;
192
193    if ((region > 5) || (dev->regions[region].size == 0))  {
194        return ENOENT;
195    }
196
197    if (dev->regions[region].memory != NULL) {
198        return 0;
199    }
200
201    return pci_device_map_range(dev, dev->regions[region].base_addr,
202                                dev->regions[region].size, map_flags,
203                                &dev->regions[region].memory);
204}
205
206
207/**
208 * Map the specified memory range so that it can be accessed by the CPU.
209 *
210 * Maps the specified memory range for access by the processor.  The pointer
211 * to the mapped region is stored in \c addr.  In addition, the
212 * \c pci_mem_region::memory pointer for the BAR will be updated.
213 *
214 * \param dev          Device whose memory region is to be mapped.
215 * \param base         Base address of the range to be mapped.
216 * \param size         Size of the range to be mapped.
217 * \param write_enable Map for writing (non-zero).
218 * \param addr         Location to store the mapped address.
219 *
220 * \return
221 * Zero on success or an \c errno value on failure.
222 *
223 * \sa pci_device_map_range
224 */
225int pci_device_map_memory_range(struct pci_device *dev,
226				pciaddr_t base, pciaddr_t size,
227				int write_enable, void **addr)
228{
229    return pci_device_map_range(dev, base, size,
230				(write_enable) ? PCI_DEV_MAP_FLAG_WRITABLE : 0,
231				addr);
232}
233
234
235/**
236 * Map the specified memory range so that it can be accessed by the CPU.
237 *
238 * Maps the specified memory range for access by the processor.  The pointer
239 * to the mapped region is stored in \c addr.  In addition, the
240 * \c pci_mem_region::memory pointer for the BAR will be updated.
241 *
242 * \param dev          Device whose memory region is to be mapped.
243 * \param base         Base address of the range to be mapped.
244 * \param size         Size of the range to be mapped.
245 * \param map_flags    Flag bits controlling how the mapping is accessed.
246 * \param addr         Location to store the mapped address.
247 *
248 * \return
249 * Zero on success or an \c errno value on failure.
250 *
251 * \sa pci_device_unmap_range
252 */
253int
254pci_device_map_range(struct pci_device *dev, pciaddr_t base,
255                     pciaddr_t size, unsigned map_flags,
256                     void **addr)
257{
258    struct pci_device_private *const devp =
259        (struct pci_device_private *) dev;
260    struct pci_device_mapping *mappings;
261    unsigned region;
262    unsigned i;
263    int err = 0;
264
265
266    *addr = NULL;
267
268    if (dev == NULL) {
269        return EFAULT;
270    }
271
272
273    for (region = 0; region < 6; region++) {
274        const struct pci_mem_region * const r = &dev->regions[region];
275
276        if (r->size != 0) {
277            if ((r->base_addr <= base) && ((r->base_addr + r->size) > base)) {
278                if ((base + size) > (r->base_addr + r->size)) {
279                    return E2BIG;
280                }
281
282                break;
283            }
284        }
285    }
286
287    if (region > 5) {
288        return ENOENT;
289    }
290
291    /* Make sure that there isn't already a mapping with the same base and
292     * size.
293     */
294    for (i = 0; i < devp->num_mappings; i++) {
295        if ((devp->mappings[i].base == base)
296            && (devp->mappings[i].size == size)) {
297            return EINVAL;
298        }
299    }
300
301
302    mappings = realloc(devp->mappings,
303                       (sizeof(devp->mappings[0]) * (devp->num_mappings + 1)));
304    if (mappings == NULL) {
305        return ENOMEM;
306    }
307
308    mappings[devp->num_mappings].base = base;
309    mappings[devp->num_mappings].size = size;
310    mappings[devp->num_mappings].region = region;
311    mappings[devp->num_mappings].flags = map_flags;
312    mappings[devp->num_mappings].memory = NULL;
313
314    if (dev->regions[region].memory == NULL) {
315        err = (*pci_sys->methods->map_range)(dev,
316                                             &mappings[devp->num_mappings]);
317    }
318
319    if (err == 0) {
320        *addr =  mappings[devp->num_mappings].memory;
321        devp->num_mappings++;
322    } else {
323        mappings = realloc(mappings,
324                           (sizeof(mappings[0]) * devp->num_mappings));
325    }
326
327    devp->mappings = mappings;
328
329    return err;
330}
331
332
333/**
334 * Unmap the specified BAR so that it can no longer be accessed by the CPU.
335 *
336 * Unmaps the specified BAR that was previously mapped via
337 * \c pci_device_map_region.
338 *
339 * \param dev          Device whose memory region is to be mapped.
340 * \param region       Region, on the range [0, 5], that is to be mapped.
341 *
342 * \return
343 * Zero on success or an \c errno value on failure.
344 *
345 * \sa pci_device_map_range, pci_device_unmap_range
346 * \deprecated
347 */
348int
349pci_device_unmap_region( struct pci_device * dev, unsigned region )
350{
351    int err;
352
353    if (dev == NULL) {
354        return EFAULT;
355    }
356
357    if ((region > 5) || (dev->regions[region].size == 0)) {
358        return ENOENT;
359    }
360
361    err = pci_device_unmap_range(dev, dev->regions[region].memory,
362                                 dev->regions[region].size);
363    if (!err) {
364        dev->regions[region].memory = NULL;
365    }
366
367    return err;
368}
369
370
371/**
372 * Unmap the specified memory range so that it can no longer be accessed by the CPU.
373 *
374 * Unmaps the specified memory range that was previously mapped via
375 * \c pci_device_map_memory_range.
376 *
377 * \param dev          Device whose memory is to be unmapped.
378 * \param memory       Pointer to the base of the mapped range.
379 * \param size         Size, in bytes, of the range to be unmapped.
380 *
381 * \return
382 * Zero on success or an \c errno value on failure.
383 *
384 * \sa pci_device_map_range, pci_device_unmap_range
385 * \deprecated
386 */
387int
388pci_device_unmap_memory_range(struct pci_device *dev, void *memory,
389                              pciaddr_t size)
390{
391    return pci_device_unmap_range(dev, memory, size);
392}
393
394
395/**
396 * Unmap the specified memory range so that it can no longer be accessed by the CPU.
397 *
398 * Unmaps the specified memory range that was previously mapped via
399 * \c pci_device_map_memory_range.
400 *
401 * \param dev          Device whose memory is to be unmapped.
402 * \param memory       Pointer to the base of the mapped range.
403 * \param size         Size, in bytes, of the range to be unmapped.
404 *
405 * \return
406 * Zero on success or an \c errno value on failure.
407 *
408 * \sa pci_device_map_range
409 */
410int
411pci_device_unmap_range(struct pci_device *dev, void *memory,
412                       pciaddr_t size)
413{
414    struct pci_device_private *const devp =
415        (struct pci_device_private *) dev;
416    unsigned i;
417    int err;
418
419
420    if (dev == NULL) {
421        return EFAULT;
422    }
423
424    for (i = 0; i < devp->num_mappings; i++) {
425        if ((devp->mappings[i].memory == memory)
426            && (devp->mappings[i].size == size)) {
427            break;
428        }
429    }
430
431    if (i == devp->num_mappings) {
432        return ENOENT;
433    }
434
435
436    err = (*pci_sys->methods->unmap_range)(dev, &devp->mappings[i]);
437    if (!err) {
438        const unsigned entries_to_move = (devp->num_mappings - i) - 1;
439
440        if (entries_to_move > 0) {
441            (void) memmove(&devp->mappings[i],
442                           &devp->mappings[i + 1],
443                           entries_to_move * sizeof(devp->mappings[0]));
444        }
445
446        devp->num_mappings--;
447        devp->mappings = realloc(devp->mappings,
448                                 (sizeof(devp->mappings[0]) * devp->num_mappings));
449    }
450
451    return err;
452}
453
454
455/**
456 * Read arbitrary bytes from device's PCI config space
457 *
458 * Reads data from the device's PCI configuration space.  As with the system
459 * read command, less data may be returned, without an error, than was
460 * requested.  This is particularly the case if a non-root user tries to read
461 * beyond the first 64-bytes of configuration space.
462 *
463 * \param dev         Device whose PCI configuration data is to be read.
464 * \param data        Location to store the data
465 * \param offset      Initial byte offset to read
466 * \param size        Total number of bytes to read
467 * \param bytes_read  Location to store the actual number of bytes read.  This
468 *                    pointer may be \c NULL.
469 *
470 * \returns
471 * Zero on success or an errno value on failure.
472 *
473 * \note
474 * Data read from PCI configuration space using this routine is \b not
475 * byte-swapped to the host's byte order.  PCI configuration data is always
476 * stored in little-endian order, and that is what this routine returns.
477 */
478int
479pci_device_cfg_read( struct pci_device * dev, void * data,
480		     pciaddr_t offset, pciaddr_t size,
481		     pciaddr_t * bytes_read )
482{
483    pciaddr_t  scratch;
484
485    if ( (dev == NULL) || (data == NULL) ) {
486	return EFAULT;
487    }
488
489    return pci_sys->methods->read( dev, data, offset, size,
490				   (bytes_read == NULL)
491				   ? & scratch : bytes_read );
492}
493
494
495int
496pci_device_cfg_read_u8( struct pci_device * dev, uint8_t * data,
497			pciaddr_t offset )
498{
499    pciaddr_t bytes;
500    int err = pci_device_cfg_read( dev, data, offset, 1, & bytes );
501
502    if ( (err == 0) && (bytes != 1) ) {
503	err = ENXIO;
504    }
505
506    return err;
507}
508
509
510int
511pci_device_cfg_read_u16( struct pci_device * dev, uint16_t * data,
512			 pciaddr_t offset )
513{
514    pciaddr_t bytes;
515    int err = pci_device_cfg_read( dev, data, offset, 2, & bytes );
516
517    if ( (err == 0) && (bytes != 2) ) {
518	err = ENXIO;
519    }
520
521    *data = LETOH_16( *data );
522    return err;
523}
524
525
526int
527pci_device_cfg_read_u32( struct pci_device * dev, uint32_t * data,
528			 pciaddr_t offset )
529{
530    pciaddr_t bytes;
531    int err = pci_device_cfg_read( dev, data, offset, 4, & bytes );
532
533    if ( (err == 0) && (bytes != 4) ) {
534	err = ENXIO;
535    }
536
537    *data = LETOH_32( *data );
538    return err;
539}
540
541
542/**
543 * Write arbitrary bytes to device's PCI config space
544 *
545 * Writes data to the device's PCI configuration space.  As with the system
546 * write command, less data may be written, without an error, than was
547 * requested.
548 *
549 * \param dev         Device whose PCI configuration data is to be written.
550 * \param data        Location of the source data
551 * \param offset      Initial byte offset to write
552 * \param size        Total number of bytes to write
553 * \param bytes_read  Location to store the actual number of bytes written.
554 *                    This pointer may be \c NULL.
555 *
556 * \returns
557 * Zero on success or an errno value on failure.
558 *
559 * \note
560 * Data written to PCI configuration space using this routine is \b not
561 * byte-swapped from the host's byte order.  PCI configuration data is always
562 * stored in little-endian order, so data written with this routine should be
563 * put in that order in advance.
564 */
565int
566pci_device_cfg_write( struct pci_device * dev, const void * data,
567		      pciaddr_t offset, pciaddr_t size,
568		      pciaddr_t * bytes_written )
569{
570    pciaddr_t  scratch;
571
572    if ( (dev == NULL) || (data == NULL) ) {
573	return EFAULT;
574    }
575
576    return pci_sys->methods->write( dev, data, offset, size,
577				    (bytes_written == NULL)
578				    ? & scratch : bytes_written );
579}
580
581
582int
583pci_device_cfg_write_u8(struct pci_device *dev, uint8_t data,
584			pciaddr_t offset)
585{
586    pciaddr_t bytes;
587    int err = pci_device_cfg_write(dev, & data, offset, 1, & bytes);
588
589    if ( (err == 0) && (bytes != 1) ) {
590	err = ENOSPC;
591    }
592
593
594    return err;
595}
596
597
598int
599pci_device_cfg_write_u16(struct pci_device *dev, uint16_t data,
600			 pciaddr_t offset)
601{
602    pciaddr_t bytes;
603    const uint16_t temp = HTOLE_16(data);
604    int err = pci_device_cfg_write( dev, & temp, offset, 2, & bytes );
605
606    if ( (err == 0) && (bytes != 2) ) {
607	err = ENOSPC;
608    }
609
610
611    return err;
612}
613
614
615int
616pci_device_cfg_write_u32(struct pci_device *dev, uint32_t data,
617			 pciaddr_t offset)
618{
619    pciaddr_t bytes;
620    const uint32_t temp = HTOLE_32(data);
621    int err = pci_device_cfg_write( dev, & temp, offset, 4, & bytes );
622
623    if ( (err == 0) && (bytes != 4) ) {
624	err = ENOSPC;
625    }
626
627
628    return err;
629}
630
631
632int
633pci_device_cfg_write_bits( struct pci_device * dev, uint32_t mask,
634			   uint32_t data, pciaddr_t offset )
635{
636    uint32_t  temp;
637    int err;
638
639    err = pci_device_cfg_read_u32( dev, & temp, offset );
640    if ( ! err ) {
641	temp &= ~mask;
642	temp |= data;
643
644	err = pci_device_cfg_write_u32(dev, temp, offset);
645    }
646
647    return err;
648}
649
650void
651pci_device_enable(struct pci_device *dev)
652{
653    if (dev == NULL) {
654	return;
655    }
656
657    if (pci_sys->methods->enable)
658	pci_sys->methods->enable(dev);
659}
660
661/**
662 * Map the legacy memory space for the PCI domain containing \c dev.
663 *
664 * \param dev          Device whose memory region is to be mapped.
665 * \param base         Base address of the range to be mapped.
666 * \param size         Size of the range to be mapped.
667 * \param map_flags    Flag bits controlling how the mapping is accessed.
668 * \param addr         Location to store the mapped address.
669 *
670 * \returns
671 * Zero on success or an \c errno value on failure.
672 */
673int
674pci_device_map_legacy(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
675		      unsigned map_flags, void **addr)
676{
677    if (base > 0x100000 || base + size > 0x100000)
678	return EINVAL;
679
680    if (!pci_sys->methods->map_legacy)
681	return ENOSYS;
682
683    return pci_sys->methods->map_legacy(dev, base, size, map_flags, addr);
684}
685
686/**
687 * Unmap the legacy memory space for the PCI domain containing \c dev.
688 *
689 * \param dev          Device whose memory region is to be unmapped.
690 * \param addr         Location of the mapped address.
691 * \param size         Size of the range to be unmapped.
692 *
693 * \returns
694 * Zero on success or an \c errno value on failure.
695 */
696int
697pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size)
698{
699    if (!pci_sys->methods->unmap_legacy)
700	return ENOSYS;
701
702    return pci_sys->methods->unmap_legacy(dev, addr, size);
703}
704