From patchwork Mon Dec 12 07:14:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Rossi X-Patchwork-Id: 704938 X-Patchwork-Delegate: monstr@monstr.eu Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3tcYym0JQ0z9t6g for ; Mon, 12 Dec 2016 18:15:44 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=nathanrossi.com header.i=@nathanrossi.com header.b="gIrajsCx"; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id DFAB4A75FD; Mon, 12 Dec 2016 08:15:34 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fRMQifFQl9IJ; Mon, 12 Dec 2016 08:15:34 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 78449A75BF; Mon, 12 Dec 2016 08:15:31 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 5AEF3A75CA for ; Mon, 12 Dec 2016 08:15:22 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id uGAytcmKaZ1Z for ; Mon, 12 Dec 2016 08:15:22 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by theia.denx.de (Postfix) with ESMTPS id 08E45A75C2 for ; Mon, 12 Dec 2016 08:15:19 +0100 (CET) Received: by mail-pf0-f194.google.com with SMTP id y68so3959802pfb.1 for ; Sun, 11 Dec 2016 23:15:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nathanrossi.com; s=google; h=from:mime-version:content-transfer-encoding:date:subject:message-id :in-reply-to:references:to:cc; bh=zLw2D+Da91u49BkhIHuWrQ0Xh5mkz8Jg4bSERft2JWQ=; b=gIrajsCxaqxz9eSbpXRV/vpOKpyt3gAGuuNjpHha7EY9Vz+0TylaFff8ThuPxGVTfe FoA+weMttGcg71akSzDwk3mve3oBRjcIyIW3tFPdLU014RYrp768AjmqV28TR0+ZnXeM viluGKkMxkhvJHQCv1ftpsAuXQtioV9gaqO+/9A+3isxWWThFio4J+apVnee8ILCsaxN HW3DkvVTWZ0gAQ9BqehmLRohjwBB00Q6YGsfVthggeaDNfB+K3L4YwqZYxolkoG2Zo0a YMuESdUJTT04kwZAUOfEIXbTr+jMs9EJ2gqh2KMR7UKcKn0f4C8qy5+7Y4WgYYjX4OpU Ze4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:content-transfer-encoding:date :subject:message-id:in-reply-to:references:to:cc; bh=zLw2D+Da91u49BkhIHuWrQ0Xh5mkz8Jg4bSERft2JWQ=; b=iabVe9USZxmVtozXKFExERYKj3Sye88I180qt+yPqzRmXgWl2C2XdqW8gFsAOLJ2VQ sl02mSZYUEIaXPHX9KiwwElod6GNEmel97WUBG+bxgq8anLjYgFTzfT20Y4k5ss4z9h7 nQpHGz0nBP2oScxNDelApB+/b+PloK8xZtE+NbGAUcyhtun6VIOLi8ymTzjICY+Ewasl uD1GtMLmq1qqkCzWMslaE/1b9Ginb7ExlSX2g1rhL0M+lQDm6rjD/kQbMyRRQVvK+FEW zOUrZ1avkBgn3ADztX+DJf8ZaA2vqjSnIMPa7W3Is4jk5/PVYqMAJSLYheyjbQNQ8jOk xC5w== X-Gm-Message-State: AKaTC03Bl5AW1CHw/RX8l79m8ejsTPd6TLv1iwfvtY+jAvG1Di04zeWqGvTCfEtlvlhi5g== X-Received: by 10.84.178.195 with SMTP id z61mr185266796plb.176.1481526918282; Sun, 11 Dec 2016 23:15:18 -0800 (PST) Received: from [127.0.1.1] (CPE-1-121-152-133.qwl9.woo.bigpond.net.au. [1.121.152.133]) by smtp.gmail.com with ESMTPSA id y2sm73817182pff.82.2016.12.11.23.15.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Dec 2016 23:15:17 -0800 (PST) From: Nathan Rossi MIME-Version: 1.0 Date: Mon, 12 Dec 2016 17:14:54 +1000 Message-Id: <20161212071454.16659-3-nathan@nathanrossi.com> In-Reply-To: <20161212071454.16659-0-nathan@nathanrossi.com> References: <20161212071454.16659-0-nathan@nathanrossi.com> To: u-boot@lists.denx.de Cc: Michal Simek Subject: [U-Boot] [PATCH v2 3/3] ARM64: zynqmp: Replace board specific with generic memory bank decoding X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The dram_init and dram_init_banksize functions were using a board specific implementation for decoding the memory banks from the fdt. This board specific implementation uses a static variable 'tmp' which makes these functions unsafe for execution from within the board_init_f context. This change makes the dram_init* functions use a generic implementation of decoding and populating memory bank and size data. Signed-off-by: Nathan Rossi Fixes: 8d59d7f63b ("ARM64: zynqmp: Read RAM information from DT") Cc: Michal Simek --- board/xilinx/zynqmp/zynqmp.c | 112 ++----------------------------------------- 1 file changed, 3 insertions(+), 109 deletions(-) diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c index cef1f6a13a..8a3d0043b9 100644 --- a/board/xilinx/zynqmp/zynqmp.c +++ b/board/xilinx/zynqmp/zynqmp.c @@ -180,121 +180,15 @@ int zynq_board_read_rom_ethaddr(unsigned char *ethaddr) } #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE) -/* - * fdt_get_reg - Fill buffer by information from DT - */ -static phys_size_t fdt_get_reg(const void *fdt, int nodeoffset, void *buf, - const u32 *cell, int n) -{ - int i = 0, b, banks; - int parent_offset = fdt_parent_offset(fdt, nodeoffset); - int address_cells = fdt_address_cells(fdt, parent_offset); - int size_cells = fdt_size_cells(fdt, parent_offset); - char *p = buf; - u64 val; - u64 vals; - - debug("%s: addr_cells=%x, size_cell=%x, buf=%p, cell=%p\n", - __func__, address_cells, size_cells, buf, cell); - - /* Check memory bank setup */ - banks = n % (address_cells + size_cells); - if (banks) - panic("Incorrect memory setup cells=%d, ac=%d, sc=%d\n", - n, address_cells, size_cells); - - banks = n / (address_cells + size_cells); - - for (b = 0; b < banks; b++) { - debug("%s: Bank #%d:\n", __func__, b); - if (address_cells == 2) { - val = cell[i + 1]; - val <<= 32; - val |= cell[i]; - val = fdt64_to_cpu(val); - debug("%s: addr64=%llx, ptr=%p, cell=%p\n", - __func__, val, p, &cell[i]); - *(phys_addr_t *)p = val; - } else { - debug("%s: addr32=%x, ptr=%p\n", - __func__, fdt32_to_cpu(cell[i]), p); - *(phys_addr_t *)p = fdt32_to_cpu(cell[i]); - } - p += sizeof(phys_addr_t); - i += address_cells; - - debug("%s: pa=%p, i=%x, size=%zu\n", __func__, p, i, - sizeof(phys_addr_t)); - - if (size_cells == 2) { - vals = cell[i + 1]; - vals <<= 32; - vals |= cell[i]; - vals = fdt64_to_cpu(vals); - - debug("%s: size64=%llx, ptr=%p, cell=%p\n", - __func__, vals, p, &cell[i]); - *(phys_size_t *)p = vals; - } else { - debug("%s: size32=%x, ptr=%p\n", - __func__, fdt32_to_cpu(cell[i]), p); - *(phys_size_t *)p = fdt32_to_cpu(cell[i]); - } - p += sizeof(phys_size_t); - i += size_cells; - - debug("%s: ps=%p, i=%x, size=%zu\n", - __func__, p, i, sizeof(phys_size_t)); - } - - /* Return the first address size */ - return *(phys_size_t *)((char *)buf + sizeof(phys_addr_t)); -} - -#define FDT_REG_SIZE sizeof(u32) -/* Temp location for sharing data for storing */ -/* Up to 64-bit address + 64-bit size */ -static u8 tmp[CONFIG_NR_DRAM_BANKS * 16]; - void dram_init_banksize(void) { - int bank; - - memcpy(&gd->bd->bi_dram[0], &tmp, sizeof(tmp)); - - for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) { - debug("Bank #%d: start %llx\n", bank, - (unsigned long long)gd->bd->bi_dram[bank].start); - debug("Bank #%d: size %llx\n", bank, - (unsigned long long)gd->bd->bi_dram[bank].size); - } + fdtdec_setup_memory_banksize(); } int dram_init(void) { - int node, len; - const void *blob = gd->fdt_blob; - const u32 *cell; - - memset(&tmp, 0, sizeof(tmp)); - - /* find or create "/memory" node. */ - node = fdt_subnode_offset(blob, 0, "memory"); - if (node < 0) { - printf("%s: Can't get memory node\n", __func__); - return node; - } - - /* Get pointer to cells and lenght of it */ - cell = fdt_getprop(blob, node, "reg", &len); - if (!cell) { - printf("%s: Can't get reg property\n", __func__); - return -1; - } - - gd->ram_size = fdt_get_reg(blob, node, &tmp, cell, len / FDT_REG_SIZE); - - debug("%s: Initial DRAM size %llx\n", __func__, (u64)gd->ram_size); + if (fdtdec_setup_memory_size() != 0) + return -EINVAL; return 0; }