/* * Copyright (C) 1996 Paul Mackerras. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include static volatile unsigned char *sccc, *sccd; unsigned int TXRDY, RXRDY, DLAB; static int xmon_expect(const char *str, unsigned int timeout); static int via_modem; #define TB_SPEED 25000000 static inline unsigned int readtb(void) { unsigned int ret; asm volatile("mftb %0" : "=r" (ret) :); return ret; } void buf_access(void) { if (DLAB) sccd[3] &= ~DLAB; /* reset DLAB */ } #ifdef CONFIG_MAGIC_SYSRQ static void sysrq_handle_xmon(int key, struct pt_regs *regs, struct tty_struct *tty) { xmon(regs); } static struct sysrq_key_op sysrq_xmon_op = { .handler = sysrq_handle_xmon, .help_msg = "Xmon", .action_msg = "Entering xmon", }; #endif void xmon_map_scc(void) { #if defined(CONFIG_405GP) sccd = (volatile unsigned char *)0xef600300; #elif defined(CONFIG_440EP) sccd = (volatile unsigned char *) ioremap(PPC440EP_UART0_ADDR, 8); #elif defined(CONFIG_440SP) sccd = (volatile unsigned char *) ioremap64(PPC440SP_UART0_ADDR, 8); #elif defined(CONFIG_440SPE) sccd = (volatile unsigned char *) ioremap64(PPC440SPE_UART0_ADDR, 8); #elif defined(CONFIG_44x) /* This is the default for 44x platforms. Any boards that have a different UART address need to be put in cases before this or the port will be mapped incorrectly */ sccd = (volatile unsigned char *) ioremap64(PPC440GP_UART0_ADDR, 8); #endif /* platform */ #ifndef CONFIG_PPC_PREP sccc = sccd + 5; TXRDY = 0x20; RXRDY = 1; DLAB = 0x80; #endif register_sysrq_key('x', &sysrq_xmon_op); } static int scc_initialized; void xmon_init_scc(void); int xmon_write(void *handle, void *ptr, int nb) { char *p = ptr; int i, c, ct; #ifdef CONFIG_SMP static unsigned long xmon_write_lock; int lock_wait = 1000000; int locked; while ((locked = test_and_set_bit(0, &xmon_write_lock)) != 0) if (--lock_wait == 0) break; #endif if (!scc_initialized) xmon_init_scc(); ct = 0; for (i = 0; i < nb; ++i) { while ((*sccc & TXRDY) == 0) ; c = p[i]; if (c == '\n' && !ct) { c = '\r'; ct = 1; --i; } else { ct = 0; } buf_access(); *sccd = c; eieio(); } #ifdef CONFIG_SMP if (!locked) clear_bit(0, &xmon_write_lock); #endif return nb; } int xmon_wants_key; int xmon_read(void *handle, void *ptr, int nb) { char *p = ptr; int i; if (!scc_initialized) xmon_init_scc(); for (i = 0; i < nb; ++i) { while ((*sccc & RXRDY) == 0) ; buf_access(); *p++ = *sccd; } return i; } int xmon_read_poll(void) { if ((*sccc & RXRDY) == 0) { ; return -1; } buf_access(); return *sccd; } void xmon_init_scc(void) { scc_initialized = 1; if (via_modem) { for (;;) { xmon_write(NULL, "ATE1V1\r", 7); if (xmon_expect("OK", 5)) { xmon_write(NULL, "ATA\r", 4); if (xmon_expect("CONNECT", 40)) break; } xmon_write(NULL, "+++", 3); xmon_expect("OK", 3); } } } void *xmon_stdin; void *xmon_stdout; void *xmon_stderr; void xmon_init(int arg) { xmon_map_scc(); } int xmon_putc(int c, void *f) { char ch = c; if (c == '\n') xmon_putc('\r', f); return xmon_write(f, &ch, 1) == 1? c: -1; } int xmon_putchar(int c) { return xmon_putc(c, xmon_stdout); } int xmon_fputs(char *str, void *f) { int n = strlen(str); return xmon_write(f, str, n) == n? 0: -1; } int xmon_readchar(void) { char ch; for (;;) { switch (xmon_read(xmon_stdin, &ch, 1)) { case 1: return ch; case -1: xmon_printf("read(stdin) returned -1\r\n", 0, 0); return -1; } } } static char line[256]; static char *lineptr; static int lineleft; int xmon_expect(const char *str, unsigned int timeout) { int c; unsigned int t0; timeout *= TB_SPEED; t0 = readtb(); do { lineptr = line; for (;;) { c = xmon_read_poll(); if (c == -1) { if (readtb() - t0 > timeout) return 0; continue; } if (c == '\n') break; if (c != '\r' && lineptr < &line[sizeof(line) - 1]) *lineptr++ = c; } *lineptr = 0; } while (strstr(line, str) == NULL); return 1; } int xmon_getchar(void) { int c; if (lineleft == 0) { lineptr = line; for (;;) { c = xmon_readchar(); if (c == -1 || c == 4) break; if (c == '\r' || c == '\n') { *lineptr++ = '\n'; xmon_putchar('\n'); break; } switch (c) { case 0177: case '\b': if (lineptr > line) { xmon_putchar('\b'); xmon_putchar(' '); xmon_putchar('\b'); --lineptr; } break; case 'U' & 0x1F: while (lineptr > line) { xmon_putchar('\b'); xmon_putchar(' '); xmon_putchar('\b'); --lineptr; } break; default: if (lineptr >= &line[sizeof(line) - 1]) xmon_putchar('\a'); else { xmon_putchar(c); *lineptr++ = c; } } } lineleft = lineptr - line; lineptr = line; } if (lineleft == 0) return -1; --lineleft; return *lineptr++; } char * xmon_fgets(char *str, int nb, void *f) { char *p; int c; for (p = str; p < str + nb - 1; ) { c = xmon_getchar(); if (c == -1) { if (p == str) return NULL; break; } *p++ = c; if (c == '\n') break; } *p = 0; return str; } void xmon_enter(void) { } void xmon_leave(void) { } value='linux-5.9.y'>linux-5.9.y Hosts the 0x221E linux distro kernel.Ubuntu
summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2021-03-12opp: Don't drop extra references to OPPs accidentallyBeata Michalska
2021-02-18opp: Don't skip freq update for different frequencyJonathan Marek
2021-02-02opp: Allow lazy-linking of required-oppsViresh Kumar
2021-02-02opp: Keep track of currently programmed OPPViresh Kumar
2021-02-02opp: Prepare for ->set_opp() helper to work without regulatorsViresh Kumar
2021-02-02opp: Defer acquiring the clk until OPPs are addedViresh Kumar
2021-02-02opp: Staticize _add_opp_table()Viresh Kumar
2020-12-09opp: Don't create an OPP table from dev_pm_opp_get_opp_table()Viresh Kumar
2020-10-05Merge branch 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/gi...Rafael J. Wysocki
2020-08-31opp: Don't drop reference for an OPP table that was never parsedViresh Kumar
2020-08-24opp: Remove _dev_pm_opp_find_and_remove_table() wrapperViresh Kumar
2020-08-24opp: Rename regulator_enabled and use it as status of all resourcesViresh Kumar
2020-05-29opp: core: add regulators enable and disableKamil Konieczny
2020-05-29opp: Add support for parsing interconnect bandwidthGeorgi Djakov
2020-05-13OPP: Add helpers for reading the binding propertiesSaravana Kannan
2019-12-10opp: Replace list_kref with a local counterViresh Kumar
2019-06-19treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500Thomas Gleixner
2019-03-06Merge tag 'pm-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafae...Linus Torvalds
2019-02-07opp: no need to check return value of debugfs_create functionsGreg Kroah-Hartman
2019-01-22OPP: Add support for parsing the 'opp-level' propertyRajendra Nayak
2018-12-14Merge branch 'opp/genpd/propagation' into opp/linux-nextViresh Kumar
2018-12-11OPP: Fix missing debugfs supply directory for OPPsViresh Kumar
2018-11-05OPP: Add dev_pm_opp_{set|put}_genpd_virt_dev() helperViresh Kumar
2018-11-05OPP: Populate OPPs from "required-opps" propertyViresh Kumar
2018-11-05OPP: Populate required opp tables from "required-opps" propertyViresh Kumar
2018-11-05OPP: Identify and mark genpd OPP tablesViresh Kumar
2018-10-01OPP: Prevent creating multiple OPP tables for devices sharing OPP nodesViresh Kumar
2018-09-19OPP: Use a single mechanism to free the OPP tableViresh Kumar
2018-09-19OPP: Don't remove dynamic OPPs from _dev_pm_opp_remove_table()Viresh Kumar
2018-09-19OPP: Create separate kref for static OPPs listViresh Kumar
2018-09-19OPP: Parse OPP table's DT properties from _of_init_opp_table()Viresh Kumar
2018-09-19OPP: Pass index to _of_init_opp_table()Viresh Kumar
2018-09-19OPP: Protect dev_list with opp_table lockViresh Kumar
2018-09-19OPP: Don't try to remove all OPP tables on failureViresh Kumar
2018-05-09PM / OPP: Remove dev_pm_opp_{un}register_get_pstate_helper()Viresh Kumar
2018-05-09PM / OPP: Implement of_dev_pm_opp_find_required_opp()Viresh Kumar
2018-05-09PM / OPP: "opp-hz" is optional for power domainsViresh Kumar
2017-10-14PM / OPP: Add dev_pm_opp_{un}register_get_pstate_helper()Viresh Kumar
2017-10-14PM / OPP: Support updating performance state of device's power domainViresh Kumar
2017-10-03PM / OPP: Move the OPP directory out of power/Viresh Kumar