in tools/driver/drivers/gasket/gasket_core.c [1537:1648]
static ssize_t gasket_sysfs_data_show(
struct device *device, struct device_attribute *attr, char *buf)
{
int i, ret = 0;
ssize_t current_written;
const struct gasket_driver_desc *driver_desc;
struct gasket_dev *gasket_dev;
struct gasket_sysfs_attribute *gasket_attr;
const struct gasket_bar_desc *bar_desc;
enum gasket_sysfs_attribute_type sysfs_type;
const struct gasket_unforkable_mapping *unforkable_maps;
gasket_dev = gasket_sysfs_get_device_data(device);
if (gasket_dev == NULL)
return 0;
gasket_attr = gasket_sysfs_get_attr(device, attr);
if (gasket_attr == NULL) {
return 0;
}
driver_desc = gasket_dev->driver_desc;
unforkable_maps = &gasket_dev->internal_desc->unforkable_maps;
sysfs_type =
(enum gasket_sysfs_attribute_type) gasket_attr->data.attr_type;
switch (sysfs_type) {
case ATTR_BAR_OFFSETS:
for (i = 0; i < GASKET_NUM_BARS; i++) {
bar_desc = &driver_desc->bar_descriptions[i];
if (bar_desc->size == 0)
continue;
current_written = snprintf(buf, PAGE_SIZE - ret,
"%d: 0x%lx\n", i, (ulong) bar_desc->base);
buf += current_written;
ret += current_written;
}
break;
case ATTR_BAR_SIZES:
for (i = 0; i < GASKET_NUM_BARS; i++) {
bar_desc = &driver_desc->bar_descriptions[i];
if (bar_desc->size == 0)
continue;
current_written = snprintf(buf, PAGE_SIZE - ret,
"%d: 0x%lx\n", i, (ulong) bar_desc->size);
buf += current_written;
ret += current_written;
}
break;
case ATTR_DRIVER_VERSION:
ret = snprintf(buf, PAGE_SIZE, "%s\n",
gasket_dev->driver_desc->driver_version);
break;
case ATTR_FRAMEWORK_VERSION:
ret = snprintf(
buf, PAGE_SIZE, "%s\n", GASKET_FRAMEWORK_VERSION);
break;
case ATTR_DEVICE_TYPE:
ret = snprintf(buf, PAGE_SIZE, "%s\n",
gasket_dev->internal_desc->device_desc->name);
break;
case ATTR_HARDWARE_REVISION:
ret = snprintf(
buf, PAGE_SIZE, "%d\n", gasket_dev->hardware_revision);
break;
case ATTR_PCI_ADDRESS:
ret = snprintf(buf, PAGE_SIZE, "%s\n", gasket_dev->kobj_name);
break;
case ATTR_STATUS:
ret = snprintf(buf, PAGE_SIZE, "%s\n",
gasket_num_name_lookup(
gasket_dev->status, gasket_status_name_table));
break;
case ATTR_IS_DEVICE_OWNED:
ret = snprintf(buf, PAGE_SIZE, "%d\n",
gasket_dev->ownership.is_owned);
break;
case ATTR_DEVICE_OWNER:
ret = snprintf(buf, PAGE_SIZE, "%d\n",
gasket_dev->ownership.owner);
break;
case ATTR_WRITE_OPEN_COUNT:
ret = snprintf(buf, PAGE_SIZE, "%d\n",
gasket_dev->ownership.write_open_count);
break;
case ATTR_RESET_COUNT:
ret = snprintf(buf, PAGE_SIZE, "%d\n", gasket_dev->reset_count);
break;
case ATTR_USER_MEM_RANGES:
for (i = 0; i < GASKET_NUM_BARS; ++i) {
current_written = gasket_write_mappable_regions(
buf, driver_desc, i);
buf += current_written;
ret += current_written;
}
break;
case ATTR_UNFORKABLE_MAP_COUNT:
ret = snprintf(buf, PAGE_SIZE, "%d\n",
unforkable_maps->unforkable_map_count);
break;
case ATTR_LAST_UNFORKABLE_MAP_PID:
ret = snprintf(buf, PAGE_SIZE, "%d\n",
unforkable_maps->last_mapped_unforkable_pid);
break;
case ATTR_LAST_UNFORKABLE_MAP_NAME:
ret = snprintf(buf, PAGE_SIZE, "%s\n",
unforkable_maps->last_mapped_unforkable_process_name);
break;
default:
gasket_log_error(
gasket_dev, "Unknown attribute: %s", attr->attr.name);
ret = 0;
break;
}
return ret;
}