All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Stefan Weil <weil@mail.berlios.de>
Cc: QEMU Developers <qemu-devel@nongnu.org>
Subject: [Qemu-devel] Re: [PATCH 7/9] eepro100: Set power management capability using pci_reserve_capability
Date: Tue, 6 Apr 2010 15:09:10 +0300	[thread overview]
Message-ID: <20100406120910.GC16539@redhat.com> (raw)
In-Reply-To: <1270554249-24861-8-git-send-email-weil@mail.berlios.de>

On Tue, Apr 06, 2010 at 01:44:07PM +0200, Stefan Weil wrote:
> pci_reserve_capability automatically updates PCI status and
> PCI capability pointer, so use it.
> 
> Signed-off-by: Stefan Weil <weil@mail.berlios.de>
> ---
>  hw/eepro100.c |   39 ++++++++++++++++++---------------------
>  1 files changed, 18 insertions(+), 21 deletions(-)
> 
> diff --git a/hw/eepro100.c b/hw/eepro100.c
> index e12ee23..f0acdbc 100644
> --- a/hw/eepro100.c
> +++ b/hw/eepro100.c
> @@ -457,7 +457,6 @@ static void eepro100_fcp_interrupt(EEPRO100State * s)
>  
>  static void e100_pci_reset(EEPRO100State * s, E100PCIDeviceInfo *e100_device)
>  {
> -    /* TODO: Use pci_add_capability(&s->dev, PCI_CAP_ID_PM, ...) for PM. */
>      uint32_t device = s->device;
>      uint8_t *pci_conf = s->dev.config;
>  
> @@ -468,25 +467,14 @@ static void e100_pci_reset(EEPRO100State * s, E100PCIDeviceInfo *e100_device)
>      /* PCI Device ID */
>      pci_config_set_device_id(pci_conf, e100_device->device_id);
>      /* PCI Status */
> -    if (e100_device->power_management) {
> -        pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
> -                                            PCI_STATUS_FAST_BACK |
> -                                            PCI_STATUS_CAP_LIST);
> -    } else {
> -        pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
> -                                            PCI_STATUS_FAST_BACK);
> -    }
> +    pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
> +                                        PCI_STATUS_FAST_BACK);
>      /* PCI Revision ID */
>      pci_config_set_revision(pci_conf, e100_device->revision);
>      pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
>      /* PCI Latency Timer */
>      pci_set_byte(pci_conf + PCI_LATENCY_TIMER, 0x20);   /* latency timer = 32 clocks */
> -    /* Capability Pointer */
> -    if (e100_device->power_management) {
> -        pci_set_byte(pci_conf + PCI_CAPABILITY_LIST, 0xdc);
> -    } else {
> -        pci_set_byte(pci_conf + PCI_CAPABILITY_LIST, 0x00);
> -    }
> +    /* Capability Pointer is set by PCI framework. */
>      /* Minimum Grant */
>      pci_set_byte(pci_conf + PCI_MIN_GNT, 0x08);
>      /* Maximum Latency */
> @@ -549,12 +537,21 @@ static void e100_pci_reset(EEPRO100State * s, E100PCIDeviceInfo *e100_device)
>  
>      if (e100_device->power_management) {
>          /* Power Management Capabilities */
> -        pci_set_byte(pci_conf + 0xdc, PCI_CAP_ID_PM);
> -        /* Next Item Pointer */
> -        /* Capability ID */
> -        pci_set_word(pci_conf + 0xde, 0x7e21);
> -        /* TODO: Power Management Control / Status. */
> -        /* TODO: Ethernet Power Consumption Registers (i82559 and later). */
> +        int cfg_offset;
> +        pci_reserve_capability(&s->dev, PCI_CONFIG_HEADER_SIZE,
> +                               0xdc - PCI_CONFIG_HEADER_SIZE);
> +        cfg_offset = pci_add_capability(&s->dev, PCI_CAP_ID_PM, PCI_PM_SIZEOF);

So this works. Long term, I think I should just extend pci_add_capability
with an offset parameter.

> +        assert(cfg_offset == 0xdc);
> +        if (cfg_offset > 0) {
> +            /* Power Management Capabilities */
> +            pci_set_word(pci_conf + cfg_offset + PCI_PM_PMC, 0x7e21);
> +#if 0 /* TODO: replace dummy code for power management emulation. */
> +            /* TODO: Power Management Control / Status. */
> +            pci_set_word(pci_conf + cfg_offset + PCI_PM_CTRL, 0x0000);
> +            /* TODO: Ethernet Power Consumption Registers (i82559 and later). */
> +            pci_set_byte(pci_conf + cfg_offset + PCI_PM_PPB_EXTENSIONS, 0x0000);
> +#endif
> +        }
>      }
>  
>  #if EEPROM_SIZE > 0
> -- 
> 1.7.0

  reply	other threads:[~2010-04-06 12:12 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-06 11:44 [Qemu-devel] eepro100: New patches Stefan Weil
2010-04-06 11:44 ` [Qemu-devel] [PATCH 1/9] eepro100: Don't allow writing SCBStatus Stefan Weil
2010-04-06 11:44 ` [Qemu-devel] [PATCH 2/9] eepro100: Simplify status handling Stefan Weil
2010-04-06 12:18   ` [Qemu-devel] " Michael S. Tsirkin
2010-04-06 14:29     ` Stefan Weil
2010-04-06 14:34       ` Michael S. Tsirkin
2010-04-06 11:44 ` [Qemu-devel] [PATCH 3/9] eepro100: Simplified device instantiation Stefan Weil
2010-04-06 11:44 ` [Qemu-devel] [PATCH 4/9] eepro100: Add new device variant i82801 Stefan Weil
2010-04-06 11:44 ` [Qemu-devel] [PATCH 5/9] eepro100: Set configuration bit for standard TCB Stefan Weil
2010-04-06 11:44 ` [Qemu-devel] [PATCH 6/9] eepro100: Support compilation without EEPROM Stefan Weil
2010-04-06 12:10   ` [Qemu-devel] " Michael S. Tsirkin
2010-04-06 14:26     ` Stefan Weil
2010-04-06 15:44   ` [Qemu-devel] " Richard Henderson
2010-04-06 16:01     ` Stefan Weil
2010-04-06 16:35       ` Richard Henderson
2010-04-07  1:00   ` Paul Brook
2010-04-07  7:02     ` Stefan Weil
2010-04-07  7:29       ` Michael S. Tsirkin
2010-04-06 11:44 ` [Qemu-devel] [PATCH 7/9] eepro100: Set power management capability using pci_reserve_capability Stefan Weil
2010-04-06 12:09   ` Michael S. Tsirkin [this message]
2010-04-06 11:44 ` [Qemu-devel] [PATCH 8/9] eepro100: Fix mapping of flash memory Stefan Weil
2010-04-06 11:57   ` [Qemu-devel] " Michael S. Tsirkin
2010-04-06 14:23     ` Stefan Weil
2010-04-06 14:30       ` Michael S. Tsirkin
2010-04-06 11:44 ` [Qemu-devel] [PATCH 9/9] eepro100: Fix PCI interrupt pin configuration regression Stefan Weil
2010-04-06 11:55   ` [Qemu-devel] " Michael S. Tsirkin
2010-04-06 12:40 ` [Qemu-devel] Re: eepro100: New patches Michael S. Tsirkin
2010-04-06 16:09   ` Stefan Weil
2010-04-07  8:10     ` 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=20100406120910.GC16539@redhat.com \
    --to=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=weil@mail.berlios.de \
    /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.