static ssize_t gasket_sysfs_data_show()

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;
}