From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 854DC1BBD1 for ; Tue, 18 Dec 2018 11:21:21 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Dec 2018 02:21:20 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,367,1539673200"; d="scan'208";a="260393805" Received: from irsmsx152.ger.corp.intel.com ([163.33.192.66]) by orsmga004.jf.intel.com with ESMTP; 18 Dec 2018 02:21:19 -0800 Received: from irsmsx108.ger.corp.intel.com ([169.254.11.26]) by IRSMSX152.ger.corp.intel.com ([169.254.6.8]) with mapi id 14.03.0415.000; Tue, 18 Dec 2018 10:21:18 +0000 From: "Iremonger, Bernard" To: "Xu, Rosen" , "dev@dpdk.org" CC: "Lu, Wenzhuo" , "Wu, Jingjing" , "Yigit, Ferruh" Thread-Topic: [PATCH v4] app/test-pmd: add IFPGA AFU register access function for testpmd Thread-Index: AQHUlggSMSWyDYUEVkuVvqTfBXA9M6WESHmw Date: Tue, 18 Dec 2018 10:21:18 +0000 Message-ID: <8CEF83825BEC744B83065625E567D7C260D3ECCB@IRSMSX108.ger.corp.intel.com> References: <1544098591-157631-1-git-send-email-rosen.xu@intel.com> <1545051381-163683-1-git-send-email-rosen.xu@intel.com> In-Reply-To: <1545051381-163683-1-git-send-email-rosen.xu@intel.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZjdkYmNjOTItMGY4YS00ZTIyLTk3YjYtNWRlOWUyYTgyYjVkIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiUWV2WEpNVlpIeDhpU0lcL1lcL2tVNzRkdkFTRWQwU3NBak1QRjIrS2loYnJFNHdLXC9QMnVXXC8yMXdXeVRNbno2K0QifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.400.15 dlp-reaction: no-action x-originating-ip: [163.33.239.180] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v4] app/test-pmd: add IFPGA AFU register access function for testpmd X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2018 10:21:22 -0000 Hi Rosen, > -----Original Message----- > From: Xu, Rosen > Sent: Monday, December 17, 2018 12:56 PM > To: dev@dpdk.org > Cc: Lu, Wenzhuo ; Wu, Jingjing > ; Iremonger, Bernard > ; Xu, Rosen ; Yigit, > Ferruh > Subject: [PATCH v4] app/test-pmd: add IFPGA AFU register access function > for testpmd ./devtools/check-git-log.sh -1 Wrong headline label: app/test-pmd: add IFPGA AFU register access function for testpmd Headline too long: app/test-pmd: add IFPGA AFU register access function for testpmd Headline label should be "app/testpmd" The text needs to be shortened, maybe drop "for testpmd" >=20 > Currently register read/write of testpmd is only for PCI device, but more= and > more IFPGA based AFU devices need this feature to access registers, this > patch will add support for it. >=20 > Signed-off-by: Rosen Xu > --- > app/test-pmd/config.c | 116 > ++++++++++++++++++++++++++++++++++++++++--------- > app/test-pmd/testpmd.h | 60 +++++++++++++++++++++++++ > 2 files changed, 155 insertions(+), 21 deletions(-) >=20 > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index > b9e5dd9..f39a8eb 100644 > --- a/app/test-pmd/config.c > +++ b/app/test-pmd/config.c > @@ -872,7 +872,8 @@ void print_valid_ports(void) { > const struct rte_pci_device *pci_dev; > const struct rte_bus *bus; > - uint64_t pci_len; > + uint64_t len; > + const struct rte_afu_device *afu_dev; >=20 > if (reg_off & 0x3) { > printf("Port register offset 0x%X not aligned on a 4-byte " > @@ -889,16 +890,21 @@ void print_valid_ports(void) > bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > if (bus && !strcmp(bus->name, "pci")) { > pci_dev =3D RTE_DEV_TO_PCI(ports[port_id].dev_info.device); > + len =3D pci_dev->mem_resource[0].len; > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + afu_dev =3D > RTE_DEV_TO_AFU(ports[port_id].dev_info.device); > + len =3D afu_dev->mem_resource[0].len; > } else { > - printf("Not a PCI device\n"); > + printf("Not a PCI or AFU device\n"); > return 1; > } >=20 > - pci_len =3D pci_dev->mem_resource[0].len; > - if (reg_off >=3D pci_len) { > - printf("Port %d: register offset %u (0x%X) out of port PCI " > + if (reg_off >=3D len) { > + printf("Port %d: register offset %u (0x%X) out of port " > + "PCI or AFU device " > "resource (length=3D%"PRIu64")\n", > - port_id, (unsigned)reg_off, (unsigned)reg_off, pci_len); > + port_id, (unsigned int)reg_off, > + (unsigned int)reg_off, len); > return 1; > } > return 0; > @@ -927,7 +933,7 @@ void print_valid_ports(void) > port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_x) = { > uint32_t reg_v; > - > + const struct rte_bus *bus; >=20 > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > @@ -935,7 +941,16 @@ void print_valid_ports(void) > return; > if (reg_bit_pos_is_invalid(bit_x)) > return; > - reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + > + bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > + if (bus && !strcmp(bus->name, "pci")) { > + reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + reg_v =3D port_id_afu_reg_read(port_id, reg_off); > + } else { > + printf("Not a PCI or AFU device\n"); > + return; > + } > display_port_and_reg_off(port_id, (unsigned)reg_off); > printf("bit %d=3D%d\n", bit_x, (int) ((reg_v & (1 << bit_x)) >> bit_x))= ; } > @@ -947,6 +962,7 @@ void print_valid_ports(void) > uint32_t reg_v; > uint8_t l_bit; > uint8_t h_bit; > + const struct rte_bus *bus; >=20 > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > @@ -961,7 +977,15 @@ void print_valid_ports(void) > else > l_bit =3D bit1_pos, h_bit =3D bit2_pos; >=20 > - reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > + if (bus && !strcmp(bus->name, "pci")) { > + reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + reg_v =3D port_id_afu_reg_read(port_id, reg_off); > + } else { > + printf("Not a PCI or AFU device\n"); > + return; > + } > reg_v >>=3D l_bit; > if (h_bit < 31) > reg_v &=3D ((1 << (h_bit - l_bit + 1)) - 1); @@ -974,12 +998,22 > @@ void print_valid_ports(void) port_reg_display(portid_t port_id, uint3= 2_t > reg_off) { > uint32_t reg_v; > + const struct rte_bus *bus; >=20 > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > if (port_reg_off_is_invalid(port_id, reg_off)) > return; > - reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + > + bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > + if (bus && !strcmp(bus->name, "pci")) { > + reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + reg_v =3D port_id_afu_reg_read(port_id, reg_off); > + } else { > + printf("Not a PCI or AFU device\n"); > + return; > + } > display_port_reg_value(port_id, reg_off, reg_v); } >=20 > @@ -988,6 +1022,7 @@ void print_valid_ports(void) > uint8_t bit_v) > { > uint32_t reg_v; > + const struct rte_bus *bus; >=20 > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > @@ -999,12 +1034,26 @@ void print_valid_ports(void) > printf("Invalid bit value %d (must be 0 or 1)\n", (int) bit_v); > return; > } > - reg_v =3D port_id_pci_reg_read(port_id, reg_off); > - if (bit_v =3D=3D 0) > - reg_v &=3D ~(1 << bit_pos); > - else > - reg_v |=3D (1 << bit_pos); > - port_id_pci_reg_write(port_id, reg_off, reg_v); > + > + bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > + if (bus && !strcmp(bus->name, "pci")) { > + reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + if (bit_v =3D=3D 0) > + reg_v &=3D ~(1 << bit_pos); > + else > + reg_v |=3D (1 << bit_pos); > + port_id_pci_reg_write(port_id, reg_off, reg_v); > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + reg_v =3D port_id_afu_reg_read(port_id, reg_off); > + if (bit_v =3D=3D 0) > + reg_v &=3D ~(1 << bit_pos); > + else > + reg_v |=3D (1 << bit_pos); > + port_id_afu_reg_write(port_id, reg_off, reg_v); > + } else { > + printf("Not a PCI or AFU device\n"); > + return; > + } > display_port_reg_value(port_id, reg_off, reg_v); } >=20 > @@ -1016,6 +1065,7 @@ void print_valid_ports(void) > uint32_t reg_v; > uint8_t l_bit; > uint8_t h_bit; > + const struct rte_bus *bus; >=20 > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > @@ -1041,21 +1091,45 @@ void print_valid_ports(void) > (unsigned)max_v, (unsigned)max_v); > return; > } > - reg_v =3D port_id_pci_reg_read(port_id, reg_off); > - reg_v &=3D ~(max_v << l_bit); /* Keep unchanged bits */ > - reg_v |=3D (value << l_bit); /* Set changed bits */ > - port_id_pci_reg_write(port_id, reg_off, reg_v); > + > + bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > + if (bus && !strcmp(bus->name, "pci")) { > + reg_v =3D port_id_pci_reg_read(port_id, reg_off); > + reg_v &=3D ~(max_v << l_bit); /* Keep unchanged bits */ > + reg_v |=3D (value << l_bit); /* Set changed bits */ > + port_id_pci_reg_write(port_id, reg_off, reg_v); > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + reg_v =3D port_id_afu_reg_read(port_id, reg_off); > + reg_v &=3D ~(max_v << l_bit); /* Keep unchanged bits */ > + reg_v |=3D (value << l_bit); /* Set changed bits */ > + port_id_afu_reg_write(port_id, reg_off, reg_v); > + } else { > + printf("Not a PCI or AFU device\n"); > + return; > + } > display_port_reg_value(port_id, reg_off, reg_v); } >=20 > void > port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t reg_v) { > + const struct rte_bus *bus; > + > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > if (port_reg_off_is_invalid(port_id, reg_off)) > return; > - port_id_pci_reg_write(port_id, reg_off, reg_v); > + > + bus =3D rte_bus_find_by_device(ports[port_id].dev_info.device); > + if (bus && !strcmp(bus->name, "pci")) { > + port_id_pci_reg_write(port_id, reg_off, reg_v); > + } else if (bus && !strcmp(bus->name, "ifpga")) { > + port_id_afu_reg_write(port_id, reg_off, reg_v); > + } else { > + printf("Not a PCI or AFU device\n"); > + return; > + } > + > display_port_reg_value(port_id, reg_off, reg_v); } >=20 > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index > 3ff11e6..0f51df4 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -11,6 +11,7 @@ > #include > #include > #include > +#include >=20 > #define RTE_PORT_ALL (~(portid_t)0x0) >=20 > @@ -671,6 +672,65 @@ struct mplsoudp_decap_conf { #define > port_id_pci_reg_write(pt_id, reg_off, reg_value) \ > port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) >=20 > +/** > + * Read/Write operations on an AFU register of a port. > + */ > +static inline uint32_t > +port_afu_reg_read(struct rte_port *port, uint32_t reg_off) { > + const struct rte_afu_device *afu_dev; > + const struct rte_bus *bus; > + void *reg_addr; > + uint32_t reg_v; > + > + if (!port->dev_info.device) { > + printf("Invalid device\n"); > + return 0; > + } > + > + bus =3D rte_bus_find_by_device(port->dev_info.device); > + if (bus && !strcmp(bus->name, "ifpga")) { > + afu_dev =3D RTE_DEV_TO_AFU(port->dev_info.device); > + } else { > + printf("Not an IFPGA AFU device\n"); > + return 0; > + } > + > + reg_addr =3D ((char *)afu_dev->mem_resource[0].addr + reg_off); > + reg_v =3D *((volatile uint32_t *)reg_addr); > + return rte_le_to_cpu_32(reg_v); > +} > + > +#define port_id_afu_reg_read(pt_id, reg_off) \ > + port_afu_reg_read(&ports[(pt_id)], (reg_off)) > + > +static inline void > +port_afu_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t > +reg_v) { > + const struct rte_afu_device *afu_dev; > + const struct rte_bus *bus; > + void *reg_addr; > + > + if (!port->dev_info.device) { > + printf("Invalid device\n"); > + return; > + } > + > + bus =3D rte_bus_find_by_device(port->dev_info.device); > + if (bus && !strcmp(bus->name, "ifpga")) { > + afu_dev =3D RTE_DEV_TO_AFU(port->dev_info.device); > + } else { > + printf("Not an IFPGA AFU device\n"); > + return; > + } > + > + reg_addr =3D ((char *)afu_dev->mem_resource[0].addr + reg_off); > + *((volatile uint32_t *)reg_addr) =3D rte_cpu_to_le_32(reg_v); } > + > +#define port_id_afu_reg_write(pt_id, reg_off, reg_value) \ > + port_afu_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) > + > /* Prototypes */ > unsigned int parse_item_list(char* str, const char* item_name, > unsigned int max_items, > -- > 1.8.3.1 Other wise Acked-by: Bernard Iremonger