target-arm queue:

* mps3-an547: Add missing user ahb interfaces
  * hw/arm/mps2-tz.c: Update AN547 documentation URL
  * hw/input/tsc210x: Don't abort on bad SPI word widths
  * hw/i2c: flatten pca954x mux device
  * target/arm: Support PSCI 1.1 and SMCCC 1.0
  * target/arm: Fix early free of TCG temp in handle_simd_shift_fpint_conv()
  * tests/qtest: add qtests for npcm7xx sdhci
  * Implement FEAT_LVA
  * Implement FEAT_LPA
  * Implement FEAT_LPA2 (but do not enable it yet)
  * Report KVM's actual PSCI version to guest in dtb
  * ui/cocoa.m: Fix updateUIInfo threading issues
  * ui/cocoa.m: Remove unnecessary NSAutoreleasePools
 -----BEGIN PGP SIGNATURE-----
 
 iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmIf2PYZHHBldGVyLm1h
 eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3jPkD/91FqRiubeyDEuuV77YMN3y
 AXA0He8FJ4TgfCZ4e9IT2rA5lyYvFdx0c6TUmFKc3JJ2omhP+35sT+7qolsuhKhF
 JHIvULVMakazbna4tanuQN6fTPrdhnUtVdXDTbadvdjzyWtkiMSs/Mn6YT5kmUQ+
 VRrks4GjB3Ckrne/45nNO5fnt9cTP1+36+1nRUk0/4SdK7BnMR332KRMj6NexVdT
 Ae3usp8wcJuwojCiDqkN6ov7LdbjLxKFl2tzyjfHHaOAjBJ4FgyLsR66QtY6BH+8
 O8Uelx6/AYZ8o/CLqgimcG1ZQm8onGktKhMdg95TAWhRHPMWX0BXtVq1nYWt1e2+
 O7ONbJdKYG6V7Qm9+cu8H7kzW7LU+iBabZ3dL3H5cpciuGWtvPT2ASfqTGKUbbyS
 gyC5esy4m4pw+saebMKfLcuNr7DbB+0f7OQnprmfTTecBUdHwtT8s1TRXZF0glQS
 zMzUcbMMWYakdNA+iPH/xRax3+S359W5oq3Q2yqHnrcyNj4kgYKHnhD8IPIsVUQo
 IJwC/T6OwQlUP1s/EdMI1FV63Wz7RTzsUVcVjkQGJOOeA2vOLszm/AUtDDgJhn38
 /J6fN6drkxr69X9H/EjJIRGB4VL13lk/TA1zBTnxr46R2TnI8aLxHrh8G9Ruj2zN
 kosJ1Le5oyzDgz/6xZ0biQ==
 =CUTQ
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20220302' into staging

target-arm queue:
 * mps3-an547: Add missing user ahb interfaces
 * hw/arm/mps2-tz.c: Update AN547 documentation URL
 * hw/input/tsc210x: Don't abort on bad SPI word widths
 * hw/i2c: flatten pca954x mux device
 * target/arm: Support PSCI 1.1 and SMCCC 1.0
 * target/arm: Fix early free of TCG temp in handle_simd_shift_fpint_conv()
 * tests/qtest: add qtests for npcm7xx sdhci
 * Implement FEAT_LVA
 * Implement FEAT_LPA
 * Implement FEAT_LPA2 (but do not enable it yet)
 * Report KVM's actual PSCI version to guest in dtb
 * ui/cocoa.m: Fix updateUIInfo threading issues
 * ui/cocoa.m: Remove unnecessary NSAutoreleasePools

# gpg: Signature made Wed 02 Mar 2022 20:52:06 GMT
# gpg:                using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE
# gpg:                issuer "peter.maydell@linaro.org"
# gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [ultimate]
# gpg:                 aka "Peter Maydell <pmaydell@gmail.com>" [ultimate]
# gpg:                 aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [ultimate]
# Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83  15CF 3C25 25ED 1436 0CDE

