From: "Michael S. Tsirkin" <mst@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: skandasa@cisco.com, adnan@khaleel.us, etmartin@cisco.com,
qemu-devel@nongnu.org, wexu2@cisco.com
Subject: [Qemu-devel] Re: [PATCH v5 04/14] pci/bridge: fix pci_bridge_reset()
Date: Tue, 19 Oct 2010 14:07:28 +0200 [thread overview]
Message-ID: <20101019120728.GA6970@redhat.com> (raw)
In-Reply-To: <8370077d844866e4b4b2866f16c21a948f84c792.1287478251.git.yamahata@valinux.co.jp>
On Tue, Oct 19, 2010 at 06:06:31PM +0900, Isaku Yamahata wrote:
> The default value of base/limit registers aren't specified in the spec.
> So pci_bridge_reset() shouldn't touch them.
> Instead, introduced two functions to reset those registers in a way
> of typical implementation. zero base/limit registers or disable forwarding.
> They will be used later.
>
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
I have some second thoughts:
1. pci_bridge_reset is used in several devices and I have no idea what
the reset change will do there, how do real devices behave or whether
guests depend on a specific behaviour. It seems harmless to leave the
current implementation in place, and simply add
pci_bridge_disable_base_limit which devices can call after
pci_bridge_reset.
2. _zero and _disable describe what function does already,
so we should drop _reset from function name.
Thus we only get 1 new function, pci_bridge_disable_base_limit.
> Changes v4 -> v5:
> - drop the lines in pci_bridge_reset()
> - introduced two functions to reset base/limit registers.
> ---
> hw/pci_bridge.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++-------
> hw/pci_bridge.h | 2 +
> 2 files changed, 51 insertions(+), 8 deletions(-)
>
> diff --git a/hw/pci_bridge.c b/hw/pci_bridge.c
> index 638e3b3..de75e6a 100644
> --- a/hw/pci_bridge.c
> +++ b/hw/pci_bridge.c
> @@ -151,6 +151,46 @@ void pci_bridge_write_config(PCIDevice *d,
> }
> }
>
> +void pci_bridge_reset_zero_base_limit(PCIDevice *dev)
> +{
> + uint8_t *conf = dev->config;
> +
> + pci_byte_test_and_clear_mask(conf + PCI_IO_BASE,
> + PCI_IO_RANGE_MASK & 0xff);
> + pci_byte_test_and_clear_mask(conf + PCI_IO_LIMIT,
> + PCI_IO_RANGE_MASK & 0xff);
> + pci_word_test_and_clear_mask(conf + PCI_MEMORY_BASE,
> + PCI_MEMORY_RANGE_MASK & 0xffff);
> + pci_word_test_and_clear_mask(conf + PCI_MEMORY_LIMIT,
> + PCI_MEMORY_RANGE_MASK & 0xffff);
> + pci_word_test_and_clear_mask(conf + PCI_PREF_MEMORY_BASE,
> + PCI_PREF_RANGE_MASK & 0xffff);
> + pci_word_test_and_clear_mask(conf + PCI_PREF_MEMORY_LIMIT,
> + PCI_PREF_RANGE_MASK & 0xffff);
> + pci_set_word(conf + PCI_PREF_BASE_UPPER32, 0);
> + pci_set_word(conf + PCI_PREF_LIMIT_UPPER32, 0);
> +}
> +
> +void pci_bridge_reset_disable_base_limit(PCIDevice *dev)
> +{
> + uint8_t *conf = dev->config;
> +
> + pci_byte_test_and_set_mask(conf + PCI_IO_BASE,
> + PCI_IO_RANGE_MASK & 0xff);
> + pci_byte_test_and_clear_mask(conf + PCI_IO_LIMIT,
> + PCI_IO_RANGE_MASK & 0xff);
> + pci_word_test_and_set_mask(conf + PCI_MEMORY_BASE,
> + PCI_MEMORY_RANGE_MASK & 0xffff);
> + pci_word_test_and_clear_mask(conf + PCI_MEMORY_LIMIT,
> + PCI_MEMORY_RANGE_MASK & 0xffff);
> + pci_word_test_and_set_mask(conf + PCI_PREF_MEMORY_BASE,
> + PCI_PREF_RANGE_MASK & 0xffff);
> + pci_word_test_and_clear_mask(conf + PCI_PREF_MEMORY_LIMIT,
> + PCI_PREF_RANGE_MASK & 0xffff);
> + pci_set_word(conf + PCI_PREF_BASE_UPPER32, 0);
> + pci_set_word(conf + PCI_PREF_LIMIT_UPPER32, 0);
> +}
> +
> /* reset bridge specific configuration registers */
> void pci_bridge_reset_reg(PCIDevice *dev)
> {
> @@ -161,14 +201,15 @@ void pci_bridge_reset_reg(PCIDevice *dev)
> conf[PCI_SUBORDINATE_BUS] = 0;
> conf[PCI_SEC_LATENCY_TIMER] = 0;
>
> - conf[PCI_IO_BASE] = 0;
> - conf[PCI_IO_LIMIT] = 0;
> - pci_set_word(conf + PCI_MEMORY_BASE, 0);
> - pci_set_word(conf + PCI_MEMORY_LIMIT, 0);
> - pci_set_word(conf + PCI_PREF_MEMORY_BASE, 0);
> - pci_set_word(conf + PCI_PREF_MEMORY_LIMIT, 0);
> - pci_set_word(conf + PCI_PREF_BASE_UPPER32, 0);
> - pci_set_word(conf + PCI_PREF_LIMIT_UPPER32, 0);
> + /*
> + * the default values for base/limit registers aren't specified
> + * in the PCI-to-PCI-bridge spec. So we don't thouch them here.
> + * Each implementation can override it.
> + * typical implementation does
> + * - zero registers: pci_bridge_reset_zer_base_limit()
> + * or
> + * - disable forwarding: pci_bridge_reset_disable_base_limit()
> + */
>
> pci_set_word(conf + PCI_BRIDGE_CONTROL, 0);
> }
> diff --git a/hw/pci_bridge.h b/hw/pci_bridge.h
> index f6fade0..2359684 100644
> --- a/hw/pci_bridge.h
> +++ b/hw/pci_bridge.h
> @@ -39,6 +39,8 @@ pcibus_t pci_bridge_get_limit(const PCIDevice *bridge, uint8_t type);
>
> void pci_bridge_write_config(PCIDevice *d,
> uint32_t address, uint32_t val, int len);
> +void pci_bridge_reset_zero_base_limit(PCIDevice *dev);
> +void pci_bridge_reset_disable_base_limit(PCIDevice *dev);
> void pci_bridge_reset_reg(PCIDevice *dev);
> void pci_bridge_reset(DeviceState *qdev);
>
> --
> 1.7.1.1
next prev parent reply other threads:[~2010-10-19 12:15 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-19 9:06 [Qemu-devel] [PATCH v5 00/14] pcie port switch emulators Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 01/14] pci: introduce helper functions to test-and-{clear, set} mask in configuration space Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 02/14] pci: introduce helper function to handle msi-x and msi Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 03/14] pci: use pci_word_test_and_clear_mask() in pci_device_reset() Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 04/14] pci/bridge: fix pci_bridge_reset() Isaku Yamahata
2010-10-19 12:07 ` Michael S. Tsirkin [this message]
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 05/14] msi: implements msi Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 06/14] pcie: add pcie constants to pcie_regs.h Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 07/14] pcie: helper functions for pcie capability and extended capability Isaku Yamahata
2010-10-19 11:53 ` [Qemu-devel] " Michael S. Tsirkin
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 08/14] pcie/aer: helper functions for pcie aer capability Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 09/14] pcie port: define struct PCIEPort/PCIESlot and helper functions Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 10/14] ioh3420: pcie root port in X58 ioh Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 11/14] x3130: pcie upstream port Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 12/14] x3130: pcie downstream port Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 13/14] pcie/hotplug: introduce pushing attention button command Isaku Yamahata
2010-10-19 9:06 ` [Qemu-devel] [PATCH v5 14/14] pcie/aer: glue aer error injection into qemu monitor Isaku Yamahata
2010-10-19 11:51 ` [Qemu-devel] Re: [PATCH v5 00/14] pcie port switch emulators Michael S. Tsirkin
2010-10-19 15:19 ` Isaku Yamahata
2010-10-19 17:06 ` Michael S. Tsirkin
2010-10-19 22:36 ` Isaku Yamahata
2010-10-19 22:40 ` Michael S. Tsirkin
2010-10-19 22:55 ` Isaku Yamahata
2010-10-19 23:02 ` Michael S. Tsirkin
2010-10-19 11:56 ` Michael S. Tsirkin
2010-10-19 13:55 ` Isaku Yamahata
2010-10-19 13:00 ` Michael S. Tsirkin
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=20101019120728.GA6970@redhat.com \
--to=mst@redhat.com \
--cc=adnan@khaleel.us \
--cc=etmartin@cisco.com \
--cc=qemu-devel@nongnu.org \
--cc=skandasa@cisco.com \
--cc=wexu2@cisco.com \
--cc=yamahata@valinux.co.jp \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.