From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Thomas Huth <thuth@redhat.com>,
yang.zhong@intel.com, pbonzini@redhat.com, qemu-devel@nongnu.org
Cc: qemu-arm@nongnu.org, John Snow <jsnow@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Peter Maydell <peter.maydell@linaro.org>
Subject: Re: [Qemu-devel] [PATCH v4 03/29] hw/sd/sdhci: Move PCI-related code into a separate file
Date: Sun, 10 Mar 2019 22:12:46 +0100 [thread overview]
Message-ID: <16df6c28-aa13-90cf-09b7-c002eb0c4d59@redhat.com> (raw)
In-Reply-To: <1551968334-18982-4-git-send-email-thuth@redhat.com>
On 3/7/19 3:18 PM, Thomas Huth wrote:
> Some machines have an SDHCI device, but no PCI. To be able to
> compile hw/sd/sdhci.c without CONFIG_PCI, we must not call functions
> like pci_get_address_space() and pci_allocate_irq() there. Thus
> move the PCI-related code into a separate file.
>
> This is required for the new Kconfig-like build system, e.g. it is
> needed if a user wants to compile a QEMU binary with just one machine
> that has SDHCI, but no PCI, like the ARM "raspi" machines for example.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> hw/sd/Kconfig | 6 +++-
> hw/sd/Makefile.objs | 1 +
> hw/sd/sdhci-internal.h | 34 ++++++++++++++++++
> hw/sd/sdhci-pci.c | 87 ++++++++++++++++++++++++++++++++++++++++++++
> hw/sd/sdhci.c | 98 +++-----------------------------------------------
> 5 files changed, 132 insertions(+), 94 deletions(-)
> create mode 100644 hw/sd/sdhci-pci.c
>
> diff --git a/hw/sd/Kconfig b/hw/sd/Kconfig
> index 864f535..c5e1e55 100644
> --- a/hw/sd/Kconfig
> +++ b/hw/sd/Kconfig
> @@ -12,6 +12,10 @@ config SD
>
> config SDHCI
> bool
> + select SD
Hmm this should be SDBUS. I'll clean that up later.
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> +
> +config SDHCI_PCI
> + bool
> default y if PCI_DEVICES
> depends on PCI
> - select SD
> + select SDHCI
> diff --git a/hw/sd/Makefile.objs b/hw/sd/Makefile.objs
> index a99d9fb..0665727 100644
> --- a/hw/sd/Makefile.objs
> +++ b/hw/sd/Makefile.objs
> @@ -2,6 +2,7 @@ common-obj-$(CONFIG_PL181) += pl181.o
> common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
> common-obj-$(CONFIG_SD) += sd.o core.o sdmmc-internal.o
> common-obj-$(CONFIG_SDHCI) += sdhci.o
> +common-obj-$(CONFIG_SDHCI_PCI) += sdhci-pci.o
>
> obj-$(CONFIG_MILKYMIST) += milkymist-memcard.o
> obj-$(CONFIG_OMAP) += omap_mmc.o
> diff --git a/hw/sd/sdhci-internal.h b/hw/sd/sdhci-internal.h
> index 19665fd..3414140 100644
> --- a/hw/sd/sdhci-internal.h
> +++ b/hw/sd/sdhci-internal.h
> @@ -304,4 +304,38 @@ extern const VMStateDescription sdhci_vmstate;
>
> #define ESDHC_PRNSTS_SDSTB (1 << 3)
>
> +/*
> + * Default SD/MMC host controller features information, which will be
> + * presented in CAPABILITIES register of generic SD host controller at reset.
> + *
> + * support:
> + * - 3.3v and 1.8v voltages
> + * - SDMA/ADMA1/ADMA2
> + * - high-speed
> + * max host controller R/W buffers size: 512B
> + * max clock frequency for SDclock: 52 MHz
> + * timeout clock frequency: 52 MHz
> + *
> + * does not support:
> + * - 3.0v voltage
> + * - 64-bit system bus
> + * - suspend/resume
> + */
> +#define SDHC_CAPAB_REG_DEFAULT 0x057834b4
> +
> +#define DEFINE_SDHCI_COMMON_PROPERTIES(_state) \
> + DEFINE_PROP_UINT8("sd-spec-version", _state, sd_spec_version, 2), \
> + DEFINE_PROP_UINT8("uhs", _state, uhs_mode, UHS_NOT_SUPPORTED), \
> + \
> + /* Capabilities registers provide information on supported
> + * features of this specific host controller implementation */ \
> + DEFINE_PROP_UINT64("capareg", _state, capareg, SDHC_CAPAB_REG_DEFAULT), \
> + DEFINE_PROP_UINT64("maxcurr", _state, maxcurr, 0)
> +
> +void sdhci_initfn(SDHCIState *s);
> +void sdhci_uninitfn(SDHCIState *s);
> +void sdhci_common_realize(SDHCIState *s, Error **errp);
> +void sdhci_common_unrealize(SDHCIState *s, Error **errp);
> +void sdhci_common_class_init(ObjectClass *klass, void *data);
> +
> #endif
> diff --git a/hw/sd/sdhci-pci.c b/hw/sd/sdhci-pci.c
> new file mode 100644
> index 0000000..f884661
> --- /dev/null
> +++ b/hw/sd/sdhci-pci.c
> @@ -0,0 +1,87 @@
> +/*
> + * SDHCI device on PCI
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> + * See the GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qapi/error.h"
> +#include "hw/hw.h"
> +#include "hw/sd/sdhci.h"
> +#include "sdhci-internal.h"
> +
> +static Property sdhci_pci_properties[] = {
> + DEFINE_SDHCI_COMMON_PROPERTIES(SDHCIState),
> + DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static void sdhci_pci_realize(PCIDevice *dev, Error **errp)
> +{
> + SDHCIState *s = PCI_SDHCI(dev);
> + Error *local_err = NULL;
> +
> + sdhci_initfn(s);
> + sdhci_common_realize(s, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +
> + dev->config[PCI_CLASS_PROG] = 0x01; /* Standard Host supported DMA */
> + dev->config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
> + s->irq = pci_allocate_irq(dev);
> + s->dma_as = pci_get_address_space(dev);
> + pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->iomem);
> +}
> +
> +static void sdhci_pci_exit(PCIDevice *dev)
> +{
> + SDHCIState *s = PCI_SDHCI(dev);
> +
> + sdhci_common_unrealize(s, &error_abort);
> + sdhci_uninitfn(s);
> +}
> +
> +static void sdhci_pci_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> +
> + k->realize = sdhci_pci_realize;
> + k->exit = sdhci_pci_exit;
> + k->vendor_id = PCI_VENDOR_ID_REDHAT;
> + k->device_id = PCI_DEVICE_ID_REDHAT_SDHCI;
> + k->class_id = PCI_CLASS_SYSTEM_SDHCI;
> + dc->props = sdhci_pci_properties;
> +
> + sdhci_common_class_init(klass, data);
> +}
> +
> +static const TypeInfo sdhci_pci_info = {
> + .name = TYPE_PCI_SDHCI,
> + .parent = TYPE_PCI_DEVICE,
> + .instance_size = sizeof(SDHCIState),
> + .class_init = sdhci_pci_class_init,
> + .interfaces = (InterfaceInfo[]) {
> + { INTERFACE_CONVENTIONAL_PCI_DEVICE },
> + { },
> + },
> +};
> +
> +static void sdhci_pci_register_type(void)
> +{
> + type_register_static(&sdhci_pci_info);
> +}
> +
> +type_init(sdhci_pci_register_type)
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 83f1574..17ad546 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -40,24 +40,6 @@
>
> #define MASKED_WRITE(reg, mask, val) (reg = (reg & (mask)) | (val))
>
> -/* Default SD/MMC host controller features information, which will be
> - * presented in CAPABILITIES register of generic SD host controller at reset.
> - *
> - * support:
> - * - 3.3v and 1.8v voltages
> - * - SDMA/ADMA1/ADMA2
> - * - high-speed
> - * max host controller R/W buffers size: 512B
> - * max clock frequency for SDclock: 52 MHz
> - * timeout clock frequency: 52 MHz
> - *
> - * does not support:
> - * - 3.0v voltage
> - * - 64-bit system bus
> - * - suspend/resume
> - */
> -#define SDHC_CAPAB_REG_DEFAULT 0x057834b4
> -
> static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
> {
> return 1 << (9 + FIELD_EX32(s->capareg, SDHC_CAPAB, MAXBLOCKLENGTH));
> @@ -1328,16 +1310,7 @@ static void sdhci_init_readonly_registers(SDHCIState *s, Error **errp)
>
> /* --- qdev common --- */
>
> -#define DEFINE_SDHCI_COMMON_PROPERTIES(_state) \
> - DEFINE_PROP_UINT8("sd-spec-version", _state, sd_spec_version, 2), \
> - DEFINE_PROP_UINT8("uhs", _state, uhs_mode, UHS_NOT_SUPPORTED), \
> - \
> - /* Capabilities registers provide information on supported
> - * features of this specific host controller implementation */ \
> - DEFINE_PROP_UINT64("capareg", _state, capareg, SDHC_CAPAB_REG_DEFAULT), \
> - DEFINE_PROP_UINT64("maxcurr", _state, maxcurr, 0)
> -
> -static void sdhci_initfn(SDHCIState *s)
> +void sdhci_initfn(SDHCIState *s)
> {
> qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
> TYPE_SDHCI_BUS, DEVICE(s), "sd-bus");
> @@ -1348,7 +1321,7 @@ static void sdhci_initfn(SDHCIState *s)
> s->io_ops = &sdhci_mmio_ops;
> }
>
> -static void sdhci_uninitfn(SDHCIState *s)
> +void sdhci_uninitfn(SDHCIState *s)
> {
> timer_del(s->insert_timer);
> timer_free(s->insert_timer);
> @@ -1359,7 +1332,7 @@ static void sdhci_uninitfn(SDHCIState *s)
> s->fifo_buffer = NULL;
> }
>
> -static void sdhci_common_realize(SDHCIState *s, Error **errp)
> +void sdhci_common_realize(SDHCIState *s, Error **errp)
> {
> Error *local_err = NULL;
>
> @@ -1375,7 +1348,7 @@ static void sdhci_common_realize(SDHCIState *s, Error **errp)
> SDHC_REGISTERS_MAP_SIZE);
> }
>
> -static void sdhci_common_unrealize(SDHCIState *s, Error **errp)
> +void sdhci_common_unrealize(SDHCIState *s, Error **errp)
> {
> /* This function is expected to be called only once for each class:
> * - SysBus: via DeviceClass->unrealize(),
> @@ -1445,7 +1418,7 @@ const VMStateDescription sdhci_vmstate = {
> },
> };
>
> -static void sdhci_common_class_init(ObjectClass *klass, void *data)
> +void sdhci_common_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
>
> @@ -1454,66 +1427,6 @@ static void sdhci_common_class_init(ObjectClass *klass, void *data)
> dc->reset = sdhci_poweron_reset;
> }
>
> -/* --- qdev PCI --- */
> -
> -static Property sdhci_pci_properties[] = {
> - DEFINE_SDHCI_COMMON_PROPERTIES(SDHCIState),
> - DEFINE_PROP_END_OF_LIST(),
> -};
> -
> -static void sdhci_pci_realize(PCIDevice *dev, Error **errp)
> -{
> - SDHCIState *s = PCI_SDHCI(dev);
> - Error *local_err = NULL;
> -
> - sdhci_initfn(s);
> - sdhci_common_realize(s, &local_err);
> - if (local_err) {
> - error_propagate(errp, local_err);
> - return;
> - }
> -
> - dev->config[PCI_CLASS_PROG] = 0x01; /* Standard Host supported DMA */
> - dev->config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
> - s->irq = pci_allocate_irq(dev);
> - s->dma_as = pci_get_address_space(dev);
> - pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->iomem);
> -}
> -
> -static void sdhci_pci_exit(PCIDevice *dev)
> -{
> - SDHCIState *s = PCI_SDHCI(dev);
> -
> - sdhci_common_unrealize(s, &error_abort);
> - sdhci_uninitfn(s);
> -}
> -
> -static void sdhci_pci_class_init(ObjectClass *klass, void *data)
> -{
> - DeviceClass *dc = DEVICE_CLASS(klass);
> - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> -
> - k->realize = sdhci_pci_realize;
> - k->exit = sdhci_pci_exit;
> - k->vendor_id = PCI_VENDOR_ID_REDHAT;
> - k->device_id = PCI_DEVICE_ID_REDHAT_SDHCI;
> - k->class_id = PCI_CLASS_SYSTEM_SDHCI;
> - dc->props = sdhci_pci_properties;
> -
> - sdhci_common_class_init(klass, data);
> -}
> -
> -static const TypeInfo sdhci_pci_info = {
> - .name = TYPE_PCI_SDHCI,
> - .parent = TYPE_PCI_DEVICE,
> - .instance_size = sizeof(SDHCIState),
> - .class_init = sdhci_pci_class_init,
> - .interfaces = (InterfaceInfo[]) {
> - { INTERFACE_CONVENTIONAL_PCI_DEVICE },
> - { },
> - },
> -};
> -
> /* --- qdev SysBus --- */
>
> static Property sdhci_sysbus_properties[] = {
> @@ -1846,7 +1759,6 @@ static const TypeInfo imx_usdhc_info = {
>
> static void sdhci_register_types(void)
> {
> - type_register_static(&sdhci_pci_info);
> type_register_static(&sdhci_sysbus_info);
> type_register_static(&sdhci_bus_info);
> type_register_static(&imx_usdhc_info);
>
next prev parent reply other threads:[~2019-03-10 21:12 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-07 14:18 [Qemu-devel] [PATCH v4 00/29] Kconfig dependencies for ARM machines Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 01/29] hw/pci/pci-stub: Add msi_enabled() and msi_notify() to the pci stubs Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 02/29] hw/ide/ahci: Add a Kconfig switch for the AHDI-ICH9 device Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 03/29] hw/sd/sdhci: Move PCI-related code into a separate file Thomas Huth
2019-03-10 21:12 ` Philippe Mathieu-Daudé [this message]
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 04/29] hw/arm: Express dependencies of the exynos machines with Kconfig Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 05/29] hw/arm: Express dependencies of the highbank " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 06/29] hw/arm: Express dependencies of integratorcp " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 07/29] hw/arm: Express dependencies of the fsl-imx31 machine " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 08/29] hw/arm: Express dependencies of musicpal " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 09/29] hw/arm: Express dependencies of the OMAP machines " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 10/29] hw/arm: Express dependencies of stellaris " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 11/29] hw/arm: Express dependencies of realview, versatile and vexpress " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 12/29] hw/arm: Express dependencies of the PXA2xx machines " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 13/29] hw/arm: Express dependencies of xilinx-zynq " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 14/29] hw/arm: Express dependencies of collie " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 15/29] hw/arm: Express dependencies of the aspeed boards " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 16/29] hw/arm: Express dependencies of the virt machine " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 17/29] hw/arm: Express dependencies of netduino / stm32f2xx " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 18/29] hw/arm: Express dependencies of allwinner / cubieboard " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 19/29] hw/arm: Express dependencies of the MPS2 boards " Thomas Huth
2019-03-10 21:33 ` Philippe Mathieu-Daudé
2019-03-11 6:35 ` Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 20/29] hw/arm: Express dependencies of the raspi machines " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 21/29] hw/arm: Express dependencies of canon-a1100 " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 22/29] hw/arm: Express dependencies of sabrelite " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 23/29] hw/arm: Express dependencies of the MSF2 / EMCRAFT_SF2 machine " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 24/29] hw/arm: Express dependencies for remaining IMX boards " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 25/29] hw/arm: Express dependencies of the microbit / nrf51 machine " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 26/29] hw/arm: Express dependencies of the ZynqMP zcu102 " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 27/29] hw/arm: Express dependencies of the xlnx-versal-virt " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 28/29] hw/arm: Express dependencies of the musca machines " Thomas Huth
2019-03-07 14:18 ` [Qemu-devel] [PATCH v4 29/29] hw/arm: Remove hard-enablement of the remaining PCI devices Thomas Huth
2019-03-07 14:59 ` [Qemu-devel] [PATCH v4 00/29] Kconfig dependencies for ARM machines no-reply
2019-03-09 21:40 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=16df6c28-aa13-90cf-09b7-c002eb0c4d59@redhat.com \
--to=philmd@redhat.com \
--cc=jsnow@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
--cc=yang.zhong@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).