On 3/13/2025 7:53 PM, Alejandro Jimenez wrote:


On 3/12/25 12:12 AM, Arun Kodilkar, Sairaj wrote:
Hi Alejandro,

On 3/11/2025 8:54 PM, Alejandro Jimenez wrote:

[...]

--- a/hw/i386/amd_iommu.h
+++ b/hw/i386/amd_iommu.h
@@ -25,6 +25,8 @@
  #include "hw/i386/x86-iommu.h"
  #include "qom/object.h"
+#define GENMASK64(h, l)  (((~0ULL) >> (63 - (h) + (l))) << (l))
+

qemu provides the similar macro 'MAKE_64BIT_MASK' in file
'include/qemu/bitops.h', you can use this existing macro
instead of redefining.

Hi Sairaj,

I became aware of MAKE_64BIT_MASK() because you used it in your recent patch, but as you mentioned they are similar but not the same. I personally find that using bit indexes is less prone to errors since that is the same format the spec uses to define the fields.
So translating a RSVD[6:2] field from the spec becomes:

GENMASK64(6, 2);
vs
MAKE_64BIT_MASK(6, 5);

The latter is more prone to off-by-one errors in my opinion, specially when you are defining lots of masks. Perhaps more importantly, I'd like to progressively convert the amd_iommu definitions to use GENMASK() and the code that retrieves bit fields to use FIELD_GET().

I am planning on later porting the generic GENMASK* definitions (from the kernel into "qemu/bitops.h", since the RISC-V IOMMU is also a consumer of GENMASK, but I am trying to keep the focus on the AMD vIOMMU for this series.

Thank you,
Alejandro


Hi Alejandro,
Yes indeed, GENMASK64() is more readable than the MAKE_64BIT_MASK().
and Since you are going to port it to generic layer, its better
to use GENMASK64().
Feel free to replace existing MAKE_64BIT_MASK() in my recent patches.
otherwise, I can modify it during next patch series.

Regards
Sairaj Kodilkar


  /* Capability registers */
  #define AMDVI_CAPAB_BAR_LOW           0x04
  #define AMDVI_CAPAB_BAR_HIGH          0x08
@@ -162,9 +164,10 @@
  #define AMDVI_FEATURE_PC                  (1ULL << 9) /* Perf counters       */
  /* reserved DTE bits */
-#define AMDVI_DTE_LOWER_QUAD_RESERVED  0x80300000000000fc
-#define AMDVI_DTE_MIDDLE_QUAD_RESERVED 0x0000000000000100
-#define AMDVI_DTE_UPPER_QUAD_RESERVED  0x08f0000000000000
+#define AMDVI_DTE_QUAD0_RESERVED        (GENMASK64(6, 2) | GENMASK64(63, 63))
+#define AMDVI_DTE_QUAD1_RESERVED        0
+#define AMDVI_DTE_QUAD2_RESERVED        GENMASK64(53, 52)
+#define AMDVI_DTE_QUAD3_RESERVED        (GENMASK64(14, 0) | GENMASK64(53, 48))
  /* AMDVI paging mode */
  #define AMDVI_GATS_MODE                 (2ULL <<  12)

Regards
Sairaj Kodilkar



Reply via email to