summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorjchandra <jchandra@FreeBSD.org>2012-03-27 15:43:32 +0000
committerjchandra <jchandra@FreeBSD.org>2012-03-27 15:43:32 +0000
commit8374f236814d5ef93c9f23e693bbfefe101fda8a (patch)
tree01d441b63142e58452c5c90af8d0aae8ac45129a /sys/mips
parent0ec682f566a00ee76a1d9e94fbd5b107c577e78e (diff)
downloadFreeBSD-src-8374f236814d5ef93c9f23e693bbfefe101fda8a.zip
FreeBSD-src-8374f236814d5ef93c9f23e693bbfefe101fda8a.tar.gz
Resource allocation for XLP SoC SDHCI slots
The on-chip SD slots do not have PCI BARs corresponding to them, so this has to be handled in the custom SoC memory allocation. Provide memory resource for rids corresponding to BAR 0 and 1 in the custom allocation code.
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/conf/std.XLP5
-rw-r--r--sys/mips/nlm/xlp_pci.c16
2 files changed, 21 insertions, 0 deletions
diff --git a/sys/mips/conf/std.XLP b/sys/mips/conf/std.XLP
index ce71e36..5f7b7ad 100644
--- a/sys/mips/conf/std.XLP
+++ b/sys/mips/conf/std.XLP
@@ -110,3 +110,8 @@ options GEOM_ELI
# NOR
device cfi
device cfid
+
+# MMC/SD
+device mmc # MMC/SD bus
+device mmcsd # MMC/SD memory card
+device sdhci # Generic PCI SD Host Controller
diff --git a/sys/mips/nlm/xlp_pci.c b/sys/mips/nlm/xlp_pci.c
index ef0f4f8..4b58db1 100644
--- a/sys/mips/nlm/xlp_pci.c
+++ b/sys/mips/nlm/xlp_pci.c
@@ -165,8 +165,22 @@ xlp_pci_alloc_resource(device_t bus, device_t child, int type, int *rid,
/* no emulation for IO ports */
if (type == SYS_RES_IOPORT)
return (NULL);
+
start = xlp_devinfo->mem_res_start;
count = XLP_PCIE_CFG_SIZE - XLP_IO_PCI_HDRSZ;
+
+ /* MMC needs to 2 slots with rids 16 and 20 and a
+ * fixup for size */
+ if (pci_get_device(child) == PCI_DEVICE_ID_NLM_MMC) {
+ count = 0x100;
+ if (*rid == 16)
+ ; /* first slot already setup */
+ else if (*rid == 20)
+ start += 0x100; /* second slot */
+ else
+ return (NULL);
+ }
+
end = start + count - 1;
r = BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
type, rid, start, end, count, flags);
@@ -254,6 +268,8 @@ xlp_add_soc_child(device_t pcib, device_t dev, int b, int s, int f)
xlp_dinfo = (struct xlp_devinfo *)dinfo;
xlp_dinfo->irq = irq;
xlp_dinfo->flags = flags;
+
+ /* memory resource from ecfg space, if MEM_RES_EMUL is set */
if ((flags & MEM_RES_EMUL) != 0)
xlp_dinfo->mem_res_start = XLP_DEFAULT_IO_BASE + devoffset +
XLP_IO_PCI_HDRSZ;
OpenPOWER on IntegriCloud