Skip to content

Commit 5bf453d

Browse files
committed
arm: improve imxpcibr so that we finally have PCI
Lots of various kinds of changes to improve the driver. Add a hook into arm's fault code, so that we can tell it to ignore the abort caused by the PCIe controller.
1 parent f9fbb16 commit 5bf453d

File tree

9 files changed

+571
-59
lines changed

9 files changed

+571
-59
lines changed

sys/arch/arm/arm/fault.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,10 @@ static int dab_align(trapframe_t *, u_int, u_int, struct proc *,
132132
struct sigdata *sd);
133133
static int dab_buserr(trapframe_t *, u_int, u_int, struct proc *,
134134
struct sigdata *sd);
135+
void data_fault_hook(int code, int (*func)(trapframe_t *, u_int, u_int,
136+
struct proc *, struct sigdata *));
135137

136-
static const struct data_abort data_aborts[] = {
138+
static struct data_abort data_aborts[] = {
137139
{dab_fatal, "V7 fault 00000"},
138140
{dab_align, "Alignment Fault 1"},
139141
{dab_fatal, "Debug Event"},
@@ -370,6 +372,15 @@ data_abort_handler(trapframe_t *tf)
370372
userret(p);
371373
}
372374

375+
void
376+
data_fault_hook(int code, int (*func)(trapframe_t *, u_int, u_int,
377+
struct proc *, struct sigdata *))
378+
{
379+
if (code >= nitems(data_aborts))
380+
return;
381+
data_aborts[code].func = func;
382+
}
383+
373384
/*
374385
* dab_fatal() handles the following data aborts:
375386
*

sys/arch/armv7/conf/generic.imx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,12 @@ imxuart* at fdt? # onboard uarts
2222
imxiic* at imx? # i2c
2323
imxiic* at fdt? # i2c
2424

25-
#imxpcibr* at imx? # PCIe controller host bridge
26-
#pci* at imxpcibr?
25+
imxpcibr* at imx? # PCIe controller host bridge
26+
pci* at imxpcibr?
27+
ppb* at pci? # PCI-PCI bridges
28+
pci* at ppb?
29+
em* at pci?
30+
iwn* at pci?
2731

2832
imxahci* at imx? # AHCI/SATA
2933
ahci* at imxahci? # AHCI/SATA

sys/arch/armv7/imx/files.imx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ attach maxgpio at i2c
8484
file arch/armv7/imx/maxim7301.c maxgpio
8585

8686
# PCI
87-
#include "dev/pci/files.pci"
87+
include "dev/pci/files.pci"
8888

89-
#device imxpcibr {} : pcibus
90-
#attach imxpcibr at imx
91-
#file arch/armv7/imx/imxpcibr.c imxpcibr
89+
device imxpcibr {} : pcibus
90+
attach imxpcibr at imx
91+
file arch/armv7/imx/imxpcibr.c imxpcibr

sys/arch/armv7/imx/imx.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ struct board_dev sabrelite_devs[] = {
9191
{ "imxgpio", 4 },
9292
{ "imxgpio", 5 },
9393
{ "imxgpio", 6 },
94+
{ "imxpcibr", 0 },
9495
{ "imxesdhc", 2 },
9596
{ "imxesdhc", 3 },
9697
{ "imxehci", 0 },
@@ -136,6 +137,7 @@ struct board_dev utilite_devs[] = {
136137
{ "imxgpio", 5 },
137138
{ "imxgpio", 6 },
138139
{ "imxiic", 2 },
140+
{ "imxpcibr", 0 },
139141
{ "imxesdhc", 2 },
140142
{ "imxehci", 0 },
141143
{ "imxenet", 0 },

sys/arch/armv7/imx/imx6.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@
143143
#define PCIE_REG_SIZE 0x4000
144144
#define PCIE_MAP_ADDR 0x01000000
145145
#define PCIE_MAP_SIZE 0xffc000
146+
#define PCIE_IO_ADDR 0x01f80000
147+
#define PCIE_IO_SIZE 0x00010000
148+
#define PCIE_MEM_ADDR 0x01000000
149+
#define PCIE_MEM_SIZE 0x00f00000
146150

147151
#define PCIE_IRQ0 120
148152
#define PCIE_IRQ1 121
@@ -360,7 +364,8 @@ struct armv7_dev imx6_devs[] = {
360364
.unit = 0,
361365
.mem = {
362366
{ PCIE_REG_ADDR, PCIE_REG_SIZE },
363-
{ PCIE_MAP_ADDR, PCIE_MAP_SIZE },
367+
{ PCIE_IO_ADDR, PCIE_IO_SIZE },
368+
{ PCIE_MEM_ADDR, PCIE_MEM_SIZE },
364369
},
365370
.irq = { PCIE_IRQ0, PCIE_IRQ1, PCIE_IRQ1, PCIE_IRQ2 }
366371
},

sys/arch/armv7/imx/imxccm.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,8 @@ enum clocks {
158158
};
159159

160160
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", };
161-
static const char *lvds_sels[] = { "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
162-
"pll4_audio", "pll5_video", "pll8_mlb", "enet_ref",
163-
"pcie_ref", "sata_ref", };
161+
static const char *lvds_sels[] = { "arm", "pll1_sys", "dummy", "dummy", "dummy", "dummy", "dummy",
162+
"dummy", "dummy", "dummy", "pcie_ref", "sata_ref", "usbphy1", "usbphy2", };
164163
static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", };
165164
static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy", };
166165
static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", };
@@ -346,6 +345,8 @@ imxccm_attach(struct device *parent, struct device *self, void *args)
346345

347346
/* usb */
348347
imxccm_gate2("usboh3", "ipg", CCM_CCGR6, 0);
348+
imxccm_gate("usbphy1", "pll3_usb_otg", CCM_ANALOG_PLL_USB1, 20);
349+
imxccm_gate("usbphy2", "pll7_usb_host", CCM_ANALOG_PLL_USB2, 20);
349350
imxccm_gate("usbphy1_gate", "dummy", CCM_ANALOG_PLL_USB1, 6);
350351
imxccm_gate("usbphy2_gate", "dummy", CCM_ANALOG_PLL_USB2, 6);
351352

@@ -359,12 +360,13 @@ imxccm_attach(struct device *parent, struct device *self, void *args)
359360
imxccm_gate2("pcie_axi", "pcie_axi_sel", CCM_CCGR4, 0);
360361
clk_fixed_factor("pcie_ref", "pll6_enet", 1, 4);
361362
imxccm_gate("pcie_ref_125m", "pcie_ref", CCM_ANALOG_PLL_ENET, 19);
363+
clk_set_parent(clk_get("pcie_axi_sel"), clk_get("axi"));
362364

363365
/* lvds */
364366
imxccm_mux("lvds1_sel", CCM_PMU_MISC1, 0, 5, lvds_sels, nitems(lvds_sels));
365367
imxccm_mux("lvds2_sel", CCM_PMU_MISC1, 5, 5, lvds_sels, nitems(lvds_sels));
366-
imxccm_gate("lvds1_gate", "dummy", CCM_PMU_MISC1, 10);
367-
imxccm_gate("lvds2_gate", "dummy", CCM_PMU_MISC1, 11);
368+
imxccm_gate("lvds1_out", "lvds1_sel", CCM_PMU_MISC1, 10);
369+
imxccm_gate("lvds2_out", "lvds1_sel", CCM_PMU_MISC1, 11);
368370
clk_set_parent(clk_get("lvds1_sel"), clk_get("sata_ref")); /* PCIe */
369371

370372
cpu_type = HREAD4(sc, CCM_ANALOG_DIGPROG_MX6SL);

sys/arch/armv7/imx/imxiomuxc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@
6969
#define IOMUXC_GPR12_APPS_PM_XMT_PME (1 << 9)
7070
#define IOMUXC_GPR12_APPS_LTSSM_ENABLE (1 << 10)
7171
#define IOMUXC_GPR12_APPS_INIT_RST (1 << 11)
72-
#define IOMUXC_GPR12_DEVICE_TYPE_RC (2 << 12)
73-
#define IOMUXC_GPR12_DEVICE_TYPE_MASK (3 << 12)
72+
#define IOMUXC_GPR12_DEVICE_TYPE_RC (4 << 12)
73+
#define IOMUXC_GPR12_DEVICE_TYPE_MASK (0xf << 12)
7474
#define IOMUXC_GPR12_APPS_PM_XMT_TURNOFF (1 << 16)
7575

7676
#define IOMUXC_GPR13_SATA_PHY_1_FAST_EDGE_RATE (0x00 << 0)

0 commit comments

Comments
 (0)