Module Name: src Committed By: thorpej Date: Fri Apr 30 02:11:37 UTC 2021
Modified Files: src/sys/arch/shark/conf: GENERIC files.shark src/sys/arch/shark/shark: hat.c sequoia.c sequoia.h Log Message: - Introduce sequoiaLock() / sequoiaUnlock() functions that hide away the details of what's going on (disable / restore interrupts), and use it consistently. - Give "sequoia" a device_t in the system device tree, matching on the Shark's /vlbus/isa node, acting a subclass of ofisa (an "ofisa" will be attached to "sequoia"). This allows us to attach other logical device nodes to the "sequoia". To generate a diff of this commit: cvs rdiff -u -r1.138 -r1.139 src/sys/arch/shark/conf/GENERIC cvs rdiff -u -r1.22 -r1.23 src/sys/arch/shark/conf/files.shark cvs rdiff -u -r1.6 -r1.7 src/sys/arch/shark/shark/hat.c cvs rdiff -u -r1.14 -r1.15 src/sys/arch/shark/shark/sequoia.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/shark/shark/sequoia.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/shark/conf/GENERIC diff -u src/sys/arch/shark/conf/GENERIC:1.138 src/sys/arch/shark/conf/GENERIC:1.139 --- src/sys/arch/shark/conf/GENERIC:1.138 Tue Apr 27 23:37:01 2021 +++ src/sys/arch/shark/conf/GENERIC Fri Apr 30 02:11:37 2021 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.138 2021/04/27 23:37:01 thorpej Exp $ +# $NetBSD: GENERIC,v 1.139 2021/04/30 02:11:37 thorpej Exp $ # # Generic Shark configuration. # @@ -7,7 +7,7 @@ include "arch/shark/conf/std.shark" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.138 $" +#ident "GENERIC-$Revision: 1.139 $" # estimated number of users maxusers 32 @@ -207,6 +207,10 @@ ofrom* at ofbus? ofisa* at ofbus? +# Sequoia core logic chipset +sequoia* at ofbus? +ofisa* at sequoia? + # IDE/ATA disk wdc* at ofisa? atabus* at wdc? channel ? Index: src/sys/arch/shark/conf/files.shark diff -u src/sys/arch/shark/conf/files.shark:1.22 src/sys/arch/shark/conf/files.shark:1.23 --- src/sys/arch/shark/conf/files.shark:1.22 Tue Apr 27 23:37:01 2021 +++ src/sys/arch/shark/conf/files.shark Fri Apr 30 02:11:37 2021 @@ -1,4 +1,4 @@ -# $NetBSD: files.shark,v 1.22 2021/04/27 23:37:01 thorpej Exp $ +# $NetBSD: files.shark,v 1.23 2021/04/30 02:11:37 thorpej Exp $ # # First try for arm-specific configuration info # @@ -56,6 +56,10 @@ file arch/shark/ofw/if_cs_ofisa_machdep. file arch/shark/ofw/lpt_ofisa_machdep.c lpt_ofisa | atppc_ofisa file arch/shark/ofw/wdc_ofisa_machdep.c wdc_ofisa +# Sequoia core logic chipset (ofisa attaches to this) +device sequoia { }: ofisa_subclass +attach sequoia at ofbus + # Glue for OFW ISA device attachment device ofisascr {} attach ofisascr at ofisa Index: src/sys/arch/shark/shark/hat.c diff -u src/sys/arch/shark/shark/hat.c:1.6 src/sys/arch/shark/shark/hat.c:1.7 --- src/sys/arch/shark/shark/hat.c:1.6 Wed Oct 17 19:57:10 2007 +++ src/sys/arch/shark/shark/hat.c Fri Apr 30 02:11:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: hat.c,v 1.6 2007/10/17 19:57:10 garbled Exp $ */ +/* $NetBSD: hat.c,v 1.7 2021/04/30 02:11:37 thorpej Exp $ */ /* * Copyright 1997 @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hat.c,v 1.6 2007/10/17 19:57:10 garbled Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hat.c,v 1.7 2021/04/30 02:11:37 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -88,11 +88,15 @@ hatClkOff(void) hatOn = 0; hatWedgeFn = NULL; + sequoiaLock(); + /* disable the SWTCH pin */ sequoiaRead(PMC_PMCMCR2_REG, &seqReg); sequoiaWrite(PMC_PMCMCR2_REG, seqReg | (PMCMCR2_M_SWTCHEN)); - + + sequoiaUnlock(); + /* turn off timer 2 */ outb(ATSR_REG1_REG, inb(ATSR_REG1_REG) & ~((REG1_M_TMR2EN) | (REG1_M_SPKREN))); @@ -135,6 +139,8 @@ hatClkOn(int count, void (*hatFn)(int), fiq_setregs(&shark_fiqregs); + sequoiaLock(); + /* no debounce on SWTCH */ sequoiaRead(PMC_DBCR_REG, &seqReg); sequoiaWrite(PMC_DBCR_REG, seqReg | DBCR_M_DBDIS0); @@ -152,6 +158,8 @@ hatClkOn(int count, void (*hatFn)(int), sequoiaRead(PMC_PMCMCR2_REG, &seqReg); sequoiaWrite(PMC_PMCMCR2_REG, seqReg | (PMCMCR2_M_SWTCHEN)); + sequoiaUnlock(); + hatOn = 1; return 0; } @@ -164,7 +172,9 @@ hatClkAdjust(int count) return -1; hatClkCount(count); + sequoiaLock(); hatEnableSWTCH(); + sequoiaUnlock(); return 0; } @@ -174,6 +184,8 @@ hatEnableSWTCH(void) { u_int16_t seqReg; + KASSERT(sequoiaIsLocked()); + /* SWTCH input causes PMI, not automatic switch to standby mode! */ /* clearing bit 9 is bad news. seems to enable PMI from secondary activity timeout! */ @@ -195,7 +207,9 @@ hatUnwedge(void) return; if (lastFiqsHappened == fiqs_happened) { + sequoiaLock(); hatEnableSWTCH(); + sequoiaUnlock(); if (hatWedgeFn) (*hatWedgeFn)(fiqs_happened); } else { @@ -216,4 +230,3 @@ hatClkCount(int count) restore_interrupts(savedints); } - Index: src/sys/arch/shark/shark/sequoia.c diff -u src/sys/arch/shark/shark/sequoia.c:1.14 src/sys/arch/shark/shark/sequoia.c:1.15 --- src/sys/arch/shark/shark/sequoia.c:1.14 Thu Oct 20 09:53:08 2016 +++ src/sys/arch/shark/shark/sequoia.c Fri Apr 30 02:11:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: sequoia.c,v 1.14 2016/10/20 09:53:08 skrll Exp $ */ +/* $NetBSD: sequoia.c,v 1.15 2021/04/30 02:11:37 thorpej Exp $ */ /* * Copyright 1997 @@ -40,27 +40,28 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sequoia.c,v 1.14 2016/10/20 09:53:08 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sequoia.c,v 1.15 2021/04/30 02:11:37 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/callout.h> +#include <sys/device.h> #include <sys/syslog.h> #include <sys/types.h> #include <sys/bus.h> #include <sys/time.h> #include <sys/kernel.h> - #include <dev/isa/isareg.h> +#include <dev/ofisa/ofisavar.h> #include <machine/isa_machdep.h> #include <shark/shark/sequoia.h> #include <shark/shark/shark_fiq.h> #include <arm/cpufunc.h> - - +#include <dev/ofw/openfirm.h> + /* ** @@ -135,6 +136,9 @@ int sequoia_index_cache = -1; /* s static callout_t led_timo_ch; +static u_int sequoiaLock_savedints; +static bool sequoiaLock_held; + /* ** ** FUNCITONAL PROTOTYPES @@ -152,14 +156,14 @@ void sequoiaInit(void) { u_int16_t seqReg; - callout_init(&led_timo_ch, 0); - - /* map the sequoi registers */ + /* map the sequoia registers */ if (bus_space_map(&isa_io_bs_tag, SEQUOIA_BASE, SEQUOIA_NPORTS, 0, &sequoia_ioh)) { panic("SequoiaInit: io mapping failed"); } + sequoiaLock(); + /* ** ** setup the pins associated with the X server @@ -191,13 +195,7 @@ void sequoiaInit(void) CLR(seqReg,LED_DEBUG_GREEN_BIT); sequoiaWrite(PMC_FOMPCR_REG, seqReg); - - /* setup the biled info */ - ledColor = LED_BILED_GREEN; - ledLastActive.tv_usec = 0; - ledLastActive.tv_sec = 0; - ledBlockCount = 0; - callout_reset(&led_timo_ch, LED_TIMEOUT, ledTimeout, NULL); + /* ** ** setup the pins associated with the smart card reader * @@ -262,11 +260,38 @@ void sequoiaInit(void) sequoiaRead(PMC_SCCR_REG, &seqReg); sequoiaWrite(PMC_SCCR_REG, seqReg | SCCR_M_PCSTGDIS); -} + sequoiaUnlock(); + /* setup the biled info */ + ledColor = LED_BILED_GREEN; + ledLastActive.tv_usec = 0; + ledLastActive.tv_sec = 0; + ledBlockCount = 0; + callout_init(&led_timo_ch, 0); + callout_reset(&led_timo_ch, LED_TIMEOUT, ledTimeout, NULL); +} +void +sequoiaLock(void) +{ + sequoiaLock_savedints = disable_interrupts(I32_bit | F32_bit); + KASSERT(!sequoiaLock_held); + sequoiaLock_held = true; +} +void +sequoiaUnlock(void) +{ + KASSERT(sequoiaLock_held); + sequoiaLock_held = false; + restore_interrupts(sequoiaLock_savedints); +} +bool +sequoiaIsLocked(void) +{ + return sequoiaLock_held; +} /* X console functions */ void consXTvOn(void) @@ -278,12 +303,15 @@ void consXTvOn(void) ** but we are currently hardwired to NTSC, so ignore it. */ + sequoiaLock(); + sequoiaRead (SEQR_SEQPSR3_REG, &savedPSR3); sequoiaWrite(SEQR_SEQPSR3_REG, (savedPSR3 | SEQPSR3_M_PC3PINEN)); sequoiaRead (PMC_FOMPCR_REG, &savedFMPCR); sequoiaWrite(PMC_FOMPCR_REG, (savedFMPCR | FOMPCR_M_PCON3)); + sequoiaUnlock(); } void consXTvOff(void) @@ -293,12 +321,16 @@ void consXTvOff(void) /* ** Switch off TV output on the Seqoia */ + + sequoiaLock(); + sequoiaRead (SEQR_SEQPSR3_REG, &savedPSR3); sequoiaWrite(SEQR_SEQPSR3_REG, (savedPSR3 & ~SEQPSR3_M_PC3PINEN)); sequoiaRead (PMC_FOMPCR_REG, &savedFMPCR); sequoiaWrite(PMC_FOMPCR_REG, (savedFMPCR & ~FOMPCR_M_PCON3)); + sequoiaUnlock(); } @@ -311,7 +343,9 @@ int scrGetDetect (void) int r; u_int16_t seqReg; + sequoiaLock(); sequoiaRead(PMC_GPIOCR2_REG,&seqReg); + sequoiaUnlock(); /* inverse logic, so invert */ if (ISSET(seqReg,SCR_DETECT)) @@ -329,11 +363,8 @@ int scrGetDetect (void) void scrSetPower (int value) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); sequoiaRead(SEQUOIA_1GPIO,&seqReg); @@ -346,19 +377,14 @@ void scrSetPower (int value) } sequoiaWrite(SEQUOIA_1GPIO,seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + sequoiaUnlock(); } void scrSetClock (int value) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); sequoiaRead(SEQUOIA_2GPIO,&seqReg); @@ -370,19 +396,15 @@ void scrSetClock (int value) CLR(seqReg,SCR_CLOCK); } sequoiaWrite(SEQUOIA_2GPIO,seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + + sequoiaUnlock(); } void scrSetReset (int value) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); sequoiaRead(SEQUOIA_1GPIO,&seqReg); @@ -395,20 +417,15 @@ void scrSetReset (int value) } sequoiaWrite(SEQUOIA_1GPIO,seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + sequoiaUnlock(); } void scrSetDataHighZ (void) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); sequoiaRead(SEQUOIA_2GPIO,&seqReg); @@ -416,19 +433,15 @@ void scrSetDataHighZ (void) CLR(seqReg,SCR_DATA_OUT); sequoiaWrite(SEQUOIA_2GPIO,seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + + sequoiaUnlock(); } void scrSetData (int value) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); sequoiaRead(SEQUOIA_2GPIO,&seqReg); /* inverse logic */ @@ -440,9 +453,8 @@ void scrSetData (int value) SET(seqReg,SCR_DATA_OUT); } sequoiaWrite(SEQUOIA_2GPIO,seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + + sequoiaUnlock(); } int scrGetData (void) @@ -450,7 +462,9 @@ int scrGetData (void) int r; u_int16_t seqReg; + sequoiaLock(); sequoiaRead(SEQUOIA_1GPIO,&seqReg); + sequoiaUnlock(); if (ISSET(seqReg,SCR_DATA_IN)) { @@ -558,13 +572,10 @@ static void ledTimeout(void *arg) static void ledSetBiled(int color) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif - ledColor = color; + sequoiaLock(); + ledColor = color; sequoiaRead (PMC_FOMPCR_REG, &seqReg); switch(color) @@ -594,9 +605,8 @@ static void ledSetBiled(int color) break; } sequoiaWrite(PMC_FOMPCR_REG, seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + + sequoiaUnlock(); } @@ -604,7 +614,9 @@ int hwGetRev(void) { u_int16_t seqReg; + sequoiaLock(); sequoiaRead(SR_POR_REG,&seqReg); + sequoiaUnlock(); seqReg = seqReg >> POR_V_MISCCF0; seqReg = seqReg & 0x7; @@ -619,11 +631,8 @@ int hwGetRev(void) /* routines to read/write to sequoia registers */ void sequoiaWrite(int reg,u_int16_t seqReg) { -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + KASSERT(sequoiaLock_held); /* On SHARK, the fiq comes from the pmi/smi. After receiving @@ -648,38 +657,27 @@ void sequoiaWrite(int reg,u_int16_t seq } bus_space_write_2(&isa_io_bs_tag,sequoia_ioh,SEQUOIA_DATA_OFFSET,seqReg); } -#ifdef SHARK - restore_interrupts(savedints); -#endif } void sequoiaRead (int reg,u_int16_t * seqReg_ptr) { -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + KASSERT(sequoiaLock_held); + if(sequoia_index_cache != reg) { sequoia_index_cache = reg; bus_space_write_2(&isa_io_bs_tag,sequoia_ioh,SEQUOIA_INDEX_OFFSET,reg); } *seqReg_ptr = bus_space_read_2(&isa_io_bs_tag,sequoia_ioh,SEQUOIA_DATA_OFFSET); -#ifdef SHARK - restore_interrupts(savedints); -#endif } - void ledSetDebug(int command) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); + sequoiaRead (PMC_FOMPCR_REG, &seqReg); @@ -726,37 +724,17 @@ void ledSetDebug(int command) break; } sequoiaWrite(PMC_FOMPCR_REG, seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif -} - -#ifdef USEFULL_DEBUG -void sequoiaOneAccess(void) -{ -u_int16_t reg; -#ifdef SHARK - u_int savedints; - - savedints = disable_interrupts(I32_bit | F32_bit); -#endif - reg = bus_space_read_2(&isa_io_bs_tag,sequoia_ioh,SEQUOIA_DATA_OFFSET); -#ifdef SHARK - restore_interrupts(savedints); -#endif + sequoiaUnlock(); } -#endif + int testPin=0; void scrToggleTestPin (void) { u_int16_t seqReg; -#ifdef SHARK - u_int savedints; - savedints = disable_interrupts(I32_bit | F32_bit); -#endif + sequoiaLock(); sequoiaRead(SEQUOIA_2GPIO,&seqReg); @@ -771,8 +749,57 @@ void scrToggleTestPin (void) testPin = 1; } sequoiaWrite(SEQUOIA_2GPIO,seqReg); -#ifdef SHARK - restore_interrupts(savedints); -#endif + + sequoiaUnlock(); +} + +static const struct device_compatible_entry compat_data[] = { + { .compat = "sequoia" }, + DEVICE_COMPAT_EOL +}; + +static int +sequoia_cfprint(void *aux, const char *pnp) +{ + struct ofbus_attach_args *oba = aux; + + if (pnp != NULL) { + aprint_normal("%s at %s", oba->oba_ofname, pnp); + } + return UNCONF; +} + +static int +sequoia_match(device_t parent, cfdata_t cf, void *aux) +{ + struct ofbus_attach_args *oba = aux; + + /* beat ofisa */ + return of_compatible_match(oba->oba_phandle, compat_data) ? 100 : 0; +} + +static void +sequoia_attach(device_t parent, device_t self, void *aux) +{ + const struct ofbus_attach_args *oba = aux; + struct ofbus_attach_args noba = *oba; + + aprint_naive("\n"); + aprint_normal("\n"); + + noba.oba_busname = "sequoia"; + + /* attach the i2c bus connected to the DRAM banks slots */ + strlcpy(noba.oba_ofname, "dec,dnard-i2c", sizeof(noba.oba_ofname)); + config_found(self, &noba, sequoia_cfprint, + CFARG_IATTR, "sequoia", + CFARG_EOL); + + /* attach the ofisa instance at the same OFW node */ + config_found(self, aux, ofisaprint, + CFARG_IATTR, "ofisa_subclass", + CFARG_EOL); } +CFATTACH_DECL_NEW(sequoia, 0, + sequoia_match, sequoia_attach, NULL, NULL); Index: src/sys/arch/shark/shark/sequoia.h diff -u src/sys/arch/shark/shark/sequoia.h:1.4 src/sys/arch/shark/shark/sequoia.h:1.5 --- src/sys/arch/shark/shark/sequoia.h:1.4 Tue Aug 22 21:23:58 2017 +++ src/sys/arch/shark/shark/sequoia.h Fri Apr 30 02:11:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: sequoia.h,v 1.4 2017/08/22 21:23:58 kre Exp $ */ +/* $NetBSD: sequoia.h,v 1.5 2021/04/30 02:11:37 thorpej Exp $ */ /* * Copyright 1997 @@ -5064,6 +5064,9 @@ #ifndef _LOCORE void sequoiaInit(void); +void sequoiaLock(void); +void sequoiaUnlock(void); +bool sequoiaIsLocked(void); /* for DIAGNOSTIC checks only */ void sequoiaWrite(int reg,u_int16_t value); void sequoiaRead(int reg,u_int16_t * value_ptr); @@ -5084,7 +5087,6 @@ int scrGetData(void); /* just used to debug scr - remove when done - ejg */ void scrToggleTestPin(void); -void sequoiaOneAccess(void); /* biled functions */ @@ -5112,19 +5114,7 @@ int hwGetRev(void); void ledSetDebug(int command); - - - - #endif /* _LOCORE */ #endif /* __LANGUAGE_ASM__ */ #endif /* SEQUOIAH */ - - - - - - - -