mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
chrome platform firmware changes for 6.9
* Improvements - Allow userspace to automatically load coreboot modules by adding modaliases and sending uevents. * Misc - Make bus_type const. -----BEGIN PGP SIGNATURE----- iIkEABYIADEWIQS0yQeDP3cjLyifNRUrxTEGBto89AUCZe5rkxMcdHp1bmdiaUBr ZXJuZWwub3JnAAoJECvFMQYG2jz09TIBAPceKZPzZbShXTkiJAEOVi++rxVppFuB 0BV2NqS6b+pBAPwItU5OiQaSUg6PsJNHAHHiJSi6jQ4w7tAdkpfOBlW1Cg== =5dkP -----END PGP SIGNATURE----- Merge tag 'tag-chrome-platform-firmware-for-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux Pull chrome platform firmware updates from Tzung-Bi Shih: - Allow userspace to automatically load coreboot modules by adding modaliases and sending uevents - Make bus_type const * tag 'tag-chrome-platform-firmware-for-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux: firmware: coreboot: Replace tag with id table in driver struct firmware: coreboot: Generate aliases for coreboot modules firmware: coreboot: Generate modalias uevent for devices firmware: coreboot: make coreboot_bus_type const
This commit is contained in:
commit
aa7d6513d6
@ -114,6 +114,12 @@ static int cbmem_entry_probe(struct coreboot_device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct coreboot_device_id cbmem_ids[] = {
|
||||||
|
{ .tag = LB_TAG_CBMEM_ENTRY },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(coreboot, cbmem_ids);
|
||||||
|
|
||||||
static struct coreboot_driver cbmem_entry_driver = {
|
static struct coreboot_driver cbmem_entry_driver = {
|
||||||
.probe = cbmem_entry_probe,
|
.probe = cbmem_entry_probe,
|
||||||
.drv = {
|
.drv = {
|
||||||
@ -121,7 +127,7 @@ static struct coreboot_driver cbmem_entry_driver = {
|
|||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.dev_groups = dev_groups,
|
.dev_groups = dev_groups,
|
||||||
},
|
},
|
||||||
.tag = LB_TAG_CBMEM_ENTRY,
|
.id_table = cbmem_ids,
|
||||||
};
|
};
|
||||||
module_coreboot_driver(cbmem_entry_driver);
|
module_coreboot_driver(cbmem_entry_driver);
|
||||||
|
|
||||||
|
@ -28,8 +28,17 @@ static int coreboot_bus_match(struct device *dev, struct device_driver *drv)
|
|||||||
{
|
{
|
||||||
struct coreboot_device *device = CB_DEV(dev);
|
struct coreboot_device *device = CB_DEV(dev);
|
||||||
struct coreboot_driver *driver = CB_DRV(drv);
|
struct coreboot_driver *driver = CB_DRV(drv);
|
||||||
|
const struct coreboot_device_id *id;
|
||||||
|
|
||||||
return device->entry.tag == driver->tag;
|
if (!driver->id_table)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (id = driver->id_table; id->tag; id++) {
|
||||||
|
if (device->entry.tag == id->tag)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int coreboot_bus_probe(struct device *dev)
|
static int coreboot_bus_probe(struct device *dev)
|
||||||
@ -53,11 +62,20 @@ static void coreboot_bus_remove(struct device *dev)
|
|||||||
driver->remove(device);
|
driver->remove(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct bus_type coreboot_bus_type = {
|
static int coreboot_bus_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
||||||
|
{
|
||||||
|
struct coreboot_device *device = CB_DEV(dev);
|
||||||
|
u32 tag = device->entry.tag;
|
||||||
|
|
||||||
|
return add_uevent_var(env, "MODALIAS=coreboot:t%08X", tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct bus_type coreboot_bus_type = {
|
||||||
.name = "coreboot",
|
.name = "coreboot",
|
||||||
.match = coreboot_bus_match,
|
.match = coreboot_bus_match,
|
||||||
.probe = coreboot_bus_probe,
|
.probe = coreboot_bus_probe,
|
||||||
.remove = coreboot_bus_remove,
|
.remove = coreboot_bus_remove,
|
||||||
|
.uevent = coreboot_bus_uevent,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void coreboot_device_release(struct device *dev)
|
static void coreboot_device_release(struct device *dev)
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#define __COREBOOT_TABLE_H
|
#define __COREBOOT_TABLE_H
|
||||||
|
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
|
|
||||||
/* Coreboot table header structure */
|
/* Coreboot table header structure */
|
||||||
struct coreboot_table_header {
|
struct coreboot_table_header {
|
||||||
@ -93,7 +94,7 @@ struct coreboot_driver {
|
|||||||
int (*probe)(struct coreboot_device *);
|
int (*probe)(struct coreboot_device *);
|
||||||
void (*remove)(struct coreboot_device *);
|
void (*remove)(struct coreboot_device *);
|
||||||
struct device_driver drv;
|
struct device_driver drv;
|
||||||
u32 tag;
|
const struct coreboot_device_id *id_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Register a driver that uses the data from a coreboot table. */
|
/* Register a driver that uses the data from a coreboot table. */
|
||||||
|
@ -80,13 +80,19 @@ static void framebuffer_remove(struct coreboot_device *dev)
|
|||||||
platform_device_unregister(pdev);
|
platform_device_unregister(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct coreboot_device_id framebuffer_ids[] = {
|
||||||
|
{ .tag = CB_TAG_FRAMEBUFFER },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(coreboot, framebuffer_ids);
|
||||||
|
|
||||||
static struct coreboot_driver framebuffer_driver = {
|
static struct coreboot_driver framebuffer_driver = {
|
||||||
.probe = framebuffer_probe,
|
.probe = framebuffer_probe,
|
||||||
.remove = framebuffer_remove,
|
.remove = framebuffer_remove,
|
||||||
.drv = {
|
.drv = {
|
||||||
.name = "framebuffer",
|
.name = "framebuffer",
|
||||||
},
|
},
|
||||||
.tag = CB_TAG_FRAMEBUFFER,
|
.id_table = framebuffer_ids,
|
||||||
};
|
};
|
||||||
module_coreboot_driver(framebuffer_driver);
|
module_coreboot_driver(framebuffer_driver);
|
||||||
|
|
||||||
|
@ -96,13 +96,19 @@ static void memconsole_remove(struct coreboot_device *dev)
|
|||||||
memconsole_exit();
|
memconsole_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct coreboot_device_id memconsole_ids[] = {
|
||||||
|
{ .tag = CB_TAG_CBMEM_CONSOLE },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(coreboot, memconsole_ids);
|
||||||
|
|
||||||
static struct coreboot_driver memconsole_driver = {
|
static struct coreboot_driver memconsole_driver = {
|
||||||
.probe = memconsole_probe,
|
.probe = memconsole_probe,
|
||||||
.remove = memconsole_remove,
|
.remove = memconsole_remove,
|
||||||
.drv = {
|
.drv = {
|
||||||
.name = "memconsole",
|
.name = "memconsole",
|
||||||
},
|
},
|
||||||
.tag = CB_TAG_CBMEM_CONSOLE,
|
.id_table = memconsole_ids,
|
||||||
};
|
};
|
||||||
module_coreboot_driver(memconsole_driver);
|
module_coreboot_driver(memconsole_driver);
|
||||||
|
|
||||||
|
@ -306,13 +306,19 @@ static void vpd_remove(struct coreboot_device *dev)
|
|||||||
kobject_put(vpd_kobj);
|
kobject_put(vpd_kobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct coreboot_device_id vpd_ids[] = {
|
||||||
|
{ .tag = CB_TAG_VPD },
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(coreboot, vpd_ids);
|
||||||
|
|
||||||
static struct coreboot_driver vpd_driver = {
|
static struct coreboot_driver vpd_driver = {
|
||||||
.probe = vpd_probe,
|
.probe = vpd_probe,
|
||||||
.remove = vpd_remove,
|
.remove = vpd_remove,
|
||||||
.drv = {
|
.drv = {
|
||||||
.name = "vpd",
|
.name = "vpd",
|
||||||
},
|
},
|
||||||
.tag = CB_TAG_VPD,
|
.id_table = vpd_ids,
|
||||||
};
|
};
|
||||||
module_coreboot_driver(vpd_driver);
|
module_coreboot_driver(vpd_driver);
|
||||||
|
|
||||||
|
@ -960,4 +960,14 @@ struct vchiq_device_id {
|
|||||||
char name[32];
|
char name[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct coreboot_device_id - Identifies a coreboot table entry
|
||||||
|
* @tag: tag ID
|
||||||
|
* @driver_data: driver specific data
|
||||||
|
*/
|
||||||
|
struct coreboot_device_id {
|
||||||
|
__u32 tag;
|
||||||
|
kernel_ulong_t driver_data;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||||
|
@ -274,5 +274,8 @@ int main(void)
|
|||||||
DEVID(vchiq_device_id);
|
DEVID(vchiq_device_id);
|
||||||
DEVID_FIELD(vchiq_device_id, name);
|
DEVID_FIELD(vchiq_device_id, name);
|
||||||
|
|
||||||
|
DEVID(coreboot_device_id);
|
||||||
|
DEVID_FIELD(coreboot_device_id, tag);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1494,6 +1494,15 @@ static int do_vchiq_entry(const char *filename, void *symval, char *alias)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Looks like: coreboot:tN */
|
||||||
|
static int do_coreboot_entry(const char *filename, void *symval, char *alias)
|
||||||
|
{
|
||||||
|
DEF_FIELD(symval, coreboot_device_id, tag);
|
||||||
|
sprintf(alias, "coreboot:t%08X", tag);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Does namelen bytes of name exactly match the symbol? */
|
/* Does namelen bytes of name exactly match the symbol? */
|
||||||
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
||||||
{
|
{
|
||||||
@ -1575,6 +1584,7 @@ static const struct devtable devtable[] = {
|
|||||||
{"ishtp", SIZE_ishtp_device_id, do_ishtp_entry},
|
{"ishtp", SIZE_ishtp_device_id, do_ishtp_entry},
|
||||||
{"cdx", SIZE_cdx_device_id, do_cdx_entry},
|
{"cdx", SIZE_cdx_device_id, do_cdx_entry},
|
||||||
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
|
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
|
||||||
|
{"coreboot", SIZE_coreboot_device_id, do_coreboot_entry},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Create MODULE_ALIAS() statements.
|
/* Create MODULE_ALIAS() statements.
|
||||||
|
Loading…
Reference in New Issue
Block a user