From owner-svn-src-all@FreeBSD.ORG Fri Nov 30 03:11:03 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 9910ADF7; Fri, 30 Nov 2012 03:11:03 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 7ED308FC08; Fri, 30 Nov 2012 03:11:03 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qAU3B3qr005547; Fri, 30 Nov 2012 03:11:03 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qAU3B3T1005546; Fri, 30 Nov 2012 03:11:03 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <201211300311.qAU3B3T1005546@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Fri, 30 Nov 2012 03:11:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r243691 - head/sys/arm/arm X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Nov 2012 03:11:03 -0000 Author: gonzo Date: Fri Nov 30 03:11:03 2012 New Revision: 243691 URL: http://svnweb.freebsd.org/changeset/base/243691 Log: Get reserved memory regions and exclude them from available memory map Modified: head/sys/arm/arm/machdep.c Modified: head/sys/arm/arm/machdep.c ============================================================================== --- head/sys/arm/arm/machdep.c Fri Nov 30 03:08:49 2012 (r243690) +++ head/sys/arm/arm/machdep.c Fri Nov 30 03:11:03 2012 (r243691) @@ -1144,7 +1144,9 @@ physmap_init(struct mem_region *availmem void * initarm(struct arm_boot_params *abp) { + struct mem_region memory_regions[FDT_MEM_REGIONS]; struct mem_region availmem_regions[FDT_MEM_REGIONS]; + struct mem_region reserved_regions[FDT_MEM_REGIONS]; struct pv_addr kernel_l1pt; struct pv_addr dpcpu; vm_offset_t dtbp, freemempos, l2_start, lastaddr; @@ -1154,7 +1156,12 @@ initarm(struct arm_boot_params *abp) void *kmdp; u_int l1pagetable; int i = 0, j = 0, err_devmap = 0; + int memory_regions_sz; int availmem_regions_sz; + int reserved_regions_sz; + vm_offset_t start, end; + vm_offset_t rstart, rend; + int curr; lastaddr = parse_boot_param(abp); memsize = 0; @@ -1185,10 +1192,73 @@ initarm(struct arm_boot_params *abp) while (1); /* Grab physical memory regions information from device tree. */ - if (fdt_get_mem_regions(availmem_regions, &availmem_regions_sz, + if (fdt_get_mem_regions(memory_regions, &memory_regions_sz, &memsize) != 0) while(1); + /* Grab physical memory regions information from device tree. */ + if (fdt_get_reserved_regions(reserved_regions, &reserved_regions_sz) != 0) + reserved_regions_sz = 0; + + /* + * Now exclude all the reserved regions + */ + curr = 0; + for (i = 0; i < memory_regions_sz; i++) { + start = memory_regions[i].mr_start; + end = start + memory_regions[i].mr_size; + for (j = 0; j < reserved_regions_sz; j++) { + rstart = reserved_regions[j].mr_start; + rend = rstart + reserved_regions[j].mr_size; + /* + * Restricted region is before available + * Skip restricted region + */ + if (rend <= start) + continue; + /* + * Restricted region is behind available + * No further processing required + */ + if (rstart >= end) + break; + /* + * Restricted region includes memory region + * skip availble region + */ + if ((start >= rstart) && (rend >= end)) { + start = rend; + end = rend; + break; + } + /* + * Memory region includes restricted region + */ + if ((rstart > start) && (end > rend)) { + availmem_regions[curr].mr_start = start; + availmem_regions[curr++].mr_size = rstart - start; + start = rend; + break; + } + /* + * Memory region partially overlaps with restricted + */ + if ((rstart >= start) && (rstart <= end)) { + end = rstart; + } + else if ((rend >= start) && (rend <= end)) { + start = rend; + } + } + + if (end > start) { + availmem_regions[curr].mr_start = start; + availmem_regions[curr++].mr_size = end - start; + } + } + + availmem_regions_sz = curr; + /* Platform-specific initialisation */ pmap_bootstrap_lastaddr = initarm_lastaddr();