From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: Michael Roth <mdroth@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: agraf@suse.de, ncmike@ncultra.org, paulus@samba.org,
tyreld@linux.vnet.ibm.com, nfont@linux.vnet.ibm.com,
qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 04/14] spapr_pci: add set-indicator RTAS interface
Date: Mon, 16 Dec 2013 15:26:32 +1100 [thread overview]
Message-ID: <52AE80F8.2090904@ozlabs.ru> (raw)
In-Reply-To: <1386282785-466-5-git-send-email-mdroth@linux.vnet.ibm.com>
On 12/06/2013 09:32 AM, Michael Roth wrote:
> From: Mike Day <ncmike@ncultra.org>
>
> Signed-off-by: Mike Day <ncmike@ncultra.org>
> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
> hw/ppc/spapr_pci.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++
> include/hw/ppc/spapr.h | 28 +++++++++++++++
> 2 files changed, 121 insertions(+)
>
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index 7568a03..1046ec8 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -35,6 +35,16 @@
>
> #include "hw/pci/pci_bus.h"
>
> +/* #define DEBUG_SPAPR */
> +
> +#ifdef DEBUG_SPAPR
> +#define DPRINTF(fmt, ...) \
> + do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
> +#else
> +#define DPRINTF(fmt, ...) \
> + do { } while (0)
> +#endif
> +
> /* Copied from the kernel arch/powerpc/platforms/pseries/msi.c */
> #define RTAS_QUERY_FN 0
> #define RTAS_CHANGE_FN 1
> @@ -404,6 +414,80 @@ static void rtas_ibm_query_interrupt_source_number(PowerPCCPU *cpu,
> rtas_st(rets, 2, 1);/* 0 == level; 1 == edge */
> }
>
> +static void rtas_set_indicator(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> + uint32_t token, uint32_t nargs,
> + target_ulong args, uint32_t nret,
> + target_ulong rets)
> +{
> + uint32_t indicator = rtas_ld(args, 0);
> + uint32_t drc_index = rtas_ld(args, 1);
> + uint32_t indicator_state = rtas_ld(args, 2);
> + uint32_t encoded = 0, shift = 0, mask = 0;
> + uint32_t *pind;
> + DrcEntry *drc_entry = NULL;
> +
> + if (drc_index == 0) { /* platform indicator */
> + pind = &spapr->state;
> + } else {
> + drc_entry = spapr_find_drc_entry(drc_index);
> + if (!drc_entry) {
> + DPRINTF("rtas_set_indicator: unable to find drc_entry for %x",
> + drc_index);
> + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
> + return;
> + }
> + pind = &drc_entry->state;
> + }
> +
> + switch (indicator) {
> + case 9: /* EPOW */
> + shift = INDICATOR_EPOW_SHIFT;
> + mask = INDICATOR_EPOW_MASK;
> + break;
> + case 9001: /* Isolation state */
> + /* encode the new value into the correct bit field */
> + shift = INDICATOR_ISOLATION_SHIFT;
> + mask = INDICATOR_ISOLATION_MASK;
> + break;
> + case 9002: /* DR */
> + shift = INDICATOR_DR_SHIFT;
> + mask = INDICATOR_DR_MASK;
> + break;
> + case 9003: /* Allocation State */
> + shift = INDICATOR_ALLOCATION_SHIFT;
> + mask = INDICATOR_ALLOCATION_MASK;
> + break;
> + case 9005: /* global interrupt */
> + shift = INDICATOR_GLOBAL_INTERRUPT_SHIFT;
> + mask = INDICATOR_GLOBAL_INTERRUPT_MASK;
> + break;
> + case 9006: /* error log */
> + shift = INDICATOR_ERROR_LOG_SHIFT;
> + mask = INDICATOR_ERROR_LOG_MASK;
> + break;
> + case 9007: /* identify */
> + shift = INDICATOR_IDENTIFY_SHIFT;
> + mask = INDICATOR_IDENTIFY_MASK;
> + break;
> + case 9009: /* reset */
> + shift = INDICATOR_RESET_SHIFT;
> + mask = INDICATOR_RESET_MASK;
> + break;
> + default:
> + DPRINTF("rtas_set_indicator: indicator not implemented: %d",
> + indicator);
> + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
> + return;
> + }
> +
> + encoded = ENCODE_DRC_STATE(indicator_state, mask, shift);
> + /* clear the current indicator value */
> + *pind &= ~mask;
> + /* set the new value */
> + *pind |= encoded;
> + rtas_st(rets, 0, RTAS_OUT_SUCCESS);
> +}
> +
> static int pci_spapr_swizzle(int slot, int pin)
> {
> return (slot + pin) % PCI_NUM_PINS;
> @@ -637,6 +721,14 @@ static int spapr_phb_init(SysBusDevice *s)
> sphb->lsi_table[i].irq = irq;
> }
>
> + /* make sure the platform EPOW sensor is initialized - the
> + * guest will probe it when there is a hotplug event.
> + */
> + spapr->state &= ~(uint32_t)INDICATOR_EPOW_MASK;
> + spapr->state |= ENCODE_DRC_STATE(0,
> + INDICATOR_EPOW_MASK,
> + INDICATOR_EPOW_SHIFT);
> +
> return 0;
> }
>
> @@ -958,6 +1050,7 @@ void spapr_pci_rtas_init(void)
> rtas_ibm_query_interrupt_source_number);
> spapr_rtas_register("ibm,change-msi", rtas_ibm_change_msi);
> }
> + spapr_rtas_register("set-indicator", rtas_set_indicator);
> }
>
> static void spapr_pci_register_types(void)
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 6ae5c54..b48c55f 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -38,6 +38,9 @@ typedef struct sPAPREnvironment {
> int htab_save_index;
> bool htab_first_pass;
> int htab_fd;
> +
> + /* platform state - sensors and indicators */
> + uint32_t state;
> } sPAPREnvironment;
>
> #define H_SUCCESS 0
> @@ -334,6 +337,31 @@ DrcEntry *spapr_add_phb_to_drc_table(uint64_t buid, uint32_t state);
> DrcEntry *spapr_phb_to_drc_entry(uint64_t buid);
> DrcEntry *spapr_find_drc_entry(int drc_index);
>
> +/* For set-indicator RTAS interface */
> +#define INDICATOR_ISOLATION_MASK 0x0001 /* 9001 one bit */
> +#define INDICATOR_GLOBAL_INTERRUPT_MASK 0x0002 /* 9005 one bit */
> +#define INDICATOR_ERROR_LOG_MASK 0x0004 /* 9006 one bit */
> +#define INDICATOR_IDENTIFY_MASK 0x0008 /* 9007 one bit */
> +#define INDICATOR_RESET_MASK 0x0010 /* 9009 one bit */
> +#define INDICATOR_DR_MASK 0x00e0 /* 9002 three bits */
> +#define INDICATOR_ALLOCATION_MASK 0x0300 /* 9003 two bits */
> +#define INDICATOR_EPOW_MASK 0x1c00 /* 9 three bits */
> +
> +#define INDICATOR_ISOLATION_SHIFT 0x00 /* bit 0 */
> +#define INDICATOR_GLOBAL_INTERRUPT_SHIFT 0x01 /* bit 1 */
> +#define INDICATOR_ERROR_LOG_SHIFT 0x02 /* bit 2 */
> +#define INDICATOR_IDENTIFY_SHIFT 0x03 /* bit 3 */
> +#define INDICATOR_RESET_SHIFT 0x04 /* bit 4 */
> +#define INDICATOR_DR_SHIFT 0x05 /* bits 5-7 */
> +#define INDICATOR_ALLOCATION_SHIFT 0x08 /* bits 8-9 */
> +#define INDICATOR_EPOW_SHIFT 0x0a /* bits 10-12 */
> +
> +#define DECODE_DRC_STATE(state, m, s) \
> + ((((uint32_t)(state) & (uint32_t)(m))) >> (s))
> +
> +#define ENCODE_DRC_STATE(val, m, s) \
> + (((uint32_t)(val) << (s)) & (uint32_t)(m))
> +
Why to put these definitions in the header when they are only used by the
spapr_pci.c? It gives me the (wrong) idea that these are shared between
files...
> extern sPAPREnvironment *spapr;
>
> /*#define DEBUG_SPAPR_HCALLS*/
>
--
Alexey
next prev parent reply other threads:[~2013-12-16 4:26 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-05 22:32 [Qemu-devel] [PATCH v2 00/14] spapr: add support for pci hotplug Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 01/14] spapr: populate DRC entries for root dt node Michael Roth
2013-12-16 2:59 ` Alexey Kardashevskiy
2013-12-16 4:54 ` Alexey Kardashevskiy
2014-01-16 20:51 ` Michael Roth
2014-01-20 2:58 ` Alexey Kardashevskiy
2014-01-20 14:12 ` Mike Day
2014-01-20 17:24 ` Michael Roth
2014-01-20 17:59 ` Mike Day
2014-01-20 18:51 ` Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 02/14] spapr_pci: populate DRC dt entries for PHBs Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 03/14] spapr: add helper to retrieve a PHB/device DrcEntry Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 04/14] spapr_pci: add set-indicator RTAS interface Michael Roth
2013-12-16 4:26 ` Alexey Kardashevskiy [this message]
2014-01-16 20:54 ` Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 05/14] spapr_pci: add get/set-power-level RTAS interfaces Michael Roth
2013-12-16 3:09 ` Alexey Kardashevskiy
2014-01-16 21:01 ` Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 06/14] spapr_pci: add get-sensor-state RTAS interface Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 07/14] spapr_pci: add ibm, configure-connector " Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 08/14] memory: add memory_region_find_subregion Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 09/14] pci: make pci_bar useable outside pci.c Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 10/14] pci: allow 0 address for PCI IO regions Michael Roth
2013-12-05 23:33 ` Peter Maydell
2013-12-10 21:42 ` Michael Roth
2013-12-10 22:14 ` Peter Maydell
2013-12-10 23:03 ` [Qemu-devel] [Qemu-ppc] " Benjamin Herrenschmidt
2013-12-12 14:34 ` [Qemu-devel] " Michael S. Tsirkin
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 11/14] spapr_pci: enable basic hotplug operations Michael Roth
2013-12-16 4:36 ` Alexey Kardashevskiy
2014-01-16 21:22 ` Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 12/14] spapr_events: re-use EPOW event infrastructure for hotplug events Michael Roth
2013-12-16 5:05 ` Alexey Kardashevskiy
2014-01-16 21:32 ` Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 13/14] spapr_events: event-scan RTAS interface Michael Roth
2013-12-16 4:57 ` Alexey Kardashevskiy
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 14/14] spapr_pci: emit hotplug add/remove events during hotplug Michael Roth
2013-12-16 5:06 ` Alexey Kardashevskiy
2014-01-10 8:29 ` [Qemu-devel] [PATCH v2 00/14] spapr: add support for pci hotplug Alexey Kardashevskiy
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=52AE80F8.2090904@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=agraf@suse.de \
--cc=mdroth@linux.vnet.ibm.com \
--cc=ncmike@ncultra.org \
--cc=nfont@linux.vnet.ibm.com \
--cc=paulus@samba.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=tyreld@linux.vnet.ibm.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 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.