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 |
/** |