Commit 6b5faec9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-2024072901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid

Pull HID fixes from Benjamin Tissoires:

 - fixes for HID-BPF after the merge with the bpf tree (Arnd Bergmann
   and Benjamin Tissoires)

 - some tool type fix for the Wacom driver (Tatsunosuke Tobita)

 - a reorder of the sensor discovery to ensure the HID AMD SFH is
   removed when no sensors are available (Basavaraj Natikar)

* tag 'for-linus-2024072901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
  selftests/hid: add test for attaching multiple time the same struct_ops
  HID: bpf: prevent the same struct_ops to be attached more than once
  selftests/hid: disable struct_ops auto-attach
  selftests/hid: fix bpf_wq new API
  HID: amd_sfh: Move sensor discovery before HID device initialization
  hid: bpf: add BPF_JIT dependency
  HID: wacom: more appropriate tool type categorization
  HID: wacom: Modify pen IDs
parents 10826505 facdbdfe
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -288,12 +288,22 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
		mp2_ops->start(privdata, info);
		cl_data->sensor_sts[i] = amd_sfh_wait_for_response
						(privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);

		if (cl_data->sensor_sts[i] == SENSOR_ENABLED)
			cl_data->is_any_sensor_enabled = true;
	}

	if (!cl_data->is_any_sensor_enabled ||
	    (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0)) {
		dev_warn(dev, "Failed to discover, sensors not enabled is %d\n",
			 cl_data->is_any_sensor_enabled);
		rc = -EOPNOTSUPP;
		goto cleanup;
	}

	for (i = 0; i < cl_data->num_hid_devices; i++) {
		cl_data->cur_hid_dev = i;
		if (cl_data->sensor_sts[i] == SENSOR_ENABLED) {
			cl_data->is_any_sensor_enabled = true;
			rc = amdtp_hid_probe(i, cl_data);
			if (rc)
				goto cleanup;
@@ -305,12 +315,6 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
			cl_data->sensor_sts[i]);
	}

	if (!cl_data->is_any_sensor_enabled ||
	   (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0)) {
		dev_warn(dev, "Failed to discover, sensors not enabled is %d\n", cl_data->is_any_sensor_enabled);
		rc = -EOPNOTSUPP;
		goto cleanup;
	}
	schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
	return 0;

+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ menu "HID-BPF support"

config HID_BPF
	bool "HID-BPF support"
	depends on BPF
	depends on BPF_JIT
	depends on BPF_SYSCALL
	depends on DYNAMIC_FTRACE_WITH_DIRECT_CALLS
	help
+5 −0
Original line number Diff line number Diff line
@@ -183,6 +183,10 @@ static int hid_bpf_reg(void *kdata, struct bpf_link *link)
	struct hid_device *hdev;
	int count, err = 0;

	/* prevent multiple attach of the same struct_ops */
	if (ops->hdev)
		return -EINVAL;

	hdev = hid_get_device(ops->hid_id);
	if (IS_ERR(hdev))
		return PTR_ERR(hdev);
@@ -248,6 +252,7 @@ static void hid_bpf_unreg(void *kdata, struct bpf_link *link)

	list_del_rcu(&ops->list);
	synchronize_srcu(&hdev->bpf.srcu);
	ops->hdev = NULL;

	reconnect = hdev->bpf.rdesc_ops == ops;
	if (reconnect)
+10 −57
Original line number Diff line number Diff line
@@ -692,78 +692,28 @@ static bool wacom_is_art_pen(int tool_id)

