From patchwork Thu Mar 21 18:10:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1060375 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="jxEeJC/X"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 44QFQQ47rDz9sQt for ; Fri, 22 Mar 2019 05:18:06 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 484B4C220DA; Thu, 21 Mar 2019 18:12:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 647F0C220D2; Thu, 21 Mar 2019 18:12:20 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 4FB08C220B9; Thu, 21 Mar 2019 18:10:29 +0000 (UTC) Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by lists.denx.de (Postfix) with ESMTPS id 2F5EAC220D9 for ; Thu, 21 Mar 2019 18:10:29 +0000 (UTC) Received: by mail-wr1-f48.google.com with SMTP id d17so7663114wre.10 for ; Thu, 21 Mar 2019 11:10:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=A6rxUIP2ubVG19elherSRrWE+Q2DGsh+1fX5VYlFRl8=; b=jxEeJC/X42b9xKcC2TI2E6wsNMRULVKz9IDz3wpmX+krXYwSmk1oOa8d7l+CphqreS WcOxV6gpnCLK5DLBRKv338kgIAxgLI1RWnxTZCmZKg5CPBDmJTSU2q4nZ2OSKgiuwTyx 2vSC07Z7NP28aGuEEnoCqRznGYCkF98rcq43xxJTdm2dPk49Por8V+jcNdxjC4xPuy1D EejvXJ8Fv8bidyGrXdslaPrFPqmww617ct50a1yucMUersf0uVf69XSyPkHPadvDWR/z ljwGDQhWu9yy3rwlfBlPT96uz4DMbuTPxAvu0IB9qs4dbaUZcreQN7ol72dy/QAxe9s+ hoyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=A6rxUIP2ubVG19elherSRrWE+Q2DGsh+1fX5VYlFRl8=; b=DslP2rrsfZHwoZnh70a1fabd8z1J5YSZLp/hNutOK0qHhsKnic7id0Xn9/qS5xE8mF TWcQMvbCvQc1eQvF0J2Gi7c6lVe3pqeXHSTys1z76JmTch2hTFv4iqtn+i7j4wrSC8pI VLlVcnRhRMcBBpY7w4cK/tqHUBMBHugNdp8xl+ndiZ1jj55mPGW1ddjJlC3UPT1nAQMg j8fYaT0GkFw4AETMJWcepm6nj5kxtdbxJakqB+cX9C5ozszSFtmAtrEs84FHevwfrKkP WZ6rv2S16031Ldcj+gYwd5x+ryU8i/G1NjJub7UeXFUJmHA0xKiwEzVAjR8WcU0rgQsy t35Q== X-Gm-Message-State: APjAAAW/vH7pawoUv7hS+a7Lgsi/giYdn+TPYRI4V0V2esT3AhnlusdU Kvi1PdrayplDfCU/1kztbiQ= X-Google-Smtp-Source: APXvYqy5kEnjKysQBSO2bfo3VDR0EXRQod7Oqv+IS7QHjaKzTzdgBy6QWV3dmr5eTLQdO6JuWXr1ng== X-Received: by 2002:adf:9dcf:: with SMTP id q15mr3395811wre.205.1553191828745; Thu, 21 Mar 2019 11:10:28 -0700 (PDT) Received: from localhost (pD9E51D2D.dip0.t-ipconnect.de. [217.229.29.45]) by smtp.gmail.com with ESMTPSA id n4sm8813608wrx.39.2019.03.21.11.10.27 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Mar 2019 11:10:28 -0700 (PDT) From: Thierry Reding To: Tom Warren , Simon Glass Date: Thu, 21 Mar 2019 19:10:07 +0100 Message-Id: <20190321181010.27005-11-thierry.reding@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190321181010.27005-1-thierry.reding@gmail.com> References: <20190321181010.27005-1-thierry.reding@gmail.com> MIME-Version: 1.0 Cc: u-boot@lists.denx.de, Stephen Warren Subject: [U-Boot] [PATCH v3 10/13] fdtdec: test: Add carveout tests X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 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" From: Thierry Reding Implement carveout tests for 32-bit and 64-bit builds. Signed-off-by: Thierry Reding Reviewed-by: Simon Glass --- Changes in v2: - new patch lib/fdtdec_test.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/lib/fdtdec_test.c b/lib/fdtdec_test.c index 928950918413..f6defe16c5a6 100644 --- a/lib/fdtdec_test.c +++ b/lib/fdtdec_test.c @@ -141,6 +141,156 @@ static int run_test(const char *aliases, const char *nodes, const char *expect) return 0; } +static int make_fdt_carveout_device(void *fdt, uint32_t na, uint32_t ns) +{ + const char *basename = "/display"; + struct fdt_memory carveout = { +#ifdef CONFIG_PHYS_64BIT + .start = 0x180000000, + .end = 0x18fffffff, +#else + .start = 0x80000000, + .end = 0x8fffffff, +#endif + }; + fdt32_t cells[4], *ptr = cells; + uint32_t upper, lower; + char name[32]; + int offset; + + /* store one or two address cells */ + lower = fdt_addr_unpack(carveout.start, &upper); + + if (na > 1 && upper > 0) + snprintf(name, sizeof(name), "%s@%x,%x", basename, upper, + lower); + else + snprintf(name, sizeof(name), "%s@%x", basename, lower); + + if (na > 1) + *ptr++ = cpu_to_fdt32(upper); + + *ptr++ = cpu_to_fdt32(lower); + + /* store one or two size cells */ + lower = fdt_size_unpack(carveout.end - carveout.start + 1, &upper); + + if (ns > 1) + *ptr++ = cpu_to_fdt32(upper); + + *ptr++ = cpu_to_fdt32(lower); + + offset = CHECK(fdt_add_subnode(fdt, 0, name + 1)); + CHECK(fdt_setprop(fdt, offset, "reg", cells, (na + ns) * sizeof(*cells))); + + return fdtdec_set_carveout(fdt, name, "memory-region", 0, + "framebuffer", &carveout); +} + +static int check_fdt_carveout(void *fdt, uint32_t address_cells, + uint32_t size_cells) +{ +#ifdef CONFIG_PHYS_64BIT + const char *name = "/display@1,80000000"; + const struct fdt_memory expected = { + .start = 0x180000000, + .end = 0x18fffffff, + }; +#else + const char *name = "/display@80000000"; + const struct fdt_memory expected = { + .start = 0x80000000, + .end = 0x8fffffff, + }; +#endif + struct fdt_memory carveout; + + printf("carveout: %pap-%pap na=%u ns=%u: ", &expected.start, + &expected.end, address_cells, size_cells); + + CHECK(fdtdec_get_carveout(fdt, name, "memory-region", 0, &carveout)); + + if ((carveout.start != expected.start) || + (carveout.end != expected.end)) { + printf("carveout: %pap-%pap, expected %pap-%pap\n", + &carveout.start, &carveout.end, + &expected.start, &expected.end); + return 1; + } + + printf("pass\n"); + return 0; +} + +static int make_fdt_carveout(void *fdt, int size, uint32_t address_cells, + uint32_t size_cells) +{ + fdt32_t na = cpu_to_fdt32(address_cells); + fdt32_t ns = cpu_to_fdt32(size_cells); +#if defined(DEBUG) && defined(CONFIG_SANDBOX) + char filename[512]; + int fd; +#endif + int err; + + CHECK(fdt_create(fdt, size)); + CHECK(fdt_finish_reservemap(fdt)); + CHECK(fdt_begin_node(fdt, "")); + CHECK(fdt_property(fdt, "#address-cells", &na, sizeof(na))); + CHECK(fdt_property(fdt, "#size-cells", &ns, sizeof(ns))); + CHECK(fdt_end_node(fdt)); + CHECK(fdt_finish(fdt)); + CHECK(fdt_pack(fdt)); + + CHECK(fdt_open_into(fdt, fdt, FDT_SIZE)); + + err = make_fdt_carveout_device(fdt, address_cells, size_cells); + +#if defined(DEBUG) && defined(CONFIG_SANDBOX) + snprintf(filename, sizeof(filename), "/tmp/fdtdec-carveout-%u-%u.dtb", + address_cells, size_cells); + + fd = os_open(filename, OS_O_CREAT | OS_O_WRONLY); + if (fd < 0) { + printf("could not open .dtb file to write\n"); + goto out; + } + + os_write(fd, fdt, size); + os_close(fd); + +out: +#endif + return err; +} + +static int check_carveout(void) +{ + void *fdt; + + fdt = malloc(FDT_SIZE); + if (!fdt) { + printf("%s: out of memory\n", __func__); + return 1; + } + +#ifndef CONFIG_PHYS_64BIT + CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 1), 0); + CHECKOK(check_fdt_carveout(fdt, 1, 1)); + CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 2), 0); + CHECKOK(check_fdt_carveout(fdt, 1, 2)); +#else + CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 1), -FDT_ERR_BADVALUE); + CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 1, 2), -FDT_ERR_BADVALUE); +#endif + CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 2, 1), 0); + CHECKOK(check_fdt_carveout(fdt, 2, 1)); + CHECKVAL(make_fdt_carveout(fdt, FDT_SIZE, 2, 2), 0); + CHECKOK(check_fdt_carveout(fdt, 2, 2)); + + return 0; +} + static int do_test_fdtdec(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { @@ -182,6 +332,8 @@ static int do_test_fdtdec(cmd_tbl_t *cmdtp, int flag, int argc, CHECKOK(run_test("2a 1a 0a", "a", " a")); CHECKOK(run_test("0a 1a 2a", "a", "a")); + CHECKOK(check_carveout()); + printf("Test passed\n"); return 0; }