qxl: refactor rounding up to a nearest power of 2

We already have pow2floor, mirror it and use instead of a function with
similar results (same in used domain), to clarify our intent.

Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Radim Krčmář 2015-02-17 17:30:52 +01:00 committed by Gerd Hoffmann
parent 876d516311
commit bb7443f6d6
3 changed files with 22 additions and 18 deletions

View file

@ -300,19 +300,6 @@ void qxl_spice_reset_cursor(PCIQXLDevice *qxl)
qxl->ssd.cursor = cursor_builtin_hidden(); qxl->ssd.cursor = cursor_builtin_hidden();
} }
static inline uint32_t msb_mask(uint32_t val)
{
uint32_t mask;
do {
mask = ~(val - 1) & val;
val &= ~mask;
} while (mask < val);
return mask;
}
static ram_addr_t qxl_rom_size(void) static ram_addr_t qxl_rom_size(void)
{ {
uint32_t required_rom_size = sizeof(QXLRom) + sizeof(QXLModes) + uint32_t required_rom_size = sizeof(QXLRom) + sizeof(QXLModes) +
@ -1921,10 +1908,10 @@ static void qxl_init_ramsize(PCIQXLDevice *qxl)
qxl->vram32_size = 4096; qxl->vram32_size = 4096;
qxl->vram_size = 4096; qxl->vram_size = 4096;
} }
qxl->vgamem_size = msb_mask(qxl->vgamem_size * 2 - 1); qxl->vgamem_size = pow2ceil(qxl->vgamem_size);
qxl->vga.vram_size = msb_mask(qxl->vga.vram_size * 2 - 1); qxl->vga.vram_size = pow2ceil(qxl->vga.vram_size);
qxl->vram32_size = msb_mask(qxl->vram32_size * 2 - 1); qxl->vram32_size = pow2ceil(qxl->vram32_size);
qxl->vram_size = msb_mask(qxl->vram_size * 2 - 1); qxl->vram_size = pow2ceil(qxl->vram_size);
} }
static int qxl_init_common(PCIQXLDevice *qxl) static int qxl_init_common(PCIQXLDevice *qxl)
@ -1956,7 +1943,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
break; break;
case 4: /* qxl-4 */ case 4: /* qxl-4 */
pci_device_rev = QXL_REVISION_STABLE_V12; pci_device_rev = QXL_REVISION_STABLE_V12;
io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); io_size = pow2ceil(QXL_IO_RANGE_SIZE);
break; break;
default: default:
error_report("Invalid revision %d for qxl device (max %d)", error_report("Invalid revision %d for qxl device (max %d)",

View file

@ -418,6 +418,9 @@ static inline bool is_power_of_2(uint64_t value)
/* round down to the nearest power of 2*/ /* round down to the nearest power of 2*/
int64_t pow2floor(int64_t value); int64_t pow2floor(int64_t value);
/* round up to the nearest power of 2 (0 if overflow) */
uint64_t pow2ceil(uint64_t value);
#include "qemu/module.h" #include "qemu/module.h"
/* /*

View file

@ -483,6 +483,20 @@ int64_t pow2floor(int64_t value)
return value; return value;
} }
/* round up to the nearest power of 2 (0 if overflow) */
uint64_t pow2ceil(uint64_t value)
{
uint8_t nlz = clz64(value);
if (is_power_of_2(value)) {
return value;
}
if (!nlz) {
return 0;
}
return 1ULL << (64 - nlz);
}
/* /*
* Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128) * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128)
* Input is limited to 14-bit numbers * Input is limited to 14-bit numbers