On Wed, 30 Apr 2025 10:26:12 -0300 Fabio Estevam festevam@gmail.com wrote:
On Wed, Apr 30, 2025 at 10:11 AM Jonathan Cameron Jonathan.Cameron@huawei.com wrote:
As below. Should be mask1[0] as we've already indexed the array with the above calculation.
Thanks for catching that bug.
Now I get:
[ 1.556734] iio-core: ******** masklength is 9 [ 1.559663] iio-core: ******** longs_per_mask is 1 [ 1.564119] iio-core: ******** mask1[0] is 0x1 [ 1.573367] iio-core: ******** mask2[0] is 0x2 [ 1.577822] iio-core: ******** mask2[0] is 0x4 [ 1.582279] iio-core: ******** mask2[0] is 0x8 [ 1.586738] iio-core: ******** mask2[0] is 0x3 [ 1.591198] iio-core: ******** mask2[0] is 0x7 [ 1.595654] iio-core: ******** mask2[0] is 0xf [ 1.600110] iio-core: ******** mask2[0] is 0xc [ 1.604560] iio-core: ******** mask2[0] is 0x1000 [ 1.609278] max1363 1-0064: available_scan_mask 8 subset of 0. Never used [ 1.616084] iio-core: ******** mask2[0] is 0x2000 [ 1.620799] max1363 1-0064: available_scan_mask 9 subset of 0. Never used [ 1.627602] iio-core: ******** mask2[0] is 0x40000 [ 1.632408] max1363 1-0064: available_scan_mask 10 subset of 0. Never used [ 1.639303] iio-core: ******** mask2[0] is 0x80000 [ 1.644105] max1363 1-0064: available_scan_mask 11 subset of 0. Never used [ 1.650995] iio-core: ******** mask2[0] is 0x3000 [ 1.655713] max1363 1-0064: available_scan_mask 12 subset of 0. Never used [ 1.662606] iio-core: ******** mask2[0] is 0xc0000 [ 1.667412] max1363 1-0064: available_scan_mask 13 subset of 0. Never used [ 1.674309] iio-core: ******** mask1[1] is 0x2 [ 1.678761] iio-core: ******** mask2[1] is 0x4 [ 1.683212] iio-core: ******** mask2[1] is 0x8 [ 1.687666] iio-core: ******** mask2[1] is 0x3 [ 1.692118] iio-core: ******** mask2[1] is 0x7 [ 1.696576] iio-core: ******** mask2[1] is 0xf [ 1.701029] iio-core: ******** mask2[1] is 0xc [ 1.705483] iio-core: ******** mask2[1] is 0x1000 [ 1.710199] max1363 1-0064: available_scan_mask 8 subset of 1. Never used [ 1.716996] iio-core: ******** mask2[1] is 0x2000 [ 1.721711] max1363 1-0064: available_scan_mask 9 subset of 1. Never used [ 1.728510] iio-core: ******** mask2[1] is 0x40000 [ 1.733317] max1363 1-0064: available_scan_mask 10 subset of 1. Never used [ 1.740212] iio-core: ******** mask2[1] is 0x80000 [ 1.745013] max1363 1-0064: available_scan_mask 11 subset of 1. Never used [ 1.751899] iio-core: ******** mask2[1] is 0x3000 [ 1.756612] max1363 1-0064: available_scan_mask 12 subset of 1. Never used [ 1.763503] iio-core: ******** mask2[1] is 0xc0000 [ 1.768306] max1363 1-0064: available_scan_mask 13 subset of 1. Never used [ 1.775193] iio-core: ******** mask1[2] is 0x4 [ 1.779650] iio-core: ******** mask2[2] is 0x8 [ 1.784117] iio-core: ******** mask2[2] is 0x3 [ 1.788570] iio-core: ******** mask2[2] is 0x7 [ 1.793023] iio-core: ******** mask2[2] is 0xf [ 1.797476] iio-core: ******** mask2[2] is 0xc [ 1.801934] iio-core: ******** mask2[2] is 0x1000 [ 1.806650] max1363 1-0064: available_scan_mask 8 subset of 2. Never used [ 1.813447] iio-core: ******** mask2[2] is 0x2000 [ 1.818162] max1363 1-0064: available_scan_mask 9 subset of 2. Never used [ 1.824961] iio-core: ******** mask2[2] is 0x40000 [ 1.829764] max1363 1-0064: available_scan_mask 10 subset of 2. Never used [ 1.836649] iio-core: ******** mask2[2] is 0x80000 [ 1.841450] max1363 1-0064: available_scan_mask 11 subset of 2. Never used [ 1.848336] iio-core: ******** mask2[2] is 0x3000 [ 1.853049] max1363 1-0064: available_scan_mask 12 subset of 2. Never used [ 1.859934] iio-core: ******** mask2[2] is 0xc0000 [ 1.864740] max1363 1-0064: available_scan_mask 13 subset of 2. Never used [ 1.871626] iio-core: ******** mask1[3] is 0x8 [ 1.876079] iio-core: ******** mask2[3] is 0x3 [ 1.880533] iio-core: ******** mask2[3] is 0x7 [ 1.884985] iio-core: ******** mask2[3] is 0xf [ 1.889439] iio-core: ******** mask2[3] is 0xc [ 1.893891] iio-core: ******** mask2[3] is 0x1000 [ 1.898605] max1363 1-0064: available_scan_mask 8 subset of 3. Never used [ 1.905403] iio-core: ******** mask2[3] is 0x2000 [ 1.910122] max1363 1-0064: available_scan_mask 9 subset of 3. Never used [ 1.916921] iio-core: ******** mask2[3] is 0x40000 [ 1.921724] max1363 1-0064: available_scan_mask 10 subset of 3. Never used [ 1.928610] iio-core: ******** mask2[3] is 0x80000 [ 1.933413] max1363 1-0064: available_scan_mask 11 subset of 3. Never used [ 1.940297] iio-core: ******** mask2[3] is 0x3000 [ 1.945012] max1363 1-0064: available_scan_mask 12 subset of 3. Never used [ 1.951897] iio-core: ******** mask2[3] is 0xc0000 [ 1.956698] max1363 1-0064: available_scan_mask 13 subset of 3. Never used [ 1.963584] iio-core: ******** mask1[4] is 0x3 [ 1.968037] iio-core: ******** mask2[4] is 0x7 [ 1.972489] iio-core: ******** mask2[4] is 0xf [ 1.976942] iio-core: ******** mask2[4] is 0xc [ 1.981394] iio-core: ******** mask2[4] is 0x1000 [ 1.986113] max1363 1-0064: available_scan_mask 8 subset of 4. Never used [ 1.992915] iio-core: ******** mask2[4] is 0x2000 [ 1.997626] max1363 1-0064: available_scan_mask 9 subset of 4. Never used [ 2.004429] iio-core: ******** mask2[4] is 0x40000 [ 2.009230] max1363 1-0064: available_scan_mask 10 subset of 4. Never used [ 2.016120] iio-core: ******** mask2[4] is 0x80000 [ 2.020922] max1363 1-0064: available_scan_mask 11 subset of 4. Never used [ 2.027807] iio-core: ******** mask2[4] is 0x3000 [ 2.032522] max1363 1-0064: available_scan_mask 12 subset of 4. Never used [ 2.039408] iio-core: ******** mask2[4] is 0xc0000 [ 2.044210] max1363 1-0064: available_scan_mask 13 subset of 4. Never used [ 2.051095] iio-core: ******** mask1[5] is 0x7 [ 2.055548] iio-core: ******** mask2[5] is 0xf [ 2.060000] iio-core: ******** mask2[5] is 0xc [ 2.064453] iio-core: ******** mask2[5] is 0x1000 [ 2.069167] max1363 1-0064: available_scan_mask 8 subset of 5. Never used [ 2.075966] iio-core: ******** mask2[5] is 0x2000 [ 2.080680] max1363 1-0064: available_scan_mask 9 subset of 5. Never used [ 2.087478] iio-core: ******** mask2[5] is 0x40000 [ 2.092280] max1363 1-0064: available_scan_mask 10 subset of 5. Never used [ 2.099166] iio-core: ******** mask2[5] is 0x80000 [ 2.103967] max1363 1-0064: available_scan_mask 11 subset of 5. Never used [ 2.110858] iio-core: ******** mask2[5] is 0x3000 [ 2.115573] max1363 1-0064: available_scan_mask 12 subset of 5. Never used [ 2.122463] iio-core: ******** mask2[5] is 0xc0000 [ 2.127265] max1363 1-0064: available_scan_mask 13 subset of 5. Never used [ 2.134150] iio-core: ******** mask1[6] is 0xf [ 2.138602] iio-core: ******** mask2[6] is 0xc [ 2.143056] max1363 1-0064: available_scan_mask 7 subset of 6. Never used [ 2.149862] iio-core: ******** mask2[6] is 0x1000 [ 2.154578] max1363 1-0064: available_scan_mask 8 subset of 6. Never used [ 2.161374] iio-core: ******** mask2[6] is 0x2000 [ 2.166089] max1363 1-0064: available_scan_mask 9 subset of 6. Never used [ 2.172886] iio-core: ******** mask2[6] is 0x40000 [ 2.177687] max1363 1-0064: available_scan_mask 10 subset of 6. Never used [ 2.184573] iio-core: ******** mask2[6] is 0x80000 [ 2.189372] max1363 1-0064: available_scan_mask 11 subset of 6. Never used [ 2.196257] iio-core: ******** mask2[6] is 0x3000 [ 2.200973] max1363 1-0064: available_scan_mask 12 subset of 6. Never used [ 2.207858] iio-core: ******** mask2[6] is 0xc0000 [ 2.212659] max1363 1-0064: available_scan_mask 13 subset of 6. Never used [ 2.219544] iio-core: ******** mask1[7] is 0xc [ 2.223996] iio-core: ******** mask2[7] is 0x1000 [ 2.228715] max1363 1-0064: available_scan_mask 8 subset of 7. Never used [ 2.235518] iio-core: ******** mask2[7] is 0x2000 [ 2.240234] max1363 1-0064: available_scan_mask 9 subset of 7. Never used [ 2.247030] iio-core: ******** mask2[7] is 0x40000 [ 2.251832] max1363 1-0064: available_scan_mask 10 subset of 7. Never used [ 2.258717] iio-core: ******** mask2[7] is 0x80000 [ 2.263518] max1363 1-0064: available_scan_mask 11 subset of 7. Never used [ 2.270403] iio-core: ******** mask2[7] is 0x3000 [ 2.275117] max1363 1-0064: available_scan_mask 12 subset of 7. Never used [ 2.282002] iio-core: ******** mask2[7] is 0xc0000 [ 2.286803] max1363 1-0064: available_scan_mask 13 subset of 7. Never used [ 2.293688] iio-core: ******** mask1[8] is 0x1000 [ 2.298401] iio-core: ******** mask2[8] is 0x2000 [ 2.303116] max1363 1-0064: available_scan_mask 9 subset of 8. Never used [ 2.309914] iio-core: ******** mask2[8] is 0x40000 [ 2.314715] max1363 1-0064: available_scan_mask 10 subset of 8. Never used [ 2.321600] iio-core: ******** mask2[8] is 0x80000 [ 2.326401] max1363 1-0064: available_scan_mask 11 subset of 8. Never used [ 2.333289] iio-core: ******** mask2[8] is 0x3000 [ 2.338004] max1363 1-0064: available_scan_mask 12 subset of 8. Never used [ 2.344889] iio-core: ******** mask2[8] is 0xc0000 [ 2.349691] max1363 1-0064: available_scan_mask 13 subset of 8. Never used [ 2.356577] iio-core: ******** mask1[9] is 0x2000 [ 2.361294] iio-core: ******** mask2[9] is 0x40000 [ 2.366094] max1363 1-0064: available_scan_mask 10 subset of 9. Never used [ 2.372977] iio-core: ******** mask2[9] is 0x80000 [ 2.377778] max1363 1-0064: available_scan_mask 11 subset of 9. Never used [ 2.384663] iio-core: ******** mask2[9] is 0x3000 [ 2.389377] max1363 1-0064: available_scan_mask 12 subset of 9. Never used [ 2.396262] iio-core: ******** mask2[9] is 0xc0000 [ 2.401063] max1363 1-0064: available_scan_mask 13 subset of 9. Never used [ 2.407948] iio-core: ******** mask1[10] is 0x40000 [ 2.412835] iio-core: ******** mask2[10] is 0x80000 [ 2.417723] max1363 1-0064: available_scan_mask 11 subset of 10. Never used [ 2.424696] iio-core: ******** mask2[10] is 0x3000 [ 2.429497] max1363 1-0064: available_scan_mask 12 subset of 10. Never used [ 2.436471] iio-core: ******** mask2[10] is 0xc0000 [ 2.441359] max1363 1-0064: available_scan_mask 13 subset of 10. Never used [ 2.448331] iio-core: ******** mask1[11] is 0x80000 [ 2.453218] iio-core: ******** mask2[11] is 0x3000 [ 2.458020] max1363 1-0064: available_scan_mask 12 subset of 11. Never used [ 2.464991] iio-core: ******** mask2[11] is 0xc0000 [ 2.469879] max1363 1-0064: available_scan_mask 13 subset of 11. Never used [ 2.476860] iio-core: ******** mask1[12] is 0x3000 [ 2.481659] iio-core: ******** mask2[12] is 0xc0000 [ 2.486551] max1363 1-0064: available_scan_mask 13 subset of 12. Never used
Who sets masklength = 9? Is this correct?
It should be set to the maximum scan index seen for any channels (+1 for some reason I can't remember) and hence the maximum bitmap bit that should ever be set. That's something like 19 in this case not 9...
Hmm. These masks seem to be garbage because the driver is packing the scan indexes not using the same ones for all channel combinations as those masks assume.
So wherever MAX1363_CHAN_U is called should assume the single channels start at index 0 and the differential channels at 12. For instance:
#define MAX1363_4X_CHANS(bits, ev_spec, num_ev_spec) { \ MAX1363_CHAN_U(0, _s0, 0, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(0, 1, d0m1, 4, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(2, 3, d2m3, 5, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(1, 0, d1m0, 6, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(3, 2, d3m2, 7, bits, ev_spec, num_ev_spec), \ IIO_CHAN_SOFT_TIMESTAMP(8) \ }
Should be: #define MAX1363_4X_CHANS(bits, ev_spec, num_ev_spec) { \ MAX1363_CHAN_U(0, _s0, 0, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(0, 1, d0m1, 12, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(2, 3, d2m3, 13, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(1, 0, d1m0, 14, bits, ev_spec, num_ev_spec), \ MAX1363_CHAN_B(3, 2, d3m2, 15, bits, ev_spec, num_ev_spec), \ IIO_CHAN_SOFT_TIMESTAMP(8) \ }
https://elixir.bootlin.com/linux/v6.14.4/source/drivers/iio/industrialio-buf...
The reason userspace never notices this is that the channel indices are treated as monotonic so the mismatch between 4 and 12 is irrelevant because there are no channels on scan index 5,6,7,8,9,10,11 in this example.
Took me a while to figure out why basic tests wouldn't fail!
So the full fix is reorder the scan indices to fix the basic problem + fix the scan index values in all those channel arrays to use the right mask bits.
Thanks for chasing this down!
Jonathan
If I use BITS_PER_LONG instead of masklength inside bitmap_subset():
--- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -1947,16 +1947,22 @@ static void iio_sanity_check_avail_scan_masks(struct iio_dev *indio_dev) * available masks in the order of preference (presumably the least * costy to access masks first). */
pr_err("******** masklength is %d", masklength);
pr_err("******** longs_per_mask is %d", longs_per_mask);
for (i = 0; i < num_masks - 1; i++) { const unsigned long *mask1; int j; mask1 = av_masks + i * longs_per_mask;
pr_err("******** mask1[%d] is 0x%lx\n", i, mask1[0]); for (j = i + 1; j < num_masks; j++) { const unsigned long *mask2; mask2 = av_masks + j * longs_per_mask;
if (bitmap_subset(mask2, mask1, masklength))
pr_err("******** mask2[%d] is 0x%lx\n", i, mask2[0]);
if (bitmap_subset(mask2, mask1, BITS_PER_LONG)) dev_warn(indio_dev->dev.parent, "available_scan_mask %d
subset of %d. Never used\n", j, i);
Then the correct subset information is printed:
[ 1.560392] iio-core: ******** masklength is 9 [ 1.560406] iio-core: ******** longs_per_mask is 1 [ 1.564890] iio-core: ******** mask1[0] is 0x1 [ 1.574185] iio-core: ******** mask2[0] is 0x2 [ 1.578644] iio-core: ******** mask2[0] is 0x4 [ 1.583108] iio-core: ******** mask2[0] is 0x8 [ 1.587564] iio-core: ******** mask2[0] is 0x3 [ 1.592024] iio-core: ******** mask2[0] is 0x7 [ 1.596486] iio-core: ******** mask2[0] is 0xf [ 1.600948] iio-core: ******** mask2[0] is 0xc [ 1.605407] iio-core: ******** mask2[0] is 0x1000 [ 1.610130] iio-core: ******** mask2[0] is 0x2000 [ 1.614856] iio-core: ******** mask2[0] is 0x40000 [ 1.619670] iio-core: ******** mask2[0] is 0x80000 [ 1.624475] iio-core: ******** mask2[0] is 0x3000 [ 1.629199] iio-core: ******** mask2[0] is 0xc0000 [ 1.634017] iio-core: ******** mask1[1] is 0x2 [ 1.638475] iio-core: ******** mask2[1] is 0x4 [ 1.642941] iio-core: ******** mask2[1] is 0x8 [ 1.647401] iio-core: ******** mask2[1] is 0x3 [ 1.651865] iio-core: ******** mask2[1] is 0x7 [ 1.656321] iio-core: ******** mask2[1] is 0xf [ 1.660786] iio-core: ******** mask2[1] is 0xc [ 1.665245] iio-core: ******** mask2[1] is 0x1000 [ 1.669968] iio-core: ******** mask2[1] is 0x2000 [ 1.674691] iio-core: ******** mask2[1] is 0x40000 [ 1.679505] iio-core: ******** mask2[1] is 0x80000 [ 1.684345] iio-core: ******** mask2[1] is 0x3000 [ 1.689069] iio-core: ******** mask2[1] is 0xc0000 [ 1.693872] iio-core: ******** mask1[2] is 0x4 [ 1.698331] iio-core: ******** mask2[2] is 0x8 [ 1.702788] iio-core: ******** mask2[2] is 0x3 [ 1.707246] iio-core: ******** mask2[2] is 0x7 [ 1.711702] iio-core: ******** mask2[2] is 0xf [ 1.716156] iio-core: ******** mask2[2] is 0xc [ 1.720614] iio-core: ******** mask2[2] is 0x1000 [ 1.725333] iio-core: ******** mask2[2] is 0x2000 [ 1.730046] iio-core: ******** mask2[2] is 0x40000 [ 1.734850] iio-core: ******** mask2[2] is 0x80000 [ 1.739665] iio-core: ******** mask2[2] is 0x3000 [ 1.744385] iio-core: ******** mask2[2] is 0xc0000 [ 1.749192] iio-core: ******** mask1[3] is 0x8 [ 1.753654] iio-core: ******** mask2[3] is 0x3 [ 1.758112] iio-core: ******** mask2[3] is 0x7 [ 1.762570] iio-core: ******** mask2[3] is 0xf [ 1.767027] iio-core: ******** mask2[3] is 0xc [ 1.771484] iio-core: ******** mask2[3] is 0x1000 [ 1.776203] iio-core: ******** mask2[3] is 0x2000 [ 1.780921] iio-core: ******** mask2[3] is 0x40000 [ 1.785727] iio-core: ******** mask2[3] is 0x80000 [ 1.790531] iio-core: ******** mask2[3] is 0x3000 [ 1.795253] iio-core: ******** mask2[3] is 0xc0000 [ 1.800059] iio-core: ******** mask1[4] is 0x3 [ 1.804515] iio-core: ******** mask2[4] is 0x7 [ 1.808970] iio-core: ******** mask2[4] is 0xf [ 1.813427] iio-core: ******** mask2[4] is 0xc [ 1.817891] iio-core: ******** mask2[4] is 0x1000 [ 1.822608] iio-core: ******** mask2[4] is 0x2000 [ 1.827336] iio-core: ******** mask2[4] is 0x40000 [ 1.832164] iio-core: ******** mask2[4] is 0x80000 [ 1.836970] iio-core: ******** mask2[4] is 0x3000 [ 1.841690] iio-core: ******** mask2[4] is 0xc0000 [ 1.846495] iio-core: ******** mask1[5] is 0x7 [ 1.850953] iio-core: ******** mask2[5] is 0xf [ 1.855409] iio-core: ******** mask2[5] is 0xc [ 1.859867] iio-core: ******** mask2[5] is 0x1000 [ 1.864590] iio-core: ******** mask2[5] is 0x2000 [ 1.869310] iio-core: ******** mask2[5] is 0x40000 [ 1.874116] iio-core: ******** mask2[5] is 0x80000 [ 1.878918] iio-core: ******** mask2[5] is 0x3000 [ 1.883636] iio-core: ******** mask2[5] is 0xc0000 [ 1.888442] iio-core: ******** mask1[6] is 0xf [ 1.892900] iio-core: ******** mask2[6] is 0xc [ 1.897364] max1363 1-0064: available_scan_mask 7 subset of 6. Never used [ 1.904169] iio-core: ******** mask2[6] is 0x1000 [ 1.908887] iio-core: ******** mask2[6] is 0x2000 [ 1.913603] iio-core: ******** mask2[6] is 0x40000 [ 1.918409] iio-core: ******** mask2[6] is 0x80000 [ 1.923212] iio-core: ******** mask2[6] is 0x3000 [ 1.927930] iio-core: ******** mask2[6] is 0xc0000 [ 1.932733] iio-core: ******** mask1[7] is 0xc [ 1.937190] iio-core: ******** mask2[7] is 0x1000 [ 1.941902] iio-core: ******** mask2[7] is 0x2000 [ 1.941907] iio-core: ******** mask2[7] is 0x40000 [ 1.941911] iio-core: ******** mask2[7] is 0x80000 [ 1.941917] iio-core: ******** mask2[7] is 0x3000 [ 1.965640] iio-core: ******** mask2[7] is 0xc0000 [ 1.970447] iio-core: ******** mask1[8] is 0x1000 [ 1.975163] iio-core: ******** mask2[8] is 0x2000 [ 1.979881] iio-core: ******** mask2[8] is 0x40000 [ 1.984683] iio-core: ******** mask2[8] is 0x80000 [ 1.989491] iio-core: ******** mask2[8] is 0x3000 [ 1.994209] iio-core: ******** mask2[8] is 0xc0000 [ 1.999010] iio-core: ******** mask1[9] is 0x2000 [ 2.003732] iio-core: ******** mask2[9] is 0x40000 [ 2.008533] iio-core: ******** mask2[9] is 0x80000 [ 2.013339] iio-core: ******** mask2[9] is 0x3000 [ 2.018065] iio-core: ******** mask2[9] is 0xc0000 [ 2.022866] iio-core: ******** mask1[10] is 0x40000 [ 2.027760] iio-core: ******** mask2[10] is 0x80000 [ 2.032647] iio-core: ******** mask2[10] is 0x3000 [ 2.037453] iio-core: ******** mask2[10] is 0xc0000 [ 2.042346] iio-core: ******** mask1[11] is 0x80000 [ 2.047234] iio-core: ******** mask2[11] is 0x3000 [ 2.052041] iio-core: ******** mask2[11] is 0xc0000 [ 2.056928] iio-core: ******** mask1[12] is 0x3000 [ 2.061736] iio-core: ******** mask2[12] is 0xc0000