qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 11/25] ppc/xive: Move the TIMA operations to the controlle


From: Cédric Le Goater
Subject: Re: [PATCH v4 11/25] ppc/xive: Move the TIMA operations to the controller model
Date: Thu, 3 Oct 2019 12:57:15 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0

On 03/10/2019 04:08, David Gibson wrote:
> On Wed, Sep 18, 2019 at 06:06:31PM +0200, Cédric Le Goater wrote:
>> This also removes the need of the get_tctx() XiveRouter handler in the
>> core XIVE framework.
> 
> In general these commit messages could really do with more context.
> What exactly is the "controller model"?  Where were the TIMA
> operations before now.  Why is having them in the controller model
> better?
> 
> I could probably answer those with some investigation, but the point
> is that the commit message is supposed to make it easy to find that
> information.
> 
>>
>> Signed-off-by: Cédric Le Goater <address@hidden>
>> ---
>>  include/hw/ppc/xive.h |  1 -
>>  hw/intc/pnv_xive.c    | 35 ++++++++++++++++++++++++++++++++++-
>>  hw/intc/spapr_xive.c  | 33 +++++++++++++++++++++++++++++++--
>>  hw/intc/xive.c        | 29 -----------------------------
>>  4 files changed, 65 insertions(+), 33 deletions(-)
>>
>> diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
>> index 536deea8c622..9d9cd88dd17e 100644
>> --- a/include/hw/ppc/xive.h
>> +++ b/include/hw/ppc/xive.h
>> @@ -462,7 +462,6 @@ typedef struct XiveENDSource {
>>  #define XIVE_TM_OS_PAGE         0x2
>>  #define XIVE_TM_USER_PAGE       0x3
>>  
>> -extern const MemoryRegionOps xive_tm_ops;
>>  void xive_tctx_tm_write(XivePresenter *xptr, XiveTCTX *tctx, hwaddr offset,
>>                          uint64_t value, unsigned size);
>>  uint64_t xive_tctx_tm_read(XivePresenter *xptr, XiveTCTX *tctx, hwaddr 
>> offset,
>> diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
>> index 3d6fcf9ac139..40e18fb44811 100644
>> --- a/hw/intc/pnv_xive.c
>> +++ b/hw/intc/pnv_xive.c
>> @@ -1475,6 +1475,39 @@ static const MemoryRegionOps xive_tm_indirect_ops = {
>>      },
>>  };
>>  
>> +static void pnv_xive_tm_write(void *opaque, hwaddr offset,
>> +                              uint64_t value, unsigned size)
>> +{
>> +    PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
>> +    PnvXive *xive = pnv_xive_tm_get_xive(cpu);
>> +    XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
>> +
>> +    xive_tctx_tm_write(XIVE_PRESENTER(xive), tctx, offset, value, size);
>> +}
>> +
>> +static uint64_t pnv_xive_tm_read(void *opaque, hwaddr offset, unsigned size)
>> +{
>> +    PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
>> +    PnvXive *xive = pnv_xive_tm_get_xive(cpu);
>> +    XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
>> +
>> +    return xive_tctx_tm_read(XIVE_PRESENTER(xive), tctx, offset, size);
> 
> You're not using the opaque pointer in either of these cases.  So
> couldn't you make it point to the presenter for pnv as well, then...

On PowerNV, it's the cpu doing the TIMA load/store which determines 
the chip and the XiveTCTX is deduced from the pnv_cpu_state().

The TIMA is only mapped on chip0 in our model. See CQ_TM1_BAR reg.
 
> 
>> +}
>> +
>> +const MemoryRegionOps pnv_xive_tm_ops = {
>> +    .read = pnv_xive_tm_read,
>> +    .write = pnv_xive_tm_write,
>> +    .endianness = DEVICE_BIG_ENDIAN,
>> +    .valid = {
>> +        .min_access_size = 1,
>> +        .max_access_size = 8,
>> +    },
>> +    .impl = {
>> +        .min_access_size = 1,
>> +        .max_access_size = 8,
>> +    },
>> +};
>> +
>>  /*
>>   * Interrupt controller XSCOM region.
>>   */
>> @@ -1832,7 +1865,7 @@ static void pnv_xive_realize(DeviceState *dev, Error 
>> **errp)
>>                            "xive-pc", PNV9_XIVE_PC_SIZE);
>>  
>>      /* Thread Interrupt Management Area (Direct) */
>> -    memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &xive_tm_ops,
>> +    memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &pnv_xive_tm_ops,
>>                            xive, "xive-tima", PNV9_XIVE_TM_SIZE);
>>  
>>      qemu_register_reset(pnv_xive_reset, dev);
>> diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
>> index eefc0d4c36b9..e00a9bdd901b 100644
>> --- a/hw/intc/spapr_xive.c
>> +++ b/hw/intc/spapr_xive.c
>> @@ -222,6 +222,35 @@ void spapr_xive_set_tctx_os_cam(XiveTCTX *tctx)
>>      memcpy(&tctx->regs[TM_QW1_OS + TM_WORD2], &nvt_cam, 4);
>>  }
>>  
>> +static void spapr_xive_tm_write(void *opaque, hwaddr offset,
>> +                          uint64_t value, unsigned size)
>> +{
>> +    XiveTCTX *tctx = spapr_cpu_state(POWERPC_CPU(current_cpu))->tctx;
>> +
>> +    xive_tctx_tm_write(XIVE_PRESENTER(opaque), tctx, offset, value,
>> size);
> 
> ... there would be no difference from the spapr versions, AFAICT.

the XiveTCTX is deduced from the spapr_cpu_state().

C.

> 
>> +}
>> +
>> +static uint64_t spapr_xive_tm_read(void *opaque, hwaddr offset, unsigned 
>> size)
>> +{
>> +    XiveTCTX *tctx = spapr_cpu_state(POWERPC_CPU(current_cpu))->tctx;
>> +
>> +    return xive_tctx_tm_read(XIVE_PRESENTER(opaque), tctx, offset, size);
>> +}
>> +
>> +const MemoryRegionOps spapr_xive_tm_ops = {
>> +    .read = spapr_xive_tm_read,
>> +    .write = spapr_xive_tm_write,
>> +    .endianness = DEVICE_BIG_ENDIAN,
>> +    .valid = {
>> +        .min_access_size = 1,
>> +        .max_access_size = 8,
>> +    },
>> +    .impl = {
>> +        .min_access_size = 1,
>> +        .max_access_size = 8,
>> +    },
>> +};
>> +
>>  static void spapr_xive_end_reset(XiveEND *end)
>>  {
>>      memset(end, 0, sizeof(*end));
>> @@ -331,8 +360,8 @@ static void spapr_xive_realize(DeviceState *dev, Error 
>> **errp)
>>      qemu_register_reset(spapr_xive_reset, dev);
>>  
>>      /* TIMA initialization */
>> -    memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &xive_tm_ops, xive,
>> -                          "xive.tima", 4ull << TM_SHIFT);
>> +    memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &spapr_xive_tm_ops,
>> +                          xive, "xive.tima", 4ull << TM_SHIFT);
>>      sysbus_init_mmio(SYS_BUS_DEVICE(xive), &xive->tm_mmio);
>>  
>>      /*
>> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
>> index 9bb09ed6ee7b..11432f04f5c3 100644
>> --- a/hw/intc/xive.c
>> +++ b/hw/intc/xive.c
>> @@ -483,35 +483,6 @@ uint64_t xive_tctx_tm_read(XivePresenter *xptr, 
>> XiveTCTX *tctx, hwaddr offset,
>>      return xive_tm_raw_read(tctx, offset, size);
>>  }
>>  
>> -static void xive_tm_write(void *opaque, hwaddr offset,
>> -                          uint64_t value, unsigned size)
>> -{
>> -    XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu);
>> -
>> -    xive_tctx_tm_write(XIVE_PRESENTER(opaque), tctx, offset, value, size);
>> -}
>> -
>> -static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size)
>> -{
>> -    XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu);
>> -
>> -    return xive_tctx_tm_read(XIVE_PRESENTER(opaque), tctx, offset, size);
>> -}
>> -
>> -const MemoryRegionOps xive_tm_ops = {
>> -    .read = xive_tm_read,
>> -    .write = xive_tm_write,
>> -    .endianness = DEVICE_BIG_ENDIAN,
>> -    .valid = {
>> -        .min_access_size = 1,
>> -        .max_access_size = 8,
>> -    },
>> -    .impl = {
>> -        .min_access_size = 1,
>> -        .max_access_size = 8,
>> -    },
>> -};
>> -
>>  static char *xive_tctx_ring_print(uint8_t *ring)
>>  {
>>      uint32_t w2 = xive_tctx_word2(ring);
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]