|
@@ -122,29 +122,53 @@ static int firmware_map_add_entry(u64 start, u64 end,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Add memmap entry on sysfs
|
|
|
+ */
|
|
|
+static int add_sysfs_fw_map_entry(struct firmware_map_entry *entry)
|
|
|
+{
|
|
|
+ static int map_entries_nr;
|
|
|
+ static struct kset *mmap_kset;
|
|
|
+
|
|
|
+ if (!mmap_kset) {
|
|
|
+ mmap_kset = kset_create_and_add("memmap", NULL, firmware_kobj);
|
|
|
+ if (!mmap_kset)
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ entry->kobj.kset = mmap_kset;
|
|
|
+ if (kobject_add(&entry->kobj, NULL, "%d", map_entries_nr++))
|
|
|
+ kobject_put(&entry->kobj);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
- * firmware_map_add() - Adds a firmware mapping entry.
|
|
|
+ * firmware_map_add_hotplug() - Adds a firmware mapping entry when we do
|
|
|
+ * memory hotplug.
|
|
|
* @start: Start of the memory range.
|
|
|
* @end: End of the memory range (inclusive).
|
|
|
* @type: Type of the memory range.
|
|
|
*
|
|
|
- * This function uses kmalloc() for memory
|
|
|
- * allocation. Use firmware_map_add_early() if you want to use the bootmem
|
|
|
- * allocator.
|
|
|
- *
|
|
|
- * That function must be called before late_initcall.
|
|
|
+ * Adds a firmware mapping entry. This function is for memory hotplug, it is
|
|
|
+ * similar to function firmware_map_add_early(). The only difference is that
|
|
|
+ * it will create the syfs entry dynamically.
|
|
|
*
|
|
|
* Returns 0 on success, or -ENOMEM if no memory could be allocated.
|
|
|
**/
|
|
|
-int firmware_map_add(u64 start, u64 end, const char *type)
|
|
|
+int __meminit firmware_map_add_hotplug(u64 start, u64 end, const char *type)
|
|
|
{
|
|
|
struct firmware_map_entry *entry;
|
|
|
|
|
|
- entry = kmalloc(sizeof(struct firmware_map_entry), GFP_ATOMIC);
|
|
|
+ entry = kzalloc(sizeof(struct firmware_map_entry), GFP_ATOMIC);
|
|
|
if (!entry)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- return firmware_map_add_entry(start, end, type, entry);
|
|
|
+ firmware_map_add_entry(start, end, type, entry);
|
|
|
+ /* create the memmap entry */
|
|
|
+ add_sysfs_fw_map_entry(entry);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -154,7 +178,7 @@ int firmware_map_add(u64 start, u64 end, const char *type)
|
|
|
* @type: Type of the memory range.
|
|
|
*
|
|
|
* Adds a firmware mapping entry. This function uses the bootmem allocator
|
|
|
- * for memory allocation. Use firmware_map_add() if you want to use kmalloc().
|
|
|
+ * for memory allocation.
|
|
|
*
|
|
|
* That function must be called before late_initcall.
|
|
|
*
|
|
@@ -214,19 +238,10 @@ static ssize_t memmap_attr_show(struct kobject *kobj,
|
|
|
*/
|
|
|
static int __init memmap_init(void)
|
|
|
{
|
|
|
- int i = 0;
|
|
|
struct firmware_map_entry *entry;
|
|
|
- struct kset *memmap_kset;
|
|
|
-
|
|
|
- memmap_kset = kset_create_and_add("memmap", NULL, firmware_kobj);
|
|
|
- if (WARN_ON(!memmap_kset))
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
- list_for_each_entry(entry, &map_entries, list) {
|
|
|
- entry->kobj.kset = memmap_kset;
|
|
|
- if (kobject_add(&entry->kobj, NULL, "%d", i++))
|
|
|
- kobject_put(&entry->kobj);
|
|
|
- }
|
|
|
+ list_for_each_entry(entry, &map_entries, list)
|
|
|
+ add_sysfs_fw_map_entry(entry);
|
|
|
|
|
|
return 0;
|
|
|
}
|