|
Lines 1-6
Link Here
|
| 1 |
/* |
1 |
/* |
| 2 |
* (C) Copyright Eric Anholt 2006 |
2 |
* (C) Copyright Eric Anholt 2006 |
| 3 |
* (C) Copyright IBM Corporation 2006 |
3 |
* (C) Copyright IBM Corporation 2006 |
|
|
4 |
* (C) Copyright Mark Kettenis 2011 |
| 5 |
* (C) Copyright Robert Millan 2012 |
| 4 |
* All Rights Reserved. |
6 |
* All Rights Reserved. |
| 5 |
* |
7 |
* |
| 6 |
* Permission is hereby granted, free of charge, to any person obtaining a |
8 |
* Permission is hereby granted, free of charge, to any person obtaining a |
|
Lines 561-566
Link Here
|
| 561 |
freebsd_pci_sys = NULL; |
563 |
freebsd_pci_sys = NULL; |
| 562 |
} |
564 |
} |
| 563 |
|
565 |
|
|
|
566 |
#if defined(__i386__) || defined(__amd64__) |
| 567 |
#include <machine/cpufunc.h> |
| 568 |
#endif |
| 569 |
|
| 570 |
static struct pci_io_handle * |
| 571 |
pci_device_freebsd_open_legacy_io(struct pci_io_handle *ret, |
| 572 |
struct pci_device *dev, pciaddr_t base, pciaddr_t size) |
| 573 |
{ |
| 574 |
#if defined(__i386__) || defined(__amd64__) |
| 575 |
ret->fd = open("/dev/io", O_RDWR | O_CLOEXEC); |
| 576 |
|
| 577 |
if (ret->fd < 0) |
| 578 |
return NULL; |
| 579 |
|
| 580 |
ret->base = base; |
| 581 |
ret->size = size; |
| 582 |
return ret; |
| 583 |
#elif defined(PCI_MAGIC_IO_RANGE) |
| 584 |
ret->memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, |
| 585 |
aperturefd, PCI_MAGIC_IO_RANGE + base); |
| 586 |
if (ret->memory == MAP_FAILED) |
| 587 |
return NULL; |
| 588 |
|
| 589 |
ret->base = base; |
| 590 |
ret->size = size; |
| 591 |
return ret; |
| 592 |
#else |
| 593 |
return NULL; |
| 594 |
#endif |
| 595 |
} |
| 596 |
|
| 597 |
#if defined(__i386__) || defined(__amd64__) |
| 598 |
static void |
| 599 |
pci_device_freebsd_close_io(struct pci_device *dev, struct pci_io_handle *handle) |
| 600 |
{ |
| 601 |
if (handle->fd > -1) |
| 602 |
close(handle->fd); |
| 603 |
} |
| 604 |
#endif |
| 605 |
|
| 606 |
static uint32_t |
| 607 |
pci_device_freebsd_read32(struct pci_io_handle *handle, uint32_t reg) |
| 608 |
{ |
| 609 |
#if defined(__i386__) || defined(__amd64__) |
| 610 |
return inl(handle->base + reg); |
| 611 |
#else |
| 612 |
return *(uint32_t *)((uintptr_t)handle->memory + reg); |
| 613 |
#endif |
| 614 |
} |
| 615 |
|
| 616 |
static uint16_t |
| 617 |
pci_device_freebsd_read16(struct pci_io_handle *handle, uint32_t reg) |
| 618 |
{ |
| 619 |
#if defined(__i386__) || defined(__amd64__) |
| 620 |
return inw(handle->base + reg); |
| 621 |
#else |
| 622 |
return *(uint16_t *)((uintptr_t)handle->memory + reg); |
| 623 |
#endif |
| 624 |
} |
| 625 |
|
| 626 |
static uint8_t |
| 627 |
pci_device_freebsd_read8(struct pci_io_handle *handle, uint32_t reg) |
| 628 |
{ |
| 629 |
#if defined(__i386__) || defined(__amd64__) |
| 630 |
return inb(handle->base + reg); |
| 631 |
#else |
| 632 |
return *(uint8_t *)((uintptr_t)handle->memory + reg); |
| 633 |
#endif |
| 634 |
} |
| 635 |
|
| 636 |
static void |
| 637 |
pci_device_freebsd_write32(struct pci_io_handle *handle, uint32_t reg, |
| 638 |
uint32_t data) |
| 639 |
{ |
| 640 |
#if defined(__i386__) || defined(__amd64__) |
| 641 |
outl(handle->base + reg, data); |
| 642 |
#else |
| 643 |
*(uint16_t *)((uintptr_t)handle->memory + reg) = data; |
| 644 |
#endif |
| 645 |
} |
| 646 |
|
| 647 |
static void |
| 648 |
pci_device_freebsd_write16(struct pci_io_handle *handle, uint32_t reg, |
| 649 |
uint16_t data) |
| 650 |
{ |
| 651 |
#if defined(__i386__) || defined(__amd64__) |
| 652 |
outw(handle->base + reg, data); |
| 653 |
#else |
| 654 |
*(uint8_t *)((uintptr_t)handle->memory + reg) = data; |
| 655 |
#endif |
| 656 |
} |
| 657 |
|
| 658 |
static void |
| 659 |
pci_device_freebsd_write8(struct pci_io_handle *handle, uint32_t reg, |
| 660 |
uint8_t data) |
| 661 |
{ |
| 662 |
#if defined(__i386__) || defined(__amd64__) |
| 663 |
outb(handle->base + reg, data); |
| 664 |
#else |
| 665 |
*(uint32_t *)((uintptr_t)handle->memory + reg) = data; |
| 666 |
#endif |
| 667 |
} |
| 668 |
|
| 669 |
static int |
| 670 |
pci_device_freebsd_map_legacy(struct pci_device *dev, pciaddr_t base, |
| 671 |
pciaddr_t size, unsigned map_flags, void **addr) |
| 672 |
{ |
| 673 |
struct pci_device_mapping map; |
| 674 |
int err; |
| 675 |
|
| 676 |
map.base = base; |
| 677 |
map.size = size; |
| 678 |
map.flags = map_flags; |
| 679 |
map.memory = NULL; |
| 680 |
err = pci_device_freebsd_map_range(dev, &map); |
| 681 |
*addr = map.memory; |
| 682 |
|
| 683 |
return err; |
| 684 |
} |
| 685 |
|
| 686 |
static int |
| 687 |
pci_device_freebsd_unmap_legacy(struct pci_device *dev, void *addr, |
| 688 |
pciaddr_t size) |
| 689 |
{ |
| 690 |
struct pci_device_mapping map; |
| 691 |
|
| 692 |
map.memory = addr; |
| 693 |
map.size = size; |
| 694 |
map.flags = 0; |
| 695 |
return pci_device_freebsd_unmap_range(dev, &map); |
| 696 |
} |
| 697 |
|
| 564 |
static const struct pci_system_methods freebsd_pci_methods = { |
698 |
static const struct pci_system_methods freebsd_pci_methods = { |
| 565 |
.destroy = pci_system_freebsd_destroy, |
699 |
.destroy = pci_system_freebsd_destroy, |
| 566 |
.destroy_device = NULL, /* nothing to do for this */ |
700 |
.destroy_device = NULL, /* nothing to do for this */ |
|
Lines 571-576
Link Here
|
| 571 |
.read = pci_device_freebsd_read, |
705 |
.read = pci_device_freebsd_read, |
| 572 |
.write = pci_device_freebsd_write, |
706 |
.write = pci_device_freebsd_write, |
| 573 |
.fill_capabilities = pci_fill_capabilities_generic, |
707 |
.fill_capabilities = pci_fill_capabilities_generic, |
|
|
708 |
.open_legacy_io = pci_device_freebsd_open_legacy_io, |
| 709 |
#if defined(__i386__) || defined(__amd64__) |
| 710 |
.close_io = pci_device_freebsd_close_io, |
| 711 |
#endif |
| 712 |
.read32 = pci_device_freebsd_read32, |
| 713 |
.read16 = pci_device_freebsd_read16, |
| 714 |
.read8 = pci_device_freebsd_read8, |
| 715 |
.write32 = pci_device_freebsd_write32, |
| 716 |
.write16 = pci_device_freebsd_write16, |
| 717 |
.write8 = pci_device_freebsd_write8, |
| 718 |
.map_legacy = pci_device_freebsd_map_legacy, |
| 719 |
.unmap_legacy = pci_device_freebsd_unmap_legacy, |
| 574 |
}; |
720 |
}; |
| 575 |
|
721 |
|
| 576 |
/** |
722 |
/** |