Module Name: src Committed By: tsutsui Date: Mon Sep 23 16:41:57 UTC 2013
Modified Files: src/sys/arch/alpha/alpha: cpuconf.c src/sys/arch/alpha/pci: tsc.c tsp_dma.c tsreg.h tsvar.h Log Message: Add support for AlphaStation DS15. Ported from OpenBSD via PR port-alpha/48148 by nullnilaki. Note support for the secondary PCI bus still needs more improvements. To generate a diff of this commit: cvs rdiff -u -r1.35 -r1.36 src/sys/arch/alpha/alpha/cpuconf.c cvs rdiff -u -r1.19 -r1.20 src/sys/arch/alpha/pci/tsc.c cvs rdiff -u -r1.12 -r1.13 src/sys/arch/alpha/pci/tsp_dma.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/alpha/pci/tsreg.h cvs rdiff -u -r1.10 -r1.11 src/sys/arch/alpha/pci/tsvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/alpha/alpha/cpuconf.c diff -u src/sys/arch/alpha/alpha/cpuconf.c:1.35 src/sys/arch/alpha/alpha/cpuconf.c:1.36 --- src/sys/arch/alpha/alpha/cpuconf.c:1.35 Mon Feb 6 02:14:10 2012 +++ src/sys/arch/alpha/alpha/cpuconf.c Mon Sep 23 16:41:56 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuconf.c,v 1.35 2012/02/06 02:14:10 matt Exp $ */ +/* $NetBSD: cpuconf.c,v 1.36 2013/09/23 16:41:56 tsutsui Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpuconf.c,v 1.35 2012/02/06 02:14:10 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpuconf.c,v 1.36 2013/09/23 16:41:56 tsutsui Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -233,6 +233,7 @@ static const struct cpuinit cpuinit[] = cpu_notsupp(ST_DEC_EV56_PBP, "EV56 Passive Backplane Board"), cpu_notsupp(ST_DEC_ALPHAVME_320, "AlphaVME 320"), cpu_init(ST_DEC_6600, dec_6600_init, "DEC_6600"), + cpu_init(ST_DEC_TITAN, dec_6600_init, "DEC_6600"), cpu_init(ST_API_NAUTILUS, api_up1000_init, "API_UP1000"), }; static const int ncpuinit = (sizeof(cpuinit) / sizeof(cpuinit[0])); Index: src/sys/arch/alpha/pci/tsc.c diff -u src/sys/arch/alpha/pci/tsc.c:1.19 src/sys/arch/alpha/pci/tsc.c:1.20 --- src/sys/arch/alpha/pci/tsc.c:1.19 Tue May 17 17:34:47 2011 +++ src/sys/arch/alpha/pci/tsc.c Mon Sep 23 16:41:57 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tsc.c,v 1.19 2011/05/17 17:34:47 dyoung Exp $ */ +/* $NetBSD: tsc.c,v 1.20 2013/09/23 16:41:57 tsutsui Exp $ */ /*- * Copyright (c) 1999 by Ross Harvey. All rights reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tsc.c,v 1.19 2011/05/17 17:34:47 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tsc.c,v 1.20 2013/09/23 16:41:57 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -66,7 +66,7 @@ CFATTACH_DECL_NEW(tsc, 0, tscmatch, tsca extern struct cfdriver tsc_cd; -struct tsp_config tsp_configuration[2]; +struct tsp_config tsp_configuration[4]; static int tscprint(void *, const char *pnp); @@ -91,9 +91,13 @@ tscmatch(device_t parent, cfdata_t match { struct mainbus_attach_args *ma = aux; - return cputype == ST_DEC_6600 - && strcmp(ma->ma_name, tsc_cd.cd_name) == 0 - && !tscfound; + switch (cputype) { + case ST_DEC_6600: + case ST_DEC_TITAN: + return strcmp(ma->ma_name, tsc_cd.cd_name) == 0 && !tscfound; + default: + return 0; + } } static void @@ -104,15 +108,16 @@ tscattach(device_t parent, device_t self uint64_t csc, aar; struct tsp_attach_args tsp; struct mainbus_attach_args *ma = aux; + int titan = cputype == ST_DEC_TITAN; tscfound = 1; csc = LDQP(TS_C_CSC); nbus = 1 + (CSC_BC(csc) >= 2); - printf(": 21272 Core Logic Chipset, Cchip rev %d\n" + printf(": 2127%c Core Logic Chipset, Cchip rev %d\n" "%s%d: %c Dchips, %d memory bus%s of %d bytes\n", - (int)MISC_REV(LDQP(TS_C_MISC)), + titan ? '4' : '2', (int)MISC_REV(LDQP(TS_C_MISC)), ma->ma_name, ma->ma_slot, "2448"[CSC_BC(csc)], nbus, nbus > 1 ? "es" : "", 16 + 16 * ((csc & CSC_AW) != 0)); printf("%s%d: arrays present: ", ma->ma_name, ma->ma_slot); @@ -125,11 +130,21 @@ tscattach(device_t parent, device_t self memset(&tsp, 0, sizeof tsp); tsp.tsp_name = "tsp"; - config_found(self, &tsp, NULL); + tsp.tsp_slot = 0; + + config_found(self, &tsp, tscprint); + if (titan) { + tsp.tsp_slot += 2; + config_found(self, &tsp, tscprint); + } - if(LDQP(TS_C_CSC) & CSC_P1P) { - ++tsp.tsp_slot; + if (csc & CSC_P1P) { + tsp.tsp_slot = 1; config_found(self, &tsp, tscprint); + if (titan) { + tsp.tsp_slot += 2; + config_found(self, &tsp, tscprint); + } } } @@ -150,8 +165,13 @@ tspmatch(device_t parent, cfdata_t match { struct tsp_attach_args *t = aux; - return cputype == ST_DEC_6600 - && strcmp(t->tsp_name, tsp_cd.cd_name) == 0; + switch (cputype) { + case ST_DEC_6600: + case ST_DEC_TITAN: + return strcmp(t->tsp_name, tsp_cd.cd_name) == 0; + default: + return 0; + } } static void @@ -193,12 +213,24 @@ tsp_init(int mallocsafe, int n) /* n: Pchip number */ { struct tsp_config *pcp; + int titan = cputype == ST_DEC_TITAN; - KASSERT((n | 1) == 1); + KASSERT(n >= 0 && n < __arraycount(tsp_configuration)); pcp = &tsp_configuration[n]; pcp->pc_pslot = n; pcp->pc_iobase = TS_Pn(n, 0); - pcp->pc_csr = S_PAGE(TS_Pn(n, P_CSRBASE)); + pcp->pc_csr = S_PAGE(TS_Pn(n & 1, P_CSRBASE)); + if (n & 2) { + /* `A' port of PA Chip */ + pcp->pc_csr++; + } + if (titan) { + /* same address on G and A ports */ + pcp->pc_tlbia = &pcp->pc_csr->port.g.tsp_tlbia.tsg_r; + } else { + pcp->pc_tlbia = &pcp->pc_csr->port.p.tsp_tlbia.tsg_r; + } + if (!pcp->pc_initted) { tsp_bus_io_init(&pcp->pc_iot, pcp); tsp_bus_mem_init(&pcp->pc_memt, pcp); Index: src/sys/arch/alpha/pci/tsp_dma.c diff -u src/sys/arch/alpha/pci/tsp_dma.c:1.12 src/sys/arch/alpha/pci/tsp_dma.c:1.13 --- src/sys/arch/alpha/pci/tsp_dma.c:1.12 Mon Feb 6 02:14:15 2012 +++ src/sys/arch/alpha/pci/tsp_dma.c Mon Sep 23 16:41:57 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tsp_dma.c,v 1.12 2012/02/06 02:14:15 matt Exp $ */ +/* $NetBSD: tsp_dma.c,v 1.13 2013/09/23 16:41:57 tsutsui Exp $ */ /*- * Copyright (c) 1999 by Ross Harvey. All rights reserved. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tsp_dma.c,v 1.12 2012/02/06 02:14:15 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tsp_dma.c,v 1.13 2013/09/23 16:41:57 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -118,10 +118,10 @@ tsp_dma_init(struct tsp_config *pcp) static struct map_expected { uint32_t base, mask, enables; } premap[4] = { - { 0x800000, 0x700000, WSBA_ENA | WSBA_SG }, - { 0x80000000 | WSBA_ENA, 0x3ff00000, WSBA_ENA }, - { 0, 0 }, - { 0, 0 } + { 0x00800000, 0x00700000, WSBA_ENA | WSBA_SG }, + { 0x80000000, 0x3ff00000, WSBA_ENA }, + { 0, 0, 0 }, + { 0, 0, 0 } }; alpha_mb(); @@ -207,6 +207,14 @@ tsp_dma_init(struct tsp_config *pcp) alpha_mb(); /* + * Enable window 1 in direct mode. + */ + alpha_mb(); + pccsr->tsp_wsba[1].tsg_r = + (pccsr->tsp_wsba[1].tsg_r & ~WSBA_SG) | WSBA_ENA; + alpha_mb(); + + /* * Check windows for sanity, especially if we later decide to * use the firmware's initialization in some cases. */ @@ -354,6 +362,6 @@ tsp_tlb_invalidate(struct tsp_config *pc { alpha_mb(); - pcp->pc_csr->tsp_tlbia.tsg_r = 0; + *pcp->pc_tlbia = 0; alpha_mb(); } Index: src/sys/arch/alpha/pci/tsreg.h diff -u src/sys/arch/alpha/pci/tsreg.h:1.5 src/sys/arch/alpha/pci/tsreg.h:1.6 --- src/sys/arch/alpha/pci/tsreg.h:1.5 Mon Feb 6 02:14:15 2012 +++ src/sys/arch/alpha/pci/tsreg.h Mon Sep 23 16:41:57 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tsreg.h,v 1.5 2012/02/06 02:14:15 matt Exp $ */ +/* $NetBSD: tsreg.h,v 1.6 2013/09/23 16:41:57 tsutsui Exp $ */ /*- * Copyright (c) 1999 by Ross Harvey. All rights reserved. @@ -186,7 +186,7 @@ */ #define P_CSRBASE 0x001##8000##0000UL -#define P_PCI_MEM 0 +#define P_PCI_MEM 0x800##0000##0000UL #define P_PCI_IO 0x001##fc00##0000UL #define P_PCI_CONFIG 0x001##fe00##0000UL @@ -209,15 +209,7 @@ typedef struct _ts_gr { /* * Tsunami Pchip */ -struct ts_pchip { - TS_GR tsp_wsba[4]; /* Window Space Base Address */ - - TS_GR tsp_wsm[4]; /* Window Space Mask */ - - TS_GR tsp_tba[4]; /* Translated Base Address */ - - TS_GR tsp_pctl; /* Pchip Control */ - TS_GR tsp_plat; /* Pchip Latency */ +struct ts_pport { TS_GR tsp_resA; TS_GR tsp_error; /* Pchip Error */ @@ -232,6 +224,56 @@ struct ts_pchip { TS_GR tsp_resC; TS_GR tsp_resD_K[8]; +}; + +struct ts_gport { + TS_GR tsp_resA[2]; + TS_GR tsp_serror; + TS_GR tsp_serrmask; + TS_GR tsp_serrset; + TS_GR tsp_resB; + TS_GR tsp_gperrmask; + TS_GR tsp_gperren; + TS_GR tsp_gperrset; + TS_GR tsp_resC; + TS_GR tsp_tlbiv; + TS_GR tsp_tlbia; + TS_GR tsp_resD[2]; + TS_GR tsp_sctl; + TS_GR tsp_resE[3]; +}; + +struct ts_aport { + TS_GR tsp_resA[2]; + TS_GR tsp_agperror; + TS_GR tsp_agperrmask; + TS_GR tsp_agperrset; + TS_GR tsp_agplastwr; + TS_GR tsp_aperror; + TS_GR tsp_aperrmask; + TS_GR tsp_aperrset; + TS_GR tsp_resB; + TS_GR tsp_tlbiv; + TS_GR tsp_tlbia; + TS_GR tsp_resC[6]; +}; + +struct ts_pchip { + TS_GR tsp_wsba[4]; /* Window Space Base Address */ + + TS_GR tsp_wsm[4]; /* Window Space Mask */ + + TS_GR tsp_tba[4]; /* Translated Base Address */ + + TS_GR tsp_pctl; /* Pchip Control */ + TS_GR tsp_plat; /* Pchip Latency */ + + union { + struct ts_pport p; + struct ts_gport g; + struct ts_aport a; + } port; TS_GR tsp_sprts; /* ??? */ + TS_GR tsp_res[31]; }; Index: src/sys/arch/alpha/pci/tsvar.h diff -u src/sys/arch/alpha/pci/tsvar.h:1.10 src/sys/arch/alpha/pci/tsvar.h:1.11 --- src/sys/arch/alpha/pci/tsvar.h:1.10 Mon Feb 6 02:14:15 2012 +++ src/sys/arch/alpha/pci/tsvar.h Mon Sep 23 16:41:57 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tsvar.h,v 1.10 2012/02/06 02:14:15 matt Exp $ */ +/* $NetBSD: tsvar.h,v 1.11 2013/09/23 16:41:57 tsutsui Exp $ */ /*- * Copyright (c) 1999 by Ross Harvey. All rights reserved. @@ -44,6 +44,7 @@ struct tsp_config { int pc_initted; /* Initialized */ uint64_t pc_iobase; /* All Pchip space starts here */ struct ts_pchip *pc_csr; /* Pchip CSR space starts here */ + volatile uint64_t *pc_tlbia; /* Pchip TLBIA register address */ struct alpha_bus_space pc_iot, pc_memt; struct alpha_pci_chipset pc_pc;