From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759423AbcDEPp6 (ORCPT ); Tue, 5 Apr 2016 11:45:58 -0400 Received: from p3plsmtps2ded03.prod.phx3.secureserver.net ([208.109.80.60]:56431 "EHLO p3plsmtps2ded03.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933317AbcDEPpN (ORCPT ); Tue, 5 Apr 2016 11:45:13 -0400 x-originating-ip: 72.167.245.219 From: "K. Y. Srinivasan" To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com, jasowang@redhat.com Cc: Jake Oshins , "K. Y. Srinivasan" Subject: [PATCH 6/7] drivers:hv: Record MMIO range in use by frame buffer Date: Tue, 5 Apr 2016 10:22:55 -0700 Message-Id: <1459876976-15860-6-git-send-email-kys@microsoft.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1459876976-15860-1-git-send-email-kys@microsoft.com> References: <1459876777-15772-1-git-send-email-kys@microsoft.com> <1459876976-15860-1-git-send-email-kys@microsoft.com> X-CMAE-Envelope: MS4wfD5/CM6DV/geoiso32z4ToYt/1UQ1Dkt5TKRyLy0rrgsALos24nubS/YeDSw5N0YTy58SfJZAUsN8hfLXoVoyaW+Cg7pLaZpSmtw7KA0J/Glo47yNL1l R6Uh8QzwinCU2oNEfXfiNX7AkCnK3V7f8sqK+N3ha6w2uWM7tiilan8wn17rQ2INTFZ0PfF+5J4pvSjs6lN0m3AGBFPsh1sFjqzoQ1uez2i1o6ucc5EiEdWh 0JAK7+vmN5l8VZGExpQ2u70j464o5D9yqkMoj813ZQ8nIJk/IaXS3D1Ju/QnSNvWF8JeXCP7Hqy84m1kOrGBZuwvqdXXEzxBqiGB0f4Es8cD3Ir6gBSLcrUA Qp5AIc4YhLJ9nR5o7teki5EWuVImuwh4f8CensaiCuogTL/DPxdViHJxcQSqgNYoTRUTDaAcZg41cc87+7id+D7YqreKlg== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jake Oshins Later in the boot sequence, we need to figure out which memory ranges can be given out to various paravirtual drivers. The hyperv_fb driver should, ideally, be placed right on top of the frame buffer, without some other device getting plopped on top of this range in the meantime. Recording this now allows that to be guaranteed. Signed-off-by: Jake Oshins Signed-off-by: K. Y. Srinivasan --- Greg, please apply this to the 4.6 tree. drivers/hv/vmbus_drv.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index dfc6149..eaa5c3b 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -41,6 +41,7 @@ #include #include #include +#include #include "hyperv_vmbus.h" static struct acpi_device *hv_acpi_dev; @@ -101,6 +102,8 @@ static struct notifier_block hyperv_panic_block = { .notifier_call = hyperv_panic_event, }; +static const char *fb_mmio_name = "fb_range"; +static struct resource *fb_mmio; struct resource *hyperv_mmio; DEFINE_SEMAPHORE(hyperv_mmio_lock); @@ -1091,6 +1094,12 @@ static int vmbus_acpi_remove(struct acpi_device *device) struct resource *next_res; if (hyperv_mmio) { + if (fb_mmio) { + __release_region(hyperv_mmio, fb_mmio->start, + resource_size(fb_mmio)); + fb_mmio = NULL; + } + for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) { next_res = cur_res->sibling; kfree(cur_res); @@ -1100,6 +1109,30 @@ static int vmbus_acpi_remove(struct acpi_device *device) return 0; } +static void vmbus_reserve_fb(void) +{ + int size; + /* + * Make a claim for the frame buffer in the resource tree under the + * first node, which will be the one below 4GB. The length seems to + * be underreported, particularly in a Generation 1 VM. So start out + * reserving a larger area and make it smaller until it succeeds. + */ + + if (screen_info.lfb_base) { + if (efi_enabled(EFI_BOOT)) + size = max_t(__u32, screen_info.lfb_size, 0x800000); + else + size = max_t(__u32, screen_info.lfb_size, 0x4000000); + + for (; !fb_mmio && (size >= 0x100000); size >>= 1) { + fb_mmio = __request_region(hyperv_mmio, + screen_info.lfb_base, size, + fb_mmio_name, 0); + } + } +} + /** * vmbus_allocate_mmio() - Pick a memory-mapped I/O range. * @new: If successful, supplied a pointer to the @@ -1261,8 +1294,10 @@ static int vmbus_acpi_add(struct acpi_device *device) if (ACPI_FAILURE(result)) continue; - if (hyperv_mmio) + if (hyperv_mmio) { + vmbus_reserve_fb(); break; + } } ret_val = 0; -- 1.7.4.1