From cc7cab726c778145f44dc3f5caee1a9655cc893e Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" Date: Tue, 18 Feb 2020 15:10:44 -0800 Subject: Add WrEndPointConfig MMIO to peci_cmds This adds WrEndPointConfig MMIO support to the peci_cmds utility. Tested: Ran this command: peci_cmds WrEndpointConfigMMIO 6 0 0 0x7e 0x1a 0x0 0x224e0 0x5f5a56 and got the expected command buffer in the driver log: [ 795.207278] peci_aspeed 1e78b000.peci-bus: HEAD : 0x00011730 [ 795.212980] TX : c5 00 05 00 00 00 06 00 d0 7e e0 24 02 00 00 00 .........~.$.... [ 795.220556] TX : 00 00 56 5a 5f 00 a8 ..VZ_.. Change-Id: Ibccaa8c390b89556162b7c131f7176b4883e06ec Signed-off-by: Jason M. Bills --- libpeci/peci_cmds.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/libpeci/peci_cmds.c b/libpeci/peci_cmds.c index ec7dda9..ee23cca 100644 --- a/libpeci/peci_cmds.c +++ b/libpeci/peci_cmds.c @@ -64,6 +64,8 @@ void Usage(char* progname) "Endpoint PCI Config Write "); printf("\t%-28s%s\n", "RdEndpointConfigMMIO", "Endpoint MMIO Read "); + printf("\t%-28s%s\n", "WrEndpointConfigMMIO", + "Endpoint MMIO Write "); printf("\t%-28s%s\n", "raw", "Raw PECI command in bytes"); printf("\n"); } @@ -86,6 +88,7 @@ int main(int argc, char* argv[]) uint16_t u16PciReg = 0; uint64_t u64Offset = 0; uint32_t u32PciWriteVal = 0; + uint64_t u64MmioWriteVal = 0; uint8_t u8PkgIndex = 0; uint16_t u16PkgParam = 0; uint32_t u32PkgValue = 0; @@ -586,6 +589,45 @@ int main(int argc, char* argv[]) } printf(" cc:0x%02x 0x%0*x\n", cc, u8Size * 2, u32PciReadVal); } + else if (strcmp(cmd, "wrendpointconfigmmio") == 0) + { + index = argc; + switch (argc - optind) + { + case 8: + u64MmioWriteVal = strtoull(argv[--index], NULL, 0); + u64Offset = strtoull(argv[--index], NULL, 0); + u8PciFunc = (uint8_t)strtoul(argv[--index], NULL, 0); + u8PciDev = (uint8_t)strtoul(argv[--index], NULL, 0); + u8PciBus = (uint8_t)strtoul(argv[--index], NULL, 0); + u8Seg = (uint8_t)strtoul(argv[--index], NULL, 0); + u8Bar = (uint8_t)strtoul(argv[--index], NULL, 0); + u8AddrType = (uint8_t)strtoul(argv[--index], NULL, 0); + break; + + default: + printf( + "ERROR: Unsupported arguments for Endpoint MMIO Write\n"); + goto ErrorExit; + } + if (verbose) + { + printf("Endpoint MMIO Write of Seg:%02x %02x:%02x:%02x AType:%02x " + "Bar:%02x Offset:0x%" PRIx64 ": 0x%0*" PRIx64 "\n", + u8Seg, u8PciBus, u8PciDev, u8PciFunc, u8AddrType, u8Bar, + u64Offset, u8Size * 2, u64MmioWriteVal); + } + ret = peci_WrEndPointConfigMmio(address, u8Seg, u8PciBus, u8PciDev, + u8PciFunc, u8Bar, u8AddrType, u64Offset, + u8Size, u64MmioWriteVal, &cc); + if (0 != ret) + { + printf("ERROR %d: command failed\n", ret); + printf(" cc:0x%02x\n", cc); + return 1; + } + printf(" cc:0x%02x\n", cc); + } else if (strcmp(cmd, "raw") == 0) { if ((argc - optind) < 3) -- cgit v1.2.3