Refactor the code into a simple bitmask lookup table that determines if a given PCI controller is enabled and if its in host/root-complex or agent/end-point mode. Each processor in the PQ3/MPC86xx family specified different encodings for the cfg_host_agt[] and cfg_IO_ports[] boot strapping signals. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>master
parent
8b8376e81c
commit
865f24dc92
@ -0,0 +1,225 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2009 Freescale Semiconductor, Inc. |
||||||
|
* |
||||||
|
* See file CREDITS for list of people who contributed to this |
||||||
|
* project. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU General Public License as |
||||||
|
* published by the Free Software Foundation; either version 2 of |
||||||
|
* the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||||
|
* MA 02111-1307 USA |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <asm/fsl_law.h> |
||||||
|
#include <pci.h> |
||||||
|
|
||||||
|
struct pci_info { |
||||||
|
u16 agent; |
||||||
|
u16 cfg; |
||||||
|
}; |
||||||
|
|
||||||
|
/* The agent field is a bit mask in which each bit represents the value of
|
||||||
|
* cfg_host_agt[] signal and the bit is set of the given interface would be |
||||||
|
* in agent/end-point mode for the given interface. |
||||||
|
* |
||||||
|
* The same idea is true of the cfg field. The bit will be set if the |
||||||
|
* interface would be enabled based on the value of cfg_IO_ports[] signal |
||||||
|
* |
||||||
|
* On MPC86xx/PQ3 based systems: |
||||||
|
* we extract cfg_host_agt from GUTS register PORBMSR |
||||||
|
* we extract cfg_IO_ports from GUTS register PORDEVSR |
||||||
|
* |
||||||
|
* cfg_IO_ports only exist on systems w/PCIe (we set cfg 0 for systems |
||||||
|
* without PCIe) |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(CONFIG_MPC8540) || defined(CONFIG_MPC8560) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI] = { |
||||||
|
.agent = (1 << 0) | (1 << 2), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI] = { |
||||||
|
.agent = (1 << 0), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8536) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI] = { |
||||||
|
.agent = (1 << 6), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 5), |
||||||
|
.cfg = (1 << 2) | (1 << 3) | (1 << 5) | (1 << 7), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_2] = { |
||||||
|
.agent = (1 << 3), |
||||||
|
.cfg = (1 << 5) | (1 << 7), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_3] = { |
||||||
|
.agent = (1 << 1), |
||||||
|
.cfg = (1 << 7), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8544) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI] = { |
||||||
|
.agent = (1 << 6), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 5), |
||||||
|
.cfg = (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | |
||||||
|
(1 << 6) | (1 << 7), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_2] = { |
||||||
|
.agent = (1 << 3), |
||||||
|
.cfg = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_3] = { |
||||||
|
.agent = (1 << 1), |
||||||
|
.cfg = (1 << 6) | (1 << 7), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8548) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI_1] = { |
||||||
|
.agent = (1 << 4) | (1 << 6), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCI_2] = { |
||||||
|
.agent = (1 << 4) | (1 << 6), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
/* PCI_2 is always host and we dont use iosel to determine enable/disable */ |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 2), |
||||||
|
.cfg = (1 << 3) | (1 << 4) | (1 << 7), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8568) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI] = { |
||||||
|
.agent = (1 << 0) | (1 << 4) | (1 << 6), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 2) | (1 << 4), |
||||||
|
.cfg = (1 << 3) | (1 << 4) | (1 << 7), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8569) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 6), |
||||||
|
.cfg = (1 << 0) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | |
||||||
|
(1 << 8) | (1 << 0xc) | (1 << 0xf), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8572) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5), |
||||||
|
.cfg = (1 << 2) | (1 << 3) | (1 << 7) | |
||||||
|
(1 << 0xb) | (1 << 0xc) | (1 << 0xf), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_2] = { |
||||||
|
.agent = (1 << 0) | (1 << 2) | (1 << 4) | (1 << 6), |
||||||
|
.cfg = (1 << 3) | (1 << 7), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_3] = { |
||||||
|
.agent = (1 << 0) | (1 << 3) | (1 << 5) | (1 << 6), |
||||||
|
.cfg = (1 << 7), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8610) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCI_1] = { |
||||||
|
.agent = (1 << 4) | (1 << 5) | (1 << 6), |
||||||
|
.cfg = 0, |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 2) | (1 << 5), |
||||||
|
.cfg = (1 << 1) | (1 << 4), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_2] = { |
||||||
|
.agent = (1 << 0) | (1 << 1) | (1 << 4), |
||||||
|
.cfg = (1 << 0) | (1 << 4), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_MPC8641) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = 0, /* we dont use agent on 8641 */ |
||||||
|
.cfg = (1 << 2) | (1 << 3) | (1 << 5) | (1 << 6) | |
||||||
|
(1 << 7) | (1 << 0xe) | (1 << 0xf), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_P1011) || defined(CONFIG_P1020) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 1), |
||||||
|
.cfg = (1 << 0) | (1 << 6) | (1 << 0xe) | (1 << 0xf), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_2] = { |
||||||
|
.agent = (1 << 0) | (1 << 2), |
||||||
|
.cfg = (1 << 0xe), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#elif defined(CONFIG_P2010) || defined(CONFIG_P2020) |
||||||
|
static struct pci_info pci_config_info[] = |
||||||
|
{ |
||||||
|
[LAW_TRGT_IF_PCIE_1] = { |
||||||
|
.agent = (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5), |
||||||
|
.cfg = (1 << 0) | (1 << 2) | (1 << 4) | (1 << 6) | |
||||||
|
(1 << 0xd) | (1 << 0xe) | (1 << 0xf), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_2] = { |
||||||
|
.agent = (1 << 0) | (1 << 2) | (1 << 4) | (1 << 6), |
||||||
|
.cfg = (1 << 2) | (1 << 0xe), |
||||||
|
}, |
||||||
|
[LAW_TRGT_IF_PCIE_3] = { |
||||||
|
.agent = (1 << 0) | (1 << 3) | (1 << 5) | (1 << 6), |
||||||
|
.cfg = (1 << 2) | (1 << 4), |
||||||
|
}, |
||||||
|
}; |
||||||
|
#else |
||||||
|
#error Need to define pci_config_info for processor |
||||||
|
#endif |
||||||
|
|
||||||
|
int is_fsl_pci_agent(enum law_trgt_if trgt, u32 host_agent) |
||||||
|
{ |
||||||
|
return ((1 << host_agent) & pci_config_info[trgt].agent); |
||||||
|
} |
||||||
|
|
||||||
|
int is_fsl_pci_cfg(enum law_trgt_if trgt, u32 io_sel) |
||||||
|
{ |
||||||
|
return ((1 << io_sel) & pci_config_info[trgt].cfg); |
||||||
|
} |
Loading…
Reference in new issue