From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6AA5C4743E for ; Tue, 8 Jun 2021 07:41:10 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8F2ED6127A for ; Tue, 8 Jun 2021 07:41:10 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8F2ED6127A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 041A26EB0F; Tue, 8 Jun 2021 07:41:10 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id CF38F6EB0D; Tue, 8 Jun 2021 07:41:08 +0000 (UTC) IronPort-SDR: sKvOhhDHfl2w93GgNfnAAzx9xLjEHyBOIVDHNnzEQjxDwj7cmLCpRXjRnW53Ic2j9rdZ65lxZG YAQtRwJhmXYg== X-IronPort-AV: E=McAfee;i="6200,9189,10008"; a="226133050" X-IronPort-AV: E=Sophos;i="5.83,257,1616482800"; d="scan'208";a="226133050" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jun 2021 00:41:07 -0700 IronPort-SDR: kHVD6k15MeVjNlcHfoQ9wTGzp2A44FP/+b3mePK8bR38cDihlrygJzfgsRjVxvYH0TTbhWotfN G6R4INcEIPBg== X-IronPort-AV: E=Sophos;i="5.83,257,1616482800"; d="scan'208";a="418809532" Received: from delmer-mobl.ger.corp.intel.com (HELO [10.249.254.231]) ([10.249.254.231]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jun 2021 00:41:05 -0700 Message-ID: Subject: Re: [PATCH 6/6] drm/i915/ttm: restore min_page_size behaviour From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Matthew Auld , intel-gfx@lists.freedesktop.org Date: Tue, 08 Jun 2021 09:41:03 +0200 In-Reply-To: <20210607182210.99036-7-matthew.auld@intel.com> References: <20210607182210.99036-1-matthew.auld@intel.com> <20210607182210.99036-7-matthew.auld@intel.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.1 (3.40.1-1.fc34) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Mon, 2021-06-07 at 19:22 +0100, Matthew Auld wrote: > We now have bo->page_alignment which perfectly describes what we need > if > we have min page size restrictions for lmem. We can also drop the > flag > here, since this is the default behaviour for all objects. > > Signed-off-by: Matthew Auld > Cc: Thomas Hellström > --- >  drivers/gpu/drm/i915/gem/i915_gem_ttm.c      | 3 +-- >  drivers/gpu/drm/i915/intel_memory_region.h   | 3 +-- >  drivers/gpu/drm/i915/intel_region_ttm.c      | 2 +- >  drivers/gpu/drm/i915/selftests/mock_region.c | 2 +- >  4 files changed, 4 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > index 3f5624f36afc..eda6c258ea92 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > @@ -684,9 +684,8 @@ int __i915_gem_ttm_object_init(struct > intel_memory_region *mem, >          */ >         obj->base.vma_node.driver_private = i915_gem_to_ttm(obj); >         ret = ttm_bo_init(&i915->bdev, i915_gem_to_ttm(obj), size, > -                         bo_type, &i915_sys_placement, PAGE_SIZE, > +                         bo_type, &i915_sys_placement, mem- > >min_page_size, Page size units here as well. >                           true, NULL, NULL, i915_ttm_bo_destroy); > - >         if (!ret) >                 obj->ttm.created = true; >   > diff --git a/drivers/gpu/drm/i915/intel_memory_region.h > b/drivers/gpu/drm/i915/intel_memory_region.h > index b04fb22726d9..2be8433d373a 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.h > +++ b/drivers/gpu/drm/i915/intel_memory_region.h > @@ -40,8 +40,7 @@ enum intel_region_id { >  #define REGION_STOLEN_SMEM   BIT(INTEL_REGION_STOLEN_SMEM) >  #define REGION_STOLEN_LMEM   BIT(INTEL_REGION_STOLEN_LMEM) >   > -#define I915_ALLOC_MIN_PAGE_SIZE  BIT(0) > -#define I915_ALLOC_CONTIGUOUS     BIT(1) > +#define I915_ALLOC_CONTIGUOUS     BIT(0) >   >  #define for_each_memory_region(mr, i915, id) \ >         for (id = 0; id < ARRAY_SIZE((i915)->mm.regions); id++) \ > diff --git a/drivers/gpu/drm/i915/intel_region_ttm.c > b/drivers/gpu/drm/i915/intel_region_ttm.c > index 23af995f7b67..59fa78225852 100644 > --- a/drivers/gpu/drm/i915/intel_region_ttm.c > +++ b/drivers/gpu/drm/i915/intel_region_ttm.c > @@ -153,7 +153,7 @@ intel_region_ttm_node_alloc(struct > intel_memory_region *mem, >         int ret; >   >         mock_bo.base.size = size; > -       mock_bo.page_alignment = PAGE_SIZE; > +       mock_bo.page_alignment = mem->min_page_size; And here. >         place.flags = flags; >   >         ret = man->func->alloc(man, &mock_bo, &place, &res); > diff --git a/drivers/gpu/drm/i915/selftests/mock_region.c > b/drivers/gpu/drm/i915/selftests/mock_region.c > index d3e4e6573cb9..6ce0f9dacad7 100644 > --- a/drivers/gpu/drm/i915/selftests/mock_region.c > +++ b/drivers/gpu/drm/i915/selftests/mock_region.c > @@ -28,7 +28,7 @@ static int mock_region_get_pages(struct > drm_i915_gem_object *obj) >         struct sg_table *pages; >         int err; >   > -       flags = I915_ALLOC_MIN_PAGE_SIZE; > +       flags = 0; >         if (obj->flags & I915_BO_ALLOC_CONTIGUOUS) >                 flags |= TTM_PL_FLAG_CONTIGUOUS; >   From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C239C47082 for ; Tue, 8 Jun 2021 07:41:10 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CF7216127A for ; Tue, 8 Jun 2021 07:41:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CF7216127A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 838AA6EB0D; Tue, 8 Jun 2021 07:41:09 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id CF38F6EB0D; Tue, 8 Jun 2021 07:41:08 +0000 (UTC) IronPort-SDR: sKvOhhDHfl2w93GgNfnAAzx9xLjEHyBOIVDHNnzEQjxDwj7cmLCpRXjRnW53Ic2j9rdZ65lxZG YAQtRwJhmXYg== X-IronPort-AV: E=McAfee;i="6200,9189,10008"; a="226133050" X-IronPort-AV: E=Sophos;i="5.83,257,1616482800"; d="scan'208";a="226133050" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jun 2021 00:41:07 -0700 IronPort-SDR: kHVD6k15MeVjNlcHfoQ9wTGzp2A44FP/+b3mePK8bR38cDihlrygJzfgsRjVxvYH0TTbhWotfN G6R4INcEIPBg== X-IronPort-AV: E=Sophos;i="5.83,257,1616482800"; d="scan'208";a="418809532" Received: from delmer-mobl.ger.corp.intel.com (HELO [10.249.254.231]) ([10.249.254.231]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jun 2021 00:41:05 -0700 Message-ID: From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Matthew Auld , intel-gfx@lists.freedesktop.org Date: Tue, 08 Jun 2021 09:41:03 +0200 In-Reply-To: <20210607182210.99036-7-matthew.auld@intel.com> References: <20210607182210.99036-1-matthew.auld@intel.com> <20210607182210.99036-7-matthew.auld@intel.com> User-Agent: Evolution 3.40.1 (3.40.1-1.fc34) MIME-Version: 1.0 Subject: Re: [Intel-gfx] [PATCH 6/6] drm/i915/ttm: restore min_page_size behaviour X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gTW9uLCAyMDIxLTA2LTA3IGF0IDE5OjIyICswMTAwLCBNYXR0aGV3IEF1bGQgd3JvdGU6Cj4g V2Ugbm93IGhhdmUgYm8tPnBhZ2VfYWxpZ25tZW50IHdoaWNoIHBlcmZlY3RseSBkZXNjcmliZXMg d2hhdCB3ZSBuZWVkCj4gaWYKPiB3ZSBoYXZlIG1pbiBwYWdlIHNpemUgcmVzdHJpY3Rpb25zIGZv ciBsbWVtLiBXZSBjYW4gYWxzbyBkcm9wIHRoZQo+IGZsYWcKPiBoZXJlLCBzaW5jZSB0aGlzIGlz IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgYWxsIG9iamVjdHMuCj4gCj4gU2lnbmVkLW9mZi1i eTogTWF0dGhldyBBdWxkIDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgo+IENjOiBUaG9tYXMgSGVs bHN0csO2bSA8dGhvbWFzLmhlbGxzdHJvbUBsaW51eC5pbnRlbC5jb20+Cj4gLS0tCj4gwqBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fdHRtLmPCoMKgwqDCoMKgIHwgMyArLS0KPiDC oGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaMKgwqAgfCAzICstLQo+ IMKgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmVnaW9uX3R0bS5jwqDCoMKgwqDCoCB8IDIg Ky0KPiDCoGRyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9tb2NrX3JlZ2lvbi5jIHwgMiAr LQo+IMKgNCBmaWxlcyBjaGFuZ2VkLCA0IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCj4g Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV90dG0uYwo+ IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX3R0bS5jCj4gaW5kZXggM2Y1NjI0 ZjM2YWZjLi5lZGE2YzI1OGVhOTIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z2VtL2k5MTVfZ2VtX3R0bS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX3R0bS5jCj4gQEAgLTY4NCw5ICs2ODQsOCBAQCBpbnQgX19pOTE1X2dlbV90dG1fb2JqZWN0 X2luaXQoc3RydWN0Cj4gaW50ZWxfbWVtb3J5X3JlZ2lvbiAqbWVtLAo+IMKgwqDCoMKgwqDCoMKg wqAgKi8KPiDCoMKgwqDCoMKgwqDCoMKgb2JqLT5iYXNlLnZtYV9ub2RlLmRyaXZlcl9wcml2YXRl ID0gaTkxNV9nZW1fdG9fdHRtKG9iaik7Cj4gwqDCoMKgwqDCoMKgwqDCoHJldCA9IHR0bV9ib19p bml0KCZpOTE1LT5iZGV2LCBpOTE1X2dlbV90b190dG0ob2JqKSwgc2l6ZSwKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvX3R5cGUsICZpOTE1X3N5 c19wbGFjZW1lbnQsIFBBR0VfU0laRSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGJvX3R5cGUsICZpOTE1X3N5c19wbGFjZW1lbnQsIG1lbS0KPiA+ bWluX3BhZ2Vfc2l6ZSwKClBhZ2Ugc2l6ZSB1bml0cyBoZXJlIGFzIHdlbGwuCgo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRydWUsIE5VTEwsIE5V TEwsIGk5MTVfdHRtX2JvX2Rlc3Ryb3kpOwo+IC0KPiDCoMKgwqDCoMKgwqDCoMKgaWYgKCFyZXQp Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvYmotPnR0bS5jcmVhdGVkID0gdHJ1 ZTsKPiDCoAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tZW1vcnlf cmVnaW9uLmgKPiBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaAo+ IGluZGV4IGIwNGZiMjI3MjZkOS4uMmJlODQzM2QzNzNhIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2ludGVsX21lbW9yeV9yZWdpb24uaAo+IEBAIC00MCw4ICs0MCw3IEBAIGVudW0gaW50 ZWxfcmVnaW9uX2lkIHsKPiDCoCNkZWZpbmUgUkVHSU9OX1NUT0xFTl9TTUVNwqDCoCBCSVQoSU5U RUxfUkVHSU9OX1NUT0xFTl9TTUVNKQo+IMKgI2RlZmluZSBSRUdJT05fU1RPTEVOX0xNRU3CoMKg IEJJVChJTlRFTF9SRUdJT05fU1RPTEVOX0xNRU0pCj4gwqAKPiAtI2RlZmluZSBJOTE1X0FMTE9D X01JTl9QQUdFX1NJWkXCoCBCSVQoMCkKPiAtI2RlZmluZSBJOTE1X0FMTE9DX0NPTlRJR1VPVVPC oMKgwqDCoCBCSVQoMSkKPiArI2RlZmluZSBJOTE1X0FMTE9DX0NPTlRJR1VPVVPCoMKgwqDCoCBC SVQoMCkKPiDCoAo+IMKgI2RlZmluZSBmb3JfZWFjaF9tZW1vcnlfcmVnaW9uKG1yLCBpOTE1LCBp ZCkgXAo+IMKgwqDCoMKgwqDCoMKgwqBmb3IgKGlkID0gMDsgaWQgPCBBUlJBWV9TSVpFKChpOTE1 KS0+bW0ucmVnaW9ucyk7IGlkKyspIFwKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfcmVnaW9uX3R0bS5jCj4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdp b25fdHRtLmMKPiBpbmRleCAyM2FmOTk1ZjdiNjcuLjU5ZmE3ODIyNTg1MiAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdpb25fdHRtLmMKPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9yZWdpb25fdHRtLmMKPiBAQCAtMTUzLDcgKzE1Myw3IEBAIGlu dGVsX3JlZ2lvbl90dG1fbm9kZV9hbGxvYyhzdHJ1Y3QKPiBpbnRlbF9tZW1vcnlfcmVnaW9uICpt ZW0sCj4gwqDCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gwqAKPiDCoMKgwqDCoMKgwqDCoMKgbW9j a19iby5iYXNlLnNpemUgPSBzaXplOwo+IC3CoMKgwqDCoMKgwqDCoG1vY2tfYm8ucGFnZV9hbGln bm1lbnQgPSBQQUdFX1NJWkU7Cj4gK8KgwqDCoMKgwqDCoMKgbW9ja19iby5wYWdlX2FsaWdubWVu dCA9IG1lbS0+bWluX3BhZ2Vfc2l6ZTsKCkFuZCBoZXJlLgoKPiDCoMKgwqDCoMKgwqDCoMKgcGxh Y2UuZmxhZ3MgPSBmbGFnczsKPiDCoAo+IMKgwqDCoMKgwqDCoMKgwqByZXQgPSBtYW4tPmZ1bmMt PmFsbG9jKG1hbiwgJm1vY2tfYm8sICZwbGFjZSwgJnJlcyk7Cj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9tb2NrX3JlZ2lvbi5jCj4gYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvbW9ja19yZWdpb24uYwo+IGluZGV4IGQzZTRlNjU3M2NiOS4uNmNl MGY5ZGFjYWQ3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9t b2NrX3JlZ2lvbi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL21vY2tf cmVnaW9uLmMKPiBAQCAtMjgsNyArMjgsNyBAQCBzdGF0aWMgaW50IG1vY2tfcmVnaW9uX2dldF9w YWdlcyhzdHJ1Y3QKPiBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCj4gwqDCoMKgwqDCoMKgwqDC oHN0cnVjdCBzZ190YWJsZSAqcGFnZXM7Cj4gwqDCoMKgwqDCoMKgwqDCoGludCBlcnI7Cj4gwqAK PiAtwqDCoMKgwqDCoMKgwqBmbGFncyA9IEk5MTVfQUxMT0NfTUlOX1BBR0VfU0laRTsKPiArwqDC oMKgwqDCoMKgwqBmbGFncyA9IDA7Cj4gwqDCoMKgwqDCoMKgwqDCoGlmIChvYmotPmZsYWdzICYg STkxNV9CT19BTExPQ19DT05USUdVT1VTKQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfQ09OVElHVU9VUzsKPiDCoAoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QK SW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=