* remotes/pmaydell/tags/pull-target-arm-20220302: (26 commits)
  ui/cocoa.m: Remove unnecessary NSAutoreleasePools
  ui/cocoa.m: Fix updateUIInfo threading issues
  target/arm: Report KVM's actual PSCI version to guest in dtb
  target/arm: Implement FEAT_LPA2
  target/arm: Advertise all page sizes for -cpu max
  target/arm: Validate tlbi TG matches translation granule in use
  target/arm: Fix TLBIRange.base for 16k and 64k pages
  target/arm: Introduce tlbi_aa64_get_range
  target/arm: Extend arm_fi_to_lfsc to level -1
  target/arm: Implement FEAT_LPA
  target/arm: Implement FEAT_LVA
  target/arm: Prepare DBGBVR and DBGWVR for FEAT_LVA
  target/arm: Honor TCR_ELx.{I}PS
  target/arm: Use MAKE_64BIT_MASK to compute indexmask
  target/arm: Pass outputsize down to check_s2_mmu_setup
  target/arm: Move arm_pamax out of line
  target/arm: Fault on invalid TCR_ELx.TxSZ
  target/arm: Set TCR_EL1.TSZ for user-only
  hw/registerfields: Add FIELD_SEX<N> and FIELD_SDP<N>
  tests/qtest: add qtests for npcm7xx sdhci
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2022-03-03 14:46:48 +00:00
commit 6629bf78aa
20 changed files with 736 additions and 192 deletions

View file

@ -190,6 +190,7 @@ qtests_npcm7xx = \
'npcm7xx_gpio-test',
'npcm7xx_pwm-test',
'npcm7xx_rng-test',
'npcm7xx_sdhci-test',
'npcm7xx_smbus-test',
'npcm7xx_timer-test',
'npcm7xx_watchdog_timer-test'] + \

View file

