All of lore.kernel.org
 help / color / mirror / Atom feed
From: Drew Fustini <fustini@kernel.org>
To: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
Cc: qemu-devel@nongnu.org, qemu-riscv@nongnu.org,
	"Palmer Dabbelt" <palmer@dabbelt.com>,
	"Alistair Francis" <alistair.francis@wdc.com>,
	"Sunil V L" <sunilvl@oss.qualcomm.com>,
	"Anup Patel" <anup.patel@oss.qualcomm.com>,
	"Weiwei Li" <liwei1518@gmail.com>,
	"Liu Zhiwei" <zhiwei_liu@linux.alibaba.com>,
	"Chao Liu" <chao.liu@processmission.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Nicolas Pitre" <npitre@baylibre.com>,
	"Kornel Dulęba" <mindal@semihalf.com>,
	"Atish Patra" <atish.patra@linux.dev>,
	"Radim Krčmář" <radim.krcmar@oss.qualcomm.com>,
	"yunhui cui" <cuiyunhui@bytedance.com>,
	"Chen Pei" <cp0613@linux.alibaba.com>,
	guo.wenjia23@zte.com.cn, liu.qingtao2@zte.com.cn
Subject: Re: [PATCH v7 4/6] hw/riscv: implement CBQRI bandwidth controller
Date: Wed, 11 Nov 2026 10:48:34 -0800	[thread overview]
Message-ID: <avS4gmUdTuByzCnb@thelio> (raw)
In-Reply-To: <c9bc3a82-61ea-491a-ab1f-0e09e6d55a54@oss.qualcomm.com>

On Mon, Nov 09, 2026 at 10:09:29AM -0300, Daniel Henrique Barboza wrote:
> On 11/1/2026 5:25 PM, Drew Fustini wrote:
> > From: Nicolas Pitre <npitre@baylibre.com>
> > 
> > Implement a bandwidth controller according to the Capacity and Bandwidth
> > QoS Register Interface (CBQRI) which supports these capabilities:
> > 
> >    - Number of access types: 2 (code and data)
> >    - Usage monitoring operations: CONFIG_EVENT, READ_COUNTER
> >    - Event IDs supported: None, Total read/write byte count, Total
> >                           read byte count, Total write byte count
> >    - Bandwidth allocation operations: CONFIG_LIMIT, READ_LIMIT
> > 
> > The controller gives the Linux resctrl support for CBQRI a device to
> > configure and read back bandwidth limits per RCID on the virt machine.
> > Only the register interface is modeled. The configured limits are not
> > enforced and the monitoring counters are always marked INVALID because
> > QEMU does not model memory bandwidth usage.
> > 
> > Link: https://github.com/riscv-non-isa/riscv-cbqri/releases/tag/v1.0
> > Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
> > [fustini: add fields introduced in the ratified spec: rpfx and p]
> > Signed-off-by: Drew Fustini <fustini@kernel.org>
> > ---
> 
> LGTM overall.  A few comments:

Thanks for reviewing!

[..]
> > +typedef struct BandwidthAllocation {
> > +    uint32_t Rbwb:16;
> > +    uint32_t Mweight:8;
> > +    uint32_t sharedAT:3;
> > +    bool useShared:1;
> > +} BandwidthAllocation;
[..]
> I believe BandwidthAllocation could be renamed to RiscvCbrqiBandwidthAllocation for
> naming consistency.

Good idea, I'll change it.

