From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chas Williams <3chas3@gmail.com> Subject: Re: [PATCH v3] bus/pci: forbid VA as IOVA mode if IOMMU address width too small Date: Fri, 12 Jan 2018 17:46:25 -0500 Message-ID: References: <20180112102220.20061-1-maxime.coquelin@redhat.com> <89c16dd0-3938-f9ae-cc9f-189388abc0a9@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Cc: "Burakov, Anatoly" , dev@dpdk.org, stable@dpdk.org, Jianfeng Tan , "Zhang, Qi Z" , Stephen Hemminger , santosh.shukla@caviumnetworks.com, Thomas Monjalon , peterx@redhat.com To: Maxime Coquelin Return-path: In-Reply-To: List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Tested-by: Chas Williams On Fri, Jan 12, 2018 at 8:18 AM, Maxime Coquelin wrote: > Hi Anatoly, > > > On 01/12/2018 12:10 PM, Burakov, Anatoly wrote: > >> >> >> +#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 > > 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 >