@ -0,0 +1,215 @@
/*
* QTests for NPCM7xx SD-3.0 / MMC-4.51 Host Controller
*
* Copyright (c) 2022 Google LLC
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "qemu/osdep.h"
#include "hw/sd/npcm7xx_sdhci.h"
#include "libqos/libqtest.h"
#include "libqtest-single.h"
#include "libqos/sdhci-cmd.h"
#define NPCM7XX_REG_SIZE 0x100
#define NPCM7XX_MMC_BA 0xF0842000
#define NPCM7XX_BLK_SIZE 512
#define NPCM7XX_TEST_IMAGE_SIZE (1 << 30)
char *sd_path;
static QTestState *setup_sd_card(void)
{
QTestState *qts = qtest_initf(
"-machine kudo-bmc "
"-device sd-card,drive=drive0 "
"-drive id=drive0,if=none,file=%s,format=raw,auto-read-only=off",
sd_path);
qtest_writew(qts, NPCM7XX_MMC_BA + SDHC_SWRST, SDHC_RESET_ALL);
qtest_writew(qts, NPCM7XX_MMC_BA + SDHC_CLKCON,
SDHC_CLOCK_SDCLK_EN | SDHC_CLOCK_INT_STABLE |
SDHC_CLOCK_INT_EN);
sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0, 0, SDHC_APP_CMD);
sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0x41200000, 0, (41 << 8));
sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0, 0, SDHC_ALL_SEND_CID);
sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0, 0, SDHC_SEND_RELATIVE_ADDR);
sdhci_cmd_regs(qts, NPCM7XX_MMC_BA, 0, 0, 0x45670000, 0,
SDHC_SELECT_DESELECT_CARD);
return qts;
}
static void write_sdread(QTestState *qts, const char *msg)
{
int fd, ret;
size_t len = strlen(msg);
char *rmsg = g_malloc(len);
/* write message to sd */
fd = open(sd_path, O_WRONLY);
g_assert(fd >= 0);
ret = write(fd, msg, len);
close(fd);
g_assert(ret == len);
/* read message using sdhci */
ret = sdhci_read_cmd(qts, NPCM7XX_MMC_BA, rmsg, len);
g_assert(ret == len);
g_assert(!memcmp(rmsg, msg, len));
g_free(rmsg);
}
/* Check MMC can read values from sd */
static void test_read_sd(void)
{
QTestState *qts = setup_sd_card();
write_sdread(qts, "hello world");
write_sdread(qts, "goodbye");
qtest_quit(qts);
}
static void sdwrite_read(QTestState *qts, const char *msg)
{
int fd, ret;
size_t len = strlen(msg);
char *rmsg = g_malloc(len);
/* write message using sdhci */
sdhci_write_cmd(qts, NPCM7XX_MMC_BA, msg, len, NPCM7XX_BLK_SIZE);
/* read message from sd */
fd = open(sd_path, O_RDONLY);
g_assert(fd >= 0);
ret = read(fd, rmsg, len);
close(fd);
g_assert(ret == len);
g_assert(!memcmp(rmsg, msg, len));
g_free(rmsg);
}
/* Check MMC can write values to sd */
static void test_write_sd(void)
{
QTestState *qts = setup_sd_card();
sdwrite_read(qts, "hello world");
sdwrite_read(qts, "goodbye");
qtest_quit(qts);
}
/* Check SDHCI has correct default values. */
static void test_reset(void)
{
QTestState *qts = qtest_init("-machine kudo-bmc");
uint64_t addr = NPCM7XX_MMC_BA;
uint64_t end_addr = addr + NPCM7XX_REG_SIZE;
uint16_t prstvals_resets[] = {NPCM7XX_PRSTVALS_0_RESET,
NPCM7XX_PRSTVALS_1_RESET,
0,
NPCM7XX_PRSTVALS_3_RESET,
0,
0};
int i;
uint32_t mask;
while (addr < end_addr) {
switch (addr - NPCM7XX_MMC_BA) {
case SDHC_PRNSTS:
/*
* ignores bits 20 to 24: they are changed when reading registers
*/
mask = 0x1f00000;
g_assert_cmphex(qtest_readl(qts, addr) | mask, ==,
NPCM7XX_PRSNTS_RESET | mask);
addr += 4;
break;
case SDHC_BLKGAP:
g_assert_cmphex(qtest_readb(qts, addr), ==, NPCM7XX_BLKGAP_RESET);
addr += 1;
break;
case SDHC_CAPAB:
g_assert_cmphex(qtest_readq(qts, addr), ==, NPCM7XX_CAPAB_RESET);
addr += 8;
break;
case SDHC_MAXCURR:
g_assert_cmphex(qtest_readq(qts, addr), ==, NPCM7XX_MAXCURR_RESET);
addr += 8;
break;
case SDHC_HCVER:
g_assert_cmphex(qtest_readw(qts, addr), ==, NPCM7XX_HCVER_RESET);
addr += 2;
break;
case NPCM7XX_PRSTVALS:
for (i = 0; i < NPCM7XX_PRSTVALS_SIZE; ++i) {
g_assert_cmphex(qtest_readw(qts, addr + 2 * i), ==,
prstvals_resets[i]);
}
addr += NPCM7XX_PRSTVALS_SIZE * 2;
break;
default:
g_assert_cmphex(qtest_readb(qts, addr), ==, 0);
addr += 1;
}
}
qtest_quit(qts);
}
static void drive_destroy(void)
{
unlink(sd_path);
g_free(sd_path);
}
static void drive_create(void)
{
int fd, ret;
GError *error = NULL;
/* Create a temporary raw image */
fd = g_file_open_tmp("sdhci_XXXXXX", &sd_path, &error);
if (fd == -1) {
fprintf(stderr, "unable to create sdhci file: %s\n", error->message);
g_error_free(error);
}
g_assert(sd_path != NULL);
ret = ftruncate(fd, NPCM7XX_TEST_IMAGE_SIZE);
g_assert_cmpint(ret, ==, 0);
g_message("%s", sd_path);
close(fd);
}
int main(int argc, char **argv)
{
int ret;
drive_create();
g_test_init(&argc, &argv, NULL);
qtest_add_func("npcm7xx_sdhci/reset", test_reset);
qtest_add_func("npcm7xx_sdhci/write_sd", test_write_sd);
qtest_add_func("npcm7xx_sdhci/read_sd", test_read_sd);
ret = g_test_run();
drive_destroy();
return ret;
}