From nobody Tue Nov 18 10:38:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of _spf.google.com designates 209.85.221.46 as permitted sender) client-ip=209.85.221.46; envelope-from=philippe.mathieu.daude@gmail.com; helo=mail-wr1-f46.google.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of _spf.google.com designates 209.85.221.46 as permitted sender) smtp.mailfrom=philippe.mathieu.daude@gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1609454997; cv=none; d=zohomail.com; s=zohoarc; b=OOcekUCitHrUGuztNWbTU0trM+rR2wj55YlX0bgeS3TNc3SepC/DJdGGpCNzo6wE4lF3NabX9wDdLptMNkE6kXPMWqVsvCg1/DL9wvV5UdR6feXPryjM7JMPEv631gPkgmlgjLRUcHxSzovMg1b3dAivO0PstR26cOEmyILn/qA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609454997; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WFrblze5li4MVZdmD/PXlDbbm0BIjxaFdcbJ0KL/q84=; b=MSSiu2Pb35xLYS1/+T5VUX6TD9L4AEqtd0pupWOetjm4PuAXc0XV5NTephdCtGXkuhjDr3fTrEXf4cVDn2dqagLK17PZ2ZY5e8E/hNbrz0nFgU5gvJBjRANlfk+cnSekC7jvH7ropYvn+16UDLMJ3zKU5VvsPZnXFEcqWsloSNc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of _spf.google.com designates 209.85.221.46 as permitted sender) smtp.mailfrom=philippe.mathieu.daude@gmail.com Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by mx.zohomail.com with SMTPS id 1609454997354488.4392758885682; Thu, 31 Dec 2020 14:49:57 -0800 (PST) Received: by mail-wr1-f46.google.com with SMTP id w5so21012379wrm.11 for ; Thu, 31 Dec 2020 14:49:54 -0800 (PST) Return-Path: Return-Path: Received: from localhost.localdomain (239.red-83-42-57.dynamicip.rima-tde.net. [83.42.57.239]) by smtp.gmail.com with ESMTPSA id y68sm15055472wmc.0.2020.12.31.14.49.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Dec 2020 14:49:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WFrblze5li4MVZdmD/PXlDbbm0BIjxaFdcbJ0KL/q84=; b=oCY+HZdeKzxfhjf18meqoCqH9zznlem7sYBdRiB6VTF1ann6gl2OyrxX5s7X2a2Rya AxZ4eeM6XHAOEP2SBAkqi/9N5Gj438kYyODZMOR8Y6jJCKzWwGqvyk34eyfbX57FQWI2 3MaR9wBDRFaodr4kB8vRp6I/Dc1fTIWlQNoe8b6OuMczQYIQT96LLbcIbgCXYe0AfQlK FfAcRSwRdXCgaBmcz9puZj8+BOzZfYF+UZencqjTndOMlyPfl6ERYlV3ms6mlAnFhc9B CsM9u2VH6v+smIph5AUzW/mjvVv80i9S53iOglgV+oDa+tiCy5JY2v02TvJOEVCEr1/s TTQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=WFrblze5li4MVZdmD/PXlDbbm0BIjxaFdcbJ0KL/q84=; b=CiqJDEv9ec0M1rLTBiGvdPaT0Z0cEn3FYkbldUNIh3/O4bhtyMZQAFuTgJv8MUdkrl OGuY1FTTL/BaSaGr+usYlRbNmfbu4lICOL8D8Or2zMVv2xuyA1QA5plHNAOYjr4AVIWz 3lwu9nudAfIQ9KHs0ExxCMhj3qEb6X6oBQHwYjDuJ59BL3/K31iZ2fax9aOONG3FEBvS h5b9kgxm4zKVI6vJmZihV4CZKL6FXrwOyg9hAr7JXxrVSy2i9fh720mL8jTFp6/ODtxI y8HyskQWUqfv/Wg857zhHQw0WD1x9R+11UB5gg5MsM03/3MbJ7eeDE3ZeEtkNtmqRCd8 q56Q== X-Gm-Message-State: AOAM530iscAjX0nrZroFiwvve8q16x8u81Sy/XcpMBsKezOwgn9xf0NX GR8JN4/6C99Kd31tDYH8ekM= X-Google-Smtp-Source: ABdhPJwrwe/LCzS7HK1cnQW6hO5y0DzMChCzRI6loZYj9hHRtsU0CfUiPYwbjGhFN9sXDBcgOmvwyw== X-Received: by 2002:adf:9d42:: with SMTP id o2mr57237279wre.135.1609454993514; Thu, 31 Dec 2020 14:49:53 -0800 (PST) Sender: =?UTF-8?Q?Philippe_Mathieu=2DDaud=C3=A9?= From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jiaxun Yang , Aleksandar Rikalo , Aurelien Jarno , Huacai Chen Subject: [RFC PATCH 08/18] hw/pci-host/bonito: Remap PCI "lo" regions when PCIMAP reg is modified Date: Thu, 31 Dec 2020 23:49:01 +0100 Message-Id: <20201231224911.1467352-9-f4bug@amsat.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201231224911.1467352-1-f4bug@amsat.org> References: <20201231224911.1467352-1-f4bug@amsat.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) Per the datasheet (Chapter 5.7.1. "PCI address regions"), the PCIMAP register: Map the 64Mbyte regions marked "PCI_Lo" in the CPU's memory map, each of which can be assigned to any 64 Mbyte-aligned region of PCI memory. The address appearing on the PCI bus consists of the low 26 bits of the CPU physical address, with the high 6 bits coming from the appropriate base6 field. Each of the three regions is an independent window onto PCI memory, and can be positioned on any 64Mbyte boundary in PCI space. Remap the 3 regions on reset and when PCIMAP is updated. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- RFC: memory_region_is_mapped() is probably not the best call to check if this is the first call. hw/pci-host/bonito.c | 49 ++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c index 29c0294d289..a091ef15d27 100644 --- a/hw/pci-host/bonito.c +++ b/hw/pci-host/bonito.c @@ -138,6 +138,10 @@ FIELD(BONGENCFG, PCIQUEUE, 12, 1) =20 /* 4. PCI address map control */ #define BONITO_PCIMAP (0x10 >> 2) /* 0x110 */ +FIELD(PCIMAP, LO0, 0, 6) +FIELD(PCIMAP, LO1, 6, 6) +FIELD(PCIMAP, LO2, 12, 6) +FIELD(PCIMAP, 2G, 18, 1) #define BONITO_PCIMEMBASECFG (0x14 >> 2) /* 0x114 */ #define BONITO_PCIMAP_CFG (0x18 >> 2) /* 0x118 */ =20 @@ -232,6 +236,7 @@ struct BonitoState { qemu_irq *pic; PCIBonitoState *pci_dev; MemoryRegion pci_mem; + MemoryRegion pcimem_lo_alias[3]; }; =20 #define TYPE_BONITO_PCI_HOST_BRIDGE "Bonito-pcihost" @@ -240,6 +245,31 @@ OBJECT_DECLARE_SIMPLE_TYPE(BonitoState, BONITO_PCI_HOS= T_BRIDGE) #define TYPE_PCI_BONITO "Bonito" OBJECT_DECLARE_SIMPLE_TYPE(PCIBonitoState, PCI_BONITO) =20 +static void bonito_remap(PCIBonitoState *s) +{ + static const char *const region_name[3] =3D { + "pci.lomem0", "pci.lomem1", "pci.lomem2" + }; + BonitoState *bs =3D BONITO_PCI_HOST_BRIDGE(s->pcihost); + + for (size_t i =3D 0; i < 3; i++) { + uint32_t offset =3D extract32(s->regs[BONITO_PCIMAP], 6 * i, 6) <<= 26; + + if (memory_region_is_mapped(&bs->pcimem_lo_alias[i])) { + memory_region_del_subregion(get_system_memory(), + &bs->pcimem_lo_alias[i]); + object_unparent(OBJECT(&bs->pcimem_lo_alias[i])); + } + + memory_region_init_alias(&bs->pcimem_lo_alias[i], OBJECT(s), + region_name[i], &bs->pci_mem, + offset, 64 * MiB); + memory_region_add_subregion(get_system_memory(), + BONITO_PCILO_BASE + i * 64 * MiB, + &bs->pcimem_lo_alias[i]); + } +} + static void bonito_writel(void *opaque, hwaddr addr, uint64_t val, unsigned size) { @@ -253,7 +283,6 @@ static void bonito_writel(void *opaque, hwaddr addr, switch (saddr) { case BONITO_IODEVCFG: case BONITO_SDCFG: - case BONITO_PCIMAP: case BONITO_PCIMEMBASECFG: case BONITO_PCIMAP_CFG: case BONITO_GPIODATA: @@ -275,6 +304,10 @@ static void bonito_writel(void *opaque, hwaddr addr, case BONITO_MEMSIZE: s->regs[saddr] =3D val; break; + case BONITO_PCIMAP: + s->regs[saddr] =3D val; + bonito_remap(s); + break; case BONITO_BONGENCFG: if (!FIELD_EX32(s->regs[saddr], BONGENCFG, CPUSELFRESET) && FIELD_EX32(val, BONGENCFG, CPUSELFRESET)) { @@ -603,6 +636,8 @@ static void bonito_reset(void *opaque) s->regs[BONITO_DQCFG] =3D 0x8; s->regs[BONITO_MEMSIZE] =3D 0x10000000; s->regs[BONITO_PCIMAP] =3D 0x6140; + + bonito_remap(s); } =20 static const VMStateDescription vmstate_bonito =3D { @@ -619,7 +654,6 @@ static void bonito_pcihost_realize(DeviceState *dev, Er= ror **errp) { PCIHostState *phb =3D PCI_HOST_BRIDGE(dev); BonitoState *bs =3D BONITO_PCI_HOST_BRIDGE(dev); - MemoryRegion *pcimem_lo_alias =3D g_new(MemoryRegion, 3); =20 memory_region_init(&bs->pci_mem, OBJECT(dev), "pci.mem", BONITO_PCIHI_= SIZE); phb->bus =3D pci_register_root_bus(dev, "pci", @@ -627,17 +661,6 @@ static void bonito_pcihost_realize(DeviceState *dev, E= rror **errp) dev, &bs->pci_mem, get_system_io(), PCI_DEVFN(5, 0), 32, TYPE_PCI_BUS); =20 - for (size_t i =3D 0; i < 3; i++) { - char *name =3D g_strdup_printf("pci.lomem%zu", i); - - memory_region_init_alias(&pcimem_lo_alias[i], NULL, name, - &bs->pci_mem, i * 64 * MiB, 64 * MiB); - memory_region_add_subregion(get_system_memory(), - BONITO_PCILO_BASE + i * 64 * MiB, - &pcimem_lo_alias[i]); - g_free(name); - } - create_unimplemented_device("pci.io", BONITO_PCIIO_BASE, 1 * MiB); } =20 --=20 2.26.2