summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/powermac
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2010-10-30 23:09:56 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2010-10-30 23:09:56 +0000
commit21a8f93615618fc67c96c22c959dacf4e044330f (patch)
tree30bb5f5aacfe034f670366dbda7641e0170ef121 /sys/powerpc/powermac
parentecfb41d217524c5063edf0b482d8a603a030456e (diff)
downloadFreeBSD-src-21a8f93615618fc67c96c22c959dacf4e044330f.zip
FreeBSD-src-21a8f93615618fc67c96c22c959dacf4e044330f.tar.gz
Allow access to the HT I/O port space on the IBM CPC9X5 northbridge chips.
MFC after: 2 weeks
Diffstat (limited to 'sys/powerpc/powermac')
-rw-r--r--sys/powerpc/powermac/cpcht.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/sys/powerpc/powermac/cpcht.c b/sys/powerpc/powermac/cpcht.c
index 3af4d60..ab5c870 100644
--- a/sys/powerpc/powermac/cpcht.c
+++ b/sys/powerpc/powermac/cpcht.c
@@ -162,6 +162,7 @@ struct cpcht_softc {
vm_offset_t sc_data;
uint64_t sc_populated_slots;
struct rman sc_mem_rman;
+ struct rman sc_io_rman;
struct cpcht_irq htirq_map[128];
struct mtx htirq_mtx;
@@ -177,6 +178,9 @@ static devclass_t cpcht_devclass;
DRIVER_MODULE(cpcht, nexus, cpcht_driver, cpcht_devclass, 0, 0);
+#define CPCHT_IOPORT_BASE 0xf4000000UL /* Hardwired */
+#define CPCHT_IOPORT_SIZE 0x00400000UL
+
#define HTAPIC_REQUEST_EOI 0x20
#define HTAPIC_TRIGGER_LEVEL 0x02
#define HTAPIC_MASK 0x01
@@ -236,7 +240,14 @@ cpcht_attach(device_t dev)
sc->sc_mem_rman.rm_type = RMAN_ARRAY;
sc->sc_mem_rman.rm_descr = "CPCHT Device Memory";
error = rman_init(&sc->sc_mem_rman);
+ if (error) {
+ device_printf(dev, "rman_init() failed. error = %d\n", error);
+ return (error);
+ }
+ sc->sc_io_rman.rm_type = RMAN_ARRAY;
+ sc->sc_io_rman.rm_descr = "CPCHT I/O Memory";
+ error = rman_init(&sc->sc_io_rman);
if (error) {
device_printf(dev, "rman_init() failed. error = %d\n", error);
return (error);
@@ -248,6 +259,9 @@ cpcht_attach(device_t dev)
* where we get the HT interrupts properties.
*/
+ /* I/O port mappings are usually not in the device tree */
+ rman_manage_region(&sc->sc_io_rman, 0, CPCHT_IOPORT_SIZE - 1);
+
bzero(sc->htirq_map, sizeof(sc->htirq_map));
mtx_init(&sc->htirq_mtx, "cpcht irq", NULL, MTX_DEF);
for (i = 0; i < 8; i++)
@@ -299,6 +313,9 @@ cpcht_configure_htbridge(device_t dev, phandle_t child)
case OFW_PCI_PHYS_HI_SPACE_CONFIG:
break;
case OFW_PCI_PHYS_HI_SPACE_IO:
+ rman_manage_region(&sc->sc_io_rman, rp->pci_lo,
+ rp->pci_lo + rp->size_lo - 1);
+ break;
case OFW_PCI_PHYS_HI_SPACE_MEM32:
rman_manage_region(&sc->sc_mem_rman, rp->pci_lo,
rp->pci_lo + rp->size_lo - 1);
@@ -507,8 +524,9 @@ cpcht_alloc_resource(device_t bus, device_t child, int type, int *rid,
switch (type) {
case SYS_RES_IOPORT:
end = min(end, start + count);
+ rm = &sc->sc_io_rman;
+ break;
- /* FALLTHROUGH */
case SYS_RES_MEMORY:
rm = &sc->sc_mem_rman;
break;
@@ -562,6 +580,9 @@ cpcht_activate_resource(device_t bus, device_t child, int type, int rid,
start = (vm_offset_t)rman_get_start(res);
+ if (type == SYS_RES_IOPORT)
+ start += CPCHT_IOPORT_BASE;
+
if (bootverbose)
printf("cpcht mapdev: start %zx, len %ld\n", start,
rman_get_size(res));
OpenPOWER on IntegriCloud