static int wacom_intuos_get_tool_type(int tool_id)
{
	int tool_type = BTN_TOOL_PEN;

	if (wacom_is_art_pen(tool_id))
		return tool_type;

	switch (tool_id) {
	case 0x812: /* Inking pen */
	case 0x801: /* Intuos3 Inking pen */
	case 0x12802: /* Intuos4/5 Inking Pen */
	case 0x012:
		tool_type = BTN_TOOL_PENCIL;
		break;

	case 0x822: /* Pen */
	case 0x842:
	case 0x852:
	case 0x823: /* Intuos3 Grip Pen */
	case 0x813: /* Intuos3 Classic Pen */
	case 0x802: /* Intuos4/5 13HD/24HD General Pen */
	case 0x8e2: /* IntuosHT2 pen */
	case 0x022:
	case 0x200: /* Pro Pen 3 */
	case 0x04200: /* Pro Pen 3 */
	case 0x10842: /* MobileStudio Pro Pro Pen slim */
	case 0x14802: /* Intuos4/5 13HD/24HD Classic Pen */
	case 0x16802: /* Cintiq 13HD Pro Pen */
	case 0x18802: /* DTH2242 Pen */
	case 0x10802: /* Intuos4/5 13HD/24HD General Pen */
	case 0x80842: /* Intuos Pro and Cintiq Pro 3D Pen */
		tool_type = BTN_TOOL_PEN;
		break;
		return BTN_TOOL_PENCIL;

	case 0x832: /* Stroke pen */
	case 0x032:
		tool_type = BTN_TOOL_BRUSH;
		break;
		return BTN_TOOL_BRUSH;

	case 0x007: /* Mouse 4D and 2D */
	case 0x09c:
	case 0x094:
	case 0x017: /* Intuos3 2D Mouse */
	case 0x806: /* Intuos4 Mouse */
		tool_type = BTN_TOOL_MOUSE;
		break;
		return BTN_TOOL_MOUSE;

	case 0x096: /* Lens cursor */
	case 0x097: /* Intuos3 Lens cursor */
	case 0x006: /* Intuos4 Lens cursor */
		tool_type = BTN_TOOL_LENS;
		break;

	case 0x82a: /* Eraser */
	case 0x84a:
	case 0x85a:
	case 0x91a:
	case 0xd1a:
	case 0x0fa:
	case 0x82b: /* Intuos3 Grip Pen Eraser */
	case 0x81b: /* Intuos3 Classic Pen Eraser */
	case 0x91b: /* Intuos3 Airbrush Eraser */
	case 0x80c: /* Intuos4/5 13HD/24HD Marker Pen Eraser */
	case 0x80a: /* Intuos4/5 13HD/24HD General Pen Eraser */
	case 0x90a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
	case 0x1480a: /* Intuos4/5 13HD/24HD Classic Pen Eraser */
	case 0x1090a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
	case 0x1080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */
	case 0x1084a: /* MobileStudio Pro Pro Pen slim Eraser */
	case 0x1680a: /* Cintiq 13HD Pro Pen Eraser */
	case 0x1880a: /* DTH2242 Eraser */
	case 0x1080a: /* Intuos4/5 13HD/24HD General Pen Eraser */
		tool_type = BTN_TOOL_RUBBER;
		break;
		return BTN_TOOL_LENS;

	case 0xd12:
	case 0x912:
@@ -771,10 +721,13 @@ static int wacom_intuos_get_tool_type(int tool_id)
	case 0x913: /* Intuos3 Airbrush */
	case 0x902: /* Intuos4/5 13HD/24HD Airbrush */
	case 0x10902: /* Intuos4/5 13HD/24HD Airbrush */
		tool_type = BTN_TOOL_AIRBRUSH;
		break;
		return BTN_TOOL_AIRBRUSH;

	default:
		if (tool_id & 0x0008)
			return BTN_TOOL_RUBBER;
		return BTN_TOOL_PEN;
	}
	return tool_type;
}

static void wacom_exit_report(struct wacom_wac *wacom)
+26 −0
Original line number Diff line number Diff line
@@ -532,6 +532,7 @@ static void load_programs(const struct test_program programs[],
			  FIXTURE_DATA(hid_bpf) * self,
			  const FIXTURE_VARIANT(hid_bpf) * variant)
{
	struct bpf_map *iter_map;
	int err = -EINVAL;

	ASSERT_LE(progs_count, ARRAY_SIZE(self->hid_links))
@@ -564,6 +565,13 @@ static void load_programs(const struct test_program programs[],
		*ops_hid_id = self->hid_id;
	}

	/* we disable the auto-attach feature of all maps because we
	 * only want the tested one to be manually attached in the next
	 * call to bpf_map__attach_struct_ops()
	 */
	bpf_object__for_each_map(iter_map, *self->skel->skeleton->obj)
		bpf_map__set_autoattach(iter_map, false);

	err = hid__load(self->skel);
	ASSERT_OK(err) TH_LOG("hid_skel_load failed: %d", err);

@@ -686,6 +694,24 @@ TEST_F(hid_bpf, subprog_raw_event)
	ASSERT_EQ(buf[2], 52);
}

/*
 * Attach hid_first_event to the given uhid device,
 * attempt at re-attaching it, we should not lock and
 * return an invalid struct bpf_link
 */
TEST_F(hid_bpf, multiple_attach)
{
	const struct test_program progs[] = {
		{ .name = "hid_first_event" },
	};
	struct bpf_link *link;

	LOAD_PROGRAMS(progs);

	link = bpf_map__attach_struct_ops(self->skel->maps.first_event);
	ASSERT_NULL(link) TH_LOG("unexpected return value when re-attaching the struct_ops");
}

/*
 * Ensures that we can attach/detach programs
 */
Loading