From patchwork Tue May 21 10:57:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 245274 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 550F12C008A for ; Tue, 21 May 2013 21:06:13 +1000 (EST) Received: from localhost ([::1]:56586 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UekOQ-0007Ez-Cy for incoming@patchwork.ozlabs.org; Tue, 21 May 2013 07:06:10 -0400 Received: from eggs.gnu.org ([208.118.235.92]:45237) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UekH2-0005Al-K1 for qemu-devel@nongnu.org; Tue, 21 May 2013 06:58:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UekH1-0005Z8-Ad for qemu-devel@nongnu.org; Tue, 21 May 2013 06:58:32 -0400 Received: from mail-ea0-x229.google.com ([2a00:1450:4013:c01::229]:59336) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UekH1-0005Yv-4L for qemu-devel@nongnu.org; Tue, 21 May 2013 06:58:31 -0400 Received: by mail-ea0-f169.google.com with SMTP id m14so307262eaj.28 for ; Tue, 21 May 2013 03:58:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=8OPb2963E8rLypP28IiMx9FJGfPXP9wXRFdhGmsmuaM=; b=OzcbG5fKdfq0fTmnjfwe/roklKd+SZ+lpxe81uT7LcHcvvJHwao16nubJ3drx1zv6U KjkC9/MoKvLYmfH/sFWYKxnUQJOuygbEn+QIF9fiogJc9vvyvmZ8HgvToN14H1YaimL4 CnjI/gqPkF3zNyg1nmsi9bf1KlR7J95o1VW5UVMdtWCRb3CBDR9eAjShxsfd7qVKbQFs +OGbBpFwAChebrXJ5e5YRLc9KjX0C6sTjTc7L84YarFUZ7DUkopOBD7925fxGc+Omslc gHmx4vO5kxKjDXFiVG7kArJRNxn18VDzWsKdrk8KDtLo5p+LkHakjw9OANQaGG3tlHJE Fjxg== X-Received: by 10.14.95.4 with SMTP id o4mr888987eef.2.1369133910343; Tue, 21 May 2013 03:58:30 -0700 (PDT) Received: from playground.lan (net-37-116-223-193.cust.dsl.vodafone.it. [37.116.223.193]) by mx.google.com with ESMTPSA id a5sm2754398ees.6.2013.05.21.03.58.28 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 21 May 2013 03:58:29 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 21 May 2013 12:57:25 +0200 Message-Id: <1369133851-1894-25-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1369133851-1894-1-git-send-email-pbonzini@redhat.com> References: <1369133851-1894-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4013:c01::229 Cc: peter.maydell@linaro.org, jan.kiszka@gmail.com, David Gibson Subject: [Qemu-devel] [PATCH 24/30] spapr: make IOMMU translation go through IOMMUTLBEntry X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The next step is to introduce the translation code that will be used for IOMMU MemoryRegions, but still do the actual translation in a DMAContext. Acked-by: David Gibson Signed-off-by: Paolo Bonzini --- hw/ppc/spapr_iommu.c | 59 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index 7a507e0..f6d74fe 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -68,15 +68,8 @@ static sPAPRTCETable *spapr_tce_find_by_liobn(uint32_t liobn) return NULL; } -static int spapr_tce_translate(DMAContext *dma, - dma_addr_t addr, - hwaddr *paddr, - hwaddr *len, - DMADirection dir) +static IOMMUTLBEntry spapr_tce_translate_iommu(sPAPRTCETable *tcet, hwaddr addr) { - sPAPRTCETable *tcet = DO_UPCAST(sPAPRTCETable, dma, dma); - enum sPAPRTCEAccess access = (dir == DMA_DIRECTION_FROM_DEVICE) - ? SPAPR_TCE_WO : SPAPR_TCE_RO; uint64_t tce; #ifdef DEBUG_TCE @@ -85,9 +78,12 @@ static int spapr_tce_translate(DMAContext *dma, #endif if (tcet->bypass) { - *paddr = addr; - *len = (hwaddr)-1; - return 0; + return (IOMMUTLBEntry) { + .iova = 0, + .translated_addr = 0, + .addr_mask = ~(hwaddr)0, + .perm = IOMMU_RW, + }; } /* Check if we are in bound */ @@ -95,28 +91,41 @@ static int spapr_tce_translate(DMAContext *dma, #ifdef DEBUG_TCE fprintf(stderr, "spapr_tce_translate out of bounds\n"); #endif - return -EFAULT; + return (IOMMUTLBEntry) { .perm = IOMMU_NONE }; } tce = tcet->table[addr >> SPAPR_TCE_PAGE_SHIFT].tce; - /* Check TCE */ - if (!(tce & access)) { - return -EPERM; - } +#ifdef DEBUG_TCE + fprintf(stderr, " -> *paddr=0x%llx, *len=0x%llx\n", + (tce & ~SPAPR_TCE_PAGE_MASK), SPAPR_TCE_PAGE_MASK + 1); +#endif - /* How much til end of page ? */ - *len = ((~addr) & SPAPR_TCE_PAGE_MASK) + 1; + return (IOMMUTLBEntry) { + .iova = addr & ~SPAPR_TCE_PAGE_MASK, + .translated_addr = tce & ~SPAPR_TCE_PAGE_MASK, + .addr_mask = SPAPR_TCE_PAGE_MASK, + .perm = tce, + }; +} - /* Translate */ - *paddr = (tce & ~SPAPR_TCE_PAGE_MASK) | - (addr & SPAPR_TCE_PAGE_MASK); +static int spapr_tce_translate(DMAContext *dma, + dma_addr_t addr, + hwaddr *paddr, + hwaddr *len, + DMADirection dir) + { + sPAPRTCETable *tcet = DO_UPCAST(sPAPRTCETable, dma, dma); + bool is_write = (dir == DMA_DIRECTION_FROM_DEVICE); + IOMMUTLBEntry entry = spapr_tce_translate_iommu(tcet, addr); -#ifdef DEBUG_TCE - fprintf(stderr, " -> *paddr=0x" TARGET_FMT_plx ", *len=0x" - TARGET_FMT_plx "\n", *paddr, *len); -#endif + if (!(entry.perm & (1 << is_write))) { + return -EPERM; + } + /* Translate */ + *paddr = entry.translated_addr | (addr & entry.addr_mask); + *len = (addr | entry.addr_mask) - addr + 1; return 0; }