version 1.11, 2014/11/11 11:30:21 |
version 1.11.2.4, 2016/03/19 11:30:30 |
|
|
#include <dev/pci/pcivar.h> |
#include <dev/pci/pcivar.h> |
#include <dev/pci/agpvar.h> |
#include <dev/pci/agpvar.h> |
|
|
|
#if NACPICA > 0 |
#include <dev/acpi/acpivar.h> |
#include <dev/acpi/acpivar.h> |
#include <dev/acpi/acpi_pci.h> |
#include <dev/acpi/acpi_pci.h> |
|
#else |
|
struct acpi_devnode; |
|
#endif |
|
|
#include <linux/dma-mapping.h> |
#include <linux/dma-mapping.h> |
#include <linux/ioport.h> |
#include <linux/ioport.h> |
|
#include <linux/kernel.h> |
|
|
struct pci_bus { |
struct pci_bus { |
u_int number; |
u_int number; |
Line 78 struct pci_device_id { |
|
Line 83 struct pci_device_id { |
|
|
|
#define PCI_BASE_CLASS_DISPLAY PCI_CLASS_DISPLAY |
#define PCI_BASE_CLASS_DISPLAY PCI_CLASS_DISPLAY |
|
|
|
#define PCI_CLASS_DISPLAY_VGA \ |
|
((PCI_CLASS_DISPLAY << 8) | PCI_SUBCLASS_DISPLAY_VGA) |
#define PCI_CLASS_BRIDGE_ISA \ |
#define PCI_CLASS_BRIDGE_ISA \ |
((PCI_CLASS_BRIDGE << 8) | PCI_SUBCLASS_BRIDGE_ISA) |
((PCI_CLASS_BRIDGE << 8) | PCI_SUBCLASS_BRIDGE_ISA) |
CTASSERT(PCI_CLASS_BRIDGE_ISA == 0x0601); |
CTASSERT(PCI_CLASS_BRIDGE_ISA == 0x0601); |
Line 123 struct pci_dev { |
|
Line 130 struct pci_dev { |
|
bus_space_tag_t pd_rom_bst; |
bus_space_tag_t pd_rom_bst; |
bus_space_handle_t pd_rom_bsh; |
bus_space_handle_t pd_rom_bsh; |
bus_size_t pd_rom_size; |
bus_size_t pd_rom_size; |
|
bus_space_handle_t pd_rom_found_bsh; |
|
bus_size_t pd_rom_found_size; |
void *pd_rom_vaddr; |
void *pd_rom_vaddr; |
device_t pd_dev; |
device_t pd_dev; |
|
struct drm_device *pd_drm_dev; /* XXX Nouveau kludge! */ |
struct { |
struct { |
pcireg_t type; |
pcireg_t type; |
bus_addr_t addr; |
bus_addr_t addr; |
Line 136 struct pci_dev { |
|
Line 146 struct pci_dev { |
|
} pd_resources[PCI_NUM_RESOURCES]; |
} pd_resources[PCI_NUM_RESOURCES]; |
struct pci_conf_state *pd_saved_state; |
struct pci_conf_state *pd_saved_state; |
struct acpi_devnode *pd_ad; |
struct acpi_devnode *pd_ad; |
struct device dev; /* XXX Don't believe me! */ |
|
struct pci_bus *bus; |
struct pci_bus *bus; |
uint32_t devfn; |
uint32_t devfn; |
uint16_t vendor; |
uint16_t vendor; |
Line 154 pci_dev_dev(struct pci_dev *pdev) |
|
Line 163 pci_dev_dev(struct pci_dev *pdev) |
|
return pdev->pd_dev; |
return pdev->pd_dev; |
} |
} |
|
|
|
/* XXX Nouveau kludge! */ |
|
static inline struct drm_device * |
|
pci_get_drvdata(struct pci_dev *pdev) |
|
{ |
|
return pdev->pd_drm_dev; |
|
} |
|
|
static inline void |
static inline void |
linux_pci_dev_init(struct pci_dev *pdev, device_t dev, |
linux_pci_dev_init(struct pci_dev *pdev, device_t dev, |
const struct pci_attach_args *pa, int kludges) |
const struct pci_attach_args *pa, int kludges) |
Line 312 pci_clear_master(struct pci_dev *pdev) |
|
Line 328 pci_clear_master(struct pci_dev *pdev) |
|
PCI_COMMAND_STATUS_REG, csr); |
PCI_COMMAND_STATUS_REG, csr); |
} |
} |
|
|
#define PCIBIOS_MIN_MEM 0 /* XXX bogus x86 kludge bollocks */ |
#define PCIBIOS_MIN_MEM 0x100000 /* XXX bogus x86 kludge bollocks */ |
|
|
static inline bus_addr_t |
static inline bus_addr_t |
pcibios_align_resource(void *p, const struct resource *resource, |
pcibios_align_resource(void *p, const struct resource *resource, |
Line 444 static inline void |
|
Line 460 static inline void |
|
pci_unmap_rom(struct pci_dev *pdev, void __pci_rom_iomem *vaddr __unused) |
pci_unmap_rom(struct pci_dev *pdev, void __pci_rom_iomem *vaddr __unused) |
{ |
{ |
|
|
|
/* XXX Disable the ROM address decoder. */ |
KASSERT(ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM)); |
KASSERT(ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM)); |
KASSERT(vaddr == pdev->pd_rom_vaddr); |
KASSERT(vaddr == pdev->pd_rom_vaddr); |
bus_space_unmap(pdev->pd_rom_bst, pdev->pd_rom_bsh, pdev->pd_rom_size); |
bus_space_unmap(pdev->pd_rom_bst, pdev->pd_rom_bsh, pdev->pd_rom_size); |
Line 474 pci_map_rom_md(struct pci_dev *pdev) |
|
Line 491 pci_map_rom_md(struct pci_dev *pdev) |
|
pdev->pd_rom_bst = pdev->pd_pa.pa_memt; |
pdev->pd_rom_bst = pdev->pd_pa.pa_memt; |
pdev->pd_rom_bsh = rom_bsh; |
pdev->pd_rom_bsh = rom_bsh; |
pdev->pd_rom_size = rom_size; |
pdev->pd_rom_size = rom_size; |
|
pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM; |
|
|
return 0; |
return 0; |
#else |
#else |
Line 484 pci_map_rom_md(struct pci_dev *pdev) |
|
Line 502 pci_map_rom_md(struct pci_dev *pdev) |
|
static inline void __pci_rom_iomem * |
static inline void __pci_rom_iomem * |
pci_map_rom(struct pci_dev *pdev, size_t *sizep) |
pci_map_rom(struct pci_dev *pdev, size_t *sizep) |
{ |
{ |
bus_space_handle_t bsh; |
|
bus_size_t size; |
|
|
|
KASSERT(!ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM)); |
KASSERT(!ISSET(pdev->pd_kludges, NBPCI_KLUDGE_MAP_ROM)); |
|
|
if (pci_mapreg_map(&pdev->pd_pa, PCI_MAPREG_ROM, PCI_MAPREG_TYPE_ROM, |
if (pci_mapreg_map(&pdev->pd_pa, PCI_MAPREG_ROM, PCI_MAPREG_TYPE_ROM, |
(BUS_SPACE_MAP_PREFETCHABLE | BUS_SPACE_MAP_LINEAR), |
(BUS_SPACE_MAP_PREFETCHABLE | BUS_SPACE_MAP_LINEAR), |
&pdev->pd_rom_bst, &pdev->pd_rom_bsh, NULL, &pdev->pd_rom_size) |
&pdev->pd_rom_bst, &pdev->pd_rom_bsh, NULL, &pdev->pd_rom_size) |
!= 0 && |
!= 0) |
pci_map_rom_md(pdev) != 0) |
goto fail_mi; |
return NULL; |
|
pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM; |
pdev->pd_kludges |= NBPCI_KLUDGE_MAP_ROM; |
|
|
/* XXX This type is obviously wrong in general... */ |
/* XXX This type is obviously wrong in general... */ |
if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh, |
if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh, |
pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86, &bsh, &size)) { |
pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86, |
|
&pdev->pd_rom_found_bsh, &pdev->pd_rom_found_size)) { |
pci_unmap_rom(pdev, NULL); |
pci_unmap_rom(pdev, NULL); |
return NULL; |
goto fail_mi; |
} |
} |
|
goto success; |
|
|
KASSERT(size <= SIZE_T_MAX); |
fail_mi: |
*sizep = size; |
if (pci_map_rom_md(pdev) != 0) |
pdev->pd_rom_vaddr = bus_space_vaddr(pdev->pd_rom_bst, bsh); |
goto fail_md; |
|
|
|
/* XXX This type is obviously wrong in general... */ |
|
if (pci_find_rom(&pdev->pd_pa, pdev->pd_rom_bst, pdev->pd_rom_bsh, |
|
pdev->pd_rom_size, PCI_ROM_CODE_TYPE_X86, |
|
&pdev->pd_rom_found_bsh, &pdev->pd_rom_found_size)) { |
|
pci_unmap_rom(pdev, NULL); |
|
goto fail_md; |
|
} |
|
|
|
success: |
|
KASSERT(pdev->pd_rom_found_size <= SIZE_T_MAX); |
|
*sizep = pdev->pd_rom_found_size; |
|
pdev->pd_rom_vaddr = bus_space_vaddr(pdev->pd_rom_bst, |
|
pdev->pd_rom_found_bsh); |
return pdev->pd_rom_vaddr; |
return pdev->pd_rom_vaddr; |
|
|
|
fail_md: |
|
return NULL; |
|
} |
|
|
|
static inline void __pci_rom_iomem * |
|
pci_platform_rom(struct pci_dev *pdev __unused, size_t *sizep) |
|
{ |
|
|
|
*sizep = 0; |
|
return NULL; |
|
} |
|
|
|
static inline int |
|
pci_enable_rom(struct pci_dev *pdev) |
|
{ |
|
const pci_chipset_tag_t pc = pdev->pd_pa.pa_pc; |
|
const pcitag_t tag = pdev->pd_pa.pa_tag; |
|
pcireg_t addr; |
|
int s; |
|
|
|
/* XXX Don't do anything if the ROM isn't there. */ |
|
|
|
s = splhigh(); |
|
addr = pci_conf_read(pc, tag, PCI_MAPREG_ROM); |
|
addr |= PCI_MAPREG_ROM_ENABLE; |
|
pci_conf_write(pc, tag, PCI_MAPREG_ROM, addr); |
|
splx(s); |
|
|
|
return 0; |
|
} |
|
|
|
static inline void |
|
pci_disable_rom(struct pci_dev *pdev) |
|
{ |
|
const pci_chipset_tag_t pc = pdev->pd_pa.pa_pc; |
|
const pcitag_t tag = pdev->pd_pa.pa_tag; |
|
pcireg_t addr; |
|
int s; |
|
|
|
s = splhigh(); |
|
addr = pci_conf_read(pc, tag, PCI_MAPREG_ROM); |
|
addr &= ~(pcireg_t)PCI_MAPREG_ROM_ENABLE; |
|
pci_conf_write(pc, tag, PCI_MAPREG_ROM, addr); |
|
splx(s); |
} |
} |
|
|
static inline bus_addr_t |
static inline bus_addr_t |