mirror of https://gitee.com/openkylin/linux.git
tile PCI RC: bomb comments and whitespace format
This change is purely stylistic but improves the readability of the tile PCI RC driver. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
This commit is contained in:
parent
f62f73f6ca
commit
eafa5c8a10
|
@ -108,17 +108,15 @@ static struct pci_ops tile_cfg_ops;
|
||||||
/* Mask of CPUs that should receive PCIe interrupts. */
|
/* Mask of CPUs that should receive PCIe interrupts. */
|
||||||
static struct cpumask intr_cpus_map;
|
static struct cpumask intr_cpus_map;
|
||||||
|
|
||||||
/*
|
/* We don't need to worry about the alignment of resources. */
|
||||||
* We don't need to worry about the alignment of resources.
|
|
||||||
*/
|
|
||||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||||
resource_size_t size, resource_size_t align)
|
resource_size_t size,
|
||||||
|
resource_size_t align)
|
||||||
{
|
{
|
||||||
return res->start;
|
return res->start;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pcibios_align_resource);
|
EXPORT_SYMBOL(pcibios_align_resource);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pick a CPU to receive and handle the PCIe interrupts, based on the IRQ #.
|
* Pick a CPU to receive and handle the PCIe interrupts, based on the IRQ #.
|
||||||
* For now, we simply send interrupts to non-dataplane CPUs.
|
* For now, we simply send interrupts to non-dataplane CPUs.
|
||||||
|
@ -146,25 +144,19 @@ static int tile_irq_cpu(int irq)
|
||||||
return cpu;
|
return cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Open a file descriptor to the TRIO shim. */
|
||||||
* Open a file descriptor to the TRIO shim.
|
|
||||||
*/
|
|
||||||
static int tile_pcie_open(int trio_index)
|
static int tile_pcie_open(int trio_index)
|
||||||
{
|
{
|
||||||
gxio_trio_context_t *context = &trio_contexts[trio_index];
|
gxio_trio_context_t *context = &trio_contexts[trio_index];
|
||||||
int ret;
|
int ret;
|
||||||
int mac;
|
int mac;
|
||||||
|
|
||||||
/*
|
/* This opens a file descriptor to the TRIO shim. */
|
||||||
* This opens a file descriptor to the TRIO shim.
|
|
||||||
*/
|
|
||||||
ret = gxio_trio_init(context, trio_index);
|
ret = gxio_trio_init(context, trio_index);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto gxio_trio_init_failure;
|
goto gxio_trio_init_failure;
|
||||||
|
|
||||||
/*
|
/* Allocate an ASID for the kernel. */
|
||||||
* Allocate an ASID for the kernel.
|
|
||||||
*/
|
|
||||||
ret = gxio_trio_alloc_asids(context, 1, 0, 0);
|
ret = gxio_trio_alloc_asids(context, 1, 0, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: ASID alloc failure on TRIO %d, give up\n",
|
pr_err("PCI: ASID alloc failure on TRIO %d, give up\n",
|
||||||
|
@ -285,20 +277,17 @@ static int __init tile_trio_init(void)
|
||||||
}
|
}
|
||||||
postcore_initcall(tile_trio_init);
|
postcore_initcall(tile_trio_init);
|
||||||
|
|
||||||
static void
|
static void tilegx_legacy_irq_ack(struct irq_data *d)
|
||||||
tilegx_legacy_irq_ack(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
__insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq);
|
__insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void tilegx_legacy_irq_mask(struct irq_data *d)
|
||||||
tilegx_legacy_irq_mask(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
__insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq);
|
__insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void tilegx_legacy_irq_unmask(struct irq_data *d)
|
||||||
tilegx_legacy_irq_unmask(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
__insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq);
|
__insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq);
|
||||||
}
|
}
|
||||||
|
@ -319,8 +308,7 @@ static struct irq_chip tilegx_legacy_irq_chip = {
|
||||||
* to Linux which just calls handle_level_irq() after clearing the
|
* to Linux which just calls handle_level_irq() after clearing the
|
||||||
* MAC INTx Assert status bit associated with this interrupt.
|
* MAC INTx Assert status bit associated with this interrupt.
|
||||||
*/
|
*/
|
||||||
static void
|
static void trio_handle_level_irq(unsigned int irq, struct irq_desc *desc)
|
||||||
trio_handle_level_irq(unsigned int irq, struct irq_desc *desc)
|
|
||||||
{
|
{
|
||||||
struct pci_controller *controller = irq_desc_get_handler_data(desc);
|
struct pci_controller *controller = irq_desc_get_handler_data(desc);
|
||||||
gxio_trio_context_t *trio_context = controller->trio;
|
gxio_trio_context_t *trio_context = controller->trio;
|
||||||
|
@ -386,9 +374,7 @@ static int tile_init_irqs(struct pci_controller *controller)
|
||||||
goto free_irqs;
|
goto free_irqs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Register the IRQ handler with the kernel. */
|
||||||
* Register the IRQ handler with the kernel.
|
|
||||||
*/
|
|
||||||
irq_set_chip_and_handler(irq, &tilegx_legacy_irq_chip,
|
irq_set_chip_and_handler(irq, &tilegx_legacy_irq_chip,
|
||||||
trio_handle_level_irq);
|
trio_handle_level_irq);
|
||||||
irq_set_chip_data(irq, (void *)(uint64_t)i);
|
irq_set_chip_data(irq, (void *)(uint64_t)i);
|
||||||
|
@ -471,15 +457,11 @@ int __init tile_pci_init(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Return if no PCIe ports are configured to operate in RC mode. */
|
||||||
* Return if no PCIe ports are configured to operate in RC mode.
|
|
||||||
*/
|
|
||||||
if (num_rc_controllers == 0)
|
if (num_rc_controllers == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/* Set the TRIO pointer and MAC index for each PCIe RC port. */
|
||||||
* Set the TRIO pointer and MAC index for each PCIe RC port.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < TILEGX_NUM_TRIO; i++) {
|
for (i = 0; i < TILEGX_NUM_TRIO; i++) {
|
||||||
for (j = 0; j < TILEGX_TRIO_PCIES; j++) {
|
for (j = 0; j < TILEGX_TRIO_PCIES; j++) {
|
||||||
if (pcie_rc[i][j]) {
|
if (pcie_rc[i][j]) {
|
||||||
|
@ -495,14 +477,10 @@ int __init tile_pci_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/*
|
/* Configure each PCIe RC port. */
|
||||||
* Configure each PCIe RC port.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < num_rc_controllers; i++) {
|
for (i = 0; i < num_rc_controllers; i++) {
|
||||||
/*
|
|
||||||
* Configure the PCIe MAC to run in RC mode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
/* Configure the PCIe MAC to run in RC mode. */
|
||||||
struct pci_controller *controller = &pci_controllers[i];
|
struct pci_controller *controller = &pci_controllers[i];
|
||||||
|
|
||||||
controller->index = i;
|
controller->index = i;
|
||||||
|
@ -525,7 +503,6 @@ int __init tile_pci_init(void)
|
||||||
* is in range [3GB, 4GB - 1] of a 4GB space beyond the
|
* is in range [3GB, 4GB - 1] of a 4GB space beyond the
|
||||||
* PA space.
|
* PA space.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
controller->mem_offset = TILE_PCI_MEM_START +
|
controller->mem_offset = TILE_PCI_MEM_START +
|
||||||
(i * TILE_PCI_BAR_WINDOW_TOP);
|
(i * TILE_PCI_BAR_WINDOW_TOP);
|
||||||
controller->mem_space.start = controller->mem_offset +
|
controller->mem_space.start = controller->mem_offset +
|
||||||
|
@ -553,7 +530,6 @@ static int tile_map_irq(const struct pci_dev *dev, u8 device, u8 pin)
|
||||||
return controller->irq_intx_table[pin - 1];
|
return controller->irq_intx_table[pin - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void fixup_read_and_payload_sizes(struct pci_controller *controller)
|
static void fixup_read_and_payload_sizes(struct pci_controller *controller)
|
||||||
{
|
{
|
||||||
gxio_trio_context_t *trio_context = controller->trio;
|
gxio_trio_context_t *trio_context = controller->trio;
|
||||||
|
@ -567,9 +543,7 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
|
||||||
|
|
||||||
mac = controller->mac;
|
mac = controller->mac;
|
||||||
|
|
||||||
/*
|
/* Set our max read request size to be 4KB. */
|
||||||
* Set our max read request size to be 4KB.
|
|
||||||
*/
|
|
||||||
reg_offset =
|
reg_offset =
|
||||||
(TRIO_PCIE_RC_DEVICE_CONTROL <<
|
(TRIO_PCIE_RC_DEVICE_CONTROL <<
|
||||||
TRIO_CFG_REGION_ADDR__REG_SHIFT) |
|
TRIO_CFG_REGION_ADDR__REG_SHIFT) |
|
||||||
|
@ -578,10 +552,10 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
|
||||||
(mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
|
(mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
|
||||||
|
|
||||||
dev_control.word = __gxio_mmio_read32(trio_context->mmio_base_mac +
|
dev_control.word = __gxio_mmio_read32(trio_context->mmio_base_mac +
|
||||||
reg_offset);
|
reg_offset);
|
||||||
dev_control.max_read_req_sz = 5;
|
dev_control.max_read_req_sz = 5;
|
||||||
__gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset,
|
__gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset,
|
||||||
dev_control.word);
|
dev_control.word);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the max payload size supported by this Gx PCIe MAC.
|
* Set the max payload size supported by this Gx PCIe MAC.
|
||||||
|
@ -597,10 +571,10 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
|
||||||
(mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
|
(mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
|
||||||
|
|
||||||
rc_dev_cap.word = __gxio_mmio_read32(trio_context->mmio_base_mac +
|
rc_dev_cap.word = __gxio_mmio_read32(trio_context->mmio_base_mac +
|
||||||
reg_offset);
|
reg_offset);
|
||||||
rc_dev_cap.mps_sup = 1;
|
rc_dev_cap.mps_sup = 1;
|
||||||
__gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset,
|
__gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset,
|
||||||
rc_dev_cap.word);
|
rc_dev_cap.word);
|
||||||
|
|
||||||
/* Configure PCI Express MPS setting. */
|
/* Configure PCI Express MPS setting. */
|
||||||
list_for_each_entry(child, &root_bus->children, node) {
|
list_for_each_entry(child, &root_bus->children, node) {
|
||||||
|
@ -628,7 +602,7 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
|
||||||
dev_control.max_payload_size,
|
dev_control.max_payload_size,
|
||||||
dev_control.max_read_req_sz,
|
dev_control.max_read_req_sz,
|
||||||
mac);
|
mac);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
pr_err("PCI: PCIE_CONFIGURE_MAC_MPS_MRS failure, "
|
pr_err("PCI: PCIE_CONFIGURE_MAC_MPS_MRS failure, "
|
||||||
"MAC %d on TRIO %d\n",
|
"MAC %d on TRIO %d\n",
|
||||||
mac, controller->trio_index);
|
mac, controller->trio_index);
|
||||||
|
@ -672,9 +646,7 @@ static int setup_pcie_rc_delay(char *str)
|
||||||
}
|
}
|
||||||
early_param("pcie_rc_delay", setup_pcie_rc_delay);
|
early_param("pcie_rc_delay", setup_pcie_rc_delay);
|
||||||
|
|
||||||
/*
|
/* PCI initialization entry point, called by subsys_initcall. */
|
||||||
* PCI initialization entry point, called by subsys_initcall.
|
|
||||||
*/
|
|
||||||
int __init pcibios_init(void)
|
int __init pcibios_init(void)
|
||||||
{
|
{
|
||||||
resource_size_t offset;
|
resource_size_t offset;
|
||||||
|
@ -744,9 +716,7 @@ int __init pcibios_init(void)
|
||||||
pr_info("PCI: Found PCI controller #%d on TRIO %d MAC %d\n", i,
|
pr_info("PCI: Found PCI controller #%d on TRIO %d MAC %d\n", i,
|
||||||
trio_index, controller->mac);
|
trio_index, controller->mac);
|
||||||
|
|
||||||
/*
|
/* Delay the bus probe if needed. */
|
||||||
* Delay the bus probe if needed.
|
|
||||||
*/
|
|
||||||
if (rc_delay[trio_index][mac]) {
|
if (rc_delay[trio_index][mac]) {
|
||||||
pr_info("Delaying PCIe RC bus enumerating %d sec"
|
pr_info("Delaying PCIe RC bus enumerating %d sec"
|
||||||
" on MAC %d on TRIO %d\n",
|
" on MAC %d on TRIO %d\n",
|
||||||
|
@ -761,9 +731,7 @@ int __init pcibios_init(void)
|
||||||
msleep(1000);
|
msleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Check for PCIe link-up status again. */
|
||||||
* Check for PCIe link-up status again.
|
|
||||||
*/
|
|
||||||
port_status.word =
|
port_status.word =
|
||||||
__gxio_mmio_read(trio_context->mmio_base_mac +
|
__gxio_mmio_read(trio_context->mmio_base_mac +
|
||||||
reg_offset);
|
reg_offset);
|
||||||
|
@ -801,7 +769,6 @@ int __init pcibios_init(void)
|
||||||
* Change the device ID so that Linux bus crawl doesn't confuse
|
* Change the device ID so that Linux bus crawl doesn't confuse
|
||||||
* the internal bridge with any Tilera endpoints.
|
* the internal bridge with any Tilera endpoints.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
reg_offset =
|
reg_offset =
|
||||||
(TRIO_PCIE_RC_DEVICE_ID_VEN_ID <<
|
(TRIO_PCIE_RC_DEVICE_ID_VEN_ID <<
|
||||||
TRIO_CFG_REGION_ADDR__REG_SHIFT) |
|
TRIO_CFG_REGION_ADDR__REG_SHIFT) |
|
||||||
|
@ -814,10 +781,7 @@ int __init pcibios_init(void)
|
||||||
TRIO_PCIE_RC_DEVICE_ID_VEN_ID__DEV_ID_SHIFT) |
|
TRIO_PCIE_RC_DEVICE_ID_VEN_ID__DEV_ID_SHIFT) |
|
||||||
TILERA_VENDOR_ID);
|
TILERA_VENDOR_ID);
|
||||||
|
|
||||||
/*
|
/* Set the internal P2P bridge class code. */
|
||||||
* Set the internal P2P bridge class code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
reg_offset =
|
reg_offset =
|
||||||
(TRIO_PCIE_RC_REVISION_ID <<
|
(TRIO_PCIE_RC_REVISION_ID <<
|
||||||
TRIO_CFG_REGION_ADDR__REG_SHIFT) |
|
TRIO_CFG_REGION_ADDR__REG_SHIFT) |
|
||||||
|
@ -828,26 +792,22 @@ int __init pcibios_init(void)
|
||||||
class_code_revision =
|
class_code_revision =
|
||||||
__gxio_mmio_read32(trio_context->mmio_base_mac +
|
__gxio_mmio_read32(trio_context->mmio_base_mac +
|
||||||
reg_offset);
|
reg_offset);
|
||||||
class_code_revision = (class_code_revision & 0xff ) |
|
class_code_revision = (class_code_revision & 0xff) |
|
||||||
(PCI_CLASS_BRIDGE_PCI << 16);
|
(PCI_CLASS_BRIDGE_PCI << 16);
|
||||||
|
|
||||||
__gxio_mmio_write32(trio_context->mmio_base_mac +
|
__gxio_mmio_write32(trio_context->mmio_base_mac +
|
||||||
reg_offset, class_code_revision);
|
reg_offset, class_code_revision);
|
||||||
|
|
||||||
#ifdef USE_SHARED_PCIE_CONFIG_REGION
|
#ifdef USE_SHARED_PCIE_CONFIG_REGION
|
||||||
|
|
||||||
/*
|
/* Map in the MMIO space for the PIO region. */
|
||||||
* Map in the MMIO space for the PIO region.
|
|
||||||
*/
|
|
||||||
offset = HV_TRIO_PIO_OFFSET(trio_context->pio_cfg_index) |
|
offset = HV_TRIO_PIO_OFFSET(trio_context->pio_cfg_index) |
|
||||||
(((unsigned long long)mac) <<
|
(((unsigned long long)mac) <<
|
||||||
TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT);
|
TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/*
|
/* Alloc a PIO region for PCI config access per MAC. */
|
||||||
* Alloc a PIO region for PCI config access per MAC.
|
|
||||||
*/
|
|
||||||
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
|
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: PCI CFG PIO alloc failure for mac %d "
|
pr_err("PCI: PCI CFG PIO alloc failure for mac %d "
|
||||||
|
@ -858,9 +818,7 @@ int __init pcibios_init(void)
|
||||||
|
|
||||||
trio_context->pio_cfg_index[mac] = ret;
|
trio_context->pio_cfg_index[mac] = ret;
|
||||||
|
|
||||||
/*
|
/* For PIO CFG, the bus_address_hi parameter is 0. */
|
||||||
* For PIO CFG, the bus_address_hi parameter is 0.
|
|
||||||
*/
|
|
||||||
ret = gxio_trio_init_pio_region_aux(trio_context,
|
ret = gxio_trio_init_pio_region_aux(trio_context,
|
||||||
trio_context->pio_cfg_index[mac],
|
trio_context->pio_cfg_index[mac],
|
||||||
mac, 0, HV_TRIO_PIO_FLAG_CONFIG_SPACE);
|
mac, 0, HV_TRIO_PIO_FLAG_CONFIG_SPACE);
|
||||||
|
@ -887,9 +845,7 @@ int __init pcibios_init(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Initialize the PCIe interrupts. */
|
||||||
* Initialize the PCIe interrupts.
|
|
||||||
*/
|
|
||||||
if (tile_init_irqs(controller)) {
|
if (tile_init_irqs(controller)) {
|
||||||
pr_err("PCI: IRQs init failure for mac %d on TRIO %d\n",
|
pr_err("PCI: IRQs init failure for mac %d on TRIO %d\n",
|
||||||
mac, trio_index);
|
mac, trio_index);
|
||||||
|
@ -921,7 +877,6 @@ int __init pcibios_init(void)
|
||||||
* It allocates all of the resources (I/O memory, etc)
|
* It allocates all of the resources (I/O memory, etc)
|
||||||
* associated with the devices read in above.
|
* associated with the devices read in above.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pci_assign_unassigned_resources();
|
pci_assign_unassigned_resources();
|
||||||
|
|
||||||
/* Record the I/O resources in the PCI controller structure. */
|
/* Record the I/O resources in the PCI controller structure. */
|
||||||
|
@ -942,14 +897,12 @@ int __init pcibios_init(void)
|
||||||
/* Configure the max_payload_size values for this domain. */
|
/* Configure the max_payload_size values for this domain. */
|
||||||
fixup_read_and_payload_sizes(controller);
|
fixup_read_and_payload_sizes(controller);
|
||||||
|
|
||||||
/*
|
/* Alloc a PIO region for PCI memory access for each RC port. */
|
||||||
* Alloc a PIO region for PCI memory access for each RC port.
|
|
||||||
*/
|
|
||||||
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
|
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: MEM PIO alloc failure on TRIO %d mac %d, "
|
pr_err("PCI: MEM PIO alloc failure on TRIO %d mac %d, "
|
||||||
"give up\n", controller->trio_index,
|
"give up\n", controller->trio_index,
|
||||||
controller->mac);
|
controller->mac);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -967,8 +920,8 @@ int __init pcibios_init(void)
|
||||||
0);
|
0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: MEM PIO init failure on TRIO %d mac %d, "
|
pr_err("PCI: MEM PIO init failure on TRIO %d mac %d, "
|
||||||
"give up\n", controller->trio_index,
|
"give up\n", controller->trio_index,
|
||||||
controller->mac);
|
controller->mac);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -980,8 +933,8 @@ int __init pcibios_init(void)
|
||||||
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
|
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: I/O PIO alloc failure on TRIO %d mac %d, "
|
pr_err("PCI: I/O PIO alloc failure on TRIO %d mac %d, "
|
||||||
"give up\n", controller->trio_index,
|
"give up\n", controller->trio_index,
|
||||||
controller->mac);
|
controller->mac);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -999,8 +952,8 @@ int __init pcibios_init(void)
|
||||||
HV_TRIO_PIO_FLAG_IO_SPACE);
|
HV_TRIO_PIO_FLAG_IO_SPACE);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: I/O PIO init failure on TRIO %d mac %d, "
|
pr_err("PCI: I/O PIO init failure on TRIO %d mac %d, "
|
||||||
"give up\n", controller->trio_index,
|
"give up\n", controller->trio_index,
|
||||||
controller->mac);
|
controller->mac);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1020,9 +973,9 @@ int __init pcibios_init(void)
|
||||||
0);
|
0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: Mem-Map alloc failure on TRIO %d "
|
pr_err("PCI: Mem-Map alloc failure on TRIO %d "
|
||||||
"mac %d for MC %d, give up\n",
|
"mac %d for MC %d, give up\n",
|
||||||
controller->trio_index,
|
controller->trio_index,
|
||||||
controller->mac, j);
|
controller->mac, j);
|
||||||
|
|
||||||
goto alloc_mem_map_failed;
|
goto alloc_mem_map_failed;
|
||||||
}
|
}
|
||||||
|
@ -1053,9 +1006,9 @@ int __init pcibios_init(void)
|
||||||
GXIO_TRIO_ORDER_MODE_UNORDERED);
|
GXIO_TRIO_ORDER_MODE_UNORDERED);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("PCI: Mem-Map init failure on TRIO %d "
|
pr_err("PCI: Mem-Map init failure on TRIO %d "
|
||||||
"mac %d for MC %d, give up\n",
|
"mac %d for MC %d, give up\n",
|
||||||
controller->trio_index,
|
controller->trio_index,
|
||||||
controller->mac, j);
|
controller->mac, j);
|
||||||
|
|
||||||
goto alloc_mem_map_failed;
|
goto alloc_mem_map_failed;
|
||||||
}
|
}
|
||||||
|
@ -1064,22 +1017,18 @@ int __init pcibios_init(void)
|
||||||
alloc_mem_map_failed:
|
alloc_mem_map_failed:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
subsys_initcall(pcibios_init);
|
subsys_initcall(pcibios_init);
|
||||||
|
|
||||||
/* Note: to be deleted after Linux 3.6 merge. */
|
/* No bus fixups needed. */
|
||||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Process any "pci=" kernel boot arguments. */
|
||||||
* This can be called from the generic PCI layer, but doesn't need to
|
|
||||||
* do anything.
|
|
||||||
*/
|
|
||||||
char *pcibios_setup(char *str)
|
char *pcibios_setup(char *str)
|
||||||
{
|
{
|
||||||
if (!strcmp(str, "off")) {
|
if (!strcmp(str, "off")) {
|
||||||
|
@ -1130,7 +1079,6 @@ void __iomem *ioremap(resource_size_t phys_addr, unsigned long size)
|
||||||
* By searching phys_addr in each controller's mem_space, we can
|
* By searching phys_addr in each controller's mem_space, we can
|
||||||
* determine the controller that should accept the PCI memory access.
|
* determine the controller that should accept the PCI memory access.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < num_rc_controllers; i++) {
|
for (i = 0; i < num_rc_controllers; i++) {
|
||||||
/*
|
/*
|
||||||
* Skip controllers that are not properly initialized or
|
* Skip controllers that are not properly initialized or
|
||||||
|
@ -1158,9 +1106,7 @@ void __iomem *ioremap(resource_size_t phys_addr, unsigned long size)
|
||||||
|
|
||||||
offset = HV_TRIO_PIO_OFFSET(controller->pio_mem_index) + start;
|
offset = HV_TRIO_PIO_OFFSET(controller->pio_mem_index) + start;
|
||||||
|
|
||||||
/*
|
/* We need to keep the PCI bus address's in-page offset in the VA. */
|
||||||
* We need to keep the PCI bus address's in-page offset in the VA.
|
|
||||||
*/
|
|
||||||
return iorpc_ioremap(trio_fd, offset, size) +
|
return iorpc_ioremap(trio_fd, offset, size) +
|
||||||
(start & (PAGE_SIZE - 1));
|
(start & (PAGE_SIZE - 1));
|
||||||
}
|
}
|
||||||
|
@ -1186,7 +1132,6 @@ void __iomem *ioport_map(unsigned long port, unsigned int size)
|
||||||
* By searching the port in each controller's io_space, we can
|
* By searching the port in each controller's io_space, we can
|
||||||
* determine the controller that should accept the PCI I/O access.
|
* determine the controller that should accept the PCI I/O access.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < num_rc_controllers; i++) {
|
for (i = 0; i < num_rc_controllers; i++) {
|
||||||
/*
|
/*
|
||||||
* Skip controllers that are not properly initialized or
|
* Skip controllers that are not properly initialized or
|
||||||
|
@ -1214,9 +1159,7 @@ void __iomem *ioport_map(unsigned long port, unsigned int size)
|
||||||
|
|
||||||
offset = HV_TRIO_PIO_OFFSET(controller->pio_io_index) + port;
|
offset = HV_TRIO_PIO_OFFSET(controller->pio_io_index) + port;
|
||||||
|
|
||||||
/*
|
/* We need to keep the PCI bus address's in-page offset in the VA. */
|
||||||
* We need to keep the PCI bus address's in-page offset in the VA.
|
|
||||||
*/
|
|
||||||
return iorpc_ioremap(trio_fd, offset, size) + (port & (PAGE_SIZE - 1));
|
return iorpc_ioremap(trio_fd, offset, size) + (port & (PAGE_SIZE - 1));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ioport_map);
|
EXPORT_SYMBOL(ioport_map);
|
||||||
|
@ -1249,7 +1192,6 @@ EXPORT_SYMBOL(pci_iounmap);
|
||||||
* offset is in bytes, from the start of config space for the
|
* offset is in bytes, from the start of config space for the
|
||||||
* specified bus & device.
|
* specified bus & device.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
|
static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||||
int size, u32 *val)
|
int size, u32 *val)
|
||||||
{
|
{
|
||||||
|
@ -1299,7 +1241,6 @@ static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||||
* Accesses to the directly attached device have to be
|
* Accesses to the directly attached device have to be
|
||||||
* sent as type-0 configs.
|
* sent as type-0 configs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (busnum == (controller->first_busno + 1)) {
|
if (busnum == (controller->first_busno + 1)) {
|
||||||
/*
|
/*
|
||||||
* There is only one device off of our built-in P2P bridge.
|
* There is only one device off of our built-in P2P bridge.
|
||||||
|
@ -1321,9 +1262,8 @@ static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||||
* Note that we don't set the mac field in cfg_addr because the
|
* Note that we don't set the mac field in cfg_addr because the
|
||||||
* mapping is per port.
|
* mapping is per port.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] +
|
mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] +
|
||||||
cfg_addr.word;
|
cfg_addr.word;
|
||||||
|
|
||||||
valid_device:
|
valid_device:
|
||||||
|
|
||||||
|
@ -1427,7 +1367,6 @@ static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||||
* Accesses to the directly attached device have to be
|
* Accesses to the directly attached device have to be
|
||||||
* sent as type-0 configs.
|
* sent as type-0 configs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (busnum == (controller->first_busno + 1)) {
|
if (busnum == (controller->first_busno + 1)) {
|
||||||
/*
|
/*
|
||||||
* There is only one device off of our built-in P2P bridge.
|
* There is only one device off of our built-in P2P bridge.
|
||||||
|
@ -1449,7 +1388,6 @@ static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset,
|
||||||
* Note that we don't set the mac field in cfg_addr because the
|
* Note that we don't set the mac field in cfg_addr because the
|
||||||
* mapping is per port.
|
* mapping is per port.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] +
|
mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] +
|
||||||
cfg_addr.word;
|
cfg_addr.word;
|
||||||
|
|
||||||
|
@ -1487,11 +1425,8 @@ static struct pci_ops tile_cfg_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/* MSI support starts here. */
|
||||||
* MSI support starts here.
|
static unsigned int tilegx_msi_startup(struct irq_data *d)
|
||||||
*/
|
|
||||||
static unsigned int
|
|
||||||
tilegx_msi_startup(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
if (d->msi_desc)
|
if (d->msi_desc)
|
||||||
unmask_msi_irq(d);
|
unmask_msi_irq(d);
|
||||||
|
@ -1499,21 +1434,18 @@ tilegx_msi_startup(struct irq_data *d)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void tilegx_msi_ack(struct irq_data *d)
|
||||||
tilegx_msi_ack(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
__insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq);
|
__insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void tilegx_msi_mask(struct irq_data *d)
|
||||||
tilegx_msi_mask(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
mask_msi_irq(d);
|
mask_msi_irq(d);
|
||||||
__insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq);
|
__insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void tilegx_msi_unmask(struct irq_data *d)
|
||||||
tilegx_msi_unmask(struct irq_data *d)
|
|
||||||
{
|
{
|
||||||
__insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq);
|
__insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq);
|
||||||
unmask_msi_irq(d);
|
unmask_msi_irq(d);
|
||||||
|
|
Loading…
Reference in New Issue