On 27/03/2017 19:09, Marc Zyngier wrote: > On 27/03/17 16:53, Mason wrote: > >> I have one remaining issue with bitmaps. >> >> My HW regs are 32b. How do I grab e.g. bits 96-127? >> All I can think of is >> u32 val = ((u32 *)bitmap)[3]; >> >> Is this acceptable? > > No. > >> mrutland mentioned bitmap_to_u32array() but IIUC it is used to >> copy an entire bitmap. > > The real question is "Why do you need such a thing?". You told me to use an in-memory version of the "unmasked" bitmap, yes? In that case, I need to be able to grab a piece of said bitmap, to update the corresponding piece of the HW bitmap. For example, assume the first 3 MSIs are unmasked, in other words, unmasked = 0x7 A new user comes along and wants to assign an MSI. Scan "unmasked", found bit at pos 3. Update "unmasked" to 0xf. At some point, I need to write 0xf to some HW reg. So I need to grab a piece of "unmasked" (bits 0-31 in my example) pos = find_first_zero_bit(unmasked, COUNT); __set_bit(pos, unmasked); int reg_index = pos / 32; u32 val = ((u32 *)unmasked)[reg_index]; writel_relaxed(val, pcie->enabled + reg_index * 4); Or did I miss something in your suggestion? Regards.