From owner-svn-src-head@freebsd.org Thu Mar 16 00:50:00 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C9DA9D0C613; Thu, 16 Mar 2017 00:50:00 +0000 (UTC) (envelope-from kan@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A44BA1921; Thu, 16 Mar 2017 00:50:00 +0000 (UTC) (envelope-from kan@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v2G0nxGS038057; Thu, 16 Mar 2017 00:49:59 GMT (envelope-from kan@FreeBSD.org) Received: (from kan@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v2G0nxM6038056; Thu, 16 Mar 2017 00:49:59 GMT (envelope-from kan@FreeBSD.org) Message-Id: <201703160049.v2G0nxM6038056@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kan set sender to kan@FreeBSD.org using -f From: Alexander Kabaev Date: Thu, 16 Mar 2017 00:49:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r315338 - head/sys/mips/cavium X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Mar 2017 00:50:00 -0000 Author: kan Date: Thu Mar 16 00:49:59 2017 New Revision: 315338 URL: https://svnweb.freebsd.org/changeset/base/315338 Log: Add cavium octeon 'bootoctlinux' boot argument support While there, parse u-boot provided command line arguments for supported switches and update boothowto appropriately. Also support setting kenv variables from the kernel comman line. PR: 216831 (modified) Modified: head/sys/mips/cavium/octeon_machdep.c Modified: head/sys/mips/cavium/octeon_machdep.c ============================================================================== --- head/sys/mips/cavium/octeon_machdep.c Wed Mar 15 23:47:19 2017 (r315337) +++ head/sys/mips/cavium/octeon_machdep.c Thu Mar 16 00:49:59 2017 (r315338) @@ -95,6 +95,7 @@ struct octeon_feature_description { extern int *end; extern char cpu_model[]; extern char cpu_board[]; +static char octeon_kenv[0x2000]; static const struct octeon_feature_description octeon_feature_descriptions[] = { { OCTEON_FEATURE_SAAD, "SAAD" }, @@ -130,6 +131,7 @@ static uint64_t octeon_get_ticks(void); static unsigned octeon_get_timecount(struct timecounter *tc); static void octeon_boot_params_init(register_t ptr); +static void octeon_init_kenv(register_t ptr); static struct timecounter octeon_timecounter = { octeon_get_timecount, /* get_timecount */ @@ -341,12 +343,11 @@ platform_start(__register_t a0, __regist octeon_ciu_reset(); /* - * XXX - * We can certainly parse command line arguments or U-Boot environment - * to determine whether to bootverbose / single user / ... I think - * stass has patches to add support for loader things to U-Boot even. + * Convert U-Boot 'bootoctlinux' loader command line arguments into + * boot flags and kernel environment variables. */ bootverbose = 1; + octeon_init_kenv(a3); /* * For some reason on the cn38xx simulator ebase register is set to @@ -660,3 +661,59 @@ octeon_boot_params_init(register_t ptr) __cvmx_helper_cfg_init(); } /* impEND: This stuff should move back into the Cavium SDK */ + +static void +boothowto_parse(const char *v) +{ + if ((v == NULL) || (*v != '-')) + return; + + while (*v != '\0') { + v++; + switch (*v) { + case 'a': boothowto |= RB_ASKNAME; break; + case 'C': boothowto |= RB_CDROM; break; + case 'd': boothowto |= RB_KDB; break; + case 'D': boothowto |= RB_MULTIPLE; break; + case 'm': boothowto |= RB_MUTE; break; + case 'g': boothowto |= RB_GDB; break; + case 'h': boothowto |= RB_SERIAL; break; + case 'p': boothowto |= RB_PAUSE; break; + case 'r': boothowto |= RB_DFLTROOT; break; + case 's': boothowto |= RB_SINGLE; break; + case 'v': boothowto |= RB_VERBOSE; break; + } + } +} + +/* + * The boot loader command line may specify kernel environment variables or + * applicable boot flags of boot(8). + */ +static void +octeon_init_kenv(register_t ptr) +{ + int i; + char *n; + char *v; + octeon_boot_descriptor_t *app_desc_ptr; + + app_desc_ptr = (octeon_boot_descriptor_t *)(intptr_t)ptr; + memset(octeon_kenv, 0, sizeof(octeon_kenv)); + init_static_kenv(octeon_kenv, sizeof(octeon_kenv)); + + for (i = 0; i < app_desc_ptr->argc; i++) { + v = cvmx_phys_to_ptr(app_desc_ptr->argv[i]); + if (v == NULL) + continue; + if (*v == '-') { + boothowto_parse(v); + continue; + } + n = strsep(&v, "="); + if (v == NULL) + kern_setenv(n, "1"); + else + kern_setenv(n, v); + } +}