Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/pci/pci.c
Show First 20 Lines • Show All 2,894 Lines • ▼ Show 20 Lines | if (bar64 != NULL) | ||||
*bar64 = (ln2range == 64); | *bar64 = (ln2range == 64); | ||||
} | } | ||||
static void | static void | ||||
pci_write_bar(device_t dev, struct pci_map *pm, pci_addr_t base) | pci_write_bar(device_t dev, struct pci_map *pm, pci_addr_t base) | ||||
{ | { | ||||
struct pci_devinfo *dinfo; | struct pci_devinfo *dinfo; | ||||
int ln2range; | int ln2range; | ||||
pci_addr_t map; | |||||
uint16_t cmd; | |||||
/* Clear the MEMEN or PORTEN bit */ | |||||
map = pm->pm_value; | |||||
cmd = pci_read_config(dev, PCIR_COMMAND, 2); | |||||
pci_write_config(dev, PCIR_COMMAND, | |||||
cmd & ~(PCI_BAR_MEM(map) ? PCIM_CMD_MEMEN : PCIM_CMD_PORTEN), 2); | |||||
/* The device ROM BAR is always a 32-bit memory BAR. */ | /* The device ROM BAR is always a 32-bit memory BAR. */ | ||||
dinfo = device_get_ivars(dev); | dinfo = device_get_ivars(dev); | ||||
if (PCIR_IS_BIOS(&dinfo->cfg, pm->pm_reg)) | if (PCIR_IS_BIOS(&dinfo->cfg, pm->pm_reg)) | ||||
ln2range = 32; | ln2range = 32; | ||||
else | else | ||||
ln2range = pci_maprange(pm->pm_value); | ln2range = pci_maprange(pm->pm_value); | ||||
pci_write_config(dev, pm->pm_reg, base, 4); | pci_write_config(dev, pm->pm_reg, base, 4); | ||||
if (ln2range == 64) | if (ln2range == 64) | ||||
pci_write_config(dev, pm->pm_reg + 4, base >> 32, 4); | pci_write_config(dev, pm->pm_reg + 4, base >> 32, 4); | ||||
pm->pm_value = pci_read_config(dev, pm->pm_reg, 4); | pm->pm_value = pci_read_config(dev, pm->pm_reg, 4); | ||||
if (ln2range == 64) | if (ln2range == 64) | ||||
pm->pm_value |= (pci_addr_t)pci_read_config(dev, | pm->pm_value |= (pci_addr_t)pci_read_config(dev, | ||||
pm->pm_reg + 4, 4) << 32; | pm->pm_reg + 4, 4) << 32; | ||||
/* Restore the original value of PCIR_COMMAND */ | |||||
pci_write_config(dev, PCIR_COMMAND, cmd, 2); | |||||
} | } | ||||
struct pci_map * | struct pci_map * | ||||
pci_find_bar(device_t dev, int reg) | pci_find_bar(device_t dev, int reg) | ||||
{ | { | ||||
struct pci_devinfo *dinfo; | struct pci_devinfo *dinfo; | ||||
struct pci_map *pm; | struct pci_map *pm; | ||||
▲ Show 20 Lines • Show All 3,132 Lines • Show Last 20 Lines |