> > +#define RISCV_CBQRI_BC(obj) \
> > +    OBJECT_CHECK(RiscvCbqriBandwidthState, (obj), TYPE_RISCV_CBQRI_BC)
> > +
> > +/*
> > + * All bandwidth allocation records are contiguous to simplify
> > + * allocation. The first one is used to hold the BC_BW_ALLOC register
> > + * content, followed by respective records for each AT per RCID.
> > + *
> > + * Records are indexed by the AT encoding, so each RCID has one record
> > + * per AT value whether or not the controller supports the code access
> > + * type. is_valid_at() rejects an unsupported AT before a record is
> > + * selected.
> > + */
> > +static unsigned int bw_alloc_index(uint32_t rcid, uint32_t at)
> > +{
> > +    assert(at < BC_NB_ATS);
> 
> Please use g_assert() instead of assert().

Okay, I will change it.

[..]
> > +static void riscv_cbqri_bc_class_init(ObjectClass *klass, const void *data)
> > +{
> > +    DeviceClass *dc = DEVICE_CLASS(klass);
> > +    dc->realize = riscv_cbqri_bc_realize;
> > +    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
> > +    dc->desc = "RISC-V CBQRI Bandwidth Controller";
> > +    device_class_set_props(dc, riscv_cbqri_bc_properties);
> > +    dc->legacy_reset = riscv_cbqri_bc_reset;
> 
> We're moving away from legacy_reset for new devices.  We're now declaring a Resettable
> interface and setting reset phases.
> 
> For this device a simple way of doing it is to slightly change th reset callback params:
> 
> 
> static void riscv_cbqri_bc_reset(Object *obj, ResetType type)
> 
> And then during class_init:
> 
>     ResettableClass *rc = RESETTABLE_CLASS(klass);
> 
>     rc->phases.hold = riscv_cbqri_bc_reset;

Thanks for letting me know. I will switch to the Resettable interface.

[..]
> > +DeviceState *riscv_cbqri_bc_create(hwaddr addr,
> > +                                   const RiscvCbqriBandwidthCaps *caps)
> > +{
> > +    DeviceState *dev = qdev_new(TYPE_RISCV_CBQRI_BC);
> > +
> > +    qdev_prop_set_uint64(dev, "mmio_base", addr);
> > +    qdev_prop_set_uint16(dev, "max_mcids", caps->nb_mcids);
> > +    qdev_prop_set_uint16(dev, "max_rcids", caps->nb_rcids);
> > +    qdev_prop_set_uint16(dev, "nbwblks", caps->nbwblks);
> > +    qdev_prop_set_uint16(dev, "mrbwb", caps->mrbwb);
> > +
> > +    qdev_prop_set_bit(dev, "at_code",
> > +                      caps->supports_at_code);
> > +    qdev_prop_set_bit(dev, "alloc_op_config_limit",
> > +                      caps->supports_alloc_op_config_limit);
> > +    qdev_prop_set_bit(dev, "alloc_op_read_limit",
> > +                      caps->supports_alloc_op_read_limit);
> > +    qdev_prop_set_bit(dev, "mon_op_config_event",
> > +                      caps->supports_mon_op_config_event);
> > +    qdev_prop_set_bit(dev, "mon_op_read_counter",
> > +                      caps->supports_mon_op_read_counter);
> > +    qdev_prop_set_bit(dev, "mon_evt_id_none",
> > +                      caps->supports_mon_evt_id_none);
> > +    qdev_prop_set_bit(dev, "mon_evt_id_rdwr_count",
> > +                      caps->supports_mon_evt_id_rdwr_count);
> > +    qdev_prop_set_bit(dev, "mon_evt_id_rdonly_count",
> > +                      caps->supports_mon_evt_id_rdonly_count);
> > +    qdev_prop_set_bit(dev, "mon_evt_id_wronly_count",
> > +                      caps->supports_mon_evt_id_wronly_count);
> > +
> > +    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> > +
> > +    return dev;
> > +}
> 
> We don't have any callers for riscv_cbqri_bc_create() in the series so I can't
> see how the intended use would be.  In particular with the RiscvCbqriBandwidthCaps *caps
> attribute.

Good catch. They were for the fixed example SoC for v1 back in the 2023
v1. v2 switched to -device and nothing has called them since.

> Note that riscv_cbqri_bc_create() is blindly applying all settings from 'caps' to
> the device.  This is fine, but note that extra care is required when retrieving 'caps'
> w.r.t the defaults established.
> 
> E.g. in riscv_cbqri_bc_properties[] we have:
> 
> > +    DEFINE_PROP_UINT16("max_mcids", RiscvCbqriBandwidthState, nb_mcids, 256),
> 
> > +    DEFINE_PROP_UINT16("mrbwb", RiscvCbqriBandwidthState, mrbwb, 819),
> > +
> > +    DEFINE_PROP_BOOL("at_code", RiscvCbqriBandwidthState,
> > +                     supports_at_code, true),
> 
> 
> Now let's say that we'll add the device in the 'virt' machine, and I want to change just
> nb_mcids to 512 and nothing else. If I do this:
> 
> 
> RiscvCbqriBandwidthCaps caps = {.nb_mcids = 512};
> 
> (...)
> 
> riscv_cbqri_bc_create(addr, &caps);
> 
> 
> 
> I'll create a TYPE_RISCV_CBQRI_BC nb_mcids = 512 and everything else will be zeroed, disregarding
> all defaults from riscv_cbqri_bc_properties[].
> 
> 
> My suggestion here is to create a riscv_cbqri_bc_caps_init(RiscvCbqriBandwidthCaps *caps) helper
> that callers can use to set the struct defaults first.  We would then do:
> 
> 
> RiscvCbqriBandwidthCaps caps;
> 
> riscv_cbqri_bc_caps_init(caps);
> caps.nb_mcids = 512;
> 
> (...)
> 
> riscv_cbqri_bc_create(addr, &caps);
> 
> 
> We have precedent for this pattern - most RISC-V boards use riscv_boot_info_init() to init
> a boot_info struct.

Thanks for the guidance. I will add riscv_cbqri_bc_caps_init() and
riscv_cbqri_cc_caps_init() to set the property defaults in the caps
struct.

Thanks,
Drew


  reply	other threads:[~2026-11-11 18:49 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-01 20:25 [PATCH v7 0/6] riscv: implement Ssqosid extension and CBQRI controllers Drew Fustini
2026-11-01 20:25 ` [PATCH v7 1/6] riscv: implement Ssqosid extension and srmcfg CSR Drew Fustini
2026-11-01 20:25 ` [PATCH v7 2/6] hw/riscv: define capabilities of CBQRI controllers Drew Fustini
2026-11-01 20:25 ` [PATCH v7 3/6] hw/riscv: implement CBQRI capacity controller Drew Fustini
2026-11-01 20:25 ` [PATCH v7 4/6] hw/riscv: implement CBQRI bandwidth controller Drew Fustini
2026-11-09 13:09   ` Daniel Henrique Barboza
2026-11-11 18:48     ` Drew Fustini [this message]
2026-11-01 20:25 ` [PATCH v7 5/6] hw/riscv: add CBQRI to Kconfig and build if enabled Drew Fustini
2026-11-09 13:14   ` Daniel Henrique Barboza
2026-11-01 20:25 ` [PATCH v7 6/6] hw/riscv: add CBQRI controllers to virt machine Drew Fustini

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=avS4gmUdTuByzCnb@thelio \
    --to=fustini@kernel.org \
    --cc=alistair.francis@wdc.com \
    --cc=anup.patel@oss.qualcomm.com \
    --cc=atish.patra@linux.dev \
    --cc=chao.liu@processmission.com \
    --cc=cp0613@linux.alibaba.com \
    --cc=cuiyunhui@bytedance.com \
    --cc=daniel.barboza@oss.qualcomm.com \
    --cc=guo.wenjia23@zte.com.cn \
    --cc=liu.qingtao2@zte.com.cn \
    --cc=liwei1518@gmail.com \
    --cc=mindal@semihalf.com \
    --cc=npitre@baylibre.com \
    --cc=palmer@dabbelt.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-riscv@nongnu.org \
    --cc=radim.krcmar@oss.qualcomm.com \
    --cc=sunilvl@oss.qualcomm.com \
    --cc=zhiwei_liu@linux.alibaba.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.