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