Tested-by: Chas Williams <c...@att.com> On Fri, Jan 12, 2018 at 8:18 AM, Maxime Coquelin <maxime.coque...@redhat.com > wrote:
> Hi Anatoly, > > > On 01/12/2018 12:10 PM, Burakov, Anatoly wrote: > >> <snip> >> >> +#if defined(RTE_ARCH_X86) >>> +static bool >>> +pci_one_device_iommu_support_va(struct rte_pci_device *dev) >>> +{ >>> +#define VTD_CAP_MGAW_SHIFT 16 >>> +#define VTD_CAP_MGAW_MASK (0x3fULL << VTD_CAP_MGAW_SHIFT) >>> +#define X86_VA_WIDTH 47 /* From Documentation/x86/x86_64/mm.txt */ >>> + struct rte_pci_addr *addr = &dev->addr; >>> + char filename[PATH_MAX]; >>> + FILE *fp; >>> + uint64_t mgaw, vtd_cap_reg = 0; >>> + >>> + snprintf(filename, sizeof(filename), >>> + "%s/" PCI_PRI_FMT "/iommu/intel-iommu/cap", >>> + rte_pci_get_sysfs_path(), addr->domain, addr->bus, addr->devid, >>> + addr->function); >>> + if (access(filename, F_OK) == -1) { >>> + /* We don't have an Intel IOMMU, assume VA supported*/ >>> + return true; >>> + } >>> + >>> + /* We have an intel IOMMU */ >>> + fp = fopen(filename, "r"); >>> + if (fp == NULL) { >>> + RTE_LOG(ERR, EAL, "%s(): can't open %s\n", __func__, filename); >>> + return false; >>> + } >>> + >>> + if (fscanf(fp, "%lx", &vtd_cap_reg) != 1) { >>> + RTE_LOG(ERR, EAL, "%s(): can't read %s\n", __func__, filename); >>> + fclose(fp); >>> + return false; >>> + } >>> + >>> + fclose(fp); >>> >> >> Hi Maxime, >> >> You probably want to use eal_parse_sysfs_value() for this. >> > > I initially planned to use it, but the sysfs value is hexadecimal, but > not prefixed with "0x". For example: > > # cat /sys/devices/pci0000\:00/0000\:00\:02.0/iommu/intel-iommu/cap > 1c0000c40660462 > > So strtoul() assumes the value is decimal in this case, as explained in > its man page: > > " > DESCRIPTION > <snip\> > If base is zero or 16, the string may then include a "0x" prefix, and > the number will be read in base 16; otherwise, a zero base is taken as > 10 (decimal) > " > > Thanks, > Maxime >