From: Zhao Liu <zhao1.liu@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
"Junjie Mao" <junjie.mao@hotmail.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Daniel P . Berrangé" <berrange@redhat.com>,
qemu-devel@nongnu.org, qemu-rust@nongnu.org
Subject: Re: [PATCH 09/10] rust/timer/hpet: add qom and qdev APIs support
Date: Sat, 8 Feb 2025 18:55:49 +0800 [thread overview]
Message-ID: <Z6c4NVX4wteIEIOA@intel.com> (raw)
In-Reply-To: <750f06f3-6326-473f-9d08-ad6bb1f2a54a@redhat.com>
On Wed, Jan 29, 2025 at 11:58:14AM +0100, Paolo Bonzini wrote:
> Date: Wed, 29 Jan 2025 11:58:14 +0100
> From: Paolo Bonzini <pbonzini@redhat.com>
> Subject: Re: [PATCH 09/10] rust/timer/hpet: add qom and qdev APIs support
>
>
>
> On Sat, Jan 25, 2025 at 1:32 PM Zhao Liu <zhao1.liu@intel.com> wrote:
> > fn read(&mut self, addr: hwaddr, _size: u32) -> u64 {
>
> This can be &self.
Done.
> > let shift: u64 = (addr & 4) * 8;
> >
> > + match addr {
> > + HPET_TN_CFG_REG => self.config >> shift, // including interrupt capabilities
>
> This needs to be "match addr & !4".
I understand it's not necessary:
In timer_and_addr(), I've masked the address with 0x18.
fn timer_and_addr(&self, addr: hwaddr) -> Option<(&BqlRefCell<HPETTimer>, hwaddr)> {
let timer_id: usize = ((addr - 0x100) / 0x20) as usize;
if timer_id > self.num_timers.get() {
None
} else {
Some((&self.timers[timer_id], addr & 0x18))
}
}
And in HPETState::read(), I pass the masked address to
HPETTimer::read():
fn read(&self, addr: hwaddr, size: u32) -> u64 {
let shift: u64 = (addr & 4) * 8;
if (0x100..=0x3ff).contains(&addr) {
match self.timer_and_addr(addr) {
None => 0, // Reserved,
Some((timer, addr)) => timer.borrow_mut().read(addr, size),
}
}
Ah, the `addr` variable in Some() is misleading, and I should use
anothor name like `tn_addr`.
0x18 is a subset of !0x4, so the bitwise & operation with !0x4 can be
omitted (I understand that this is why you also omitted this in the C
side in the commit c2366567378dd :-) ).
But `match addr & !4` is also reasonable, which explicitly emphasize
`& !4` makes the code clearer. I would do this.
> > + HPET_TN_CMP_REG => self.cmp >> shift, // comparator register
> > + HPET_TN_FSB_ROUTE_REG => self.fsb >> shift,
> > + _ => {
> > + // TODO: Add trace point - trace_hpet_ram_read_invalid()
> > + // Reserved.
> > + 0
> > + }
> > + }
> > + }
> > +
> > + fn write(&mut self, addr: hwaddr, value: u64, size: u32) {
> > + let shift = ((addr & 4) * 8) as u32;
> > + let len = std::cmp::min(size * 8, 64 - shift);
> > +
> > + match addr {
> > + HPET_TN_CFG_REG => self.set_tn_cfg_reg(shift, len, value),
>
> Likewise.
Done. Thanks!
> > + fn write(&self, addr: hwaddr, value: u64, size: u32) {
> > + let shift = ((addr & 4) * 8) as u32;
> > + let len = std::cmp::min(size * 8, 64 - shift);
> > +
> > + // TODO: Add trace point - trace_hpet_ram_write(addr, value)
> > + if (0x100..=0x3ff).contains(&addr
> ) {
> > + match self.timer_and_addr(addr) {
> > + None => return, // Reserved.
>
> Clippy complains about an unnecessary return, just replace it with "()".
Fixed.
> > + Some((timer, addr)) => timer.borrow_mut().write(addr, value, size),
> > + }
>
> > +
> > + fn reset_hold(&self, _type: ResetType) {
> > + let sbd = self.upcast::<SysBusDevice>();
> > +
> > + for timer in self.timers.iter().take(self.num_timers.get()) {
> > + timer.borrow_mut().reset();
> > + }
> > +
> > + self.counter.set(0);
> > + self.config.set(0);
> > + self.pit_enabled.set(true);
> > + self.hpet_offset.set(0);
> > +
> > + HPETFwConfig::update_hpet_cfg(
> > + self.hpet_id.get(),
> > + Some(self.capability.get() as u32),
> > + Some((*sbd).mmio[0].addr),
> > + );
>
> This can be simply sbd.mmio[0].addr, without the (*...).
>
> Also, you can change update_hpet_cfg to take arguments without the Option<>
> around them.
Good idea! Done.
> > +// TODO: add OBJECT_DECLARE_SIMPLE_TYPE.
> > +#[repr(C)]
> > +pub struct HPETClass {
> > + parent_class: <SysBusDevice as ObjectType>::Class,
> > +}
> > +
> > +unsafe impl ObjectType for HPETState {
> > + type Class = HPETClass;
> > + const TYPE_NAME: &'static CStr = crate::TYPE_HPET;
> > +}
>
> No need for HPETClass (and for ClassInitImpl<HPETClass>), just do
>
> unsafe impl ObjectType for HPETState {
Pls let me add a comment here:
// No need for HPETClass. Just like OBJECT_DECLARE_SIMPLE_TYPE in C.
Then this can be "grep", as a reference.
> type Class = <SysBusDevice as ObjectType>::Class;
> const TYPE_NAME: &'static CStr = crate::TYPE_HPET;
> }
>
> which is indeed more similar to OBJECT_DECLARE_SIMPLE_TYPE().
Awesome! Thanks.
Regards,
Zhao
next prev parent reply other threads:[~2025-02-08 10:36 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-25 12:51 [PATCH 00/10] rust: Add HPET timer device Zhao Liu
2025-01-25 12:51 ` [PATCH 01/10] i386/fw_cfg: move hpet_cfg definition to hpet.c Zhao Liu
2025-01-25 12:51 ` [PATCH 02/10] rust/qdev: add the macro to define bit property Zhao Liu
2025-01-25 12:51 ` [PATCH 03/10] rust/irq: Add a helper to convert [InterruptSource] to [*mut IRQState] Zhao Liu
2025-01-29 10:51 ` Paolo Bonzini
2025-02-07 7:10 ` Zhao Liu
2025-02-07 7:44 ` Zhao Liu
2025-02-07 9:57 ` Paolo Bonzini
2025-02-08 11:14 ` Zhao Liu
2025-02-08 11:39 ` Paolo Bonzini
2025-02-08 18:10 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 04/10] rust: add bindings for gpio_{in|out} initialization Zhao Liu
2025-01-29 10:59 ` Paolo Bonzini
2025-02-07 8:43 ` Zhao Liu
2025-02-07 9:54 ` Paolo Bonzini
2025-02-08 11:16 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 05/10] rust: add bindings for memattrs Zhao Liu
2025-01-25 12:51 ` [PATCH 06/10] rust: add bindings for timer Zhao Liu
2025-01-29 10:58 ` Paolo Bonzini
2025-02-07 13:33 ` Zhao Liu
2025-02-07 14:55 ` Paolo Bonzini
2025-02-08 11:08 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 07/10] rust/timer/hpet: define hpet_cfg Zhao Liu
2025-01-29 10:58 ` Paolo Bonzini
2025-02-07 14:30 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 08/10] rust/timer/hpet: add basic HPET timer and HPETState Zhao Liu
2025-01-29 10:57 ` Paolo Bonzini
2025-02-08 8:19 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 09/10] rust/timer/hpet: add qom and qdev APIs support Zhao Liu
2025-01-29 10:58 ` Paolo Bonzini
2025-02-08 10:55 ` Zhao Liu [this message]
2025-02-08 11:41 ` Paolo Bonzini
2025-02-08 18:06 ` Zhao Liu
2025-01-25 12:51 ` [PATCH 10/10] i386: enable rust hpet for pc when rust is enabled Zhao Liu
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=Z6c4NVX4wteIEIOA@intel.com \
--to=zhao1.liu@intel.com \
--cc=alex.bennee@linaro.org \
--cc=berrange@redhat.com \
--cc=junjie.mao@hotmail.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-rust@nongnu.org \
--cc=richard.henderson@linaro.org \
/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.