Skip to content

Commit

Permalink
Merge tag 'tag-chrome-platform-firmware-for-v6.9' of git:https://git.kernel…
Browse files Browse the repository at this point in the history
….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:https://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
  • Loading branch information
torvalds committed Mar 13, 2024
2 parents 61387b8 + 8a0a629 commit aa7d651
Show file tree
Hide file tree
Showing 9 changed files with 73 additions and 7 deletions.
8 changes: 7 additions & 1 deletion drivers/firmware/google/cbmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,20 @@ static int cbmem_entry_probe(struct coreboot_device *dev)
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 = {
.probe = cbmem_entry_probe,
.drv = {
.name = "cbmem",
.owner = THIS_MODULE,
.dev_groups = dev_groups,
},
.tag = LB_TAG_CBMEM_ENTRY,
.id_table = cbmem_ids,
};
module_coreboot_driver(cbmem_entry_driver);

Expand Down
22 changes: 20 additions & 2 deletions drivers/firmware/google/coreboot_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_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)
Expand All @@ -53,11 +62,20 @@ static void coreboot_bus_remove(struct device *dev)
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",
.match = coreboot_bus_match,
.probe = coreboot_bus_probe,
.remove = coreboot_bus_remove,
.uevent = coreboot_bus_uevent,
};

static void coreboot_device_release(struct device *dev)
Expand Down
3 changes: 2 additions & 1 deletion drivers/firmware/google/coreboot_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#define __COREBOOT_TABLE_H

#include <linux/device.h>
#include <linux/mod_devicetable.h>

/* Coreboot table header structure */
struct coreboot_table_header {
Expand Down Expand Up @@ -93,7 +94,7 @@ struct coreboot_driver {
int (*probe)(struct coreboot_device *);
void (*remove)(struct coreboot_device *);
struct device_driver drv;
u32 tag;
const struct coreboot_device_id *id_table;
};

/* Register a driver that uses the data from a coreboot table. */
Expand Down
8 changes: 7 additions & 1 deletion drivers/firmware/google/framebuffer-coreboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,19 @@ static void framebuffer_remove(struct coreboot_device *dev)
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 = {
.probe = framebuffer_probe,
.remove = framebuffer_remove,
.drv = {
.name = "framebuffer",
},
.tag = CB_TAG_FRAMEBUFFER,
.id_table = framebuffer_ids,
};
module_coreboot_driver(framebuffer_driver);

Expand Down
8 changes: 7 additions & 1 deletion drivers/firmware/google/memconsole-coreboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,19 @@ static void memconsole_remove(struct coreboot_device *dev)
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 = {
.probe = memconsole_probe,
.remove = memconsole_remove,
.drv = {
.name = "memconsole",
},
.tag = CB_TAG_CBMEM_CONSOLE,
.id_table = memconsole_ids,
};
module_coreboot_driver(memconsole_driver);

Expand Down
8 changes: 7 additions & 1 deletion drivers/firmware/google/vpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,13 +306,19 @@ static void vpd_remove(struct coreboot_device *dev)
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 = {
.probe = vpd_probe,
.remove = vpd_remove,
.drv = {
.name = "vpd",
},
.tag = CB_TAG_VPD,
.id_table = vpd_ids,
};
module_coreboot_driver(vpd_driver);

Expand Down
10 changes: 10 additions & 0 deletions include/linux/mod_devicetable.h
Original file line number Diff line number Diff line change
Expand Up @@ -960,4 +960,14 @@ struct vchiq_device_id {
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 */
3 changes: 3 additions & 0 deletions scripts/mod/devicetable-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,5 +274,8 @@ int main(void)
DEVID(vchiq_device_id);
DEVID_FIELD(vchiq_device_id, name);

DEVID(coreboot_device_id);
DEVID_FIELD(coreboot_device_id, tag);

return 0;
}
10 changes: 10 additions & 0 deletions scripts/mod/file2alias.c
Original file line number Diff line number Diff line change
Expand Up @@ -1494,6 +1494,15 @@ static int do_vchiq_entry(const char *filename, void *symval, char *alias)
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? */
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
{
Expand Down Expand Up @@ -1575,6 +1584,7 @@ static const struct devtable devtable[] = {
{"ishtp", SIZE_ishtp_device_id, do_ishtp_entry},
{"cdx", SIZE_cdx_device_id, do_cdx_entry},
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
{"coreboot", SIZE_coreboot_device_id, do_coreboot_entry},
};

/* Create MODULE_ALIAS() statements.
Expand Down

0 comments on commit aa7d651

Please sign in to comment.