|
@@ -64,6 +64,7 @@ extern int memblock_find(struct memblock_region *res);
|
|
|
|
|
|
extern void memblock_dump_all(void);
|
|
|
|
|
|
+/* Obsolete accessors */
|
|
|
static inline u64
|
|
|
memblock_size_bytes(struct memblock_type *type, unsigned long region_nr)
|
|
|
{
|
|
@@ -86,6 +87,57 @@ memblock_end_pfn(struct memblock_type *type, unsigned long region_nr)
|
|
|
memblock_size_pages(type, region_nr);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * pfn conversion functions
|
|
|
+ *
|
|
|
+ * While the memory MEMBLOCKs should always be page aligned, the reserved
|
|
|
+ * MEMBLOCKs may not be. This accessor attempt to provide a very clear
|
|
|
+ * idea of what they return for such non aligned MEMBLOCKs.
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * memblock_region_base_pfn - Return the lowest pfn intersecting with the region
|
|
|
+ * @reg: memblock_region structure
|
|
|
+ */
|
|
|
+static inline unsigned long memblock_region_base_pfn(const struct memblock_region *reg)
|
|
|
+{
|
|
|
+ return reg->base >> PAGE_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * memblock_region_last_pfn - Return the highest pfn intersecting with the region
|
|
|
+ * @reg: memblock_region structure
|
|
|
+ */
|
|
|
+static inline unsigned long memblock_region_last_pfn(const struct memblock_region *reg)
|
|
|
+{
|
|
|
+ return (reg->base + reg->size - 1) >> PAGE_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * memblock_region_end_pfn - Return the pfn of the first page following the region
|
|
|
+ * but not intersecting it
|
|
|
+ * @reg: memblock_region structure
|
|
|
+ */
|
|
|
+static inline unsigned long memblock_region_end_pfn(const struct memblock_region *reg)
|
|
|
+{
|
|
|
+ return memblock_region_last_pfn(reg) + 1;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * memblock_region_pages - Return the number of pages covering a region
|
|
|
+ * @reg: memblock_region structure
|
|
|
+ */
|
|
|
+static inline unsigned long memblock_region_pages(const struct memblock_region *reg)
|
|
|
+{
|
|
|
+ return memblock_region_end_pfn(reg) - memblock_region_end_pfn(reg);
|
|
|
+}
|
|
|
+
|
|
|
+#define for_each_memblock(memblock_type, region) \
|
|
|
+ for (region = memblock.memblock_type.regions; \
|
|
|
+ region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \
|
|
|
+ region++)
|
|
|
+
|
|
|
+
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
#endif /* _LINUX_MEMBLOCK_H */
|